Model requests
Goes toKiro, with your prompts
Each request goes to Kiro with the account that serves it. The log records counts, lengths and hashes, never prompts, tool arguments or credentials.
A gateway on your own machine. It signs in to AWS Kiro and serves your accounts as OpenAI Responses and Anthropic Messages, so Codex CLI, Claude Code and other agents need only a base URL and a key.
export KP=http://127.0.0.1:8787/v1 KEY=$KIRO_GATEWAY_API_KEYcurl -s $KP/responses -H "Authorization: Bearer $KEY" --json '{ "model": "gpt-5.6-sol", "store": false, "input": "Reply with exactly: KIRO_OK"}' | jq -r '.output[-1].content[0].text'KIRO_OKcurl -s $KP/messages -H "x-api-key: $KEY" --json '{ "model": "claude-opus-5-5", "max_tokens": 1024, "messages": [{"role": "user", "content": "Reply with exactly: KIRO_OK"}]}' | jq -r '.content[0].text'KIRO_OKWeb search and the Chat Completions route ship switched off. Everything else works once an account is signed in.
Streaming and non-streaming responses with tools, images and reasoning effort, plus stored responses you can retrieve, list and continue.
Messages with thinking, tools and images, and a token estimate on /v1/messages/count_tokens.
The hosted web search tool of both APIs, run by kiro-provider through the account serving the request, with citations in the answer.
The older OpenAI route, for clients that have nothing newer. It answers only when enable_legacy_chat_completions is on.
Device-code login for AWS Builder ID and IAM Identity Center. kiro-provider finds the Kiro profile itself, so Kiro CLI is not involved.
Requests go to the least busy eligible account. An exhausted account sits out until Kiro reports new quota.
Access tokens are renewed before they expire and usage is refreshed in the background. accounts list shows each account's state.
A custom model_provider with wire_api = "responses", including model and effort switching in /model.
The kiroclaude launcher points Claude Code at the gateway without editing your Claude settings.
One provider entry in each agent's own config file, with the few settings each of them needs.
Zuno's own Responses transport, with session routing from its metadata.
GET /v1/models lists the models your signed-in accounts can use, with the effort levels Codex's model picker reads.
A systemd user service on Linux or a scheduled task on Windows, with health and readiness checks for automation.
GET /health and GET /ready for service managers, and a JSON log of counts, enums and hashes with no prompts or credentials.
self-update replaces a standalone binary only after it matches the release's SHA256SUMS.
curl -fsSL https://raw.githubusercontent.com/sunerpy/kiro-provider/main/scripts/install.sh | sh
Or the PowerShell script on Windows, or bun add -g @sunerpy/kiro-provider.
kiro-provider login
Opens a device-code sign-in for AWS Builder ID. Add --start-url for IAM Identity Center.
kiro-provider serve
Put a private key in api_keys in config.json first; the gateway refuses to start without one.
http://127.0.0.1:8787/v1
That is the base URL for Codex CLI, OpenCode, Pi, Zuno and the OpenAI SDKs. Claude Code, Crush and the Anthropic SDKs take http://127.0.0.1:8787, without /v1.
Responses and Messages are served by one process from one pool of accounts. A Responses request that Kiro's own Responses operation can take unchanged goes there; anything else, store: false included, is converted by kiro-provider itself. When neither path can keep a field, the request fails with an error that names it instead of quietly dropping it.
| Route | Speaks | Default |
|---|---|---|
POST /v1/responses | OpenAI Responses | On |
POST /v1/messages | Anthropic Messages | On |
POST /v1/messages/count_tokens | Anthropic token estimate | On |
GET /v1/models | Model list | On |
POST /v1/chat/completions | OpenAI Chat Completions | Off until enabled |
Every route except /health asks for one of your api_keys, sent as Authorization Bearer or x-api-key.
Codex CLI, Pi and Zuno speak Responses; Claude Code, OpenCode and Crush speak Messages. Each is configured with a base URL and one of your keys, with no plugin and no patched client. The launchers add a separate command, kirocodex or kiroclaude, next to the one you already have.
| Client | API | Set up with |
|---|---|---|
| Codex CLI | Responses | A model_provider in config.toml |
| Claude Code | Messages | The kiroclaude launcher |
| OpenCode | Messages | A provider in opencode.json |
| Pi | Responses | A provider in models.json |
| Crush | Messages | A provider in crush.json |
| Zuno | Responses | A provider in Zuno's config |
| OpenAI and Anthropic SDKs | Responses or Messages | A base URL and an API key |
With web_search_enabled on, kiro-provider runs each API's hosted search tool itself, through Kiro's search and the account that serves the request. The answer comes back in the shape that API defines, with the search results and citations a client expects. It is off by default.
| API | Tool | The answer carries |
|---|---|---|
| Responses | web_search | web_search_call items and url_citation annotations |
| Messages | web_search_20250305 | web_search_tool_result blocks and cited text |
Searches run with gpt-5.6-sol or claude-opus-5.5, on accounts whose Kiro profile is in us-east-1. Other models are refused before anything runs.
Every release has a standalone binary for each platform below, a SHA256SUMS file and a build attestation.
| Platform | Release asset | Installer |
|---|---|---|
| Linux x64Available | kiro-provider-linux-x64 | install.sh |
| Linux ARM64Available | kiro-provider-linux-arm64 | install.sh |
| macOS IntelAvailable | kiro-provider-darwin-x64 | install.sh |
| macOS Apple SiliconAvailable | kiro-provider-darwin-arm64 | install.sh |
| Windows x64Available | kiro-provider-windows-x64.exe | install.ps1 |
The npm package @sunerpy/kiro-provider uses Bun's APIs. Install it with Bun; it does not run under Node.js or npx.
kiro-provider talks to AWS for your accounts and to GitHub when you ask it about updates.
Goes toKiro, with your prompts
Each request goes to Kiro with the account that serves it. The log records counts, lengths and hashes, never prompts, tool arguments or credentials.
Goes toAWS sign-in and Kiro
Sign-in, token renewal and usage checks. Tokens stay in accounts.db in your config directory, readable by your user only.
Goes toGitHub Releases
Only kiro-provider --version --check and self-update contact GitHub. The gateway itself never does.
curl -fsSL https://raw.githubusercontent.com/sunerpy/kiro-provider/main/scripts/install.sh | shirm https://raw.githubusercontent.com/sunerpy/kiro-provider/main/scripts/install.ps1 | iexbun add -g @sunerpy/kiro-providerThe scripts check the binary against the release's SHA256SUMS before installing it. The install guide covers pinning a version, building from source and removing kiro-provider.
Bug reports and feature requests go to GitHub Issues. kiro-provider is MIT-licensed and is not an AWS product.