# kiro-rs 一个用 Rust 编写的 Anthropic Claude API 兼容代理服务,将 Anthropic API 请求转换为 Kiro API 请求。 --- ## 免责声明 本项目仅供研究使用, Use at your own risk, 使用本项目所导致的任何后果由使用人承担, 与本项目无关。 本项目与 AWS/KIRO/Anthropic/Claude 等官方无关, 本项目不代表官方立场。 ## 注意! 因 TLS 默认从 native-tls 切换至 rustls,你可能需要专门安装证书后才能配置 HTTP 代理。可通过 `config.json` 的 `tlsBackend` 切回 `native-tls`。 如果遇到请求报错, 尤其是无法刷新 token, 或者是直接返回 error request, 请尝试切换 tls 后端为 `native-tls`, 一般即可解决。 **Write Failed/会话卡死**: 如果遇到持续的 Write File / Write Failed 并导致会话不可用,参考 Issue [#22](https://github.com/hank9999/kiro.rs/issues/22) 和 [#49](https://github.com/hank9999/kiro.rs/issues/49) 的说明与临时解决方案(通常与输出过长被截断有关,可尝试调低输出相关 token 上限) ## 功能特性 - **Anthropic API 兼容**: 完整支持 Anthropic Claude API 格式 - **流式响应**: 支持 SSE (Server-Sent Events) 流式输出 - **Token 自动刷新**: 自动管理和刷新 OAuth Token - **多凭据支持**: 支持配置多个凭据,按优先级自动故障转移 - **智能重试**: 单凭据最多重试 2 次,单请求最多重试 3 次 - **凭据回写**: 多凭据格式下自动回写刷新后的 Token - **Thinking 模式**: 支持 Claude 的 extended thinking 功能 - **工具调用**: 完整支持 function calling / tool use - **WebSearch**: 内置 WebSearch 工具转换逻辑 - **多模型支持**: 支持 Sonnet、Opus、Haiku 系列模型 - **Admin 管理**: 可选的 Web 管理界面和 API,支持凭据管理、余额查询等 - **多级 Region 配置**: 支持全局和凭据级别的 Auth Region / API Region 配置 - **凭据级代理**: 支持为每个凭据单独配置 HTTP/SOCKS5 代理,优先级:凭据代理 > 全局代理 > 无代理 --- - [开始](#开始) - [1. 编译](#1-编译) - [2. 最小配置](#2-最小配置) - [3. 启动](#3-启动) - [4. 验证](#4-验证) - [Docker](#docker) - [配置详解](#配置详解) - [config.json](#configjson) - [credentials.json](#credentialsjson) - [Region 配置](#region-配置) - [代理配置](#代理配置) - [认证方式](#认证方式) - [环境变量](#环境变量) - [API 端点](#api-端点) - [标准端点 (/v1)](#标准端点-v1) - [Claude Code 兼容端点 (/cc/v1)](#claude-code-兼容端点-ccv1) - [Thinking 模式](#thinking-模式) - [工具调用](#工具调用) - [模型映射](#模型映射) - [Admin(可选)](#admin可选) - [注意事项](#注意事项) - [项目结构](#项目结构) - [技术栈](#技术栈) - [License](#license) - [致谢](#致谢) ## 开始 ### 1. 编译 > PS: 如果不想编辑可以直接前往 Release 下载二进制文件 > **前置步骤**:编译前需要先构建前端 Admin UI(用于嵌入到二进制中): > ```bash > cd admin-ui && pnpm install && pnpm build > ``` ```bash cargo build --release ``` ### 2. 最小配置 创建 `config.json`: ```json { "host": "127.0.0.1", "port": 8990, "apiKey": "sk-kiro-rs-qazWSXedcRFV123456", "region": "us-east-1" } ``` > PS: 如果你需要 Web 管理面板, 请注意配置 `adminApiKey` 创建 `credentials.json`(从 Kiro IDE 等中获取凭证信息): > PS: 可以前往 Web 管理面板配置跳过本步骤 > 如果你对凭据地域有疑惑, 请查看 [Region 配置](#region-配置) Social 认证: ```json { "refreshToken": "你的刷新token", "expiresAt": "2025-12-31T02:32:45.144Z", "authMethod": "social" } ``` IdC 认证: ```json { "refreshToken": "你的刷新token", "expiresAt": "2025-12-31T02:32:45.144Z", "authMethod": "idc", "clientId": "你的clientId", "clientSecret": "你的clientSecret" } ``` ### 3. 启动 ```bash ./target/release/kiro-rs ``` 或指定配置文件路径: ```bash ./target/release/kiro-rs -c /path/to/config.json --credentials /path/to/credentials.json ``` ### 4. 验证 ```bash curl http://127.0.0.1:8990/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: sk-kiro-rs-qazWSXedcRFV123456" \ -d '{ "model": "claude-sonnet-4-20250514", "max_tokens": 1024, "stream": true, "messages": [ {"role": "user", "content": "Hello, Claude!"} ] }' ``` ### Docker 也可以通过 Docker 启动: ```bash docker-compose up ``` 需要将 `config.json` 和 `credentials.json` 挂载到容器中,具体参见 `docker-compose.yml`。 ## 配置详解 ### config.json | 字段 | 类型 | 默认值 | 描述 | |------|------|--------|------| | `host` | string | `127.0.0.1` | 服务监听地址 | | `port` | number | `8080` | 服务监听端口 | | `apiKey` | string | - | 自定义 API Key(用于客户端认证,必配) | | `region` | string | `us-east-1` | AWS 区域 | | `authRegion` | string | - | Auth Region(用于 Token 刷新),未配置时回退到 region | | `apiRegion` | string | - | API Region(用于 API 请求),未配置时回退到 region | | `kiroVersion` | string | `0.10.0` | Kiro 版本号 | | `machineId` | string | - | 自定义机器码(64位十六进制),不定义则自动生成 | | `systemVersion` | string | 随机 | 系统版本标识 | | `nodeVersion` | string | `22.21.1` | Node.js 版本标识 | | `tlsBackend` | string | `rustls` | TLS 后端:`rustls` 或 `native-tls` | | `countTokensApiUrl` | string | - | 外部 count_tokens API 地址 | | `countTokensApiKey` | string | - | 外部 count_tokens API 密钥 | | `countTokensAuthType` | string | `x-api-key` | 外部 API 认证类型:`x-api-key` 或 `bearer` | | `proxyUrl` | string | - | HTTP/SOCKS5 代理地址 | | `proxyUsername` | string | - | 代理用户名 | | `proxyPassword` | string | - | 代理密码 | | `adminApiKey` | string | - | Admin API 密钥,配置后启用凭据管理 API 和 Web 管理界面 | 完整配置示例: ```json { "host": "127.0.0.1", "port": 8990, "apiKey": "sk-kiro-rs-qazWSXedcRFV123456", "region": "us-east-1", "tlsBackend": "rustls", "kiroVersion": "0.10.0", "machineId": "64位十六进制机器码", "systemVersion": "darwin#24.6.0", "nodeVersion": "22.21.1", "authRegion": "us-east-1", "apiRegion": "us-east-1", "countTokensApiUrl": "https://api.example.com/v1/messages/count_tokens", "countTokensApiKey": "sk-your-count-tokens-api-key", "countTokensAuthType": "x-api-key", "proxyUrl": "http://127.0.0.1:7890", "proxyUsername": "user", "proxyPassword": "pass", "adminApiKey": "sk-admin-your-secret-key" } ``` ### credentials.json 支持单对象格式(向后兼容)或数组格式(多凭据)。 #### 字段说明 | 字段 | 类型 | 描述 | |----------------|--------|---------------------------------------------| | `id` | number | 凭据唯一 ID(可选,仅用于 Admin API 管理;手写文件可不填) | | `accessToken` | string | OAuth 访问令牌(可选,可自动刷新) | | `refreshToken` | string | OAuth 刷新令牌 | | `profileArn` | string | AWS Profile ARN(可选,登录时返回) | | `expiresAt` | string | Token 过期时间 (RFC3339) | | `authMethod` | string | 认证方式:`social` 或 `idc` | | `clientId` | string | IdC 登录的客户端 ID(IdC 认证必填) | | `clientSecret` | string | IdC 登录的客户端密钥(IdC 认证必填) | | `priority` | number | 凭据优先级,数字越小越优先,默认为 0 | | `region` | string | 凭据级 Auth Region, 兼容字段 | | `authRegion` | string | 凭据级 Auth Region,用于 Token 刷新, 未配置时回退到 region | | `apiRegion` | string | 凭据级 API Region,用于 API 请求 | | `machineId` | string | 凭据级机器码(64位十六进制) | | `email` | string | 用户邮箱(可选,从 API 获取) | | `proxyUrl` | string | 凭据级代理 URL(可选,特殊值 `direct` 表示不使用代理) | | `proxyUsername`| string | 凭据级代理用户名(可选) | | `proxyPassword`| string | 凭据级代理密码(可选) | 说明: - IdC / Builder-ID / IAM 在本项目里属于同一种登录方式,配置时统一使用 `authMethod: "idc"` - 为兼容旧配置,`builder-id` / `iam` 仍可被识别,但会按 `idc` 处理 #### 单凭据格式(旧格式,向后兼容) ```json { "accessToken": "请求token,一般有效期一小时,可选", "refreshToken": "刷新token,一般有效期7-30天不等", "profileArn": "arn:aws:codewhisperer:us-east-1:111112222233:profile/QWER1QAZSDFGH", "expiresAt": "2025-12-31T02:32:45.144Z", "authMethod": "social", "clientId": "IdC 登录需要", "clientSecret": "IdC 登录需要" } ``` #### 多凭据格式(支持故障转移和自动回写) ```json [ { "refreshToken": "第一个凭据的刷新token", "expiresAt": "2025-12-31T02:32:45.144Z", "authMethod": "social", "priority": 0 }, { "refreshToken": "第二个凭据的刷新token", "expiresAt": "2025-12-31T02:32:45.144Z", "authMethod": "idc", "clientId": "xxxxxxxxx", "clientSecret": "xxxxxxxxx", "region": "us-east-2", "priority": 1, "proxyUrl": "socks5://proxy.example.com:1080", "proxyUsername": "user", "proxyPassword": "pass" }, { "refreshToken": "第三个凭据(显式不走代理)", "expiresAt": "2025-12-31T02:32:45.144Z", "authMethod": "social", "priority": 2, "proxyUrl": "direct" } ] ``` 多凭据特性: - 按 `priority` 字段排序,数字越小优先级越高(默认为 0) - 单凭据最多重试 3 次,单请求最多重试 9 次 - 自动故障转移到下一个可用凭据 - 多凭据格式下 Token 刷新后自动回写到源文件 ### Region 配置 支持多级 Region 配置,分别控制 Token 刷新和 API 请求使用的区域。 **Auth Region**(Token 刷新)优先级: `凭据.authRegion` > `凭据.region` > `config.authRegion` > `config.region` **API Region**(API 请求)优先级: `凭据.apiRegion` > `config.apiRegion` > `config.region` ### 代理配置 支持全局代理和凭据级代理,凭据级代理会覆盖该凭据产生的所有出站连接(API 请求、Token 刷新、额度查询)。 **代理优先级**:`凭据.proxyUrl` > `config.proxyUrl` > 无代理 | 凭据 `proxyUrl` 值 | 行为 | |---|---| | 具体 URL(如 `http://proxy:8080`、`socks5://proxy:1080`) | 使用凭据指定的代理 | | `direct` | 显式不使用代理(即使全局配置了代理) | | 未配置(留空) | 回退到全局代理配置 | 凭据级代理示例: ```json [ { "refreshToken": "凭据A:使用自己的代理", "authMethod": "social", "proxyUrl": "socks5://proxy-a.example.com:1080", "proxyUsername": "user_a", "proxyPassword": "pass_a" }, { "refreshToken": "凭据B:显式不走代理(直连)", "authMethod": "social", "proxyUrl": "direct" }, { "refreshToken": "凭据C:使用全局代理(或直连,取决于 config.json)", "authMethod": "social" } ] ``` ### 认证方式 客户端请求本服务时,支持两种认证方式: 1. **x-api-key Header** ``` x-api-key: sk-your-api-key ``` 2. **Authorization Bearer** ``` Authorization: Bearer sk-your-api-key ``` ### 环境变量 可通过环境变量配置日志级别: ```bash RUST_LOG=debug ./target/release/kiro-rs ``` ## API 端点 ### 标准端点 (/v1) | 端点 | 方法 | 描述 | |------|------|------| | `/v1/models` | GET | 获取可用模型列表 | | `/v1/messages` | POST | 创建消息(对话) | | `/v1/messages/count_tokens` | POST | 估算 Token 数量 | ### Claude Code 兼容端点 (/cc/v1) | 端点 | 方法 | 描述 | |------|------|------| | `/cc/v1/messages` | POST | 创建消息(缓冲模式,确保 `input_tokens` 准确) | | `/cc/v1/messages/count_tokens` | POST | 估算 Token 数量(与 `/v1` 相同) | > **`/cc/v1/messages` 与 `/v1/messages` 的区别**: > - `/v1/messages`:实时流式返回,`message_start` 中的 `input_tokens` 是估算值 > - `/cc/v1/messages`:缓冲模式,等待上游流完成后,用从 `contextUsageEvent` 计算的准确 `input_tokens` 更正 `message_start`,然后一次性返回所有事件 > - 等待期间会每 25 秒发送 `ping` 事件保活 ### Thinking 模式 支持 Claude 的 extended thinking 功能: ```json { "model": "claude-sonnet-4-20250514", "max_tokens": 16000, "thinking": { "type": "enabled", "budget_tokens": 10000 }, "messages": [...] } ``` ### 工具调用 完整支持 Anthropic 的 tool use 功能: ```json { "model": "claude-sonnet-4-20250514", "max_tokens": 1024, "tools": [ { "name": "get_weather", "description": "获取指定城市的天气", "input_schema": { "type": "object", "properties": { "city": {"type": "string"} }, "required": ["city"] } } ], "messages": [...] } ``` ## 模型映射 | Anthropic 模型 | Kiro 模型 | |----------------|-----------| | `*sonnet*`(含 4-6/4.6) | `claude-sonnet-4.6` | | `*sonnet*`(其他) | `claude-sonnet-4.5` | | `*opus*`(含 4-5/4.5) | `claude-opus-4.5` | | `*opus*`(其他) | `claude-opus-4.6` | | `*haiku*` | `claude-haiku-4.5` | ## Admin(可选) 当 `config.json` 配置了非空 `adminApiKey` 时,会启用: - **Admin API(认证同 API Key)** - `GET /api/admin/credentials` - 获取所有凭据状态 - `POST /api/admin/credentials` - 添加新凭据 - `DELETE /api/admin/credentials/:id` - 删除凭据 - `POST /api/admin/credentials/:id/disabled` - 设置凭据禁用状态 - `POST /api/admin/credentials/:id/priority` - 设置凭据优先级 - `POST /api/admin/credentials/:id/region` - 设置凭据 Region - `POST /api/admin/credentials/:id/reset` - 重置失败计数 - `GET /api/admin/credentials/:id/balance` - 获取凭据余额 - **Admin UI** - `GET /admin` - 访问管理页面(需要在编译前构建 `admin-ui/dist`) ## 注意事项 1. **凭证安全**: 请妥善保管 `credentials.json` 文件,不要提交到版本控制 2. **Token 刷新**: 服务会自动刷新过期的 Token,无需手动干预 3. **WebSearch 工具**: 只要 `tools` 中包含 `web_search`(按 name 或 type 判断),就走内置 WebSearch 处理逻辑 ## 项目结构 ``` kiro-rs/ ├── src/ │ ├── main.rs # 程序入口 │ ├── http_client.rs # HTTP 客户端构建 │ ├── token.rs # Token 计算模块 │ ├── debug.rs # 调试工具 │ ├── test.rs # 测试 │ ├── model/ # 配置和参数模型 │ │ ├── config.rs # 应用配置 │ │ └── arg.rs # 命令行参数 │ ├── anthropic/ # Anthropic API 兼容层 │ │ ├── router.rs # 路由配置 │ │ ├── handlers.rs # 请求处理器 │ │ ├── middleware.rs # 认证中间件 │ │ ├── types.rs # 类型定义 │ │ ├── converter.rs # 协议转换器 │ │ ├── stream.rs # 流式响应处理 │ │ └── websearch.rs # WebSearch 工具处理 │ ├── kiro/ # Kiro API 客户端 │ │ ├── provider.rs # API 提供者 │ │ ├── token_manager.rs # Token 管理 │ │ ├── machine_id.rs # 设备指纹生成 │ │ ├── model/ # 数据模型 │ │ │ ├── credentials.rs # OAuth 凭证 │ │ │ ├── events/ # 响应事件类型 │ │ │ ├── requests/ # 请求类型 │ │ │ ├── common/ # 共享类型 │ │ │ ├── token_refresh.rs # Token 刷新模型 │ │ │ └── usage_limits.rs # 使用额度模型 │ │ └── parser/ # AWS Event Stream 解析器 │ │ ├── decoder.rs # 流式解码器 │ │ ├── frame.rs # 帧解析 │ │ ├── header.rs # 头部解析 │ │ ├── error.rs # 错误类型 │ │ └── crc.rs # CRC 校验 │ ├── admin/ # Admin API 模块 │ │ ├── router.rs # 路由配置 │ │ ├── handlers.rs # 请求处理器 │ │ ├── service.rs # 业务逻辑服务 │ │ ├── types.rs # 类型定义 │ │ ├── middleware.rs # 认证中间件 │ │ └── error.rs # 错误处理 │ ├── admin_ui/ # Admin UI 静态文件嵌入 │ │ └── router.rs # 静态文件路由 │ └── common/ # 公共模块 │ └── auth.rs # 认证工具函数 ├── admin-ui/ # Admin UI 前端工程(构建产物会嵌入二进制) ├── tools/ # 辅助工具 ├── Cargo.toml # 项目配置 ├── config.example.json # 配置示例 ├── docker-compose.yml # Docker Compose 配置 └── Dockerfile # Docker 构建文件 ``` ## 技术栈 - **Web 框架**: [Axum](https://github.com/tokio-rs/axum) 0.8 - **异步运行时**: [Tokio](https://tokio.rs/) - **HTTP 客户端**: [Reqwest](https://github.com/seanmonstar/reqwest) - **序列化**: [Serde](https://serde.rs/) - **日志**: [tracing](https://github.com/tokio-rs/tracing) - **命令行**: [Clap](https://github.com/clap-rs/clap) ## License MIT ## 致谢 本项目的实现离不开前辈的努力: - [kiro2api](https://github.com/caidaoli/kiro2api) - [proxycast](https://github.com/aiclientproxy/proxycast) 本项目部分逻辑参考了以上的项目, 再次由衷的感谢!