PT ▾
Obter chave de API

OpenCode com uma API compatível com OpenAI: configuração

Fazer a API compatível com OpenAI do opencode funcionar requer apenas uma entrada de provedor personalizado. Você define um provedor personalizado no arquivo de configuração com uma URL base, uma chave e uma entrada de modelo. Este guia mostra os valores exatos e como testá-los primeiro.

Atualizado

Um painel de terminal conectado por um cabo brilhante a um rack de servidores, representando um agente de programação chamando uma API personalizada

Pontos principais

  • Verifique o endpoint com curl antes de mexer no OpenCode, para saber se uma falha é da configuração ou da API.
  • Um provedor personalizado precisa de três coisas: URL base, chave de API e um ID de modelo, que é uncensored aqui.
  • Defina o limite de contexto para 100.000 tokens para que o agente planeje em torno da janela real.
  • Streaming e chamada de funções são suportados, o que é necessário para um loop de agente.

O que você precisa antes de começar

O OpenCode é um agente de código de código aberto que roda no seu terminal. Ele pode conversar com muitos provedores de modelos e permite que você adicione seu próprio provedor se o endpoint seguir o formato de chat do OpenAI. Esta API o segue, então a configuração é apenas preencher alguns campos.

Reúna esses três valores primeiro:

  • URL base: https://api.kimicode.top/v1
  • ID do modelo: uncensored
  • Chave de API: crie uma na página da chave de API. Contas novas podem resgatar um crédito de teste de $0.50 lá com um clique, o que é suficiente para os testes abaixo. A chave de teste permite 2 requisições simultâneas e 60 requisições por minuto.

Mantenha a chave em uma variável de ambiente em vez de colá-la em arquivos que você faz commit:

export KIMICODE_API_KEY="your-key-here"

Passo 1: teste o endpoint com curl

Faça isso antes de configurar qualquer ferramenta. Se o curl funcionar e o OpenCode não, você sabe que o problema está na configuração. Se o curl falhar, você corrige a chave ou a URL uma vez, não em dois lugares.

curl https://api.kimicode.top/v1/chat/completions \
  -H "Authorization: Bearer $KIMICODE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [{"role": "user", "content": "Say hello in five words."}],
    "max_tokens": 40
  }'

Você deve receber um objeto JSON com uma matriz choices e um bloco usage. Um 401 significa que a chave está errada ou faltando o prefixo Bearer. Um 404 geralmente significa que a URL foi digitada errada ou já inclui /chat/completions.

Um agente de programação transmite suas respostas e chama ferramentas, então verifique esses dois também:

curl -N https://api.kimicode.top/v1/chat/completions \
  -H "Authorization: Bearer $KIMICODE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "stream": true,
    "messages": [{"role": "user", "content": "Count from one to five."}]
  }'

Você deve ver uma série de linhas data:, cada uma com um pequeno delta JSON, terminando com as métricas de uso e um marcador final. A flag -N desativa o buffer do curl para que os chunks apareçam conforme chegam.

Passo 2: adicione um provedor personalizado ao OpenCode

O OpenCode lê um arquivo de configuração JSON, opencode.json, da pasta do seu projeto ou do seu diretório de configuração global. Provedores personalizados estilo OpenAI são declarados com o pacote compatível com OpenAI do AI SDK, uma base URL e uma lista de modelos. O layout abaixo segue a documentação pública do OpenCode no momento da escrita. Os nomes dos campos podem mudar entre versões, então compare-o com a seção de provedor da documentação atual do OpenCode se algo for rejeitado.

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "kimicode": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Kimicode API",
      "options": {
        "baseURL": "https://api.kimicode.top/v1",
        "apiKey": "{env:KIMICODE_API_KEY}"
      },
      "models": {
        "uncensored": {
          "name": "Uncensored",
          "limit": {
            "context": 100000,
            "output": 8192
          }
        }
      }
    }
  },
  "model": "kimicode/uncensored"
}

A chave sob models é o ID exato do modelo enviado ao servidor, então deve ler uncensored. A última linha seleciona o provedor e o modelo como padrão, escrito como nome do provedor, uma barra e depois o ID do modelo.

A forma {env:KIMICODE_API_KEY} diz ao OpenCode para ler a variável do seu shell. Se sua versão lida com credenciais através do seu próprio comando de login, use essa rota e deixe a chave de fora do arquivo. De qualquer forma, não faça commit de uma chave real.

Configuração do projeto ou configuração global

Você pode manter o bloco do provedor em dois lugares. Um arquivo na raiz do projeto se aplica apenas a esse repositório, o que é adequado para uma equipe que compartilha uma configuração. Um arquivo no seu diretório de configuração do usuário se aplica em todos os lugares, o que é adequado para um padrão pessoal. Onde ambos existem, o arquivo do projeto adiciona ou substitui o global.

Prefira o arquivo global para a definição do provedor e a variável de ambiente para a chave. Assim, cada repositório pode usar o endpoint, e nada secreto fica ao lado do seu código-fonte. Se várias pessoas trabalham em um projeto, faça commit apenas do bloco do provedor sem uma chave, e faça com que cada pessoa defina sua própria variável. Isso também torna simples rotacionar uma chave: altere a variável, reinicie o terminal e o arquivo de configuração permanece intacto.

Passo 3: escolha o modelo e execute uma tarefa

Inicie o OpenCode em uma pasta de projeto e abra o seletor de modelos. Seu provedor personalizado deve aparecer na lista com o nome de exibição que você definiu. Selecione-o e dê ao agente uma tarefa pequena e verificável, como explicar uma função ou escrever um teste unitário para um arquivo curto.

Comece pequeno por dois motivos. Primeiro, você pode ver se a chamada de função funciona: quando o OpenCode pede ao modelo para ler ou editar um arquivo, ele o faz através da interface de chamada de função. Segundo, um agente de programação envia muito texto por turno, incluindo conteúdos de arquivos e histórico, então uma sessão longa consome tokens rapidamente. A próxima seção coloca números nisso.

Se o modelo não aparecer, verifique se o arquivo é JSON válido, se está onde o OpenCode procura por configuração e se o nome do provedor corresponde ao que você digitou no campo model.

Testando chamada de funções e modo JSON diretamente

O OpenCode depende de chamada de funções para ler arquivos, executar comandos e editar código, então vale a pena confirmar que o endpoint lida com uma definição de ferramenta antes de culpar o agente por uma falha. Esta requisição oferece uma ferramenta e faz uma pergunta que precisa dela.

curl https://api.kimicode.top/v1/chat/completions \
  -H "Authorization: Bearer $KIMICODE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [{"role": "user", "content": "What is in the file notes.txt?"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "read_file",
        "description": "Read a text file by path",
        "parameters": {
          "type": "object",
          "properties": {"path": {"type": "string"}},
          "required": ["path"]
        }
      }
    }],
    "tool_choice": "auto"
  }'

Uma boa resposta contém uma entrada tool_calls nomeando read_file com uma string de argumento JSON. O agente executa a ferramenta e depois envia o resultado de volta como uma mensagem com role definido como tool, e o modelo continua a partir daí. Se você ver apenas texto simples, tente um prompt mais direto, já que a decisão do modelo de chamar uma ferramenta é parte do seu comportamento.

O modo JSON é uma opção separada. Adicionar "response_format": {"type": "json_object"} pede uma saída JSON válida, e ajuda quando outro script precisa analisar o que volta. Mencione JSON no seu prompt também, para que o modelo saiba que formato você espera.

Tamanho do contexto e custo de uma sessão

A janela de contexto é de 100.000 tokens, contando o prompt e a conclusão juntos. Definir limit.context para 100000 permite que o agente saiba o limite real, para que possa cortar ou resumir o histórico antes que o servidor precise rejeitar uma requisição. Uma conclusão pode usar qualquer espaço restante, e max_tokens é opcional.

A cobrança é de $0,15 por 1M de tokens de entrada e $0,50 por 1M de tokens de saída. Os agentes consomem muitos tokens de entrada, porque cada turno reenvia a conversa. Aqui está um exemplo prático para uma sessão moderada:

  • 40 turnos, cada um enviando cerca de 30.000 tokens de entrada: 1.200.000 tokens de entrada, que é 1,2 x $0,15 = $0,18.
  • Cada turno retorna cerca de 800 tokens de saída: 32.000 tokens de saída, que é 0,032 x $0,50 = $0,016.
  • Total: $0,196, então cerca de vinte centavos para toda a sessão.

Seus números serão diferentes. Leia os valores de usage nas respostas ou observe o cabeçalho X-Balance-USD, que informa seu saldo restante em cada resposta. O crédito é pré-pago e nunca expira, e requisições falhas ou recusadas não são cobradas. Detalhes estão na página de preços.

Expectativas honestas para um agente de programação

Este é um modelo de texto geral ajustado para responder sem recusas de conteúdo para uso adulto legal. Não é um modelo construído especificamente para código, e esta página não faz reivindicações de benchmark. Se ele edita seu repositório de forma confiável é algo que você deve testar em suas próprias tarefas, com controle de versão ligado, antes de entregá-lo algo importante.

Ele cuida da infraestrutura que um agente precisa: chamada de funções com tool_calls em streaming, resultados das ferramentas enviados de volta como mensagens role: "tool" e modo JSON via response_format. É apenas texto, sem imagens, então recursos que anexam capturas de tela não funcionarão.

Dois limites importam para agentes. Uma chave completa permite 8 requisições simultâneas e 300 requisições por minuto. Sub-agentes ou execuções paralelas de ferramentas que disparam muitas chamadas de uma vez podem atingir o limite de concorrência, e uma solicitação em streaming mantém seu slot até o fim do stream. Quando isso acontece, você recebe HTTP 429 com o código concurrency. O código rate_limited significa muitas requisições por minuto. Em sobrecarga temporária, você também pode ver um 429 com Retry-After: 5. Reduza o paralelismo ou aguarde e tente novamente.

Solução de Problemas

SintomaCausa provávelCorreção
401 Não AutorizadoChave vazia ou errada; a variável de ambiente não está definida no shell que iniciou o OpenCodeExecute echo $KIMICODE_API_KEY no mesmo terminal, depois reinicie o OpenCode
404 Not FoundURL base inclui /chat/completions ou falta /v1Use exatamente https://api.kimicode.top/v1
Modelo não encontradoA chave do modelo difere de uncensoredCorresponda a chave em models ao ID retornado por GET /v1/models
429 com concurrencyMuitas requisições de uma vezReduza as chamadas de ferramentas em paralelo ou aguarde o término dos streams
Requisição muito grandeCorpo com mais de 8 MB ou histórico próximo ao limite da janela de contextoInicie uma nova sessão ou resuma o histórico

Para qualquer coisa não coberta aqui, a página de docs tem a referência completa de requisição, e o guia de integração cobre o mesmo endpoint do ângulo de outros clientes estilo OpenAI.

Perguntas e respostas

O OpenCode suporta uma URL base personalizada?

Sim. Você declara um provedor personalizado no opencode.json com uma URL base, uma chave e uma lista de modelos. Consulte a documentação atual do OpenCode para os nomes exatos dos campos, pois eles podem mudar entre versões.

Qual ID de modelo devo inserir?

Insira uncensored, exatamente como escrito. Deve corresponder à chave no bloco models e ao ID retornado por GET /v1/models.

Existe uma maneira gratuita de testar a configuração?

Novos usuários podem resgatar $0.50 de crédito de teste com um clique na página da chave de API após o cadastro. Ele dura 7 dias, não precisa de cartão e é limitado a um por pessoa.

Por que recebo erros 429 durante uma execução de agente?

Agentes frequentemente enviam várias requisições simultaneamente. A chave completa permite 8 requisições concorrentes e 300 por minuto, e a chave de teste permite 2 e 60. Reduza o paralelismo ou tente novamente após o atraso Retry-After.

Sua chave está a um passo de distância

Crie uma conta, copie a chave e altere a URL base. Essa é toda a configuração.

Obter chave de API