caveman-setup

Conecte um repositório ao gateway Caveman Cloud para medir cada requisição a LLMs, sem alterar o comportamento. Use para "configurar caveman" ou adicionar observabilidade de gastos com LLMs.

O que é caveman-setup?

Esta skill automatiza a integração de um repositório de código ao gateway Caveman, um proxy de LLM que preserva bytes e mede o uso e custo de cada requisição sem alterar o comportamento do aplicativo. É útil para desenvolvedores que desejam adicionar observabilidade de gastos com modelos de linguagem (LLMs) de forma rápida e segura, sem refatorar o código existente. A skill suporta SDKs populares como OpenAI, Anthropic, Vercel AI, LangChain, LiteLLM e requisições HTTP brutas, oferecendo receitas precisas de integração. O processo envolve identificar todos os pontos de chamada a LLMs, escolher um slug para o aplicativo, configurar variáveis de ambiente (como CAVE_API_KEY e CAVE_GATEWAY_URL) e substituir a URL base das chamadas para o gateway, adicionando os cabeçalhos de autenticação necessários. A skill também executa uma requisição de verificação real e gera um relatório com os resultados, garantindo que a integração seja validada.

Funciona com✓Claude Code✓Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/JuliusBrussee/caveman/tree/main/skills/caveman-setup

Installed? Explore more Produtividade e Colaboração skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Você está conectando este repositório ao gateway Caveman. Caveman é um proxy de LLM que preserva bytes: no modo de registro, ele mede o que seu aplicativo envia e quanto custa, e não altera mais nada. Seu trabalho é uma integração mínima e verificada — não uma refatoração.

O prompt que o enviou aqui fornece quatro valores. Consulte-os como:

  • GATEWAY — a URL base do gateway (ex.: https://gateway.caveman.so ou http://127.0.0.1:8787)
  • CAVE_API_KEY — o segredo de autenticação do gateway (trate como qualquer chave de API: apenas variável de ambiente, nunca commitada, nunca impressa por completo)
  • PROVIDER_KEYS — stored (as chaves dos provedores ficam criptografadas no Caveman Cloud) ou byok (este aplicativo envia sua própria chave de provedor por requisição)
  • DASHBOARD — a URL base do painel (ex.: https://app.caveman.so)

Se algum valor estiver faltando, pare e peça por ele. Não adivinhe uma URL nem crie uma chave.

Regras (não negociáveis)

  1. Integração coerente. Conecte cada ponto de chamada a LLM ativo através de configurações existentes e pontos de integração responsáveis. Toque em cada camada que a correção exigir. Sem refatorações ou reformatações aleatórias; adicione uma abstração apenas quando ela clarificar a responsabilidade ou reduzir o custo de ciclo de vida.
  2. Segredos ficam em variáveis de ambiente. CAVE_API_KEY vai para o arquivo de ambiente que o repositório já usa (.env, .env.local, …). Se esse arquivo não estiver no .gitignore, adicione-o e informe. Nunca codifique a chave no código-fonte.
  3. Relate apenas o que você observou. O relatório final informa o status HTTP e os números de uso da resposta de verificação real — nunca sucesso assumido. Se a verificação falhar, relate o modelo de falha correspondente.
  4. Apenas modo de registro. Você está adicionando medição. Você não habilita nenhuma otimização e não alega nenhuma economia — economias verificadas são $0 até que um otimizador seja explicitamente ativado e passe em seu portão de avaliação.
  5. Chaves de provedor não são da sua conta. Com PROVIDER_KEYS: stored você nunca vê uma. Com byok, a chave de provedor existente do aplicativo permanece exatamente onde já está.

Passo 1 — Encontre todos os pontos de chamada a LLMs ativos

Leia os arquivos de dependência (package.json, requirements.txt, pyproject.toml, go.mod, lockfiles) e pesquise no código-fonte por clientes de LLM:

  • Importações de SDK: openai, @anthropic-ai/sdk, anthropic, ai + @ai-sdk/* (Vercel), langchain*, litellm, google-genai / @google/genai, crewai, pydantic_ai, openai-agents / agents
  • HTTP bruto para api.openai.com, api.anthropic.com, generativelanguage.googleapis.com
  • Variáveis de ambiente de URL base existentes: OPENAI_BASE_URL, OPENAI_API_BASE, ANTHROPIC_BASE_URL, GEMINI_BASE_URL, GOOGLE_GEMINI_BASE_URL

Liste o que encontrou (arquivo:linha por ponto de chamada) antes de alterar qualquer coisa. Se você encontrar nenhum ponto de chamada a LLM, pare e relate o modelo "nada a conectar" no final deste arquivo — não invente uma integração.

Passo 2 — Escolha o slug do aplicativo

Um slug nomeia este aplicativo no caminho do gateway: GATEWAY/w/<app>. Derive-o do nome do pacote/módulo (ex.: support-bot, acme-api). Gramática: letras minúsculas [a-z0-9] primeiro, depois [a-z0-9._-], máximo de 64 caracteres. Os gastos de todo este aplicativo são agrupados sob esse slug no painel.

Passo 3 — Conecte cada ponto de chamada

O padrão é sempre o mesmo: URL base → o gateway com /w/<app>, mais um cabeçalho de autenticação. A autenticação do gateway é x-cave-api-key: CAVE_API_KEY (Authorization: Bearer CAVE_API_KEY também funciona onde um cabeçalho é complicado). Com PROVIDER_KEYS: byok, envie também x-cave-upstream-key: <a chave de provedor que o aplicativo já usa>.

Dois fatos que tornam a conexão segura (ambos são aplicados pelo gateway, não esperanças): o gateway reconstrói os cabeçalhos de autenticação upstream do zero, então o valor Authorization/x-api-key de um cliente nunca é encaminhado ao provedor; e com stored, a autenticação upstream vem da conexão criptografada no lado do servidor. Portanto, no modo stored, onde um SDK insiste em um parâmetro api-key, defina-o como a chave do Cave — ela autentica o gateway e não vai além.

Formas exatas (use a que corresponde a cada ponto de chamada — estas são as receitas publicadas do produto, não sugestões):

SDK OpenAI (TS) — Chat Completions e Responses ambos roteiam através de:

const client = new OpenAI({
  baseURL: `${process.env.CAVE_GATEWAY_URL}/w/<app>/openai/v1`,
  apiKey: process.env.OPENAI_API_KEY,           // byok: inalterado · stored: use CAVE_API_KEY
  defaultHeaders: {
    "x-cave-api-key": process.env.CAVE_API_KEY!,
    // apenas byok:
    "x-cave-upstream-key": process.env.OPENAI_API_KEY!,
  },
});

SDK OpenAI (Python) — mesma forma: base_url=f"{gw}/w/<app>/openai/v1", default_headers={"x-cave-api-key": ..., "x-cave-upstream-key": ...}.

SDK Anthropic (TS/Python) — o SDK anexa /v1/messages por conta própria. O cabeçalho x-cave-api-key é obrigatório aqui em ambos os modos (o parâmetro de chave próprio deste SDK viaja em x-api-key, que não é um cabeçalho de autenticação do gateway):

client = anthropic.Anthropic(
    base_url=f"{os.environ['CAVE_GATEWAY_URL']}/w/<app>",
    api_key=os.environ["ANTHROPIC_API_KEY"],      # byok: inalterado · stored: use CAVE_API_KEY
    default_headers={
        "x-cave-api-key": os.environ["CAVE_API_KEY"],
        # apenas byok:
        "x-cave-upstream-key": os.environ["ANTHROPIC_API_KEY"],
    },
)

SDK Vercel AI — createOpenAICompatible({ baseURL: ${gw}/w//openai/v1, headers: { "x-cave-api-key": ... } }); modelos Anthropic através de createAnthropic({ baseURL: ${gw}/w//v1, headers: { ... } }).

LangChain / LangGraph — ChatOpenAI(base_url=f"{gw}/w/<app>/openai/v1", default_headers={...}); ChatAnthropic(base_url=f"{gw}/w/<app>", default_headers={...}). LangGraph herda qualquer modelo que você passar.

LiteLLM — por chamada api_base=f"{gw}/w/<app>/openai/v1" + extra_headers={...}, ou em toda a frota no config.yaml do proxy LiteLLM.

HTTP bruto / qualquer outra coisa — troque o host, mantenha o caminho nativo do provedor: GATEWAY/w/<app>/v1/chat/completions (protocolo OpenAI) ou GATEWAY/w/<app>/v1/messages (protocolo Anthropic), adicione o(s) cabeçalho(s).

Concretamente, com o slug support-bot e o gateway hospedado, uma URL base do SDK OpenAI lê https://gateway.caveman.so/w/support-bot/openai/v1. E no modo stored, remova completamente todas as linhas x-cave-upstream-key — é apenas para byok.

Para frameworks não listados (google-genai, crewai, pydantic-ai, openai-agents), busque a página correspondente em <docs origin>/docs/integrations/ — mesma origem de onde esta skill veio — e siga-a.

Adicione ao arquivo de ambiente do repositório (e referencie do código — sem literais):

CAVE_GATEWAY_URL=<GATEWAY>
CAVE_API_KEY=<CAVE_API_KEY>

Passo 4 — Verifique com uma requisição real

O usuário colou o prompt de configuração para autorizar exatamente isto: uma pequena requisição de verificação. Envie-a agora — não pare para pedir permissão. Uma integração que termina não verificada porque você hesitou é um resultado pior do que uma pequena requisição; finalizar a verificação e o relatório de forma autônoma é o propósito desta skill.

Envie uma requisição mínima através da conexão que você acabou de construir — o caminho mais barato do próprio aplicativo, se ele tiver um script para isso, caso contrário, curl no caminho correspondente ao protocolo que você acabou de conectar com o modelo do próprio aplicativo e um limite pequeno (max_tokens ≤ 32):

# Conexão de protocolo OpenAI:
curl -sS "$CAVE_GATEWAY_URL/w/<app>/v1/chat/completions" \
  -H "x-cave-api-key: $CAVE_API_KEY" \
  -H "content-type: application/json" \
  -d '{"model":"<modelo que o repositório já usa>","max_tokens":16,"messages":[{"role":"user","content":"ping"}]}'

# Conexão de protocolo Anthropic:
curl -sS "$CAVE_GATEWAY_URL/w/<app>/v1/messages" \
  -H "x-cave-api-key: $CAVE_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"<modelo que o repositório já usa>","max_tokens":16,"messages":[{"role":"user","content":"ping"}]}'

(byok: adicione -H "x-cave-upstream-key: $PROVIDER_KEY".) Esta é uma requisição real e cobrável ao provedor — esse é o ponto: tráfego real, medição real.

Leia a resposta. Sucesso = HTTP 200 com um bloco usage. Qualquer outra coisa = o modelo de falha correspondente abaixo.

Passo 5 — Relate

Termine exatamente com esta forma, com valores preenchidos a partir do que você realmente fez e viu:

## Caveman está ativo neste repositório

Conectado: <n> ponto(s) de chamada em <n> arquivo(s)
  - <arquivo> — <uma linha descrevendo o que mudou>
Slug do aplicativo: <app> — gastos deste aplicativo agrupados sob ele
Verificado: HTTP 200 · modelo <modelo> · <entrada> tokens de entrada / <saída> tokens de saída (uma requisição real)
Modo: registro — apenas medido. Nenhum byte visível ao modelo foi alterado, nenhuma otimização habilitada. Economias verificadas são $0 até que você ative um otimizador e ele passe em seu portão de avaliação. Essa honestidade é o produto.

Veja os gastos: <DASHBOARD>/traces — sua requisição é a primeira linha, precificada a partir do catálogo público. <DASHBOARD>/getting-started muda para "Primeira requisição recebida."

Quer dividir gastos por fluxo de trabalho (ex.: resposta-suporte vs resumo-noturno), não apenas por aplicativo? Diga "descobrir fluxos de trabalho" — vou buscar <docs origin>/docs/discover-workflows.md e rotular cada ponto de chamada pelo trabalho que ele faz.

Modelos de falha (use textualmente, preenchidos — nunca suavize)

  • Nada a conectar: "Não encontrei pontos de chamada a LLM neste repositório (pesquisei SDKs, HTTP bruto de provedores, variáveis de ambiente de URL base). Se este repositório executa um agente de codificação em vez de enviar código de LLM, use caveman wrap <agente> — veja /getting-started."
  • Gateway inacessível: "A requisição de verificação não conseguiu alcançar GATEWAY (). A conexão está no lugar, mas não verificada — nada será medido até que o gateway esteja acessível. Verifique a URL e a rede, depois reexecute o curl de verificação acima."
  • 401 cave_invalid_api_key: "O gateway rejeitou CAVE_API_KEY. Crie uma nova chave em /getting-started e atualize o arquivo de ambiente; a conexão em si não foi alterada."
  • 404 cave_route_not_found: "O gateway não encontrou nenhuma rota — geralmente um slug /w/ malformado (minúsculas [a-z0-9] primeiro, depois [a-z0-9._-], máx. 64) ou um caminho que não corresponde ao protocolo do SDK. Corrija a URL e verifique novamente."
  • Erro do provedor (4xx/5xx através do gateway): reporte o status + o corpo textualmente; o gateway está acessível e a autenticação passou, a chamada upstream falhou — geralmente um problema de chave de provedor ou nome de modelo no próprio aplicativo.

Nunca reporte sucesso em nenhum destes. Uma integração não verificada é reportada como não verificada.

Individual skills in this repo

This repo contains 12 individual skills — each has its own dedicated page.

JuliusBrussee/caveman-discover

Find and label every LLM workflow in the repository so Caveman Cloud groups spend by workflow instead of one bucket. Use for "discover workflows" or breaking LLM spend down by workflow.

JuliusBrussee/caveman-evidence-review

Read-only review of Caveman Cloud evidence: cost, Cave Score, workflows, traces, latency, errors, routing, savings. Use when asked what Caveman found or where LLM spend goes.

JuliusBrussee/caveman-explore

Read-only repository explorer for cold-start orientation, broad cross-file localization, or when a direct search failed. Skip it when the exact file or symbol is already named. Returns path:line citations only; its reads stay out of main context.

JuliusBrussee/caveman-learn

Act on a Caveman learn report - review the ranked token sinks, apply cost-lowering fixes with per-edit consent, and report what those fixes returned. Use when asked to lower an agent's token cost, what caveman has saved, to trim a heavy CLAUDE.md, or to offload re-pasted context into cavemem.

JuliusBrussee/caveman-manage

Inspect Caveman Cloud's experiment lifecycle and block unsafe execution. Use when asked to start, approve, cancel, promote or roll back a Caveman experiment.

JuliusBrussee/caveman-optimize

Turn a Caveman optimization observation into an operator-chosen candidate with a paired baseline evaluation. Use when asked to inspect or evaluate a Caveman optimization report. Needs explicit approval.

JuliusBrussee/investigate-first

Diagnose ambiguous failures before editing. Use for unknown causes, intermittent behavior, performance regressions, or investigations needing evidence-ranked hypotheses.

JuliusBrussee/lean-build

Build feature work with high overbuilding risk. Use for new behavior, product slices, or integrations where repository reuse, strict scope, and an explicit stop condition matter.

JuliusBrussee/migration

Implement reversible compatibility-safe transitions. Use for schema, data, API, protocol, configuration, or dependency migrations requiring rollback and preservation proof.

JuliusBrussee/safe-refactor

Restructure code while preserving behavior. Use for extraction, consolidation, ownership moves, or cleanup where verification must bracket structural edits.

JuliusBrussee/surgical-patch

Fix bugs and small behavior changes at the narrowest responsible layer. Use when regression proof, preserved surrounding behavior, and task-relevant tests matter.

JuliusBrussee/verify-and-stop

Prove existing work meets acceptance conditions without expanding scope. Use for validation-only tasks, completion checks, focused gate runs, and last-mile proof.

Habilidades Relacionadas