Duas formas de conectar o Gemini
Se o seu ambiente Gemini (por exemplo, o Gemini CLI com acesso a shell) puder rodar npm, instale o
@firstsales.io/clie exponha-o como uma ferramenta: ele cuida da autenticação, do JSON e da idempotência. Se o Gemini funcionar apenas via API, chame a Developer API da FirstSales por HTTPS a partir das implementações da sua função/ferramenta. A documentação classifica o Gemini junto com os agentes que priorizam a API por padrão.Guarde a chave fora do modelo
Crie uma chave da Developer API em Settings → API e mantenha-a na configuração server-side do seu app como
FIRSTSALES_API_KEY. O Gemini deve chamar uma tool/function que lê a chave no lado do servidor: o próprio modelo nunca deve ver ou emitir a chave bruta.FIRSTSALES_API_KEY=fs-key-... FIRSTSALES_BASE_URL=https://api.app.firstsales.ioDefina ferramentas restritas, não uma porta de escape HTTP genérica
Dê ao Gemini um pequeno conjunto de funções feitas sob medida (
whoami,list_contacts,create_contact,campaign_analytics) cada uma mapeada para um endpoint público. Isso mantém o modelo na superfície suportada, em vez de deixá-lo construir URLs arbitrárias.# o que cada tool chama por baixo dos panos GET /api/v1/whoami GET /api/v1/organizations/{org}/workspaces/{ws}/contacts POST /api/v1/organizations/{org}/workspaces/{ws}/contacts # Idempotency-Key GET /api/v1/organizations/{org}/workspaces/{ws}/campaigns/{id}/analyticsVerifique a identidade na primeira chamada de ferramenta
Faça o agente chamar
whoamiantes de qualquer escrita, para confirmar o contexto de org e workspace:curl https://api.app.firstsales.io/api/v1/whoami \ -H "Authorization: Bearer $FIRSTSALES_API_KEY"Escreva de forma idempotente a partir da sua tool de criação
Sua tool
create_contactdeve sempre anexar umIdempotency-Key, para que uma chamada de função repetida não gere uma escrita duplicada:curl -X POST \ https://api.app.firstsales.io/api/v1/organizations/ORG_ID/workspaces/WS_ID/contacts \ -H "Authorization: Bearer $FIRSTSALES_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: gemini-lead-2026-01" \ -d '{"email":"[email protected]","first_name":"Sam"}'Trate erros e permaneça na superfície pública
Em cada tool, trate
401(chave inválida/revogada),422(validação (exiba o campo) e429(recue e tente novamente). Emunsupported_operation, retorne a limitação ao modelo e pare) nunca deixe o Gemini raspar o app ou acessar rotas privadas, callbacks, pixels ou endpoints de cron.
Dicas de especialista
Empacote endpoints como ferramentas restritas
Não entregue ao Gemini uma função genérica de 'chamar qualquer URL'. Ferramentas feitas sob medida (create_contact, campaign_analytics) mantêm o modelo na superfície pública e tornam suas ações auditáveis.
O modelo nunca toca na chave
Leia FIRSTSALES_API_KEY no lado do servidor, dentro da ferramenta. Se a chave puder aparecer no contexto ou na saída do modelo, ela pode vazar para os logs.
whoami como primeira chamada de função
Torne a verificação de identidade o primeiro passo, para que o Gemini sempre confirme org/workspace antes de escrever.
Tem shell disponível? O CLI é menos código
Se o Gemini CLI tiver shell + npm, chamar o firstsales via shell é melhor do que criar ferramentas HTTP na mão: autenticação, JSON, idempotência e confirmação de exclusão vêm de graça.
Perguntas frequentes
O Gemini usa o CLI ou a API?
Por padrão, a Developer API, empacotada como functions/tools. Se o seu ambiente Gemini tiver acesso a shell com npm, o CLI é uma alternativa de menor esforço que cuida da autenticação e da idempotência para você.
Como mantenho a chave longe do modelo?
Guarde FIRSTSALES_API_KEY na configuração server-side e leia-a dentro da implementação da ferramenta. O modelo chama a ferramenta; ele nunca vê ou emite a chave bruta.
Como devo estruturar as ferramentas?
Como funções restritas e de propósito único: uma por endpoint público (whoami, listar/criar contato, campaign analytics). Evite uma tool genérica de 'buscar qualquer URL' que permita ao modelo sair da superfície suportada.
Como evito escritas duplicadas?
Anexe um cabeçalho Idempotency-Key dentro da sua tool de criação. Uma chamada de função repetida com a mesma chave retorna o resultado original em vez de criar um duplicado.
O que está fora dos limites?
Rotas privadas do app, callbacks de provedores, pixels de rastreamento, handlers de descadastro, endpoints internos de cron e raspagem da UI. Fique na /api/v1 pública; pare em unsupported_operation.