logo
0
0
WeChat Login

CNB CodeBuddy API 逆向工程 — 简介版

完整探索链

注 : 以下 kfc70/AA指的是 组织名/仓库名 也就是仓库路径。 比如本仓库链接 https://cnb.cool/kfc50/cnb-ai-api中的kfc50/cnb-ai-api

以下api需要在打开该仓库的云原生开发时,才可以使用,(也能通过API打开,我还没试过)

步骤 1:找日志根目录

ls /root/.local/share/code-server/logs/

输出:

20260420T101419
20260420T101423
...
20260422T155002    ← 最新的,选这个

目录名是时间戳 {YYYYMMDD}T{HHMMSS},每次重启 code-server 生成新目录。

步骤 2:进 exthost1 子目录

ls /root/.local/share/code-server/logs/20260422T155002/exthost1/ | head -20

输出:

Tencent-Cloud.coding-copilot
output_logging_20260422T155013
remoteExtHostTelemetry.log
remoteexthost.log
vscode.git
vscode.github
...

看到 Tencent-Cloud.coding-copilot 目录——这就是 CodeBuddy 插件的日志目录。

步骤 3:查看日志文件

ls "/root/.local/share/code-server/logs/20260422T155002/exthost1/Tencent-Cloud.coding-copilot/"

输出:

Tencent Cloud CodeBuddy.log
ls -la "/root/.local/share/code-server/logs/20260422T155002/exthost1/Tencent-Cloud.coding-copilot/"

输出:

total 1120
-rw-r--r-- 1 root root 1143494 Apr 22 17:07 'Tencent Cloud CodeBuddy.log'

1MB 日志,包含全部运行时信息。

步骤 4:读日志头 — 发现插件如何加载配置

head -15 "/root/.local/share/code-server/logs/20260422T155002/exthost1/Tencent-Cloud.coding-copilot/Tencent Cloud CodeBuddy.log"

关键输出:

[ClientProductProvider] Reading product configuration from /root/.local/share/code-server/extensions/tencent-cloud.coding-copilot-4.3.20019762-universal/product.json
[ClientProductProvider] Product configuration loaded and cached successfully
[CloudProductManager] fetch cloud product start
...
[CloudProductManager] fetch cloud product finish, result empty 0
...
[CloudProductManager] [1938853994086588416@cnb] Saving product configuration to cache (LRU): {...完整JSON...}

关键发现: 插件先读本地 product.json,然后 CloudProductManager 从 CNB 云端拉取配置并缓存,缓存中包含了完整的模型列表。

步骤 5:grep endpoint — 找到 API 地址

grep -n 'endpoint\|api\.cnb\|/v2\|/v1' '/root/.local/share/code-server/logs/20260422T155002/exthost1/Tencent-Cloud.coding-copilot/Tencent Cloud CodeBuddy.log' | tail -20

关键输出:

5452:...[CraftInvokableAgent] endpoint: https://api.cnb.cool/kfc70/AA/-/ai-ide/v2 model: {"id":"glm-5.1",...}
5583:...[BaseAgent:craft] [CustomFetch] url: https://api.cnb.cool/kfc70/AA/-/ai-ide/v2/chat/completions
5724:...[BaseAgent:craft] [CustomFetch] url: https://api.cnb.cool/kfc70/AA/-/ai-ide/v2/chat/completions

找到了! endpoint 是 https://api.cnb.cool/kfc70/AA/-/ai-ide/v2,聊天路径是 /chat/completions

步骤 6:grep modelId — 找到当前模型

grep -n 'modelId\|"id":\|loadModels\|fetchModels\|models.*\[' '/root/.local/share/code-server/logs/20260422T155002/exthost1/Tencent-Cloud.coding-copilot/Tencent Cloud CodeBuddy.log' | tail -10

关键输出:

5187:...[BaseAgent:craft] DeepSeek ModelProvider initialized, modelId: glm-5.1, modelName: GLM-5.1
5452:...[CraftInvokableAgent] endpoint: https://api.cnb.cool/kfc70/AA/-/ai-ide/v2 model: {"descriptionEn":"Great for daily use","descriptionZh":"能力均衡,适合日常使用","id":"glm-5.1","maxInputTokens":200000,"maxOutputTokens":48000,"name":"GLM-5.1","supportsReasoning":true,"vendor":"e"}

当前使用 glm-5.1,Provider 类型是 DeepSeek(Vercel AI SDK)。

步骤 7:查看插件目录 — 发现 product.json / product.external.json

ls /root/.vscode-server/extensions/ | grep coding-copilot

输出:

tencent-cloud.coding-copilot-4.3.20019762-universal
ls /root/.vscode-server/extensions/tencent-cloud.coding-copilot-4.3.20019762-universal/

输出:

LICENSE.txt          package.nls.json       product.internal.json
cell.yml             package.nls.zh-cn.json product.json
changelog.md         package.nls.zh-tw.json product.external.json  ← 国际版配置
integration-mcp      readme.md
l10n                 resources
out                  tsconfig.tsbuildinfo
package.json

发现了 3 个 product 配置文件: product.json(主配置)、product.external.json(国际版/SaaS)、product.internal.json(内部版)

步骤 8:读 product.json — 发现配置加载机制

cat /root/.vscode-server/extensions/tencent-cloud.coding-copilot-4.3.20019762-universal/product.json

关键字段:

{
  "productName": "CodeBuddy",
  "productConfigEnv": ["ACC_PRODUCT_CONFIG_V3", "ACC_PRODUCT_CONFIG_V2", "ACC_PRODUCT_CONFIG"],
  "endpoint": "https://copilot.tencent.com",
  "stagingEndpoint": "https://staging-copilot.tencent.com",
  "officialEndpoints": [
    "https://copilot.tencent.com",
    "https://staging-copilot.tencent.com",
    "https://www.codebuddy.ai",
    "https://staging-codebuddy.tencent.com"
  ]
}

核心发现: productConfigEnv 指定了 3 个环境变量名,CNB 环境注入了 ACC_PRODUCT_CONFIG_V2,覆盖了默认的 endpoint 和模型列表,所以请求从 copilot.tencent.com 变成了 api.cnb.cool

步骤 9:grep CloudProductManager 缓存 — 提取完整模型列表

grep 'Saving product configuration to cache' '/root/.local/share/code-server/logs/20260422T155002/exthost1/Tencent-Cloud.coding-copilot/Tencent Cloud CodeBuddy.log'

输出中的关键 JSON(精简):

{
  "agents": [
    {
      "name": "craft",
      "models": ["auto","glm-5v-turbo","glm-5.1","glm-5.0-turbo","glm-4.6","kimi-k2.6","kimi-k2.5","deepseek-v3-2-volc","hunyuan-2.0-instruct"]
    },
    {
      "name": "ask",
      "models": ["glm-5v-turbo","glm-5.1","glm-5.0-turbo","glm-4.6","kimi-k2.6","kimi-k2.5","deepseek-v3-2-volc","deepseek-r1-0528-lkeap","hunyuan-2.0-instruct"]
    }
  ]
}

模型列表直接从 CloudProductManager 的缓存 JSON 中提取。


API 调用

curl 命令

curl -X POST "https://api.cnb.cool/kfc70/AA/-/ai-ide/v2/chat/completions" \
  -H "Authorization: Bearer $CNB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"model":"glm-5.1","messages":[{"role":"user","content":"你的问题"}],"stream":true}'

必须 stream: true,非流式返回错误:{"code":11101,"msg":"Non-stream chat request is currently not supported"}


完整可用模型列表(CNB 环境)

craft agent 可用模型:

auto glm-5v-turbo glm-5.1 glm-5.0-turbo glm-4.6 kimi-k2.6 kimi-k2.5 deepseek-v3-2-volc hunyuan-2.0-instruct

ask agent 可用模型:

glm-5v-turbo glm-5.1 glm-5.0-turbo glm-4.6 kimi-k2.6 kimi-k2.5 deepseek-v3-2-volc deepseek-r1-0528-lkeap hunyuan-2.0-instruct