Skip to content

安装

bash
npm install cnb-openapi-skills --registry https://npm.cnb.cool/cnb/sdk/npm/-/packages/

API 一览

函数说明
getAPIEndpoint()从环境变量 CNB_API_ENDPOINT 获取 API 基础地址,默认 https://api.cnb.cool
getSkill()获取完整 SKILL.md 内容
getCompactIndex()获取精简 API 索引(大幅减少 token 消耗)
listServices()列出所有 API 服务分类
listAPIs(service)列出指定服务下的所有 API
getAPIDoc(service, api)获取指定 API 的详细文档,也支持 getAPIDoc('service/apiname') 单参数调用
getReferencesDir()获取 references 目录绝对路径
buildSystemPrompt()构建 Agent 模式的 System Prompt(含精简索引 + 工作流指令)
parseAction(content)解析 AI 响应中的动作指令(get_api_doccurl
execCurl(cmd, vars, options)执行 curl 命令,支持占位符替换和超时控制

基础用法:查询 API 文档

javascript
const { listServices, listAPIs, getAPIDoc } = require('cnb-openapi-skills');

// 列出所有服务分类
console.log(listServices());
// => ['activities', 'ai', 'assets', 'badge', 'build', 'git', 'issues', 'pulls', ...]

// 列出某个服务下的所有 API
console.log(listAPIs('issues'));
// => ['createissue', 'getissue', 'listissues', 'updateissue', ...]

// 获取 API 详细文档(两种等价写法)
console.log(getAPIDoc('issues', 'createissue'));
console.log(getAPIDoc('issues/createissue'));

Agent 用法:结合大模型自动调用 CNB API

核心思路:用 buildSystemPrompt() 构建系统提示,AI 会输出 get_api_docbash 代码块,用 parseAction() 解析后执行,循环直到 AI 给出最终回答。

javascript
const { buildSystemPrompt, parseAction, getAPIDoc, execCurl, getAPIEndpoint } = require('cnb-openapi-skills');

const CNB_TOKEN = process.env.CNB_TOKEN;
const REPO = 'your-org/your-repo'; // 需要有访问权限的仓库(用于调用 CNB AI 接口)
const BASE_URL = getAPIEndpoint();
const MAX_TURNS = 10;

// 占位符替换:execCurl 会将 curl 命令中的 <CNB_TOKEN> 替换为实际 token
const CURL_VARS = { '<CNB_TOKEN>': CNB_TOKEN };

// 调用 CNB 平台自带 AI 接口(也可替换为 OpenAI 等兼容接口)
async function chatWithCNBAI(messages) {
  const response = await fetch(`${BASE_URL}/${REPO}/-/ai/chat/completions`, {
    method: 'POST',
    headers: {
      'Accept': 'application/vnd.cnb.api+json',
      'Authorization': `Bearer ${CNB_TOKEN}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ model: 'deepseek-chat', stream: false, messages }),
  });
  const data = await response.json();
  return data.choices[0].message.content;
}

// Agent 主循环
async function runAgent(userMessage) {
  const messages = [
    { role: 'system', content: buildSystemPrompt() },
    { role: 'user', content: userMessage },
  ];

  for (let turn = 0; turn < MAX_TURNS; turn++) {
    const aiResponse = await chatWithCNBAI(messages);
    const action = parseAction(aiResponse);

    // 无动作指令 → AI 已给出最终回答
    if (!action) return aiResponse;

    messages.push({ role: 'assistant', content: aiResponse });

    if (action.type === 'get_api_doc') {
      // AI 请求查看 API 详细文档
      const doc = getAPIDoc(action.value);
      messages.push({ role: 'user', content: `以下是 ${action.value} 的详细 API 文档:\n\n${doc}` });
    } else if (action.type === 'curl') {
      // AI 生成了 curl 命令,执行并返回结果
      const result = execCurl(action.value, CURL_VARS);
      messages.push({ role: 'user', content: `curl 执行结果:\n${JSON.stringify(result.data, null, 2)}` });
    }
  }

  return '已达到最大调用轮次,请尝试简化请求。';
}

// 使用示例
async function main() {
  const answer = await runAgent('帮我查看 cnb/feedback 仓库的所有分支列表,并告诉我默认分支是什么');
  console.log(answer);
}

main().catch(console.error);

按需加载文档(减少 token 消耗)

如果只需要特定领域的 API,可按需加载以减少上下文大小:

javascript
const { getAPIDoc, listAPIs } = require('cnb-openapi-skills');

// 只加载 issues 相关的 API 文档
const issueContext = listAPIs('issues')
  .map((api) => getAPIDoc('issues', api))
  .join('\n---\n');

const systemPrompt = `你是 CNB Issue 管理助手。以下是可用的 API 文档:\n${issueContext}`;

由云锦鸿维护