Kimi Code API 非官方连接指南
《水经注》里记山川道路,讲的是哪条河能走船、哪个渡口有暗礁。古人写这些,大概也是踩过坑的人,怕后来者再翻同一条船。
Kimi Code 是 Moonshot 提供的编程专用 AI 服务,官方只开放了 Kimi CLI、Claude Code 等客户端作为入口。想用脚本直接调 API,像是试图从侧门进一座只开正门的衙门——门是有的,只是没人告诉你钥匙长什么样。
核心坑点
坑 1: 403 Forbidden——"仅限 Coding Agents"
错误信息:
1
2
3
4
5
6
| {
"error": {
"message": "Kimi For Coding is currently only available for Coding Agents such as Kimi CLI, Claude Code, Roo Code, Kilo Code, etc.",
"type": "access_terminated_error"
}
}
|
一条 403,措辞客气,意思明确:你不在名单上。
服务端会验证 User-Agent Header。换句话说,它不关心你是谁,只关心你自称是谁。
解决方案:
1
2
3
4
| headers: {
'User-Agent': 'KimiCLI/1.6', // 必须模拟 Kimi CLI
'Authorization': `Bearer ${accessToken}`
}
|
坑 2: API Key 格式混淆
| 类型 | 格式 | 用途 | 端点 |
|---|
| OAuth Access Token | sk-kimi-xxx | Kimi Code 会员 | api.kimi.com |
| Developer API Key | sk-xxx | 开放平台 | api.moonshot.cn |
两种 Key 不互通。拿着开放平台的钥匙去敲 Kimi Code 的门,只会收获沉默。反之亦然。
坑 3: 获取模型列表成功,但对话失败
现象: /models 返回 200,/chat/completions 返回 403。
这是最容易让人产生虚假安全感的地方。/models 只验证 Token 的有效性,像门卫看了一眼你的证件就放行;而 /chat/completions 还要额外验证 User-Agent,相当于进了大门之后,里面还有一道岗。
坑 4: 延迟较高 (~1-2s)
延迟分布:
- DNS: ~50ms
- 网络 RTT: ~100ms
- 模型推理: 400-700ms(主要瓶颈)
- 响应下载: ~10ms
大部分时间花在等模型思考上。这倒也合理——你不能指望一个正在推理的大模型跟 ping 一样快。
优化手段:
- 使用
stream: true 提升首包感知速度 - 启用 HTTP Keep-Alive 复用连接
- Prompt 越短推理越快
正确配置
把上述坑点绕过之后,一份能用的配置大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| const config = {
// OAuth Access Token (从 Kimi Code Console 获取)
apiKey: '',
// Kimi Code 专用端点
baseUrl: 'https://api.kimi.com/coding/v1',
// 模型名称
model: 'kimi-for-coding',
// 必须设置的 Header
headers: {
'User-Agent': 'KimiCLI/1.6',
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`
}
};
const response = await fetch(`${config.baseUrl}/chat/completions`, {
method: 'POST',
headers: config.headers,
body: JSON.stringify({
model: config.model,
messages: [{ role: 'user', content: 'Hello' }],
max_tokens: 100,
stream: false
})
});
|
项目集成代码
在实际项目中,可以通过判断 URL 和模型名来自动添加所需的 Header:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| // packages/server/src/lib/llm.ts
function isKimiCode(baseUrl: string, model: string): boolean {
return baseUrl.includes('api.kimi.com') || model === 'kimi-for-coding';
}
// 调用时自动添加 User-Agent
const headers: Record<string, string> = {
'Content-Type': 'application/json',
Authorization: `Bearer ${apiKey}`,
};
if (isKimiCode(baseUrl, model)) {
headers['User-Agent'] = 'KimiCLI/1.6';
}
|
参考
写完这篇指南,想起《史记·河渠书》里的一句话:「甚哉,水之为利害也。」API 也是一样。通了的时候润物无声,不通的时候,403 比洪水还冷。把这些坑标在这里,算是给后来的人立一块路碑。