👻 Kiro Gateway
Gateway proxy para Kiro API (Amazon Q Developer / AWS CodeWhisperer)
🇬🇧 English • 🇷🇺 Русский • 🇨🇳 中文 • 🇪🇸 Español • 🇮🇩 Indonesia • 🇯🇵 日本語 • 🇰🇷 한국어
Feito com ❤️ por @Jwadow
Use modelos Claude do Kiro com Claude Code, OpenCode, Cursor, Cline, Roo Code, Kilo Code, Obsidian, OpenAI SDK, LangChain, Continue e outras ferramentas compatíveis com OpenAI ou Anthropic
Modelos • Recursos • Início Rápido • Configuração • 💖 Apoiar
🤖 Modelos Disponíveis
⚠️ Importante: A disponibilidade de modelos depende do seu plano Kiro (gratuito/pago). O gateway fornece acesso aos modelos disponíveis no seu IDE ou CLI com base na sua assinatura. A lista abaixo mostra os modelos comumente disponíveis no plano gratuito.
🔒 Claude Opus 4.5 foi removido do plano gratuito em 17 de janeiro de 2026. Pode estar disponível em planos pagos — verifique a lista de modelos no seu IDE/CLI.
🚀 Claude Sonnet 4.5 — Desempenho equilibrado. Ótimo para programação, escrita e tarefas de uso geral.
⚡ Claude Haiku 4.5 — Velocidade relâmpago. Perfeito para respostas rápidas, tarefas simples e chat.
📦 Claude Sonnet 4 — Geração anterior. Ainda poderoso e confiável para a maioria dos casos de uso.
📦 Claude 3.7 Sonnet — Modelo legado. Disponível para compatibilidade retroativa.
💡 Resolução Inteligente de Modelos: Use qualquer formato de nome de modelo —
claude-sonnet-4-5,claude-sonnet-4.5, ou até nomes versionados comoclaude-sonnet-4-5-20250929. O gateway normaliza automaticamente.
✨ Recursos
| Recurso | Descrição |
|---|---|
| 🔌 API compatível com OpenAI | Funciona com qualquer ferramenta compatível com OpenAI |
| 🔌 API compatível com Anthropic | Endpoint nativo /v1/messages |
| 🌐 Suporte a VPN/Proxy | Proxy HTTP/SOCKS5 para redes restritas |
| 🧠 Pensamento Estendido | Raciocínio é exclusivo do nosso projeto |
| 👁️ Suporte a Visão | Envie imagens para o modelo |
| 🛠️ Chamada de Ferramentas | Suporta chamada de funções |
| 💬 Histórico completo de mensagens | Passa o contexto completo da conversa |
| 📡 Streaming | Suporte completo a streaming SSE |
| 🔄 Lógica de Retry | Retentativas automáticas em erros (403, 429, 5xx) |
| 📋 Lista estendida de modelos | Incluindo modelos versionados |
| 🔐 Gerenciamento inteligente de tokens | Atualização automática antes da expiração |
🚀 Início Rápido
Pré-requisitos
- Python 3.10+
- Um dos seguintes:
Instalação
# Clone o repositório (requer Git)
git clone https://github.com/Jwadow/kiro-gateway.git
cd kiro-gateway
# Ou baixe o ZIP: Code → Download ZIP → extraia → abra a pasta kiro-gateway
# Instale as dependências
pip install -r requirements.txt
# Configure (veja a seção Configuração)
cp .env.example .env
# Copie e edite o .env com suas credenciais
# Inicie o servidor
python main.py
# Ou com porta personalizada (se 8000 estiver ocupada)
python main.py --port 9000
O servidor estará disponível em http://localhost:8000
⚙️ Configuração
Opção 1: Arquivo JSON de Credenciais (Kiro IDE / Enterprise)
Especifique o caminho para o arquivo de credenciais:
Funciona com:
- Kiro IDE (padrão) - para contas pessoais
- Enterprise - para contas corporativas com SSO
KIRO_CREDS_FILE="~/.aws/sso/cache/kiro-auth-token.json"
# Senha para proteger SEU servidor proxy (crie qualquer string segura)
# Você usará isso como api_key ao conectar ao seu gateway
PROXY_API_KEY="my-super-secret-password-123"
📄 Formato do arquivo JSON
{
"accessToken": "eyJ...",
"refreshToken": "eyJ...",
"expiresAt": "2025-01-12T23:00:00.000Z",
"profileArn": "arn:aws:codewhisperer:us-east-1:...",
"region": "us-east-1",
"clientIdHash": "abc123..." // Optional: for corporate SSO setups
}
Nota: Se você tiver dois arquivos JSON em
~/.aws/sso/cache/(por exemplo,kiro-auth-token.jsone um arquivo com nome hash), usekiro-auth-token.jsonemKIRO_CREDS_FILE. O gateway carregará automaticamente o outro arquivo.
Opção 2: Variáveis de Ambiente (arquivo .env)
Crie um arquivo .env na raiz do projeto:
# Obrigatório
REFRESH_TOKEN="seu_kiro_refresh_token"
# Senha para proteger SEU servidor proxy (crie qualquer string segura)
PROXY_API_KEY="my-super-secret-password-123"
# Opcional
PROFILE_ARN="arn:aws:codewhisperer:us-east-1:..."
KIRO_REGION="us-east-1"
Opção 3: Credenciais AWS SSO (kiro-cli / Enterprise)
Se você usa kiro-cli ou Kiro IDE com AWS SSO (AWS IAM Identity Center), o gateway detectará e usará automaticamente a autenticação apropriada.
Funciona tanto com contas Builder ID gratuitas quanto com contas corporativas.
KIRO_CREDS_FILE="~/.aws/sso/cache/your-sso-cache-file.json"
# Senha para proteger SEU servidor proxy
PROXY_API_KEY="my-super-secret-password-123"
# Nota: PROFILE_ARN NÃO é necessário para AWS SSO (Builder ID e contas corporativas)
# O gateway funcionará sem ele
📄 Formato do arquivo JSON AWS SSO
Arquivos de credenciais AWS SSO (de ~/.aws/sso/cache/) contêm:
{
"accessToken": "eyJ...",
"refreshToken": "eyJ...",
"expiresAt": "2025-01-12T23:00:00.000Z",
"region": "us-east-1",
"clientId": "...",
"clientSecret": "..."
}
Nota: Usuários AWS SSO (Builder ID e contas corporativas) NÃO precisam de profileArn. O gateway funcionará sem ele (se especificado, será ignorado).
🔍 Como funciona
O gateway detecta automaticamente o tipo de autenticação com base no arquivo de credenciais:
Kiro Desktop Auth (padrão): Usado quando
clientIdeclientSecretNÃO estão presentes- Endpoint:
https://prod.{region}.auth.desktop.kiro.dev/refreshToken
- Endpoint:
AWS SSO (OIDC): Usado quando
clientIdeclientSecretestão presentes- Endpoint:
https://oidc.{region}.amazonaws.com/token
- Endpoint:
Nenhuma configuração adicional necessária — apenas aponte para seu arquivo de credenciais!
Opção 4: Banco de dados SQLite do kiro-cli
Se você usa kiro-cli e prefere usar seu banco de dados SQLite diretamente:
KIRO_CLI_DB_FILE="~/.local/share/kiro-cli/data.sqlite3"
# Senha para proteger SEU servidor proxy
PROXY_API_KEY="my-super-secret-password-123"
# Nota: PROFILE_ARN NÃO é necessário para AWS SSO (Builder ID e contas corporativas)
# O gateway funcionará sem ele
📄 Localizações do banco de dados
| Ferramenta CLI | Caminho do Banco de Dados |
|---|---|
| kiro-cli | ~/.local/share/kiro-cli/data.sqlite3 |
| amazon-q-developer-cli | ~/.local/share/amazon-q/data.sqlite3 |
O gateway lê credenciais da tabela auth_kv que armazena:
kirocli:odic:tokenoucodewhisperer:odic:token— token de acesso, token de atualização, expiraçãokirocli:odic:device-registrationoucodewhisperer:odic:device-registration— ID do cliente e segredo
Ambos os formatos de chave são suportados para compatibilidade com diferentes versões do kiro-cli.
Obtendo Credenciais
Para usuários do Kiro IDE:
- Faça login no Kiro IDE e use a Opção 1 acima (arquivo JSON de credenciais)
- O arquivo de credenciais é criado automaticamente após o login
Para usuários do Kiro CLI:
- Faça login com
kiro-cli logine use a Opção 3 ou Opção 4 acima - Não é necessário extrair tokens manualmente!
🔧 Avançado: Extração manual de token
Se você precisar extrair manualmente o refresh token (por exemplo, para depuração), você pode interceptar o tráfego do Kiro IDE:
- Procure por requisições para:
prod.us-east-1.auth.desktop.kiro.dev/refreshToken
🌐 Suporte a VPN/Proxy
Para usuários na China, redes corporativas ou regiões com problemas de conectividade com serviços AWS.
O gateway suporta rotear todas as solicitações da Kiro API através de um servidor VPN ou proxy. Isso é essencial se você enfrentar problemas de conexão com endpoints AWS ou precisar usar um proxy corporativo.
Configuração
Adicione ao seu arquivo .env:
# Proxy HTTP
VPN_PROXY_URL=http://127.0.0.1:7890
# Proxy SOCKS5
VPN_PROXY_URL=socks5://127.0.0.1:1080
# Com autenticação (proxies corporativos)
VPN_PROXY_URL=http://username:password@proxy.company.com:8080
# Sem protocolo (padrão para http://)
VPN_PROXY_URL=192.168.1.100:8080
Protocolos Suportados
- ✅ HTTP — Protocolo proxy padrão
- ✅ HTTPS — Conexões proxy seguras
- ✅ SOCKS5 — Protocolo proxy avançado (comum em software VPN)
- ✅ Autenticação — Nome de usuário/senha incorporados na URL
Quando Você Precisa Disso
| Situação | Solução |
|---|---|
| Timeouts de conexão com AWS | Use VPN/proxy para rotear tráfego |
| Restrições de rede corporativa | Configure o proxy da sua empresa |
| Problemas de conectividade regional | Use um serviço VPN com suporte a proxy |
| Requisitos de privacidade | Roteie através do seu próprio servidor proxy |
Software VPN Popular com Suporte a Proxy
A maioria dos clientes VPN fornece um servidor proxy local:
- Sing-box — Cliente VPN moderno com suporte a proxy HTTP/SOCKS5
- Clash — Geralmente executado em
http://127.0.0.1:7890 - V2Ray — Proxy SOCKS5/HTTP configurável
- Shadowsocks — Suporte a proxy SOCKS5
- VPN Corporativo — Consulte seu departamento de TI para configurações de proxy
Deixe VPN_PROXY_URL vazio (padrão) se você não precisar de suporte a proxy.
📡 Referência da API
Endpoints
| Endpoint | Método | Descrição |
|---|---|---|
/ |
GET | Verificação de saúde |
/health |
GET | Verificação de saúde detalhada |
/v1/models |
GET | Lista modelos disponíveis |
/v1/chat/completions |
POST | OpenAI Chat Completions API |
/v1/messages |
POST | Anthropic Messages API |
💡 Exemplos de Uso
OpenAI API
🔹 Requisição cURL Simples
curl http://localhost:8000/v1/chat/completions \
-H "Authorization: Bearer my-super-secret-password-123" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"messages": [{"role": "user", "content": "Olá!"}],
"stream": true
}'
Nota: Substitua
my-super-secret-password-123peloPROXY_API_KEYque você definiu no arquivo.env.
🔹 Requisição com Streaming
curl http://localhost:8000/v1/chat/completions \
-H "Authorization: Bearer my-super-secret-password-123" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"messages": [
{"role": "system", "content": "Você é um assistente útil."},
{"role": "user", "content": "Quanto é 2+2?"}
],
"stream": true
}'
🛠️ Com Chamada de Ferramentas
curl http://localhost:8000/v1/chat/completions \
-H "Authorization: Bearer my-super-secret-password-123" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"messages": [{"role": "user", "content": "Como está o tempo em Londres?"}],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Obter o tempo para uma localização",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "Nome da cidade"}
},
"required": ["location"]
}
}
}]
}'
🐍 Python OpenAI SDK
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="my-super-secret-password-123" # Seu PROXY_API_KEY do .env
)
response = client.chat.completions.create(
model="claude-sonnet-4-5",
messages=[
{"role": "system", "content": "Você é um assistente útil."},
{"role": "user", "content": "Olá!"}
],
stream=True
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
🦜 LangChain
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
base_url="http://localhost:8000/v1",
api_key="my-super-secret-password-123", # Seu PROXY_API_KEY do .env
model="claude-sonnet-4-5"
)
response = llm.invoke("Olá, como você está?")
print(response.content)
Anthropic API
🔹 Requisição cURL Simples
curl http://localhost:8000/v1/messages \
-H "x-api-key: my-super-secret-password-123" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Olá!"}]
}'
Nota: A API Anthropic usa o header
x-api-keyem vez deAuthorization: Bearer. Ambos são suportados.
🔹 Com Prompt de Sistema
curl http://localhost:8000/v1/messages \
-H "x-api-key: my-super-secret-password-123" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"system": "Você é um assistente útil.",
"messages": [{"role": "user", "content": "Olá!"}]
}'
Nota: Na API Anthropic,
systemé um campo separado, não uma mensagem.
📡 Streaming
curl http://localhost:8000/v1/messages \
-H "x-api-key: my-super-secret-password-123" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"stream": true,
"messages": [{"role": "user", "content": "Olá!"}]
}'
🐍 Python Anthropic SDK
import anthropic
client = anthropic.Anthropic(
api_key="my-super-secret-password-123", # Seu PROXY_API_KEY do .env
base_url="http://localhost:8000"
)
# Sem streaming
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Olá!"}]
)
print(response.content[0].text)
# Com streaming
with client.messages.stream(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Olá!"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
🔧 Depuração
O log de depuração está desabilitado por padrão. Para habilitar, adicione ao seu .env:
# Modo de log de depuração:
# - off: desabilitado (padrão)
# - errors: salvar logs apenas para requisições com falha (4xx, 5xx) - recomendado para solução de problemas
# - all: salvar logs para cada requisição (sobrescreve a cada requisição)
DEBUG_MODE=errors
Modos de Depuração
| Modo | Descrição | Caso de Uso |
|---|---|---|
off |
Desabilitado (padrão) | Produção |
errors |
Salvar logs apenas para requisições com falha (4xx, 5xx) | Recomendado para solução de problemas |
all |
Salvar logs para cada requisição | Desenvolvimento/depuração |
Arquivos de Depuração
Quando habilitado, as requisições são registradas na pasta debug_logs/:
| Arquivo | Descrição |
|---|---|
request_body.json |
Requisição recebida do cliente (formato OpenAI) |
kiro_request_body.json |
Requisição enviada para a API Kiro |
response_stream_raw.txt |
Stream bruto do Kiro |
response_stream_modified.txt |
Stream transformado (formato OpenAI) |
app_logs.txt |
Logs da aplicação para a requisição |
error_info.json |
Detalhes do erro (apenas em erros) |
📜 Licença
Este projeto está licenciado sob a GNU Affero General Public License v3.0 (AGPL-3.0).
Isso significa:
- ✅ Você pode usar, modificar e distribuir este software
- ✅ Você pode usá-lo para fins comerciais
- ⚠️ Você deve divulgar o código-fonte quando distribuir o software
- ⚠️ Uso em rede é distribuição — se você executar uma versão modificada em um servidor e permitir que outros interajam com ela, você deve disponibilizar o código-fonte para eles
- ⚠️ Modificações devem ser lançadas sob a mesma licença
Veja o arquivo LICENSE para o texto completo da licença.
Por que AGPL-3.0?
AGPL-3.0 garante que melhorias neste software beneficiem toda a comunidade. Se você modificar este gateway e implantá-lo como um serviço, você deve compartilhar suas melhorias com seus usuários.
Acordo de Licença de Contribuidor (CLA)
Ao enviar uma contribuição para este projeto, você concorda com os termos do nosso Acordo de Licença de Contribuidor (CLA). Isso garante que:
- Você tem o direito de enviar a contribuição
- Você concede ao mantenedor direitos de usar e relicenciar sua contribuição
- O projeto permanece legalmente protegido
💖 Apoie o Projeto
Se este projeto economizou seu tempo ou dinheiro, considere apoiá-lo!
Cada contribuição ajuda a manter este projeto vivo e crescendo
🤑 Doar
☕ Doação Única • 💎 Apoio Mensal
🪙 Ou envie criptomoedas
| Moeda | Rede | Endereço |
|---|---|---|
| USDT | TRC20 | TSVtgRc9pkC1UgcbVeijBHjFmpkYHDRu26 |
| BTC | Bitcoin | 12GZqxqpcBsqJ4Vf1YreLqwoMGvzBPgJq6 |
| ETH | Ethereum | 0xc86eab3bba3bbaf4eb5b5fff8586f1460f1fd395 |
| SOL | Solana | 9amykF7KibZmdaw66a1oqYJyi75fRqgdsqnG66AK3jvh |
| TON | TON | UQBVh8T1H3GI7gd7b-_PPNnxHYYxptrcCVf3qQk5v41h3QTM |
⚠️ Aviso Legal
Este projeto não é afiliado, endossado ou patrocinado pela Amazon Web Services (AWS), Anthropic ou Kiro IDE. Use por sua conta e risco e em conformidade com os termos de serviço das APIs subjacentes.