[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-76158":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":15,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":22,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":16,"starSnapshotCount":16,"syncStatus":18,"lastSyncTime":28,"discoverSource":29},76158,"kimi2api","chopper1026\u002Fkimi2api","chopper1026","Kimi AI 网页版反代服务，把网页版的会话聊天能力转换为OpenAI兼容接口。","",null,"Python",182,45,117,3,0,1,2,49,52.89,"MIT License",false,"main",[],"2026-06-12 04:01:20","# Kimi2API\n\nKimi2API 是一个基于 Kimi Web 协议封装的 OpenAI 兼容 API 服务。它把 Kimi 的聊天能力转换成常见的 `\u002Fv1` 接口，方便 OpenAI SDK、LobeChat、NextChat、one-api 风格客户端接入。\n_（简单来说，这就是用来玩酒馆的，没有做toolcall之类编程方向的优化，因为2api的能力懂得都懂）_\n\n项目内置 React 管理面板，支持 Kimi 账号池、对外 API Key、请求日志、运行概览和基础运维操作。\n\n> 说明：本项目不是 Moonshot 官方 API，也不是完整 OpenAI API 实现。它只实现当前代码中列出的兼容接口，实际可用模型和能力取决于 Kimi Web 返回的数据。\n\n## 界面预览\n\n以下截图使用脱敏演示数据，仅用于展示管理面板布局。点击下方宫格可在当前 README 中展开大图，再次点击可收起。\n\n\u003Cdetails>\n  \u003Csummary>\n    \u003Cstrong>点击展开 \u002F 收起界面大图\u003C\u002Fstrong>\n    \u003Cbr>\u003Cbr>\n    \u003Ctable>\n      \u003Ctr>\n        \u003Ctd align=\"center\" width=\"33%\">\n          \u003Cpicture>\n            \u003Cimg src=\"docs\u002Fimages\u002Fadmin-login.png\" alt=\"登录页\" width=\"260\">\n          \u003C\u002Fpicture>\n          \u003Cbr>\n          \u003Csub>登录页\u003C\u002Fsub>\n        \u003C\u002Ftd>\n        \u003Ctd align=\"center\" width=\"33%\">\n          \u003Cpicture>\n            \u003Cimg src=\"docs\u002Fimages\u002Fadmin-dashboard.png\" alt=\"概览\" width=\"260\">\n          \u003C\u002Fpicture>\n          \u003Cbr>\n          \u003Csub>概览\u003C\u002Fsub>\n        \u003C\u002Ftd>\n        \u003Ctd align=\"center\" width=\"33%\">\n          \u003Cpicture>\n            \u003Cimg src=\"docs\u002Fimages\u002Fadmin-accounts.png\" alt=\"账号管理\" width=\"260\">\n          \u003C\u002Fpicture>\n          \u003Cbr>\n          \u003Csub>账号管理\u003C\u002Fsub>\n        \u003C\u002Ftd>\n      \u003C\u002Ftr>\n      \u003Ctr>\n        \u003Ctd align=\"center\" width=\"33%\">\n          \u003Cpicture>\n            \u003Cimg src=\"docs\u002Fimages\u002Fadmin-api-keys.png\" alt=\"API Keys\" width=\"260\">\n          \u003C\u002Fpicture>\n          \u003Cbr>\n          \u003Csub>API Keys\u003C\u002Fsub>\n        \u003C\u002Ftd>\n        \u003Ctd align=\"center\" width=\"33%\">\n          \u003Cpicture>\n            \u003Cimg src=\"docs\u002Fimages\u002Fadmin-request-logs.png\" alt=\"请求日志\" width=\"260\">\n          \u003C\u002Fpicture>\n          \u003Cbr>\n          \u003Csub>请求日志\u003C\u002Fsub>\n        \u003C\u002Ftd>\n        \u003Ctd width=\"33%\">\u003C\u002Ftd>\n      \u003C\u002Ftr>\n    \u003C\u002Ftable>\n  \u003C\u002Fsummary>\n\n### 登录页\n\n\u003Cpicture>\n  \u003Cimg src=\"docs\u002Fimages\u002Fadmin-login.png\" alt=\"登录页大图\" width=\"960\">\n\u003C\u002Fpicture>\n\n### 概览\n\n\u003Cpicture>\n  \u003Cimg src=\"docs\u002Fimages\u002Fadmin-dashboard.png\" alt=\"概览大图\" width=\"960\">\n\u003C\u002Fpicture>\n\n### 账号管理\n\n\u003Cpicture>\n  \u003Cimg src=\"docs\u002Fimages\u002Fadmin-accounts.png\" alt=\"账号管理大图\" width=\"960\">\n\u003C\u002Fpicture>\n\n### API Keys\n\n\u003Cpicture>\n  \u003Cimg src=\"docs\u002Fimages\u002Fadmin-api-keys.png\" alt=\"API Keys 大图\" width=\"960\">\n\u003C\u002Fpicture>\n\n### 请求日志\n\n\u003Cpicture>\n  \u003Cimg src=\"docs\u002Fimages\u002Fadmin-request-logs.png\" alt=\"请求日志大图\" width=\"960\">\n\u003C\u002Fpicture>\n\u003C\u002Fdetails>\n\n## 功能概览\n\n- OpenAI 兼容接口：Models、Chat Completions、Legacy Completions、Responses API。\n- 支持流式和非流式输出。\n- 支持 Kimi thinking、search、agent 相关模型能力和兼容参数。\n- 支持多个 Kimi 账号组成账号池，按健康状态、并发占用和轮询策略调度。\n- 支持 refresh token 自动换取 access token，并把换到的 access token 缓存到本地，服务重启后可复用。\n- 支持 access token 账号，但 access token 被上游拒绝后需要手动更新或改用 refresh token。\n- 支持账号级启用\u002F禁用、并发上限、最小请求间隔、刷新、验证、删除。\n- 支持本服务对外 API Key 管理、请求计数和分页展示。\n- 支持 `\u002Fv1\u002F*` 请求日志、筛选、详情、错误摘要、实际 Kimi 账号记录和 curl 模板。\n- 管理端支持登录、CSRF 校验、登录失败限速、签名 Cookie 会话。\n- 支持 Docker Compose 部署，数据通过 `data\u002F` 持久化。\n\n## 公开接口\n\n根路径 `\u002F` 不返回服务信息，避免公网部署时暴露服务指纹和接口枚举。\n\n| 方法 | 路径 | 说明 |\n| --- | --- | --- |\n| `GET` | `\u002Fhealthz` | 健康检查 |\n| `GET` | `\u002Fadmin` | 管理面板入口 |\n\nOpenAI 兼容接口：\n\n| 方法 | 路径 | 说明 |\n| --- | --- | --- |\n| `GET` | `\u002Fv1\u002Fmodels` | 模型列表 |\n| `GET` | `\u002Fv1\u002Fmodels\u002F{model_id}` | 模型详情 |\n| `POST` | `\u002Fv1\u002Fchat\u002Fcompletions` | Chat Completions |\n| `POST` | `\u002Fv1\u002Fcompletions` | Legacy Completions |\n| `POST` | `\u002Fv1\u002Fresponses` | Responses API |\n\n`\u002Fv1\u002F*` 接口始终要求有效 API Key。可以通过 `OPENAI_API_KEY` 预置一个默认 Key，也可以登录管理面板创建 Key。如果系统里没有任何 Key，所有 OpenAI 兼容接口都会返回 `401`。\n\n```http\nAuthorization: Bearer your_api_key_here\n```\n\n## 快速开始\n\n### 1. 准备环境\n\n推荐使用 Python 3.12 和 [uv](https:\u002F\u002Fgithub.com\u002Fastral-sh\u002Fuv)。`pyproject.toml` 声明最低 Python 版本为 3.8。\n\n```bash\nuv sync\ncp .env.example .env\n```\n\n编辑 `.env`，至少填写管理端密码：\n\n```env\nADMIN_PASSWORD=your_admin_password\n```\n\n本地 HTTP 访问管理面板时建议设置：\n\n```env\nSECURE_COOKIES=false\n```\n\n`KIMI_TOKEN` 可以在 `.env` 中预置，也可以启动后登录 `\u002Fadmin` 在账号管理中新增。`OPENAI_API_KEY` 不填时，启动后需要先在管理面板创建 API Key，再调用 `\u002Fv1\u002F*`。\n\n### 2. 启动服务\n\n```bash\nuv run python run.py\n```\n\n默认监听：\n\n```text\nhttp:\u002F\u002F127.0.0.1:8000\n```\n\n管理面板：\n\n```text\nhttp:\u002F\u002F127.0.0.1:8000\u002Fadmin\n```\n\n### 3. Docker Compose 部署（推荐）\n\n```bash\n# 拉取代码\ngit clone https:\u002F\u002Fgithub.com\u002Fchopper1026\u002Fkimi2api.git\ncd kimi2api\u002F\n# 创建data\u002F\nmkdir data\n# 复制一份env配置，最简化配置只需要把ADMIN_PASSWORD配置好就可以直接启动了\ncp .env.example .env\n# 编辑 .env 后启动\ndocker compose up -d\n```\n\n**更新版本**\n```bash\ncd kimi2api\u002F\n# 拉取最新代码\ngit pull\n# 重新构建\ndocker compose up -d --build\n```\n\n## 获取kimi token\n\n自行登录官网在storage中获取access_token或refresh token\n\n## 配置项\n\n| 变量 | 必填 | 默认值 | 说明 |\n| --- | --- | --- | --- |\n| `KIMI_TOKEN` | 否 | 空 | 初始 Kimi token。无账号池文件时会导入为第一个账号；支持 refresh token 和 JWT access token |\n| `KIMI_API_BASE` | 否 | `https:\u002F\u002Fwww.kimi.com` | Kimi Web 服务地址 |\n| `KIMI_ACCEPT_LANGUAGE` | 否 | `zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7` | Kimi Web 出站请求语言偏好 |\n| `KIMI_MAX_CONCURRENCY` | 否 | `2` | 新账号默认并发上限 |\n| `KIMI_MIN_REQUEST_INTERVAL` | 否 | `0.5` | 新账号默认最小请求启动间隔，单位秒 |\n| `TIMEOUT` | 否 | `120` | 上游请求超时时间，单位秒 |\n| `MODEL` | 否 | 空 | 默认模型；为空时使用 Kimi Web 模型目录默认项，填写时必须是 `\u002Fv1\u002Fmodels` 返回的模型 ID |\n| `OPENAI_API_KEY` | 否 | 空 | 本服务对外暴露的默认 API Key；为空时需在管理面板创建 Key |\n| `ADMIN_PASSWORD` | 是 | 空 | 管理面板密码；为空时管理面板不可用 |\n| `SESSION_SECRET` | 否 | 自动生成 | 管理面板 Cookie 签名密钥；为空时写入 `data\u002F.session_secret` |\n| `SECURE_COOKIES` | 否 | `true` | Cookie 是否带 `Secure` 标记；本地 HTTP 调试设为 `false` |\n| `HOST` | 否 | `127.0.0.1` | 监听地址 |\n| `PORT` | 否 | `8000` | 监听端口 |\n| `RELOAD` | 否 | `false` | 是否启用 uvicorn 热重载 |\n| `DATA_DIR` | 否 | `data` | 本地数据目录 |\n| `TIMEZONE` | 否 | `Asia\u002FShanghai` | 管理面板时间显示时区 |\n| `TZ` | 否 | `Asia\u002FShanghai` | Docker 容器系统时区，建议与 `TIMEZONE` 保持一致 |\n| `REQUEST_LOG_RETENTION` | 否 | `1000` | 请求日志保留最近多少条 |\n| `REQUEST_LOG_BODY_LIMIT` | 否 | `1MB` | 单条请求正文保存上限，支持 `512KB`、`1MB`、`2MiB` 等写法，超过会截断 |\n\n## Kimi 账号池\n\n账号池文件存储在：\n\n```text\ndata\u002Fkimi_accounts.json\n```\n\n文件权限会设置为 `0600`。旧版本的 `data\u002Fkimi_token.json` 和 `.env` 中的 `KIMI_TOKEN` 会在无账号池文件时自动迁移或导入为第一个账号，默认名为 `Kimi 1`。\n\n每个账号保存：\n\n- `id`\n- `name`\n- `raw_token`\n- `enabled`\n- `max_concurrency`\n- `min_interval_seconds`\n- `device_id`\n- refresh token 换出的 `cached_access_token` 和过期时间\n- 创建\u002F更新时间\n\n管理端和 API 响应只返回脱敏 token，不返回完整 token。\n\n### Token 类型\n\n- `refresh token`：推荐使用。服务会在需要时换取 access token，并把 access token 缓存到账号池文件，重启后优先复用缓存。\n- `access token`：短期可用。本地可以从 JWT `exp` 解析到期时间，但 Kimi 上游仍可能提前吊销或拒绝；验证结果以上游返回为准。\n\n如果 access token 账号被上游返回 `401\u002F403`，账号会标记为异常，避免继续被调度。refresh token 刷新失败同样会标记异常，需要手动刷新、验证或替换 token。\n\n### 调度策略\n\n每个账号有独立的 token manager、device id、并发限制和最小请求间隔。\n\n请求选择账号时：\n\n1. 只考虑启用、健康、未冷却、未超过并发上限的账号。\n2. 优先选择 `in_flight` 最少的账号。\n3. 同分时按轮询顺序分配。\n\n失败处理：\n\n- `429`：按 `Retry-After` 冷却；无该头时默认冷却 60 秒。\n- `5xx`、网络错误、流中断：默认冷却 30 秒。\n- `401\u002F403`、refresh 失败：标记异常，等待手动刷新、验证或替换。\n- 非流式请求在尚未返回响应时可切换到其他健康账号重试。\n- 流式请求只在尚未向客户端输出任何 chunk 前允许换号；输出后不做中途切换。\n\n## 管理面板\n\n访问 `\u002Fadmin` 后使用 `ADMIN_PASSWORD` 登录。当前模块：\n\n| 模块 | 说明 |\n| --- | --- |\n| 概览 | 运行时间、账号池健康、API Key 数量、最近 24 小时请求统计、日志策略、快捷操作 |\n| 账号管理 | 多 Kimi 账号列表，新增、编辑、删除、启用\u002F禁用、刷新、验证、并发和间隔设置；默认每页 5 条 |\n| API Keys | 创建、复制、删除本服务对外 API Key，查看创建时间、上次使用和请求数；默认每页 10 条 |\n| 请求日志 | 筛选 `\u002Fv1\u002F*` 请求，查看状态、模型、API Key、Kimi 账号、耗时、错误摘要和详情 |\n\n请求日志默认每页 20 条。详情页会展示请求\u002F响应头、请求正文、解析后的响应文本、推理内容、流式原始 SSE 和 curl 模板。\n\n## 使用示例\n\n### OpenAI SDK\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI(\n    api_key=\"your_api_key_here\",\n    base_url=\"http:\u002F\u002F127.0.0.1:8000\u002Fv1\",\n)\n\nresp = client.chat.completions.create(\n    model=\"kimi-k2.6\",\n    messages=[\n        {\"role\": \"system\", \"content\": \"你是一个有帮助的助手。\"},\n        {\"role\": \"user\", \"content\": \"请用一句话介绍 Kimi2API。\"},\n    ],\n)\n\nprint(resp.choices[0].message.content)\n```\n\n### Chat Completions\n\n```bash\ncurl http:\u002F\u002F127.0.0.1:8000\u002Fv1\u002Fchat\u002Fcompletions \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Authorization: Bearer your_api_key_here\" \\\n  -d '{\n    \"model\": \"kimi-k2.6\",\n    \"messages\": [\n      {\"role\": \"user\", \"content\": \"你好\"}\n    ]\n  }'\n```\n\n### 流式输出\n\n```bash\ncurl http:\u002F\u002F127.0.0.1:8000\u002Fv1\u002Fchat\u002Fcompletions \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Authorization: Bearer your_api_key_here\" \\\n  -d '{\n    \"model\": \"kimi-k2.6-thinking\",\n    \"stream\": true,\n    \"messages\": [\n      {\"role\": \"user\", \"content\": \"解释一下快速排序\"}\n    ]\n  }'\n```\n\n### Responses API\n\n```bash\ncurl http:\u002F\u002F127.0.0.1:8000\u002Fv1\u002Fresponses \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Authorization: Bearer your_api_key_here\" \\\n  -d '{\n    \"model\": \"kimi-k2.6-search\",\n    \"input\": \"今天有什么值得关注的 AI 新闻？\"\n  }'\n```\n\n## 模型和参数\n\n`\u002Fv1\u002Fmodels` 会从 Kimi Web 的 `GetAvailableModels` 动态获取真实可用模型。模型 ID 按 Kimi Web 返回的工作配置生成，例如：\n\n- `kimi-k2.6`\n- `kimi-k2.6-thinking`\n- `kimi-k2.6-agent`\n- `kimi-k2.6-agent-swarm`\n- `kimi-k2.6-search`\n- `kimi-k2.6-thinking-search`\n\n`enable_thinking` \u002F `reasoning` 只能与所选模型的思考能力保持一致。例如 `kimi-k2.6` 搭配 `enable_thinking: true` 会返回参数错误。\n\n普通联网搜索仅支持 `kimi-k2.6` 和 `kimi-k2.6-thinking`。优先使用 search 后缀模型，适合不会透传自定义联网参数的客户端：\n\n```json\n{\n  \"model\": \"kimi-k2.6-search\"\n}\n```\n\n兼容字段：\n\n- thinking：`enable_thinking`、`reasoning`\n- search：`kimi-k2.6-search`、`kimi-k2.6-thinking-search`；也兼容 OpenAI 风格 `tools: [{\"type\": \"web_search\"}]`、`tools: [{\"type\": \"web_search_preview\"}]`、`web_search_options`；旧字段 `enable_web_search`、`web_search`、`search` 继续保留以兼容已有接入\n\n### 上下文处理\n\n当前版本按 OpenAI 兼容接口的请求体处理上下文：客户端需要在每次请求中携带完整 `messages` 或 `input`。服务不会在不同 HTTP 请求之间保存外部聊天历史，也不会把 `conversation_id` 或 `session_id` 映射到固定 Kimi 账号。\n\n代码中会兼容读取 `conversation_id`、`conversationId`、`session_id`、`sessionId` 字段，但它们目前不等同于可跨请求恢复的 Kimi Web 会话；不要依赖这些字段延续上一轮远端会话。\n\n## 数据文件\n\n默认数据目录为 `data\u002F`：\n\n```text\ndata\u002Fkimi_accounts.json     # Kimi 账号池和 access token 缓存\ndata\u002Fkimi_token.json        # 旧版单 token 文件；无账号池文件时会迁移\ndata\u002Fapi_keys.json          # 本服务对外 API Key\ndata\u002Frequest_logs.sqlite3   # 请求日志\ndata\u002F.session_secret        # 自动生成的会话签名密钥\n```\n\n生产环境应备份 `data\u002F`。如果已经暴露过真实 Kimi token 或 API Key，请立即轮换。\n\n## 项目结构\n\n```text\napp\u002F\n  api\u002F                 # OpenAI 兼容 API 路由和转换逻辑\n  core\u002F                # 鉴权、Key 存储、请求日志、账号池和 token 管理\n  dashboard\u002F           # 管理端 API 和视图数据\n  kimi\u002F                # Kimi Web 协议客户端和模型目录\n  static\u002F              # 前端构建产物\n  config.py            # 环境变量配置\n  main.py              # FastAPI 应用入口\nweb\u002F                   # React\u002FVite 管理面板源码\ndocs\u002Fimages\u002F           # README 参考截图\nrun.py                 # 本地启动入口\nDockerfile             # 容器镜像构建\ndocker-compose.yml     # Compose 部署配置\n```\n\n## 开发\n\n安装后端和前端依赖：\n\n```bash\nuv sync --group dev\ncd web\nnpm ci\ncd ..\n```\n\n构建管理面板并运行后端：\n\n```bash\ncd web\nnpm run build\ncd ..\nuv run python run.py\n```\n\n本地开发 React 管理面板时，建议把 FastAPI 后端固定在 `8003` 端口：\n\n```bash\nPORT=8003 uv run python run.py\n```\n\n另开终端启动 Vite：\n\n```bash\ncd web\nnpm run dev\n```\n\n`web\u002Fvite.config.ts` 会把 `\u002Fadmin\u002Fapi`、`\u002Fv1` 和 `\u002Fhealthz` 代理到 `http:\u002F\u002Flocalhost:8003`。生产构建时，`npm run build` 会把前端资源写入 `app\u002Fstatic\u002Fdist`，后端从 `\u002Fadmin` 和 `\u002Fassets` 提供这些静态资源。\n\n常用检查：\n\n```bash\nuv run pytest -q\nuv run ruff check .\ncd web && npm run lint && npm run build\ngit diff --check\n```\n\n## 安全提醒\n\n- 生产环境请设置强 `ADMIN_PASSWORD` 和稳定的 `SESSION_SECRET`。\n- 公开部署时建议使用 HTTPS，并保持 `SECURE_COOKIES=true`。\n- 不要把真实 Kimi token、refresh token、access token、API Key 或 `data\u002F` 文件提交到仓库。\n- README 截图应使用脱敏演示数据，避免泄露账号邮箱、token 预览和请求内容。\n\n## 许可证\n\n本项目使用 MIT License，详见 [LICENSE](LICENSE)。\n\n## 免责声明\n\n本项目为非官方开源项目，与 Kimi、Moonshot AI（月之暗面）及其关联方无任何从属、授权或合作关系。相关名称仅用于说明兼容对象，商标及权益归其权利人所有。\n\n使用者应自行遵守相关服务协议及法律法规，并仅使用合法持有的账号、Token 或 API Key。本项目不鼓励也不支持绕过官方限制、批量滥用、账号\u002FToken 共享、转售、出租或向第三方提供代理服务。\n\n本项目按“现状”提供，维护者不对因使用本项目导致的账号限制、服务不可用、数据或费用损失、法律纠纷等后果承担责任。如权利方认为内容不当，请联系维护者处理。\n\n## 致谢\n\n感谢原项目 [XxxXTeam\u002Fkimi2api](https:\u002F\u002Fgithub.com\u002FXxxXTeam\u002Fkimi2api) 的基础实现和思路，本项目在此基础上继续二次开发。\n\n本项目已在 [LINUX DO](https:\u002F\u002Flinux.do\u002F) 社区 发布，感谢社区的支持与反馈。\n","Kimi2API 是一个将 Kimi AI 网页版聊天能力转换为 OpenAI 兼容接口的服务。它通过封装 Kimi Web 协议，提供常见的 `\u002Fv1` 接口，便于与 OpenAI SDK 及其他兼容客户端集成。项目采用 Python 编写，并内置了一个基于 React 的管理面板，用于管理 Kimi 账号池、对外 API Key、请求日志等运维操作。此外，Kimi2API 支持流式和非流式输出，以及多种模型能力和调度策略。该服务适用于需要利用 Kimi AI 会话能力但希望使用 OpenAI 标准接口的场景，如构建聊天应用或进行简单的对话交互。","2026-06-11 03:54:41","CREATED_QUERY"]