{"repo": "bigdata2211it-web/kiro-proxy-anthropic", "files": {"README.md": {"89dfa195950fac9131baf00da477e74daf815e8c": {"t": 1785747218.928431, "n": 9180, "h": "9e5d456b8c868561", "c": "# kiro-proxy-anthropic\n\n**Anthropic Messages API compatible** local proxy for **Kiro CLI** (Amazon CodeWhisperer / Amazon Q).\n\nDrop-in replacement for the Anthropic API — any client that normally talks to `api.anthropic.com` can talk to this proxy instead and get **free access** to Claude Opus 4.7, Sonnet 4.6, Haiku 4.5 and more, via your Kiro login.\n\n> Works with **Claude Code**, **Claude Desktop** (via `ANTHROPIC_BASE_URL`), Cursor, and any SDK/tool built on `@anthropic-ai/sdk` or the raw Messages API.\n\n## Why this exists\n\n- Kiro CLI ships with free access to Claude flagship models (Opus 4.7 with 1M context and more).\n- Kiro's wire protocol is proprietary (`AmazonCodeWhispererStreamingService.GenerateAssistantResponse`), not compatible with standard clients.\n- This proxy speaks **native Anthropic Messages API** on the outside, so you can plug it into Claude Code or Claude Desktop without forking them.\n\nThere's also a sibling OpenAI-compatible version: [kiro-proxy](https://github.com/bigdata2211it-web/kiro-proxy).\n\n## Quick install (Anthropic-compatible)\n\nOne-liner, no git clone needed.\n\n**Linux / macOS**\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/bigdata2211it-web/kiro-proxy-anthropic/main/install/install.sh | bash\n```\n\n**Windows (PowerShell)**\n\n```powershell\niwr -useb https://raw.githubusercontent.com/bigdata2211it-web/kiro-proxy-anthropic/main/install/install.ps1 | iex\n```\n\nThe installer:\n- checks Node 18+ (prints install hint if missing),\n- clones the repo to a sensible OS-specific location,\n- runs `npm install --omit=dev`,\n- registers autostart (systemd user unit on Linux, LaunchAgent on macOS, Scheduled Task on Windows),\n- smoke-tests `http://127.0.0.1:11437`.\n\nDetails, environment overrides, uninstall: see [install/README.md](install/README.md).\n\n---\n\n## Features\n\n- ✅ `POST /v1/messages` — full Anthropic Messages API (streaming + non-streaming)\n- ✅ Proper Anthropic SSE events: `message_start`, `content_block_start/delta/stop`, `message_delta`, `message_stop`\n- ✅ **Tool use** in Anthropic native format (`tool_use`, `tool_result` blocks, `input_json_delta` streaming)\n- ✅ System prompts (string or array of content blocks)\n- ✅ Multi-turn history with Anthropic `content` arrays\n- ✅ Model aliases — `claude-opus-4-5-20250514` maps to Kiro's `claude-opus-4.5`, etc.\n- ✅ Bearer auth read directly from Kiro's local SQLite — no re-login\n\n## Models\n\n| Anthropic alias / Kiro ID | Context | Rate |\n|---|---|---|\n| `claude-opus-4.7` | 1M | 2.2x |\n| `claude-opus-4.6` | 1M | 2.2x |\n| `claude-sonnet-4.6` | 1M | 1.3x |\n| `claude-opus-4.5` | 200K | 2.2x |\n| `claude-sonnet-4.5` | 200K | 1.3x |\n| `claude-sonnet-4` | 200K | 1.3x |\n| `claude-haiku-4.5` | 200K | 0.4x |\n| `auto` | 1M | 1.0x |\n\nPlus non-Anthropic models exposed as-is: `deepseek-3.2`, `qwen3-coder-next`, `glm-5`, `minimax-m2.5`.\n\nAlso accepts Anthropic-style dated IDs (`claude-sonnet-4-5-20250514`, `claude-opus-4-20250514`) — normalized automatically.\n\n## Requirements\n\n- Node.js 18+\n- Kiro CLI logged in (`kiro-cli login`). Get it from [kiro.dev](https://kiro.dev).\n- **Linux, macOS, Windows** — all supported. Kiro SQLite path is auto-detected:\n - Linux: `$XDG_DATA_HOME/kiro-cli/data.sqlite3` or `~/.local/share/kiro-cli/data.sqlite3`\n - macOS: `~/.local/share/kiro-cli/data.sqlite3`\n - Windows: `%APPDATA%\\kiro-cli\\data.sqlite3`\n - Override with `KIRO_DB_PATH`.\n\n## Install\n\n```bash\ngit clone https://github.com/bigdata2211it-web/kiro-proxy-anthropic.git\ncd kiro-proxy-anthropic\nnpm install\n```\n\n## Run\n\n### Linux / macOS\n\n```bash\n./start.sh\n# or\nnode index.js\n```\n\n### Windows\n\n```powershell\n# PowerShell\n.\\start.ps1\n```\n\n```cmd\n:: cmd.exe\nstart.cmd\n```\n\nListens on `http://127.0.0.1:11437` (override with `KIRO_PROXY_PORT`).\n\n## Use with Claude Code\n\nClaude Code reads `ANTHROPIC_BASE_URL` and `ANTHROPIC_API_KEY`:\n\n```bash\nexport ANTHROPIC_BASE_URL=http://127.0.0.1:11437\nexport ANTHROPIC_API_KEY=dummy\nclaude \"refactor this function\"\n```\n\nOr add to `~/.claude/settings.json`:\n\n```json\n{\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:11437\",\n \"ANTHROPIC_API_KEY\": \"dummy\"\n }\n}\n```\n\n## Use with Anthropic SDK\n\n```python\nfrom anthropic import Anthropic\nclient = Anthropic(base_url=\"http://127.0.0.1:11437\", api_key=\"dummy\")\nmsg = client.messages.create(\n model=\"claude-sonnet-4.6\",\n max_tokens=1024,\n messages=[{\"role\": \"user\", \"content\": \"Hi\"}]\n)\nprint(msg.content[0].text)\n```\n\n```typescript\nimport Anthropic from \"@anthropic-ai/sdk\";\nconst client = new Anthropic({ baseURL: \"http://127.0.0.1:11437\", apiKey: \"dummy\" });\n```\n\n## Use with curl\n\n```bash\n# Non-streaming\ncurl http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-opus-4.7\",\n \"max_tokens\": 1024,\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}]\n }'\n\n# Streaming\ncurl -N http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-sonnet-4.6\",\n \"max_tokens\": 1024,\n \"stream\": true,\n \"messages\": [{\"role\": \"user\", \"content\": \"Count to 5\"}]\n }'\n\n# With tools\ncurl http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-sonnet-4.6\",\n \"max_tokens\": 1024,\n \"messages\": [{\"role\": \"user\", \"content\": \"list files in /tmp\"}],\n \"tools\": [{\n \"name\": \"list_files\",\n \"description\": \"List files in a directory\",\n \"input_schema\": {\n \"type\": \"object\",\n \"required\": [\"path\"],\n \"properties\": {\"path\": {\"type\": \"string\"}}\n }\n }]\n }'\n```\n\n## systemd autostart\n\n`~/.config/systemd/user/kiro-proxy-anthropic.service`:\n\n```ini\n[Unit]\nDescription=Kiro → Anthropic API Proxy\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=/usr/bin/node /path/to/kiro-proxy-anthropic/index.js\nRestart=on-failure\nRestartSec=5\nEnvironment=KIRO_PROXY_PORT=11437\n\n[Install]\nWantedBy=default.target\n```\n\n```bash\nsystemctl --user daemon-reload\nsystemctl --user enable --now kiro-proxy-anthropic\n```\n\n## Token refresh\n\nKiro tokens expire ~1h; any `kiro-cli` call refreshes them:\n\n```cron\n*/45 * * * * /path/to/kiro-cli chat --no-interactive \"ping\" >/dev/null 2>&1\n```\n\n## Custom system instructions\n\nThe proxy can prepend (or append, or replace) your own system instructions\nto every request, loaded from plain markdown files. Handy when the client\ndoesn't know about your rules, or you want the same persona/rules across\nmany different clients.\n\nCopy the example config:\n\n```bash\nmkdir -p ~/.config/kiro-proxy-anthropic\ncp system-instructions.example.json ~/.config/kiro-proxy-anthropic/system-instructions.json\n# edit it, point `files[].path` at your own .md files\n```\n\nMinimal config:\n\n```json\n{\n \"enabled\": true,\n \"mode\": \"prepend\",\n \"files\": [\n { \"path\": \"/abs/path/to/your/AGENTS.md\", \"required\": true }\n ]\n}\n```\n\nModes:\n\n- `prepend` — your text before whatever the client sent (default).\n- `append` — your text after.\n- `replace` — ignore the client's system prompt entirely.\n- `off` — pass through untouched.\n\nPer-request override: send `X-Proxy-Instructions: off` (or `replace`, etc.)\nwith your request to override the configured mode for that call only.\n\nCheck what's loaded:\n\n```bash\ncurl -s http://127.0.0.1:11437/debug/instructions | jq .\n```\n\nForce a reload without restart:\n\n```bash\ncurl -s -X POST http://127.0.0.1:11437/debug/instructions/reload | jq .\n```\n\nSee `examples/` for three ready-to-use packs: `minimal/`, `coding/`, `persona/`.\n\nYour real `system-instructions.json` and any private rule files are\ngitignored by default — the repo only ships the example config and the\ngeneric example packs.\n\n## How it works\n\n```\nClaude Code / Anthropic SDK\n ↓ POST /v1/messages { messages, tools, stream }\nkiro-proxy-anthropic\n ↓ reads Kiro access_token from sqlite\n ↓ Anthropic format → Kiro conversationState\n ↓ POST https://q.us-east-1.amazonaws.com/ (Bearer auth)\nAmazon CodeWhisperer\n ↓ binary AWS Event Stream\nkiro-proxy-anthropic\n ↓ parses events into Anthropic SSE (content_block_delta, …)\nClaude Code / SDK\n```\n\nFull Kiro wire protocol documentation: [PROTOCOL.md](./PROTOCOL.md) (same as the OpenAI-compatible sibling).\n\n## Ports\n\n- `11436` — [kiro-proxy](https://github.com/bigdata2211it-web/kiro-proxy) (OpenAI `/v1/chat/completions`)\n- `11437` — **kiro-proxy-anthropic** (Anthropic `/v1/messages`)\n\nRun both simultaneously if you need both APIs.\n\n## Limits\n\n- **Vision / images**: not implemented yet\n- **Extended thinking** (Opus 4.7 adaptive thinking): not exposed as `thinking` blocks\n- **Rate limits**: whatever Kiro's credit pool allows\n- **Prompt caching blocks** (`cache_control`): accepted but not propagated (Kiro has its own server-side caching)\n\n## Environment variables\n\n| Name | Default | Description |\n|---|---|---|\n| `KIRO_PROXY_PORT` | `11437` | Listen port. |\n| `KIRO_DB_PATH` | auto | Override path to Kiro CLI SQLite DB. |\n| `KIRO_DUMP_DIR` | `os.tmpdir()` | Where 400-error debug dumps are written. |\n| `KIRO_PROXY_INSTRUCTIONS_CONFIG` | auto | Path to custom `system-instructions.json`. |\n\n## License\n\nMIT\n"}, "b9ebf7803b033a5ca21162f96a3cb3846f8c41ee": {"t": 1785771445.9920578, "n": 9180, "h": "9e5d456b8c868561", "c": "# kiro-proxy-anthropic\n\n**Anthropic Messages API compatible** local proxy for **Kiro CLI** (Amazon CodeWhisperer / Amazon Q).\n\nDrop-in replacement for the Anthropic API — any client that normally talks to `api.anthropic.com` can talk to this proxy instead and get **free access** to Claude Opus 4.7, Sonnet 4.6, Haiku 4.5 and more, via your Kiro login.\n\n> Works with **Claude Code**, **Claude Desktop** (via `ANTHROPIC_BASE_URL`), Cursor, and any SDK/tool built on `@anthropic-ai/sdk` or the raw Messages API.\n\n## Why this exists\n\n- Kiro CLI ships with free access to Claude flagship models (Opus 4.7 with 1M context and more).\n- Kiro's wire protocol is proprietary (`AmazonCodeWhispererStreamingService.GenerateAssistantResponse`), not compatible with standard clients.\n- This proxy speaks **native Anthropic Messages API** on the outside, so you can plug it into Claude Code or Claude Desktop without forking them.\n\nThere's also a sibling OpenAI-compatible version: [kiro-proxy](https://github.com/bigdata2211it-web/kiro-proxy).\n\n## Quick install (Anthropic-compatible)\n\nOne-liner, no git clone needed.\n\n**Linux / macOS**\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/bigdata2211it-web/kiro-proxy-anthropic/main/install/install.sh | bash\n```\n\n**Windows (PowerShell)**\n\n```powershell\niwr -useb https://raw.githubusercontent.com/bigdata2211it-web/kiro-proxy-anthropic/main/install/install.ps1 | iex\n```\n\nThe installer:\n- checks Node 18+ (prints install hint if missing),\n- clones the repo to a sensible OS-specific location,\n- runs `npm install --omit=dev`,\n- registers autostart (systemd user unit on Linux, LaunchAgent on macOS, Scheduled Task on Windows),\n- smoke-tests `http://127.0.0.1:11437`.\n\nDetails, environment overrides, uninstall: see [install/README.md](install/README.md).\n\n---\n\n## Features\n\n- ✅ `POST /v1/messages` — full Anthropic Messages API (streaming + non-streaming)\n- ✅ Proper Anthropic SSE events: `message_start`, `content_block_start/delta/stop`, `message_delta`, `message_stop`\n- ✅ **Tool use** in Anthropic native format (`tool_use`, `tool_result` blocks, `input_json_delta` streaming)\n- ✅ System prompts (string or array of content blocks)\n- ✅ Multi-turn history with Anthropic `content` arrays\n- ✅ Model aliases — `claude-opus-4-5-20250514` maps to Kiro's `claude-opus-4.5`, etc.\n- ✅ Bearer auth read directly from Kiro's local SQLite — no re-login\n\n## Models\n\n| Anthropic alias / Kiro ID | Context | Rate |\n|---|---|---|\n| `claude-opus-4.7` | 1M | 2.2x |\n| `claude-opus-4.6` | 1M | 2.2x |\n| `claude-sonnet-4.6` | 1M | 1.3x |\n| `claude-opus-4.5` | 200K | 2.2x |\n| `claude-sonnet-4.5` | 200K | 1.3x |\n| `claude-sonnet-4` | 200K | 1.3x |\n| `claude-haiku-4.5` | 200K | 0.4x |\n| `auto` | 1M | 1.0x |\n\nPlus non-Anthropic models exposed as-is: `deepseek-3.2`, `qwen3-coder-next`, `glm-5`, `minimax-m2.5`.\n\nAlso accepts Anthropic-style dated IDs (`claude-sonnet-4-5-20250514`, `claude-opus-4-20250514`) — normalized automatically.\n\n## Requirements\n\n- Node.js 18+\n- Kiro CLI logged in (`kiro-cli login`). Get it from [kiro.dev](https://kiro.dev).\n- **Linux, macOS, Windows** — all supported. Kiro SQLite path is auto-detected:\n - Linux: `$XDG_DATA_HOME/kiro-cli/data.sqlite3` or `~/.local/share/kiro-cli/data.sqlite3`\n - macOS: `~/.local/share/kiro-cli/data.sqlite3`\n - Windows: `%APPDATA%\\kiro-cli\\data.sqlite3`\n - Override with `KIRO_DB_PATH`.\n\n## Install\n\n```bash\ngit clone https://github.com/bigdata2211it-web/kiro-proxy-anthropic.git\ncd kiro-proxy-anthropic\nnpm install\n```\n\n## Run\n\n### Linux / macOS\n\n```bash\n./start.sh\n# or\nnode index.js\n```\n\n### Windows\n\n```powershell\n# PowerShell\n.\\start.ps1\n```\n\n```cmd\n:: cmd.exe\nstart.cmd\n```\n\nListens on `http://127.0.0.1:11437` (override with `KIRO_PROXY_PORT`).\n\n## Use with Claude Code\n\nClaude Code reads `ANTHROPIC_BASE_URL` and `ANTHROPIC_API_KEY`:\n\n```bash\nexport ANTHROPIC_BASE_URL=http://127.0.0.1:11437\nexport ANTHROPIC_API_KEY=dummy\nclaude \"refactor this function\"\n```\n\nOr add to `~/.claude/settings.json`:\n\n```json\n{\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:11437\",\n \"ANTHROPIC_API_KEY\": \"dummy\"\n }\n}\n```\n\n## Use with Anthropic SDK\n\n```python\nfrom anthropic import Anthropic\nclient = Anthropic(base_url=\"http://127.0.0.1:11437\", api_key=\"dummy\")\nmsg = client.messages.create(\n model=\"claude-sonnet-4.6\",\n max_tokens=1024,\n messages=[{\"role\": \"user\", \"content\": \"Hi\"}]\n)\nprint(msg.content[0].text)\n```\n\n```typescript\nimport Anthropic from \"@anthropic-ai/sdk\";\nconst client = new Anthropic({ baseURL: \"http://127.0.0.1:11437\", apiKey: \"dummy\" });\n```\n\n## Use with curl\n\n```bash\n# Non-streaming\ncurl http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-opus-4.7\",\n \"max_tokens\": 1024,\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}]\n }'\n\n# Streaming\ncurl -N http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-sonnet-4.6\",\n \"max_tokens\": 1024,\n \"stream\": true,\n \"messages\": [{\"role\": \"user\", \"content\": \"Count to 5\"}]\n }'\n\n# With tools\ncurl http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-sonnet-4.6\",\n \"max_tokens\": 1024,\n \"messages\": [{\"role\": \"user\", \"content\": \"list files in /tmp\"}],\n \"tools\": [{\n \"name\": \"list_files\",\n \"description\": \"List files in a directory\",\n \"input_schema\": {\n \"type\": \"object\",\n \"required\": [\"path\"],\n \"properties\": {\"path\": {\"type\": \"string\"}}\n }\n }]\n }'\n```\n\n## systemd autostart\n\n`~/.config/systemd/user/kiro-proxy-anthropic.service`:\n\n```ini\n[Unit]\nDescription=Kiro → Anthropic API Proxy\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=/usr/bin/node /path/to/kiro-proxy-anthropic/index.js\nRestart=on-failure\nRestartSec=5\nEnvironment=KIRO_PROXY_PORT=11437\n\n[Install]\nWantedBy=default.target\n```\n\n```bash\nsystemctl --user daemon-reload\nsystemctl --user enable --now kiro-proxy-anthropic\n```\n\n## Token refresh\n\nKiro tokens expire ~1h; any `kiro-cli` call refreshes them:\n\n```cron\n*/45 * * * * /path/to/kiro-cli chat --no-interactive \"ping\" >/dev/null 2>&1\n```\n\n## Custom system instructions\n\nThe proxy can prepend (or append, or replace) your own system instructions\nto every request, loaded from plain markdown files. Handy when the client\ndoesn't know about your rules, or you want the same persona/rules across\nmany different clients.\n\nCopy the example config:\n\n```bash\nmkdir -p ~/.config/kiro-proxy-anthropic\ncp system-instructions.example.json ~/.config/kiro-proxy-anthropic/system-instructions.json\n# edit it, point `files[].path` at your own .md files\n```\n\nMinimal config:\n\n```json\n{\n \"enabled\": true,\n \"mode\": \"prepend\",\n \"files\": [\n { \"path\": \"/abs/path/to/your/AGENTS.md\", \"required\": true }\n ]\n}\n```\n\nModes:\n\n- `prepend` — your text before whatever the client sent (default).\n- `append` — your text after.\n- `replace` — ignore the client's system prompt entirely.\n- `off` — pass through untouched.\n\nPer-request override: send `X-Proxy-Instructions: off` (or `replace`, etc.)\nwith your request to override the configured mode for that call only.\n\nCheck what's loaded:\n\n```bash\ncurl -s http://127.0.0.1:11437/debug/instructions | jq .\n```\n\nForce a reload without restart:\n\n```bash\ncurl -s -X POST http://127.0.0.1:11437/debug/instructions/reload | jq .\n```\n\nSee `examples/` for three ready-to-use packs: `minimal/`, `coding/`, `persona/`.\n\nYour real `system-instructions.json` and any private rule files are\ngitignored by default — the repo only ships the example config and the\ngeneric example packs.\n\n## How it works\n\n```\nClaude Code / Anthropic SDK\n ↓ POST /v1/messages { messages, tools, stream }\nkiro-proxy-anthropic\n ↓ reads Kiro access_token from sqlite\n ↓ Anthropic format → Kiro conversationState\n ↓ POST https://q.us-east-1.amazonaws.com/ (Bearer auth)\nAmazon CodeWhisperer\n ↓ binary AWS Event Stream\nkiro-proxy-anthropic\n ↓ parses events into Anthropic SSE (content_block_delta, …)\nClaude Code / SDK\n```\n\nFull Kiro wire protocol documentation: [PROTOCOL.md](./PROTOCOL.md) (same as the OpenAI-compatible sibling).\n\n## Ports\n\n- `11436` — [kiro-proxy](https://github.com/bigdata2211it-web/kiro-proxy) (OpenAI `/v1/chat/completions`)\n- `11437` — **kiro-proxy-anthropic** (Anthropic `/v1/messages`)\n\nRun both simultaneously if you need both APIs.\n\n## Limits\n\n- **Vision / images**: not implemented yet\n- **Extended thinking** (Opus 4.7 adaptive thinking): not exposed as `thinking` blocks\n- **Rate limits**: whatever Kiro's credit pool allows\n- **Prompt caching blocks** (`cache_control`): accepted but not propagated (Kiro has its own server-side caching)\n\n## Environment variables\n\n| Name | Default | Description |\n|---|---|---|\n| `KIRO_PROXY_PORT` | `11437` | Listen port. |\n| `KIRO_DB_PATH` | auto | Override path to Kiro CLI SQLite DB. |\n| `KIRO_DUMP_DIR` | `os.tmpdir()` | Where 400-error debug dumps are written. |\n| `KIRO_PROXY_INSTRUCTIONS_CONFIG` | auto | Path to custom `system-instructions.json`. |\n\n## License\n\nMIT\n"}, "82a1b18e37e1a6a19ebce30c51bf9c8aa7fb3497": {"t": 1785771447.5244236, "n": 8411, "h": "b0ef877938574553", "c": "# kiro-proxy-anthropic\n\n**Anthropic Messages API compatible** local proxy for **Kiro CLI** (Amazon CodeWhisperer / Amazon Q).\n\nDrop-in replacement for the Anthropic API — any client that normally talks to `api.anthropic.com` can talk to this proxy instead and get **free access** to Claude Opus 4.7, Sonnet 4.6, Haiku 4.5 and more, via your Kiro login.\n\n> Works with **Claude Code**, **Claude Desktop** (via `ANTHROPIC_BASE_URL`), Cursor, and any SDK/tool built on `@anthropic-ai/sdk` or the raw Messages API.\n\n## Why this exists\n\n- Kiro CLI ships with free access to Claude flagship models (Opus 4.7 with 1M context and more).\n- Kiro's wire protocol is proprietary (`AmazonCodeWhispererStreamingService.GenerateAssistantResponse`), not compatible with standard clients.\n- This proxy speaks **native Anthropic Messages API** on the outside, so you can plug it into Claude Code or Claude Desktop without forking them.\n\nThere's also a sibling OpenAI-compatible version: [kiro-proxy](https://github.com/bigdata2211it-web/kiro-proxy).\n\n## Features\n\n- ✅ `POST /v1/messages` — full Anthropic Messages API (streaming + non-streaming)\n- ✅ Proper Anthropic SSE events: `message_start`, `content_block_start/delta/stop`, `message_delta`, `message_stop`\n- ✅ **Tool use** in Anthropic native format (`tool_use`, `tool_result` blocks, `input_json_delta` streaming)\n- ✅ System prompts (string or array of content blocks)\n- ✅ Multi-turn history with Anthropic `content` arrays\n- ✅ Model aliases — `claude-opus-4-5-20250514` maps to Kiro's `claude-opus-4.5`, etc.\n- ✅ Bearer auth read directly from Kiro's local SQLite — no re-login\n\n## Models\n\n| Anthropic alias / Kiro ID | Context | Rate |\n|---|---|---|\n| `claude-opus-4.7` | 1M | 2.2x |\n| `claude-opus-4.6` | 1M | 2.2x |\n| `claude-sonnet-4.6` | 1M | 1.3x |\n| `claude-opus-4.5` | 200K | 2.2x |\n| `claude-sonnet-4.5` | 200K | 1.3x |\n| `claude-sonnet-4` | 200K | 1.3x |\n| `claude-haiku-4.5` | 200K | 0.4x |\n| `auto` | 1M | 1.0x |\n\nPlus non-Anthropic models exposed as-is: `deepseek-3.2`, `qwen3-coder-next`, `glm-5`, `minimax-m2.5`.\n\nAlso accepts Anthropic-style dated IDs (`claude-sonnet-4-5-20250514`, `claude-opus-4-20250514`) — normalized automatically.\n\n## Requirements\n\n- Node.js 18+\n- Kiro CLI logged in (`kiro-cli login`). Get it from [kiro.dev](https://kiro.dev).\n- **Linux, macOS, Windows** — all supported. Kiro SQLite path is auto-detected:\n - Linux: `$XDG_DATA_HOME/kiro-cli/data.sqlite3` or `~/.local/share/kiro-cli/data.sqlite3`\n - macOS: `~/.local/share/kiro-cli/data.sqlite3`\n - Windows: `%APPDATA%\\kiro-cli\\data.sqlite3`\n - Override with `KIRO_DB_PATH`.\n\n## Install\n\n```bash\ngit clone https://github.com/bigdata2211it-web/kiro-proxy-anthropic.git\ncd kiro-proxy-anthropic\nnpm install\n```\n\n## Run\n\n### Linux / macOS\n\n```bash\n./start.sh\n# or\nnode index.js\n```\n\n### Windows\n\n```powershell\n# PowerShell\n.\\start.ps1\n```\n\n```cmd\n:: cmd.exe\nstart.cmd\n```\n\nListens on `http://127.0.0.1:11437` (override with `KIRO_PROXY_PORT`).\n\n## Use with Claude Code\n\nClaude Code reads `ANTHROPIC_BASE_URL` and `ANTHROPIC_API_KEY`:\n\n```bash\nexport ANTHROPIC_BASE_URL=http://127.0.0.1:11437\nexport ANTHROPIC_API_KEY=dummy\nclaude \"refactor this function\"\n```\n\nOr add to `~/.claude/settings.json`:\n\n```json\n{\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:11437\",\n \"ANTHROPIC_API_KEY\": \"dummy\"\n }\n}\n```\n\n## Use with Anthropic SDK\n\n```python\nfrom anthropic import Anthropic\nclient = Anthropic(base_url=\"http://127.0.0.1:11437\", api_key=\"dummy\")\nmsg = client.messages.create(\n model=\"claude-sonnet-4.6\",\n max_tokens=1024,\n messages=[{\"role\": \"user\", \"content\": \"Hi\"}]\n)\nprint(msg.content[0].text)\n```\n\n```typescript\nimport Anthropic from \"@anthropic-ai/sdk\";\nconst client = new Anthropic({ baseURL: \"http://127.0.0.1:11437\", apiKey: \"dummy\" });\n```\n\n## Use with curl\n\n```bash\n# Non-streaming\ncurl http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-opus-4.7\",\n \"max_tokens\": 1024,\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}]\n }'\n\n# Streaming\ncurl -N http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-sonnet-4.6\",\n \"max_tokens\": 1024,\n \"stream\": true,\n \"messages\": [{\"role\": \"user\", \"content\": \"Count to 5\"}]\n }'\n\n# With tools\ncurl http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-sonnet-4.6\",\n \"max_tokens\": 1024,\n \"messages\": [{\"role\": \"user\", \"content\": \"list files in /tmp\"}],\n \"tools\": [{\n \"name\": \"list_files\",\n \"description\": \"List files in a directory\",\n \"input_schema\": {\n \"type\": \"object\",\n \"required\": [\"path\"],\n \"properties\": {\"path\": {\"type\": \"string\"}}\n }\n }]\n }'\n```\n\n## systemd autostart\n\n`~/.config/systemd/user/kiro-proxy-anthropic.service`:\n\n```ini\n[Unit]\nDescription=Kiro → Anthropic API Proxy\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=/usr/bin/node /path/to/kiro-proxy-anthropic/index.js\nRestart=on-failure\nRestartSec=5\nEnvironment=KIRO_PROXY_PORT=11437\n\n[Install]\nWantedBy=default.target\n```\n\n```bash\nsystemctl --user daemon-reload\nsystemctl --user enable --now kiro-proxy-anthropic\n```\n\n## Token refresh\n\nKiro tokens expire ~1h; any `kiro-cli` call refreshes them:\n\n```cron\n*/45 * * * * /path/to/kiro-cli chat --no-interactive \"ping\" >/dev/null 2>&1\n```\n\n## Custom system instructions\n\nThe proxy can prepend (or append, or replace) your own system instructions\nto every request, loaded from plain markdown files. Handy when the client\ndoesn't know about your rules, or you want the same persona/rules across\nmany different clients.\n\nCopy the example config:\n\n```bash\nmkdir -p ~/.config/kiro-proxy-anthropic\ncp system-instructions.example.json ~/.config/kiro-proxy-anthropic/system-instructions.json\n# edit it, point `files[].path` at your own .md files\n```\n\nMinimal config:\n\n```json\n{\n \"enabled\": true,\n \"mode\": \"prepend\",\n \"files\": [\n { \"path\": \"/abs/path/to/your/AGENTS.md\", \"required\": true }\n ]\n}\n```\n\nModes:\n\n- `prepend` — your text before whatever the client sent (default).\n- `append` — your text after.\n- `replace` — ignore the client's system prompt entirely.\n- `off` — pass through untouched.\n\nPer-request override: send `X-Proxy-Instructions: off` (or `replace`, etc.)\nwith your request to override the configured mode for that call only.\n\nCheck what's loaded:\n\n```bash\ncurl -s http://127.0.0.1:11437/debug/instructions | jq .\n```\n\nForce a reload without restart:\n\n```bash\ncurl -s -X POST http://127.0.0.1:11437/debug/instructions/reload | jq .\n```\n\nSee `examples/` for three ready-to-use packs: `minimal/`, `coding/`, `persona/`.\n\nYour real `system-instructions.json` and any private rule files are\ngitignored by default — the repo only ships the example config and the\ngeneric example packs.\n\n## How it works\n\n```\nClaude Code / Anthropic SDK\n ↓ POST /v1/messages { messages, tools, stream }\nkiro-proxy-anthropic\n ↓ reads Kiro access_token from sqlite\n ↓ Anthropic format → Kiro conversationState\n ↓ POST https://q.us-east-1.amazonaws.com/ (Bearer auth)\nAmazon CodeWhisperer\n ↓ binary AWS Event Stream\nkiro-proxy-anthropic\n ↓ parses events into Anthropic SSE (content_block_delta, …)\nClaude Code / SDK\n```\n\nFull Kiro wire protocol documentation: [PROTOCOL.md](./PROTOCOL.md) (same as the OpenAI-compatible sibling).\n\n## Ports\n\n- `11436` — [kiro-proxy](https://github.com/bigdata2211it-web/kiro-proxy) (OpenAI `/v1/chat/completions`)\n- `11437` — **kiro-proxy-anthropic** (Anthropic `/v1/messages`)\n\nRun both simultaneously if you need both APIs.\n\n## Limits\n\n- **Vision / images**: not implemented yet\n- **Extended thinking** (Opus 4.7 adaptive thinking): not exposed as `thinking` blocks\n- **Rate limits**: whatever Kiro's credit pool allows\n- **Prompt caching blocks** (`cache_control`): accepted but not propagated (Kiro has its own server-side caching)\n\n## Environment variables\n\n| Name | Default | Description |\n|---|---|---|\n| `KIRO_PROXY_PORT` | `11437` | Listen port. |\n| `KIRO_DB_PATH` | auto | Override path to Kiro CLI SQLite DB. |\n| `KIRO_DUMP_DIR` | `os.tmpdir()` | Where 400-error debug dumps are written. |\n| `KIRO_PROXY_INSTRUCTIONS_CONFIG` | auto | Path to custom `system-instructions.json`. |\n\n## License\n\nMIT\n"}, "d2aabf5a2c79c223819e1a04caa3c8ac13f228ad": {"t": 1785771450.512851, "n": 6864, "h": "231cef44c7522499", "c": "# kiro-proxy-anthropic\n\n**Anthropic Messages API compatible** local proxy for **Kiro CLI** (Amazon CodeWhisperer / Amazon Q).\n\nDrop-in replacement for the Anthropic API — any client that normally talks to `api.anthropic.com` can talk to this proxy instead and get **free access** to Claude Opus 4.7, Sonnet 4.6, Haiku 4.5 and more, via your Kiro login.\n\n> Works with **Claude Code**, **Claude Desktop** (via `ANTHROPIC_BASE_URL`), Cursor, and any SDK/tool built on `@anthropic-ai/sdk` or the raw Messages API.\n\n## Why this exists\n\n- Kiro CLI ships with free access to Claude flagship models (Opus 4.7 with 1M context and more).\n- Kiro's wire protocol is proprietary (`AmazonCodeWhispererStreamingService.GenerateAssistantResponse`), not compatible with standard clients.\n- This proxy speaks **native Anthropic Messages API** on the outside, so you can plug it into Claude Code or Claude Desktop without forking them.\n\nThere's also a sibling OpenAI-compatible version: [kiro-proxy](https://github.com/bigdata2211it-web/kiro-proxy).\n\n## Features\n\n- ✅ `POST /v1/messages` — full Anthropic Messages API (streaming + non-streaming)\n- ✅ Proper Anthropic SSE events: `message_start`, `content_block_start/delta/stop`, `message_delta`, `message_stop`\n- ✅ **Tool use** in Anthropic native format (`tool_use`, `tool_result` blocks, `input_json_delta` streaming)\n- ✅ System prompts (string or array of content blocks)\n- ✅ Multi-turn history with Anthropic `content` arrays\n- ✅ Model aliases — `claude-opus-4-5-20250514` maps to Kiro's `claude-opus-4.5`, etc.\n- ✅ Bearer auth read directly from Kiro's local SQLite — no re-login\n\n## Models\n\n| Anthropic alias / Kiro ID | Context | Rate |\n|---|---|---|\n| `claude-opus-4.7` | 1M | 2.2x |\n| `claude-opus-4.6` | 1M | 2.2x |\n| `claude-sonnet-4.6` | 1M | 1.3x |\n| `claude-opus-4.5` | 200K | 2.2x |\n| `claude-sonnet-4.5` | 200K | 1.3x |\n| `claude-sonnet-4` | 200K | 1.3x |\n| `claude-haiku-4.5` | 200K | 0.4x |\n| `auto` | 1M | 1.0x |\n\nPlus non-Anthropic models exposed as-is: `deepseek-3.2`, `qwen3-coder-next`, `glm-5`, `minimax-m2.5`.\n\nAlso accepts Anthropic-style dated IDs (`claude-sonnet-4-5-20250514`, `claude-opus-4-20250514`) — normalized automatically.\n\n## Requirements\n\n- Node.js 18+\n- Kiro CLI logged in (`kiro-cli login`). Get it from [kiro.dev](https://kiro.dev).\n- **Linux, macOS, Windows** — all supported. Kiro SQLite path is auto-detected:\n - Linux: `$XDG_DATA_HOME/kiro-cli/data.sqlite3` or `~/.local/share/kiro-cli/data.sqlite3`\n - macOS: `~/.local/share/kiro-cli/data.sqlite3`\n - Windows: `%APPDATA%\\kiro-cli\\data.sqlite3`\n - Override with `KIRO_DB_PATH`.\n\n## Install\n\n```bash\ngit clone https://github.com/bigdata2211it-web/kiro-proxy-anthropic.git\ncd kiro-proxy-anthropic\nnpm install\n```\n\n## Run\n\n### Linux / macOS\n\n```bash\n./start.sh\n# or\nnode index.js\n```\n\n### Windows\n\n```powershell\n# PowerShell\n.\\start.ps1\n```\n\n```cmd\n:: cmd.exe\nstart.cmd\n```\n\nListens on `http://127.0.0.1:11437` (override with `KIRO_PROXY_PORT`).\n\n## Use with Claude Code\n\nClaude Code reads `ANTHROPIC_BASE_URL` and `ANTHROPIC_API_KEY`:\n\n```bash\nexport ANTHROPIC_BASE_URL=http://127.0.0.1:11437\nexport ANTHROPIC_API_KEY=dummy\nclaude \"refactor this function\"\n```\n\nOr add to `~/.claude/settings.json`:\n\n```json\n{\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:11437\",\n \"ANTHROPIC_API_KEY\": \"dummy\"\n }\n}\n```\n\n## Use with Anthropic SDK\n\n```python\nfrom anthropic import Anthropic\nclient = Anthropic(base_url=\"http://127.0.0.1:11437\", api_key=\"dummy\")\nmsg = client.messages.create(\n model=\"claude-sonnet-4.6\",\n max_tokens=1024,\n messages=[{\"role\": \"user\", \"content\": \"Hi\"}]\n)\nprint(msg.content[0].text)\n```\n\n```typescript\nimport Anthropic from \"@anthropic-ai/sdk\";\nconst client = new Anthropic({ baseURL: \"http://127.0.0.1:11437\", apiKey: \"dummy\" });\n```\n\n## Use with curl\n\n```bash\n# Non-streaming\ncurl http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-opus-4.7\",\n \"max_tokens\": 1024,\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}]\n }'\n\n# Streaming\ncurl -N http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-sonnet-4.6\",\n \"max_tokens\": 1024,\n \"stream\": true,\n \"messages\": [{\"role\": \"user\", \"content\": \"Count to 5\"}]\n }'\n\n# With tools\ncurl http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-sonnet-4.6\",\n \"max_tokens\": 1024,\n \"messages\": [{\"role\": \"user\", \"content\": \"list files in /tmp\"}],\n \"tools\": [{\n \"name\": \"list_files\",\n \"description\": \"List files in a directory\",\n \"input_schema\": {\n \"type\": \"object\",\n \"required\": [\"path\"],\n \"properties\": {\"path\": {\"type\": \"string\"}}\n }\n }]\n }'\n```\n\n## systemd autostart\n\n`~/.config/systemd/user/kiro-proxy-anthropic.service`:\n\n```ini\n[Unit]\nDescription=Kiro → Anthropic API Proxy\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=/usr/bin/node /path/to/kiro-proxy-anthropic/index.js\nRestart=on-failure\nRestartSec=5\nEnvironment=KIRO_PROXY_PORT=11437\n\n[Install]\nWantedBy=default.target\n```\n\n```bash\nsystemctl --user daemon-reload\nsystemctl --user enable --now kiro-proxy-anthropic\n```\n\n## Token refresh\n\nKiro tokens expire ~1h; any `kiro-cli` call refreshes them:\n\n```cron\n*/45 * * * * /path/to/kiro-cli chat --no-interactive \"ping\" >/dev/null 2>&1\n```\n\n## How it works\n\n```\nClaude Code / Anthropic SDK\n ↓ POST /v1/messages { messages, tools, stream }\nkiro-proxy-anthropic\n ↓ reads Kiro access_token from sqlite\n ↓ Anthropic format → Kiro conversationState\n ↓ POST https://q.us-east-1.amazonaws.com/ (Bearer auth)\nAmazon CodeWhisperer\n ↓ binary AWS Event Stream\nkiro-proxy-anthropic\n ↓ parses events into Anthropic SSE (content_block_delta, …)\nClaude Code / SDK\n```\n\nFull Kiro wire protocol documentation: [PROTOCOL.md](./PROTOCOL.md) (same as the OpenAI-compatible sibling).\n\n## Ports\n\n- `11436` — [kiro-proxy](https://github.com/bigdata2211it-web/kiro-proxy) (OpenAI `/v1/chat/completions`)\n- `11437` — **kiro-proxy-anthropic** (Anthropic `/v1/messages`)\n\nRun both simultaneously if you need both APIs.\n\n## Limits\n\n- **Vision / images**: not implemented yet\n- **Extended thinking** (Opus 4.7 adaptive thinking): not exposed as `thinking` blocks\n- **Rate limits**: whatever Kiro's credit pool allows\n- **Prompt caching blocks** (`cache_control`): accepted but not propagated (Kiro has its own server-side caching)\n\n## Environment variables\n\n| Name | Default | Description |\n|---|---|---|\n| `KIRO_PROXY_PORT` | `11437` | Listen port. |\n| `KIRO_DB_PATH` | auto | Override path to Kiro CLI SQLite DB. |\n| `KIRO_DUMP_DIR` | `os.tmpdir()` | Where 400-error debug dumps are written. |\n\n## License\n\nMIT\n"}, "251686d6f9dcf7802f57db7b748efd7a16c10c7b": {"t": 1785771451.8292294, "n": 6150, "h": "d1cbd7ae234b8289", "c": "# kiro-proxy-anthropic\n\n**Anthropic Messages API compatible** local proxy for **Kiro CLI** (Amazon CodeWhisperer / Amazon Q).\n\nDrop-in replacement for the Anthropic API — any client that normally talks to `api.anthropic.com` can talk to this proxy instead and get **free access** to Claude Opus 4.7, Sonnet 4.6, Haiku 4.5 and more, via your Kiro login.\n\n> Works with **Claude Code**, **Claude Desktop** (via `ANTHROPIC_BASE_URL`), Cursor, and any SDK/tool built on `@anthropic-ai/sdk` or the raw Messages API.\n\n## Why this exists\n\n- Kiro CLI ships with free access to Claude flagship models (Opus 4.7 with 1M context and more).\n- Kiro's wire protocol is proprietary (`AmazonCodeWhispererStreamingService.GenerateAssistantResponse`), not compatible with standard clients.\n- This proxy speaks **native Anthropic Messages API** on the outside, so you can plug it into Claude Code or Claude Desktop without forking them.\n\nThere's also a sibling OpenAI-compatible version: [kiro-proxy](https://github.com/bigdata2211it-web/kiro-proxy).\n\n## Features\n\n- ✅ `POST /v1/messages` — full Anthropic Messages API (streaming + non-streaming)\n- ✅ Proper Anthropic SSE events: `message_start`, `content_block_start/delta/stop`, `message_delta`, `message_stop`\n- ✅ **Tool use** in Anthropic native format (`tool_use`, `tool_result` blocks, `input_json_delta` streaming)\n- ✅ System prompts (string or array of content blocks)\n- ✅ Multi-turn history with Anthropic `content` arrays\n- ✅ Model aliases — `claude-opus-4-5-20250514` maps to Kiro's `claude-opus-4.5`, etc.\n- ✅ Bearer auth read directly from Kiro's local SQLite — no re-login\n\n## Models\n\n| Anthropic alias / Kiro ID | Context | Rate |\n|---|---|---|\n| `claude-opus-4.7` | 1M | 2.2x |\n| `claude-opus-4.6` | 1M | 2.2x |\n| `claude-sonnet-4.6` | 1M | 1.3x |\n| `claude-opus-4.5` | 200K | 2.2x |\n| `claude-sonnet-4.5` | 200K | 1.3x |\n| `claude-sonnet-4` | 200K | 1.3x |\n| `claude-haiku-4.5` | 200K | 0.4x |\n| `auto` | 1M | 1.0x |\n\nPlus non-Anthropic models exposed as-is: `deepseek-3.2`, `qwen3-coder-next`, `glm-5`, `minimax-m2.5`.\n\nAlso accepts Anthropic-style dated IDs (`claude-sonnet-4-5-20250514`, `claude-opus-4-20250514`) — normalized automatically.\n\n## Requirements\n\n- Node.js 18+\n- Kiro CLI logged in (`kiro-cli login`). Get it from [kiro.dev](https://kiro.dev).\n\n## Install\n\n```bash\ngit clone https://github.com/bigdata2211it-web/kiro-proxy-anthropic.git\ncd kiro-proxy-anthropic\nnpm install\nnode index.js\n```\n\nListens on `http://127.0.0.1:11437` (override with `KIRO_PROXY_PORT`).\n\n## Use with Claude Code\n\nClaude Code reads `ANTHROPIC_BASE_URL` and `ANTHROPIC_API_KEY`:\n\n```bash\nexport ANTHROPIC_BASE_URL=http://127.0.0.1:11437\nexport ANTHROPIC_API_KEY=dummy\nclaude \"refactor this function\"\n```\n\nOr add to `~/.claude/settings.json`:\n\n```json\n{\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:11437\",\n \"ANTHROPIC_API_KEY\": \"dummy\"\n }\n}\n```\n\n## Use with Anthropic SDK\n\n```python\nfrom anthropic import Anthropic\nclient = Anthropic(base_url=\"http://127.0.0.1:11437\", api_key=\"dummy\")\nmsg = client.messages.create(\n model=\"claude-sonnet-4.6\",\n max_tokens=1024,\n messages=[{\"role\": \"user\", \"content\": \"Hi\"}]\n)\nprint(msg.content[0].text)\n```\n\n```typescript\nimport Anthropic from \"@anthropic-ai/sdk\";\nconst client = new Anthropic({ baseURL: \"http://127.0.0.1:11437\", apiKey: \"dummy\" });\n```\n\n## Use with curl\n\n```bash\n# Non-streaming\ncurl http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-opus-4.7\",\n \"max_tokens\": 1024,\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}]\n }'\n\n# Streaming\ncurl -N http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-sonnet-4.6\",\n \"max_tokens\": 1024,\n \"stream\": true,\n \"messages\": [{\"role\": \"user\", \"content\": \"Count to 5\"}]\n }'\n\n# With tools\ncurl http://127.0.0.1:11437/v1/messages \\\n -H \"Content-Type: application/json\" \\\n -H \"anthropic-version: 2023-06-01\" \\\n -d '{\n \"model\": \"claude-sonnet-4.6\",\n \"max_tokens\": 1024,\n \"messages\": [{\"role\": \"user\", \"content\": \"list files in /tmp\"}],\n \"tools\": [{\n \"name\": \"list_files\",\n \"description\": \"List files in a directory\",\n \"input_schema\": {\n \"type\": \"object\",\n \"required\": [\"path\"],\n \"properties\": {\"path\": {\"type\": \"string\"}}\n }\n }]\n }'\n```\n\n## systemd autostart\n\n`~/.config/systemd/user/kiro-proxy-anthropic.service`:\n\n```ini\n[Unit]\nDescription=Kiro → Anthropic API Proxy\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=/usr/bin/node /path/to/kiro-proxy-anthropic/index.js\nRestart=on-failure\nRestartSec=5\nEnvironment=KIRO_PROXY_PORT=11437\n\n[Install]\nWantedBy=default.target\n```\n\n```bash\nsystemctl --user daemon-reload\nsystemctl --user enable --now kiro-proxy-anthropic\n```\n\n## Token refresh\n\nKiro tokens expire ~1h; any `kiro-cli` call refreshes them:\n\n```cron\n*/45 * * * * /path/to/kiro-cli chat --no-interactive \"ping\" >/dev/null 2>&1\n```\n\n## How it works\n\n```\nClaude Code / Anthropic SDK\n ↓ POST /v1/messages { messages, tools, stream }\nkiro-proxy-anthropic\n ↓ reads Kiro access_token from sqlite\n ↓ Anthropic format → Kiro conversationState\n ↓ POST https://q.us-east-1.amazonaws.com/ (Bearer auth)\nAmazon CodeWhisperer\n ↓ binary AWS Event Stream\nkiro-proxy-anthropic\n ↓ parses events into Anthropic SSE (content_block_delta, …)\nClaude Code / SDK\n```\n\nFull Kiro wire protocol documentation: [PROTOCOL.md](./PROTOCOL.md) (same as the OpenAI-compatible sibling).\n\n## Ports\n\n- `11436` — [kiro-proxy](https://github.com/bigdata2211it-web/kiro-proxy) (OpenAI `/v1/chat/completions`)\n- `11437` — **kiro-proxy-anthropic** (Anthropic `/v1/messages`)\n\nRun both simultaneously if you need both APIs.\n\n## Limits\n\n- **Vision / images**: not implemented yet\n- **Extended thinking** (Opus 4.7 adaptive thinking): not exposed as `thinking` blocks\n- **Rate limits**: whatever Kiro's credit pool allows\n- **Prompt caching blocks** (`cache_control`): accepted but not propagated (Kiro has its own server-side caching)\n\n## License\n\nMIT\n"}}}}