Cloudflare Worker · Hono · Groq

Groq-resumer-api

API mínima que responde perguntas sobre um currículo via IA, usando o conteúdo de src/cv.md como única fonte de verdade. Repo público: groq-resumer-api.

Projeto de estudo. Não é produto pronto nem template “de produção enterprise”. O objetivo é aprender na prática: Worker serverless, Hono, chamada à Groq, CORS, secrets no Wrangler e integração com um front de portfólio.

Sobre

O que resolve

  • Expõe POST /chat para o site fazer perguntas.
  • Injeta o CV no system prompt — a IA só fala com base nele.
  • Roda de graça na Cloudflare Workers, com deploy via Wrangler.
  • Tom conversacional curto, em português, com gancho para o próximo tema.

O que não é

  • Não é chatbot genérico (sem RAG, sem memória longa, sem tools).
  • Não inventa experiência fora do arquivo de CV.
  • Não substitui documentação oficial da Cloudflare ou da Groq.
  • Não inclui autenticação de usuário — só CORS por origem permitida.

Como funciona

Fluxo ponta a ponta do request até a resposta. Tudo cabe em um Worker Hono e uma chamada HTTP à API da Groq.

1

Frontend

Componente do portfólio (ex.: AskAbout) envia a pergunta do visitante.

2

POST /chat

JSON { "messages": [...] } (histórico), validação de tamanho e origem CORS.

3

Worker Hono

Monta o system prompt com o CV embutido e chama a Groq.

4

Groq

Modelo llama-3.3-70b-versatile, temperatura baixa para respostas mais fiéis ao CV.

5

Resposta

Retorna { "answer": "..." } para o front renderizar (ex.: markdown).

API

Endpoint principal: POST /chat. Há também GET / com um JSON de health/info do serviço.

Request

{
  "messages": [
    { "role": "user", "content": "Qual é a stack principal?" },
    { "role": "assistant", "content": "..." },
    { "role": "user", "content": "sim" }
  ]
}

Response (sucesso)

{
  "answer": "..."
}

Exemplo local com curl

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?\"}]}"

Em produção, troque a URL pela do Worker (*.workers.dev e garanta que a Origin do seu site está em ALLOWED_ORIGINS.

Stack

Poucas peças de propósito: runtime leve, framework HTTP mínimo e um provedor de LLM com boa latência no free tier.

Bun TypeScript Hono Cloudflare Workers Wrangler Biome bun:test GitHub Actions Groq API llama-3.3-70b-versatile

Setup & deploy

  1. Local: bun install, copie .dev.vars.example → .dev.vars, cole a GROQ_API_KEY e rode bun run dev.
  2. Login: bunx wrangler login.
  3. Secret (produção): bunx wrangler secret put GROQ_API_KEY — nunca commitada no código.
  4. Deploy manual: bunx wrangler deploy.
  5. CI/CD: push em main roda lint + testes e faz deploy via GitHub Actions (secret CLOUDFLARE_API_TOKEN).
  6. Qualidade local: bun run lint, bun run typecheck, bun run test.
  7. Front: aponte a URL do chat no componente do portfólio para …/chat.
  8. CV: edite src/cv.md e faça deploy de novo.

Passo a passo completo no README.md.

Segurança (o básico deste estudo)

  • GROQ_API_KEY só em .dev.vars (gitignore) ou secret do Wrangler.
  • CORS restrito por ALLOWED_ORIGINS no wrangler.jsonc.
  • O CV em Markdown não é tratado como segredo — já é conteúdo público do portfólio.
  • Sem rate limit avançado / auth de usuário neste exercício: se for evoluir, comece por aí.
De novo: isto é um laboratório didático. Use como referência de aprendizado, não como checklist de hardening completo.