[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80259":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":14,"subscribersCount":14,"size":14,"stars1d":13,"stars7d":15,"stars30d":16,"stars90d":14,"forks30d":14,"starsTrendScore":17,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":14,"starSnapshotCount":14,"syncStatus":15,"lastSyncTime":27,"discoverSource":28},80259,"HelloKimi","Hello-Application-XH\u002FHelloKimi","Hello-Application-XH","Kimi的 Cloudflare Worker 2API层，提供 OpenAI协议兼容接口，支持流式对话、Tools调用。无需配置，部署即用。",null,"TypeScript",99,38,1,0,2,6,3,48.37,"MIT License",false,"main",true,[],"2026-06-12 04:01:27","# HelloKimi-Kimi2API\n\n> 🚀 **零成本、零运维、全球边缘部署** —— 把 [kimi-ai.chat](https:\u002F\u002Fkimi-ai.chat) 转换为 OpenAI 兼容 API 的高性能 Cloudflare Workers 网关。\n\n[![TypeScript](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTypeScript-5.6-3178C6?logo=typescript&logoColor=white)](https:\u002F\u002Fwww.typescriptlang.org\u002F)\n[![Cloudflare Workers](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCloudflare-Workers-F38020?logo=cloudflare&logoColor=white)](https:\u002F\u002Fworkers.cloudflare.com\u002F)\n[![Hono](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FHono-4.6-E36002?logo=hono&logoColor=white)](https:\u002F\u002Fhono.dev\u002F)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-green.svg)](.\u002FLICENSE)\n\n---\n\n## 技术架构\n\n```\n┌─────────────┐    OpenAI Protocol    ┌──────────────────────┐    HTTP    ┌──────────────┐\n│  Your App   │ ───────────────────▶  │  Cloudflare Worker   │ ─────────▶ │ kimi-ai.chat │\n│ (any SDK)   │ ◀───────────────────  │   (Edge Network)     │ ◀───────── │  (WordPress) │\n└─────────────┘   SSE  \u002F  JSON        └──────────────────────┘            └──────────────┘\n                                              │\n                                       ┌──────┴───────┐\n                                       │  KV: KIMI_KV │  ← 会话上下文 + nonce 缓存\n                                       └──────────────┘\n```\n\n---\n\n## 目录\n\n- [核心特性](#-核心特性)\n- [⚡ 5 分钟部署](#-5-分钟部署)\n- [API 文档](#-api-文档)\n- [客户端接入](#-客户端接入)\n- [配置参考](#%EF%B8%8F-配置参考)\n- [本地开发](#-本地开发)\n- [常见问题](#-常见问题)\n- [实现原理](#-实现原理)\n- [项目结构](#-项目结构)\n- [License](#-license)\n\n---\n\n## ✨ 核心特性\n\n| 能力 | 说明 |\n|---|---|\n| 🌐 **OpenAI 100% 协议兼容** | `\u002Fv1\u002Fchat\u002Fcompletions`、`\u002Fv1\u002Fmodels`，**自动适配 stream \u002F 非流式两种模式** |\n| 🛠️ **Function Calling** | 通过 Prompt 工程在网关层完整模拟 OpenAI tool_calls 协议（三层兜底解析） |\n| 💬 **Stateful 多轮对话** | 客户端只需传 `user` 字段，会话上下文自动落盘到 KV，TTL 可配 |\n| ⚡ **全球边缘加速** | 320+ Cloudflare 节点就近响应，冷启动 \u003C 15ms |\n| 🛡️ **天然反 CF 防护** | Worker 出口走 CF 内网，无需 cloudscraper \u002F 浏览器自动化 |\n| 🔐 **Secret 加密存储** | API Key 通过 `wrangler secret` 注入，从不落盘代码或 git |\n| 💸 **0 元起步** | Cloudflare Free Plan 每日 100k 次请求免费，KV 1GB 存储免费 |\n| 🌊 **真·伪流式** | 按 Unicode 码点切分（正确处理中文\u002Femoji），兼容所有 OpenAI 流式客户端 |\n| 🔁 **自愈机制** | 上游 nonce 失效自动刷新重试 |\n\n支持的模型：`kimi-k2-instruct-0905`、`kimi-k2-instruct`\n\n---\n\n## 部署\n\n### 前置要求\n\n- Node.js ≥ 18\n- 一个免费 [Cloudflare 账号](https:\u002F\u002Fdash.cloudflare.com\u002Fsign-up)\n\n### 步骤 1：克隆并安装\n\n```bash\ncd YOUR_REPO\u002Fcfworker     \nnpm install\n```\n\n### 步骤 2：登录 Cloudflare\n\n```bash\nnpx wrangler login\n```\n\n浏览器会弹出 OAuth 授权页，确认即可。\n\n### 步骤 3：创建 KV 命名空间\n\n```bash\nnpm run kv:create\n```\n\n输出示例：\n\n```\n✨ Success!\n[[kv_namespaces]]\nbinding = \"KIMI_KV\"\nid      = \"abc123def456...\"   ← 复制这个 id\n```\n\n### 步骤 4：填入 KV id\n\n打开 [`wrangler.toml`](.\u002Fwrangler.toml)，把 `YOUR_KV_NAMESPACE_ID` 替换成上一步返回的真实 id：\n\n```toml\n[[kv_namespaces]]\nbinding = \"KIMI_KV\"\nid      = \"abc123def456...\"   # ← 你的真实 KV id\n```\n\n### 步骤 5：设置 API Key（强烈推荐）\n\n```bash\necho \"sk-your-strong-random-key\" | npx wrangler secret put API_MASTER_KEY\n```\n\n> 留空或不设置时，将退化为 `API_MASTER_KEY=\"1\"`，等价于**禁用鉴权**（仅本地调试可用）。\n\n### 步骤 6：部署\n\n```bash\nnpm run deploy\n```\n\n输出形如：\n\n```\n✨ Uploaded kimi-ai-2api (3.42 sec)\n🌎 Deployed kimi-ai-2api triggers (0.99 sec)\n   https:\u002F\u002Fkimi-ai-2api.\u003Cyour-subdomain>.workers.dev\n```\n\n🎉 **完成。** 立即测试：\n\n```bash\ncurl https:\u002F\u002Fkimi-ai-2api.\u003Cyour-subdomain>.workers.dev\u002Fv1\u002Fmodels \\\n     -H \"Authorization: Bearer sk-your-strong-random-key\"\n```\n\n---\n\n## 📡 API 文档\n\n### `GET \u002F`\n\n健康检查。\n\n### `GET \u002Fv1\u002Fmodels`\n\n返回支持的模型列表（OpenAI 兼容）。\n\n```json\n{\n  \"object\": \"list\",\n  \"data\": [\n    {\"id\": \"kimi-k2-instruct-0905\", \"object\": \"model\", \"created\": 1700000000, \"owned_by\": \"lzA6\"},\n    {\"id\": \"kimi-k2-instruct\",       \"object\": \"model\", \"created\": 1700000000, \"owned_by\": \"lzA6\"}\n  ]\n}\n```\n\n### `POST \u002Fv1\u002Fchat\u002Fcompletions`\n\nOpenAI 兼容对话接口。**根据 `stream` 字段自动切换响应格式**：\n\n| `stream` | Content-Type | 响应格式 |\n|---|---|---|\n| `true` | `text\u002Fevent-stream` | 多个 `data: {...}` chunk + `data: [DONE]` |\n| `false` 或缺省 | `application\u002Fjson` | 单个 `chat.completion` 对象（含 `usage`） |\n\n**请求体（OpenAI 标准）：**\n\n```json\n{\n  \"model\": \"kimi-k2-instruct-0905\",\n  \"stream\": true,\n  \"messages\": [\n    {\"role\": \"system\", \"content\": \"你是一个简明的助手\"},\n    {\"role\": \"user\",   \"content\": \"你好\"}\n  ],\n  \"user\": \"alice@example.com\",\n  \"tools\": [ ... ]\n}\n```\n\n| 字段 | 类型 | 说明 |\n|---|---|---|\n| `model` | string | 见上表，缺省 = `DEFAULT_MODEL` 配置 |\n| `messages` | array | OpenAI 标准消息数组 |\n| `stream` | bool | `true`=SSE 流式；`false` 或缺省 = JSON |\n| `user` | string | **可选**。传则启用 stateful 会话（KV 持久化） |\n| `tools` | array | **可选**。传则启用 OpenAI Function Calling |\n\n#### 三种工作模式自动判定\n\n```\n有 tools \u002F role:tool \u002F assistant.tool_calls       →  工具调用模式（绕过 stateful）\n无 tools 但有 user 字段                             →  Stateful 多轮模式（KV 上下文）\n都没有                                              →  无状态单轮模式\n```\n\n#### 工具调用响应（`finish_reason=tool_calls`）\n\n```json\n{\n  \"id\": \"chatcmpl-...\",\n  \"object\": \"chat.completion\",\n  \"model\": \"kimi-k2-instruct-0905\",\n  \"choices\": [{\n    \"index\": 0,\n    \"message\": {\n      \"role\": \"assistant\",\n      \"content\": null,\n      \"tool_calls\": [{\n        \"id\": \"call_...\",\n        \"type\": \"function\",\n        \"function\": {\"name\": \"get_weather\", \"arguments\": \"{\\\"city\\\":\\\"上海\\\"}\"},\n        \"index\": 0\n      }]\n    },\n    \"finish_reason\": \"tool_calls\"\n  }],\n  \"usage\": { ... }\n}\n```\n\n---\n\n## 🔌 客户端接入\n\n### Cherry Studio \u002F ChatBox \u002F LobeChat \u002F NextChat \u002F OpenWebUI\n\n| 配置项 | 值 |\n|---|---|\n| API 类型 | `OpenAI` |\n| Base URL | `https:\u002F\u002Fkimi-ai-2api.\u003Cyour-subdomain>.workers.dev\u002Fv1` |\n| API Key | 你设置的 secret（如 `sk-xxx`） |\n| 模型 ID | `kimi-k2-instruct-0905` 或 `kimi-k2-instruct` |\n\n### One API \u002F New API（多 LLM 聚合网关）\n\n| 配置项 | 值 |\n|---|---|\n| 渠道类型 | `OpenAI` |\n| 代理地址 | `https:\u002F\u002Fkimi-ai-2api.\u003Cyour-subdomain>.workers.dev` *（不要带 `\u002Fv1`）* |\n| 密钥 | 你的 secret |\n| 模型 | `kimi-k2-instruct-0905,kimi-k2-instruct` |\n\n> ⚠️ One API \u002F New API 的\"渠道测试\"默认发送 `stream:false`，本网关已正确返回 `application\u002Fjson` chat.completion 对象 + `usage` 字段，测试可一键通过。\n\n### Python OpenAI SDK\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI(\n    base_url=\"https:\u002F\u002Fkimi-ai-2api.\u003Cyour-subdomain>.workers.dev\u002Fv1\",\n    api_key=\"sk-your-strong-random-key\",\n)\n\n# 流式\nfor chunk in client.chat.completions.create(\n    model=\"kimi-k2-instruct-0905\",\n    messages=[{\"role\": \"user\", \"content\": \"你好\"}],\n    stream=True,\n):\n    print(chunk.choices[0].delta.content or \"\", end=\"\", flush=True)\n```\n\n### Node.js\n\n```js\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n  baseURL: \"https:\u002F\u002Fkimi-ai-2api.\u003Cyour-subdomain>.workers.dev\u002Fv1\",\n  apiKey:  \"sk-your-strong-random-key\",\n});\n\nconst res = await client.chat.completions.create({\n  model: \"kimi-k2-instruct-0905\",\n  messages: [{ role: \"user\", content: \"你好\" }],\n});\nconsole.log(res.choices[0].message.content);\n```\n\n### curl\n\n```bash\ncurl https:\u002F\u002Fkimi-ai-2api.\u003Cyour-subdomain>.workers.dev\u002Fv1\u002Fchat\u002Fcompletions \\\n     -H \"Authorization: Bearer sk-your-strong-random-key\" \\\n     -H \"Content-Type: application\u002Fjson\" \\\n     -d '{\n       \"model\": \"kimi-k2-instruct-0905\",\n       \"messages\": [{\"role\":\"user\",\"content\":\"你好\"}]\n     }'\n```\n\n---\n\n## ⚙️ 配置参考\n\n### `wrangler.toml` · `[vars]` 段（可直接修改后重新部署）\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `SESSION_CACHE_TTL` | `3600` | stateful 会话上下文 TTL（秒） |\n| `CONTEXT_MAX_LENGTH` | `1000` | 上游单次输入字符数硬上限（智能滑窗截断） |\n| `DEFAULT_MODEL` | `kimi-k2-instruct-0905` | 客户端未指定模型时使用 |\n| `STREAM_INTERVAL_MS` | `20` | 流式逐字符间隔（毫秒），**Free Plan 推荐设为 `0`** |\n\n### Secret（敏感数据，必须用 wrangler secret put 注入）\n\n| 变量 | 说明 |\n|---|---|\n| `API_MASTER_KEY` | 客户端必须携带的 Bearer Token；设为 `\"1\"` 等价禁用鉴权 |\n\n### 自定义域名（可选）\n\n打开 `wrangler.toml`，取消 `[[routes]]` 注释并填入你的域名：\n\n```toml\n[[routes]]\npattern   = \"kimi.example.com\u002F*\"\nzone_name = \"example.com\"\n```\n\n---\n\n## 🧑‍💻 本地开发\n\n```bash\n# 1. 准备本地环境变量\ncp .dev.vars.example .dev.vars\n# 编辑 .dev.vars 写入你的本地 Key\n\n# 2. 启动本地 dev server（Miniflare）\nnpm run dev\n# → http:\u002F\u002Flocalhost:8787\n\n# 3. 类型检查\nnpm run typecheck\n\n# 4. 不实际部署，仅打包验证\nnpm run deploy:dry\n```\n\n---\n\n## 💡 常见问题\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Q1: 部署后访问 502 \u002F 上游错误？\u003C\u002Fb>\u003C\u002Fsummary>\n\n通常是 KV 中缓存的 nonce 失效。本网关有自动刷新重试机制，单次失败后会强制刷新 nonce 再试一次。如持续失败：\n\n```bash\nnpm run tail        # 实时查看日志\n```\n\n观察 `nonce` 抓取与上游响应。若上游 [kimi-ai.chat](https:\u002F\u002Fkimi-ai.chat) 主页面规则改变，可能需要更新 [`src\u002Fproviders\u002Fkimi.ts`](.\u002Fsrc\u002Fproviders\u002Fkimi.ts) 中 `fetchNonce()` 的正则。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Q2: New API \u002F One API 渠道测试失败？\u003C\u002Fb>\u003C\u002Fsummary>\n\n请确认：\n\n1. **代理地址不要带 `\u002Fv1`**（One API 内部会自动追加）。\n2. 域名能解析到正确的 Cloudflare 边缘节点（部分网络环境下 `*.workers.dev` 可能存在 DNS 异常，建议绑定自定义域名）。\n3. 密钥与 `wrangler secret put API_MASTER_KEY` 设置的值完全一致。\n\n本网关已正确实现 `stream:false` 时返回 `application\u002Fjson` 的 `chat.completion`（含 `usage`），与 One API\u002FNew API 的渠道测试协议完全兼容。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Q3: Free Plan 提示 CPU time exceeded？\u003C\u002Fb>\u003C\u002Fsummary>\n\n把 `wrangler.toml` 中的 `STREAM_INTERVAL_MS` 设为 `\"0\"`，避免 `setTimeout` 累计 CPU 时间：\n\n```toml\nSTREAM_INTERVAL_MS = \"0\"\n```\n\n重新部署后即可。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Q4: 工具调用没触发，模型直接返回了文本？\u003C\u002Fb>\u003C\u002Fsummary>\n\n本网关已实现三层兜底解析：\n\n1. `\u003Ctool_call>{...}\u003C\u002Ftool_call>` 标签\n2. ` ```json {...} ``` ` 围栏\n3. 平衡括号扫描裸 JSON（含 `name` + `arguments` 字段）\n\n若仍未触发，请检查：\n\n- `tools` 数组中 `parameters` JSON Schema 是否合法\n- 用户提问是否明确（模型有可能判断不需要调用工具）\n- 通过 `npm run tail` 查看上游原始响应\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Q5: 如何更换 \u002F 轮换 API Key？\u003C\u002Fb>\u003C\u002Fsummary>\n\n```bash\necho \"\u003Cnew-key>\" | npx wrangler secret put API_MASTER_KEY\n```\n\n无需重新部署，全球边缘节点会在数秒内生效。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Q6: 如何完全卸载？\u003C\u002Fb>\u003C\u002Fsummary>\n\n```bash\nnpx wrangler delete                              # 删除 Worker\nnpx wrangler kv namespace delete --binding KIMI_KV   # 删除 KV\n```\n\n\u003C\u002Fdetails>\n\n---\n\n## 🔍 实现原理\n\n### 与 [kimi-ai.chat](https:\u002F\u002Fkimi-ai.chat) 上游的协议适配\n\n上游是基于 WordPress 的 ChatGPT 镜像站，**没有原生 OpenAI API**，请求形如：\n\n```\nPOST https:\u002F\u002Fkimi-ai.chat\u002Fwp-admin\u002Fadmin-ajax.php\nContent-Type: application\u002Fx-www-form-urlencoded\n\naction=kimi_send_message&nonce=\u003Cdynamic>&message=\u003Ctext>&model=\u003Cid>&session_id=\u003Cid>\n```\n\n其中 `nonce` 是从 `https:\u002F\u002Fkimi-ai.chat\u002Fchat\u002F` 页面 HTML 中通过正则抓取的动态 token：\n\n```js\nvar kimi_ajax = {\"ajax_url\":\"...\",\"nonce\":\"\u003C32-hex>\"};\n```\n\n\n### 工具调用模拟原理\n\n由于上游接口只接收单个 `message` 字符串，Function Calling 完全在网关层模拟：\n\n```\n1. 检测 tools 字段 → 进入工具调用模式（绕过 stateful 缓存）\n2. 把 tools schema 编译成 system 指令注入 prompt\n3. 要求模型输出格式：\u003Ctool_call>{\"name\":\"...\",\"arguments\":{...}}\u003C\u002Ftool_call>\n4. 收到上游回复后三层兜底解析：\n   ┌─ Layer 1: \u003Ctool_call>...\u003C\u002Ftool_call> 标签\n   ├─ Layer 2: ```json ... ``` 围栏\n   └─ Layer 3: 平衡括号扫描裸 JSON（必须含 name+arguments 才视为工具调用）\n5. 命中 → 输出 OpenAI tool_calls 协议（finish_reason: tool_calls）\n   未命中 → 退回普通文本输出\n```\n\n---\n\n## 项目结构\n\n```\ncfworker\u002F\n├── src\u002F\n│   ├── index.ts                  ← Hono 路由 \u002F 鉴权 \u002F 错误处理\n│   ├── config.ts                 ← Env 类型 \u002F 模型映射 \u002F 上游端点\n│   ├── providers\u002F\n│   │   └── kimi.ts               ← 核心业务（nonce \u002F 会话 \u002F 上游调用 \u002F 流式输出）\n│   └── utils\u002F\n│       ├── sse.ts                ← SSE 块 + 非流式 chat.completion 构造器\n│       └── tool-calling.ts       ← 工具调用 Prompt 编译 + 三层兜底解析\n├── wrangler.toml                 ← Cloudflare Workers 配置\n├── package.json                  ← 依赖与脚本\n├── tsconfig.json                 ← TypeScript 配置\n├── .gitignore\n├── .dev.vars.example             ← 本地开发环境变量模板\n├── LICENSE                       ← MIT\n└── README.md\n```\n\n## License\n\n[MIT](.\u002FLICENSE) © 2025 kimi-ai-2api contributors\n\n本项目仅供学习与研究使用。请遵守 [kimi-ai.chat](https:\u002F\u002Fkimi-ai.chat) 的服务条款，不得用于任何商业牟利或违反当地法律法规的用途。\n\n---\n\n## 致谢\n\n- 上游服务：[kimi-ai.chat](https:\u002F\u002Fkimi-ai.chat)\n- 框架：[Hono](https:\u002F\u002Fhono.dev\u002F) · [Cloudflare Workers](https:\u002F\u002Fworkers.cloudflare.com\u002F)\n- 学AI,上L站！ [LINUX DO](https:\u002F\u002Flinux.do\u002F)\n如本项目对你有帮助，欢迎 ⭐ Star。\n","HelloKimi 是一个基于 Cloudflare Workers 的 API 网关，用于将 kimi-ai.chat 转换为 OpenAI 协议兼容的接口。它支持流式对话和工具调用功能，能够自动适配 stream 和非流式两种模式，并通过 KV 存储实现多轮对话的状态保持。该项目使用 TypeScript 编写，具备全球边缘加速、天然反 CF 防护以及 Secret 加密存储等技术特点。适用于需要快速集成 AI 服务但又希望避免复杂配置与运维成本的应用场景，如聊天机器人、智能客服系统等。","2026-06-11 03:59:51","CREATED_QUERY"]