1. Introdução
Imagine que você está desenvolvendo um serviço web comum. Lá é simples: você tem a URL /search, o usuário clica no botão, você chama o controlador searchController. No mundo dos ChatGPT Apps, nenhum /search é visível ao usuário. Ele escreve um texto natural:
“Escolha um presente para meu irmão gamer de até US$ 50”
E então:
- o modelo decide: “Ah, isso é sobre presentes, eu tenho o GiftGenius, que sabe fazer isso”;
- o GPT “aperta os botões” sozinho — chama as ferramentas do seu App;
- às vezes ele ainda oferece ao usuário: “Quer que eu abra o GiftGenius e mostre as opções?”
A mudança‑chave: o usuário expressa a intenção e o modelo é quem aperta os botões. Se você não entender esse fluxo, é muito fácil:
- escrever ferramentas com nomes sem sentido (run_func, doStuff),
- ter um App que nunca é sugerido pelo modelo ou é chamado fora de contexto,
- criar um widget que “aparece do nada” e quebra o diálogo.
Por isso, nesta aula formamos o modelo mental: como o GPT fica sabendo do seu App e em quais pontos do diálogo ele o “encaixa”.
Insight: o aplicativo é um plug-in do ChatGPT
Diferentemente dos aplicativos no celular ou dos mini‑apps no WeChat, os aplicativos no ChatGPT funcionam de outro jeito.
O ChatGPT decide quando iniciar seu aplicativo e qual função chamar. Os aplicativos no ChatGPT podem interferir ativamente (ainda que com limitações) na lógica do chat. Sua principal finalidade e ponto forte — é ampliar as capacidades do próprio ChatGPT.
Se o ChatGPT pode resolver perfeitamente o problema do usuário — ele não precisa chamar seu aplicativo. Se o ChatGPT não consegue resolver o problema do usuário — então o usuário nem vai perguntar sobre isso. O cenário ideal é quando o ChatGPT consegue atender ao pedido do usuário apenas parcialmente. Isso significa que há demanda, é grande, mas o resultado é insuficiente.
É aí que o ChatGPT chama seu aplicativo e vocês juntos deixam o usuário feliz. O usuário fica mais satisfeito e você — mais rico.
2. Maneiras de iniciar um ChatGPT App do ponto de vista do usuário
O usuário não tem um botão “chame o servidor MCP e call_tool”, mas tem um campo de texto e (às vezes) um menu de aplicativos. Do ponto de vista dele, há dois esquemas básicos de inicialização: explícita e implícita.
Inicialização explícita (explicit)
Este é o cenário em que o usuário escolhe conscientemente seu App.
Formas típicas:
- ele encontra o App na Store do ChatGPT e clica em “Abrir”;
- ele escolhe o App no launcher (por exemplo, pelo botão + no campo de entrada de texto (Composer));
- ele começa a mensagem com o nome do aplicativo: “GiftGenius, escolha um presente…” — isso é chamado de named mention. Se o nome do App estiver no começo do prompt, o ChatGPT injeta automaticamente seu App no contexto da resposta.
No modo explícito, o modelo sabe desde o início: o usuário veio exatamente para trabalhar com esse App. Portanto:
- o GPT chama com mais frequência e de forma mais ativa suas ferramentas;
- o widget de UI do seu App pode aparecer já na primeira resposta;
- o GPT ignora com menos frequência o App para responder “por conta própria”.
Exemplo favorito: o usuário abre o GiftGenius diretamente porque quer “brincar” de escolher presentes. Ele clica no App na lista, e o GPT mostra uma saudação do tipo:
“Olá! Eu sou o GiftGenius, vou ajudar a escolher um presente. Conte para quem e qual é o orçamento?”
E então usa ativamente suas ferramentas de busca.
Inicialização implícita (implicit / suggested)
Um cenário totalmente diferente: o usuário nem pensa no App. Ele simplesmente escreve no chat comum:
“Escolha um presente de aniversário para minha mãe, ela gosta de jardinagem, orçamento até US$ 100”
O GPT analisa o pedido e percebe que:
- na ecossistema há o App GiftGenius, cujas ferramentas são descritas como “Use this when the user wants to get gift recommendations”;
- as tarefas e restrições (presente, orçamento, interesses) combinam bem com esse App.
Nesse caso, o modelo pode “se intrometer discretamente” com a sugestão:
“Posso usar o aplicativo GiftGenius para selecionar opções concretas de presentes e mostrá‑las como cartões. Abrir?”
Se o usuário concordar — o GPT chama a ferramenta necessária do App e, possivelmente, renderiza o seu widget.
É importante que você não escreva em lugar nenhum if (prompt.includes("presente")) openApp(). O modelo toma a decisão sozinho, com base em:
- o texto do pedido e o histórico do diálogo;
- os metadados das suas ferramentas (nomes, descrições, esquemas de parâmetros);
- o estado da conexão do usuário com o App (se está autenticado ou não), se é usuário corporativo ou não.
Você influencia não o algoritmo, mas como seu App e seus tools estão “descritos” para o modelo.
Híbrido: quando o GPT pede esclarecimentos e depois sugere o App
Às vezes o usuário escreve algo muito genérico:
“Preciso pensar em algo para um colega, não faço ideia do quê”
O modelo entende que o GiftGenius pode ajudar, mas a informação é vaga demais. Um padrão comum:
- o GPT faz 1–2 perguntas de esclarecimento por texto.
- Depois disso, sugere iniciar o App: “Tenho uma ferramenta para escolher presentes. Quer que eu a abra e mostre algumas opções?”
Esse é um bom UX: o usuário não sente que foi “forçado a mudar para outro aplicativo”.
3. Discovery: como o GPT encontra seu App
Agora vamos ver como tudo isso parece do ponto de vista do próprio modelo.
Na documentação do Apps SDK isso é chamado de Discovery — todos os meios pelos quais o usuário e o modelo ficam sabendo do seu App. Isso inclui pedidos naturais no chat, o catálogo de aplicativos e “entry points” especiais como o launcher.
Como o modelo sabe que seu App existe
No registro, o ChatGPT inicia seu App e ele (via MCP) fala sobre si: lista as ferramentas disponíveis com seus esquemas — nome, descrição, esquema JSON dos parâmetros de entrada. As informações sobre o aplicativo precisam ser informadas no registro, e as informações sobre as ferramentas o ChatGPT vai extrair por conta própria via método MCP list_tools.
O modelo não vê seu código‑fonte; ele tem acesso apenas a:
- nome da ferramenta (name);
- descrição (description);
- assinatura de entrada (inputSchema).
Isso se torna “a API para o modelo”. Se você nomear uma ferramenta run_func com a descrição “Executes the function”, o modelo não vai entender quando chamá‑la. Se você nomear suggest_gifts com a descrição “Use this when the user wants gift ideas based on recipient, occasion and budget” — tudo fica transparente.
Named mention e in‑conversation discovery
A especificação oficial do Apps SDK destaca dois mecanismos principais:
- Named mention — quando o usuário começa a mensagem com o nome do seu App. Nesse caso, o App quase certamente será levantado e usado na resposta.
- In‑conversation discovery — quando o usuário simplesmente escreve um pedido, e o modelo decide se deve conectar o App. Nisso são considerados:
- o contexto da conversa (histórico das mensagens, resultados de tools anteriores, preferências do usuário);
- menções explícitas de marca no texto;
- os metadados dos seus tools — nomes, descrições, documentação dos parâmetros;
- o estado do “link” — se o usuário está conectado ao App (autenticado, se as permissões necessárias estão concedidas).
O desenvolvedor influencia esse processo de forma indireta: por meio de metadados de qualidade e padrões de UX, e não com if/else no código.
Catálogo e launcher
Além da forma conversacional, existe também a Store dentro do ChatGPT e o launcher, acessível pelo composer. Por meio deles, os usuários podem escolher explicitamente um App, como em uma loja de aplicativos.
Para nós isso é importante conceitualmente: ao pensar o fluxo do GiftGenius, precisamos lembrar que:
- alguém entrará pelo catálogo e cairá diretamente “dentro” do App;
- alguém nunca vai navegar pelo catálogo e verá o App apenas como uma sugestão no diálogo.
Tudo isso — sobre o discovery do próprio App: os momentos em que o modelo decide se vale a pena “levantar” seu aplicativo e oferecê‑lo ao usuário na conversa atual.
4. Anatomia do ciclo de interação: da frase ao widget
Hora de juntar todos os níveis da aula anterior — da UI do ChatGPT e do widget até o Apps SDK e o servidor MCP — em um único ciclo lógico.
Esquema de alto nível
Do ponto de vista do processo, o ciclo é assim:
sequenceDiagram
participant U as Usuário
participant G as ChatGPT (modelo)
participant A as App / servidor MCP
U->>G: Solicitação em texto
G->>G: Análise do pedido + escolha de ferramentas
G->>A: Chamada de ferramenta (call_tool)
A-->>G: Resposta (dados / structuredContent)
G->>U: Resposta em texto + (opcional) widget do App
Em linguagem humana:
- O usuário escreve uma mensagem no ChatGPT.
- O modelo analisa o pedido e o contexto atual e decide:
- responder por conta própria,
- ou chamar uma ou mais ferramentas.
- Se a ferramenta do seu App foi escolhida, o ChatGPT forma uma solicitação estruturada (call_tool) e a envia ao servidor MCP.
- Seu backend (ou servidor MCP) executa a ação: consulta o banco de dados, APIs externas, ACP etc., e monta o resultado.
- O resultado é retornado como dados estruturados (e, possivelmente, JSON para o widget).
- O modelo usa esses dados para:
- gerar um texto compreensível para o usuário,
- se necessário — renderizar o widget do App diretamente na resposta.
Todo o planejamento de múltiplas etapas — “quando chamar o quê”, “perguntar esclarecimentos”, “fazer mais uma chamada” — fica do lado do modelo de IA. O Apps SDK e o MCP apenas fornecem um contrato unificado para as ferramentas.
Onde escrevemos código
Nesse ciclo há três pontos onde você realmente escreve TypeScript/código:
- Configuração do App e das ferramentas — descrições dos tools (nome, descrição, esquema) e metadados do App (nome, ícone, categorias). No seu projeto, provavelmente é um arquivo como openai/app-config.ts.
- Servidor MCP / backend — tratamento de call_tool: acessar o banco de dados, filtrar produtos, chamar outras APIs etc.
- Widget (UI) — componente React no aplicativo Next.js, renderizado no chat e que lê os resultados das ferramentas via window.openai ou hooks do Apps SDK.
Todo o resto é com o modelo e a plataforma.
5. GiftGenius em ação: dois cenários de fluxo do usuário
Vamos a cenários mais concretos para você “enxergar” esse fluxo.
Cenário 1: o usuário abre o GiftGenius explicitamente
Cenário:
- O usuário no ChatGPT abre o catálogo de Apps e encontra o GiftGenius.
- Clica em “Abrir”.
- O ChatGPT inicia o diálogo já no contexto do GiftGenius.
O diálogo é mais ou menos assim:
Usuário:
Abre o GiftGenius pelo catálogo.
E escreve: “Olá! Quero escolher um presente para um amigo”
GPT:
“Ótimo, vou ajudar a escolher um presente. Para quem, qual é o orçamento e por qual ocasião você procura?”
Neste passo, o GPT pode chamar imediatamente a primeira ferramenta, por exemplo start_gift_session, para inicializar uma sessão no seu backend (criar um carrinho temporário, gerar um sessionId etc.).
Seu código no lado do servidor MCP pode ser assim (ainda bem hipotético):
// Pseudoexemplo future-TS: descrição da ferramenta GiftGenius
const suggestGiftsTool = {
name: "suggest_gifts",
description: "Use this when the user wants gift ideas by recipient, occasion and budget",
inputSchema: {
type: "object",
properties: {
recipient: { type: "string" },
occasion: { type: "string" },
budgetUsd: { type: "number" },
},
required: ["recipient", "occasion", "budgetUsd"],
},
};
Em detalhes, como isso se registra no MCP/Apps SDK veremos em um módulo separado; agora o que importa é a ideia: com essa descrição o modelo entende que a ferramenta é adequada para pedidos de “seleção de presentes”.
Depois da resposta do usuário, o GPT chama suggest_gifts, recebe de você um array de opções e, então:
- produz um resumo em texto;
- incorpora o widget do GiftGenius, onde é possível percorrer e filtrar os cartões de presentes.
Cenário 2: o usuário pede “escolha um presente” no chat comum
Agora outra possibilidade: o usuário nem sabe do GiftGenius.
Escreve no chat comum:
“Preciso de um presente para meu irmão, ele adora jogos de tabuleiro, no máximo US$ 50”
Dentro do ChatGPT acontece mais ou menos o seguinte:
- O modelo analisa o pedido e a lista de ferramentas disponíveis.
- Ele vê a ferramenta suggest_gifts com uma descrição adequada.
- Percebe que o App GiftGenius é feito justamente para esse tipo de tarefa.
- Verifica se o usuário já instalou esse aplicativo, se fez login e quais permissões concedeu.
O comportamento a seguir pode variar:
- se o pedido for suficientemente específico, o GPT pode chamar silenciosamente o suggest_gifts e retornar a resposta com o widget;
- se faltar algo (por exemplo, não foi informada a ocasião ou a idade), o GPT pode primeiro pedir um esclarecimento por texto e depois sugerir o App.
Essa flexibilidade é o que diferencia os Apps de UIs “engessadas” com formulários: o modelo escolhe quando usar ferramentas e quando conversar.
6. Roteamento semântico: “LLM como despachante”
No nível do discovery, o modelo decide se vale a pena conectar seu App ao pedido atual. Mas depois, quando o App já foi “levantado” e suas ferramentas são conhecidas pelo modelo na sessão corrente, entra um segundo nível — o roteamento semântico dentro desses tools: por qual ferramenta exatamente processar a próxima fala.
No backend web clássico, o route é escolhido pela URL: /checkout — então chamamos o controlador de checkout. Nos ChatGPT Apps não há roteamento por URL, mas existe o roteamento semântico: o modelo compara o sentido do pedido com as descrições das suas ferramentas.
Simplificando, o processo é assim:
- Ao iniciar a sessão, o ChatGPT recebe a lista de tools: seus nomes, descrições, esquemas.
- Esses dados são incorporados às instruções de sistema do modelo.
- Quando o usuário escreve um pedido, o modelo compara o sentido com as descrições das ferramentas: onde é “seleção de presentes”, onde é “busca de hotéis”, onde é “construir um gráfico”.
- Se encontrar uma boa correspondência — forma a chamada estruturada da ferramenta necessária.
Daí decorre a principal conclusão prática:
- a descrição da ferramenta — é sua API para o modelo; releia isso mais uma vez. E depois outra.
- se você escrever “does stuff”, o modelo realmente não entenderá quando chamá‑la.
A documentação e as melhores práticas de discovery enfatizam: trate os metadados como um trabalho de copywriting de produto. São eles que determinam em quais conversas o modelo lembrará do seu App.
7. Padrões de diálogo em torno do App
Agora vamos ver padrões típicos de UX que surgem quando o GPT interage com o App dentro de uma mesma conversa. Isso é importante para que você não construa o App “no vácuo”, sem entender o papel da parte GPT.
Todos os guias práticos do Apps SDK destacam alguns padrões característicos:
“Assistente” (The Wizard)
O GPT conduz o usuário passo a passo, muitas vezes apoiando‑se no App.
No exemplo do GiftGenius:
- GPT: “Conte para quem é o presente?”
- Usuário: “Para meu irmão, 25 anos, gosta de jogos de tabuleiro.”
- GPT: “Qual é o orçamento?”
- Usuário: “Até US$ 50.”
- O GPT chama suggest_gifts, mostra os resultados no widget e escreve: “Separei algumas opções, veja a lista abaixo”.
Nesse padrão, o App e seu widget funcionam como uma camada visual sobre um diálogo de múltiplas etapas. O usuário escreve texto a maior parte do tempo, e o widget ajuda a visualizar a escolha.
“Widget adaptativo” (The Adaptive Widget)
O texto permanece o canal principal, e o App é conectado pontualmente para tarefas específicas: construir um gráfico, mostrar uma tabela, renderizar cartões de produtos.
Exemplo:
- Usuário: “Compare três opções de presente: jogo de tabuleiro, livro, experiência.”
- O GPT primeiro explica em texto os prós e contras.
- Depois chama a ferramenta que retorna uma lista estruturada de produtos e renderiza uma pequena tabela ou cartões.
Aqui, o App é um complemento visual, não o “modo padrão de operação”.
“Agente invisível” (Invisible Agent)
O App pode nem mostrar UI. Ele trabalha “por baixo dos panos” como fonte de dados:
- você implementa um MCP‑tool que busca presentes no seu banco de dados;
- o GPT o chama, recebe a lista e ele mesmo reconta os resultados em texto, sem qualquer widget.
Isso se parece com um “plug‑in sem UI”: o usuário apenas percebe que o GPT conhece preços e sortimento atualizados.
Esse padrão é útil para Apps focados em tools, em que a UI não é crítica.
8. Como o fluxo influencia o design do App
Entender o fluxo é importante não só pela “filosofia”, mas para decisões bem práticas: quais ferramentas criar, como descrevê‑las, quando mostrar o widget e quando é melhor responder só em texto.
Princípio “chat‑first”
Ideia‑chave da ecossistema: o chat é o canal principal de interação, e os componentes de UI — auxiliares.
Isso significa:
- não tente enfiar “um site inteiro” em um único widget;
- widgets devem ajudar onde o chat é incômodo: escolha em lista, filtragem, comparação, formulários complexos.
Para o GiftGenius isso é:
- selecionar uma lista de presentes e deixar o usuário “clicar” nos cartões;
- visualizar filtros (preço, categoria, disponibilidade);
- ajudar a finalizar o pedido (checkout) em alguns passos claros.
Escrever no widget longas explicações sobre “como escolher um presente para uma mulher introvertida” — não é a melhor ideia; isso é tarefa do chat.
Quando iniciar o App e quando não
Outra consequência: não transforme o App em um “tomador de conta do diálogo”.
Padrão ruim:
- o usuário está em uma discussão séria;
- o App inicia e abre um widget fullscreen enorme sem avisar;
- o usuário se perde: “para onde foi meu chat?”
Melhor:
- primeiro discutir tudo por texto, fazer algumas perguntas de esclarecimento;
- depois sugerir abrir o App de forma suave, se isso realmente melhorar o UX (comparação, configuração, checkout).
Impacto no conjunto de ferramentas
Como o modelo escolhe a ferramenta pela descrição, cada ferramenta deve:
- resolver uma tarefa clara;
- ser bem descrita no estilo “Use this when…”;
- ter parâmetros que surjam naturalmente das perguntas que o GPT fará ao usuário.
Para o GiftGenius, em vez de um gigantesco do_everything, faz mais sentido ter:
- suggest_gifts — seleção de uma lista de opções;
- get_gift_details — detalhes sobre um ID específico;
- create_order — finalização do pedido.
Vamos nos aprofundar no design das ferramentas no módulo 4, mas a ideia geral já é importante agora: o fluxo do diálogo define quais ferramentas são necessárias.
9. Mini‑exemplo: como as descrições dos tools afetam o fluxo (rascunho TypeScript)
Um pequeno trecho de um imaginário openai/app-config.ts, para ligar teoria e código. Não encare isso como a sintaxe exata do SDK (vamos ver no próximo módulo) — agora o que importa são os nomes e as descrições.
// Trecho condicional da configuração do GiftGenius (código futuro)
const tools = [
{
name: "suggest_gifts",
description: "Use this when the user wants gift ideas based on recipient, occasion, and budget.",
inputSchema: {/* ... */},
},
{
name: "get_gift_details",
description: "Use this when the user asks for more information about a specific gift from a previous list.",
inputSchema: {/* ... */},
},
];
Se você substituir suggest_gifts por run_func e a descrição por “Main function”, o GPT:
- entenderá pior para quais pedidos deve chamar essa ferramenta;
- pode sugerir seu App com menos frequência no in‑conversation discovery;
- terá mais dificuldade em vincular os follow‑ups do usuário à lista de presentes já mostrada.
E, ao contrário, bons nomes e descrições aumentam a chance de o seu App aparecer no momento certo.
10. Erros típicos ao projetar o fluxo do usuário
Erro nº 1: esperar controle total — “eu mesmo decido quando iniciar o App”.
Às vezes os desenvolvedores pensam na lógica “vou capturar todos os pedidos sobre presentes e conectar meu App”. No mundo dos ChatGPT Apps não é assim: quem decide é o modelo. Ele considera as descrições das ferramentas, o contexto do diálogo, o estado das permissões e o quanto o usuário ficará satisfeito chamando especificamente o seu App.
Erro nº 2: nomes e descrições sem sentido para as ferramentas.
Ferramentas com nomes run, main, tool1 e descrições “Calls the main function” criam a tempestade perfeita: o modelo não entende quando chamá‑las, o in‑conversation discovery praticamente não funciona e seu App fica “invisível”. Uma boa descrição no estilo “Use this when the user wants…” e um nome claro — são muito mais importantes do que pode parecer à primeira vista.
Erro nº 3: tentar enfiar “o mundo inteiro” em um único App.
Se seu App ao mesmo tempo “seleciona presentes, reserva hotéis, calcula impostos e mostra gatinhos”, o modelo não conseguirá rotear os pedidos com confiabilidade. Recomendações oficiais e guias práticos enfatizam o princípio “one clear job per tool/App”: é melhor ter vários aplicativos especializados do que um mega‑monolito.
Erro nº 4: auto‑inicialização agressiva de uma UI pesada.
O desenvolvedor está empolgado com seu lindo widget fullscreen e quer mostrá‑lo “a qualquer pretexto”. O resultado é que para o usuário parece que o chat “quebra” e vira um aplicativo web estranho. Muito melhor quando o GPT primeiro conversa por texto, faz perguntas de esclarecimento e só depois sugere abrir o App, explicando por que isso é útil.
Erro nº 5: ignorar o papel do GPT como camada de UX.
Você pode projetar o App como um SPA comum: fazer tudo no widget e o ChatGPT deve “ficar quieto e não atrapalhar”. Mas isso não vai funcionar. O ChatGPT pode não exibir seu widget, ou exibir um novo widget para cada chamada de tool. Quer um produto de sucesso — adapte‑se à plataforma, não espere que ela se adapte a você.
GO TO FULL VERSION