KasyKasy

Chat com IA

OpenAI ou Gemini via Cloud Function. Chave nunca no app. Streaming, histórico e system prompt.

A chave da API nunca fica no app: valores em --dart-define ficam no binário e podem ser extraídos. O Flutter só conhece a URL da function; a chave fica no servidor.

App → POST {message, history} → Cloud/Edge Function → OpenAI / Gemini

Implementação

Pelo MCP: peça ao assistente "adiciona ai_chat no meu projeto". Ele roda add_feature por você. Veja MCP do Kasy.

  1. Rode:

    kasy add ai_chat
  2. Responda o que a CLI pedir: provedor (OpenAI ou Gemini), system prompt e chave.

  3. Confirme o resultado por backend:

    BackendDeploy
    FirebaseAutomático (functions:aiChat)
    SupabaseAutomático (ai-chat --no-verify-jwt)
    API RESTVocê implementa o endpoint que recebe {message, history}

    A CLI já preenche AI_CHAT_ENDPOINT no launch.json sozinha.

O consumo da API é cobrado de você, não do usuário. Cada conversa dentro do app gasta crédito da sua chave no provedor. Antes de liberar o chat para todo mundo, defina um limite de gasto no painel do provedor e acompanhe o uso.

Informações

O que vem na UI

  • Bolhas de chat estilo WhatsApp (usuário à direita, IA à esquerda)
  • Streaming via SSE: palavras aparecem uma a uma enquanto a IA gera, igual ao ChatGPT
  • Indicador "assistente está digitando" até o primeiro chunk chegar
  • Scroll automático e campo multiline com envio por teclado
  • Histórico persistido por backend (Firestore / Supabase / REST)

System prompt

É a instrução invisível que define a personalidade do agente. O usuário nunca vê. Fica no servidor.

Sem system prompt: ChatGPT genérico, responde qualquer coisa.
Com system prompt: agente com foco definido.

Exemplo:

"Você é o assistente do app Fitsync. Responda apenas sobre treinos e nutrição.
Se perguntarem outra coisa, diga educadamente que não pode ajudar."

Alterar depois da configuração:

# Firebase: edite functions/.env e faça re-deploy
firebase deploy --only functions:aiChat

# Supabase
supabase secrets set AI_SYSTEM_PROMPT="Nova instrução aqui" --project-ref SEU_REF
supabase functions deploy ai-chat --no-verify-jwt --project-ref SEU_REF

Limite de contexto

Por padrão o app envia apenas as últimas 20 mensagens (10 trocas) como contexto. O histórico completo continua salvo no banco (o usuário vê tudo), mas a IA recebe só o trecho recente. Isso reduz custo e melhora a qualidade.

Para ajustar, edite em lib/features/ai_chat/providers/ai_chat_notifier.dart:

const int _kMaxContextMessages = 20; // altere aqui

Nenhuma mudança no servidor é necessária.

Usar OpenAI Assistants ou Gemini Gems

Para uma base de conhecimento maior (documentação, FAQs extensos), crie um Assistente e aponte o app para ele. O Flutter não muda: só troque AI_CHAT_ENDPOINT no launch.json:

"--dart-define=AI_CHAT_ENDPOINT=https://seu-servidor.com/api/assistant"

Seu servidor recebe {message, history} e repassa para o Assistente. A interface do app fica idêntica.

Nunca coloque a chave da API no --dart-define ou no .env do app. Use sempre secret no servidor.

Atualizado em 03/11/2026