yqcloud-function-calling

YQCloud 自定义 Function Calling 格式说明。定义了一套 JSON 格式用于声明 AI 可调用的函数,运行时由 yqcloud-ai-node 执行 HTTP 请求并返回结果。涵盖 ITSM 工单场景和知识库查询场景。

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "yqcloud-function-calling" with this command: npx skills add binjie09/zknow-skills/binjie09-zknow-skills-yqcloud-function-calling

YQCloud 自定义 Function Calling 格式

yqcloud-ai-node 运行时接收符合此格式的函数定义,AI 决定调用某函数后,运行时自动发起 HTTP 请求(或交由前端处理),并将结果返回给 AI 继续对话。


1. JSON 结构

每个函数定义是一个 JSON 对象,包含外层(给 AI 看的标准 function calling 描述)和内层 function 字段(给运行时看的执行配置)。

{
  // ===== 外层:AI 可见 =====
  "name": "函数名",
  "description": "函数用途描述,AI 据此判断何时调用",
  "parameters": {
    "type": "object",
    "properties": { /* AI 需要填的参数 */ },
    "required": ["必填参数名"]
  },

  // ===== 内层:运行时执行配置 =====
  "function": {
    "type": "call_url",          // "call_url" = 发 HTTP 请求 | "manual" = 前端自行处理
    "method": "GET",             // HTTP 方法
    "url": "请求地址",            // 支持变量占位符和路径参数
    "headers": {},               // 请求头
    "queryParams": "a,b",        // 可选,逗号分隔。指定哪些参数放 query string,其余放 body
    "defaultPostData": {},       // 可选,POST 请求的默认 body 数据
    "requestParser": "JS代码",   // 可选,预处理 AI 传来的参数
    "responseParser": "JS代码",  // 可选,后处理 HTTP 响应
    "stopAfterFunctionCall": false,  // true = 调用后停止 AI 继续生成
    "stopAfterFunctionCallCondition": "JS代码",  // 可选,动态判断是否停止
    "typingMessage": "正在查询...",  // 可选,调用中显示给用户的提示
    "resultTips": "查询完成",        // 可选,结果返回时的提示
    "toolChoice": {},               // 可选,强制 AI 选择某工具
    "extraParamsBuilder": "JS代码"  // 可选,从结果中提取额外参数
  },

  // ===== 国际化(可选)=====
  "intl": {
    "zh_CN": { "description": "中文描述" },
    "en_US": { "description": "English description" }
  }
}

2. 变量占位符

urlheaders 中可使用以下占位符,运行时自动替换:

占位符含义
${STATIC#yqcloud_url}YQCloud API 基础地址(如 https://api.yqcloud.com
${tenantId}当前租户 ID
${yqAccessToken}当前用户 access_token

3. URL 路径参数

URL 中的 {paramName} 占位符会被 AI 传入的同名参数值替换。替换后该参数自动从 query/body 中移除,不会重复传参。

示例:URL 为 /api/v1/know/{knowId},AI 传参 { "knowId": "abc123" },实际请求 /api/v1/know/abc123

4. 参数传递规则

HTTP 方法默认行为queryParams
GET所有参数 → query stringqueryParams 指定的 → query string
POST所有参数 → request bodyqueryParams 指定的 → query string,其余 → body

5. JS 代码字段

字段入参用途
requestParserdata(JSON 字符串)、_(lodash)预处理 AI 参数后返回新对象
responseParserdata(响应体对象)、_(lodash)后处理响应后返回给 AI
stopAfterFunctionCallConditiondata(响应对象)、_(lodash)返回 true 则停止 AI 继续
extraParamsBuilderdata(响应对象)、_(lodash)提取额外参数传给前端

requestParser 示例

requestParserdata 是 AI 传参的 JSON 字符串,必须先 JSON.parse(data) 才能使用。返回值作为实际请求参数。

示例 1:重命名参数

// AI 传 { "keyword": "服务器故障" },转换为 API 需要的 { "searchText": "服务器故障" }
"requestParser": "const params = JSON.parse(data); return { searchText: params.keyword };"

示例 2:添加固定参数

// AI 传 { "name": "张三" },追加固定的分页和排序参数
"requestParser": "const params = JSON.parse(data); return { ...params, page: 0, size: 20, sort: 'createdDate,desc' };"

示例 3:用 lodash 处理参数

// 只保留指定字段,过滤掉 AI 可能多传的参数
"requestParser": "const params = JSON.parse(data); return _.pick(params, ['id', 'name', 'type']);"

responseParser 示例

responseParserdata 是 HTTP 响应体对象(已自动解析),无需 JSON.parse。返回值作为函数调用结果返回给 AI。

示例 1:精简返回数据(减少 token 消耗)

// 从分页响应中提取列表,只保留关键字段
"responseParser": "const list = (data?.content || []).filter(i => i.type === 'SERVICE').map(i => _.pick(i, ['id','name','description'])); return { list };"

示例 2:条件返回

"responseParser": "return data?.serviceItemList ? data : {result: 'no data'}"

示例 3:格式化错误信息

"responseParser": "if (data?.failed) { return { error: data.message }; } return { success: true, result: data.body };"

6. 特殊 URL

  • /transparent:不发 HTTP 请求,直接把 AI 传的参数作为"响应"返回。用于需要前端处理的交互场景。

7. 现有函数定义

7.1 ITSM 工单场景

getAllServiceItem — 获取全部服务项

{
  "name": "getAllServiceItem",
  "description": "获取全部服务项列表,用于匹配用户的工单需求",
  "parameters": { "type": "object", "properties": {} },
  "function": {
    "type": "call_url",
    "method": "GET",
    "url": "${STATIC#yqcloud_url}/itsm/v1/${tenantId}/service_items/catalog/page/all?serviceCatalogFlag=true&page=0&size=9999",
    "headers": { "Authorization": "bearer ${yqAccessToken}" },
    "stopAfterFunctionCall": false,
    "responseParser": "const list = (data?.content || []).filter(i => i.type === 'SERVICE' || i.type === 'RECORD').map(i => _.pick(i, ['id','name','shortDescription','description'])); return { allServiceItemList: list };"
  }
}

getCreateTicketParamJsonSchema — 获取工单表单 Schema

{
  "name": "getCreateTicketParamJsonSchema",
  "description": "根据服务项 ID 获取创建工单所需的表单字段 Schema",
  "parameters": {
    "type": "object",
    "properties": { "id": { "type": "string", "description": "服务项 ID" } },
    "required": ["id"]
  },
  "function": {
    "type": "call_url",
    "method": "GET",
    "url": "${STATIC#yqcloud_url}/ai/v1/${tenantId}/itsmScene/getServiceItemSchema",
    "headers": { "Authorization": "bearer ${yqAccessToken}" },
    "stopAfterFunctionCall": false
  }
}

requestUserSelectServiceItem — 请求用户选择服务项

{
  "name": "requestUserSelectServiceItem",
  "description": "当无法确定服务项时,展示候选列表让用户选择(最多传 1 个最可能匹配的)",
  "parameters": {
    "type": "object",
    "properties": { "serviceItemList": { "type": "array", "description": "候选服务项列表,最多 1 个" } },
    "required": ["serviceItemList"]
  },
  "function": {
    "type": "call_url",
    "method": "POST",
    "url": "/transparent",
    "stopAfterFunctionCall": true,
    "responseParser": "return data?.serviceItemList ? data : {result: 'no data'}"
  }
}

createTicket — 创建工单

{
  "name": "createTicket",
  "description": "收集完所有必填字段后创建工单",
  "parameters": { "type": "object", "properties": {}, "additionalProperties": true },
  "function": {
    "type": "manual",
    "stopAfterFunctionCall": true
  }
}

ITSM 调用流程:

用户提出工单需求
  → getAllServiceItem(获取服务项列表)
  → AI 匹配分析
    ├─ 能确定 → getCreateTicketParamJsonSchema → 逐个收集字段 → createTicket
    └─ 无法确定 → requestUserSelectServiceItem → 用户选择 → 重新进入流程

7.2 知识库场景

fetchKnowledgeElement — 查询知识内容详情

使用 URL 路径参数 {knowId},AI 传入 knowId 后自动替换到 URL 路径中。

{
  "name": "fetchKnowledgeElement",
  "description": "根据知识内容 ID 查询知识库中的具体内容详情",
  "parameters": {
    "type": "object",
    "properties": {
      "knowId": { "type": "string", "description": "知识内容 ID" }
    },
    "required": ["knowId"]
  },
  "function": {
    "type": "call_url",
    "method": "GET",
    "url": "${STATIC#yqcloud_url}/knowledge/v1/${tenantId}/know/fetch/element/{knowId}",
    "headers": {
      "Accept": "application/json",
      "Authorization": "bearer ${yqAccessToken}",
      "x-tenant-id": "${tenantId}"
    },
    "stopAfterFunctionCall": false
  },
  "intl": {
    "zh_CN": { "description": "根据知识内容 ID 查询知识库中的具体内容详情" },
    "en_US": { "description": "Fetch knowledge element details by knowId." }
  }
}

8. 编写新函数的检查清单

  1. name 唯一,使用 camelCase
  2. description 清晰说明用途,AI 靠它决定何时调用
  3. parameters 中列出 AI 需要收集的所有参数及 required
  4. URL 路径中需要动态值的部分用 {paramName},运行时自动替换
  5. 需要放 query string 的 POST 参数用 queryParams 声明
  6. 需要后处理响应的写 responseParser,精简返回数据减少 token 消耗
  7. 交互型函数(需要前端介入)设 stopAfterFunctionCall: true
  8. 纯数据查询函数设 stopAfterFunctionCall: false,让 AI 继续分析

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

gemini-image

No summary provided by upstream source.

Repository SourceNeeds Review
General

yqcloud-deploy

No summary provided by upstream source.

Repository SourceNeeds Review
General

think-carefully

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

global-agent-rules

No summary provided by upstream source.

Repository SourceNeeds Review