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 Tokensk-kimi-xxxKimi Code 会员api.kimi.com
Developer API Keysk-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 比洪水还冷。把这些坑标在这里,算是给后来的人立一块路碑。