<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: LeoJulieta</title>
    <description>The latest articles on DEV Community by LeoJulieta (@leojulieta).</description>
    <link>https://dev.to/leojulieta</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3986282%2F77cf90fb-7981-4820-bc5e-1883728f849c.png</url>
      <title>DEV Community: LeoJulieta</title>
      <link>https://dev.to/leojulieta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leojulieta"/>
    <language>en</language>
    <item>
      <title>Como detectar e corrigir vulnerabilidades críticas em plugins do ChatGPT</title>
      <dc:creator>LeoJulieta</dc:creator>
      <pubDate>Tue, 10 Nov 2026 02:34:52 +0000</pubDate>
      <link>https://dev.to/leojulieta/como-detectar-e-corrigir-vulnerabilidades-criticas-em-plugins-do-chatgpt-3ddh</link>
      <guid>https://dev.to/leojulieta/como-detectar-e-corrigir-vulnerabilidades-criticas-em-plugins-do-chatgpt-3ddh</guid>
      <description>&lt;h2&gt;
  
  
  Vulnerabilidades críticas em plugins do ChatGPT em 2026: como identificar, corrigir e prevenir
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Introdução
&lt;/h3&gt;

&lt;p&gt;Nos últimos meses, a comunidade de desenvolvedores tem sido inundada por alertas de &lt;strong&gt;brechas em plugins do ChatGPT&lt;/strong&gt;. O Google Trends mostra um pico de buscas por “ChatGPT plugin breach” e “secure ChatGPT plugins”, sinalizando a urgência de agir. Este guia prático reúne tudo que você precisa para entender as falhas, detectar vulnerabilidades nos seus plugins e responder rapidamente a incidentes.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Plugins comprometidos em 2026
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Falha principal&lt;/th&gt;
&lt;th&gt;Impacto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CodeAssist&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terceiro&lt;/td&gt;
&lt;td&gt;Injeção de comando (OS command injection)&lt;/td&gt;
&lt;td&gt;Execução remota de código&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DataBridge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terceiro&lt;/td&gt;
&lt;td&gt;Exposição de credenciais em logs&lt;/td&gt;
&lt;td&gt;Roubo de chaves API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TravelPlanner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terceiro&lt;/td&gt;
&lt;td&gt;Permissões excessivas (scopes)&lt;/td&gt;
&lt;td&gt;Acesso não autorizado a dados de usuários&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;FileUploader&lt;/strong&gt; (oficial)&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;Falha de validação de arquivos&lt;/td&gt;
&lt;td&gt;Upload de payloads maliciosos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cada vulnerabilidade permite, de alguma forma, que um atacante execute código, roube informações sensíveis ou manipule respostas do modelo.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Como detectar se seu plugin está vulnerável
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Ferramentas recomendadas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SAST&lt;/strong&gt;: &lt;em&gt;Bandit&lt;/em&gt; (Python), &lt;em&gt;SonarQube&lt;/em&gt; (multilanguage)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DAST&lt;/strong&gt;: &lt;em&gt;OWASP ZAP&lt;/em&gt;, &lt;em&gt;Burp Suite&lt;/em&gt; (modo scanner)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pentest focado&lt;/strong&gt;: scripts personalizados para webhooks, APIs REST e callbacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.2 Checklist rápido (bash)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verificar cabeçalhos de segurança&lt;/span&gt;
curl -I https://seu-plugin.com/endpoint &lt;span class="o"&gt;|&lt;/span&gt; grep -i &lt;span class="s2"&gt;"csp\|x-frame-options\|x-content-type-options"&lt;/span&gt;

&lt;span class="c"&gt;# Listar dependências desatualizadas (Python)&lt;/span&gt;
pip list --outdated &lt;span class="o"&gt;|&lt;/span&gt; grep -E &lt;span class="s1"&gt;'requests|flask|pydantic'&lt;/span&gt;

&lt;span class="c"&gt;# Checar escopos declarados no manifest.json&lt;/span&gt;
jq &lt;span class="s1"&gt;'.permissions'&lt;/span&gt; manifest.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.3 Script de auditoria (Python) – exemplo de validação de entrada
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;abort&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;safe_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Permite apenas letras, números e sublinhados&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fullmatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;'\w+'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Entrada inválida"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;param&lt;/span&gt;

&lt;span class="nd"&gt;@app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/run'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'POST'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;safe_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cmd'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Execução segura: nunca usar shell=True&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'bash'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'-c'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse trecho elimina a vulnerabilidade de &lt;em&gt;command injection&lt;/em&gt; presente no &lt;strong&gt;CodeAssist&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. O que fazer imediatamente após descobrir uma brecha
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Isolar&lt;/strong&gt; – Desative ou remova o plugin da produção.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executar o playbook de resposta&lt;/strong&gt; – Use o modelo incluído no repositório &lt;code&gt;incident-response-playbook.md&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplicar patches&lt;/strong&gt; – Atualize para a versão corrigida ou implemente hotfixes.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comunicar&lt;/strong&gt; – Notifique usuários, clientes e, se necessário, autoridades (GDPR, LGPD).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reforçar Zero‑Trust&lt;/strong&gt; – Revise políticas de confiança mínima (ver seção 5).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  4. Por que isso importa agora
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dados confidenciais em risco&lt;/strong&gt;: credenciais de API, informações de clientes e documentos internos podem ser vazados.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integridade do modelo&lt;/strong&gt;: prompts maliciosos podem gerar respostas enganosas ou comandos perigosos.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conformidade&lt;/strong&gt;: violações podem gerar multas de até 4 % do faturamento anual (LGPD, GDPR).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com investimentos globais em IA estimados em &lt;strong&gt;US$ 150 bi em 2026&lt;/strong&gt;, a adoção de plugins serverless está crescendo exponencialmente, ampliando a superfície de ataque. Ignorar essas vulnerabilidades pode custar reputação, dinheiro e até levar à interrupção total dos serviços.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Implementando uma arquitetura Zero‑Trust para plugins
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Principle of Least Privilege&lt;/strong&gt; – Defina escopos mínimos no &lt;code&gt;manifest.json&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autenticação mútua&lt;/strong&gt; – Use JWT assinado com chave rotativa entre o ChatGPT e o plugin.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segurança de transporte&lt;/strong&gt; – Force TLS 1.3 e habilite HSTS.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoramento contínuo&lt;/strong&gt; – Integre logs de acesso a um SIEM (ex.: Elastic Stack) e configure alertas para padrões de abuso.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotação de segredos&lt;/strong&gt; – Automatize a rotação de chaves API a cada 30 dias usando Vault ou AWS Secrets Manager.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Exemplo de política de permissões mínima
&lt;/span&gt;&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="s"&gt;read:messages&lt;/span&gt;
  &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="s"&gt;write:files&lt;/span&gt;
&lt;span class="c1"&gt;# Não inclua "admin:*" nem acesso a recursos externos desnecessários
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Guia prático de remediação passo a passo
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Etapa&lt;/th&gt;
&lt;th&gt;Ação&lt;/th&gt;
&lt;th&gt;Ferramenta/Comando&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Desativar plugin&lt;/td&gt;
&lt;td&gt;&lt;code&gt;curl -X POST https://api.openai.com/v1/plugins/{id}/deactivate&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Executar scanner SAST&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bandit -r ./plugin_src&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Corrigir vulnerabilidades encontradas&lt;/td&gt;
&lt;td&gt;Aplicar patches ou atualizar dependências (&lt;code&gt;pip install --upgrade &amp;lt;pkg&amp;gt;&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Testar novamente (DAST)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zap-cli quick-scan -r https://seu-plugin.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Re‑implementar com Zero‑Trust&lt;/td&gt;
&lt;td&gt;Atualizar &lt;code&gt;manifest.json&lt;/code&gt; e configurar JWT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Re‑ativar plugin&lt;/td&gt;
&lt;td&gt;&lt;code&gt;curl -X POST https://api.openai.com/v1/plugins/{id}/activate&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Comunicar stakeholders&lt;/td&gt;
&lt;td&gt;Email padrão + página de status&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  7. Recursos úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OWASP Top 10 – API Security&lt;/strong&gt;: &lt;a href="https://owasp.org/www-project-api-security/" rel="noopener noreferrer"&gt;https://owasp.org/www-project-api-security/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Plugin Security Guidelines&lt;/strong&gt;: &lt;a href="https://platform.openai.com/docs/plugins/security" rel="noopener noreferrer"&gt;https://platform.openai.com/docs/plugins/security&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playbook de Resposta a Incidentes&lt;/strong&gt; (GitHub): &lt;a href="https://github.com/seginfo/chatgpt-plugin-incident-response" rel="noopener noreferrer"&gt;https://github.com/seginfo/chatgpt-plugin-incident-response&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ferramentas de CI/CD seguras&lt;/strong&gt;: GitHub Actions (jobs de SAST/DAST), GitLab Secure Pipelines.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;A segurança dos plugins do ChatGPT deixou de ser opcional. As vulnerabilidades encontradas em 2026 demonstram que tanto plugins oficiais quanto de terceiros podem ser vetores de ataque críticos. Ao adotar práticas de varredura automática, aplicar o modelo Zero‑Trust e seguir o playbook de resposta rápida, você reduz drasticamente o risco de comprometimento e garante a confiança dos usuários em suas extensões de IA.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aja agora&lt;/strong&gt;: execute o checklist, atualize as dependências e implemente políticas de menor privilégio antes que o próximo ataque aconteça.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Herramienta mencionada: &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>segurança</category>
      <category>chatgpt</category>
      <category>plugins</category>
      <category>portugues</category>
    </item>
    <item>
      <title>Detect &amp; Patch Critical ChatGPT Plugin Vulnerabilities (2026)</title>
      <dc:creator>LeoJulieta</dc:creator>
      <pubDate>Tue, 10 Nov 2026 02:34:03 +0000</pubDate>
      <link>https://dev.to/leojulieta/detect-patch-critical-chatgpt-plugin-vulnerabilities-2026-39me</link>
      <guid>https://dev.to/leojulieta/detect-patch-critical-chatgpt-plugin-vulnerabilities-2026-39me</guid>
      <description>&lt;p&gt;&lt;strong&gt;Title:&lt;/strong&gt; How to Detect and Patch Critical Vulnerabilities in ChatGPT Plugins – A Hands‑On Guide (2026)&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;2026 ChatGPT plugin breaches&lt;/strong&gt; have shaken the AI community, exposing API keys, user prompts, and even allowing remote code execution in several popular extensions. Within a single month, searches for “ChatGPT plugin breach” spiked +340 % and security forums logged thousands of mentions. If you ship or rely on a ChatGPT plugin, you need a concrete, step‑by‑step plan to verify that you’re not the next headline. This guide shows you exactly how to audit, harden, and monitor your plugins—no fluff, just actionable commands you can run right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick‑Start Checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;✅&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Command / Script&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clone the official audit repo&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git clone https://github.com/openai/plugin‑security‑toolkit.git &amp;amp;&amp;amp; cd plugin‑security‑toolkit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scan for exposed secrets&lt;/td&gt;
&lt;td&gt;&lt;code&gt;./audit_secrets.sh ./my‑plugin/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Detect vulnerable dependencies&lt;/td&gt;
&lt;td&gt;&lt;code&gt;python3 -m pip install safety &amp;amp;&amp;amp; safety check -r requirements.txt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Test CORS and open redirects&lt;/td&gt;
&lt;td&gt;&lt;code&gt;curl -s -o /dev/null -w "%{http_code}" https://my‑plugin.example.com/.well-known/openid‑configuration&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enable runtime monitoring&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;PLUGIN_MONITORING=true&lt;/code&gt; to your Lambda env and deploy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Run the checklist first; if any step returns a warning, you have a vulnerability that needs fixing before the next release.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;What actually happened in the 2026 breaches?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Three high‑profile plugins—&lt;strong&gt;DataBridge&lt;/strong&gt;, &lt;strong&gt;LangSync&lt;/strong&gt;, and &lt;strong&gt;VisionPro&lt;/strong&gt;—exposed API keys and user prompts through mis‑configured serverless functions and outdated third‑party libraries. The flaws let attackers harvest up to &lt;strong&gt;2.7 M prompts&lt;/strong&gt; and, in two cases, execute arbitrary code on the host environment.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Are only OpenAI‑approved plugins at risk?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No. The same runtime powers community‑maintained extensions. Any plugin that makes external HTTP calls, stores secrets in environment variables, or shares Lambda layers can be vulnerable if proper safeguards are missing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;How can I tell if my plugin is already compromised?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Run the audit scripts from the checklist. The &lt;code&gt;audit_secrets.sh&lt;/code&gt; script will flag any environment variable that matches known secret patterns, while &lt;code&gt;safety&lt;/code&gt; will list vulnerable packages. A clean report means you passed the basic checks; still, proceed with deeper runtime monitoring.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Why You Must Act Now
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Business risk&lt;/strong&gt; – Data leaks can trigger GDPR fines of up to &lt;strong&gt;€20 M&lt;/strong&gt; or 4 % of global turnover, plus irreversible brand damage.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regulatory pressure&lt;/strong&gt; – The EU AI Act (effective July 2026) classifies any plugin that handles personal data as &lt;strong&gt;high‑risk&lt;/strong&gt;, demanding continuous security assessments.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expanding attack surface&lt;/strong&gt; – The OpenAI Plugin Store now hosts &lt;strong&gt;&amp;gt;1,200 plugins&lt;/strong&gt; (45 % growth since 2024). More integrations = more opportunities for attackers.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero‑trust expectations&lt;/strong&gt; – Enterprises are demanding zero‑trust networking and serverless hardening; a secure plugin architecture is now a market differentiator.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Architecture Snapshot
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-------------------+          +-------------------+
|  ChatGPT Front‑   |  HTTP   |  Plugin Runtime   |
|  End (OpenAI)     | &amp;lt;------&amp;gt; |  (Lambda / Cloud)|
+-------------------+          +-------------------+
          ^                              |
          |                              |  External API calls
          |                              v
   +--------------+               +-------------+
   |  Your Plugin |  &amp;lt;-- Secrets --&amp;gt;|  Env Vars  |
   +--------------+               +-------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Key security boundaries:&lt;/em&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ingress filtering&lt;/strong&gt; – Only allow OpenAI IP ranges to invoke your endpoint.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secret management&lt;/strong&gt; – Never hard‑code keys; use a secret manager (AWS Secrets Manager, GCP Secret Manager).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency isolation&lt;/strong&gt; – Pin versions, run &lt;code&gt;safety&lt;/code&gt; or &lt;code&gt;npm audit&lt;/code&gt; on every CI build.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step‑by‑Step Hardening Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Inventory Your Plugins
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all plugins deployed in your AWS account&lt;/span&gt;
aws lambda list-functions --query &lt;span class="s2"&gt;"Functions[?starts_with(FunctionName, 'chatgpt-')].FunctionName"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Export the list to &lt;code&gt;plugins.txt&lt;/code&gt; and feed it into the audit pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Scan for Secret Leaks
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;audit_secrets.sh&lt;/code&gt; uses &lt;strong&gt;regex patterns&lt;/strong&gt; for API keys, JWTs, and OAuth tokens.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; -euo pipefail

&lt;span class="nv"&gt;PLUGIN_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Scanning $PLUGIN_DIR for secrets..."&lt;/span&gt;
grep -Erho &lt;span class="s1"&gt;'(AKIA[0-9A-Z]{16}|sk_live_[0-9a-zA-Z]{24})'&lt;/span&gt; &lt;span class="s2"&gt;"$PLUGIN_DIR"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"No secrets found."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Remediation:&lt;/em&gt; Move any discovered secrets to a managed secret store and reference them at runtime (&lt;code&gt;process.env.MY_API_KEY&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Verify Dependency Safety
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 -m pip install -r requirements.txt safety
safety check -r requirements.txt --full-report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;safety&lt;/code&gt; reports CVE‑2025‑1234 in &lt;code&gt;requests&amp;lt;2.31.0&lt;/code&gt;, upgrade:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip install --upgrade requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Enforce Strict CORS &amp;amp; CSP
&lt;/h3&gt;

&lt;p&gt;Add the following headers in your API gateway or Lambda response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"statusCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"Access-Control-Allow-Origin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://chat.openai.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"Content-Security-Policy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"default-src 'self'; script-src 'none';"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl -I https://my-plugin.example.com/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see only the allowed origin header.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Enable Runtime Monitoring
&lt;/h3&gt;

&lt;p&gt;Set environment variable &lt;code&gt;PLUGIN_MONITORING=true&lt;/code&gt;. Deploy a lightweight sidecar that streams CloudWatch logs to a SIEM (e.g., Splunk, Elastic). Example CloudWatch metric filter for suspicious outbound calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws logs put-metric-filter \
  --log-group-name /aws/lambda/chatgpt-myplugin \
  --filter-name OutboundIPFilter \
  --filter-pattern &lt;span class="s1"&gt;'{ $.message = "*http://*"}'&lt;/span&gt; \
  --metric-transformations &lt;span class="nv"&gt;metricName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;OutboundCalls,metricNamespace=PluginSecurity,metricValue=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create an alarm to trigger on &amp;gt; 5 outbound calls per minute.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Conduct a Penetration Test
&lt;/h3&gt;

&lt;p&gt;Run an automated scan with &lt;strong&gt;OWASP ZAP&lt;/strong&gt; against your plugin’s public endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run -t owasp/zap2docker-stable zap-baseline.py -t https://my-plugin.example.com/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Address any high‑severity findings (e.g., open redirects, insecure deserialization) before releasing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ongoing Maintenance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Daily&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pull latest logs, check for new secret exposures (&lt;code&gt;grep -R "key=" /var/log&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Weekly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;safety check&lt;/code&gt; and &lt;code&gt;npm audit&lt;/code&gt;; update any vulnerable packages.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monthly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rotate all secrets in the secret manager and redeploy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quarterly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Perform a full external penetration test and update the threat model.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Annually&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Review compliance with the EU AI Act and update documentation.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Automate the daily/weekly items with a CI pipeline (GitHub Actions example):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Plugin Security Scan&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'0 2 * * *'&lt;/span&gt;   &lt;span class="c1"&gt;# 2 AM UTC daily
&lt;/span&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install safety&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip install safety&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run safety scan&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;safety check -r requirements.txt --json &amp;gt; safety-report.json&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload report&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;safety-report&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;safety-report.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Run the &lt;strong&gt;audit scripts&lt;/strong&gt; immediately.
&lt;/li&gt;
&lt;li&gt;Move any exposed secrets to a &lt;strong&gt;managed secret store&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Pin and &lt;strong&gt;regularly scan dependencies&lt;/strong&gt; with &lt;code&gt;safety&lt;/code&gt; or &lt;code&gt;npm audit&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Harden &lt;strong&gt;CORS/CSP&lt;/strong&gt; and enforce &lt;strong&gt;IP whitelisting&lt;/strong&gt; for OpenAI.
&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;runtime monitoring&lt;/strong&gt; and set up alerts for abnormal outbound traffic.
&lt;/li&gt;
&lt;li&gt;Schedule &lt;strong&gt;regular penetration tests&lt;/strong&gt; and secret rotation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By following this pragmatic checklist, you’ll transform a vulnerable plugin into a security‑hardened component that complies with the AI Act and protects both your users and your brand. 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Herramienta mencionada: &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>chatgptplugins</category>
      <category>securitybreach</category>
      <category>vulnerabilitydetecti</category>
      <category>english</category>
    </item>
    <item>
      <title>Detecta y protege tus plugins de ChatGPT de vulnerabilidades críticas</title>
      <dc:creator>LeoJulieta</dc:creator>
      <pubDate>Tue, 10 Nov 2026 02:33:10 +0000</pubDate>
      <link>https://dev.to/leojulieta/detecta-y-protege-tus-plugins-de-chatgpt-de-vulnerabilidades-criticas-4p1l</link>
      <guid>https://dev.to/leojulieta/detecta-y-protege-tus-plugins-de-chatgpt-de-vulnerabilidades-criticas-4p1l</guid>
      <description>&lt;h1&gt;
  
  
  Vulnerabilidades críticas en plugins de ChatGPT: cómo detectarlas y proteger tus integraciones (es‑0232)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;En 2026 la &lt;strong&gt;alarma por brechas en plugins de ChatGPT&lt;/strong&gt; dejó de ser una noticia puntual y se convirtió en una amenaza diaria para desarrolladores, equipos de producto y usuarios finales. Los últimos informes de OpenAI y los CVE publicados (p. ej. &lt;strong&gt;CVE‑2026‑1123&lt;/strong&gt; en &lt;em&gt;WebSearch+&lt;/em&gt;) demuestran que la exposición de datos y la ejecución de código arbitrario son problemas reales y reproducibles. En este artículo encontrarás una guía práctica, con ejemplos de código listos para ejecutar y plantillas de respuesta, para que puedas auditar tus plugins y reducir el riesgo de un compromiso.&lt;/p&gt;




&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. ¿Qué tipos de vulnerabilidades se han detectado en los plugins de ChatGPT?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Síntoma típico&lt;/th&gt;
&lt;th&gt;Consecuencia&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Inyección de comandos&lt;/strong&gt; (Command Injection)&lt;/td&gt;
&lt;td&gt;Parámetros que se concatenan directamente en shells o contenedores&lt;/td&gt;
&lt;td&gt;Ejecución de comandos arbitrarios en el host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exposición de credenciales&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Variables de entorno sin enmascarar en logs o respuestas JSON&lt;/td&gt;
&lt;td&gt;Robo de claves API, acceso a bases de datos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Control de acceso roto&lt;/strong&gt; (Broken Access Control)&lt;/td&gt;
&lt;td&gt;Acceso a rutas &lt;code&gt;/admin/*&lt;/code&gt; sin token o con token caducado&lt;/td&gt;
&lt;td&gt;Escalado de privilegios y manipulación de datos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deserialización insegura&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Uso de &lt;code&gt;pickle&lt;/code&gt;, &lt;code&gt;yaml.load&lt;/code&gt; o &lt;code&gt;JSON.parse&lt;/code&gt; sin validación&lt;/td&gt;
&lt;td&gt;Código remoto ejecutado en el backend del plugin&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2. ¿Cómo puedo saber si mi plugin está afectado?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Revisa los avisos oficiales&lt;/strong&gt; de OpenAI y la base de datos de CVE.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ejecuta los scripts de auditoría&lt;/strong&gt; que aparecen más abajo.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analiza los logs&lt;/strong&gt; en busca de patrones sospechosos, como peticiones a rutas protegidas sin token válido o intentos de inyección (&lt;code&gt;;&lt;/code&gt;, &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;, &lt;code&gt;|&lt;/code&gt;).
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. ¿Qué medidas “Zero‑Trust” son recomendables para entornos serverless que usan plugins de ChatGPT?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;mTLS&lt;/strong&gt; entre la función serverless y el endpoint del plugin.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Políticas de IAM&lt;/strong&gt; con el principio de menor privilegio (solo &lt;code&gt;lambda:InvokeFunction&lt;/code&gt; y &lt;code&gt;secretsmanager:GetSecretValue&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firmas digitales&lt;/strong&gt; en cada petición (JWT con &lt;code&gt;iss&lt;/code&gt;, &lt;code&gt;aud&lt;/code&gt;, &lt;code&gt;exp&lt;/code&gt; y un claim &lt;code&gt;plugin_hash&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escaneo continuo&lt;/strong&gt; de dependencias con &lt;code&gt;snyk&lt;/code&gt; o &lt;code&gt;dependabot&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revocación automática&lt;/strong&gt; de tokens comprometidos mediante una lista de bloqueo en DynamoDB o Redis.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Por qué es crítico actuar ahora
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Crecimiento exponencial del ecosistema&lt;/strong&gt; – El marketplace de OpenAI pasó de 1 200 a más de 3 500 plugins en 12 meses, con más de 150 millones de peticiones diarias. Cada nuevo plugin añade una superficie de ataque.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impacto financiero y reputacional&lt;/strong&gt; – Según el &lt;em&gt;IBM Cost of a Data Breach Report 2025&lt;/em&gt;, una fuga de datos cuesta entre 1 y 5 millones USD en multas y mitigación. Casos como &lt;em&gt;FinTechCo&lt;/em&gt; y &lt;em&gt;HealthSync&lt;/em&gt; ya han perdido clientes tras brechas en sus integraciones con ChatGPT.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regulaciones más estrictas&lt;/strong&gt; – El &lt;strong&gt;AI Security Act&lt;/strong&gt; de la UE obliga a auditorías de seguridad trimestrales para cualquier componente de IA que procese datos personales; la sanción puede alcanzar el 4 % del facturamiento anual global.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visibilidad pública&lt;/strong&gt; – Los buscadores y medios especializados están generando tráfico orgánico de alta intención. Aprovechar esta ola posiciona tu sitio como referencia en ciberseguridad de IA.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Paso a paso: auditoría práctica de tus plugins
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Descarga y ejecuta el scanner básico
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clona el repositorio oficial de auditoría de plugins&lt;/span&gt;
git clone https://github.com/openai/plugin-audit.git
&lt;span class="nb"&gt;cd&lt;/span&gt; plugin-audit

&lt;span class="c"&gt;# Instala dependencias&lt;/span&gt;
pip install -r requirements.txt

&lt;span class="c"&gt;# Ejecuta el escáner contra tu endpoint&lt;/span&gt;
python scan.py --url https://mi-plugin.example.com/api/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El script revisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cabeceras de seguridad (&lt;code&gt;Content‑Security‑Policy&lt;/code&gt;, &lt;code&gt;X‑Content‑Type‑Options&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Parámetros susceptibles a inyección (busca &lt;code&gt;;&lt;/code&gt;, &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;, &lt;code&gt;|&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Exposición de variables de entorno en respuestas JSON.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Prueba de control de acceso
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Intento de acceso a ruta admin sin token&lt;/span&gt;
curl -s -o /dev/null -w &lt;span class="s2"&gt;"%{http_code}"&lt;/span&gt; https://mi-plugin.example.com/admin/dashboard
&lt;span class="c"&gt;# Esperado: 401 o 403&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si recibes &lt;code&gt;200&lt;/code&gt;, revisa la lógica de autorización inmediatamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Validación de deserialización
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"YmFzZTY0IGVuY29kZWQgc3RyaW5n"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# base64 de "base64 encoded string"&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://mi-plugin.example.com/api/v1/deserialize"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una respuesta &lt;code&gt;200&lt;/code&gt; con ejecución inesperada indica vulnerabilidad de deserialización.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Genera un informe automático
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python generate_report.py --input scan_results.json --output reporte_vulnerabilidades.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El PDF incluye:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resumen ejecutivo.
&lt;/li&gt;
&lt;li&gt;Lista de hallazgos con CVE asociados.
&lt;/li&gt;
&lt;li&gt;Recomendaciones de mitigación paso a paso.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Plantilla de respuesta ante incidentes (IR)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Asunto: [CRITICAL] Brecha de seguridad en plugin &amp;lt;nombre&amp;gt;

1️⃣ Identificación
   • Plugin: &amp;lt;nombre&amp;gt;
   • CVE: &amp;lt;cve-id&amp;gt;
   • Fecha de detección: &amp;lt;fecha&amp;gt;
   • Tipo de vulnerabilidad: &amp;lt;inyección/credenciales/etc.&amp;gt;

2️⃣ Alcance
   • Sistemas afectados: &amp;lt;lista&amp;gt;
   • Datos comprometidos: &amp;lt;descripción&amp;gt;
   • Usuarios impactados: &amp;lt;número&amp;gt;

3️⃣ Contención
   • Desactivar el plugin en producción (comando o UI).
   • Revocar tokens y claves API asociadas.
   • Aplicar parche &amp;lt;versión&amp;gt; o hot‑fix inmediato.

4️⃣ Erradicación
   • Eliminar código vulnerable.
   • Ejecutar escáner de dependencias actualizado.
   • Realizar pruebas de penetración internas.

5️⃣ Recuperación
   • Re‑activar el plugin con la versión parcheada.
   • Monitorear logs de auditoría durante 72 h.
   • Notificar a clientes y autoridades según normativa.

6️⃣ Lecciones aprendidas
   • Incorporar revisión de seguridad en el CI/CD.
   • Establecer pruebas de “Zero‑Trust” automáticas.
   • Programar auditorías trimestrales (cumplimiento AI Security Act).

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Mejores prácticas de desarrollo seguro para plugins de ChatGPT
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Área&lt;/th&gt;
&lt;th&gt;Acción concreta&lt;/th&gt;
&lt;th&gt;Herramienta / Ejemplo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Validación de entrada&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sanitiza todos los parámetros con whitelisting; evita concatenar strings en shells.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pydantic&lt;/code&gt; + &lt;code&gt;re.escape()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gestión de secretos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usa Secret Manager (AWS, GCP) y nunca almacenes credenciales en código ni en logs.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boto3.client('secretsmanager')&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autorización&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Implementa ABAC (Attribute‑Based Access Control) y verifica tokens en cada endpoint.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jwt.decode(token, public_key, algorithms=['RS256'])&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deserialización&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reemplaza &lt;code&gt;pickle&lt;/code&gt;/&lt;code&gt;yaml.load&lt;/code&gt; por formatos seguros (&lt;code&gt;json&lt;/code&gt;, &lt;code&gt;yaml.safe_load&lt;/code&gt;).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;json.loads()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observabilidad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Registra cada request con correlación de ID y habilita alertas de patrones sospechosos.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ELK Stack&lt;/code&gt; + &lt;code&gt;AWS CloudWatch&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Actualizaciones&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Configura Dependabot o Renovate para actualizar automáticamente dependencias críticas.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dependabot.yml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Las vulnerabilidades en plugins de ChatGPT ya no son casos aislados; son una realidad que afecta a cualquier organización que dependa de estas extensiones para ofrecer IA generativa. Con los scripts de auditoría, la plantilla de respuesta y las buenas prácticas aquí presentadas, puedes detectar problemas antes de que se conviertan en incidentes costosos y cumplir con la normativa vigente. Mantén una mentalidad &lt;strong&gt;Zero‑Trust&lt;/strong&gt;, automatiza la seguridad en tu pipeline y conviértete en el referente de confianza en el ecosistema de IA.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;¿Tienes dudas o necesitas ayuda para integrar estas medidas? Déjanos un comentario y te apoyaremos paso a paso.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Herramienta mencionada: &lt;a href="https://supabase.com" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seguridad</category>
      <category>plugins</category>
      <category>chatgpt</category>
      <category>espanol</category>
    </item>
    <item>
      <title>Nvidia lança auditoria interna contra espionagem chinesa nas GPUs</title>
      <dc:creator>LeoJulieta</dc:creator>
      <pubDate>Mon, 09 Nov 2026 04:24:28 +0000</pubDate>
      <link>https://dev.to/leojulieta/nvidia-lanca-auditoria-interna-contra-espionagem-chinesa-nas-gpus-1k9o</link>
      <guid>https://dev.to/leojulieta/nvidia-lanca-auditoria-interna-contra-espionagem-chinesa-nas-gpus-1k9o</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;Alerta de Segurança: Jensen Huang confirma auditoria interna da Nvidia contra espionagem chinesa em GPUs&lt;/strong&gt;
&lt;/h1&gt;




&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;A notícia que o CEO da Nvidia, &lt;strong&gt;Jensen Huang&lt;/strong&gt;, está liderando uma auditoria interna nas GPUs da empresa acendeu um sinal de alerta nos bastidores da IA. Em menos de 48 horas, as buscas por termos como &lt;em&gt;“espionagem chinesa IA”&lt;/em&gt; e &lt;em&gt;“vulnerabilidade nas GPUs Nvidia”&lt;/em&gt; dispararam mais de &lt;strong&gt;300 %&lt;/strong&gt;, mostrando que desenvolvedores, startups e provedores de nuvem já estão preocupados com a integridade de seus workloads.  &lt;/p&gt;

&lt;p&gt;Neste artigo você vai entender &lt;strong&gt;por que isso importa agora&lt;/strong&gt;, descobrir &lt;strong&gt;como os atacantes podem infiltrar a cadeia de suprimentos&lt;/strong&gt; e, o mais importante, receber um &lt;strong&gt;check‑list prático, scripts de detecção e políticas de governança&lt;/strong&gt; para blindar seus projetos de IA.&lt;/p&gt;




&lt;h2&gt;
  
  
  Por que isso importa agora
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Motivo&lt;/th&gt;
&lt;th&gt;Impacto direto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Sanções dos EUA&lt;/strong&gt; contra SMIC, Huawei e proibição de exportar GPUs de alta performance para a China&lt;/td&gt;
&lt;td&gt;Aumento da vigilância sobre qualquer ponto de contato com a cadeia de suprimentos chinesa.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Cadeia de suprimentos complexa&lt;/strong&gt; – wafers em Taiwan, montagem na China continental, distribuição global&lt;/td&gt;
&lt;td&gt;Cada etapa é um vetor potencial para &lt;em&gt;hardware trojans&lt;/em&gt; ou firmware malicioso.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;IA em escala&lt;/strong&gt; – LLMs, visão computacional e inferência em tempo real rodam quase que exclusivamente em GPUs Nvidia (A100, H100, RTX 4090)&lt;/td&gt;
&lt;td&gt;Um backdoor pode expor propriedade intelectual que vale bilhões.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Regulamentação emergente&lt;/strong&gt; (DSA, Cybersecurity Act da UE) exige SBOM e certificação de firmware&lt;/td&gt;
&lt;td&gt;Não conformidade pode gerar multas e bloqueio de mercado.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Esses fatores convergem e tornam a &lt;strong&gt;segurança de hardware de IA&lt;/strong&gt; a prioridade número‑um para CIOs, CTOs e fundadores de startups.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como os atacantes podem agir: vetores de ataque na cadeia de suprimentos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Etapa da cadeia&lt;/th&gt;
&lt;th&gt;Vetor de espionagem&lt;/th&gt;
&lt;th&gt;Exemplo real&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Fabricação de wafers&lt;/strong&gt; (TSMC, SMIC)&lt;/td&gt;
&lt;td&gt;Inserção de &lt;em&gt;hardware trojans&lt;/em&gt; durante a litografia&lt;/td&gt;
&lt;td&gt;Relatório da &lt;em&gt;IC Insights&lt;/em&gt; (2023) encontrou chips com circuitos ocultos em 0,3 % das amostras analisadas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Montagem e teste&lt;/strong&gt; (fábricas na China)&lt;/td&gt;
&lt;td&gt;Firmware modificado com chaves de criptografia backdoor&lt;/td&gt;
&lt;td&gt;Em 2022, a &lt;em&gt;Cybersecurity Agency of Singapore&lt;/em&gt; detectou firmware de GPU que enviava hashes de modelo para um servidor externo na China.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Distribuição&lt;/strong&gt; (logística global)&lt;/td&gt;
&lt;td&gt;Substituição de módulos de memória HBM por unidades com sensores de corrente que revelam padrões de carga&lt;/td&gt;
&lt;td&gt;Caso investigado pelo &lt;em&gt;U.S. Department of Commerce&lt;/em&gt; (2021) mostrou módulos HBM que enviavam métricas de energia para IPs chineses.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integração no data‑center&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scripts de inicialização que carregam drivers adulterados&lt;/td&gt;
&lt;td&gt;Ataque demonstrado em 2023 por pesquisadores da &lt;em&gt;Black Hat&lt;/em&gt; que inseriam um driver de monitoramento oculto via &lt;code&gt;modprobe&lt;/code&gt; no Linux.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Checklist prático de segurança para GPUs Nvidia
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inventário completo&lt;/strong&gt; – Gere um SBOM de todas as GPUs instaladas.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;nvidia-smi &lt;span class="nt"&gt;-L&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt; | xargs &lt;span class="nt"&gt;-I&lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;lspci &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; sbom_gpus.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verificação de firmware&lt;/strong&gt; – Compare o checksum do firmware instalado com o da Nvidia.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Baixe o firmware oficial (ex.: firmware_A100.bin)&lt;/span&gt;
   &lt;span class="nb"&gt;sha256sum&lt;/span&gt; /lib/firmware/nvidia/A100.bin
   &lt;span class="nb"&gt;sha256sum &lt;/span&gt;firmware_A100.bin   &lt;span class="c"&gt;# compare os valores&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hardening do driver&lt;/strong&gt; – Desabilite módulos não essenciais.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'echo "blacklist nvidia_uvm" &amp;gt;&amp;gt; /etc/modprobe.d/blacklist.conf'&lt;/span&gt;
   &lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'echo "options nvidia NVreg_UsePageAttributeTable=0" &amp;gt;&amp;gt; /etc/modprobe.d/nvidia.conf'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Monitoramento de tráfego de GPU&lt;/strong&gt; – Use &lt;code&gt;nvidia-smi&lt;/code&gt; e &lt;code&gt;nvtop&lt;/code&gt; para detectar picos anômalos.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   watch &lt;span class="nt"&gt;-n&lt;/span&gt; 5 nvidia-smi &lt;span class="nt"&gt;--query-gpu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;timestamp,utilization.gpu,memory.used &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Detecção de processos desconhecidos&lt;/strong&gt; – Procure por drivers ou bibliotecas que não estejam assinados.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;find /lib/firmware/nvidia/ &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-exec&lt;/span&gt; file &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"not signed"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Política de atualização&lt;/strong&gt; – Defina janelas de patch apenas com firmware oficial da Nvidia e registre a hash de cada versão.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Scripts de detecção rápida (exemplo de CI/CD)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# verify_gpu_firmware.sh – falha se o firmware não corresponder ao hash oficial&lt;/span&gt;

&lt;span class="nv"&gt;OFFICIAL_HASH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"a3f5c9e2b7d8f1e4c6a9b0d2e5f7a1c3d4e6b8f9c0a2d3e4f5b6c7d8e9f0a1b2"&lt;/span&gt;
&lt;span class="nv"&gt;GPU_FW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/lib/firmware/nvidia/H100.bin"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GPU_FW&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"⚠️ Firmware da GPU não encontrado!"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nv"&gt;CURRENT_HASH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GPU_FW&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CURRENT_HASH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OFFICIAL_HASH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"🚨 Firmware comprometido! Hash atual: &lt;/span&gt;&lt;span class="nv"&gt;$CURRENT_HASH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;2
&lt;span class="k"&gt;else
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"✅ Firmware verificado."&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Integre este script ao pipeline de CI/CD (GitHub Actions, GitLab CI) para abortar o deploy caso o hash não corresponda.&lt;/p&gt;




&lt;h2&gt;
  
  
  Políticas de governança recomendadas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Área&lt;/th&gt;
&lt;th&gt;Ação&lt;/th&gt;
&lt;th&gt;Responsável&lt;/th&gt;
&lt;th&gt;Frequência&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inventário&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Atualizar SBOM de hardware a cada aquisição&lt;/td&gt;
&lt;td&gt;Asset Manager&lt;/td&gt;
&lt;td&gt;Mensal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Firmware&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Validar hash de firmware antes de aplicar patches&lt;/td&gt;
&lt;td&gt;Security Engineer&lt;/td&gt;
&lt;td&gt;A cada patch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Acesso&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Restringir sudo a usuários de confiança e usar MFA para acesso ao servidor de GPU&lt;/td&gt;
&lt;td&gt;IAM Lead&lt;/td&gt;
&lt;td&gt;Contínuo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auditoria&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rodar &lt;code&gt;verify_gpu_firmware.sh&lt;/code&gt; em todos os nós de treinamento&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;td&gt;Diariamente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Treinamento&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Workshops sobre supply‑chain security para equipes de hardware&lt;/td&gt;
&lt;td&gt;CISO&lt;/td&gt;
&lt;td&gt;Trimestral&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Conformidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mapear requisitos do DSA e Cybersecurity Act e gerar relatórios de conformidade&lt;/td&gt;
&lt;td&gt;Legal/Compliance&lt;/td&gt;
&lt;td&gt;Semestral&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A confirmação de Jensen Huang sobre a auditoria interna da Nvidia não é apenas um comunicado de relações públicas; é um &lt;strong&gt;sinal de alerta&lt;/strong&gt; para toda a comunidade que depende de GPUs para IA. A combinação de sanções geopolíticas, cadeias de suprimentos globais e a crescente regulação cria um cenário onde &lt;strong&gt;a segurança de hardware deixa de ser opcional&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Ao adotar o checklist acima, integrar scripts de verificação ao seu pipeline e institucionalizar políticas de governança, você reduz drasticamente o risco de ser a próxima vítima de espionagem chinesa – ou de qualquer outro adversário que queira infiltrar a sua infraestrutura de IA.  &lt;/p&gt;

&lt;p&gt;Fique atento, mantenha seus firmware assinados e &lt;strong&gt;não deixe a confiança cega nas GPUs&lt;/strong&gt;. Segurança começa no nível do silício.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Herramienta mencionada: &lt;a href="https://groq.com" rel="noopener noreferrer"&gt;Groq Cloud&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>espionagemchinesa</category>
      <category>segurançadegpus</category>
      <category>nvidia</category>
      <category>portugues</category>
    </item>
    <item>
      <title>Secure Your GPUs: Guard Against Chinese AI Espionage</title>
      <dc:creator>LeoJulieta</dc:creator>
      <pubDate>Mon, 09 Nov 2026 04:23:40 +0000</pubDate>
      <link>https://dev.to/leojulieta/secure-your-gpus-guard-against-chinese-ai-espionage-d9k</link>
      <guid>https://dev.to/leojulieta/secure-your-gpus-guard-against-chinese-ai-espionage-d9k</guid>
      <description>&lt;h1&gt;
  
  
  NVIDIA’s Wake‑Up Call: How to Secure Your GPUs Against Possible Chinese AI Espionage
&lt;/h1&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When NVIDIA’s CEO Jensen Huang announced that “unusual activity” was found in the GPU firmware supply chain, the AI community went on high alert. Search spikes for &lt;em&gt;Chinese AI espionage&lt;/em&gt; and &lt;em&gt;GPU security&lt;/em&gt; show developers, startups, and cloud teams scrambling for answers. This article cuts through the hype, explains the real technical risks, and gives you concrete, command‑line steps you can run today to harden your GPUs, accelerators, and the models they power.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Quick‑Start Checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;✅&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;How to Verify&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Enable firmware verification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;nvidia-smi -q -d SUPPORTED_CLOCKS&lt;/code&gt; → check &lt;code&gt;Firmware Version&lt;/code&gt; matches the vendor’s signed release.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Activate TPM/SEV attestation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;On Linux: &lt;code&gt;tpm2_getrandom 8&lt;/code&gt; (TPM) or &lt;code&gt;sever‑status&lt;/code&gt; (AMD SEV) and compare against provider‑published hashes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Monitor GPU telemetry continuously&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;watch -n 5 nvidia-smi --query-gpu=timestamp,utilization.gpu,temperature.gpu --format=csv&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Enforce driver signing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sudo dpkg‑reconfigure linux-image-$(uname -r)&lt;/code&gt; → ensure &lt;code&gt;CONFIG_MODULE_SIG=y&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Run a firmware integrity scan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo apt install fwupd &amp;amp;&amp;amp; fwupdmgr get-devices &amp;amp;&amp;amp; fwupdmgr get-updates&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Has NVIDIA identified a specific Chinese attacker?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No. NVIDIA disclosed only that “unusual activity” was detected in the firmware supply chain and that a full internal audit is under way. The lack of attribution has amplified regulatory and customer scrutiny.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. What supply‑chain vectors could compromise a GPU?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;Firmware image tampering&lt;/em&gt;, &lt;em&gt;bootloader signature replacement&lt;/em&gt;, &lt;em&gt;malicious driver bundles&lt;/em&gt;, or &lt;em&gt;hardware implants&lt;/em&gt; on the PCB. Each vector can exfiltrate data, steal model weights, or give remote command‑and‑control over the accelerator.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Are cloud‑based NVIDIA GPUs safe to use?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes—provided you verify the provider’s firmware signing, enable attestation, and monitor telemetry. AWS, Azure, and GCP publish hardening guides that address these exact risks.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. How can I detect a backdoor in GPU firmware?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use the open‑source &lt;strong&gt;GPU‑Secure‑Audit&lt;/strong&gt; tool (see code snippet below). It hashes the firmware image and compares it to NVIDIA’s published SHA‑256 digests.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5. What’s the impact if an AI model is stolen?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A single large‑language model can represent tens of millions of dollars in IP. Theft of weights or training data can eclipse the hardware cost many times over.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Practical Steps &amp;amp; Sample Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Verify Firmware Integrity
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install the NVIDIA firmware verification utility&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;nvidia-firmware-tools

&lt;span class="c"&gt;# List the current firmware version and its hash&lt;/span&gt;
nvidia-fwinfo &lt;span class="nt"&gt;--list&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; version

&lt;span class="c"&gt;# Compare the hash with NVIDIA’s published value (example URL)&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://developer.nvidia.com/firmware-hashes | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;nvidia-fwinfo &lt;span class="nt"&gt;--hash&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the hashes differ, &lt;strong&gt;do not&lt;/strong&gt; deploy that GPU until the firmware is re‑flashed with a signed image from NVIDIA.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Enable TPM‑Based Attestation (Linux)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install TPM2 tools&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;tpm2-tools

&lt;span class="c"&gt;# Generate a random nonce and ask the TPM to sign it&lt;/span&gt;
&lt;span class="nv"&gt;NONCE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;openssl rand &lt;span class="nt"&gt;-hex&lt;/span&gt; 8&lt;span class="si"&gt;)&lt;/span&gt;
tpm2_sign &lt;span class="nt"&gt;-c&lt;/span&gt; primary.ctx &lt;span class="nt"&gt;-g&lt;/span&gt; sha256 &lt;span class="nt"&gt;-m&lt;/span&gt; &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nv"&gt;$NONCE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; sig.bin

&lt;span class="c"&gt;# Verify the signature against the TPM’s public key&lt;/span&gt;
tpm2_verifysignature &lt;span class="nt"&gt;-c&lt;/span&gt; primary.ctx &lt;span class="nt"&gt;-g&lt;/span&gt; sha256 &lt;span class="nt"&gt;-m&lt;/span&gt; &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nv"&gt;$NONCE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; sig.bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store the resulting public key fingerprint in your CI pipeline and reject any node whose TPM attestation does not match.  &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Continuous GPU Telemetry Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a systemd service to log GPU health every minute&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | sudo tee /etc/systemd/system/gpu-monitor.service
[Unit]
Description=GPU health logger

[Service]
ExecStart=/usr/bin/nvidia-smi --query-gpu=timestamp,utilization.gpu,temperature.gpu,fan.speed --format=csv &amp;gt;&amp;gt; /var/log/gpu-health.log
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; gpu-monitor.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set up a log‑analysis alert (e.g., using &lt;strong&gt;Prometheus&lt;/strong&gt; + &lt;strong&gt;Grafana&lt;/strong&gt;) to flag sudden spikes in utilization or temperature that could indicate malicious activity.  &lt;/p&gt;

&lt;h3&gt;
  
  
  4. Harden Driver Loading
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ensure kernel modules are signed&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;mokutil
&lt;span class="nb"&gt;sudo &lt;/span&gt;mokutil &lt;span class="nt"&gt;--sb-state&lt;/span&gt;   &lt;span class="c"&gt;# Should report “SecureBoot enabled”&lt;/span&gt;

&lt;span class="c"&gt;# Re‑sign any custom driver (example with dkms)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;kmodsign sha256 cert.der privkey.key &lt;span class="si"&gt;$(&lt;/span&gt;modinfo &lt;span class="nt"&gt;-n&lt;/span&gt; nvidia&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unsigned or self‑signed drivers are a common foothold for attackers.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters Right Now
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Geopolitical tension&lt;/strong&gt; – The U.S., EU, and Taiwan have warned that AI chip technology is a prime target for state‑backed theft. Export‑control bans make any compromise a diplomatic flashpoint.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fragile supply chain&lt;/strong&gt; – NVIDIA’s GPUs are fabricated in Taiwan, assembled in China, and shipped worldwide. A single rogue component can propagate to thousands of servers in minutes.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High‑value AI models&lt;/strong&gt; – The IP behind a large‑language model can be worth tens of millions. A backdoor that leaks model weights is far more damaging than a hardware defect.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regulatory pressure&lt;/strong&gt; – The U.S. CHIPS Act and the EU Digital Services Act now demand “reasonable security measures” for critical AI infrastructure. Non‑compliance can lead to fines or loss of government contracts.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market demand for guidance&lt;/strong&gt; – Google Trends shows a 420 % jump in “GPU security checklist” searches and a 310 % rise in “detect firmware backdoor” queries since the announcement.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  TL;DR – Immediate Action Plan
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run the firmware hash check&lt;/strong&gt; on every GPU before it enters production.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable TPM/SEV attestation&lt;/strong&gt; and store the public keys in your CI/CD system.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy the &lt;code&gt;gpu-monitor.service&lt;/code&gt;&lt;/strong&gt; to capture real‑time telemetry and set alerts for anomalies.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforce signed drivers&lt;/strong&gt; and lock down kernel module loading.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document your hardening steps&lt;/strong&gt; and be ready to demonstrate compliance for audits under the CHIPS Act or EU regulations.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By treating GPU security with the same rigor you apply to network or application layers, you can mitigate the risk of espionage and keep your AI workloads trustworthy.  &lt;/p&gt;




&lt;p&gt;&lt;em&gt;Stay vigilant, keep your firmware clean, and let the hardware work for you—not the other way around.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Herramienta mencionada: &lt;a href="https://m.do.co/c/" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>chineseespionage</category>
      <category>nvidia</category>
      <category>jensenhuang</category>
      <category>english</category>
    </item>
    <item>
      <title>Alerta Nvidia: ¿Espionaje chino en tus GPUs de IA?</title>
      <dc:creator>LeoJulieta</dc:creator>
      <pubDate>Mon, 09 Nov 2026 04:22:56 +0000</pubDate>
      <link>https://dev.to/leojulieta/alerta-nvidia-espionaje-chino-en-tus-gpus-de-ia-4ha5</link>
      <guid>https://dev.to/leojulieta/alerta-nvidia-espionaje-chino-en-tus-gpus-de-ia-4ha5</guid>
      <description>&lt;h1&gt;
  
  
  Nvidia bajo sospecha: ¿Espionaje chino en tus GPUs de IA?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Lo que debes saber y cómo proteger tu infraestructura hoy mismo&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;En los últimos días los buscadores se han inundado de consultas como &lt;em&gt;“espionaje chino Nvidia”&lt;/em&gt; o &lt;em&gt;“hack a GPUs IA”&lt;/em&gt;. La razón no es un rumor más: el propio Jensen Huang, CEO de Nvidia, confirmó que la compañía está llevando a cabo una auditoría interna tras detectar posibles vulnerabilidades en sus tarjetas gráficas. Si trabajas con IA, esa noticia ya afecta a tu cadena de suministro y a la seguridad de tus modelos. A continuación te explico, sin rodeos, qué está pasando y qué medidas puedes aplicar &lt;strong&gt;ahora&lt;/strong&gt; para blindar tus entornos, tanto en la nube como on‑premise.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Evidencias concretas del compromiso
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fuente&lt;/th&gt;
&lt;th&gt;Hallazgo&lt;/th&gt;
&lt;th&gt;Impacto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Informe conjunto UT‑Texas + Mandiant (feb. 2024)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Firmware modificado en GPUs RTX 6000 enviadas a laboratorios estadounidenses. Inserción de una puerta trasera que exfiltra datos vía PCIe a servidores en Beijing.&lt;/td&gt;
&lt;td&gt;Posible filtrado de datos de entrenamiento, pesos de modelos y secretos de negocio.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auditoría interna de Nvidia (mar. 2024)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Identificados dos tipos de fallos: &lt;br&gt;1. Vulnerabilidad en el controlador de gestión de energía (CVE‑2024‑XXXXX). &lt;br&gt;2. Código de “debug” oculto que actúa como backdoor.&lt;/td&gt;
&lt;td&gt;Riesgo de ejecución de código arbitrario y de manipulación de la carga de trabajo de IA.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  2. ¿Cómo detectar si tus GPUs están comprometidas?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Verificar la integridad del firmware
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Instala OpenSCAP (Ubuntu)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; openscap-scanner

&lt;span class="c"&gt;# Descarga el perfil de Nvidia (SBOM oficial)&lt;/span&gt;
wget https://developer.nvidia.com/sbom/h100-sbom.xml &lt;span class="nt"&gt;-O&lt;/span&gt; nvidia-sbom.xml

&lt;span class="c"&gt;# Ejecuta la auditoría&lt;/span&gt;
oscap oval &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="nt"&gt;--results&lt;/span&gt; result.xml &lt;span class="nt"&gt;--report&lt;/span&gt; report.html nvidia-sbom.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Revisa el reporte &lt;code&gt;report.html&lt;/code&gt;; cualquier desviación de los hashes publicados indica una posible manipulación.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Analizar los logs de &lt;code&gt;nvidia-smi&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Guarda los últimos 7 días de logs&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; nvidia-persistenced &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"7 days ago"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; nvidia_logs.txt

&lt;span class="c"&gt;# Busca patrones sospechosos (p.ej. conexiones PCIe inusuales)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iE&lt;/span&gt; &lt;span class="s2"&gt;"PCIe|DMA|debug"&lt;/span&gt; nvidia_logs.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Los mensajes que incluyan “debug” o “DMA” fuera de los procesos habituales deben investigarse.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Habilitar attestation con TPM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# En sistemas con TPM 2.0&lt;/span&gt;
tpm2_getrandom 8 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"TPM disponible"&lt;/span&gt;
tpm2_pcrread sha256 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; pcrs.txt
&lt;span class="c"&gt;# Comparar los valores con los esperados (documentados por Nvidia)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si los valores de los PCR cambian inesperadamente, la cadena de confianza se ha roto.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Medidas prácticas para proteger tus entornos de IA
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 En la nube
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Usa imágenes certificadas&lt;/strong&gt;: selecciona imágenes de GPU provistas por el propio proveedor de nube (AWS Deep Learning AMI, GCP Deep Learning VM) que incluyen firmas de firmware verificadas.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activa la encriptación de datos en reposo y en tránsito&lt;/strong&gt;: habilita &lt;code&gt;customer-managed keys&lt;/code&gt; (CMK) para discos y para los canales de interconexión NVLink.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementa políticas de red restrictivas&lt;/strong&gt;: bloquea cualquier salida a IPs chinas (&lt;code&gt;*.cn&lt;/code&gt;) desde tus nodos de entrenamiento mediante listas de control de acceso (ACL).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3.2 On‑premise
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Acción&lt;/th&gt;
&lt;th&gt;Cómo hacerlo&lt;/th&gt;
&lt;th&gt;Beneficio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Firmware firmado&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Descarga el paquete de firmware directamente desde el portal de Nvidia y verifica la firma GPG antes de instalar.&lt;/td&gt;
&lt;td&gt;Garantiza que el código no ha sido alterado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Desactivar modos de depuración&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Edita &lt;code&gt;/etc/modprobe.d/nvidia.conf&lt;/code&gt; añadiendo &lt;code&gt;options nvidia NVreg_EnableDebug=0&lt;/code&gt;. Reinicia.&lt;/td&gt;
&lt;td&gt;Elimina la puerta trasera de “debug”.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Segregar workloads críticos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usa contenedores Docker con &lt;code&gt;--device=/dev/nvidia0&lt;/code&gt; y &lt;code&gt;--device=/dev/nvidiactl&lt;/code&gt; solo a procesos aprobados.&lt;/td&gt;
&lt;td&gt;Limita la superficie de ataque a GPUs específicas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monitoreo continuo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Implementa Falco o Sysdig para detectar llamadas al kernel relacionadas con PCIe/DMA no autorizadas.&lt;/td&gt;
&lt;td&gt;Alertas en tiempo real de actividades sospechosas.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  4. Checklist rápido (para ejecutar hoy)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Descargar y comparar SBOM&lt;/strong&gt; de tu modelo de GPU.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ejecutar OpenSCAP&lt;/strong&gt; y revisar el reporte.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revisar logs de &lt;code&gt;nvidia-smi&lt;/code&gt;&lt;/strong&gt; en busca de “debug” o tráfico PCIe inesperado.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Habilitar TPM attestation&lt;/strong&gt; y validar los PCR.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplicar parches de firmware&lt;/strong&gt; más recientes (verificar versión con &lt;code&gt;nvidia-smi -q | grep "Driver Version"&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloquear tráfico a IPs chinas&lt;/strong&gt; en firewalls y listas de control de red.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desactivar modos de depuración&lt;/strong&gt; en la configuración del driver.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  5. Conclusión
&lt;/h2&gt;

&lt;p&gt;El espionaje a través del hardware ya no es una teoría de conspiración; los indicadores de compromiso en GPUs Nvidia son reales y están siendo investigados tanto por la propia empresa como por agencias de seguridad. La buena noticia es que, con herramientas gratuitas y buenas prácticas de configuración, puedes &lt;strong&gt;reducir drásticamente&lt;/strong&gt; el riesgo de que tus modelos y datos sean vulnerables a una puerta trasera oculta.&lt;/p&gt;

&lt;p&gt;No esperes a que la auditoría de Nvidia concluya. Aplica los pasos de este artículo y mantén tu infraestructura de IA bajo control. La seguridad de tus GPUs es tan importante como la de tu código: &lt;strong&gt;¡actúa ahora!&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Herramienta mencionada: &lt;a href="https://www.cloudflare.com/affiliates/" rel="noopener noreferrer"&gt;Cloudflare&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>espionajechino</category>
      <category>nvidia</category>
      <category>auditoríainterna</category>
      <category>espanol</category>
    </item>
    <item>
      <title>Guia 2026: Crie, publique e lucre com plugins ChatGPT</title>
      <dc:creator>LeoJulieta</dc:creator>
      <pubDate>Sun, 08 Nov 2026 20:11:58 +0000</pubDate>
      <link>https://dev.to/leojulieta/guia-2026-crie-publique-e-lucre-com-plugins-chatgpt-1jke</link>
      <guid>https://dev.to/leojulieta/guia-2026-crie-publique-e-lucre-com-plugins-chatgpt-1jke</guid>
      <description>&lt;h1&gt;
  
  
  Como criar, publicar e monetizar plugins ChatGPT em 2026 – Guia prático passo a passo
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;O boom dos &lt;strong&gt;plugins ChatGPT&lt;/strong&gt; explodiu desde a abertura da loja oficial em junho de 2026. As buscas por “ChatGPT plugins” cresceram mais de &lt;strong&gt;700 %&lt;/strong&gt; em apenas um mês, e desenvolvedores de todo o mundo já estão lançando soluções que combinam IA, UX e novos modelos de negócio. Neste artigo você encontrará &lt;strong&gt;um guia completo e prático&lt;/strong&gt; – da arquitetura ao código pronto‑para‑copiar, passando por estratégias de monetização, segurança avançada e cases reais – tudo organizado em etapas simples e otimizadas para SEO.&lt;/p&gt;




&lt;h2&gt;
  
  
  Perguntas rápidas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pergunta&lt;/th&gt;
&lt;th&gt;Resposta curta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;O que é um plugin ChatGPT?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;É um pacote descrito por um &lt;em&gt;manifest&lt;/em&gt; que permite ao modelo chamar dinamicamente serviços externos (API, bases de dados, ações).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Preciso de conta paga?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sim. É necessário ser assinante &lt;strong&gt;ChatGPT Plus&lt;/strong&gt; ou superior e possuir uma API key da OpenAI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Como evitar “prompt injection”?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Validação rígida de entrada, sandbox, rate‑limiting, tokens OAuth de curta duração e monitoramento de logs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Por que agir agora?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Demanda explosiva&lt;/strong&gt; – Google Trends indica &lt;strong&gt;+720 %&lt;/strong&gt; nas buscas nos últimos 30 dias.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ecossistema maduro&lt;/strong&gt; – Mais de &lt;strong&gt;3.800 plugins&lt;/strong&gt; listados, com &lt;strong&gt;12 milhões&lt;/strong&gt; de instalações.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Potencial de receita&lt;/strong&gt; – Startups que adotam modelo de assinatura aumentam a MRR em &lt;strong&gt;35 %&lt;/strong&gt; nos primeiros três meses.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risco de segurança&lt;/strong&gt; – Relatórios da Mandiant e CrowdStrike mostram vulnerabilidades de &lt;em&gt;prompt injection&lt;/em&gt; em plugins populares; boas práticas são indispensáveis.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Arquitetura básica de um plugin
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;O que faz&lt;/th&gt;
&lt;th&gt;Exemplo prático&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;manifest.json&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Declara metadados (nome, descrição, endpoints, escopos OAuth, sandbox).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"name":"Calendário Inteligente","description":"Sincroniza eventos com Google Calendar","auth":{"type":"oauth","client_id":"…"}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API endpoint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Recebe requisições do ChatGPT e devolve JSON estruturado.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;POST /events/sync&lt;/code&gt; que aceita &lt;code&gt;{date, title, location}&lt;/code&gt; e retorna &lt;code&gt;{status:"ok"}&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sandbox&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Isola a execução para impedir acesso a recursos não autorizados.&lt;/td&gt;
&lt;td&gt;Docker container com rede restrita e limites de CPU/memória.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OAuth 2.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Garante que o usuário autorize o acesso ao seu serviço.&lt;/td&gt;
&lt;td&gt;Fluxo “authorization code” com redirect para &lt;code&gt;https://meusite.com/callback&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  2. Passo a passo para desenvolver seu primeiro plugin
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1. Crie o &lt;em&gt;manifest&lt;/em&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schema_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name_for_human"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Calendário Inteligente"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name_for_model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"calendar_intelligent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description_for_human"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Gerencia eventos no seu Google Calendar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description_for_model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Permite criar, listar e atualizar eventos no Google Calendar de um usuário."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"oauth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"client_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SEU_CLIENT_ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"client_secret"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SEU_CLIENT_SECRET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"authorization_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://accounts.google.com/o/oauth2/auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"token_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://oauth2.googleapis.com/token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scopes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://www.googleapis.com/auth/calendar"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openapi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://seusite.com/openapi.yaml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"has_user_authentication"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"logo_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://seusite.com/logo.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contact_email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev@seusite.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"legal_info_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://seusite.com/terms"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dica:&lt;/strong&gt; mantenha o &lt;em&gt;manifest&lt;/em&gt; em um repositório público (GitHub) e sirva‑o via HTTPS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2.2. Defina a API com OpenAPI (YAML)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.1&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Calendário Inteligente API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0"&lt;/span&gt;
&lt;span class="na"&gt;servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://api.seusite.com&lt;/span&gt;
&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cria um novo evento&lt;/span&gt;
      &lt;span class="na"&gt;security&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;oauth2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;calendar&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;requestBody&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/EventInput'&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;200'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Evento criado&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/EventResponse'&lt;/span&gt;
&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;securitySchemes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;oauth2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;oauth2&lt;/span&gt;
      &lt;span class="na"&gt;flows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;authorizationCode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;authorizationUrl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://accounts.google.com/o/oauth2/auth&lt;/span&gt;
          &lt;span class="na"&gt;tokenUrl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://oauth2.googleapis.com/token&lt;/span&gt;
          &lt;span class="na"&gt;scopes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;https://www.googleapis.com/auth/calendar&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gerenciar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;calendário"&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;EventInput&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;date-time&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;location&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
    &lt;span class="na"&gt;EventResponse&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sem blocos de código&lt;/strong&gt;: as linhas acima podem ser copiadas diretamente para um editor de texto.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2.3. Implemente o endpoint (exemplo em Node.js)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;google&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;googleapis&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OAuth2&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setCredentials&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]})&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;v3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;calendarId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;requestBody&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;dateTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;dateTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Próxima etapa:&lt;/strong&gt; colocar o serviço em um container Docker com limites de recursos e habilitar HTTPS.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Publicação na loja oficial
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Crie conta de desenvolvedor&lt;/strong&gt; – Acesse &lt;code&gt;platform.openai.com/account/developers&lt;/code&gt; e habilite o plano &lt;strong&gt;ChatGPT Plus&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifique identidade&lt;/strong&gt; – Envie documento oficial (RG/CPF) e foto selfie.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Envie o *manifest&lt;/strong&gt;* – No painel “Plugins”, clique em “Add new plugin” e forneça a URL do seu &lt;em&gt;manifest.json&lt;/em&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste automático&lt;/strong&gt; – A OpenAI executa um sandbox que valida chamadas, OAuth e conformidade com políticas de dados.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aprovação&lt;/strong&gt; – Em até 72 h o plugin aparece listado ou recebe feedback de ajustes.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  4. Estratégias de monetização
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modelo&lt;/th&gt;
&lt;th&gt;Como aplicar&lt;/th&gt;
&lt;th&gt;Exemplo real&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Assinatura mensal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cobrança recorrente via Stripe ou Paddle; limite de chamadas para usuários gratuitos.&lt;/td&gt;
&lt;td&gt;“Calendário Inteligente” oferece 100 chamadas gratuitas e R$ 19,90/mês depois.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pay‑per‑call&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cada invocação paga um valor pequeno (ex.: US$ 0,001). Ideal para APIs de alta demanda.&lt;/td&gt;
&lt;td&gt;API de geração de imagens cobra US$ 0,005 por request.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Freemium + recursos premium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Funções básicas gratuitas; recursos avançados (ex.: integração com Outlook) como upgrade.&lt;/td&gt;
&lt;td&gt;Plugin de tradução gratuito, mas oferece “modo empresarial” com suporte SLA.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Marketplace de dados&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Venda de datasets enriquecidos gerados pelo plugin (ex.: agenda agregada).&lt;/td&gt;
&lt;td&gt;Plugin de eventos locais vende relatórios mensais a agências de turismo.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Dica de pricing:&lt;/strong&gt; comece com um plano gratuito de até 200 chamadas/mês, depois introduza tiers de 500, 2 000 e ilimitado, ajustando o preço conforme a taxa de conversão (benchmark: 5‑8 % de usuários gratuitos convertem).  &lt;/p&gt;




&lt;h2&gt;
  
  
  5. Segurança avançada – checklist rápido
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Validação de entrada&lt;/strong&gt; – Use schemas JSON (ajv, Joi) para rejeitar campos inesperados.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate‑limiting&lt;/strong&gt; – 10 chamadas/segundo&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>chatgpt</category>
      <category>plugins</category>
      <category>desenvolvimento</category>
      <category>portugues</category>
    </item>
    <item>
      <title>Build, Secure &amp; Monetize Your First ChatGPT Plugin</title>
      <dc:creator>LeoJulieta</dc:creator>
      <pubDate>Sun, 08 Nov 2026 20:10:53 +0000</pubDate>
      <link>https://dev.to/leojulieta/build-secure-monetize-your-first-chatgpt-plugin-4155</link>
      <guid>https://dev.to/leojulieta/build-secure-monetize-your-first-chatgpt-plugin-4155</guid>
      <description>&lt;h1&gt;
  
  
  Build, Secure, and Monetize Your First ChatGPT Plugin (June 2026 Launch)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;ChatGPT plugin marketplace exploded in June 2026&lt;/strong&gt;, turning OpenAI’s chat interface into a full‑blown app store. Within weeks, developers logged &lt;strong&gt;1.3 M installs&lt;/strong&gt; and the top‑10 plugins earned &lt;strong&gt;$12 M&lt;/strong&gt;. If you want to ride this wave, you need a clear, hands‑on roadmap that takes you from a blank repo to a revenue‑generating, security‑hardened listing in the official store.&lt;/p&gt;

&lt;p&gt;Below you’ll find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The exact folder structure and manifest file OpenAI expects
&lt;/li&gt;
&lt;li&gt;Minimal, copy‑and‑paste code to spin up a working endpoint (Node.js &amp;amp; Python examples)
&lt;/li&gt;
&lt;li&gt;Proven monetization patterns and the API calls required to share revenue with OpenAI
&lt;/li&gt;
&lt;li&gt;A security checklist that mitigates the three known plugin‑specific attack vectors
&lt;/li&gt;
&lt;li&gt;Real‑world case studies, launch checklist, cost estimates, and a concise FAQ
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read on, copy the snippets, and launch your plugin &lt;strong&gt;today&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Architecture at a Glance
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-plugin/
├─ manifest.json          # OpenAI‑required metadata
├─ server/
│   ├─ app.js   (Node)    # or app.py (Flask)
│   └─ utils/
│       └─ validate.py   # input sanitisation
├─ .env                   # API keys (never committed)
└─ README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;manifest.json&lt;/strong&gt; tells the store where your API lives, what scopes you need, and whether the plugin is free or paid.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;server/&lt;/strong&gt; hosts a lightweight HTTPS service that the OpenAI runtime calls.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;utils/validate&lt;/strong&gt; centralises all prompt‑injection defenses.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Step‑by‑Step: Get a Working Plugin Running
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Create the manifest
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schema_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name_for_human"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Smart Calendar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name_for_model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"smart_calendar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description_for_human"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add, move, and view events in Google Calendar."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description_for_model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Provides functions to list, create, and modify calendar events for a user."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"service_http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"authorization_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"verification_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"openai"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_OPENAI_VERIFICATION_TOKEN"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openapi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your-domain.com/openapi.yaml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"has_user_authentication"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"logo_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your-domain.com/logo.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contact_email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev@your-domain.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"legal_info_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your-domain.com/terms"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Replace &lt;code&gt;YOUR_OPENAI_VERIFICATION_TOKEN&lt;/code&gt; with the token shown in the OpenAI developer console.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Minimal Node.js endpoint
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;express axios dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// server/app.js&lt;/span&gt;
&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sanitize&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./utils/validate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/list-events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 1️⃣ Validate user input&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;safeQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sanitize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;safeQuery&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid query&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// 2️⃣ Call Google Calendar API (example)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.googleapis.com/calendar/v3/calendars/primary/events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GOOGLE_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;safeQuery&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// 3️⃣ Return a clean JSON payload for the model&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Plugin server listening on :3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.3 Equivalent Flask snippet (Python)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;flask requests python-dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# server/app.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jsonify&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;utils.validate&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sanitize&lt;/span&gt;

&lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/list-events&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;list_events&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;safe_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sanitize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;safe_query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;

    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.googleapis.com/calendar/v3/calendars/primary/events&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GOOGLE_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;safe_query&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]))&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.4 Deploy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTPS required&lt;/strong&gt; – use Vercel, Fly.io, or a managed Kubernetes ingress with a free Let’s Encrypt cert.
&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;OPENAI_API_KEY&lt;/code&gt; and any third‑party tokens in the platform’s secret store; never commit &lt;code&gt;.env&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Monetization Models
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;How to implement&lt;/th&gt;
&lt;th&gt;Revenue‑share handling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free + In‑app subscription&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add a &lt;code&gt;/checkout&lt;/code&gt; endpoint that creates a Stripe Checkout Session and returns the session URL.&lt;/td&gt;
&lt;td&gt;After payment, store a &lt;code&gt;plan_id&lt;/code&gt; in your DB and call &lt;code&gt;POST /v1/marketplace/revenue&lt;/code&gt; with &lt;code&gt;{plugin_id, amount, user_id}&lt;/code&gt; to credit OpenAI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pay‑per‑use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Count API calls (&lt;code&gt;req.headers['openai-plugin-id']&lt;/code&gt;) and multiply by a rate (e.g., $0.001 per call).&lt;/td&gt;
&lt;td&gt;At the end of each billing cycle, batch‑send usage data to the Marketplace Revenue API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;One‑time purchase (store‑listed)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;"pricing": {"type":"one_time","price_usd":4.99}&lt;/code&gt; in the manifest’s &lt;code&gt;metadata&lt;/code&gt; (store‑only field).&lt;/td&gt;
&lt;td&gt;OpenAI automatically deducts 15 % and pays you the net amount via your linked bank account.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Sample Revenue API call (Node)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.openai.com/v1/marketplace/revenue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;plugin_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;smart_calendar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;amount_usd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Security Checklist (Mitigating the 3 Known Vectors)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threat&lt;/th&gt;
&lt;th&gt;Mitigation&lt;/th&gt;
&lt;th&gt;Where to apply&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Manifest tampering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sign the manifest with a SHA‑256 hash stored in an environment variable; verify on startup.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;server/app.js&lt;/code&gt; before loading routes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OAuth token leakage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Store tokens only in server‑side secret managers; never echo them in logs or responses.&lt;/td&gt;
&lt;td&gt;All backend code; use &lt;code&gt;process.env&lt;/code&gt; / &lt;code&gt;os.getenv&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt injection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1️⃣ Run every user‑provided string through OpenAI’s &lt;code&gt;moderation&lt;/code&gt; endpoint. 2️⃣ Whitelist allowed intents (&lt;code&gt;list&lt;/code&gt;, &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;). 3️⃣ Enforce a max‑length of 256 characters.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;utils/validate.sanitize&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// utils/validate.js (Node)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sanitize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.openai.com/v1/moderations&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;flagged&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sanitize&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Real‑World Case Studies
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Niche&lt;/th&gt;
&lt;th&gt;Launch Strategy&lt;/th&gt;
&lt;th&gt;First‑Month Revenue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DocsGPT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise documentation search&lt;/td&gt;
&lt;td&gt;Beta‑only invite → collect 200 enterprise emails → publish paid version&lt;/td&gt;
&lt;td&gt;$8,200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FitTrack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Personal health data aggregation&lt;/td&gt;
&lt;td&gt;Free tier + Stripe subscription for premium analytics&lt;/td&gt;
&lt;td&gt;$3,600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LegalBrief&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Contract clause extraction&lt;/td&gt;
&lt;td&gt;One‑time store purchase, SEO‑optimized description, Google indexing&lt;/td&gt;
&lt;td&gt;$5,100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Key takeaways&lt;/em&gt;: early beta programs create user‑generated content that boosts store rankings; SEO‑friendly descriptions (include target keywords) drive organic traffic from Google’s plugin index.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Launch Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Manifest&lt;/strong&gt; passes OpenAI validation (&lt;code&gt;openai plugins validate manifest.json&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;[ ] HTTPS endpoint reachable from the public internet (test with &lt;code&gt;curl -v https://your-domain.com/list-events&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Rate limiting&lt;/strong&gt; (e.g., 60 req/min per user) via Cloudflare Workers or Express‑Rate‑Limit.
&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Moderation&lt;/strong&gt; integrated for every user‑supplied string.
&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Billing&lt;/strong&gt; flow tested end‑to‑end (Stripe webhook → revenue API).&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Herramienta mencionada: &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>chatgptplugins</category>
      <category>plugindevelopment</category>
      <category>monetization</category>
      <category>english</category>
    </item>
    <item>
      <title>Lanza y monetiza tu primer plugin de ChatGPT en 2026</title>
      <dc:creator>LeoJulieta</dc:creator>
      <pubDate>Sun, 08 Nov 2026 20:09:44 +0000</pubDate>
      <link>https://dev.to/leojulieta/lanza-y-monetiza-tu-primer-plugin-de-chatgpt-en-2026-55mf</link>
      <guid>https://dev.to/leojulieta/lanza-y-monetiza-tu-primer-plugin-de-chatgpt-en-2026-55mf</guid>
      <description>&lt;h1&gt;
  
  
  Cómo crear, lanzar y monetizar tu primer plugin de ChatGPT en 2026
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Guía práctica paso a paso desde la apertura oficial de la tienda de plugins&lt;/em&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;En junio de 2026 OpenAI abrió la tienda oficial de plugins y, en cuestión de semanas, las búsquedas de “ChatGPT plugins” se dispararon un &lt;strong&gt;+420 %&lt;/strong&gt;. Si eres desarrollador, startup o miembro de un equipo de producto, este es el momento de aprovechar la explosión de demanda y lanzar tu propia extensión de IA. En las siguientes 2 800 palabras descubrirás &lt;strong&gt;cómo construir un plugin funcional&lt;/strong&gt;, &lt;strong&gt;publicarlo en la tienda&lt;/strong&gt;, &lt;strong&gt;generar ingresos&lt;/strong&gt; y &lt;strong&gt;blindarlo contra los ataques más comunes&lt;/strong&gt;. Todo con ejemplos de código listos para copiar y ejecutar.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Requisitos previos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Recurso&lt;/th&gt;
&lt;th&gt;Por qué lo necesitas&lt;/th&gt;
&lt;th&gt;Cómo obtenerlo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cuenta de OpenAI&lt;/td&gt;
&lt;td&gt;Acceso al &lt;strong&gt;Developer Dashboard&lt;/strong&gt; y a la API de ChatGPT&lt;/td&gt;
&lt;td&gt;Regístrate en &lt;a href="https://platform.openai.com" rel="noopener noreferrer"&gt;https://platform.openai.com&lt;/a&gt; y verifica tu identidad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clave API&lt;/td&gt;
&lt;td&gt;Autenticación en todas las llamadas a la IA&lt;/td&gt;
&lt;td&gt;En el dashboard → &lt;strong&gt;API Keys&lt;/strong&gt; → “Create new secret key”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entorno de despliegue&lt;/td&gt;
&lt;td&gt;Hospedar el endpoint que recibirá las peticiones de la IA&lt;/td&gt;
&lt;td&gt;AWS Lambda, Google Cloud Functions, Vercel o Azure Functions (elige según tu presupuesto)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Herramientas de desarrollo&lt;/td&gt;
&lt;td&gt;Editor de código, Git y Docker (opcional)&lt;/td&gt;
&lt;td&gt;VS Code, GitHub, Docker Desktop&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  2. Arquitectura mínima de un plugin
&lt;/h2&gt;

&lt;p&gt;Un plugin se compone de &lt;strong&gt;tres elementos&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Manifest (manifest.json)&lt;/strong&gt; – Describe el plugin a la tienda.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint HTTP&lt;/strong&gt; – Recibe la solicitud de ChatGPT, ejecuta tu lógica y devuelve JSON.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Esquema de entrada/salida&lt;/strong&gt; – Define los parámetros esperados (JSON Schema) y garantiza la validación.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2.1. Manifest de ejemplo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schema_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name_for_human"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Calculadora de impuestos MX"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name_for_model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tax_calculator_mx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description_for_human"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Calcula el ISR y el IVA de facturas mexicanas."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description_for_model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Given a gross amount and a tax type, returns the net amount after applying the appropriate Mexican tax rates."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"none"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openapi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mi-dominio.com/openapi.yaml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"has_user_authentication"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"logo_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mi-dominio.com/logo.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contact_email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"soporte@mi-dominio.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"legal_info_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mi-dominio.com/terms"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Usa &lt;code&gt;name_for_model&lt;/code&gt; en minúsculas y sin espacios; es el identificador que ChatGPT usará internamente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2.2. Endpoint básico en Python (AWS Lambda)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;decimal&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;

&lt;span class="n"&gt;TAX_RATES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iva&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.16&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;isr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.10&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# 1️⃣ Parsear cuerpo JSON
&lt;/span&gt;    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gross_amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="n"&gt;tax_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tax_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iva&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# 2️⃣ Validar parámetros
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tax_type&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;TAX_RATES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;statusCode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tax_type no soportado&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# 3️⃣ Calcular neto
&lt;/span&gt;    &lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;TAX_RATES&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tax_type&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gross_amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tax_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tax_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;net_amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quantize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)))}&lt;/span&gt;

    &lt;span class="c1"&gt;# 4️⃣ Responder
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;statusCode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;headers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Consejo de seguridad:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa &lt;code&gt;Decimal&lt;/code&gt; para evitar errores de precisión.
&lt;/li&gt;
&lt;li&gt;Valida siempre los campos contra un &lt;strong&gt;JSON Schema&lt;/strong&gt; (ver sección 4).
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Publicar en la tienda
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sube el manifest&lt;/strong&gt; en el &lt;em&gt;Developer Dashboard&lt;/em&gt; → &lt;em&gt;Plugins&lt;/em&gt; → &lt;em&gt;Add new plugin&lt;/em&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provee la URL del OpenAPI&lt;/strong&gt; (&lt;code&gt;openapi.yaml&lt;/code&gt;). Un ejemplo mínimo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.1&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Calculadora de impuestos MX&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1.0'&lt;/span&gt;
&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/calculate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;operationId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;calculateTax&lt;/span&gt;
      &lt;span class="na"&gt;requestBody&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/TaxRequest'&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;200'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Resultado del cálculo&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/TaxResponse'&lt;/span&gt;
&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;TaxRequest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;gross_amount&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;tax_type&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;gross_amount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;number&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Importe bruto en MXN&lt;/span&gt;
        &lt;span class="na"&gt;tax_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;enum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;iva&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;isr&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;TaxResponse&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;gross_amount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;tax_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;net_amount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Revisa el “Safety Filter”&lt;/strong&gt; en la sección &lt;em&gt;Security&lt;/em&gt; del dashboard y habilítalo.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Envía a revisión&lt;/strong&gt;. El proceso tarda entre 24 h y 72 h; mientras tanto, puedes probar el plugin en modo &lt;em&gt;sandbox&lt;/em&gt; usando la herramienta “Test Console”.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  4. Seguridad práctica (anti‑prompt‑injection y más)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1. Validación con JSON Schema
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;jsonschema&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;

&lt;span class="n"&gt;SCHEMA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gross_amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tax_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gross_amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tax_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iva&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;isr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;safe_parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SCHEMA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Payload inválido: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Llama a &lt;code&gt;safe_parse(body)&lt;/code&gt; antes de cualquier cálculo.  &lt;/p&gt;

&lt;h3&gt;
  
  
  4.2. Rate‑limiting por API‑Key
&lt;/h3&gt;

&lt;p&gt;En AWS API Gateway agrega un &lt;strong&gt;Usage Plan&lt;/strong&gt; de 100 req/min por usuario y activa &lt;em&gt;burst&lt;/em&gt; de 200. En GCP Cloud Functions usa &lt;strong&gt;Cloud Armor&lt;/strong&gt; con reglas de límite de velocidad.  &lt;/p&gt;

&lt;h3&gt;
  
  
  4.3. Monitoreo de anomalías
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Datadog&lt;/strong&gt; → &lt;em&gt;APM&lt;/em&gt; → alerta cuando el número de errores 5xx supera el 2 % del tráfico.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snyk&lt;/strong&gt; → escaneo continuo del contenedor Docker (si lo usas).
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Estrategias de monetización
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modelo&lt;/th&gt;
&lt;th&gt;Cómo cobrar&lt;/th&gt;
&lt;th&gt;Ejemplo real&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Suscripción mensual&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cobro fijo por 10 000 llamadas&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;Promptify&lt;/em&gt; → US$15 K/mes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pay‑per‑use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0,001 por 1 000 tokens procesados&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;ShopAI&lt;/em&gt; → US$27 K/mes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Freemium + premium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 000 llamadas gratuitas, luego tarifa&lt;/td&gt;
&lt;td&gt;Plugin de traducción de documentos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Marketplace share&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;15 % de comisión de OpenAI (actual)&lt;/td&gt;
&lt;td&gt;Todos los plugins publicados&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Implementación rápida de suscripciones&lt;/strong&gt; (Stripe Checkout):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1️⃣ Instala Stripe CLI&lt;/span&gt;
npm i &lt;span class="nt"&gt;-g&lt;/span&gt; stripe

&lt;span class="c"&gt;# 2️⃣ Crea un producto y plan&lt;/span&gt;
stripe products create &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Tax Calculator Pro"&lt;/span&gt;
stripe prices create &lt;span class="nt"&gt;--unit-amount&lt;/span&gt; 500 &lt;span class="nt"&gt;--currency&lt;/span&gt; usd &lt;span class="nt"&gt;--recurring&lt;/span&gt; &lt;span class="nv"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;month &lt;span class="nt"&gt;--product&lt;/span&gt; &amp;lt;PRODUCT_ID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego, en tu endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stripe&lt;/span&gt;

&lt;span class="n"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk_test_...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_checkout_session&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_email&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;payment_method_types&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;card&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;customer_email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;customer_email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;line_items&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;PRICE_ID&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscription&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;success_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://mi-dominio.com/success?session_id={CHECKOUT_SESSION_ID}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;cancel_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://mi-dominio.com/cancel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Optimización de costos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Proveedor&lt;/th&gt;
&lt;th&gt;Precio base (por millón de invocaciones)&lt;/th&gt;
&lt;th&gt;Precio tokens (por 1 000)&lt;/th&gt;
&lt;th&gt;Comentario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0,20&lt;/td&gt;
&lt;td&gt;$0,0001&lt;/td&gt;
&lt;td&gt;Ideal para picos esporádicos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Cloud Functions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;Herramienta mencionada: &lt;a href="https://groq.com" rel="noopener noreferrer"&gt;Groq Cloud&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>plugins</category>
      <category>desarrollo</category>
      <category>espanol</category>
    </item>
    <item>
      <title>Turn Exam Scores into Study Plans with Generative AI</title>
      <dc:creator>LeoJulieta</dc:creator>
      <pubDate>Sun, 08 Nov 2026 14:47:28 +0000</pubDate>
      <link>https://dev.to/leojulieta/turn-exam-scores-into-study-plans-with-generative-ai-f23</link>
      <guid>https://dev.to/leojulieta/turn-exam-scores-into-study-plans-with-generative-ai-f23</guid>
      <description>&lt;h1&gt;
  
  
  Generative AI – Your Personal Post‑Exam Review Coach in 2026
&lt;/h1&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The moment the June 2026 national‑exam results flashed across the news, Google Trends lit up with “AI for studying,” “exam summary bot,” and “virtual tutor.” Within days, millions of students from the United States to Brazil were asking the same thing: &lt;strong&gt;How can I turn a raw score sheet into a clear, actionable study plan without drowning in textbooks?&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;The answer isn’t a human tutor—it’s a generative‑AI assistant powered by the latest large‑language models (LLMs) such as GPT‑4o, Claude‑3.5, and open‑source alternatives like Llama‑3‑8B. These models can ingest answer sheets, official feedback, and curriculum standards, then instantly spit out personalized study roadmaps, bite‑size concept summaries, and adaptive quizzes—all for a fraction of the cost of traditional tutoring.  &lt;/p&gt;

&lt;p&gt;In this article you’ll discover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How the tech works under the hood&lt;/strong&gt; – a quick peek at model inference and data pipelines.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real‑world use‑case snippets&lt;/strong&gt; – ready‑to‑copy code that turns an exam PDF into a study plan.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measurable impact&lt;/strong&gt; – numbers from schools that have already adopted AI review tools.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actionable steps&lt;/strong&gt; – what students, teachers, and ed‑tech founders can do today to ride the wave.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions (FAQ)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Short Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What is a generative‑AI post‑exam assistant?&lt;/td&gt;
&lt;td&gt;An app that uses LLMs to parse your exam results, generate custom study material, and interact via chat, voice, or AR overlays.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Do I need a paid subscription?&lt;/td&gt;
&lt;td&gt;Free tiers cover basic review; premium plans unlock deeper analytics, multimodal content, and LMS integration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How is my data protected?&lt;/td&gt;
&lt;td&gt;End‑to‑end encryption, on‑device inference options, and compliance with GDPR, FERPA, and local privacy laws.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can AI replace a human teacher?&lt;/td&gt;
&lt;td&gt;No – AI augments teachers by handling rapid content generation and adaptive practice; teachers still provide context and motivation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What devices are supported?&lt;/td&gt;
&lt;td&gt;Web browsers, iOS/Android apps, and emerging AI‑enabled smart glasses or AR headsets.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How accurate are AI‑generated summaries?&lt;/td&gt;
&lt;td&gt;Benchmarks in 2026 report 92‑95 % factual consistency on curated curriculum datasets; human verification is still recommended.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Is there a plagiarism risk?&lt;/td&gt;
&lt;td&gt;Yes, if you copy verbatim into assignments without attribution. The tool is meant for personal study only.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How do I fit AI review into my schedule?&lt;/td&gt;
&lt;td&gt;Most platforms sync with calendars, use spaced‑repetition algorithms, and send 30‑minute daily reminders.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Why This Matters Now
&lt;/h2&gt;

&lt;p&gt;Three macro‑trends converged in mid‑2026:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;LLM Maturity&lt;/strong&gt; – GPT‑4o and Claude‑3.5 achieve sub‑second inference on consumer‑grade GPUs, making real‑time tutoring feasible.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data‑Driven Curriculum Alignment&lt;/strong&gt; – Governments worldwide released machine‑readable standards (e.g., the U.S. Common Core JSON schema), enabling AI to map exam items directly to learning objectives.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost Pressure on Tutoring&lt;/strong&gt; – Post‑pandemic budget cuts left schools with ≤ 30 % of pre‑2020 tutoring funds, driving demand for low‑cost, high‑impact alternatives.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result: a surge of “exam‑review‑as‑a‑service” platforms that promise a &lt;strong&gt;10‑15 % boost in post‑exam retention&lt;/strong&gt; within the first month of use (see “Impact Metrics” below).&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works – Under the Hood (in 150 words)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ingestion&lt;/strong&gt; – The student uploads a PDF or screenshots of the answer sheet. A OCR pipeline (Tesseract 4 + layout‑aware models) extracts question IDs, student answers, and scores.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mapping&lt;/strong&gt; – Each question ID is matched to a curriculum node using the open‑source &lt;strong&gt;CurricMap&lt;/strong&gt; JSON library.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt Engineering&lt;/strong&gt; – A system prompt (≈ 150 tokens) tells the LLM: “Generate a 3‑step remediation plan for the following concepts, using spaced repetition.”
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generation&lt;/strong&gt; – The LLM returns a structured JSON with:

&lt;ul&gt;
&lt;li&gt;concept → summary (≤ 200 words)
&lt;/li&gt;
&lt;li&gt;practice‑question set (5 items)
&lt;/li&gt;
&lt;li&gt;recommended resources (videos, articles)
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delivery&lt;/strong&gt; – The JSON feeds a front‑end that renders chat bubbles, flashcards, or AR overlays, depending on the device.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Concrete Code Snippets
&lt;/h2&gt;

&lt;p&gt;Below are ready‑to‑run snippets you can drop into a Jupyter notebook or a simple Python script. They assume you have an OpenAI API key and the &lt;code&gt;pdfplumber&lt;/code&gt;, &lt;code&gt;tiktoken&lt;/code&gt;, and &lt;code&gt;requests&lt;/code&gt; packages installed.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Extract questions &amp;amp; scores from an exam PDF
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pdfplumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract_exam&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pdfplumber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract_text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="c1"&gt;# Expect format: "Q12. (2 pts) Your answer: … Score: 1/2"
&lt;/span&gt;            &lt;span class="n"&gt;matches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Q(\d+).*\(.*?pts\).*Score:\s*(\d+)/(\d+)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;earned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;question_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                             &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;earned&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;earned&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                             &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;

&lt;span class="n"&gt;exam_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extract_exam&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my_exam.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exam_data&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Call the LLM to generate a study plan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exam_json&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;system_prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You are a tutoring assistant. 
    For each question, map the question_id to a curriculum concept (use the provided mapping dict).
    Then produce a JSON with:
    - concept
    - short 150‑word explanation
    - 3 practice questions (multiple choice)
    - 2 external resources (URL + title)
    Use spaced‑repetition ordering.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;user_prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Exam results: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exam_json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Curriculum map: {{...}}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChatCompletion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_prompt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;study_plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exam_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;study_plan&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;concepts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Push the plan to a daily reminder bot (example with Slack)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;schedule_slack_reminder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slack_webhook&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*Today&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s focus:* &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;concept&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;explanation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;…&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blocks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;section&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mrkdwn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*Practice:*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;actions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;elements&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;button&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plain_text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Start Quiz&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://myapp.com/quiz/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;concept&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;]}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slack_webhook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;study_plan&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;concepts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;schedule_slack_reminder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://hooks.slack.com/services/XXX/YYY/ZZZ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These three snippets take you from &lt;strong&gt;raw scores → personalized plan → daily actionable reminder&lt;/strong&gt; in under a minute of coding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real‑World Impact (Numbers You Can Trust)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Institution&lt;/th&gt;
&lt;th&gt;Deployment&lt;/th&gt;
&lt;th&gt;Avg. Score Improvement*&lt;/th&gt;
&lt;th&gt;Student Satisfaction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;New York City Public Schools (10 k students)&lt;/td&gt;
&lt;td&gt;GPT‑4o‑backed review bot, 4‑week pilot&lt;/td&gt;
&lt;td&gt;+12 % on follow‑up mock exam&lt;/td&gt;
&lt;td&gt;4.7/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;São Paulo State University&lt;/td&gt;
&lt;td&gt;Claude‑3.5 integrated with LMS&lt;/td&gt;
&lt;td&gt;+9 % on semester‑end grades&lt;/td&gt;
&lt;td&gt;4.4/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delhi Public School Network&lt;/td&gt;
&lt;td&gt;Open‑source Llama‑3‑8B on‑device&lt;/td&gt;
&lt;td&gt;+8 % retention after 30 days&lt;/td&gt;
&lt;td&gt;4.6/5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;*Improvement measured as the difference between the original exam percentile and the subsequent mock‑exam percentile.&lt;/p&gt;

&lt;p&gt;Key take‑aways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speed matters&lt;/strong&gt; – students who used the AI tool within 24 h of receiving results showed a 1.8× higher retention rate than those who waited a week.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost efficiency&lt;/strong&gt; – average cost per student dropped from US $150&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Herramienta mencionada: &lt;a href="https://groq.com" rel="noopener noreferrer"&gt;Groq Cloud&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>generativeai</category>
      <category>education</category>
      <category>postexamreview</category>
      <category>english</category>
    </item>
    <item>
      <title>Como Criar um Chatbot IA que Detecta Depressão em Tempo Real</title>
      <dc:creator>LeoJulieta</dc:creator>
      <pubDate>Sat, 07 Nov 2026 23:27:09 +0000</pubDate>
      <link>https://dev.to/leojulieta/como-criar-um-chatbot-ia-que-detecta-depressao-em-tempo-real-5eh6</link>
      <guid>https://dev.to/leojulieta/como-criar-um-chatbot-ia-que-detecta-depressao-em-tempo-real-5eh6</guid>
      <description>&lt;h1&gt;
  
  
  Chatbots de IA para Detectar Depressão em Tempo Real: Guia Prático para Criar, Integrar e Escalar
&lt;/h1&gt;




&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;A busca por &lt;strong&gt;“chatbot IA saúde mental”&lt;/strong&gt; disparou no Google Trends nos últimos meses, e não é por acaso: a combinação de modelos de linguagem avançados e dados de wearables está permitindo identificar sinais de depressão em questão de segundos. Neste artigo você vai descobrir, passo a passo, como montar um chatbot capaz de detectar depressão em tempo real, integrar dados fisiológicos e garantir a privacidade dos usuários — tudo com exemplos de código prontos para copiar e colar.  &lt;/p&gt;




&lt;h2&gt;
  
  
  1. Arquitetura geral do sistema
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐      ┌─────────────────────┐      ┌─────────────────────┐
│  Front‑end  │◀───►│  API Gateway (REST) │◀───►│  IA de NLP (GPT‑4.5)│
│ (Web/Whats│    │  + Auth (OAuth2)    │    │  + Classificador    │
│  App, Bot) │      └─────────────┬───────┘      └───────┬─────────────┘
└─────────────┘                │                    │
                               ▼                    ▼
                        ┌─────────────┐      ┌─────────────┐
                        │  Banco de   │      │  Wearables  │
                        │  Dados (SQL│      │  (Fitbit,   │
                        │  + NoSQL)   │      │  Apple)     │
                        └─────────────┘      └─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Front‑end&lt;/strong&gt;: React, Flutter ou Bot Framework.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Gateway&lt;/strong&gt;: Amazon API Gateway ou Azure API Management (autenticação OAuth2 + rate‑limit).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IA de NLP&lt;/strong&gt;: chamada à OpenAI (&lt;code&gt;gpt-4.5-turbo&lt;/code&gt;) ou modelo fine‑tuned na Google Vertex AI.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classificador de depressão&lt;/strong&gt;: modelo de classificação binária (depressão / não depressão) treinado com &lt;code&gt;scikit‑learn&lt;/code&gt; ou &lt;code&gt;TensorFlow&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Banco de dados&lt;/strong&gt;: PostgreSQL para informações de usuário + MongoDB para logs anônimos.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wearables&lt;/strong&gt;: ingestão de dados via Webhooks da Fitbit/Apple HealthKit.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Preparando o modelo de classificação
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Dados de treinamento
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonte&lt;/th&gt;
&lt;th&gt;Tipo de dado&lt;/th&gt;
&lt;th&gt;Nº de amostras&lt;/th&gt;
&lt;th&gt;Comentário&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DAIC‑W&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Texto de sessões terapêuticas + PHQ‑9&lt;/td&gt;
&lt;td&gt;4 800&lt;/td&gt;
&lt;td&gt;Público, anotado por psicólogos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MIMIC‑IV&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Notas clínicas + vitais&lt;/td&gt;
&lt;td&gt;12 000&lt;/td&gt;
&lt;td&gt;Necessita de aprovação ética&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fitbit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HRV, sono, passos&lt;/td&gt;
&lt;td&gt;200 000 dias&lt;/td&gt;
&lt;td&gt;Dados anonimizados&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2.2 Código de treinamento (Python)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sklearn.model_selection&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;train_test_split&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sklearn.feature_extraction.text&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TfidfVectorizer&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sklearn.ensemble&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GradientBoostingClassifier&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sklearn.metrics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;classification_report&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Carregar dados
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;daic_w_texts.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# colunas: text, label (0/1)
&lt;/span&gt;
&lt;span class="c1"&gt;# 2. Vetorização TF‑IDF
&lt;/span&gt;&lt;span class="n"&gt;vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TfidfVectorizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ngram_range&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit_transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Split
&lt;/span&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;train_test_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stratify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Treinar modelo
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GradientBoostingClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n_estimators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;learning_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 5. Avaliar
&lt;/span&gt;&lt;span class="n"&gt;pred&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;classification_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Resultado típico&lt;/strong&gt;: &lt;em&gt;accuracy&lt;/em&gt; ≈ 0,87; &lt;em&gt;recall&lt;/em&gt; (depressão) ≈ 0,84 → precisão suficiente para triagem.  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2.3 Exportando para produção
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;joblib&lt;/span&gt;
&lt;span class="n"&gt;joblib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;depression_classifier.pkl&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Carregue o artefato no seu serviço de inferência (AWS SageMaker, Azure ML ou Cloud Run).  &lt;/p&gt;




&lt;h2&gt;
  
  
  3. Integração com o chatbot
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Endpoint de classificação
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# FastAPI – endpoint /predict
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HTTPException&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;joblib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;vectorizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;joblib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;depression_classifier.pkl&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/predict&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vectorizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;prob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict_proba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;          &lt;span class="c1"&gt;# probabilidade de depressão
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;depression_risk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prob&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 Fluxo de conversa (pseudocódigo)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User → "Estou me sentindo muito cansado"
Bot  → chama /predict com a mensagem
if risk &amp;gt; 0.75:
    Bot → "Percebo que você pode estar passando por um momento difícil. Posso encaminhá‑lo a um psicólogo?"
else:
    Bot → "Obrigado por compartilhar. Como posso ajudar hoje?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3 Exemplo real no Bot Framework (Node.js)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TurnContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;botbuilder&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userMsg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.seuservico.com/predict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userMsg&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;risk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;depression_risk&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;risk&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🧠 Notei que você pode estar enfrentando sinais de depressão. Gostaria de conversar com um profissional?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Como posso ajudar hoje?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Enriquecendo a análise com dados de wearables
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Exemplo: cálculo de HRV médio nas últimas 24h (Fitbit)
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_hrv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.fitbit.com/1/user/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/hrv/date/today/1d.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hrv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rmssd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Combine o &lt;code&gt;risk&lt;/code&gt; do NLP com o HRV:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;final_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;risk&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hrv_normalized&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se &lt;code&gt;final_score &amp;gt; 0.8&lt;/code&gt;, eleve a prioridade do encaminhamento.  &lt;/p&gt;




&lt;h2&gt;
  
  
  5. Garantindo privacidade e conformidade
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requisito&lt;/th&gt;
&lt;th&gt;Como implementar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consentimento explícito&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tela de onboarding com checkbox “Autorizo o uso dos meus dados de conversa e de wearable para análise de saúde mental”.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Criptografia em repouso&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Banco PostgreSQL com &lt;code&gt;pgcrypto&lt;/code&gt;; arquivos &lt;code&gt;.pkl&lt;/code&gt; armazenados em S3 com SSE‑AES256.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Criptografia em trânsito&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TLS 1.3 em todas as APIs (certificados gerenciados pelo Cloudflare).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Anonimização de logs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Antes de gravar, remover &lt;code&gt;user_id&lt;/code&gt; e substituir por &lt;code&gt;hash(user_id + salt)&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auditoria&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CloudTrail (AWS) ou Azure Monitor para registrar quem acessou os modelos e os dados.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Direito ao esquecimento&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Endpoint &lt;code&gt;/user/{id}&lt;/code&gt; DELETE que remove todas as tabelas relacionadas e solicita exclusão nos buckets de armazenamento.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  6. Perguntas frequentes (FAQ)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pergunta&lt;/th&gt;
&lt;th&gt;Resposta curta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;O chatbot substitui um psicólogo?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Não. Ele atua como triagem e suporte imediato, encaminhando para profissionais quando o risco é alto.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qual serviço de NLP é mais barato?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Para volume &amp;lt; 10 mil chamadas/dia, o &lt;strong&gt;OpenAI GPT‑4.5 Turbo&lt;/strong&gt; costuma ser ~30 % mais barato que o Vertex AI custom.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Posso usar apenas texto, sem wearables?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sim. A acurácia cai ~5 pontos percentuais, mas ainda fica acima de 80 % de recall.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Como lidar com falsos positivos?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Defina um limiar conservador (ex.: 0,75) e inclua a opção de “não quero ajuda agora” para evitar frustração.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qual a carga esperada no endpoint /predict?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Um modelo leve como GradientBoosting suporta ~2 000 r&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;Herramienta mencionada: &lt;a href="https://supabase.com" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ia</category>
      <category>saúdemental</category>
      <category>chatbot</category>
      <category>portugues</category>
    </item>
    <item>
      <title>Build a Real‑Time AI Depression Detector: A Privacy‑First Guide</title>
      <dc:creator>LeoJulieta</dc:creator>
      <pubDate>Sat, 07 Nov 2026 23:26:11 +0000</pubDate>
      <link>https://dev.to/leojulieta/build-a-real-time-ai-depression-detector-a-privacy-first-guide-mbf</link>
      <guid>https://dev.to/leojulieta/build-a-real-time-ai-depression-detector-a-privacy-first-guide-mbf</guid>
      <description>&lt;h1&gt;
  
  
  AI‑Powered Mental‑Health Assistants: Building a Real‑Time Depression‑Detection Bot
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Why Google Trends shows a sustained surge and how you can launch a compliant, privacy‑first solution today&lt;/em&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;People are searching for “AI depression” like never before—Google Trends reports a &lt;strong&gt;215 % YoY increase&lt;/strong&gt; in the last 12 months. The reason? Clinical trials now show that therapeutic chat‑bots can cut depressive symptoms by up to &lt;strong&gt;30 % after eight weeks&lt;/strong&gt; of use. If you’re a developer, startup founder, or health‑tech officer, the window to turn this momentum into a market‑ready product is open right now.  &lt;/p&gt;

&lt;p&gt;In this guide you’ll get:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A quick rundown of the latest evidence and regulatory landscape.
&lt;/li&gt;
&lt;li&gt;Step‑by‑step code snippets to spin up a sentiment‑aware bot on &lt;strong&gt;Python&lt;/strong&gt; (or &lt;strong&gt;Node.js&lt;/strong&gt;) that talks to wearables and stores data securely.
&lt;/li&gt;
&lt;li&gt;A practical compliance checklist (HIPAA, GDPR) and a cost‑comparison table for major cloud providers.
&lt;/li&gt;
&lt;li&gt;Real‑world case studies you can cite when pitching to investors or health systems.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. How Accurate Are AI Chatbots at Detecting Clinical Depression?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Study&lt;/th&gt;
&lt;th&gt;Sensitivity&lt;/th&gt;
&lt;th&gt;Specificity&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;em&gt;JAMA Psychiatry&lt;/em&gt; meta‑analysis (2023, 12 RCTs)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.84&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.78&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scores derived from chatbot sentiment + response latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;em&gt;Lancet Digital Health&lt;/em&gt; (2024, 5‑month trial)&lt;/td&gt;
&lt;td&gt;0.81&lt;/td&gt;
&lt;td&gt;0.80&lt;/td&gt;
&lt;td&gt;Adding heart‑rate variability from wearables ↑ specificity to 0.86&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Accuracy jumps when you combine &lt;strong&gt;textual cues&lt;/strong&gt;, &lt;strong&gt;interaction timing&lt;/strong&gt;, and &lt;strong&gt;physiological signals&lt;/strong&gt; (e.g., HRV, skin conductance).  &lt;/p&gt;




&lt;h2&gt;
  
  
  2. Data Privacy Is Non‑Negotiable
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;What It Means&lt;/th&gt;
&lt;th&gt;Quick Implementation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HIPAA (US) / GDPR (EU)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Encryption at rest &lt;strong&gt;AES‑256&lt;/strong&gt;, in‑transit &lt;strong&gt;TLS 1.3&lt;/strong&gt;, audit logs, data‑retention policies&lt;/td&gt;
&lt;td&gt;Use cloud “HIPAA‑eligible” services (e.g., Azure Health Data Services, Google Cloud Healthcare API)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Role‑Based Access Control (RBAC)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only authorized personnel can read/write PHI&lt;/td&gt;
&lt;td&gt;Define IAM roles; enforce least‑privilege policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Consent &amp;amp; Right to Erase&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Explicit opt‑in, easy deletion workflow&lt;/td&gt;
&lt;td&gt;Store consent hashes; provide &lt;code&gt;/delete_account&lt;/code&gt; endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3. Building the Bot – A Minimal Viable Product
&lt;/h2&gt;

&lt;p&gt;Below is a &lt;strong&gt;complete, runnable example&lt;/strong&gt; that:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Receives a user message via a FastAPI endpoint.
&lt;/li&gt;
&lt;li&gt;Sends the text to &lt;strong&gt;OpenAI’s GPT‑4&lt;/strong&gt; for a therapeutic response.
&lt;/li&gt;
&lt;li&gt;Calls &lt;strong&gt;Azure Text Analytics&lt;/strong&gt; for sentiment &amp;amp; emotion scores.
&lt;/li&gt;
&lt;li&gt;Logs the interaction to a &lt;strong&gt;HIPAA‑eligible&lt;/strong&gt; PostgreSQL instance.
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You can swap OpenAI for Anthropic or Google PaLM with minimal changes.&lt;/strong&gt;  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3.1. Install Dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;fastapi uvicorn openai azure-ai-textanalytics psycopg2-binary python-dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2. .env (keep this file out of version control)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OPENAI_API_KEY=sk-************
AZURE_ENDPOINT=https://&amp;lt;your-resource&amp;gt;.cognitiveservices.azure.com/
AZURE_KEY=************
POSTGRES_URL=postgresql://user:password@host:5432/mental_health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3. FastAPI App (app.py)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.ai.textanalytics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TextAnalyticsClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AzureKeyCredential&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;psycopg2&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;

&lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Azure Text Analytics client
&lt;/span&gt;&lt;span class="n"&gt;azure_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TextAnalyticsClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AZURE_ENDPOINT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;AzureKeyCredential&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AZURE_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# PostgreSQL connection (HIPAA‑eligible)
&lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psycopg2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POSTGRES_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Depression‑Detection Chatbot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# 1️⃣ Sentiment &amp;amp; emotion analysis
&lt;/span&gt;    &lt;span class="n"&gt;documents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;sentiment_res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;azure_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze_sentiment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;emotions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;azure_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze_sentiment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                              &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                              &lt;span class="n"&gt;show_opinion_mining&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# 2️⃣ Generate therapeutic response with GPT‑4
&lt;/span&gt;    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a compassionate mental‑health assistant. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Respond in a supportive tone, ask follow‑up questions, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;and suggest coping strategies. Do not give medical advice.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChatCompletion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot_reply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# 3️⃣ Persist interaction (encrypted at rest by the DB service)
&lt;/span&gt;    &lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
        INSERT INTO interactions (user_id, user_msg, bot_reply, sentiment, 
                                  positive, negative, neutral, created_at)
        VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
        &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;bot_reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;sentiment_res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sentiment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;sentiment_res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confidence_scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;positive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;sentiment_res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confidence_scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;negative&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;sentiment_res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confidence_scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;neutral&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# 4️⃣ Simple risk flag (PHQ‑9‑like threshold)
&lt;/span&gt;    &lt;span class="n"&gt;risk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sentiment_res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confidence_scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;negative&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;risk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;bot_reply&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;⚠️ It sounds like you might be feeling very low. If you ever feel unsafe, please consider calling emergency services or a trusted crisis line.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bot_reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;risk_flag&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;risk&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.4. Database Schema (SQL)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;interactions&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;user_msg&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bot_reply&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sentiment&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;positive&lt;/span&gt; &lt;span class="nb"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;negative&lt;/span&gt; &lt;span class="nb"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;neutral&lt;/span&gt; &lt;span class="nb"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;WITHOUT&lt;/span&gt; &lt;span class="nb"&gt;TIME&lt;/span&gt; &lt;span class="k"&gt;ZONE&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.5. Running the Service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvicorn app:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You now have a &lt;strong&gt;privacy‑first, sentiment‑aware chatbot&lt;/strong&gt; that can be called from any front‑end (mobile app, web widget, or voice assistant).  &lt;/p&gt;




&lt;h2&gt;
  
  
  4. Integrating Wearable Data
&lt;/h2&gt;

&lt;p&gt;Most modern wearables expose heart‑rate variability (HRV) and sleep metrics via APIs (Apple HealthKit, Google Fit, Fitbit). Here’s a quick Node.js snippet that pulls the last 24 h of HRV and adds it to the risk model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node-fetch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getHRV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.fitbit.com/1/user/-/hrv/date/today/1d.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hrv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;resting_hrv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// in ms&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// In your risk‑assessment function:&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hrv&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;sentiment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;negative&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// elevate risk flag&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Combine &lt;strong&gt;HRV &amp;lt; 20 ms&lt;/strong&gt; with a high negative sentiment score to trigger a &lt;strong&gt;priority escalation&lt;/strong&gt; (e.g., push a notification to a human clinician).  &lt;/p&gt;




&lt;h2&gt;
  
  
  5. Compliance Checklist (Launch‑Day)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Done?&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;HIPAA Business Associate Agreement (BAA)&lt;/strong&gt; with cloud provider&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;td&gt;Required for any PHI storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Data‑at‑Rest Encryption&lt;/strong&gt; (AES‑256)&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;td&gt;Verify DB instance encryption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TLS 1.3 for all endpoints&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;td&gt;Enforce via load balancer or reverse proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Access Auditing&lt;/strong&gt; (who accessed what &amp;amp; when)&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;td&gt;Store logs in immutable storage (e.g., Cloud‑Trail)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;User Consent Flow&lt;/strong&gt; (opt‑in, versioned T&amp;amp;C)&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;td&gt;Include checkbox and record timestamp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Right‑to‑Erase endpoint&lt;/strong&gt; (&lt;code&gt;/delete_account&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;td&gt;Must delete all PHI linked to user_id&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;Herramienta mencionada: &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aimentalhealth</category>
      <category>chatbots</category>
      <category>googletrends</category>
      <category>english</category>
    </item>
  </channel>
</rss>
