[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80524":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":9,"pushedAt":9,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":15,"starSnapshotCount":15,"syncStatus":14,"lastSyncTime":29,"discoverSource":30},80524,"kiro.rs","ZyphrZero\u002Fkiro.rs","ZyphrZero","A Kiro Client in Rust",null,"Rust",163,32,1,2,0,6,20,87,19,75.22,"MIT License",false,"master",true,[],"2026-06-12 04:01:28","# kiro-rs\n\n一个用 Rust 编写的 Anthropic Claude API 兼容代理服务，将 Anthropic API 请求转换为 Kiro API 请求。\n\n---\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd>\n\u003Cb>特别感谢\u003C\u002Fb>：\u003Ca href=\"https:\u002F\u002Fco.yes.vg\u002Fregister?ref=hank9999\">YesCode\u003C\u002Fa> 为本项目提供了 AI API 额度赞助, YesCode 作为一家低调务实的 AI API 中转服务商 \u003Cbr>\n长期以来提供稳定高可用的服务, 如您有意体验, 请点击链接注册体验 → \u003Ca href=\"https:\u002F\u002Fco.yes.vg\u002Fregister?ref=hank9999\">立即访问\u003C\u002Fa>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n---\n\n#### [LINUX DO 讨论帖](https:\u002F\u002Flinux.do\u002Ft\u002Ftopic\u002F1571986)\n\n## 免责声明\n\n本项目仅供研究使用, Use at your own risk, 使用本项目所导致的任何后果由使用人承担, 与本项目无关。\n本项目与 AWS\u002FKIRO\u002FAnthropic\u002FClaude 等官方无关, 本项目不代表官方立场。\n\n## 注意！\n\n因 TLS 默认从 native-tls 切换至 rustls，你可能需要专门安装证书后才能配置 HTTP 代理。可通过 `config.json` 的 `tlsBackend` 切回 `native-tls`。\n如果遇到请求报错, 尤其是无法刷新 token, 或者是直接返回 error request, 请尝试切换 tls 后端为 `native-tls`, 一般即可解决。\n\n**Write Failed\u002F会话卡死**: 如果遇到持续的 Write File \u002F Write Failed 并导致会话不可用，参考 Issue [#22](https:\u002F\u002Fgithub.com\u002Fhank9999\u002Fkiro.rs\u002Fissues\u002F22) 和 [#49](https:\u002F\u002Fgithub.com\u002Fhank9999\u002Fkiro.rs\u002Fissues\u002F49) 的说明与临时解决方案（通常与输出过长被截断有关，可尝试调低输出相关 token 上限）\n\n## 功能特性\n\n- **Anthropic API 兼容**: 完整支持 Anthropic Claude API 格式\n- **流式响应**: 支持 SSE (Server-Sent Events) 流式输出\n- **Token 自动刷新**: 自动管理和刷新 OAuth Token\n- **多凭据支持**: 支持配置多个凭据，按优先级自动故障转移\n- **负载均衡**: 支持 `priority`（按优先级）和 `balanced`（均衡分配）两种模式\n- **智能重试**: 单凭据最多重试 3 次，单请求最多重试 9 次\n- **凭据回写**: 多凭据格式下自动回写刷新后的 Token\n- **Thinking 模式**: 支持 Claude 的 extended thinking 功能\n- **工具调用**: 完整支持 function calling \u002F tool use\n- **WebSearch**: 内置 WebSearch 工具转换逻辑\n- **多模型支持**: Sonnet \u002F Opus \u002F Haiku 全系列，**Opus 4.8 \u002F 4.7 \u002F 4.6、Sonnet 4.8 \u002F 4.6 支持 1M 上下文**，其他默认 200K\n- **Admin 管理**: 可选的 Web 管理界面和 API，支持凭据管理、余额查询等\n- **客户端 Key 分发**（v0.4.0+）：在 Admin 面板生成多把 `csk_*` 客户端 Key 分发给下游用户\u002F项目，每把 Key 独立启用\u002F禁用与计数，泄露不影响其他用户\n- **用量统计与仪表盘**（v0.4.0+）：按请求记录 token 消耗（按日滚动 JSONL），仪表盘展示时间趋势、模型分布、上游凭据贡献\n- **多级 Region 配置**: 支持全局和凭据级别的 Auth Region \u002F API Region 配置\n- **凭据级代理**: 支持为每个凭据单独配置 HTTP\u002FSOCKS5 代理，优先级：凭据代理 > 全局代理 > 无代理\n\n---\n\n- [开始](#开始)\n  - [1. 编译](#1-编译)\n  - [2. 最小配置](#2-最小配置)\n  - [3. 启动](#3-启动)\n  - [4. 验证](#4-验证)\n  - [Docker](#docker)\n    - [一、最小部署](#一最小部署)\n    - [二、首次启动获取密钥](#二首次启动获取密钥)\n    - [三、访问管理面板](#三访问管理面板)\n    - [四、定制配置](#四定制配置)\n    - [五、升级与回退](#五升级与回退)\n    - [六、备份](#六备份)\n    - [七、常见问题](#七常见问题)\n- [配置详解](#配置详解)\n  - [config.json](#configjson)\n  - [credentials.json](#credentialsjson)\n  - [Region 配置](#region-配置)\n  - [代理配置](#代理配置)\n  - [认证方式](#认证方式)\n  - [环境变量](#环境变量)\n- [API 端点](#api-端点)\n  - [标准端点 (\u002Fv1)](#标准端点-v1)\n  - [Claude Code 兼容端点 (\u002Fcc\u002Fv1)](#claude-code-兼容端点-ccv1)\n  - [Thinking 模式](#thinking-模式)\n  - [工具调用](#工具调用)\n- [模型映射](#模型映射)\n- [Admin（可选）](#admin可选)\n- [发布流程](#发布流程)\n- [注意事项](#注意事项)\n- [项目结构](#项目结构)\n- [技术栈](#技术栈)\n- [License](#license)\n- [致谢](#致谢)\n\n## 开始\n\n### 1. 编译\n\n> PS: 如果不想编辑可以直接前往 Release 下载二进制文件\n\n> **前置步骤**：编译前需要先构建前端 Admin UI（用于嵌入到二进制中）：\n> ```bash\n> cd admin-ui && bun install && bun run build\n> ```\n\n```bash\ncargo build --release\n```\n\n### 2. 最小配置\n\n创建 `config.json`：\n\n```json\n{\n   \"host\": \"127.0.0.1\",\n   \"port\": 8990,\n   \"apiKey\": \"sk-kiro-rs-qazWSXedcRFV123456\",\n   \"region\": \"us-east-1\"\n}\n```\n> PS: 如果你需要 Web 管理面板, 请注意配置 `adminApiKey`\n\n创建 `credentials.json`（从 Kiro IDE 等中获取凭证信息）：\n> PS: 可以前往 Web 管理面板配置跳过本步骤\n> 如果你对凭据地域有疑惑, 请查看 [Region 配置](#region-配置)\n\nSocial 认证：\n```json\n{\n   \"refreshToken\": \"你的刷新token\",\n   \"expiresAt\": \"2025-12-31T02:32:45.144Z\",\n   \"authMethod\": \"social\"\n}\n```\n\nIdC 认证：\n```json\n{\n   \"refreshToken\": \"你的刷新token\",\n   \"expiresAt\": \"2025-12-31T02:32:45.144Z\",\n   \"authMethod\": \"idc\",\n   \"clientId\": \"你的clientId\",\n   \"clientSecret\": \"你的clientSecret\"\n}\n```\n\n### 3. 启动\n\n```bash\n.\u002Ftarget\u002Frelease\u002Fkiro-rs\n```\n\n或指定配置文件路径：\n\n```bash\n.\u002Ftarget\u002Frelease\u002Fkiro-rs -c \u002Fpath\u002Fto\u002Fconfig.json --credentials \u002Fpath\u002Fto\u002Fcredentials.json\n```\n\n### 4. 验证\n\n```bash\ncurl http:\u002F\u002F127.0.0.1:8990\u002Fv1\u002Fmessages \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"x-api-key: sk-kiro-rs-qazWSXedcRFV123456\" \\\n  -d '{\n    \"model\": \"claude-sonnet-4-20250514\",\n    \"max_tokens\": 1024,\n    \"stream\": true,\n    \"messages\": [\n      {\"role\": \"user\", \"content\": \"Hello, Claude!\"}\n    ]\n  }'\n```\n\n### Docker\n\n> 推荐生产部署方式。镜像已预编译多架构二进制（linux\u002Famd64、linux\u002Farm64），开箱即用，无需安装 Rust 工具链。\n\n#### 一、最小部署\n\n只需要 `docker-compose.yml` + 一个空的数据目录：\n\n```bash\nmkdir -p \u002Fopt\u002Fkiro-rs\u002Fdata && cd \u002Fopt\u002Fkiro-rs\ncurl -O https:\u002F\u002Fraw.githubusercontent.com\u002FZyphrZero\u002Fkiro.rs\u002Fmaster\u002Fdocker-compose.yml\ndocker compose up -d\n```\n\n目录结构（首次启动后由容器自动生成 `config.json` \u002F `credentials.json`）：\n\n```\n\u002Fopt\u002Fkiro-rs\u002F\n├── docker-compose.yml\n└── data\u002F                          # 持久化目录，挂载为容器内 \u002Fapp\u002Fconfig\n    ├── config.json                # 自动生成，含随机 apiKey \u002F adminApiKey\n    ├── credentials.json           # 自动生成的空数组 []，通过 Admin UI 添加\n    ├── client_api_keys.json       # 客户端 Key 分发（v0.4.0+，含明文 csk）\n    ├── usage_log.YYYY-MM-DD.jsonl # 按日滚动的请求用量日志（最多保留 31 天）\n    ├── kiro_balance_cache.json    # 上游凭据余额缓存\n    └── proxy_pool.json            # 代理池（如启用）\n```\n\n`docker-compose.yml` 默认包含 `kiro-rs` 服务：\n\n- **kiro-rs**：监听 `8990`，挂载 `.\u002Fdata\u002F:\u002Fapp\u002Fconfig\u002F`，`restart: unless-stopped`\n\n#### 二、首次启动获取密钥\n\n容器首次启动会在日志里打印一次随机生成的密钥：\n\n```bash\ndocker compose logs kiro-rs | grep -E \"apiKey|adminApiKey\"\n```\n\n输出形如：\n\n```\napiKey      = sk-kiro-rs-3f8a9b2cQz...\nadminApiKey = sk-admin-x9KpRtVw...\n```\n\n- `apiKey` — 客户端调用 `\u002Fv1\u002Fmessages` 时携带（`x-api-key` 或 `Authorization: Bearer`）\n- `adminApiKey` — 登录 `http:\u002F\u002F\u003Chost>:8990\u002Fadmin` 管理界面用\n\n记下来后即可关闭日志窗口。也可以直接打开 `data\u002Fconfig.json` 查看或修改。\n\n#### 三、访问管理面板\n\n浏览器打开 `http:\u002F\u002F\u003C服务器 IP>:8990\u002Fadmin`，用 `adminApiKey` 登录。三个 Tab：\n\n- **概览** — Token 消耗趋势、按模型\u002F凭据分布\n- **凭据管理** — 添加上游 Kiro 凭据（Social \u002F IdC \u002F API Key）\n- **客户端 Key** — 分发面向下游的 `csk_*` Key\n\n#### 四、定制配置\n\n**修改端口**：编辑 `docker-compose.yml` 把 `\"8990:8990\"` 改成 `\"\u003Chost port>:8990\"`，容器内端口保持 8990 不变。\n\n**自定义镜像 tag**：通过环境变量覆盖（默认 `zyphrzero\u002Fkiro-rs:latest`）：\n\n```bash\nKIRO_RS_IMAGE=zyphrzero\u002Fkiro-rs:0.4.0 docker compose up -d\n```\n\n或写到 `.env` 文件：\n\n```\nKIRO_RS_IMAGE=zyphrzero\u002Fkiro-rs:0.4.0\n```\n\n**关闭 Redis**：v0.4.0+ 已移除 prompt cache 与 Redis 依赖，无需额外配置。如果你之前在 `data\u002Fconfig.json` 里留有 `redisUrl` \u002F `cacheDebugLogging` \u002F `cacheMaxReadRatio` 字段，可以一并删除。\n\n**配置 HTTP 代理**：在 `data\u002Fconfig.json` 加 `proxyUrl`，或在 Admin UI 的代理池里管理。\n\n#### 五、升级与回退\n\n**通过 Admin UI 在线更新**（推荐）：右上角点云朵图标 → 「更新并重启」。下载 GitHub Releases 二进制，校验 SHA256，原子替换 `\u003Cexe>`，旧版本备份到 `\u003Cexe>.backup`，进程退出后由 `restart: unless-stopped` 接管重启。失败完全无副作用，断网也能用 `\u003Cexe>.backup` 一键回退。\n\n也可以在 Admin UI 的「设置」里启用 **无人值守自动更新**（每天指定时间检查并应用新版本）。\n\n**手动升级**（拉新镜像）：\n\n```bash\ndocker compose pull && docker compose up -d\n```\n\n> 注意：手动 pull 升级与 Admin UI 在线更新使用的是不同的二进制路径——前者拉镜像里的二进制，后者下载 GitHub Releases 并写到容器卷。两种方式都安全，不会互相干扰，但建议固定使用其中一种以便追踪版本。\n\n#### 六、备份\n\n`data\u002F` 目录是唯一的状态来源，定期备份即可：\n\n```bash\ntar -czf kiro-rs-backup-$(date +%F).tar.gz \u002Fopt\u002Fkiro-rs\u002Fdata\u002F\n```\n\n> ⚠️ 备份包含明文凭据（`credentials.json`）和明文客户端 Key（`client_api_keys.json`），请加密保存或限制访问权限。\n\n恢复时把备份解压回 `\u002Fopt\u002Fkiro-rs\u002Fdata\u002F` 后 `docker compose restart` 即可。\n\n#### 七、常见问题\n\n- **首次启动看不到日志中的密钥** — 改用 `docker compose logs --tail=200 kiro-rs`，或直接看 `data\u002Fconfig.json` 里的 `apiKey` \u002F `adminApiKey` 字段\n- **想从 Docker Hub 之外的镜像源拉取** — 把 `docker-compose.yml` 里的 `image:` 改成你自己镜像源的地址（如 `ghcr.io\u002F...`、阿里云镜像加速等）\n- **Admin UI 显示 \"暂无数据\"** — 仪表盘需要至少一次请求才会有数据，先用 curl 调一次 `\u002Fv1\u002Fmessages` 即可看到趋势开始填充\n\n## 配置详解\n\n### config.json\n\n| 字段 | 类型 | 默认值 | 描述 |\n|------|------|--------|------|\n| `host` | string | `127.0.0.1` | 服务监听地址 |\n| `port` | number | `8080` | 服务监听端口 |\n| `apiKey` | string | - | 自定义 API Key（用于客户端认证，必配） |\n| `region` | string | `us-east-1` | AWS 区域 |\n| `authRegion` | string | - | Auth Region（用于 Token 刷新），未配置时回退到 region |\n| `apiRegion` | string | - | API Region（用于 API 请求），未配置时回退到 region |\n| `kiroVersion` | string | `0.9.2` | Kiro 版本号 |\n| `machineId` | string | - | 自定义机器码（64位十六进制），不定义则自动生成 |\n| `systemVersion` | string | 随机 | 系统版本标识 |\n| `nodeVersion` | string | `22.21.1` | Node.js 版本标识 |\n| `tlsBackend` | string | `rustls` | TLS 后端：`rustls` 或 `native-tls` |\n| `countTokensApiUrl` | string | - | 外部 count_tokens API 地址 |\n| `countTokensApiKey` | string | - | 外部 count_tokens API 密钥 |\n| `countTokensAuthType` | string | `x-api-key` | 外部 API 认证类型：`x-api-key` 或 `bearer` |\n| `proxyUrl` | string | - | HTTP\u002FSOCKS5 代理地址 |\n| `proxyUsername` | string | - | 代理用户名 |\n| `proxyPassword` | string | - | 代理密码 |\n| `adminApiKey` | string | - | Admin API 密钥，配置后启用凭据管理 API 和 Web 管理界面 |\n| `updateAutoApply` | boolean | `false` | 是否启用无人值守自动更新；开启后每天到 `updateAutoApplyTime` 自动从 GitHub Releases 下载新版本二进制并重启 |\n| `updateAutoApplyTime` | string | `03:00` | 自动更新触发时间（本地时区，HH:MM 24 小时制） |\n| `loadBalancingMode` | string | `priority` | 负载均衡模式：`priority`（按优先级）或 `balanced`（均衡分配） |\n| `extractThinking` | boolean | `true` | 非流式响应的 thinking 块提取。启用后 `\u003Cthinking>` 标签会被解析为独立的 `thinking` 内容块 |\n| `defaultEndpoint` | string | `ide` | 默认 Kiro 端点。凭据未显式指定 `endpoint` 时使用。可选值：`ide`（Kiro IDE）、`cli`（Amazon Q for CLI，适用于 `ksk_` 前缀的 API Key） |\n\n完整配置示例：\n\n```json\n{\n   \"host\": \"127.0.0.1\",\n   \"port\": 8990,\n   \"apiKey\": \"sk-kiro-rs-qazWSXedcRFV123456\",\n   \"region\": \"us-east-1\",\n   \"tlsBackend\": \"rustls\",\n   \"kiroVersion\": \"0.9.2\",\n   \"machineId\": \"64位十六进制机器码\",\n   \"systemVersion\": \"darwin#24.6.0\",\n   \"nodeVersion\": \"22.21.1\",\n   \"authRegion\": \"us-east-1\",\n   \"apiRegion\": \"us-east-1\",\n   \"countTokensApiUrl\": \"https:\u002F\u002Fapi.example.com\u002Fv1\u002Fmessages\u002Fcount_tokens\",\n   \"countTokensApiKey\": \"sk-your-count-tokens-api-key\",\n   \"countTokensAuthType\": \"x-api-key\",\n   \"proxyUrl\": \"http:\u002F\u002F127.0.0.1:7890\",\n   \"proxyUsername\": \"user\",\n   \"proxyPassword\": \"pass\",\n   \"adminApiKey\": \"sk-admin-your-secret-key\",\n   \"updateAutoApply\": false,\n   \"updateAutoApplyTime\": \"03:00\",\n   \"loadBalancingMode\": \"priority\",\n   \"extractThinking\": true\n}\n```\n\n### credentials.json\n\n支持单对象格式（向后兼容）或数组格式（多凭据）。\n\n#### 字段说明\n\n| 字段             | 类型     | 描述                                          |\n|----------------|--------|---------------------------------------------|\n| `id`           | number | 凭据唯一 ID（可选，仅用于 Admin API 管理；手写文件可不填）        |\n| `accessToken`  | string | OAuth 访问令牌（可选，可自动刷新）                        |\n| `refreshToken` | string | OAuth 刷新令牌                                  |\n| `profileArn`   | string | AWS Profile ARN（可选，登录时返回）                   |\n| `expiresAt`    | string | Token 过期时间 (RFC3339)                        |\n| `authMethod`   | string | 认证方式：`social` 或 `idc`                       |\n| `clientId`     | string | IdC 登录的客户端 ID（IdC 认证必填）                     |\n| `clientSecret` | string | IdC 登录的客户端密钥（IdC 认证必填）                      |\n| `priority`     | number | 凭据优先级，数字越小越优先，默认为 0                         |\n| `region`       | string | 凭据级 Auth Region, 兼容字段                       |\n| `authRegion`   | string | 凭据级 Auth Region，用于 Token 刷新, 未配置时回退到 region |\n| `apiRegion`    | string | 凭据级 API Region，用于 API 请求                    |\n| `machineId`    | string | 凭据级机器码（64位十六进制）                             |\n| `email`        | string | 用户邮箱（可选，从 API 获取）                           |\n| `proxyUrl`     | string | 凭据级代理 URL（可选，特殊值 `direct` 表示不使用代理）       |\n| `proxyUsername`| string | 凭据级代理用户名（可选）                                |\n| `proxyPassword`| string | 凭据级代理密码（可选）                                 |\n| `endpoint`     | string | 凭据级端点名称（可选，未配置时使用 `config.defaultEndpoint`）。可选值：`ide`、`cli` |\n| `kiroApiKey`   | string | Kiro API Key（`ksk_` 前缀，仅 `authMethod: \"api_key\"` 时使用） |\n\n说明：\n- IdC \u002F Builder-ID \u002F IAM 在本项目里属于同一种登录方式，配置时统一使用 `authMethod: \"idc\"`\n- 为兼容旧配置，`builder-id` \u002F `iam` 仍可被识别，但会按 `idc` 处理\n- **`ksk_` 前缀的 API Key 凭据必须将 `endpoint` 设为 `cli`**（或将 `config.defaultEndpoint` 设为 `cli`），否则请求会因协议不匹配而失败\n\n#### 单凭据格式（旧格式，向后兼容）\n\n```json\n{\n   \"accessToken\": \"请求token，一般有效期一小时，可选\",\n   \"refreshToken\": \"刷新token，一般有效期7-30天不等\",\n   \"profileArn\": \"arn:aws:codewhisperer:us-east-1:111112222233:profile\u002FQWER1QAZSDFGH\",\n   \"expiresAt\": \"2025-12-31T02:32:45.144Z\",\n   \"authMethod\": \"social\",\n   \"clientId\": \"IdC 登录需要\",\n   \"clientSecret\": \"IdC 登录需要\"\n}\n```\n\n#### 多凭据格式（支持故障转移和自动回写）\n\n```json\n[\n   {\n      \"refreshToken\": \"第一个凭据的刷新token\",\n      \"expiresAt\": \"2025-12-31T02:32:45.144Z\",\n      \"authMethod\": \"social\",\n      \"priority\": 0\n   },\n   {\n      \"refreshToken\": \"第二个凭据的刷新token\",\n      \"expiresAt\": \"2025-12-31T02:32:45.144Z\",\n      \"authMethod\": \"idc\",\n      \"clientId\": \"xxxxxxxxx\",\n      \"clientSecret\": \"xxxxxxxxx\",\n      \"region\": \"us-east-2\",\n      \"priority\": 1,\n      \"proxyUrl\": \"socks5:\u002F\u002Fproxy.example.com:1080\",\n      \"proxyUsername\": \"user\",\n      \"proxyPassword\": \"pass\"\n   },\n   {\n      \"refreshToken\": \"第三个凭据（显式不走代理）\",\n      \"expiresAt\": \"2025-12-31T02:32:45.144Z\",\n      \"authMethod\": \"social\",\n      \"priority\": 2,\n      \"proxyUrl\": \"direct\"\n   }\n]\n```\n\n多凭据特性：\n- 按 `priority` 字段排序，数字越小优先级越高（默认为 0）\n- 单凭据最多重试 3 次，单请求最多重试 9 次\n- 自动故障转移到下一个可用凭据\n- 多凭据格式下 Token 刷新后自动回写到源文件\n\n### Region 配置\n\n支持多级 Region 配置，分别控制 Token 刷新和 API 请求使用的区域。\n\n**Auth Region**（Token 刷新）优先级：\n`凭据.authRegion` > `凭据.region` > `config.authRegion` > `config.region`\n\n**API Region**（API 请求）优先级：\n`凭据.apiRegion` > `config.apiRegion` > `config.region`\n\n### 代理配置\n\n支持全局代理和凭据级代理，凭据级代理会覆盖该凭据产生的所有出站连接（API 请求、Token 刷新、额度查询）。\n\n**代理优先级**：`凭据.proxyUrl` > `config.proxyUrl` > 无代理\n\n| 凭据 `proxyUrl` 值 | 行为 |\n|---|---|\n| 具体 URL（如 `http:\u002F\u002Fproxy:8080`、`socks5:\u002F\u002Fproxy:1080`） | 使用凭据指定的代理 |\n| `direct` | 显式不使用代理（即使全局配置了代理） |\n| 未配置（留空） | 回退到全局代理配置 |\n\n凭据级代理示例：\n\n```json\n[\n   {\n      \"refreshToken\": \"凭据A：使用自己的代理\",\n      \"authMethod\": \"social\",\n      \"proxyUrl\": \"socks5:\u002F\u002Fproxy-a.example.com:1080\",\n      \"proxyUsername\": \"user_a\",\n      \"proxyPassword\": \"pass_a\"\n   },\n   {\n      \"refreshToken\": \"凭据B：显式不走代理（直连）\",\n      \"authMethod\": \"social\",\n      \"proxyUrl\": \"direct\"\n   },\n   {\n      \"refreshToken\": \"凭据C：使用全局代理（或直连，取决于 config.json）\",\n      \"authMethod\": \"social\"\n   }\n]\n```\n\n### 认证方式\n\n客户端请求本服务时，支持两种认证方式：\n\n1. **x-api-key Header**\n   ```\n   x-api-key: sk-your-api-key\n   ```\n\n2. **Authorization Bearer**\n   ```\n   Authorization: Bearer sk-your-api-key\n   ```\n\n### 环境变量\n\n可通过环境变量配置日志级别：\n\n```bash\nRUST_LOG=debug .\u002Ftarget\u002Frelease\u002Fkiro-rs\n```\n\n## API 端点\n\n### 标准端点 (\u002Fv1)\n\n| 端点 | 方法 | 描述 |\n|------|------|------|\n| `\u002Fv1\u002Fmodels` | GET | 获取可用模型列表 |\n| `\u002Fv1\u002Fmessages` | POST | 创建消息（对话） |\n| `\u002Fv1\u002Fmessages\u002Fcount_tokens` | POST | 估算 Token 数量 |\n\n### Claude Code 兼容端点 (\u002Fcc\u002Fv1)\n\n| 端点 | 方法 | 描述 |\n|------|------|------|\n| `\u002Fcc\u002Fv1\u002Fmessages` | POST | 创建消息（缓冲模式，确保 `input_tokens` 准确） |\n| `\u002Fcc\u002Fv1\u002Fmessages\u002Fcount_tokens` | POST | 估算 Token 数量（与 `\u002Fv1` 相同） |\n\n> **`\u002Fcc\u002Fv1\u002Fmessages` 与 `\u002Fv1\u002Fmessages` 的区别**：\n> - `\u002Fv1\u002Fmessages`：实时流式返回，`message_start` 中的 `input_tokens` 是估算值\n> - `\u002Fcc\u002Fv1\u002Fmessages`：缓冲模式，等待上游流完成后，用从 `contextUsageEvent` 计算的准确 `input_tokens` 更正 `message_start`，然后一次性返回所有事件\n> - 等待期间会每 25 秒发送 `ping` 事件保活\n\n### Thinking 模式\n\n支持 Claude 的 extended thinking 功能：\n\n```json\n{\n  \"model\": \"claude-sonnet-4-20250514\",\n  \"max_tokens\": 16000,\n  \"thinking\": {\n    \"type\": \"enabled\",\n    \"budget_tokens\": 10000\n  },\n  \"messages\": [...]\n}\n```\n\n### 工具调用\n\n完整支持 Anthropic 的 tool use 功能：\n\n```json\n{\n  \"model\": \"claude-sonnet-4-20250514\",\n  \"max_tokens\": 1024,\n  \"tools\": [\n    {\n      \"name\": \"get_weather\",\n      \"description\": \"获取指定城市的天气\",\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"city\": {\"type\": \"string\"}\n        },\n        \"required\": [\"city\"]\n      }\n    }\n  ],\n  \"messages\": [...]\n}\n```\n\n## 模型映射\n\n`map_model` 通过模型名中的关键词匹配（不区分大小写，支持 `4-7` 或 `4.7` 写法），转换为 Kiro 内部模型名：\n\n| Anthropic 模型（关键词） | Kiro 模型 | 上下文窗口 |\n|---|---|---|\n| `*sonnet*` 含 `4-8` \u002F `4.8` | `claude-sonnet-4.8` | **1M** |\n| `*sonnet*` 含 `4-6` \u002F `4.6` | `claude-sonnet-4.6` | **1M** |\n| `*sonnet*`（其他，默认） | `claude-sonnet-4.5` | 200K |\n| `*opus*` 含 `4-8` \u002F `4.8` | `claude-opus-4.8` | **1M** |\n| `*opus*` 含 `4-7` \u002F `4.7` | `claude-opus-4.7` | **1M** |\n| `*opus*` 含 `4-6` \u002F `4.6` | `claude-opus-4.6` | **1M** |\n| `*opus*` 含 `4-5` \u002F `4.5` | `claude-opus-4.5` | 200K |\n| `*haiku*` | `claude-haiku-4.5` | 200K |\n\n> **1M 上下文支持**：Kiro 于 2026-03-24 将 Sonnet 4.6 \u002F Opus 4.6 升级到 1M 上下文窗口，Opus 4.7 \u002F 4.8 与 Sonnet 4.8 同样为 1M。其余模型仍为 200K。本服务在收到上述模型请求时会按 1M 计算 `contextUsageEvent` 的实际 `input_tokens`，前端发起 `max_tokens` 大请求时不需要额外配置。\n>\n> 模型名带 `-thinking` 后缀（如 `claude-opus-4-8-thinking`）会自动覆写 `thinking` 配置：Opus 4.6 走 `adaptive` 模式，其他走 `enabled` 模式，`budget_tokens` 固定 20000。Opus 4.6 同时强制 `output_config.effort = \"high\"`。\n\n可用模型完整列表通过 `GET \u002Fv1\u002Fmodels` 查询。\n\n## Admin（可选）\n\n当 `config.json` 配置了非空 `adminApiKey` 时，会启用：\n\n- **凭据管理 API**\n  - `GET \u002Fapi\u002Fadmin\u002Fcredentials` - 获取所有凭据状态\n  - `POST \u002Fapi\u002Fadmin\u002Fcredentials` - 添加新凭据\n  - `DELETE \u002Fapi\u002Fadmin\u002Fcredentials\u002F:id` - 删除凭据\n  - `POST \u002Fapi\u002Fadmin\u002Fcredentials\u002F:id\u002Fdisabled` - 设置凭据禁用状态\n  - `POST \u002Fapi\u002Fadmin\u002Fcredentials\u002F:id\u002Fpriority` - 设置凭据优先级\n  - `POST \u002Fapi\u002Fadmin\u002Fcredentials\u002F:id\u002Freset` - 重置失败计数\n  - `GET \u002Fapi\u002Fadmin\u002Fcredentials\u002F:id\u002Fbalance` - 获取凭据余额\n\n- **客户端 Key 分发 API**（v0.4.0+）\n  - `GET \u002Fapi\u002Fadmin\u002Fclient-keys` - 列出所有客户端 Key（脱敏展示）\n  - `POST \u002Fapi\u002Fadmin\u002Fclient-keys` - 创建新 Key（响应里返回明文，仅此一次）\n  - `PUT \u002Fapi\u002Fadmin\u002Fclient-keys\u002F:id` - 修改名称 \u002F 描述\n  - `DELETE \u002Fapi\u002Fadmin\u002Fclient-keys\u002F:id` - 删除 Key\n  - `POST \u002Fapi\u002Fadmin\u002Fclient-keys\u002F:id\u002Fdisabled` - 启用\u002F禁用\n  - `POST \u002Fapi\u002Fadmin\u002Fclient-keys\u002F:id\u002Freset-stats` - 重置累计计数\n\n- **用量统计 API**（v0.4.0+）\n  - `GET \u002Fapi\u002Fadmin\u002Fstats\u002Foverview` - 今日 \u002F 最近 7 天概览\n  - `GET \u002Fapi\u002Fadmin\u002Fstats\u002Ftimeseries?range=24h|7d|30d` - 时序点\n  - `GET \u002Fapi\u002Fadmin\u002Fstats\u002Fby-model?range=...` - 按模型分布\n  - `GET \u002Fapi\u002Fadmin\u002Fstats\u002Fby-credential?range=...` - 按上游凭据分布\n\n- **Admin UI**（v0.4.0+ 升级为三 Tab SPA）\n  - `GET \u002Fadmin` - 概览 \u002F 凭据管理 \u002F 客户端 Key\n  - 顶栏统一工具：负载均衡切换、刷新、在线更新、Key 管理（修改 Admin Key 与业务 API Key）\n\n### 在线更新\n\nAdmin UI 顶部的「镜像在线更新」入口支持：\n\n- 一键从 GitHub Releases 下载新版本二进制（带 SHA256 校验），原子替换当前 `kiro-rs`，旧版本备份到 `\u003Cexe>.backup`\n- 替换完成后进程主动退出，由 `docker-compose.yml` 里的 `restart: unless-stopped` 接管重启，新二进制随之生效\n- 失败完全无副作用：网络断、校验不通过都不会动到正在运行的旧 `kiro-rs`\n- 「回退到上一版本」从 `\u003Cexe>.backup` 恢复并重启进程，断网也能用\n- 可开启「无人值守自动更新」：每天到指定时间检查并应用新版本\n- 自动检查 Docker Hub tag 与 GitHub Releases，发现新版本时在工具栏图标上显示红点提醒\n\n容器部署只需要把 `data\u002F` 目录挂进容器，不再需要 docker socket 或 compose 文件透传：\n\n```yaml\nvolumes:\n  - .\u002Fdata\u002F:\u002Fapp\u002Fconfig\u002F\n```\n\n镜像和版本号都从 Docker Hub 取（`hub.docker.com\u002Fr\u002F\u003Cowner>\u002Fkiro-rs`），项目 GitHub Actions 在每次发布时会自动推送到 Docker Hub 并发布对应平台二进制到 GitHub Releases。\n\n## 发布流程\n\n正式发布使用 `v*` git tag 触发 GitHub Actions 的 **Release** workflow：\n\n1. 修改 `Cargo.toml` 中的 `package.version`，例如 `0.1.0`。\n2. 合并到 `master` 后，创建并推送同版本 tag，例如 `v0.1.0`。\n\n也可以在 GitHub Actions 页面手动运行 `Release`，输入同一个版本号（可写 `0.1.0` 或 `v0.1.0`）。\n\n该 workflow 会自动完成：\n\n- 校验 tag\u002Finput 版本和 `Cargo.toml` 一致，避免 tag、二进制和镜像版本错位\n- 构建 Windows、Linux、macOS 多平台二进制并打包\n- 发布 Docker Hub 多架构镜像：\n  - `zyphrzero\u002Fkiro-rs:\u003Cversion>`\n  - `zyphrzero\u002Fkiro-rs:latest`\n- 创建 GitHub Release，并上传二进制包和 `SHA256SUMS.txt`\n\n`Build Artifacts` 和 `Build and Push Docker Hub Images` workflow 仍会在 `master` push 上生成 beta 构建，也可以手动输入版本号运行；正式发布入口以 `Release` workflow 为准，避免重复构建和重复推送镜像。`master` 的 beta 镜像只更新 `beta` 标签，不会覆盖 `latest`。\n\n> 第一次切到 Docker Hub 发布前，先在仓库 Settings → Secrets and variables → Actions 添加 `DOCKERHUB_USERNAME` 和 `DOCKERHUB_TOKEN`（Docker Hub Access Token）。\n\n## 注意事项\n\n1. **凭证安全**: 请妥善保管 `credentials.json` 文件，不要提交到版本控制\n2. **Token 刷新**: 服务会自动刷新过期的 Token，无需手动干预\n3. **WebSearch 工具**: 当 `tools` 列表仅包含一个 `web_search` 工具时，会走内置 WebSearch 转换逻辑\n\n## 项目结构\n\n```\nkiro-rs\u002F\n├── src\u002F\n│   ├── main.rs                 # 程序入口\n│   ├── http_client.rs          # HTTP 客户端构建\n│   ├── token.rs                # Token 计算模块\n│   ├── debug.rs                # 调试工具\n│   ├── test.rs                 # 测试\n│   ├── model\u002F                  # 配置和参数模型\n│   │   ├── config.rs           # 应用配置\n│   │   └── arg.rs              # 命令行参数\n│   ├── anthropic\u002F              # Anthropic API 兼容层\n│   │   ├── router.rs           # 路由配置\n│   │   ├── handlers.rs         # 请求处理器\n│   │   ├── middleware.rs       # 认证中间件\n│   │   ├── types.rs            # 类型定义\n│   │   ├── converter.rs        # 协议转换器\n│   │   ├── stream.rs           # 流式响应处理\n│   │   └── websearch.rs        # WebSearch 工具处理\n│   ├── kiro\u002F                   # Kiro API 客户端\n│   │   ├── provider.rs         # API 提供者\n│   │   ├── token_manager.rs    # Token 管理\n│   │   ├── machine_id.rs       # 设备指纹生成\n│   │   ├── model\u002F              # 数据模型\n│   │   │   ├── credentials.rs  # OAuth 凭证\n│   │   │   ├── events\u002F         # 响应事件类型\n│   │   │   ├── requests\u002F       # 请求类型\n│   │   │   ├── common\u002F         # 共享类型\n│   │   │   ├── token_refresh.rs # Token 刷新模型\n│   │   │   └── usage_limits.rs # 使用额度模型\n│   │   └── parser\u002F             # AWS Event Stream 解析器\n│   │       ├── decoder.rs      # 流式解码器\n│   │       ├── frame.rs        # 帧解析\n│   │       ├── header.rs       # 头部解析\n│   │       ├── error.rs        # 错误类型\n│   │       └── crc.rs          # CRC 校验\n│   ├── admin\u002F                  # Admin API 模块\n│   │   ├── router.rs           # 路由配置\n│   │   ├── handlers.rs         # 请求处理器\n│   │   ├── service.rs          # 业务逻辑服务\n│   │   ├── types.rs            # 类型定义\n│   │   ├── middleware.rs       # 认证中间件\n│   │   └── error.rs            # 错误处理\n│   ├── admin_ui\u002F               # Admin UI 静态文件嵌入\n│   │   └── router.rs           # 静态文件路由\n│   └── common\u002F                 # 公共模块\n│       └── auth.rs             # 认证工具函数\n├── admin-ui\u002F                   # Admin UI 前端工程（构建产物会嵌入二进制）\n├── tools\u002F                      # 辅助工具\n├── Cargo.toml                  # 项目配置\n├── config.example.json         # 配置示例\n├── docker-compose.yml          # Docker Compose 配置\n└── Dockerfile                  # Docker 构建文件\n```\n\n## 技术栈\n\n- **Web 框架**: [Axum](https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Faxum) 0.8\n- **异步运行时**: [Tokio](https:\u002F\u002Ftokio.rs\u002F)\n- **HTTP 客户端**: [Reqwest](https:\u002F\u002Fgithub.com\u002Fseanmonstar\u002Freqwest)\n- **序列化**: [Serde](https:\u002F\u002Fserde.rs\u002F)\n- **日志**: [tracing](https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Ftracing)\n- **命令行**: [Clap](https:\u002F\u002Fgithub.com\u002Fclap-rs\u002Fclap)\n\n## License\n\nMIT\n\n## 致谢\n\n本项目的实现离不开前辈的努力:  \n - [kiro2api](https:\u002F\u002Fgithub.com\u002Fcaidaoli\u002Fkiro2api)\n - [proxycast](https:\u002F\u002Fgithub.com\u002Faiclientproxy\u002Fproxycast)\n\n本项目部分逻辑参考了以上的项目, 再次由衷的感谢!\n\n## 社区支持\n\n欢迎到 [linux.do](https:\u002F\u002Flinux.do\u002F) 交流、分享和反馈。\n\n\n","kiro.rs 是一个用 Rust 编写的 Anthropic Claude API 兼容代理服务，能够将 Anthropic API 请求转换为 Kiro API 请求。其核心功能包括支持流式响应、自动刷新 OAuth Token、多凭据管理及故障转移、负载均衡、智能重试机制等。此外，它还提供了可选的 Web 管理界面和 API 用于凭据管理和用量统计。此项目适用于需要与 Anthropic Claude API 进行交互但希望通过 Kiro API 中转以获得更稳定或成本效益更高的场景，如开发聊天机器人、自然语言处理应用等。","2026-06-11 04:01:06","CREATED_QUERY"]