Cloudflare Worker (Hono) que responde perguntas sobre um portfólio via Groq, com base num CV em src/cv.md.
Projeto de estudo: mostra como montar um chat de IA simples, hospedado de graça, para "conversar" com seu currículo.
POST /chat
{
"messages": [
{ "role": "user", "content": "Qual é a stack principal?" },
{ "role": "assistant", "content": "..." },
{ "role": "user", "content": "sim" }
]
}Compatível também com { "message": "..." } (turno único).
Resposta:
{ "answer": "..." }Limites: até 12 mensagens; user ≤ 800 chars; assistant ≤ 2000 chars.
- Conta Cloudflare
- Chave Groq
- Bun instalado
cd portfolio-chat-api
bun install
cp .dev.vars.example .dev.vars
# edite .dev.vars e cole GROQ_API_KEY
bun run devWorker local: http://127.0.0.1:8787
Teste rápido:
curl -X POST http://127.0.0.1:8787/chat \
-H "Content-Type: application/json" \
-H "Origin: http://localhost:5173" \
-d "{\"messages\":[{\"role\":\"user\",\"content\":\"Qual sua formação?\"}]}"bun run lint # Biome
bun run lint:fix # Biome --write
bun run typecheck # tsc --noEmit
bun run test # bun:testbunx wrangler loginAbre o browser, autoriza o Wrangler na sua conta.
bunx wrangler secret put GROQ_API_KEYCole a chave quando pedir. Fica só no ambiente Cloudflare.
bunx wrangler deployAo terminar, o CLI imprime uma URL tipo:
https://portfolio-chat-api.<seu-subdomain>.workers.dev
No componente que faz as perguntas (ex: AskAbout.tsx):
const CHAT_API_URL = 'https://portfolio-chat-api.<seu-subdomain>.workers.dev/chat'Rebuild e publique seu site.
Edite src/cv.md e rode de novo:
bunx wrangler deployPush em main dispara .github/workflows/deploy.yml:
bun installbun run lint && bun run typecheckbun run test- Deploy via
cloudflare/wrangler-action
Secret necessário no repositório GitHub:
CLOUDFLARE_API_TOKEN— token com permissão de deploy de Workers
GROQ_API_KEY continua só como secret no Wrangler (não vai no GitHub).
Configure as origens permitidas via ALLOWED_ORIGINS no wrangler.jsonc, por exemplo:
https://seu-usuario.github.iohttp://localhost:5173(dev Vite)
GROQ_API_KEYsó como secret /.dev.vars(gitignored)- CV em arquivo local (não é segredo; já é público no portfólio)