Files

1 line
3.8 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "bryant24hao/clawputer", "files": {"docs/api-integration.md": {"db282f19769face0536d8586dd1f3b1f43d6b490": {"t": 1785674088.4421208, "n": 2516, "h": "ff70df7e2cd78e21", "c": "# API 接入踩坑记录\n\n## 演变历程\n\n```\nAnthropic 直连 → skyapi 代理 → Kimi K2.5 (moonshot.cn)\n```\n\n每次切换都踩了不同的坑,记录如下。\n\n## 1. Anthropic 直连\n\n**配置**:\n- Endpoint: `https://api.anthropic.com/v1/messages`\n- Auth: `x-api-key` header\n- Format: Anthropic Messages API\n\n**问题**:HTTP -1(TLS 连接失败)\n\n**原因**:硬编码的 ISRG Root X1 证书可能与 api.anthropic.com 的证书链不匹配。\n\n**解决**:`client.setInsecure()` 跳过证书验证。对于 hobby 项目可接受,生产环境需要正确的 CA 证书。\n\n## 2. skyapi.org 代理\n\n**配置**:\n- Endpoint: `https://api.skyapi.org/v1/messages`\n- Auth: 同 Anthropic 格式\n- Key: 第三方代理 key(非 `sk-ant-` 格式)\n\n**问题**:\n1. 域名拼写坑:`skypeapi.org`(错)→ `skyapi.org`(对)\n2. HTTP 403:API Key 被拒(代理 key 格式不同)\n3. HTTP 500:服务端错误,可能不支持流式或模型名不对\n\n**教训**:第三方代理的兼容性不确定,排查成本高。\n\n## 3. Kimi K2.5 (最终方案)\n\n**配置**:\n- Endpoint: `https://api.moonshot.cn/v1/chat/completions`\n- Auth: `Authorization: Bearer sk-xxx`\n- Format: OpenAI 兼容格式\n- Model: `kimi-k2.5`\n\n**踩坑过程**:\n\n### 坑 1:域名\n\n```\napi.moonshot.ai ← 错(401)\napi.moonshot.cn ← 对\n```\n\nMoonshot 的国内域名是 `.cn`,不是 `.ai`。\n\n### 坑 2:模型名\n\n```\nkimi-k2-0711 ← 404\nmoonshot-v1-8k ← 404(旧模型可能已下线)\nkimi-k2.5 ← 正确\n```\n\n### 坑 3:Thinking Mode\n\nKimi K2.5 **默认开启 thinking mode**。响应结构:\n\n```json\n{\n \"choices\": [{\n \"message\": {\n \"content\": \"\", // 可能为空!\n \"reasoning_content\": \"思考过程...\" // 实际内容在这里\n }\n }]\n}\n```\n\n当 `max_tokens` 太小(如 80),思考过程用完所有 token,`content` 为空字符串。\n\n**解决方案**:\n1. `max_tokens` 提高到 1024\n2. 解析时 fallback:`content` 为空则读 `reasoning_content`\n3. 超过 200 字符截断(屏幕小)\n\n### 坑 4:响应慢\n\nESP32 上 HTTPS 请求本身就慢(TLS 握手),加上 Kimi thinking mode,一次请求可能要 10-20 秒。\n\n**解决**:\n- `client.setTimeout(60)` — WiFiClientSecure 60 秒超时\n- `http.setTimeout(60000)` — HTTPClient 60 秒超时\n\n## API 格式对比\n\n### Anthropic Messages API\n\n```json\nPOST /v1/messages\nHeaders: x-api-key, anthropic-version\n{\n \"model\": \"claude-3-5-haiku-20241022\",\n \"system\": \"...\",\n \"messages\": [{\"role\": \"user\", \"content\": \"...\"}]\n}\nResponse: { \"content\": [{\"text\": \"...\"}] }\n```\n\n### OpenAI 兼容格式(Kimi/通用)\n\n```json\nPOST /v1/chat/completions\nHeaders: Authorization: Bearer xxx\n{\n \"model\": \"kimi-k2.5\",\n \"messages\": [\n {\"role\": \"system\", \"content\": \"...\"},\n {\"role\": \"user\", \"content\": \"...\"}\n ]\n}\nResponse: { \"choices\": [{\"message\": {\"content\": \"...\"}}] }\n```\n\n**关键区别**:\n- Auth header 不同(`x-api-key` vs `Authorization: Bearer`)\n- system message 位置不同(顶层字段 vs messages 数组第一条)\n- 响应结构不同(`content[0].text` vs `choices[0].message.content`)\n\n## 流式 vs 非流式\n\n最初设计了 SSE 流式解析(Anthropic 格式),但在代理和 Kimi 上不稳定。当前使用**非流式**请求:简单可靠,代价是等待时间稍长,回复一次性显示。\n\n未来优化:可以重新启用流式(`stream: true`),逐 token 显示回复,体验更好。\n"}}}}