概述
JVS Crew 是阿里云无影团队开发的 AI 智能助手平台。通过本文档描述的 API,您可以将 JVS Crew 的 AI 对话能力集成到自己的应用中。
API 分为十类:
会话交互 — 获取令牌、发起对话、上传文件
技能管理 — 查询可用技能及启用状态、技能包上传与更新
用户 MCP 管理 — 用户级 MCP 偏好、凭证绑定、专属 MCP 管理
会话管理 — 列举/查看/删除历史会话
环境变量 — 设置、获取、删除用户运行环境变量
定时任务 — 创建/管理/监控定时执行任务
计费查询 — 查看用量和消耗明细
工作空间管理 — 同步、列举、下载和清理用户工作空间数据
模板管理 — 获取模板详情、设置模板系统规则
渠道管理 — 微信扫码绑定、渠道实例查询/修改/统计
快速开始
集成 JVS Crew 最少只需两步:
获取令牌 — 使用 AK/SK 调用 GetAccessToken,获取 AccessToken
发起对话 — 携带 AccessToken 调用 Chat,通过 SSE 流接收回复
完整 Python 示例参见 使用示例 章节。
基础信息
协议: HTTPS
生产 Base URL:
https://wuyingai.cn-shanghai.aliyuncs.comAPI 版本:
2026-03-11(所有接口的x-acs-version或 POPVersion参数)
认证方式
本文档中的 API 使用两种认证方式:
认证方式 | 适用 API | 说明 |
AK/SK 签名 | GetAccessToken、GetChatFileUploadUrl、SyncContext、ListSkills、GetSkillCenterCredential、CreateSkillCenterSkill、UpdateSkillCenterSkill、ListSkillCenterSkills、SyncWorkspaceFiles、ListWorkspaceFiles、GetWorkspaceFileDownloadUrl、GetWorkspaceFileUploadUrl、DeleteWorkspaceFile、ClearUserWorkspace、GetBillingOverview、ListUserConsumption、GetSessionCreditDetail、GetUserCreditRecords、ListAllUserScheduledTasks、DeleteAllUserScheduledTasks、ListAllUserScheduledTaskRuns、CreateChannelInstanceQrCode、DescribeChannelInstanceQrCode、ListChannelInstances、DescribeChannelInstance、UpdateChannelInstance、DescribeChannelInstanceStats、ListTemplates、GetTemplate、SetTemplateSystemRules | 使用阿里云 AccessKey 进行 POP V1 签名,详见使用示例 |
JWT 令牌 | Chat、ListSessions、ListSessionHistory、StopSession、DeleteSession、GetSandboxInfo、SetAgentEnvVarForUser、GetAgentEnvVarForUser、DeleteAgentEnvVarForUser、ListSkillPreferences、SetSkillPreference、SetUserMcpPreference、SetUserMcpCredential、ClearUserMcpCredential、CreateUserMcp、UpdateUserMcp、DeleteUserMcp、GetUserMcp、ListUserMcps、CreateScheduledTask、UpdateScheduledTask、GetScheduledTask、ListScheduledTasks、DeleteScheduledTask、ListScheduledTaskRuns | 先调用 GetAccessToken 获取 AccessToken,放入 Query 参数 |
通用请求格式
两种认证方式对应不同的请求格式:
AK/SK 签名接口:所有参数(包括 Action、业务参数、签名参数)均以 Query String 形式拼接在 URL 中,使用 POST 方法发送。
POST https://wuyingai.cn-shanghai.aliyuncs.com/?Action=GetAccessToken&ExternalUserId=user-38764&Signature=...&其他签名参数
JWT 令牌接口:Authorization 放在 Query String 中,操作名称通过 x-acs-action Header 指定,业务参数放在 JSON Body 中。
POST https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<token>
Headers: x-acs-action: ListSessions, x-acs-version: 2026-03-11, x-acs-date: <UTC时间>
Body: {"ExternalUserId": "user-38764"}
特殊情况:Chat 接口的 URL 路径为/api/agent/chat(非根路径/),其余 JWT 接口均使用根路径。
API 一览
API | 分类 | 认证 | 说明 |
GetAccessToken | 会话交互 | AK/SK | 获取 JWT 访问令牌 |
Chat | 会话交互 | JWT | 流式对话(SSE) |
GetChatFileUploadUrl | 会话交互 | AK/SK | 获取文件上传地址 |
SyncContext | 会话交互 | AK/SK | 同步文件到沙箱 |
ListSkills | 技能管理 | AK/SK | 分页查询当前模板可见的技能列表及启用状态 |
ListSkillPreferences | 技能管理 | JWT | 分页列出当前用户在指定模板下设置的技能偏好 |
SetSkillPreference | 技能管理 | JWT | 设置或恢复当前用户对某个技能的启用偏好 |
GetSkillCenterCredential | 技能管理 | AK/SK | 获取技能包预签名上传 URL |
CreateSkillCenterSkill | 技能管理 | AK/SK | 创建市场技能 |
UpdateSkillCenterSkill | 技能管理 | AK/SK | 更新已有市场技能的技能包 |
ListSkillCenterSkills | 技能管理 | AK/SK | 分页查询租户下市场技能列表及模板引用计数 |
SetUserMcpPreference | 用户 MCP 管理 | JWT | 设置用户对模板级 MCP 的偏好(启用/关闭/恢复默认) |
SetUserMcpCredential | 用户 MCP 管理 | JWT | 为用户绑定模板级 MCP 的专属凭证 |
ClearUserMcpCredential | 用户 MCP 管理 | JWT | 解绑用户对模板级 MCP 的专属凭证 |
CreateUserMcp | 用户 MCP 管理 | JWT | 创建用户专属 MCP |
UpdateUserMcp | 用户 MCP 管理 | JWT | 更新用户专属 MCP 配置 |
DeleteUserMcp | 用户 MCP 管理 | JWT | 删除用户专属 MCP |
GetUserMcp | 用户 MCP 管理 | JWT | 查询单个用户专属 MCP 详情 |
ListUserMcps | 用户 MCP 管理 | JWT | 查询用户当前全部 MCP(合并视图) |
SyncWorkspaceFiles | 工作空间管理 | AK/SK | 将活跃沙箱中的工作空间文件同步到 Context |
ListWorkspaceFiles | 工作空间管理 | AK/SK | 列举用户工作空间目录下的文件和子目录 |
GetWorkspaceFileDownloadUrl | 工作空间管理 | AK/SK | 获取用户工作空间文件的临时下载地址 |
GetWorkspaceFileUploadUrl | 工作空间管理 | AK/SK | 获取用户工作空间文件的临时上传地址 |
DeleteWorkspaceFile | 工作空间管理 | AK/SK | 删除用户工作空间内的指定文件,幂等 |
ClearUserWorkspace | 工作空间管理 | AK/SK | 清理指定用户的工作空间数据 |
ListSessions | 会话管理 | JWT | 列举会话列表 |
ListSessionHistory | 会话管理 | JWT | 获取会话历史 |
StopSession | 会话管理 | JWT | 中止正在执行的对话 |
DeleteSession | 会话管理 | JWT | 删除对话记录 |
GetSandboxInfo | 会话管理 | JWT | 获取沙箱信息 |
SetAgentEnvVarForUser | 环境变量 | JWT | 设置用户环境变量 |
GetAgentEnvVarForUser | 环境变量 | JWT | 获取用户环境变量 |
DeleteAgentEnvVarForUser | 环境变量 | JWT | 删除用户环境变量 |
GetBillingOverview | 计费查询 | AK/SK | 租户当月计费概览 |
ListUserConsumption | 计费查询 | AK/SK | 按用户查询消耗明细 |
GetSessionCreditDetail | 计费查询 | AK/SK | 按会话查询 Credit 消耗明细 |
GetUserCreditRecords | 计费查询 | AK/SK | 按用户和日期范围查询 Credit 消耗记录 |
CreateScheduledTask | 定时任务 | JWT | 创建定时任务 |
UpdateScheduledTask | 定时任务 | JWT | 更新定时任务 |
GetScheduledTask | 定时任务 | JWT | 查询单个任务详情 |
ListScheduledTasks | 定时任务 | JWT | 分页列举任务 |
DeleteScheduledTask | 定时任务 | JWT | 删除任务 |
PauseScheduledTask | 定时任务 | JWT | 暂停任务 |
ResumeScheduledTask | 定时任务 | JWT | 恢复任务 |
ListScheduledTaskRuns | 定时任务 | JWT | 查询执行记录 |
ListAllUserScheduledTasks | 定时任务 | AK/SK | 管理员查询指定用户的定时任务列表 |
DeleteAllUserScheduledTasks | 定时任务 | AK/SK | 管理员删除指定用户的定时任务(支持批量) |
ListAllUserScheduledTaskRuns | 定时任务 | AK/SK | 租户维度查询全部用户的执行记录(管理员) |
CreateChannelInstanceQrCode | 渠道管理 | AK/SK | 创建微信扫码绑定会话,返回二维码与 |
DescribeChannelInstanceQrCode | 渠道管理 | AK/SK | 轮询扫码状态 |
ListChannelInstances | 渠道管理 | AK/SK | 分页查询渠道实例列表 |
DescribeChannelInstance | 渠道管理 | AK/SK | 查询单个实例详情 |
UpdateChannelInstance | 渠道管理 | AK/SK | 启用/禁用渠道实例 |
DescribeChannelInstanceStats | 渠道管理 | AK/SK | 渠道实例状态统计 |
ListTemplates | 模板管理 | AK/SK | 查询当前租户下的 Agent 模板列表 |
GetTemplate | 模板管理 | AK/SK | 获取指定 Agent 模板的完整配置信息 |
SetTemplateSystemRules | 模板管理 | AK/SK | 设置或更新 Agent 模板的系统提示规则 |
会话交互接口
GetAccessToken - 获取对话令牌
接口描述
获取用户进行对话所需的访问令牌(AccessToken),用于后续调用 Chat 接口进行身份验证。
令牌格式: AccessToken 为 JWT,由 Header.Payload.Signature 三段经 Base64URL 编码后以 . 连接成一行;下表示例为脱敏示意,实际 RequestId、JWT 各段均更长。
令牌有效期: AccessToken 在一段时间内有效,过期后须重新调用本接口获取新令牌。
请求信息
认证方式: POP V1 签名(AK/SK),详见使用示例
Action:
GetAccessToken
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ExternalUserId | string | 是 | 外部系统用户唯一标识 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "GetAccessToken",
"RegionId": "cn-shanghai",
"ExternalUserId": "user-38764",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识(UUID 形态,首尾保留示意) |
|
AccessToken | string | JWT,用于 Chat 的 Query 参数 |
|
AccessDeniedDetail | string | 鉴权失败详情 |
|
响应示例
成功:
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"AccessToken": "eyJhbGc****.eyJ********.****TCk"
}
失败:
{
"Success": false,
"Code": "400",
"Message": "Invalid ExternalUserId",
"HttpStatusCode": 400
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | ExternalUserId 格式不正确 |
401 | Unauthorized | 未授权 | 缺少必要的认证信息 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
Chat - 流式对话
接口描述
与 JVS Crew 进行流式对话,采用 Server-Sent Events (SSE) 协议实时推送对话内容。
特性:
实时流式响应,降低首字延迟
支持多模态输入(文本、图片、文件)
会话保持,支持多轮对话
事件驱动,精确控制消息状态
Agent 任务独立于 SSE 连接运行——客户端断开连接不会中止正在执行的任务;重新连接同一 SessionId 或调用 ListSessionHistory 可查询任务状态
请求信息
请求方法:
POSTContent-Type:
application/json响应 Content-Type:
text/event-stream
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TemplateId | string | 否 | Agent 模板 ID |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
Accept | string | 是 | 接受的响应类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
Cache-Control | string | 否 | 缓存控制 |
|
Connection | string | 否 | 连接类型 |
|
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
SessionId | string | 否 | 会话 ID,用于多轮对话上下文保持 |
|
ExternalUserId | string | 是 | 外部系统用户 ID |
|
Input | string | 否 | 消息列表(JSON 字符串),按时间顺序排列 |
|
RoutingKey | string | 否 | 路由键,用于指定处理请求的后端实例 |
|
StreamOptions | object | 否 | 流式输出控制选项。包含 |
|
Settings | object | 否 | 其他设置信息。包含输出文件模式控制参数 |
|
StreamOptions 结构说明
StreamOptions 是可选的流式输出控制参数,用于精简 SSE 流返回的事件内容。
名称 | 类型 | 必填 | 默认值 | 描述 |
IncludeReasoning | boolean | 否 |
| 是否包含模型思考过程。设为 |
IncludeToolCalls | boolean | 否 |
| 是否包含工具调用详情。设为 |
使用建议:面向终端用户的 C 端场景建议设置 "IncludeReasoning": false, "IncludeToolCalls": false,可大幅简化客户端解析逻辑。
注意:
未传
StreamOptions或传空对象{}时,默认行为与旧版完全一致过滤仅影响 SSE 输出,不影响模型推理过程和工具调用的实际执行
过滤后
SequenceNumber不保证连续,但顺序正确
Settings 结构说明
名称 | 类型 | 必填 | 默认值 | 描述 |
OutputFileMode | string | 否 |
| 控制文件输出模式的参数,可选 |
使用建议:传递base64时,工具输出的file类型数据结构,以base64形式返回,但base64大小过大会影响SSE传输稳定性,故不推荐使用。传递url时,会传递临时可下载的url。
注意:
未传
Settings或传空对象{}时,默认行为为使用base64后续计划会切换为默认模式为
url,故建议接入时使用url模式
Input 结构说明
Input 参数是一个 JSON 字符串(非对象数组),包含 Message 数组,需要先序列化为字符串再传递。
Message 结构(JSON 字符串内的数组元素):
名称 | 类型 | 必填 | 描述 | 示例值 | 枚举值 |
Role | string | 是 | 消息角色 |
|
|
Content | array | 否 | 内容块列表 | 见下方 Content 结构 | - |
Content 结构(Message 中的 Content 数组元素):
名称 | 类型 | 必填 | 描述 | 示例值 | 枚举值 |
Type | string | 是 | 内容类型 |
|
|
Text | string | 否 | 文本内容(Type=text) |
| - |
ImageUrl | string | 否 | 图片 URL 或 base64(Type=image) |
| - |
FileUrl | string | 否 | 文件路径或 URL(Type=file) |
| - |
FileName | string | 否 | 文件名称(Type=file 时可选,用于指定文件显示名称) |
| - |
请求示例
curl -N -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/api/agent/chat?Authorization=Bearer%20<access_token>&TemplateId=<template_id>' \
-H 'Content-Type: application/json' \
-H 'Accept: text/event-stream' \
-H 'Cache-Control: no-cache' \
-H 'Connection: keep-alive' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: Chat' \
-H 'x-acs-date: 2026-03-18T06:21:31Z' \
-d '{
"Input": "[{\"Role\":\"user\",\"Content\":[{\"Type\":\"text\",\"Text\":\"你好\"}]}]",
"ExternalUserId": "test-user",
"SessionId": "test-session-001",
"StreamOptions": {
"IncludeReasoning": false,
"IncludeToolCalls": false
},
"Settings": {
"OutputFileMode": "url"
}
}'
注意:
-N参数用于禁用缓冲,实时接收 SSE 流x-acs-date需要设置为当前 UTC 时间(ISO 8601 格式)Input是 JSON 字符串,需要转义引号<access_token>替换为实际的访问令牌,若令牌过期(401 错误),需重新调用 GetAccessToken 获取
响应参数(SSE 事件)
SSE 响应格式为 data: <JSON>\n\n,每条数据行包含一个事件对象。服务端会定期发送 :ping 心跳行(无 data: 前缀)用于保持连接,客户端忽略即可。
通用字段
名称 | 类型 | 描述 | 示例值 |
Object | string | 事件对象类型 |
|
Id | string | 消息唯一标识 |
|
SessionId | string | 会话 ID |
|
SequenceNumber | string | 事件序号,用于保证顺序 |
|
Response 事件字段
Object=response 事件是整个回复的生命周期包装,标记回复的开始与结束。
名称 | 类型 | 描述 | 枚举值 |
Status | string | 回复状态 |
|
Message 事件字段
Object=message 事件表示一段具体的消息,通过 Type 字段区分消息类型。
名称 | 类型 | 描述 | 枚举值 |
Role | string | 角色 |
|
Type | string | 消息类型 |
|
Status | string | 运行状态 |
|
Content | array | 内容块列表(仅 | 见下方 Content 结构 |
CreatedAt | string | 创建时间戳(Unix 秒) |
|
Content 结构(响应)
名称 | 类型 | 描述 | 示例值 |
Type | string | 内容类型 |
|
Status | string | 内容状态 |
|
Text | string | 文本内容 |
|
Data | object | 结构化数据(如工具调用) |
|
事件类型说明
事件类型 | Object | 描述 | 触发时机 |
回复创建 |
| Status= | SSE 流开始 |
回复进行中 |
| Status= | 开始生成内容 |
思考开始 |
| Type= | 模型开始推理 |
思考内容增量 |
| 思考阶段的文本片段(Status= | 每生成一段思考文本 |
思考完成 |
| Type= | 推理结束 |
消息开始 |
| Type= | 开始生成正式回复 |
消息内容增量 |
| 正式回复的文本片段(Status= | 每生成一段回复文本 |
消息内容完成 |
| 聚合后的完整文本(Status= | 正式回复文本生成完毕 |
消息完成 |
| Type= | 正式回复结束 |
回复完成 |
| Status= | SSE 流结束 |
错误 |
| 错误信息 | 发生错误时 |
心跳 |
| 保持长连接,客户端忽略即可 | 空闲时每隔数秒 |
注意:思考阶段(reasoning)的 content 是模型内部推理过程,通常不应展示给终端用户。客户端应通过判断当前 message 的 Type 来决定是否展示对应的 content。SSE 响应示例
完整流程:
data: {"Object":"response","Status":"created","SequenceNumber":"0"}
data: {"Object":"response","Status":"in_progress","SequenceNumber":"1"}
: ping
data: {"Object":"message","Id":"msg_001","SessionId":"176405663****961","Type":"reasoning","Status":"in_progress","SequenceNumber":"2"}
data: {"Object":"content","Id":"msg_001","Type":"text","Status":"in_progress","Text":"用户在打招呼","SequenceNumber":"3"}
data: {"Object":"content","Id":"msg_001","Type":"text","Status":"in_progress","Text":",我简单回复即可","SequenceNumber":"4"}
data: {"Object":"message","Id":"msg_001","Type":"message","Status":"in_progress","SequenceNumber":"5"}
data: {"Object":"content","Id":"msg_001","Type":"text","Status":"in_progress","Text":"您好","SequenceNumber":"6"}
data: {"Object":"content","Id":"msg_001","Type":"text","Status":"in_progress","Text":"!","SequenceNumber":"7"}
data: {"Object":"content","Id":"msg_001","Type":"text","Status":"completed","Text":"用户在打招呼,我简单回复即可","SequenceNumber":"8"}
data: {"Object":"message","Id":"msg_001","Type":"reasoning","Status":"completed","SequenceNumber":"9"}
data: {"Object":"message","Id":"msg_001","Type":"message","Status":"completed","Content":[{"Type":"text","Text":"您好!"}],"SequenceNumber":"10"}
data: {"Object":"response","Status":"completed","SequenceNumber":"11"}
提示:
url类型文件数据结构示例:
{
"Status": "completed",
"Role": "tool",
"Type": "plugin_call_output",
"Content": [{
"Object": "content",
"Type": "data",
"Data": {
"name": "sandbox_send_file_to_user",
"output": "[{\"type\": \"file\", \"source\": {\"type\": \"url\", \"url\": \"https://jvs-crew-san****k%3D\"}, \"filename\": \"test_write.txt\"}, {\"type\": \"text\", \"text\": \"Sent file: test_write.txt\"}]",
"call_id": "call_f0***2a661"
}
}],
"SequenceNumber": "106",
"Object": "message",
"Id": "msg_85a*****7de40a2eba"
}
base64类型文件数据结构示例:
{
"Role": "tool",
"Status": "completed",
"Type": "plugin_call_output",
"Content": [{
"Type": "data",
"Object": "content",
"Data": {
"name": "sandbox_send_file_to_user",
"output": "[{\"type\": \"file\", \"source\": {\"type\": \"base64\", \"media_type\": \"text/markdown\", \"data\": \"IyDmrKL*****15bm0Kgo=\"}, \"filename\": \"welcome.md\"}, {\"type\": \"text\", \"text\": \"Sent file: welcome.md\"}]",
"call_id": "call_7*****92b0dc"
}
}],
"SequenceNumber": "121",
"Object": "message",
"Id": "msg_655f******b84e"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
409 | TaskInProgress | A task is already running for this session | 该会话当前有正在执行的 Agent 任务。调用 StopSession 取消正在运行的任务,或等待任务完成后重试 |
GetChatFileUploadUrl - 获取文件上传地址
接口描述
获取会话中文件上传 URL、沙箱内路径及 FileKey,用于将文件上传至 Agentbay 为用户提供的 Context 存储空间。完整的文件上传流程分三步:
调用本接口获取
UploadUrl和FileKey使用 HTTP PUT 请求将文件内容上传到
UploadUrl(直传对象存储,无需额外签名)凭该
FileKey调用 SyncContext 将文件同步到沙箱,之后 Agent 方可使用该文件
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
GetChatFileUploadUrl
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
FileName | string | 是 | 要上传的文件名称 |
|
ExternalUserId | string | 是 | 外部系统用户唯一标识 |
|
TemplateId | string | 否 | Agent 模板 ID |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "GetChatFileUploadUrl",
"RegionId": "cn-shanghai",
"FileName": "report.pdf",
"ExternalUserId": "user-38764",
"TemplateId": "template-abc123",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 错误码 |
|
HttpStatusCode | integer | 状态码 |
|
RequestId | string | 请求 ID |
|
AccessDeniedDetail | string | 鉴权失败详情 |
|
UploadUrl | string | 文件上传 URL,客户端使用此 URL 上传文件 |
|
UploadHeadersHint | string | 上传请求所需的额外 Header 提示 |
|
SandboxPath | string | 文件在沙箱内的路径 |
|
FileKey | string | 文件标识,后续调用 SyncContext 时需传入此值。注意:FileKey 由服务端生成,格式为 |
|
响应示例
成功:
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"UploadUrl": "https://oss-example.aliyuncs.com/upload/...",
"UploadHeadersHint": "...",
"SandboxPath": "/home/wuying/jvscrew/uploads/report_a1b2c3d4.pdf",
"FileKey": "uploads/report_a1b2c3d4.pdf"
}
SyncContext - 同步 Context 的指定文件到沙箱
接口描述
同步指定用户的 Context 中指定文件内容到沙箱环境,确保沙箱中的用户数据与 Context 保持一致。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
SyncContext
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ExternalUserId | string | 是 | 外部系统用户唯一标识 |
|
FileKey | string | 是 | 文件标识(来自 GetChatFileUploadUrl 返回值) |
|
TemplateId | string | 否 | Agent 模板 ID |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "SyncContext",
"RegionId": "cn-shanghai",
"ExternalUserId": "user-38764",
"FileKey": "uploads/report_a1b2c3d4.pdf",
"TemplateId": "template-abc123",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 错误码 |
|
HttpStatusCode | integer | 状态码 |
|
RequestId | string | 请求 ID |
|
AccessDeniedDetail | string | 鉴权失败详情 |
|
响应示例
成功:
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C"
}
技能管理接口
ListSkills - 查询技能列表
接口描述
按技能类型分页查询当前租户、当前模板可见的技能列表,并返回每个技能在该模板下的启用状态。
Type 必须显式传入,且一次只能查询一种类型。如需展示完整技能列表,请分别调用 Type=builtin 和 Type=market 后在调用方侧合并。内置技能默认启用,市场技能默认禁用,响应中的 Enabled 字段已经是当前租户和模板下的最终启用状态。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
ListSkills
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Type | string | 是 | 技能类型: |
|
TemplateId | string | 否 | Agent 模板 ID;不传时使用用户绑定的默认模板 |
|
PageNumber | integer | 否 | 页码,从 |
|
PageSize | integer | 否 | 每页条数,取值范围 |
|
Status | string | 否 | 技能状态过滤,仅对 |
|
Tags | string | 否 | 标签 ID 筛选,JSON 数组格式,多个标签为 OR 语义;仅对 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "ListSkills",
"RegionId": "cn-shanghai",
"Type": "market",
"PageNumber": 1,
"PageSize": 50,
"TemplateId": "template-abc123",
"Tags": '["tag_001","tag_002"]',
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
RequestId | string | 请求唯一标识 |
|
Skills | array | 技能列表 | 见下方 |
TotalCount | string | 符合条件的技能总数。注意该字段为字符串,使用前需按数字解析 |
|
PageNumber | integer | 当前页码(回显请求参数) |
|
PageSize | integer | 每页条数(回显请求参数) |
|
Skills 数组元素:
名称 | 类型 | 描述 | 示例值 |
SkillId | string | 技能唯一 ID,内置技能通常以 |
|
SkillName | string | 技能名,可用于后续技能开关类接口定位技能 |
|
Type | string | 技能类型,与请求参数 |
|
Description | string | 技能描述 |
|
Icon | string | 图标,可能为 emoji 或图片 URL |
|
GmtModified | string | 最近修改时间;市场技能通常返回该字段 |
|
Enabled | boolean | 当前租户和模板下该技能是否启用 |
|
SkillStatus | string | 市场技能状态;内置技能通常为空 |
|
Tags | array | 租户标签列表;仅市场技能返回 |
|
响应示例
{
"Success": true,
"Code": "200",
"RequestId": "EA12****-****-****-****-****E5C",
"Skills": [
{
"SkillId": "builtin:deep_web_search",
"SkillName": "deep_web_search",
"Type": "builtin",
"Description": "深度网络信息搜索",
"Icon": "search",
"GmtModified": "",
"Enabled": true,
"SkillStatus": "",
"Tags": []
},
{
"SkillId": "skill_abc123",
"SkillName": "my_automation_tool",
"Type": "market",
"Description": "自动化办公工具",
"Icon": "code",
"GmtModified": "2026-05-21T10:30:00Z",
"Enabled": false,
"SkillStatus": "AVAILABLE",
"Tags": ["tag_001", "tag_002"]
}
],
"TotalCount": "11",
"PageNumber": 1,
"PageSize": 50
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | 400 | type 必须为 builtin 或 market |
|
417 | 400 | query → type: Field required | 缺少必填参数 |
503 | ServiceUnavailable | Skill center unavailable | 查询市场技能时上游技能中心暂不可用 |
500 | InternalError | Internal server error | 服务端内部错误,请记录 |
注意事项
Type只能传单一值,不能同时查询builtin和market。PageSize最大为100,市场技能较多时请按页遍历。响应会回显
PageNumber和PageSize,可用于客户端翻页状态同步。TemplateId不传时使用默认模板;不同模板下的Enabled状态相互独立。AK/SK 必须保存在服务端并完成签名,禁止在前端代码、浏览器或移动 App 包中暴露。
SetSkillPreference - 设置用户技能偏好
接口描述
为当前用户设置在指定 Agent 模板下对某个技能(builtin 或 market)的启用偏好。Preference 取值为 Enabled / Disabled / Default,其中 Default 会删除该用户对此技能的偏好记录,让该技能回落到模板自身的默认启用状态。
适用场景: 在前端给用户一个「单独打开/关闭某个技能」开关时,调用该接口持久化用户选择;用户点击「恢复默认」时传 Default。
与模板的关系: 用户偏好优先级高于模板默认值。设置 Enabled / Disabled 会创建/更新偏好记录;设置 Default 会删除偏好记录,该技能再次跟随模板默认。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数)请求方法:
POSTAction:
SetSkillPreference
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
SkillId | string | 是 | 技能唯一 ID。内置技能以 |
|
Preference | string | 是 | 偏好值,可选 |
|
TemplateId | string | 否 | Agent 模板 ID,不传则使用用户当前绑定的默认模板 |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: SetSkillPreference' \
-H 'x-acs-date: 2026-05-13T06:00:00Z' \
-d '{
"SkillId": "builtin:deep_web_search",
"Preference": "Enabled"
}'
恢复模板默认(删除偏好记录),将 Preference 改为 "Default":
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
SkillId | string | 此次操作对应的技能 ID(回显) |
|
UserPreference | string | 此次操作设置的偏好值(回显),与请求 |
|
响应示例
{
"RequestId": "EA12****-****-****-****-****E5C",
"HttpStatusCode": 200,
"Code": "200",
"Success": true,
"SkillId": "builtin:deep_web_search",
"UserPreference": "Enabled"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | Preference must be Enabled, Disabled, or Default |
|
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
404 | NotFound | SkillId not found | builtin / market 技能列表中均找不到该 SkillId |
500 | InternalError | Skill center unavailable | 校验市场技能时上游技能中心暂不可用 |
注意事项
Preference=Default是删除而不是设置——它会移除该用户对此 SkillId 的偏好记录,使技能回落到模板自身的默认启用状态。SkillId 必须存在于全局 builtin 技能列表,或当前租户的市场技能列表中。
设置偏好后下一次对话生效。
ListSkillPreferences - 查询用户技能偏好列表
接口描述
分页列出当前用户在指定 Agent 模板下设置过的技能偏好。仅返回有显式偏好记录的 skill;没有偏好记录的技能不会出现在结果中。
返回内容: 每条记录包含 SkillId、UserPreference(Enabled 或 Disabled)、UpdatedAt 三个字段。Default 不会出现在 UserPreference 中——一旦用户选择 Default,该条偏好记录会被删除,从此跟随模板默认。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数),与 SetSkillPreference 相同请求方法:
POSTAction:
ListSkillPreferences
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
MaxResults | integer | 否 | 每页最大返回数量,取值范围 |
|
NextToken | string | 否 | 翻页令牌,由上一次响应的 |
|
TemplateId | string | 否 | Agent 模板 ID,不传则使用用户当前绑定的默认模板 |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: ListSkillPreferences' \
-H 'x-acs-date: 2026-05-13T06:00:00Z' \
-d '{
"MaxResults": 100
}'
翻页时携带上一次响应中的 NextToken:
{
"MaxResults": 100,
"NextToken": "eyJwYWdlIjoyfQ=="
}
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
SkillPreferences | array | 用户技能偏好列表 | 见下方 |
NextToken | string | 下一页令牌;为空表示已是最后一页 |
|
SkillPreferences 数组元素:
名称 | 类型 | 描述 | 示例值 |
SkillId | string | 技能唯一 ID |
|
UserPreference | string | 用户设置的偏好值,仅可能为 |
|
UpdatedAt | string | 偏好最后更新时间(ISO 8601) |
|
响应示例
{
"RequestId": "EA12****-****-****-****-****E5C",
"HttpStatusCode": 200,
"Code": "200",
"Success": true,
"SkillPreferences": [
{
"SkillId": "builtin:deep_web_search",
"UserPreference": "Enabled",
"UpdatedAt": "2026-05-13T15:43:56.358003+08:00"
}
],
"NextToken": ""
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
注意事项
返回结果只包含用户主动设置过偏好的技能;如需展示完整技能列表,请配合 ListSkills 使用。
UserPreference不会出现Default——Default操作会删除偏好记录,使该技能在结果中消失。MaxResults上限为100;偏好数较多时请按NextToken翻页
GetSkillCenterCredential - 获取技能包上传凭证
接口描述
获取技能包文件的预签名上传 URL,用于将技能包上传至对象存储。完整的技能包上传流程分两步:
调用本接口获取
Url(预签名上传地址)使用 HTTP PUT 请求将技能包 zip 文件上传到
Url(直传对象存储,无需额外签名,需设置Content-Type: application/octet-stream)
上传完成后,将该 Url 作为 FileUrl 传入 CreateSkillCenterSkill 或 UpdateSkillCenterSkill 即可完成技能创建或更新。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
GetSkillCenterCredential
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
FileName | string | 是 | 待上传的技能包文件名 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "GetSkillCenterCredential",
"RegionId": "cn-shanghai",
"FileName": "my_tool_v2.zip",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
RequestId | string | 请求唯一标识 |
|
Url | string | 预签名上传 URL,有效期有限,需尽快使用 |
|
响应示例
成功:
{
"Success": true,
"Code": "200",
"RequestId": "EA12****-****-****-****-****E5C",
"Url": "https://skill-packages-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/skills/upload/my_tool_v2.zip?Expires=..."
}
失败:
{
"Success": false,
"Code": "400",
"Message": "Invalid FileName",
"HttpStatusCode": 400
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | FileName is required | 缺少必填参数 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
500 | InternalError | 服务内部错误 | 服务端异常 |
注意事项
预签名地址有效期有限,获取后应尽快完成上传。
仅支持
.zip格式的技能包文件。
CreateSkillCenterSkill - 创建市场技能
接口描述
创建一个新的市场技能。技能名称和描述从上传的 OSS 技能包中自动解析,无需手动指定。完整流程为:
调用 GetSkillCenterCredential 获取预签名上传 URL
使用 HTTP PUT 将技能包 zip 文件上传至该 URL
调用本接口,传入
FileUrl完成技能创建
创建成功后默认触发安全检测,可通过 SkipVerify 参数跳过。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
CreateSkillCenterSkill
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
FileUrl | string | 是 | 技能包 OSS 文件 URL(由 GetSkillCenterCredential 返回) |
|
Icon | string | 否 | 图标标识;不传则使用默认图标 |
|
Tags | string | 否 | 标签 ID 列表,JSON 数组格式,最多 10 个;不传表示无标签 |
|
SkipVerify | boolean | 否 | 是否跳过安全检测,默认 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "CreateSkillCenterSkill",
"RegionId": "cn-shanghai",
"FileUrl": "https://skill-packages-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/skills/upload/my_tool_v1.zip?Expires=...",
"Icon": "code",
"Tags": '["tag_001","tag_002"]',
"SkipVerify": "false",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
RequestId | string | 请求唯一标识 |
|
SkillId | string | 创建成功的技能 ID |
|
响应示例
成功:
{
"Success": true,
"Code": "200",
"RequestId": "EA12****-****-****-****-****E5C",
"SkillId": "skill_abc123"
}
失败:
{
"Success": false,
"Code": "400",
"Message": "Invalid FileUrl",
"HttpStatusCode": 400
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | FileUrl is required | 缺少必填参数 |
400 | InvalidParameter | Invalid fileUrl |
|
400 | InvalidParameter | Tags exceeds maximum of 10 | 标签数量超过上限 |
400 | InvalidParameter | Skill name already exists | 同租户下已存在相同名称的技能 |
400 | InvalidParameter | SKILL.md not found in package, expected at root or one level deep | 技能包中未找到 SKILL.md 文件 |
400 | InvalidParameter | Failed to read the uploaded package, file may be corrupted | 技能包无法读取,文件可能已损坏 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
503 | ServiceUnavailable | Downstream service error | 服务端异常 |
注意事项
技能名称和描述从技能包中自动解析,不支持通过请求参数指定。
创建后技能默认状态为
INIT,安全检测通过后变为AVAILABLE;若跳过安全检测则直接变为AVAILABLE。
UpdateSkillCenterSkill - 更新市场技能
接口描述
更新已有市场技能的属性或技能包文件。当传入 FileUrl 时替换 OSS 文件;不传则仅更新 Icon、Tags 等属性。更新成功后默认触发安全检测,可通过 SkipVerify 参数跳过。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
UpdateSkillCenterSkill
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
SkillId | string | 是 | 要更新的技能 ID |
|
FileUrl | string | 否 | 新技能包 OSS 文件 URL(由 GetSkillCenterCredential 返回);不传则不更新技能包文件 |
|
Icon | string | 否 | 图标标识;不传保留原值 |
|
Tags | string | 否 | 标签 ID 列表,JSON 数组格式,最多 10 个;传 |
|
SkipVerify | boolean | 否 | 是否跳过安全检测,默认 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "UpdateSkillCenterSkill",
"RegionId": "cn-shanghai",
"SkillId": "skill_abc123",
"FileUrl": "https://skill-packages-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/skills/upload/my_tool_v2.zip?Expires=...",
"Icon": "code",
"Tags": '["tag_001","tag_002"]',
"SkipVerify": "false",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
RequestId | string | 请求唯一标识 |
|
SkillId | string | 更新后的技能 ID |
|
响应示例
成功:
{
"Success": true,
"Code": "200",
"RequestId": "EA12****-****-****-****-****E5C",
"SkillId": "skill_abc123"
}
失败:
{
"Success": false,
"Code": "InvalidParameter",
"Message": "Skill name in package does not match existing skill",
"HttpStatusCode": 400
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | SkillId is required | 缺少必填参数 |
400 | InvalidParameter | Invalid fileUrl |
|
400 | InvalidParameter | Tags exceeds maximum of 10 | 标签数量超过上限 |
400 | InvalidParameter | Skill name in package does not match existing skill | 技能包中名称与已有技能不一致,不允许更名 |
400 | InvalidParameter | SKILL.md not found in package, expected at root or one level deep | 技能包中未找到 SKILL.md 文件 |
400 | InvalidParameter | Failed to read the uploaded package, file may be corrupted | 技能包无法读取,文件可能已损坏 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
503 | ServiceUnavailable | Downstream service error | 服务端异常 |
ListSkillCenterSkills - 查询市场技能列表
接口描述
分页查询当前租户下的市场技能列表,返回每个技能的基本信息和被模板引用的计数。支持按标签筛选。
与 ListSkills 的区别:ListSkills 面向指定模板,展示该模板下可见的技能及启用状态;本接口面向租户整体,展示租户上传的全部市场技能及被引用情况。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
ListSkillCenterSkills
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
MaxResults | integer | 否 | 每页最大条数,默认 |
|
NextToken | string | 否 | 翻页令牌,首次查询不传或传空,后续传上一次响应返回的 |
|
Tags | string | 否 | 标签 ID 筛选,JSON 数组格式,多个标签为 OR 语义;不传表示不过滤 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "ListSkillCenterSkills",
"RegionId": "cn-shanghai",
"MaxResults": "20",
"Tags": '["tag_001","tag_002"]',
}
params["Signature"] = _sign_v1(params, sk)
翻页请求:
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "ListSkillCenterSkills",
"RegionId": "cn-shanghai",
"MaxResults": "20",
"NextToken": "eyJ...",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
RequestId | string | 请求唯一标识 |
|
Skills | array | 市场技能列表 | 见下方 |
TotalCount | integer | 符合条件的技能总数 |
|
MaxResults | integer | 实际使用的每页大小 |
|
NextToken | string | 下一页令牌,为空表示已到末页 |
|
Skills 数组元素:
名称 | 类型 | 描述 | 示例值 |
SkillId | string | 技能唯一 ID |
|
SkillName | string | 技能名称 |
|
Description | string | 技能描述 |
|
Icon | string | 图标标识 |
|
GmtModified | string | 最近修改时间,ISO 8601 格式 |
|
SkillStatus | string | 技能状态: |
|
EnabledTemplateCount | integer | 被启用该技能的模板数量 |
|
TenantTags | array | 租户标签列表 |
|
响应示例
成功:
{
"Success": true,
"Code": "200",
"RequestId": "EA12****-****-****-****-****E5C",
"Skills": [
{
"SkillId": "skill_abc123",
"SkillName": "my_automation_tool",
"Description": "自动化办公工具",
"Icon": "code",
"GmtModified": "2026-05-21T10:30:00Z",
"SkillStatus": "AVAILABLE",
"EnabledTemplateCount": 3,
"TenantTags": ["tag_001", "tag_002"]
},
{
"SkillId": "skill_def456",
"SkillName": "data_analysis",
"Description": "数据分析助手",
"Icon": "chart",
"GmtModified": "2026-05-20T08:00:00Z",
"SkillStatus": "VERIFYING",
"EnabledTemplateCount": 0,
"TenantTags": []
}
],
"TotalCount": 12,
"MaxResults": 20,
"NextToken": ""
}
失败:
{
"Success": false,
"Code": "400",
"Message": "Invalid NextToken",
"HttpStatusCode": 400
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | Invalid NextToken |
|
401 | Unauthorized | 未授权 | AK/SK 无效 |
500 | InternalError | Skill center unavailable | 服务端异常 |
用户 MCP 管理接口
MCP(Model Context Protocol)是 Agent 调用外部工具的通道。模板管理员可以在模板上配置共享 MCP,本组接口允许用户在此基础上进行个性化管理:
偏好控制 — 按用户启用/关闭模板上的 MCP(覆盖管理员默认设置)
凭证绑定 — 为模板 MCP 绑定用户自己的 token(如高德 OAuth),替代共享 token
专属 MCP — 用户自行添加的 MCP(URL/token 全部由用户控制,与模板独立)
所有用户 MCP 管理接口使用 JWT 认证,身份信息(tenant_id、crew_user_id)从 JWT claims 中获取。设置变更在下次会话时生效。
SetUserMcpPreference - 设置用户 MCP 偏好
接口描述
设置当前用户对某个模板级 MCP 的启用偏好。Preference 取值为 enabled / disabled / default,其中 default 表示恢复跟随模板默认值(偏好记录保留,便于追溯操作时间)。
适用场景: 集成方在前端为用户提供「单独打开/关闭某个 MCP」开关时调用此接口持久化用户选择。
与模板的关系: 用户偏好优先级高于模板默认值。设置 enabled / disabled 会覆盖模板默认状态;设置 default 则回落到模板的 enabled 字段决定是否加载。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数)请求方法:
POSTAction:
SetUserMcpPreference
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
TemplateId | string | 否 | 模板 ID,不传则使用租户默认模板 |
|
McpId | string | 是 | 要操作的模板 MCP 标识 |
|
Preference | string | 是 | 偏好值,枚举: |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: SetUserMcpPreference' \
-H 'x-acs-date: 2026-05-27T06:00:00Z' \
-d '{
"McpId": "amap_mcp",
"Preference": "disabled"
}'
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
IsEffective | boolean | 写入后该 MCP 对此用户的实际启用状态 |
|
Source | string | 当前状态来源: |
|
响应示例
{
"RequestId": "EA12****-****-****-****-****E5C",
"HttpStatusCode": 200,
"Code": "200",
"Success": true,
"IsEffective": false,
"Source": "user_override"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | Preference must be one of: enabled, disabled, default | Preference 取值非法 |
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
404 | NotFound.TemplateMcp | MCP not found in template | McpId 在模板 MCP 配置中不存在 |
SetUserMcpCredential - 设置用户 MCP 凭证
接口描述
为当前用户绑定某个模板级 MCP 的专属凭证(HTTP Headers),覆盖模板共享 token。绑定后,Agent 调用该 MCP 时使用用户的 headers(URL 仍来自模板配置)。
适用场景: 高德地图、企业 OA 等外部系统按用户鉴权——每个用户需要带自己的 OAuth token 调用。通过此接口持久化绑定后,无需每次会话重传。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数)请求方法:
POSTAction:
SetUserMcpCredential
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
TemplateId | string | 否 | 模板 ID,不传则使用租户默认模板 |
|
McpId | string | 是 | 要绑定凭证的模板 MCP 标识 |
|
Headers | map<string, string> | 是 | 凭证头,如包含 Authorization 等 |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: SetUserMcpCredential' \
-H 'x-acs-date: 2026-05-27T06:00:00Z' \
-d '{
"McpId": "amap_mcp",
"Headers": {
"Authorization": "Bearer user_oauth_token_xxx",
"X-Custom-Header": "value"
}
}'
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
IsCredentialBound | boolean | 写入后恒为 |
|
响应示例
{
"RequestId": "EA12****-****-****-****-****E5C",
"HttpStatusCode": 200,
"Code": "200",
"Success": true,
"IsCredentialBound": true
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | Headers must be a non-empty map | Headers 为空或非 map 类型 |
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
404 | NotFound.TemplateMcp | MCP not found in template | McpId 在模板 MCP 配置中不存在 |
ClearUserMcpCredential - 清除用户 MCP 凭证
接口描述
解绑当前用户对某个模板级 MCP 的专属凭证,回退使用模板共享 token。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数)请求方法:
POSTAction:
ClearUserMcpCredential
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
TemplateId | string | 否 | 模板 ID,不传则使用租户默认模板 |
|
McpId | string | 是 | 要解绑凭证的模板 MCP 标识 |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: ClearUserMcpCredential' \
-H 'x-acs-date: 2026-05-27T06:00:00Z' \
-d '{
"McpId": "amap_mcp"
}'
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
IsCredentialBound | boolean | 解绑后恒为 |
|
响应示例
{
"RequestId": "EA12****-****-****-****-****E5C",
"HttpStatusCode": 200,
"Code": "200",
"Success": true,
"IsCredentialBound": false
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
CreateUserMcp - 创建用户专属 MCP
接口描述
为当前用户创建一个专属 MCP。用户专属 MCP 的 URL、传输协议、凭证全部由用户自行控制,与模板 MCP 独立。
适用场景: 用户想接入自己的内部系统(如企业 OA、私有工具),而模板上未配置该 MCP。
连通性: 创建时不做连通性校验,写入即生效。运行时连接失败会透传给 Agent。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数)请求方法:
POSTAction:
CreateUserMcp
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
TemplateId | string | 否 | 模板 ID,不传则使用租户默认模板 |
|
Name | string | 是 | MCP 名称,用于展示 |
|
Transport | string | 是 | 传输协议,枚举: |
|
Url | string | 是 | MCP 服务端点 URL |
|
Headers | map<string, string> | 否 | 请求头(含凭证) |
|
Description | string | 否 | MCP 描述 |
|
Timeout | number | 否 | 连接超时(秒),默认 30 |
|
SseReadTimeout | number | 否 | SSE 读超时(秒),默认 300 |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: CreateUserMcp' \
-H 'x-acs-date: 2026-05-27T06:00:00Z' \
-d '{
"Name": "企业 OA",
"Transport": "sse",
"Url": "https://my-oa.internal/mcp/sse",
"Headers": {
"Authorization": "Bearer my_oa_token"
},
"Description": "企业内部 OA 系统",
"Timeout": 15
}'
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
McpId | string | 系统生成的 MCP 标识 |
|
Name | string | 名称 |
|
Transport | string | 传输协议 |
|
Url | string | 服务端点 URL |
|
Headers | map<string, string> | null | 请求头 |
|
Description | string | null | 描述 |
|
Timeout | number | 连接超时(秒) |
|
SseReadTimeout | number | SSE 读超时(秒) |
|
IsEnabled | boolean | 启用状态 |
|
CreateTime | string | 创建时间(ISO 8601) |
|
ModifyTime | string | 最后修改时间(ISO 8601) |
|
响应示例
{
"RequestId": "EA12****-****-****-****-****E5C",
"HttpStatusCode": 200,
"Code": "200",
"Success": true,
"McpId": "usr_mcp_a1b2c3d4",
"Name": "企业 OA",
"Transport": "sse",
"Url": "https://my-oa.internal/mcp/sse",
"Headers": {
"Authorization": "Bearer my_oa_token"
},
"Description": "企业内部 OA 系统",
"Timeout": 15,
"SseReadTimeout": 300,
"IsEnabled": true,
"CreateTime": "2026-05-27T10:00:00Z",
"ModifyTime": "2026-05-27T10:00:00Z"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | Transport must be streamable_http or sse | Transport 取值非法 |
400 | MissingParameter | Name is required | 必填参数缺失 |
400 | MissingParameter | Url is required | 必填参数缺失 |
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
UpdateUserMcp - 更新用户专属 MCP
接口描述
更新当前用户的某个专属 MCP 配置。采用部分更新语义——只更新请求中传入的字段,未传的字段保持不变。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数)请求方法:
POSTAction:
UpdateUserMcp
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
TemplateId | string | 否 | 模板 ID,不传则使用租户默认模板 |
|
McpId | string | 是 | 要更新的用户专属 MCP 标识 |
|
Name | string | 否 | 名称(传则更新) |
|
Transport | string | 否 | 传输协议(传则更新) |
|
Url | string | 否 | URL(传则更新) |
|
Headers | map<string, string> | 否 | 请求头(传则全量替换,传空 map |
|
Description | string | 否 | 描述(传则更新) |
|
Timeout | number | 否 | 连接超时(传则更新) |
|
SseReadTimeout | number | 否 | SSE 读超时(传则更新) |
|
IsEnabled | boolean | 否 | 启用状态(传则更新) |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: UpdateUserMcp' \
-H 'x-acs-date: 2026-05-27T06:00:00Z' \
-d '{
"McpId": "usr_mcp_a1b2c3d4",
"Headers": {
"Authorization": "Bearer new_refreshed_token"
},
"Timeout": 20
}'
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
McpId | string | MCP 标识 |
|
Name | string | 名称 |
|
Transport | string | 传输协议 |
|
Url | string | 服务端点 URL |
|
Headers | map<string, string> | null | 请求头 |
|
Description | string | null | 描述 |
|
Timeout | number | 连接超时(秒) |
|
SseReadTimeout | number | SSE 读超时(秒) |
|
IsEnabled | boolean | 启用状态 |
|
CreateTime | string | 创建时间(ISO 8601) |
|
ModifyTime | string | 最后修改时间(ISO 8601) |
|
响应示例
{
"RequestId": "EA12****-****-****-****-****E5C",
"HttpStatusCode": 200,
"Code": "200",
"Success": true,
"McpId": "usr_mcp_a1b2c3d4",
"Name": "企业 OA",
"Transport": "sse",
"Url": "https://my-oa.internal/mcp/sse",
"Headers": {
"Authorization": "Bearer new_refreshed_token"
},
"Description": "企业内部 OA 系统",
"Timeout": 20,
"SseReadTimeout": 300,
"IsEnabled": true,
"CreateTime": "2026-05-27T10:00:00Z",
"ModifyTime": "2026-05-27T11:30:00Z"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | Transport must be streamable_http or sse | Transport 取值非法 |
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
404 | NotFound.UserMcp | User MCP not found | McpId 对应的用户专属 MCP 不存在 |
DeleteUserMcp - 删除用户专属 MCP
接口描述
删除当前用户的某个专属 MCP。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数)请求方法:
POSTAction:
DeleteUserMcp
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
TemplateId | string | 否 | 模板 ID,不传则使用租户默认模板 |
|
McpId | string | 是 | 要删除的用户专属 MCP 标识 |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: DeleteUserMcp' \
-H 'x-acs-date: 2026-05-27T06:00:00Z' \
-d '{
"McpId": "usr_mcp_a1b2c3d4"
}'
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
响应示例
{
"RequestId": "EA12****-****-****-****-****E5C",
"HttpStatusCode": 200,
"Code": "200",
"Success": true
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
GetUserMcp - 查询用户专属 MCP
接口描述
查询当前用户的单个专属 MCP 详情。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数)请求方法:
POSTAction:
GetUserMcp
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
TemplateId | string | 否 | 模板 ID,不传则使用租户默认模板 |
|
McpId | string | 是 | 用户专属 MCP 标识 |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: GetUserMcp' \
-H 'x-acs-date: 2026-05-27T06:00:00Z' \
-d '{
"McpId": "usr_mcp_a1b2c3d4"
}'
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
McpId | string | MCP 标识 |
|
Name | string | 名称 |
|
Transport | string | 传输协议 |
|
Url | string | 服务端点 URL |
|
Headers | map<string, string> | null | 请求头 |
|
Description | string | null | 描述 |
|
Timeout | number | 连接超时(秒) |
|
SseReadTimeout | number | SSE 读超时(秒) |
|
IsEnabled | boolean | 启用状态 |
|
CreateTime | string | 创建时间(ISO 8601) |
|
ModifyTime | string | 最后修改时间(ISO 8601) |
|
响应示例
{
"RequestId": "EA12****-****-****-****-****E5C",
"HttpStatusCode": 200,
"Code": "200",
"Success": true,
"McpId": "usr_mcp_a1b2c3d4",
"Name": "企业 OA",
"Transport": "sse",
"Url": "https://my-oa.internal/mcp/sse",
"Headers": {
"Authorization": "Bearer my_oa_token"
},
"Description": "企业内部 OA 系统",
"Timeout": 15,
"SseReadTimeout": 300,
"IsEnabled": true,
"CreateTime": "2026-05-27T10:00:00Z",
"ModifyTime": "2026-05-27T10:00:00Z"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
404 | NotFound.UserMcp | User MCP not found | McpId 对应的用户专属 MCP 不存在 |
ListUserMcps - 查询用户 MCP 列表
接口描述
列出当前用户全部 MCP 的合并视图,包含模板级 MCP(附带用户偏好和凭证绑定状态)与用户专属 MCP。集成方拿到此列表,即可在 UI 上展示"当前用户有哪些工具可用"。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数)请求方法:
POSTAction:
ListUserMcps
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
TemplateId | string | 否 | 模板 ID,不传则使用租户默认模板 |
|
Source | string | 否 | 来源过滤,枚举: |
|
MaxResults | integer | 否 | 每页最大返回数量,取值范围 |
|
NextToken | string | 否 | 翻页令牌,由上一次响应的 |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: ListUserMcps' \
-H 'x-acs-date: 2026-05-27T06:00:00Z' \
-d '{
"Source": "all",
"MaxResults": 50
}'
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
Mcps | array | MCP 列表(见下方 McpItem 结构) | 见下方 |
NextToken | string | 下一页令牌;为空表示已是最后一页 |
|
MaxResults | integer | 实际使用的每页大小 |
|
Mcps 数组元素(McpItem):
名称 | 类型 | 条件 | 描述 | 示例值 |
McpId | string | 所有 | MCP 标识 |
|
Name | string | 所有 | 名称 |
|
Description | string | null | 所有 | MCP 描述 |
|
Transport | string | 所有 | 传输协议 |
|
Url | string | 所有 | 服务端点 |
|
Source | string | 所有 | 来源: |
|
IsEffective | boolean | 所有 | 该用户当前实际是否启用 |
|
Preference | string | null | Source=template | 用户偏好: |
|
TemplateDefault | boolean | null | Source=template | 模板 |
|
IsCredentialBound | boolean | null | Source=template | 用户是否绑定了专属凭证 |
|
Headers | map<string, string> | null | Source=user_persistent | 用户专属 MCP 的请求头;模板级 MCP 不返回此字段 |
|
响应示例
{
"RequestId": "EA12****-****-****-****-****E5C",
"HttpStatusCode": 200,
"Code": "200",
"Success": true,
"Mcps": [
{
"McpId": "amap_mcp",
"Name": "高德地图",
"Description": "高德地图 MCP,提供地理编码、路径规划等能力",
"Transport": "streamable_http",
"Url": "https://mcp.amap.com/sse",
"Source": "template",
"IsEffective": true,
"Preference": "default",
"TemplateDefault": true,
"IsCredentialBound": true,
"Headers": null
},
{
"McpId": "internal_crm",
"Name": "内部 CRM",
"Description": null,
"Transport": "streamable_http",
"Url": "https://crm.internal/mcp",
"Source": "template",
"IsEffective": false,
"Preference": "disabled",
"TemplateDefault": true,
"IsCredentialBound": false,
"Headers": null
},
{
"McpId": "usr_mcp_a1b2c3d4",
"Name": "企业 OA",
"Description": "企业内部 OA 系统",
"Transport": "sse",
"Url": "https://my-oa.internal/mcp/sse",
"Source": "user_persistent",
"IsEffective": true,
"Preference": null,
"TemplateDefault": null,
"IsCredentialBound": null,
"Headers": {
"Authorization": "Bearer my_oa_token"
}
}
],
"NextToken": "",
"MaxResults": 50
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | Source must be one of: all, template, user_persistent | Source 取值非法 |
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
工作空间管理接口
接入提示:本章节接口要求ExternalUserId已在平台有过会话记录。新用户请先用 AccessToken 调用一次 Chat 完成首次会话,再调用本章节接口;否则会返回404 UserNotFound。
SyncWorkspaceFiles - 同步用户工作空间文件
接口描述
触发指定用户活跃沙箱中的工作空间文件同步到 Context,用于在读取文件列表或下载文件前获取最新快照。
如果用户当前没有活跃沙箱,会返回成功且 SyncStatus 为 no_active_session。此时 Context 中仍保留上次沙箱释放或同步后的快照,调用方可以继续使用 ListWorkspaceFiles 读取已有数据。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
SyncWorkspaceFiles
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ExternalUserId | string | 是 | 外部系统用户唯一标识 |
|
TemplateId | string | 否 | Agent 模板 ID;不传时使用用户绑定的默认模板 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "SyncWorkspaceFiles",
"RegionId": "cn-shanghai",
"ExternalUserId": "user-38764",
"TemplateId": "template-abc123",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
SyncStatus | string | 同步状态: |
|
响应示例
同步完成:
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"SyncStatus": "completed",
"Message": ""
}
无活跃沙箱:
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"SyncStatus": "no_active_session",
"Message": ""
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 |
|
401 | Unauthorized | 未授权 | AK/SK 无效 |
404 | UserNotFound | User not found |
|
500 | TenantConfigError | Tenant API key not configured | 租户 AgentBay API Key 缺失 |
500 | InternalError | Sync operation failed | 同步操作失败,请稍后重试 |
ListWorkspaceFiles - 列举用户工作空间文件
接口描述
列举指定用户工作空间中某个目录下的文件和子目录。路径以用户工作空间根目录为基准,例如列举用户 active skills 目录时传 Path="active_skills"。
该接口只返回单层目录内容。如需读取文件内容,可先从响应中取得 FilePath,再调用 GetWorkspaceFileDownloadUrl 获取临时下载地址。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
ListWorkspaceFiles
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ExternalUserId | string | 是 | 外部系统用户唯一标识 |
|
Path | string | 否 | 要列举的目录路径,相对工作空间根目录;不传或传 |
|
MaxResults | integer | 否 | 每页最大返回数量,取值范围 |
|
NextToken | string | 否 | 上一页响应返回的翻页令牌;为空表示第一页 |
|
TemplateId | string | 否 | Agent 模板 ID;不传时使用用户绑定的默认模板 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "ListWorkspaceFiles",
"RegionId": "cn-shanghai",
"ExternalUserId": "user-38764",
"Path": "active_skills",
"MaxResults": 100,
"TemplateId": "template-abc123",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
Path | string | 本次列举的目录路径 |
|
MaxResults | integer | 本次请求的分页大小 |
|
NextToken | string | 下一页令牌;没有更多数据时为 |
|
Files | array | 文件或目录列表 | 见下方 |
Files 数组元素:
名称 | 类型 | 描述 | 示例值 |
FileName | string | 文件或目录名称 |
|
FilePath | string | 相对工作空间根目录的路径 |
|
FileType | string | 条目类型: |
|
Size | integer | 文件大小,目录通常为 |
|
ModifiedAt | string | 最近修改时间,ISO 8601 格式;无值时为 |
|
响应示例
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"Path": "/active_skills",
"MaxResults": 100,
"NextToken": null,
"Files": [
{
"FileName": "builtin-a",
"FilePath": "active_skills/builtin-a",
"FileType": "directory",
"Size": 0,
"ModifiedAt": "2026-05-13T08:00:00Z"
},
{
"FileName": "my-custom-skill",
"FilePath": "active_skills/my-custom-skill",
"FileType": "directory",
"Size": 0,
"ModifiedAt": "2026-05-13T08:01:00Z"
},
{
"FileName": ".managed_skills.json",
"FilePath": "active_skills/.managed_skills.json",
"FileType": "file",
"Size": 26,
"ModifiedAt": "2026-05-13T08:02:00Z"
}
]
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | Path must not contain '..' | 路径包含非法上级目录引用 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
404 | UserNotFound | User not found |
|
404 | NotFound | Path does not exist | 目录不存在 |
500 | TenantConfigError | Tenant API key not configured | 租户 AgentBay API Key 缺失 |
500 | InternalError | Failed to list files | 服务端列举文件失败 |
GetWorkspaceFileDownloadUrl - 获取工作空间文件下载地址
接口描述
获取指定用户工作空间文件的临时下载地址。调用方可使用返回的 DownloadUrl 直接下载文件内容,例如读取 active_skills/.managed_skills.json 或某个 skill 目录下的 SKILL.md。
FilePath 必须指向文件,不能指向目录;路径以用户工作空间根目录为基准。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
GetWorkspaceFileDownloadUrl
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ExternalUserId | string | 是 | 外部系统用户唯一标识 |
|
FilePath | string | 是 | 文件路径,相对工作空间根目录 |
|
TemplateId | string | 否 | Agent 模板 ID;不传时使用用户绑定的默认模板 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "GetWorkspaceFileDownloadUrl",
"RegionId": "cn-shanghai",
"ExternalUserId": "user-38764",
"FilePath": "active_skills/my-custom-skill/SKILL.md",
"TemplateId": "template-abc123",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
DownloadUrl | string | 临时下载地址 |
|
ExpiresInSeconds | integer | 下载地址有效期,单位秒 |
|
FileName | string | 文件名 |
|
FileSize | integer | 文件大小,单位字节;无法获取时为 |
|
响应示例
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"DownloadUrl": "https://oss.example.com/presigned/...",
"ExpiresInSeconds": 3600,
"FileName": "SKILL.md",
"FileSize": 512,
"Message": ""
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | FilePath is required | 未提供 |
400 | InvalidParameter | FilePath cannot point to directory |
|
400 | InvalidParameter | Path must not contain '..' | 路径包含非法上级目录引用 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
404 | UserNotFound | User not found |
|
404 | NotFound | File not found | 文件不存在 |
500 | TenantConfigError | Tenant API key not configured | 租户 AgentBay API Key 缺失 |
500 | InternalError | Failed to get download URL | 服务端获取下载地址失败 |
GetWorkspaceFileUploadUrl - 获取工作空间文件上传地址
接口描述
获取指定用户工作空间内某条文件路径的临时预签名上传地址。调用方拿到 UploadUrl 后,对该 URL 直接发起 HTTP PUT 请求即可将文件内容写入用户工作空间,路径以用户工作空间根目录为基准。
典型用法:将本地或前端选择的文件上传到 documents/report.pdf,后续可通过 ListWorkspaceFiles 看到、通过 GetWorkspaceFileDownloadUrl 下载、或在 Chat 的 Input 中通过 FileUrl 引用。
重要:执行 PUT 请求时必须按照响应里 UploadHeadersHint 给出的 header 透传,当前要求 Content-Type: ""(空字符串),否则 OSS 会返回 403。
FilePath 必须指向文件,不能指向目录(不能以 / 结尾),不能包含 ..。同一路径重复获取上传地址不会清空已有文件——真正的写入是在 PUT 阶段完成的;同路径重复 PUT 等价于覆盖(last-write-wins)。
单次上传文件大小上限当前为 50 MB(52428800 字节),由响应字段 MaxFileSize 透出,调用方应在客户端对文件大小做校验。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
GetWorkspaceFileUploadUrl
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ExternalUserId | string | 是 | 外部系统用户唯一标识 |
|
FilePath | string | 是 | 工作空间内的相对文件路径,不能以 |
|
TemplateId | string | 否 | Agent 模板 ID;不传时使用用户绑定的默认模板 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "GetWorkspaceFileUploadUrl",
"RegionId": "cn-shanghai",
"ExternalUserId": "user-38764",
"FilePath": "documents/report.pdf",
"TemplateId": "template-abc123",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
UploadUrl | string | 预签名上传 URL,对其发 HTTP PUT 即可上传文件内容 |
|
ExpiresInSeconds | integer | 上传地址有效期,单位秒 |
|
FilePath | string | 规范化后的相对文件路径 |
|
MaxFileSize | integer | 允许的最大文件大小,单位字节;当前为 50 MB |
|
UploadHeadersHint | object | 执行 PUT 时建议透传的 header;当前需带 |
|
响应示例
成功:
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"UploadUrl": "https://oss.example.com/presigned-put/...",
"ExpiresInSeconds": 3600,
"FilePath": "documents/report.pdf",
"MaxFileSize": 52428800,
"UploadHeadersHint": {
"Content-Type": ""
},
"Message": ""
}
失败:
{
"Success": false,
"Code": "400",
"Message": "FilePath cannot point to directory",
"HttpStatusCode": 400
}
完整上传示例(两步流程)
import requests
# Step 1: 获取上传地址
upload_resp = call_pop("GetWorkspaceFileUploadUrl", {
"ExternalUserId": "user-38764",
"FilePath": "documents/report.pdf",
})
upload_url = upload_resp["UploadUrl"]
hint = upload_resp.get("UploadHeadersHint") or {}
# Step 2: 直接 PUT 文件内容到该 URL
with open("./report.pdf", "rb") as f:
r = requests.put(upload_url, data=f, headers=hint, timeout=120)
assert r.status_code in (200, 201, 204), f"OSS PUT failed: HTTP {r.status_code}"
# 之后即可在 Chat 接口的 Input 中通过 FileUrl 引用 "documents/report.pdf"
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | FilePath is required | 未提供 |
400 | InvalidParameter | FilePath cannot point to directory |
|
400 | InvalidParameter | Path must not contain '..' | 路径包含非法上级目录引用 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
404 | UserNotFound | User not found |
|
404 | UserNotFound | User has no workspace context | 用户尚未分配工作空间 Context(同上,先调用一次 Chat 完成初始化) |
500 | TenantConfigError | Tenant API key not configured | 租户 AgentBay API Key 缺失 |
500 | InternalError | Failed to get upload URL | 服务端获取上传地址失败 |
DeleteWorkspaceFile - 删除工作空间文件
接口描述
删除指定用户工作空间内的某个文件。路径以用户工作空间根目录为基准。
幂等语义:若目标文件不存在,接口仍返回成功(Success=true),便于上游做"清理-重传"等场景的幂等重试,无需先 ListWorkspaceFiles 探测。
FilePath 只能指向文件,不能指向目录(不能以 / 结尾),不能包含 ..。本接口不支持目录批量删除——如需清空全部工作空间内容,请使用 ClearUserWorkspace。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
DeleteWorkspaceFile
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ExternalUserId | string | 是 | 外部系统用户唯一标识 |
|
FilePath | string | 是 | 工作空间内的相对文件路径,不能以 |
|
TemplateId | string | 否 | Agent 模板 ID;不传时使用用户绑定的默认模板 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "DeleteWorkspaceFile",
"RegionId": "cn-shanghai",
"ExternalUserId": "user-38764",
"FilePath": "documents/report.pdf",
"TemplateId": "template-abc123",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
响应示例
成功(文件存在并被删除):
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"Message": ""
}
成功(文件不存在,幂等返回):
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"Message": ""
}
失败:
{
"Success": false,
"Code": "400",
"Message": "FilePath cannot point to directory",
"HttpStatusCode": 400
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | FilePath is required | 未提供 |
400 | InvalidParameter | FilePath cannot point to directory |
|
400 | InvalidParameter | Path must not contain '..' | 路径包含非法上级目录引用 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
404 | UserNotFound | User not found |
|
404 | UserNotFound | User has no workspace context | 用户尚未分配工作空间 Context |
500 | TenantConfigError | Tenant API key not configured | 租户 AgentBay API Key 缺失 |
500 | InternalError | Failed to delete file | 服务端删除文件失败(非"文件不存在"类错误,已重试无果) |
注意:服务端会把底层 SDK 抛出的"文件不存在"类错误(包含not exist/not found/no such关键字的异常或error_message)归一化为成功返回,调用方无需特殊处理。
ClearUserWorkspace - 清理用户工作空间
接口描述
清理指定外部用户在当前租户下的工作空间数据。可按 TemplateId 限定模板;不传 TemplateId 时清理该用户在当前租户下绑定的全部工作空间。
接口只清理未删除用户的绑定记录。若用户存在但没有可清理的工作空间,返回成功且 Workspaces 为空。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
ClearUserWorkspace
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ExternalUserId | string | 是 | 外部系统用户唯一标识 |
|
TemplateId | string | 否 | Agent 模板 ID;不传时清理该用户的全部工作空间 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "ClearUserWorkspace",
"RegionId": "cn-shanghai",
"ExternalUserId": "user-38764",
"TemplateId": "template-abc123",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
ExternalUserId | string | 外部系统用户唯一标识 |
|
ClearedCount | integer | 清理成功的工作空间数量 |
|
FailedCount | integer | 清理失败的工作空间数量 |
|
Workspaces | array | 每个工作空间的清理结果 | 见下方 |
Workspaces 数组元素:
名称 | 类型 | 描述 | 示例值 |
TemplateId | string | Agent 模板 ID |
|
Status | string | 清理状态: |
|
Error | string | 失败原因;成功时为空 |
|
状态说明:cleared表示清理请求已成功执行;failed表示该工作空间清理失败,失败原因见Error。接口不会返回skipped。
响应示例
成功:
{
"Success": true,
"Code": "ok",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"ExternalUserId": "user-38764",
"ClearedCount": 1,
"FailedCount": 0,
"Workspaces": [
{
"TemplateId": "template-abc123",
"Status": "cleared",
"Error": null
}
]
}
用户存在但没有工作空间:
{
"Success": true,
"Code": "ok",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"ExternalUserId": "user-38764",
"ClearedCount": 0,
"FailedCount": 0,
"Workspaces": []
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | ExternalUserId is required | 未提供 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
404 | UserNotFound | User not found | 用户不存在,或用户已删除 |
500 | TenantConfigError | Tenant config is invalid | 租户配置缺失或无效 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
会话管理接口
ListSessions - 列举对话列表
接口描述
列举用户的会话列表。返回的每个元素包含 SessionId,可用于后续的会话历史查询、中止、删除等操作。
请求信息
请求方法:
GET(也接受POST)
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TemplateId | string | 否 | 按 Agent 模板 ID 筛选 |
|
ExternalUserId | string | 是 | 外部系统用户唯一标识 |
|
Channel | string | 否 | 按渠道筛选 |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求示例
curl -X GET \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>&ExternalUserId=user-38764' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: ListSessions' \
-H 'x-acs-date: 2026-03-25T06:00:00Z'
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
Chats | array | 会话基本信息列表 | 见下方 |
AccessDeniedDetail | string | 鉴权失败详情 |
|
Chats 数组元素:
名称 | 类型 | 描述 | 示例值 |
Id | string | 会话 ID |
|
Name | string | 会话标题 |
|
SessionId | string | 会话标识,用于删除/停止等操作 |
|
UserId | string | 用户 ID |
|
Channel | string | 渠道名称 |
|
CreatedAt | string | 会话创建时间(ISO 8601) |
|
UpdatedAt | string | 会话最后更新时间(ISO 8601) |
|
Meta | map | 扩展元数据 |
|
Status | string | 会话任务状态 |
|
响应示例
成功:
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"Chats": [
{
"Id": "4bd0****02f",
"Name": "你好",
"SessionId": "curl-test-session-********",
"UserId": "u-open-************",
"Channel": "console",
"CreatedAt": "2026-03-26T03:51:42.071603Z",
"UpdatedAt": "2026-03-26T03:52:03.000000Z",
"Meta": {},
"Status": "idle"
}
]
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
401 | Unauthorized | 未授权 | AccessToken 无效或已过期 |
ListSessionHistory - 列举对话历史明细
接口描述
根据 SessionId 获取某次对话的完整历史消息列表,包含用户消息和 AI 回复内容。
请求信息
请求方法:
GET(也接受POST)
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TemplateId | string | 否 | Agent 模板 ID |
|
SessionId | string | 是 | 要获取历史的会话 ID |
|
ExternalUserId | string | 是 | 外部系统用户唯一标识 |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求示例
curl -X GET \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>&ExternalUserId=user-38764&SessionId=curl-test-session-xxxx' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: ListSessionHistory' \
-H 'x-acs-date: 2026-03-25T06:00:00Z'
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
Messages | array | 会话消息列表 | 见下方 |
Status | string | 当前会话任务状态 |
|
AccessDeniedDetail | string | 鉴权失败详情 |
|
Messages 数组元素:
名称 | 类型 | 描述 | 示例值 |
Id | string | 消息唯一标识 |
|
Role | string | 消息角色 |
|
Type | string | 消息类型 |
|
Object | string | 对象类型 |
|
Status | string | 消息状态 |
|
Error | string | 错误信息(如有) |
|
SequenceNumber | string | 序号 |
|
Content | array | 内容块列表 | 见下方 |
Metadata | map | 扩展元数据 |
|
Metadata 字段:
名称 | 类型 | 描述 | 示例值 |
original_id | string | 原始消息 ID |
|
original_name | string | 原始消息发送方名称 |
|
timestamp | string | 消息创建时间,格式为 |
|
Content 数组元素:
名称 | 类型 | 描述 | 示例值 |
Object | string | 对象类型 |
|
Status | string | 状态 |
|
Error | string | 错误信息 |
|
MsgId | string | 所属消息 ID |
|
Text | string | 文本内容 |
|
Data | string | 结构化数据(工具调用等) |
|
SequenceNumber | string | 序号 |
|
响应示例
成功:
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "123***456",
"Status": "idle",
"Messages": [
{
"Id": "msg_5e8d****aa1d",
"Role": "user",
"Type": "message",
"Object": "message",
"Status": "completed",
"Error": null,
"SequenceNumber": null,
"Content": [
{
"Object": "content",
"Status": "completed",
"Error": null,
"MsgId": "msg_5e8d****aa1d",
"Text": "你好",
"Data": null,
"SequenceNumber": null
}
],
"Metadata": {
"original_id": "msg_20e8****8ff3",
"original_name": "user",
"timestamp": "2026-04-29 10:05:57.669"
}
},
{
"Id": "msg_8574****0563",
"Role": "assistant",
"Type": "message",
"Object": "message",
"Status": "completed",
"Error": null,
"SequenceNumber": null,
"Content": [
{
"Object": "content",
"Status": "completed",
"Error": null,
"MsgId": "msg_8574****0563",
"Text": "你好,小伙伴!有什么我可以帮你的吗?",
"Data": null,
"SequenceNumber": null
}
],
"Metadata": {
"original_id": "dXRT****MUV",
"original_name": "JVSCrewAgent",
"timestamp": "2026-04-29 10:06:02.135"
}
}
]
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
401 | Unauthorized | 未授权 | AccessToken 无效或已过期 |
StopSession - 中止对话
接口描述
中止正在执行的 Agent 对话任务。调用后 Agent 将立即停止推理和工具执行,不再产生新的 Token 输出。适用于用户主动取消长时间运行的任务,或需要立即终止 Agent 行为的场景。
中止机制: 服务端会取消 Agent 执行任务,中断与大模型的连接,确保不再有 Token 产生。已完成的对话历史会被保留,后续可在同一 SessionId 上继续对话。
请求信息
请求方法:
POST(也接受GET)Content-Type:
application/json
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TemplateId | string | 否 | Agent 模板 ID |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
SessionId | string | 是 | 要中止的会话 ID |
|
请求体示例
{
"SessionId": "test-session-001"
}
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
AccessDeniedDetail | string | 鉴权失败详情 |
|
Stopped | boolean | 是否成功中止了正在运行的任务。 |
|
响应示例
成功(任务已中止):
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"Stopped": true
}
成功(当前无运行中任务):
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "FA23****-****-****-****-****D4B",
"Stopped": false
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
401 | Unauthorized | 未授权 | AccessToken 无效或已过期 |
503 | ServiceUnavailable | 服务不可用 | Task tracker 未初始化 |
DeleteSession - 删除对话
接口描述
根据 SessionId 删除对话记录,包括对话元数据和会话状态文件。删除后该会话的历史消息将被清空,无法恢复。
请求信息
请求方法:
POSTContent-Type:
application/json
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TemplateId | string | 否 | Agent 模板 ID |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
SessionId | string | 是 | 要删除的会话 ID |
|
请求体示例
{
"SessionId": "test-session-001"
}
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
AccessDeniedDetail | string | 鉴权失败详情 |
|
Deleted | boolean | 是否成功删除 |
|
响应示例
成功:
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"Deleted": true
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
401 | Unauthorized | 未授权 | AccessToken 无效或已过期 |
500 | InternalError | 会话不存在或删除失败 | 指定的 SessionId 未找到对应的对话记录,或服务端异常 |
GetSandboxInfo - 获取沙箱会话信息
接口描述
获取当前用户的沙箱会话状态与资源地址。可用于判断沙箱是否已激活,以及获取沙箱的资源访问 URL 和会话标识。
请求信息
请求方法:
GET(也接受POST)
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TemplateId | string | 否 | Agent 模板 ID |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求参数
无额外请求参数。用户身份由 JWT 令牌自动携带,TemplateId 已在 Query 参数中指定。
请求示例
curl -X GET \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>&TemplateId=template-abc123' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: GetSandboxInfo' \
-H 'x-acs-date: 2026-03-26T06:00:00Z'
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
ResourceUrl | string | 沙箱流化画面访问 URL |
|
SandboxSessionId | string | 沙箱会话 ID |
|
SessionActive | string | 沙箱会话是否激活 |
|
响应示例
成功(沙箱已激活):
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"ResourceUrl": "https://jvscrew.example.com/resource/...",
"SandboxSessionId": "session-abc123",
"SessionActive": "true"
}
成功(沙箱未激活):
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "FA23****-****-****-****-****D4B",
"ResourceUrl": null,
"SandboxSessionId": null,
"SessionActive": "false"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
401 | Unauthorized | 未授权 | AccessToken 无效或已过期 |
Agent 环境变量接口
Agent 环境变量接口使用 JWT 令牌认证,与 Chat、ListSessions 等接口相同:先调用 GetAccessToken 获取 AccessToken,放入 Query 参数 Authorization=Bearer <token>。SetAgentEnvVarForUser - 设置用户环境变量
接口描述
设置用户的 Agent 环境变量。支持批量设置多个环境变量,每个变量包含键(Key)、值(Value)和描述(Description)。如果变量键已存在,则会更新其值和描述。
适用场景: 配置 Agent 运行时所需的 API 密钥、服务地址等信息。设置后的环境变量可在 Agent 执行时被访问和使用。
幂等性: 重复设置相同键名会更新其值和描述,不会产生重复记录。
请求信息
请求方法:
POSTContent-Type:
application/json
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TemplateId | string | 否 | 指定 Agent 模板 ID,不传则使用默认模板 |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Variables | array | 是 | 环境变量列表,见下方 Variables 结构 | 见下方 |
Variables 数组元素:
名称 | 类型 | 必填 | 描述 | 示例值 |
Key | string | 是 | 环境变量键名 |
|
Value | string | 是 | 环境变量值 |
|
Description | string | 否 | 环境变量描述 |
|
请求体示例
{
"Variables": [
{
"Key": "GITHUB_TOKEN",
"Value": "ghp-abc123***",
"Description": "GitHub Token"
},
{
"Key": "SERVICE_URL",
"Value": "https://api.example.com",
"Description": "服务地址"
}
]
}
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
ProcessedKey | array | 已处理的环境变量键名列表 |
|
响应示例
成功:
{
"RequestId": "35A90F2B-3A2B-51A8-B5B1-19E9CF263C43",
"HttpStatusCode": 200,
"ProcessedKey": [
"GITHUB_TOKEN",
"SERVICE_URL"
],
"Code": "200",
"Success": true
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
417 | InvalidParameter | Variables 格式不正确 | Variables 格式不正确或为空 |
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
错误响应示例:
{
"RequestId": "08943504-42B3-5E4D-874A-1693A257EE59",
"HostId": "wuyingai.cn-shanghai.aliyuncs.com",
"Code": "401",
"Message": "Token has expired. Please obtain a new access token.",
"Recommend": "https://api.aliyun.com/troubleshoot?q=401&product=WuyingAI&requestId=08943504-42B3-5E4D-874A-1693A257EE59"
}
GetAgentEnvVarForUser - 获取用户环境变量
接口描述
获取用户设置的 Agent 环境变量。支持按键名过滤查询指定变量,或分页查询所有环境变量。返回结果不包含变量的值(Value),仅包含键名、描述和更新时间。
请求信息
请求方法:
POSTContent-Type:
application/json
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TemplateId | string | 否 | 指定 Agent 模板 ID,不传则使用默认模板 |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Keys | array | 否 | 要查询的环境变量键名列表,不传则返回所有环境变量 |
|
MaxResults | integer | 否 | 每页最大返回数量,默认 20,最大 100 |
|
NextToken | string | 否 | 分页标记,用于获取下一页结果 |
|
请求体示例
查询指定键名:
{
"Keys": ["GITHUB_TOKEN", "SERVICE_URL"]
}
分页查询所有:
{
"MaxResults": 20,
"NextToken": ""
}
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
Variables | array | 环境变量列表 | 见下方 |
Variables 数组元素:
名称 | 类型 | 描述 | 示例值 |
Key | string | 环境变量键名 |
|
Description | string | 环境变量描述 |
|
UpdatedAt | string | 最后更新时间(ISO 8601) |
|
响应示例
成功:
{
"Variables": [
{
"Description": "GitHub Token",
"UpdatedAt": "2026-05-13T15:43:56.358003+08:00",
"Key": "GITHUB_TOKEN"
},
{
"Description": "数据库连接地址",
"UpdatedAt": "2026-05-12T20:18:44.798319+08:00",
"Key": "DATABASE_URL"
},
{
"Description": "调试模式开关",
"UpdatedAt": "2026-05-12T20:18:44.798319+08:00",
"Key": "DEBUG_MODE"
}
],
"RequestId": "44091BCF-1A5B-5C41-B908-090996B8DFBE",
"HttpStatusCode": 200,
"Code": "200",
"Success": true
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | MaxResults 超出范围 |
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
DeleteAgentEnvVarForUser - 删除用户环境变量
接口描述
删除用户的 Agent 环境变量。支持批量删除多个环境变量,删除后的变量将不再可用。
删除行为: 删除不存在的键名不会报错,操作仍返回成功。
请求信息
请求方法:
POSTContent-Type:
application/json
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TemplateId | string | 否 | 指定 Agent 模板 ID,不传则使用默认模板 |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
VariableKeys | array | 是 | 要删除的环境变量键名列表 |
|
请求体示例
{
"VariableKeys": ["GITHUB_TOKEN", "SERVICE_URL"]
}
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
DeletedKeys | array | 已处理的环境变量键名列表(包括不存在的键名) |
|
响应示例
成功:
{
"DeletedKeys": [
"GITHUB_TOKEN",
"SERVICE_URL"
],
"RequestId": "90133DCF-4EDF-1A8F-A7A3-06E2A3F8971D",
"HttpStatusCode": 200,
"Code": "200",
"Success": true
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | VariableKeys: Input should be a valid list | VariableKeys 为空或格式不正确 |
401 | Unauthorized | Token has expired. Please obtain a new access token. | AccessToken 无效或已过期 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
错误响应示例:
{
"RequestId": "47B84E16-BF7A-5A19-B005-32DE413F5CD1",
"HostId": "wuyingai.cn-shanghai.aliyuncs.com",
"Code": "400",
"Message": "VariableKeys: Input should be a valid list",
"Recommend": "https://api.aliyun.com/troubleshoot?q=400&product=WuyingAI&requestId=47B84E16-BF7A-5A19-B005-32DE413F5CD1"
}
计费查询接口
计费查询接口使用 AK/SK 签名认证(与 GetAccessToken 相同),无需先获取 AccessToken。
GetBillingOverview - 获取计费概览
接口描述
获取租户当月的计费概览信息,包括总消耗积分、会话数量和平均消耗等。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
GetBillingOverview
请求参数
无需额外请求参数。租户身份由 AK/SK 自动确定。
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "GetBillingOverview",
"RegionId": "cn-shanghai",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
AccessDeniedDetail | string | 鉴权失败详情 |
|
MonthlyCredit | float | 当月已消耗积分(Credit) |
|
MonthlySessions | integer | 当月会话总数 |
|
AvgCreditPerSession | float | 单会话平均消耗 |
|
CycleStart | string | 账单周期起始日(ISO 8601) |
|
CycleEnd | string | 账单周期结束日(ISO 8601) |
|
响应示例
成功:
{
"Success": true,
"Code": "ok",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"MonthlyCredit": 125.50,
"MonthlySessions": 42,
"AvgCreditPerSession": 2.99,
"CycleStart": "2026-04-01T00:00:00Z",
"CycleEnd": "2026-04-30T23:59:59Z"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
ListUserConsumption - 查询用户消耗明细
接口描述
按用户维度查询当月消耗明细,支持分页和按外部用户 ID 过滤。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
ListUserConsumption
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ExternalUserIds | string | 否 | 按外部用户 ID 过滤,多个用逗号分隔 |
|
PageSize | integer | 否 | 每页数量,默认 20,最大 100 |
|
PageNumber | integer | 否 | 页码,从 1 开始,默认 1 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "ListUserConsumption",
"RegionId": "cn-shanghai",
"ExternalUserIds": "alice,bob",
"PageSize": 20,
"PageNumber": 1,
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
AccessDeniedDetail | string | 鉴权失败详情 |
|
Users | array | 用户消耗明细列表 | 见下方 |
TotalCount | integer | 总用户数 |
|
PageSize | integer | 每页数量 |
|
PageNumber | integer | 当前页码 |
|
Users 数组元素:
名称 | 类型 | 描述 | 示例值 |
UserId | string | 用户内部标识 |
|
ExternalUserId | string | 外部用户标识(无则回退为 UserId) |
|
InstanceId | string | 实例 ID(用于售卖侧对账) |
|
MonthlyCredit | float | 当月消耗积分 |
|
MonthlySessions | integer | 当月会话数 |
|
MonthlyDurationHours | float | 当月使用时长(小时) |
|
MonthlyDurationMinutes | float | 当月使用时长(分钟) |
|
响应示例
成功:
{
"Success": true,
"Code": "ok",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"Users": [
{
"UserId": "u-open-abc123",
"ExternalUserId": "alice",
"InstanceId": "jvscrew-u-open-abc123",
"MonthlyCredit": 28.50,
"MonthlySessions": 12,
"MonthlyDurationHours": 3.25,
"MonthlyDurationMinutes": 195.00
},
{
"UserId": "u-open-def456",
"ExternalUserId": "bob",
"InstanceId": "jvscrew-u-open-def456",
"MonthlyCredit": 15.00,
"MonthlySessions": 8,
"MonthlyDurationHours": 1.50,
"MonthlyDurationMinutes": 90.00
}
],
"TotalCount": 2,
"PageSize": 20,
"PageNumber": 1
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidPageSize | 参数错误 | PageSize 不能为负数 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
GetSessionCreditDetail - 查询会话Credit消耗明细
接口描述
根据一个或多个会话 ID 查询 Credit 消耗明细。每个会话返回包含总消耗、时长、所属 Agent 模板以及每次交互的详细记录。适用于对账、会话级消耗分析等场景。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
GetSessionCreditDetail
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
SessionId | string | 是 | 会话 ID,支持逗号分隔传入多个(最多 20 个) |
|
TemplateId | string | 否 | Agent 模板 ID,仅返回属于该 Agent 的会话结果 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "GetSessionCreditDetail",
"RegionId": "cn-shanghai",
"SessionId": "session-abc,session-def",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
Sessions | array | 会话消耗明细列表 | 见下方 |
Sessions 数组元素:
名称 | 类型 | 描述 | 示例值 |
SessionId | string | 会话 ID |
|
TemplateId | string | 所属 Agent 模板 ID(未匹配到则为 null) |
|
UserId | string | 平台内部用户 ID |
|
ExternalUserId | string | 外部用户 ID |
|
TotalCredit | float | 该会话 Credit 总消耗 |
|
TotalDurationMs | integer | 该会话总交互耗时(毫秒) |
|
RecordCount | integer | 交互记录数(交互轮次) |
|
StartedAt | string | 会话首次交互时间(ISO 8601) |
|
EndedAt | string | 会话最后交互时间(ISO 8601) |
|
Records | array | 每次交互的明细记录 | 见下方 |
Records 数组元素:
名称 | 类型 | 描述 | 示例值 |
TraceId | string | 交互追踪 ID(唯一标识一次请求-响应) |
|
CreditAmount | float | 本次交互消耗的 Credit 量 |
|
DurationMs | integer | 本次交互耗时(毫秒) |
|
CreatedAt | string | 消耗产生时间(ISO 8601) |
|
行为说明:
响应示例
成功(含真实数据和不存在的会话):
{
"Success": true,
"Code": "ok",
"HttpStatusCode": 200,
"RequestId": "B6D2****-****-****-****-****9B73",
"Sessions": [
{
"SessionId": "my-session-123654",
"TemplateId": "template-zc9ecvdf",
"UserId": "u-open-0485bfa543ce52e1",
"ExternalUserId": "admin@1600445510582187",
"TotalCredit": 32.57,
"TotalDurationMs": 1173236,
"RecordCount": 2,
"StartedAt": "2026-04-23T13:50:48.718144+08:00",
"EndedAt": "2026-04-23T14:18:40.265681+08:00",
"Records": [
{
"TraceId": "2766f06d0213c84398b4d3b99d259db8",
"CreditAmount": 28.48,
"DurationMs": 1111096,
"CreatedAt": "2026-04-23T13:50:48.718144+08:00"
},
{
"TraceId": "e83a09d086cb7f42e6cd1e0267d07dcb",
"CreditAmount": 4.09,
"DurationMs": 62140,
"CreatedAt": "2026-04-23T14:18:40.265681+08:00"
}
]
},
{
"SessionId": "non-existent-session",
"TemplateId": null,
"UserId": null,
"ExternalUserId": null,
"TotalCredit": 0.0,
"TotalDurationMs": 0,
"RecordCount": 0,
"StartedAt": null,
"EndedAt": null,
"Records": []
}
]
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidSessionId | SessionId is required | 未传入 SessionId |
400 | TooManySessionIds | At most 20 session IDs are allowed | 超过 20 个会话 ID |
401 | Unauthorized | 未授权 | AK/SK 无效 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
GetUserCreditRecords - 查询用户Credit消耗记录
接口描述
按用户和日期范围查询 Credit 消耗的逐条明细记录,支持分页。每条记录对应一次 Agent 交互,包含会话 ID、Credit 消耗量、耗时和所属 Agent 模板。适用于账单明细展示、消耗趋势分析等场景。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
GetUserCreditRecords
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ExternalUserId | string | 是 | 外部用户 ID(客户业务系统中的用户标识) |
|
TemplateId | string | 否 | Agent 模板 ID,仅返回该 Agent 产生的 Credit 消耗记录 |
|
FromDate | string | 是 | 起始时间(含),支持 |
|
ToDate | string | 是 | 结束时间(含),支持 |
|
PageSize | integer | 否 | 每页数量,默认 20,最大 100 |
|
PageNumber | integer | 否 | 页码,从 1 开始,默认 1 |
|
日期处理规则:
请求示例
# 按天查询
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "GetUserCreditRecords",
"RegionId": "cn-shanghai",
"ExternalUserId": "alice",
"FromDate": "2026-04-01",
"ToDate": "2026-04-24",
"PageSize": 20,
"PageNumber": 1,
}
params["Signature"] = _sign_v1(params, sk)
# 按分钟精度查询
params = {
# ... 签名参数同上 ...
"Action": "GetUserCreditRecords",
"RegionId": "cn-shanghai",
"ExternalUserId": "alice",
"FromDate": "2026-04-23T13:00",
"ToDate": "2026-04-23T14:00",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 业务状态码 |
|
Message | string | 错误详情(失败时返回) |
|
HttpStatusCode | integer | HTTP 状态码 |
|
RequestId | string | 请求唯一标识 |
|
UserId | string | 匹配到的内部用户 ID(无记录时为空字符串) |
|
ExternalUserId | string | 匹配到的外部用户 ID |
|
FromDate | string | 查询起始时间(回显请求参数) |
|
ToDate | string | 查询结束时间(回显请求参数) |
|
TotalCredit | float | 该时间范围内的 Credit 总消耗 |
|
TotalCount | integer | 符合条件的总记录数(用于分页计算) |
|
TotalSessionCount | integer | 涉及的不同会话数量 |
|
TotalDurationMs | integer | 总交互耗时(毫秒) |
|
PageSize | integer | 每页数量 |
|
PageNumber | integer | 当前页码 |
|
Records | array | Credit 消耗明细记录列表,按时间倒序 | 见下方 |
Records 数组元素:
名称 | 类型 | 描述 | 示例值 |
TraceId | string | 交互追踪 ID |
|
SessionId | string | 所属会话 ID |
|
TemplateId | string | 所属 Agent 模板 ID |
|
CreditAmount | float | 本次交互的 Credit 消耗量 |
|
DurationMs | integer | 交互耗时(毫秒) |
|
CreatedAt | string | 消耗产生时间(ISO 8601) |
|
响应示例
成功:
{
"Success": true,
"Code": "ok",
"HttpStatusCode": 200,
"RequestId": "9091****-****-****-****-****693A",
"UserId": "u-open-0485bfa543ce52e1",
"ExternalUserId": "admin@1600445510582187",
"FromDate": "2026-04-23T13:00",
"ToDate": "2026-04-23T14:00",
"TotalCredit": 113.01,
"TotalCount": 5,
"TotalSessionCount": 5,
"TotalDurationMs": 5350843,
"PageSize": 10,
"PageNumber": 1,
"Records": [
{
"TraceId": "2766f06d0213c84398b4d3b99d259db8",
"SessionId": "my-session-123654",
"TemplateId": "template-zc9ecvdf",
"CreditAmount": 28.48,
"DurationMs": 1111096,
"CreatedAt": "2026-04-23T13:50:48.718144+08:00"
},
{
"TraceId": "d119e570296f0f8ab2baa225fc891a0b",
"SessionId": "session-1776922246000",
"TemplateId": "template-zc9ecvdf",
"CreditAmount": 15.43,
"DurationMs": 903558,
"CreatedAt": "2026-04-23T13:45:52.808224+08:00"
}
]
}
空结果(用户在指定时间范围内无消耗):
{
"Success": true,
"Code": "ok",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"UserId": "",
"ExternalUserId": "alice",
"FromDate": "2026-04-30",
"ToDate": "2026-04-30",
"TotalCredit": 0.0,
"TotalCount": 0,
"TotalSessionCount": 0,
"TotalDurationMs": 0,
"PageSize": 20,
"PageNumber": 1,
"Records": []
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidExternalUserId | ExternalUserId is required | 未提供外部用户 ID |
400 | InvalidDateFormat | FromDate/ToDate must be in YYYY-MM-DD or YYYY-MM-DDTHH:mm format | 日期格式错误 |
400 | InvalidDateRange | FromDate must not be later than ToDate | 起始日期晚于结束日期 |
400 | DateRangeTooLarge | Date range must not exceed 90 days | 查询范围超过 90 天 |
400 | InvalidPageSize | PageSize must be between 1 and 100 | 页面大小无效 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
定时任务接口
定时任务 API 使用 JWT 令牌认证,与 Chat、ListSessions 等接口相同:先调用 GetAccessToken 获取 AccessToken,放入 Query 参数 Authorization=Bearer <token>。CreateScheduledTask - 创建定时任务
接口描述
创建新的定时任务。支持 cron 表达式、固定间隔和一次性执行三种调度模式。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数)Action:
CreateScheduledTask
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ExternalUserId | string | 否 | 外部用户 ID(已通过 JWT 携带,可省略) |
|
Name | string | 是 | 任务名称 |
|
Instruction | string | 是 | 任务指令,Agent 将按此执行 |
|
TemplateId | string | 否 | 模板 ID |
|
Schedule | object | 是 | 调度规则,见 Schedule 对象 | |
Sinks | array | 否 | 推送渠道,见 Sinks 对象 | |
Stateful | boolean | 否 | 是否在每次执行间将历史会话灌入 LLM prompt。默认 |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: CreateScheduledTask' \
-H 'x-acs-date: 2026-04-22T06:00:00Z' \
-d '{
"Name": "每日技术简报",
"Instruction": "帮我总结今天的技术新闻",
"Schedule": {"Type": "cron", "Expr": "0 9 * * *", "Timezone": "Asia/Shanghai"},
"Sinks": [{"Sink": "im_push", "Channel": "dingtalk", "ChannelInstanceId": "", "TargetUserId": "<user>", "TargetSessionId": "", "Meta": {}}]
}'
响应参数(Task 对象)
所有返回 Task 的接口(Create / Update / Get)共用以下结构:
名称 | 类型 | 描述 | 示例值 |
TaskId | string | 任务唯一标识 |
|
TemplateId | string | 模板 ID |
|
ExternalUserId | string | 外部用户 ID |
|
Name | string | 任务名称 |
|
Status | string | 任务状态: |
|
Instruction | string | 任务指令 |
|
Schedule | object | 调度配置 |
|
Sinks | array | 推送渠道配置 |
|
Stateful | boolean | 是否在执行间将历史会话灌入 LLM prompt( |
|
NextRunAt | string | 下次执行时间(ISO 8601) |
|
LastRunAt | string | 上次执行时间(新创建时为 null) |
|
LastError | string | 最近错误信息(新创建时为 null) |
|
CreatedAt | string | 创建时间(ISO 8601) |
|
UpdatedAt | string | 更新时间(ISO 8601) |
|
SessionId | string | 创建任务时所在 IM 会话的 session_id快照;通过 |
|
CreateChannel | string | 创建任务时所在渠道快照: |
|
POP 网关字段过滤说明:POP 网关会自动过滤值为null或零值(数字0、空字符串""、空数组[]、空对象{})的字段。本文档定时任务相关接口的响应示例均默认遵循此规则,例如新建任务响应中LastRunAt/LastError为null不会出现;分页响应中TotalCount为0时也可能不出现。后续接口说明中的“被 POP 网关过滤”均指此规则。SessionId / CreateChannel 语义(于 2026-06 发布,描述任务的创建出处,与Sinks推送目标正交):
响应示例
{
"TaskId": "bd0f7607-538c-47b4-9b1e-380e12947640",
"TemplateId": "template-zc9ecvdf",
"ExternalUserId": "verify-schedule-user",
"Name": "每日技术简报",
"Status": "active",
"Instruction": "帮我总结今天的技术新闻",
"Schedule": {"Type": "cron", "Expr": "0 9 * * *", "Timezone": "Asia/Shanghai"},
"Sinks": [],
"NextRunAt": "2026-04-22T09:00:00+08:00",
"CreatedAt": "2026-04-21T23:32:53+08:00",
"UpdatedAt": "2026-04-21T23:32:53+08:00",
"CreateChannel": "api"
}
说明:上例为通过 POP 网关(api渠道)创建的场景,SessionId为null被网关过滤不出现,CreateChannel为"api"。其他创建场景的CreateChannel取值:
UpdateScheduledTask - 更新定时任务
接口描述
更新已有定时任务的配置。
请求信息
Action:
UpdateScheduledTask
参数位置:TaskId/ExternalUserId通过 URL Query 传递;Name/Instruction/TemplateId/Schedule/Sinks/Stateful通过 JSON Body 传递。
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TaskId | string | 是 | 要更新的任务 ID |
|
ExternalUserId | string | 否 | 外部用户 ID(已通过 JWT 携带,可省略) |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
Body 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Name | string | 是 | 新的任务名称 |
|
Instruction | string | 是 | 新的任务指令 |
|
TemplateId | string | 否 | 模板 ID |
|
Schedule | object | 是 | 新的调度规则 |
|
Sinks | array | 否 | 新的推送渠道配置;不传则保留原值,传 |
|
Stateful | boolean | 否 | 是否在执行间将历史会话灌入 LLM prompt;不传则保留原值,显式传 |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>&TaskId=bd0f7607-538c-47b4-9b1e-380e12947640' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: UpdateScheduledTask' \
-H 'x-acs-date: 2026-04-22T06:00:00Z' \
-d '{
"Name": "每日技术简报-修订",
"Instruction": "帮我总结今天的技术新闻并推送到钉钉",
"Schedule": {"Type": "cron", "Expr": "0 9 * * *", "Timezone": "Asia/Shanghai"},
"Sinks": [{"Sink": "im_push", "Channel": "dingtalk", "ChannelInstanceId": "di-xxx", "TargetUserId": "<user>", "TargetSessionId": "", "Meta": {}}]
}'
响应参数
同 CreateScheduledTask 响应(Task 对象)。
响应示例
{
"TaskId": "bd0f7607-538c-47b4-9b1e-380e12947640",
"TemplateId": "template-zc9ecvdf",
"ExternalUserId": "user-38764",
"Name": "每日技术简报-修订",
"Status": "active",
"Instruction": "帮我总结今天的技术新闻并推送到钉钉",
"Schedule": {"Type": "cron", "Expr": "0 9 * * *", "Timezone": "Asia/Shanghai"},
"Sinks": [{"Sink": "im_push", "Channel": "dingtalk", "ChannelInstanceId": "di-xxx", "TargetUserId": "<user>", "TargetSessionId": "", "Meta": {}}],
"NextRunAt": "2026-04-23T09:00:00+08:00",
"LastRunAt": "2026-04-22T09:00:01+08:00",
"CreatedAt": "2026-04-21T23:32:53+08:00",
"UpdatedAt": "2026-04-22T15:10:08+08:00",
"SessionId": "sess-im-7f3a",
"CreateChannel": "dingtalk"
}
说明:上例展示“任务已运行过一轮、本次仅修订配置”的场景:LastRunAt有值、UpdatedAt晚于CreatedAt。LastError为null被 POP 网关过滤,可不出现。SessionId/CreateChannel保留创建时的快照,Update 接口不会修改。
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | TaskId / Name / Instruction / Schedule 缺失或格式不正确(如 cron 表达式非法、once 时间为过去时间、Sinks 结构不合法) |
401 | Unauthorized | 未授权 | Bearer Token 无效或已过期 |
404 | NotFound | 资源不存在 | TaskId 未找到或不属于当前用户 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
GetScheduledTask - 查询任务详情
接口描述
根据 TaskId 查询任务的完整信息。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数),与 CreateScheduledTask 相同Action:
GetScheduledTask
Query 参数和请求头与 CreateScheduledTask 相同,x-acs-action改为GetScheduledTask。
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ExternalUserId | string | 否 | 外部用户 ID(已通过 JWT 携带,可省略) |
|
TaskId | string | 是 | 任务 ID |
|
TemplateId | string | 否 | 模板 ID |
|
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: GetScheduledTask' \
-H 'x-acs-date: 2026-04-22T06:00:00Z' \
-d '{"TaskId": "bd0f7607-538c-47b4-9b1e-380e12947640"}'
响应参数
同 CreateScheduledTask 响应(Task 对象)。
响应示例
{
"TaskId": "bd0f7607-538c-47b4-9b1e-380e12947640",
"TemplateId": "template-zc9ecvdf",
"ExternalUserId": "user-38764",
"Name": "每日技术简报",
"Status": "active",
"Instruction": "帮我总结今天的技术新闻",
"Schedule": {"Type": "cron", "Expr": "0 9 * * *", "Timezone": "Asia/Shanghai"},
"Sinks": [],
"NextRunAt": "2026-04-23T09:00:00+08:00",
"LastRunAt": "2026-04-22T09:00:01+08:00",
"LastError": "Sandbox timeout: tool execution exceeded 60s",
"CreatedAt": "2026-04-21T23:32:53+08:00",
"UpdatedAt": "2026-04-21T23:32:53+08:00",
"SessionId": "sess-im-7f3a",
"CreateChannel": "dingtalk"
}
说明:上例展示“任务运行过一次且上次执行失败”的场景:LastRunAt/LastError都有值。若任务尚未运行或上次执行成功,LastRunAt/LastError为null,会被 POP 网关过滤不出现(与 CreateScheduledTask 示例一致)。
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | TaskId 缺失或格式不正确 |
401 | Unauthorized | 未授权 | Bearer Token 无效或已过期 |
404 | NotFound | 资源不存在 | TaskId 未找到或不属于当前用户 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
ListScheduledTasks - 分页列举任务
接口描述
分页查询用户下的所有定时任务。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数),与 CreateScheduledTask 相同Action:
ListScheduledTasks
参数位置:本接口所有业务参数(PageNumber/PageSize/TemplateId/ExternalUserId)通过 URL Query 传递,请求 Body 为空。
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
PageNumber | integer | 否 | 页码,默认 1 |
|
PageSize | integer | 否 | 每页条数,默认 20,最大 100 |
|
TemplateId | string | 否 | 按模板过滤 |
|
ExternalUserId | string | 否 | 外部用户 ID(已通过 JWT 携带,可省略) |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求 Body
本接口无 Body 参数,请求 Body 应为空。
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>&PageNumber=2&PageSize=20' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: ListScheduledTasks' \
-H 'x-acs-date: 2026-04-22T06:00:00Z'
响应参数
名称 | 类型 | 描述 |
Tasks | array | 任务列表,每个元素为 Task 对象 |
TotalCount | integer | 总数 |
PageNumber | integer | 当前页码 |
PageSize | integer | 每页条数 |
注意:受 POP 网关字段过滤规则影响(详见 CreateScheduledTask 响应说明),空列表时TotalCount/PageNumber/PageSize(值为0)可能不出现。
响应示例
{
"Tasks": [
{
"TaskId": "bd0f7607-538c-47b4-9b1e-380e12947640",
"TemplateId": "template-zc9ecvdf",
"ExternalUserId": "verify-schedule-user",
"Name": "每日技术简报",
"Status": "active",
"Instruction": "帮我总结今天的技术新闻",
"Schedule": {"Type": "cron", "Expr": "0 9 * * *", "Timezone": "Asia/Shanghai"},
"Sinks": [],
"NextRunAt": "2026-04-22T09:00:00+08:00",
"CreatedAt": "2026-04-21T23:32:53+08:00",
"UpdatedAt": "2026-04-21T23:32:53+08:00",
"SessionId": "sess-im-7f3a",
"CreateChannel": "dingtalk"
}
],
"TotalCount": 1,
"PageNumber": 1,
"PageSize": 20
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | PageNumber / PageSize 取值非法(如负数、超过 100) |
401 | Unauthorized | 未授权 | Bearer Token 无效或已过期 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
DeleteScheduledTask - 删除任务
接口描述
删除指定的定时任务。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数),与 CreateScheduledTask 相同Action:
DeleteScheduledTask
参数位置:本接口所有业务参数(TaskId/ExternalUserId)通过 URL Query 传递,请求 Body 为空。
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TaskId | string | 是 | 要删除的任务 ID |
|
ExternalUserId | string | 否 | 外部用户 ID(已通过 JWT 携带,可省略) |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求 Body
本接口无 Body 参数,请求 Body 应为空。
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>&TaskId=bd0f7607-538c-47b4-9b1e-380e12947640' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: DeleteScheduledTask' \
-H 'x-acs-date: 2026-04-22T06:00:00Z'
响应参数
名称 | 类型 | 描述 |
Deleted | boolean | 是否删除成功 |
响应示例
{
"Deleted": true
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | TaskId 缺失或格式不正确 |
401 | Unauthorized | 未授权 | Bearer Token 无效或已过期 |
404 | NotFound | 资源不存在 | TaskId 未找到或不属于当前用户 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
PauseScheduledTask - 暂停任务
接口描述
暂停指定的定时任务。暂停后任务不再按计划执行,直到调用 ResumeScheduledTask 恢复。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数),与 CreateScheduledTask 相同Action:
PauseScheduledTask
参数位置:本接口所有业务参数(TaskId/ExternalUserId)通过 URL Query 传递,请求 Body 为空。
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TaskId | string | 是 | 要暂停的任务 ID |
|
ExternalUserId | string | 否 | 外部用户 ID(已通过 JWT 携带,可省略) |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求 Body
本接口无 Body 参数,请求 Body 应为空。
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>&TaskId=bd0f7607-538c-47b4-9b1e-380e12947640' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: PauseScheduledTask' \
-H 'x-acs-date: 2026-06-09T06:00:00Z'
响应参数
返回暂停后的完整任务对象,字段定义与 GetScheduledTask 响应一致。
名称 | 类型 | 描述 |
TaskId | string | 任务 ID |
TemplateId | string | 模板 ID |
Name | string | 任务名称 |
Status | string | 任务状态(暂停后为 |
Instruction | string | 任务指令 |
ExternalUserId | string | 用户 ID |
LastRunAt | string | 上次执行时间(ISO 8601) |
NextRunAt | string | 下次执行时间(ISO 8601),暂停后为上次计算的值 |
CreatedAt | string | 创建时间(ISO 8601) |
UpdatedAt | string | 更新时间(ISO 8601) |
响应示例
{
"TaskId": "bd0f7607-538c-47b4-9b1e-380e12947640",
"TemplateId": "template-rkvcno5m",
"Name": "喝水提醒",
"Status": "paused",
"Instruction": "提醒我喝水",
"ExternalUserId": "user1",
"LastRunAt": "2026-06-09T18:19:29+08:00",
"NextRunAt": "2026-06-09T19:00:00+08:00",
"CreatedAt": "2026-06-01T10:00:00+08:00",
"UpdatedAt": "2026-06-09T18:30:00+08:00"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | TaskId 缺失或格式不正确 |
401 | Unauthorized | 未授权 | Bearer Token 无效或已过期 |
404 | NotFound | 资源不存在 | TaskId 未找到或不属于当前用户 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
ResumeScheduledTask - 恢复任务
接口描述
恢复已暂停的定时任务。恢复后任务按原计划继续执行。
注意:once 类型(一次性)的任务如果已经执行过,不可恢复,调用将返回 400。请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数),与 CreateScheduledTask 相同Action:
ResumeScheduledTask
参数位置:本接口所有业务参数(TaskId/ExternalUserId)通过 URL Query 传递,请求 Body 为空。
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TaskId | string | 是 | 要恢复的任务 ID |
|
ExternalUserId | string | 否 | 外部用户 ID(已通过 JWT 携带,可省略) |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求 Body
本接口无 Body 参数,请求 Body 应为空。
请求示例
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>&TaskId=bd0f7607-538c-47b4-9b1e-380e12947640' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: ResumeScheduledTask' \
-H 'x-acs-date: 2026-06-09T06:00:00Z'
响应参数
返回恢复后的完整任务对象,字段定义与 GetScheduledTask 响应一致。
名称 | 类型 | 描述 |
TaskId | string | 任务 ID |
TemplateId | string | 模板 ID |
Name | string | 任务名称 |
Status | string | 任务状态(恢复后为 |
Instruction | string | 任务指令 |
ExternalUserId | string | 用户 ID |
LastRunAt | string | 上次执行时间(ISO 8601) |
NextRunAt | string | 下次执行时间(ISO 8601) |
CreatedAt | string | 创建时间(ISO 8601) |
UpdatedAt | string | 更新时间(ISO 8601) |
响应示例
{
"TaskId": "bd0f7607-538c-47b4-9b1e-380e12947640",
"TemplateId": "template-rkvcno5m",
"Name": "喝水提醒",
"Status": "active",
"Instruction": "提醒我喝水",
"ExternalUserId": "user1",
"LastRunAt": "2026-06-09T18:19:29+08:00",
"NextRunAt": "2026-06-09T19:00:00+08:00",
"CreatedAt": "2026-06-01T10:00:00+08:00",
"UpdatedAt": "2026-06-09T18:35:00+08:00"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | TaskId 缺失;或尝试恢复已执行完成的 |
401 | Unauthorized | 未授权 | Bearer Token 无效或已过期 |
404 | NotFound | 资源不存在 | TaskId 未找到或不属于当前用户 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
ListScheduledTaskRuns - 查询执行记录
接口描述
查询定时任务的执行记录列表,支持游标分页。
请求信息
认证方式: JWT 令牌(
AuthorizationQuery 参数),与 CreateScheduledTask 相同Action:
ListScheduledTaskRuns
参数位置:本接口所有业务参数(TaskId/TemplateId/Since/Until/Order/Status/Cursor/PageSize/ExternalUserId)通过 URL Query 传递,请求 Body 为空。
Query 参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Authorization | string | 是 |
|
|
TaskId | string | 否 | 按任务 ID 过滤 |
|
TemplateId | string | 否 | 按模板 ID 过滤 |
|
Since | integer | 否 | 时间下界(Unix 毫秒),左开区间 |
|
Until | integer | 否 | 时间上界(Unix 毫秒),右闭区间 |
|
Order | string | 否 | 排序方向,大小写不敏感: |
|
Status | string | 否 | 按终止状态过滤,仅接受 |
|
Cursor | string | 否 | 分页游标,来自上一次响应的 NextCursor |
|
PageSize | integer | 否 | 每页条数,默认 50,范围 1-200 |
|
ExternalUserId | string | 否 | 外部用户 ID(已通过 JWT 携带,可省略) |
|
请求头(Header)
名称 | 类型 | 必填 | 描述 | 示例值 |
Content-Type | string | 是 | 请求内容类型 |
|
x-acs-version | string | 是 | API 版本 |
|
x-acs-action | string | 是 | API 操作名称 |
|
x-acs-date | string | 是 | 请求时间(ISO 8601 格式) |
|
请求 Body
本接口无 Body 参数,请求 Body 应为空。
时间窗口与排序:
增量轮询用法:首次调用:传Since(+ 可选Until)圈定时间窗口,加Order指定排序方向。翻页调用:只传上一次响应的NextCursor+Order,无需再传Since/Until。下一轮轮询(拉取新增数据):将上一轮拿到的最新FinishedAt转为毫秒时间戳作为新的Since。⚠️ 同一分页循环内Order不能改变,否则游标语义失效。
请求示例
# 逆序查询最近执行记录
curl -X POST \
'https://wuyingai.cn-shanghai.aliyuncs.com/?Authorization=Bearer%20<access_token>&TaskId=bd0f7607-538c-47b4-9b1e-380e12947640&Order=desc&PageSize=50' \
-H 'Content-Type: application/json' \
-H 'x-acs-version: 2026-03-11' \
-H 'x-acs-action: ListScheduledTaskRuns' \
-H 'x-acs-date: 2026-04-22T06:00:00Z'
响应参数
名称 | 类型 | 描述 |
Runs | array | 执行记录列表 |
NextCursor | string | 下一页游标,为 null 时表示无更多数据 |
Runs 数组元素:
名称 | 类型 | 描述 |
RunId | string | 执行记录唯一标识 |
TaskId | string | 所属任务 ID |
TemplateId | string | 模板 ID |
ExternalUserId | string | 外部渠道投递的用户身份(如 IM、POP 调用方),租户视角下的稳定 ID |
Status | string | 执行状态: |
ResultPayload | string | LLM 产出的文本结果。 |
ErrorMessage | string | 错误信息。 |
PushSink | string | 推送渠道类型 |
PushStatus | string | 推送状态: |
StartedAt | string | 开始时间 |
FinishedAt | string | 结束时间 |
CreatedAt | string | 记录创建时间 |
⚠️ 字段读取约定:调用方应独立读取ResultPayload、ErrorMessage、PushStatus,不要用Status作为这三个字段是否有值的充分条件。例如:Status=succeeded不保证ResultPayload非空,也不保证推送成功。
响应示例
{
"Runs": [
{
"RunId": "run-abc123",
"TaskId": "bd0f7607-538c-47b4-9b1e-380e12947640",
"TemplateId": "template-zc9ecvdf",
"ExternalUserId": "workid-12345",
"Status": "succeeded",
"ResultPayload": "今日技术要闻:...",
"PushSink": "im_push",
"PushStatus": "succeeded",
"StartedAt": "2026-04-22T09:00:01+08:00",
"FinishedAt": "2026-04-22T09:02:35+08:00",
"CreatedAt": "2026-04-22T09:00:00+08:00"
}
],
"NextCursor": null
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | TaskId / Since / Cursor / PageSize 等参数格式不正确(如 PageSize 超过 200、Cursor 无法解码) |
401 | Unauthorized | 未授权 | Bearer Token 无效或已过期 |
503 | (网关拦截) | 请求被拒绝 |
|
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
ListAllUserScheduledTasks - 查询用户定时任务列表
接口描述
管理员接口,以租户视角查询指定用户名下的定时任务列表。必须指定 ExternalUserId,限定在单个用户范围内操作。
Action:
ListAllUserScheduledTasks认证方式: AK/SK 签名
HTTP 方法: GET
请求参数
参数名 | 类型 | 必填 | 说明 |
ExternalUserId | String | 否 | 用户标识;不传时查询整个租户下所有任务 |
TemplateId | String | 否 | 按模板 ID 过滤 |
Status | String | 否 | 按状态过滤,可选值: |
SortBy | String | 否 | 排序字段,大小写不敏感,可选值: |
Order | String | 否 | 排序方向,大小写不敏感,可选值: |
PageNumber | Integer | 否 | 页码,从 1 开始,默认 1 |
PageSize | Integer | 否 | 每页条数,默认 20,最大 100 |
使用建议:使用SortBy=NextRunAt排序时,建议配合Status=active过滤,以获取即将执行的任务列表。已完成/已暂停的任务其NextRunAt可能为历史时间,混合排序结果可能不符合预期。
请求示例
POST /?Action=ListAllUserScheduledTasks&Version=2026-03-11&ExternalUserId=user1&PageSize=10&...签名参数
响应参数
字段名 | 类型 | 说明 |
Tasks | Array of Object | 任务列表 |
Tasks[].TaskId | String | 任务 ID |
Tasks[].TenantId | String | 租户 ID |
Tasks[].TemplateId | String | 模板 ID |
Tasks[].ExternalUserId | String | 用户标识 |
Tasks[].Name | String | 任务名称 |
Tasks[].Status | String | 任务状态(active / paused / completed) |
Tasks[].ScheduleType | String | 调度类型(cron / interval / once) |
Tasks[].ScheduleExpr | String | 调度表达式 |
Tasks[].Timezone | String | 时区 |
Tasks[].NextRunAt | String | 下次执行时间(ISO 8601) |
Tasks[].LastRunAt | String | 上次执行时间(ISO 8601) |
Tasks[].CreatedAt | String | 创建时间(ISO 8601) |
Tasks[].UpdatedAt | String | 更新时间(ISO 8601) |
TotalCount | Integer | 符合条件的任务总数 |
PageSize | Integer | 每页条数 |
PageNumber | Integer | 当前页码 |
错误码
HTTP 状态码 | Code | 说明 |
400 | InvalidParameter | 参数校验失败(status 值非法等) |
403 | Forbidden | 租户权限不匹配 |
500 | InternalError | 服务内部错误 |
DeleteAllUserScheduledTasks - 删除用户定时任务
接口描述
管理员接口,删除指定租户/用户名下的定时任务。通过 Scope 字段显式声明删除范围,默认 BY_TASK_IDS,杜绝"漏传参数即扩大范围"的危险默认行为。
Scope 与参数约束:
Scope | TaskIds | ExternalUserId | 行为 |
| 必填非空(1~50 条) | 可选(提供时进一步限定到该用户) | 按 ID 精确删,幂等 |
| 必须为空 | 必填 | 删该用户名下全部活跃任务 |
| 必须为空 | 必须不传 | 删整租户下全部活跃任务 |
任何字段约束不满足均返回 400 InvalidParameter,service 层不会被调用。
幂等契约(仅 BY_TASK_IDS 适用):
DeletedCount表示"目标态满足数",即 本次新删 + 此前已删除(幂等命中) 的任务数总和。重复调用同一组TaskIds,结果保持一致。FailedItems仅包含范围内不存在的TaskId(如拼写错误、属于其他用户、跨租户等),不会因"已删除"而返回NotFound。守恒关系:
DeletedCount + len(FailedItems) == len(去重后的 TaskIds)。全部命中时
FailedItems为空数组。
USER_ALL / TENANT_ALL 返回的 DeletedCount 为本次实际被改写的行数(不含此前已软删的历史数据),FailedItems 始终为空数组。
Action:
DeleteAllUserScheduledTasks认证方式: AK/SK 签名
HTTP 方法: POST
请求参数
参数名 | 类型 | 必填 | 说明 |
ExternalUserId | String(Query) | 视 Scope |
|
Scope | String(Query) | 否 | 枚举 |
TaskIds | String(Query, JSON 序列化数组) | 视 Scope |
|
请求示例
按 ID 精确删(推荐):
POST /?Action=DeleteAllUserScheduledTasks&Version=2026-03-11&ExternalUserId=user1&Scope=BY_TASK_IDS&TaskIds=["task-001","task-002"]&...签名参数
删除某用户全部任务:
POST /?Action=DeleteAllUserScheduledTasks&Version=2026-03-11&ExternalUserId=user1&Scope=USER_ALL&...签名参数
删除整租户全部任务(高危操作):
POST /?Action=DeleteAllUserScheduledTasks&Version=2026-03-11&Scope=TENANT_ALL&...签名参数
响应参数
字段名 | 类型 | 说明 |
DeletedCount | Integer |
|
FailedItems | Array of Object | 仅 |
FailedItems[].TaskId | String | 失败的任务 ID |
FailedItems[].Code | String | 错误码,固定为 |
FailedItems[].Message | String | 错误原因,固定为 |
响应示例
BY_TASK_IDS 全部命中(含此前已删除的幂等场景):
{
"RequestId": "xxx",
"DeletedCount": 2,
"FailedItems": []
}
BY_TASK_IDS 部分 ID 不存在:
{
"RequestId": "xxx",
"DeletedCount": 1,
"FailedItems": [
{
"TaskId": "task-002",
"Code": "NotFound",
"Message": "task not found"
}
]
}
USER_ALL / TENANT_ALL:
{
"RequestId": "xxx",
"DeletedCount": 17,
"FailedItems": []
}
错误码
HTTP 状态码 | Code | 说明 |
400 | InvalidParameter | 参数校验失败:Scope 与 |
400 | InvalidScope |
|
400 | InvalidTaskIds |
|
403 | Forbidden | 租户权限不匹配 |
500 | InternalError | 服务内部错误 |
ListAllUserScheduledTaskRuns - 查询全部用户执行记录
接口描述
以租户视角查询整租户下所有用户的定时任务执行记录,用于运营/监控/审计场景;与 ListScheduledTaskRuns 的差异:
鉴权使用 AK/SK(租户态);
ExternalUserId可由调用方按需作为过滤条件传入。首次调用必须显式给出
Since/Until时间窗口,避免无下界全表扫描。仅返回已终止的执行记录(
Status为succeeded或failed),运行中的记录不在本接口语义内。默认按
FinishedAt倒序返回(最新优先),便于运维排查。
请求信息
认证方式: POP V1 签名(AK/SK)
Action:
ListAllUserScheduledTaskRuns
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Since | integer | 是 | 时间下界(Unix 毫秒),左开区间 |
|
Until | integer | 是 | 时间上界(Unix 毫秒),右闭区间 |
|
ExternalUserId | string | 否 | 按外部用户过滤;缺省返回整租户所有用户 |
|
TemplateId | string | 否 | 按 Agent 模板 ID 过滤 |
|
TaskId | string | 否 | 按任务 ID 过滤 |
|
Status | string | 否 | 按终止状态过滤,仅接受 |
|
Order | string | 否 | 排序方向,大小写不敏感: |
|
Cursor | string | 否 | 上一次响应返回的 |
|
PageSize | integer | 否 | 每页条数,默认 50,范围 1-200 |
|
时间窗口说明:
增量轮询用法:首次调用:传Since+Until(或仅Since)圈定时间窗口,加Order指定排序方向。翻页调用:只传上一次响应的NextCursor+Order,无需再传Since/Until(游标已内含位置信息)。下一轮轮询(拉取新增数据):将上一轮拿到的最新FinishedAt转为毫秒时间戳作为新的Since,即可只拉增量。⚠️ 同一分页循环内Order不能改变,否则游标语义失效导致数据遗漏或重复。
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "ListAllUserScheduledTaskRuns",
"RegionId": "cn-shanghai",
"Since": 1714032000000,
"Until": 1714118400000,
"Status": "failed",
"Order": "desc",
"PageSize": 50,
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 |
Runs | array | 执行记录列表,按 |
NextCursor | string | 下一页游标;为 |
Runs 数组元素:
名称 | 类型 | 描述 |
RunId | string | 执行记录唯一标识 |
TaskId | string | 所属任务 ID |
TemplateId | string | 模板 ID |
ExternalUserId | string | 外部渠道投递的用户身份(如 IM、POP 调用方),租户视角下的稳定 ID |
Status | string | 执行状态: |
ResultPayload | string | LLM 产出的文本结果。 |
ErrorMessage | string | 错误信息。 |
PushSink | string | 推送渠道类型,如 |
PushStatus | string | 推送状态: |
StartedAt | string | 开始时间(ISO 8601) |
FinishedAt | string | 结束时间(ISO 8601) |
CreatedAt | string | 记录创建时间(ISO 8601) |
响应示例
{
"Runs": [
{
"RunId": "run-abc123",
"TaskId": "bd0f7607-538c-47b4-9b1e-380e12947640",
"TemplateId": "template-zc9ecvdf",
"ExternalUserId": "alice",
"Status": "succeeded",
"ResultPayload": "今日技术要闻:...",
"PushSink": "im_push",
"PushStatus": "succeeded",
"StartedAt": "2026-04-27T10:00:01+08:00",
"FinishedAt": "2026-04-27T10:00:05+08:00",
"CreatedAt": "2026-04-27T10:00:00+08:00"
}
],
"NextCursor": "eyJmaW5pc2hlZF9hdF91cyI6..."
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidSince | Since is required | 未提供 |
400 | InvalidUntil | Until is required | 未提供 |
400 | InvalidSinceUntilRange | since must be less than until (left-open right-closed (since, until]) |
|
400 | InvalidOrder | order must be one of: asc, desc |
|
400 | InvalidStatus | status must be one of: succeeded, failed |
|
400 | InvalidPageSize | PageSize must be between 1 and 200 | 页面大小超出范围 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
定时任务数据结构
Schedule 对象
字段 | 类型 | 描述 |
Type | string | 调度类型: |
Expr | string | 调度表达式,格式取决于 Type |
Timezone | string | 时区,如 |
Type 与 Expr 对照表:
Type | Expr 格式 | 示例 | 说明 |
cron | 标准 cron 表达式 |
| 每天早上 9 点 |
cron | 标准 cron 表达式 |
| 工作日早上 9 点 |
interval | 数字+单位 |
| 每 10 分钟(周期性触发) |
interval | 数字+单位 |
| 每 2 小时(周期性触发) |
once | ISO 8601 绝对时间 |
| 在指定时间触发一次(按 Timezone 解释,未来时间) |
once | ISO 8601 绝对时间 |
| 等价于 UTC 07:00(接受 |
once类型的 Expr 必须是未来的绝对时间。任务执行完成后会自动从ListScheduledTasks中消失(内部置为status=paused并写入deleted_at软删除),但已产生的 Run 记录仍可通过ListScheduledTaskRuns查询。如需「N 分钟/小时后做一次」语义,请由调用方自行换算成绝对 ISO 8601 时间后再传入;本接口不接受10m这类相对偏移作为once的 Expr。传入过去时间的错误响应:CreateScheduledTask/UpdateScheduledTask在校验到once类型的Expr早于服务端当前时间时,返回 HTTP400错误响应(POP 风格信封success=false、httpStatusCode=400),Message字段以once schedule target time must be in the future (got <expr>, now=<server-now>)形式给出,调用方可据此提示用户重新选择时间。其他常见的非法 Expr(如2026-13-99这类无效 ISO 字符串、interval间隔小于SMARTCLAW_SCHEDULE_MIN_INTERVAL阈值、cron表达式语法错误等)同样统一返回400并在Message中携带具体原因。
Sinks 对象
字段 | 类型 | 描述 |
Sink | string | 推送方式,当前支持 |
Channel | string | 渠道类型,如 |
ChannelInstanceId | string | 渠道实例 ID |
TargetUserId | string | 目标用户 ID |
TargetSessionId | string | 目标会话 ID |
Meta | object | 渠道扩展元数据 |
示例 1:钉钉机器人推送(单聊/群聊均适用)
{
"Sink": "im_push",
"Channel": "dingtalk",
"ChannelInstanceId": "di-dingtalk-xxx",
"TargetUserId": "workid-12345",
"TargetSessionId": "",
"Meta": {}
}
ChannelInstanceId:在 Console 创建钉钉机器人渠道后获得的实例 ID。TargetUserId:推送到某个钉钉用户时填入其 workid;推送到群聊时可留空,由TargetSessionId指定群会话。TargetSessionId:群聊会话 ID(钉钉的 conversationId);单聊可留空。Meta:如需@某人可填{"at_user_ids": ["workid-12345"]};不需附加信息时传{}。
示例 2:飞书机器人推送(单聊/群聊均适用)
{
"Sink": "im_push",
"Channel": "feishu",
"ChannelInstanceId": "di-feishu-xxx",
"TargetUserId": "ou_abc123",
"TargetSessionId": "",
"Meta": {}
}
ChannelInstanceId:在 Console 创建飞书机器人渠道后获得的实例 ID。TargetUserId:推送到某个飞书用户时填入其open_id或user_id;推送到群聊时可留空。TargetSessionId:群聊会话 ID(飞书的chat_id);单聊可留空。Meta:不需附加信息时传{}。
示例 3:同时推到多个渠道
[
{"Sink": "im_push", "Channel": "dingtalk", "ChannelInstanceId": "di-dingtalk-xxx", "TargetUserId": "workid-12345", "TargetSessionId": "", "Meta": {}},
{"Sink": "im_push", "Channel": "feishu", "ChannelInstanceId": "di-feishu-xxx", "TargetUserId": "ou_abc123", "TargetSessionId": "", "Meta": {}}
]
任务执行成功后会依次尝试推送到所有配置的渠道;单个渠道推送失败不会影响其他渠道。各渠道推送状态请通过该 Run 记录的 PushStatus / PushSink 字段独立读取。
不配置 Sinks 时,任务仍会正常执行,结果通过 ListScheduledTaskRuns 的ResultPayload字段拉取。即使配置了 Sinks,ResultPayload仍是结果文本的权威来源——推送失败(PushStatus=failed)不会影响Status=succeeded与ResultPayload的写入。
Stateful 字段使用指南
Stateful 控制 Agent 在每次定时执行之间,LLM prompt 是否携带历史会话。它不控制执行记忆是否落盘——两种取值都会累积保留执行记忆,区别在于是否把这些历史灌入下一次的 LLM prompt。
取值 | LLM Prompt | 执行记忆累积 | token 消耗 | 适用场景 |
| 不加载历史,prompt 仅含本次 Instruction | 累积保留(默认最近 200 条 / 30 天上限内滚动),用户在 Chat 中可通过沙箱回查执行历史 | 仅取决于本次 Instruction 长度,不随执行次数增长 | 绝大多数任务:日报 / 简报 / 天气 / 定时提醒 / 邮件总结等每次独立产出的任务 |
| 加载上一次的完整会话历史灌入 prompt | 整体覆盖更新为本次执行结束时的完整会话 | 随历史线性增长,长期运行会持续上涨 | 仅当任务必须依赖跨次会话记忆才能完成功能(典型如「Excel表格去重通知:只通知本次新增的行,对比上次已通知的行 ID」) |
判定规则(按序匹配,命中即停):
任务说明明确提到「去重」「只通知新的」「跟上次对比」「累计统计」「记住上次」→ 选
true任务每次执行只是「按当前时刻状态产出报告/提醒」,无需对比历史 → 选
false不确定时优先选
false:将false错设为true会无声地浪费 token;将true错设为false用户能立刻发现(看到重复通知/缺失对比),可随时通过UpdateScheduledTask显式改回true。
UpdateScheduledTask 的 PATCH 语义:调用方不传 Stateful 字段时,后端会保留任务在数据库中的原值,不会被默认值 false 覆盖;只有显式传入 true / false 才会写入。这保证「修改任务名称/调度」等场景不会无意中把一个 stateful=true 的任务静默改回 false 而丢失会话历史。
Run 状态流转
running → succeeded(执行成功)
→ failed(执行失败)
推送状态(PushStatus)
状态 | 说明 |
pending | 等待推送 |
succeeded | 推送成功 |
failed | 推送失败 |
skipped | 未配置 Sinks,跳过推送 |
PushStatus与Status正交:Status=succeeded表示 LLM 已成功产出结果并写入ResultPayload,但下游 IM 推送可能因渠道实例失效等原因失败(PushStatus=failed)。此场景下 Run 记录仍为succeeded,但可通过PushStatus识别漏推。
定时任务错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | 必填参数缺失,或 Schedule / Sinks 格式不正确(参考各接口请求参数表) |
401 | Unauthorized | 未授权 | Bearer Token 无效或已过期 |
404 | NotFound | 资源不存在 | TaskId 或 TemplateId 未找到 |
500 | InternalError | 服务内部错误 | 服务端异常,请稍后重试 |
模板管理接口
管理 Agent 模板的配置信息,包括查询模板列表、获取模板完整详情以及设置模板的系统提示规则(System Prompt Rules)。
ListTemplates - 查询模板列表
接口描述
查询当前租户下的 Agent 模板列表,返回每个模板的基本标识信息(模板 ID 和模板 Key)。可用于获取租户拥有的全部模板,再结合 GetTemplate 获取单个模板的详细配置。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
ListTemplates
请求参数
无业务请求参数。租户 ID 通过 AK/SK 签名自动关联,无需显式传入。
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "ListTemplates",
"RegionId": "cn-shanghai",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
RequestId | string | 请求 ID |
|
Success | boolean | 是否调用成功 |
|
Code | string | 错误码,成功时为 |
|
Message | string | 结果描述 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
Items | array | 模板列表(见下方) | — |
Items 数组元素
名称 | 类型 | 描述 | 示例值 |
TenantId | string | 租户 ID |
|
TemplateId | string | 模板 ID |
|
TemplateKey | string | 模板唯一标识 Key |
|
TodayActiveUsers | integer(int64) | 今日活跃用户数(UTC 日期) |
|
TodaySessions | integer(int64) | 今日会话数 |
|
TodayCredit | number(float) | 今日 Credit 消耗 |
|
UpdateAt | string | 更新时间(ISO 8601) |
|
注:TodayActiveUsers、TodaySessions、TodayCredit为当日(UTC)实时聚合值。值为 0 时按 POP 网关零值规则可能不返回。
响应示例
{
"RequestId": "EA12****-****-****-****-****E5C",
"Success": true,
"Code": "200",
"Message": "",
"HttpStatusCode": 200,
"Items": [
{
"TenantId": "18363908****",
"TemplateId": "template-abc123",
"TemplateKey": "default",
"TodayActiveUsers": 12,
"TodaySessions": 36,
"TodayCredit": 125.8,
"UpdateAt": "2026-06-04T10:30:00+08:00"
},
{
"TenantId": "18363908****",
"TemplateId": "template-def456",
"TemplateKey": "customer-service",
"TodayActiveUsers": 5,
"TodaySessions": 18,
"TodayCredit": 42.3,
"UpdateAt": "2026-06-03T15:20:00+08:00"
}
]
}
错误码
Code | Message | 说明 |
403 | Forbidden | AK/SK 无权限或签名无效 |
500 | InternalError | 服务内部异常,请重试 |
GetTemplate - 获取Agent模板详情
接口描述
获取指定 Agent 模板的完整配置信息,包括模板基本信息、模型提供商策略、技能列表、MCP 客户端配置、渠道信息、工作空间文件等。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
GetTemplate
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
TemplateId | string | 是 | 模板 ID |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "GetTemplate",
"RegionId": "cn-shanghai",
"TemplateId": "template-abc123",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
RequestId | string | 请求 ID |
|
Success | boolean | 是否调用成功 |
|
Code | string | 错误码,成功时为 |
|
Message | string | 结果描述 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
Id | string | 模板 ID |
|
TenantId | string | 租户 ID |
|
TemplateId | string | 模板 ID |
|
ModelTier | string | 模型层级( |
|
CreatedAt | string | 创建时间(ISO 8601) |
|
UpdatedAt | string | 更新时间(ISO 8601) |
|
Template | object | 模板详情(见下方) | — |
Skills | object | 技能配置(见下方) | — |
Mcp | object | MCP 客户端配置(见下方) | — |
Channels | object | 渠道配置(见下方) | — |
Workspace | object | 工作空间文件(见下方) | — |
Template 对象(字段未配置时不返回)
名称 | 类型 | 描述 |
TemplateKey | string | 模板键名 |
MemoryMaxInputLength | integer | 记忆最大输入长度 |
MemoryCompactRatio | float | 记忆压缩比例 |
MemoryReserveRatio | float | 记忆保留比例 |
MemoryEnableToolResultCompact | boolean | 是否启用工具结果压缩 |
MemoryToolResultCompactKeepN | integer | 工具结果压缩保留最近 N 条 |
MemoryMaxIters | integer | 记忆最大迭代次数 |
TemplateSystemRules | string | 模板系统规则内容 |
Skills 对象
名称 | 类型 | 描述 |
Enabled | array | 已启用的技能列表,每项包含 Type( |
Mcp 对象
名称 | 类型 | 描述 |
Clients | array | MCP 客户端列表,每项包含 Name、Description、Enabled、Transport、Url、Timeout |
Channels 对象
名称 | 类型 | 描述 |
Items | array | 渠道实例列表,每项包含 ChannelInstanceId、ChannelType、ChannelKey、Name、Enabled、Settings |
Workspace 对象
名称 | 类型 | 描述 |
Files | array | 工作空间文件列表,每项包含 Path、Content、Version |
响应示例
成功响应
{
"RequestId": "EA12****-****-****-****-****E5C",
"Success": true,
"Code": "200",
"Message": "",
"HttpStatusCode": 200,
"Id": "template-abc123",
"TenantId": "18363908****",
"TemplateId": "template-abc123",
"ModelTier": "pro",
"CreatedAt": "2026-03-26T02:27:42Z",
"UpdatedAt": "2026-05-19T12:02:44+08:00",
"Template": {
"TemplateKey": "default",
"TemplateSystemRules": "你是一个专业的技术助手,请用简洁的中文回答问题。",
"MemoryMaxIters":50,
"MemoryReserveRatio":0.1, ,
"MemoryMaxInputLength":200000,
"MemoryEnableToolResultCompact":true,
"MemoryCompactRatio":0.7,
"MemoryToolResultCompactKeepN":5
},
"Skills": {
"Enabled": [
{
"Type": "builtin",
"SkillId": "builtin:deep_web_search"
},
{
"Type": "builtin",
"SkillId": "builtin:delegate-to-agent"
}
]
},
"Channels": {
"Items": [
{
"ChannelInstanceId": "ci-dingtalk-001",
"Enabled": false,
"ChannelType": "dingtalk",
"Settings": {},
"ChannelKey": "9ee803****b559",
"Name": "测试钉钉渠道"
}
]
},
"Mcp": {
"Clients": [
{
"Name": "web-search-client",
"Description": "Web search MCP client",
"Timeout": 30,
"Enabled": "true",
"Transport": "sse",
"Url": "https://dashscope.aliyuncs.com/api/v1/mcps/WebSearch/sse"
}
]
},
"Workspace": {
"Files": [
{
"Path": "AGENTS.md",
"Version": 1,
"Content": "# My Agent\n"
},
{
"Path": "config.json",
"Version": 1,
"Content": "{\n \"mode\": \"default\"\n}\n"
}
]
}
}
错误响应 - 模板不存在
{
"RequestId": "7EC1****-****-****-****-****3482",
"HostId": "wuyingai.cn-shanghai.aliyuncs.com",
"Code": "404",
"Message": "agent template not found"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidUrl | Request url is invalid | 请求参数缺失或无效(如未传 TemplateId) |
401 | Unauthorized | 未授权 | AK/SK 无效 |
404 | 404 | agent template not found | 指定的模板不存在 |
500 | InternalError | 服务内部错误 | 服务端异常 |
SetTemplateSystemRules - 设置Agent模板系统规则
接口描述
设置或更新指定 Agent 模板的系统提示规则(System Prompt Rules)。系统规则定义了 Agent 在对话中的行为约束和角色设定,更新后对该模板下的新会话立即生效。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
SetTemplateSystemRules
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
TemplateId | string | 是 | 模板 ID |
|
TemplateSystemRules | string | 是 | 系统规则内容,定义 Agent 的行为约束与角色设定。最大长度 20000 字符 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "SetTemplateSystemRules",
"RegionId": "cn-shanghai",
"TemplateId": "template-abc123",
"TemplateSystemRules": "你是一个专业的技术助手,请用简洁的中文回答问题。",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
RequestId | string | 请求 ID |
|
Success | boolean | 是否调用成功 |
|
Code | string | 错误码,成功时为 |
|
Message | string | 结果描述 |
|
HttpStatusCode | integer | HTTP 状态码 |
|
TenantId | string | 租户 ID |
|
TemplateId | string | 模板 ID |
|
TemplateSystemRules | string | 已设置的系统规则内容 |
|
UpdatedAt | string | 更新时间(ISO 8601) |
|
响应示例
成功响应
{
"RequestId": "EA12****-****-****-****-****E5C",
"Success": true,
"Code": "200",
"Message": "",
"HttpStatusCode": 200,
"TenantId": "18363908****",
"TemplateId": "template-abc123",
"TemplateSystemRules": "你是一个专业的技术助手,请用简洁的中文回答问题。",
"UpdatedAt": "2026-05-19T12:01:27+08:00"
}
错误响应 - 模板不存在
{
"RequestId": "7EC1****-****-****-****-****3482",
"HostId": "wuyingai.cn-shanghai.aliyuncs.com",
"Code": "404",
"Message": "agent template not found"
}
错误响应 - 超过字符限制
{
"RequestId": "DF57****-****-****-****-****2782",
"HostId": "wuyingai.cn-shanghai.aliyuncs.com",
"Code": "400",
"Message": "template_system_rules exceeds maximum length of 20000 characters (got 20001)"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidUrl | Request url is invalid, please check if some of the request parameters are missing or invalid | 请求参数缺失或无效(如未传 TemplateId) |
400 | 400 | template_system_rules exceeds maximum length of 20000 characters | TemplateSystemRules 内容超过 20000 字符限制 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
404 | 404 | agent template not found | 指定的模板不存在 |
500 | InternalError | 服务内部错误 | 服务端异常 |
渠道管理接口
将 JVS Crew Agent 接入第三方对话渠道(当前支持微信)。绑定一个微信渠道实例的最小调用链:
调用 CreateChannelInstanceQrCode 拿到二维码与
SessionKey终端用户使用微信扫描二维码并在手机端确认
客户端以 ~2 秒为间隔轮询 DescribeChannelInstanceQrCode,直到
Status=confirmed,得到ChannelInstanceId后续可使用 ListChannelInstances / DescribeChannelInstance / UpdateChannelInstance 管理该实例
⚠️ 渠道管理接口当前处于 Beta 阶段,接口字段、行为及限制可能在正式发布前调整。
CreateChannelInstanceQrCode - 获取扫码绑定二维码
接口描述
创建一个微信扫码绑定会话,返回二维码图片和用于轮询状态的 SessionKey。终端用户使用微信扫描该二维码并在手机端确认后,将自动完成渠道实例的创建与绑定。
会话有效期由后端控制,超过 ExpiresAt 后该 SessionKey 不可再使用,需要重新发起。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
CreateChannelInstanceQrCode
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ChannelType | string | 是 | 渠道类型,当前仅支持 |
|
TemplateId | string | 是 | Agent 模板 ID |
|
ExternalUserId | string | 是 | 外部系统用户唯一标识 |
|
说明:TenantId由 AK/SK 自动解析,无需传递。(TenantId, TemplateId, ExternalUserId)三元组唯一决定一个渠道实例。
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "CreateChannelInstanceQrCode",
"RegionId": "cn-shanghai",
"ChannelType": "wechat",
"TemplateId": "template-rkvcno5m",
"ExternalUserId": "externalUserId@1762926266827681",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 错误码 |
|
HttpStatusCode | integer | 状态码 |
|
RequestId | string | 请求 ID |
|
SessionKey | string | 会话 Key,用于轮询扫码状态 |
|
QrcodeImgUrl | string | 微信小程序 H5 短链(留痕用) |
|
QrcodeImgBase64 | string | 二维码 PNG 图片的 base64 data URL,前端可直接用作 |
|
ExpiresAt | long | 会话过期时间(毫秒时间戳) |
|
响应示例
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"SessionKey": "qr-a1b2c3d4e5f67890abcdef1234567890",
"QrcodeImgUrl": "https://liteapp.weixin.qq.com/q/7GiQu1?qrcode=xxx&bot_type=3",
"QrcodeImgBase64": "data:image/png;base64,iVBORw0K...",
"ExpiresAt": 1779028328443
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | 缺少必填参数( |
401 | Unauthorized | 未授权 | AK/SK 无效 |
500 | InternalError | 服务内部错误 | 上游异常,请记录 |
DescribeChannelInstanceQrCode - 查询扫码绑定状态
接口描述
查询扫码绑定会话的当前状态。客户端应以 ~2 秒间隔轮询此接口,直到状态变为 confirmed(绑定成功)或 expired(已过期)。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
DescribeChannelInstanceQrCode
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
SessionKey | string | 是 | 由 CreateChannelInstanceQrCode 返回的会话 Key |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "DescribeChannelInstanceQrCode",
"RegionId": "cn-shanghai",
"SessionKey": "qr-a1b2c3d4e5f67890abcdef1234567890",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 错误码 |
|
HttpStatusCode | integer | 状态码 |
|
RequestId | string | 请求 ID |
|
Status | string | 当前状态: |
|
ChannelInstanceId | string | 绑定成功时返回的渠道实例 ID(仅 |
|
ErrCode | string | 失败原因码(仅 |
|
ErrMsg | string | 失败原因描述(仅 |
|
ExpiresAt | long | 会话过期时间(毫秒时间戳) |
|
状态流转
Status | 说明 | 客户端操作 |
waiting | 等待用户扫码 | 继续轮询 |
scanned | 用户已扫码,等待手机端确认 | 继续轮询 |
confirmed | 绑定成功, | 停止轮询,绑定完成 |
expired | 会话过期或用户拒绝 | 停止轮询,提示用户重新发起扫码 |
响应示例
等待中:
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"Status": "waiting",
"ChannelInstanceId": null,
"ErrCode": null,
"ErrMsg": null,
"ExpiresAt": 1779028328443
}
绑定成功:
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"Status": "confirmed",
"ChannelInstanceId": "ci-e3ab0ca50d4342659a545081204f1514",
"ErrCode": null,
"ErrMsg": null,
"ExpiresAt": 1779028328443
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | 缺少 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
404 | ResourceNotFound | 会话不存在 |
|
500 | InternalError | 服务内部错误 | 服务端异常 |
ListChannelInstances - 查询渠道实例列表
接口描述
分页查询当前租户下的渠道实例列表。支持按渠道类型、模板、终端用户、状态筛选。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
ListChannelInstances
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ChannelType | string | 否 | 渠道类型,当前支持 |
|
TemplateId | string | 否 | 按模板 ID 筛选 |
|
ExternalUserId | string | 否 | 按终端用户 ID 筛选 |
|
Status | string | 否 | 按状态筛选: |
|
PageSize | integer | 否 | 每页数量,默认 20,最大 100 |
|
PageNumber | integer | 否 | 页码,从 1 开始,默认 1 |
|
说明:TenantId 由 AK/SK 自动解析,无需传递。请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "ListChannelInstances",
"RegionId": "cn-shanghai",
"ChannelType": "wechat",
"Status": "enabled",
"PageSize": 20,
"PageNumber": 1,
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 错误码 |
|
HttpStatusCode | integer | 状态码 |
|
RequestId | string | 请求 ID |
|
Channels | array | 渠道实例列表(元素结构见下方) | — |
TotalCount | integer | 符合条件的总记录数 |
|
PageSize | integer | 每页数量 |
|
PageNumber | integer | 当前页码 |
|
Channels 数组元素:
名称 | 类型 | 描述 | 示例值 |
ChannelInstanceId | string | 渠道实例 ID |
|
TenantId | long | 租户 ID(由 AK/SK 自动解析) |
|
TemplateId | string | 模板 ID |
|
ExternalUserId | string | 终端用户 ID |
|
ChannelType | string | 渠道类型 |
|
Name | string | 实例展示名称 |
|
Status | string | 实例状态: |
|
GmtCreate | string | 创建时间(ISO 8601) |
|
GmtModified | string | 最后修改时间(ISO 8601) |
|
响应示例
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"Channels": [
{
"ChannelInstanceId": "ci-e3ab0ca50d4342659a545081204f1514",
"TenantId": 1762926266827681,
"TemplateId": "template-rkvcno5m",
"ExternalUserId": "externalUserId@1762926266827681",
"ChannelType": "wechat",
"Name": "我的微信机器人",
"Status": "enabled",
"GmtCreate": "2026-05-10T06:30:00Z",
"GmtModified": "2026-05-11T01:00:00Z"
}
],
"TotalCount": 1,
"PageSize": 20,
"PageNumber": 1
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 |
|
401 | Unauthorized | 未授权 | AK/SK 无效 |
500 | InternalError | 服务内部错误 | 服务端异常 |
DescribeChannelInstance - 查询渠道实例详情
接口描述
查询单个渠道实例的详细信息。支持两种定位方式:
通过实例 ID:传入
ChannelInstanceId通过自然键:同时传入
TemplateId与ExternalUserId(TenantId由 AK/SK 解析)
两种方式二选一。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
DescribeChannelInstance
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ChannelType | string | 否 | 渠道类型,当前支持 |
|
ChannelInstanceId | string | 条件必填 | 渠道实例 ID(与自然键二选一) |
|
TemplateId | string | 条件必填 | 模板 ID(自然键,需与 |
|
ExternalUserId | string | 条件必填 | 终端用户 ID(自然键,需与 |
|
请求示例
方式一:通过 ChannelInstanceId:
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "DescribeChannelInstance",
"RegionId": "cn-shanghai",
"ChannelInstanceId": "ci-e3ab0ca50d4342659a545081204f1514",
}
params["Signature"] = _sign_v1(params, sk)
方式二:通过自然键(TemplateId + ExternalUserId):
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "DescribeChannelInstance",
"RegionId": "cn-shanghai",
"ChannelType": "wechat",
"TemplateId": "template-rkvcno5m",
"ExternalUserId": "externalUserId@1762926266827681",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 错误码 |
|
HttpStatusCode | integer | 状态码 |
|
RequestId | string | 请求 ID |
|
ChannelInstanceId | string | 渠道实例 ID |
|
TenantId | long | 租户 ID(由 AK/SK 自动解析) |
|
TemplateId | string | 模板 ID |
|
ExternalUserId | string | 终端用户 ID |
|
ChannelType | string | 渠道类型 |
|
Name | string | 实例展示名称 |
|
Status | string | 实例状态: |
|
GmtCreate | string | 创建时间(ISO 8601) |
|
GmtModified | string | 最后修改时间(ISO 8601) |
|
响应示例
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"ChannelInstanceId": "ci-e3ab0ca50d4342659a545081204f1514",
"TenantId": 1762926266827681,
"TemplateId": "template-rkvcno5m",
"ExternalUserId": "externalUserId@1762926266827681",
"ChannelType": "wechat",
"Name": "我的微信机器人",
"Status": "enabled",
"GmtCreate": "2026-05-10T06:30:00Z",
"GmtModified": "2026-05-11T01:00:00Z"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 | 两种定位方式都未提供完整参数(既未传 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
404 | ResourceNotFound | 实例不存在 | 给定的 |
500 | InternalError | 服务内部错误 | 服务端异常 |
UpdateChannelInstance - 修改渠道实例状态
接口描述
修改渠道实例的启用 / 禁用状态。禁用后该实例将停止收发消息;重新启用后恢复。
实例定位方式与 DescribeChannelInstance 相同(ChannelInstanceId 或自然键二选一)。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
UpdateChannelInstance
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ChannelType | string | 否 | 渠道类型,当前支持 |
|
ChannelInstanceId | string | 条件必填 | 渠道实例 ID(与自然键二选一) |
|
TemplateId | string | 条件必填 | 模板 ID(自然键) |
|
ExternalUserId | string | 条件必填 | 终端用户 ID(自然键) |
|
Status | string | 是 | 目标状态,仅允许 |
|
状态转换规则
当前状态 | 允许转换到 | 说明 |
enabled | disabled | 暂停实例 |
disabled | enabled | 恢复实例 |
expired | disabled | 凭据已过期,仅可手动关闭,不能直接启用 |
deleted | — | 已删除,不可操作 |
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "UpdateChannelInstance",
"RegionId": "cn-shanghai",
"ChannelType": "wechat",
"ChannelInstanceId": "ci-e3ab0ca50d4342659a545081204f1514",
"Status": "disabled",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
响应结构与 DescribeChannelInstance 一致,返回更新后的实例完整信息。
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 错误码 |
|
HttpStatusCode | integer | 状态码 |
|
RequestId | string | 请求 ID |
|
ChannelInstanceId | string | 渠道实例 ID |
|
TenantId | long | 租户 ID |
|
TemplateId | string | 模板 ID |
|
ExternalUserId | string | 终端用户 ID |
|
ChannelType | string | 渠道类型 |
|
Name | string | 实例展示名称 |
|
Status | string | 更新后的状态 |
|
GmtCreate | string | 创建时间(ISO 8601) |
|
GmtModified | string | 最后修改时间(ISO 8601) |
|
响应示例
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"ChannelInstanceId": "ci-e3ab0ca50d4342659a545081204f1514",
"TenantId": 1762926266827681,
"TemplateId": "template-rkvcno5m",
"ExternalUserId": "externalUserId@1762926266827681",
"ChannelType": "wechat",
"Name": "我的微信机器人",
"Status": "disabled",
"GmtCreate": "2026-05-10T06:30:00Z",
"GmtModified": "2026-05-11T13:45:00Z"
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
400 | InvalidParameter | 参数错误 |
|
401 | Unauthorized | 未授权 | AK/SK 无效 |
404 | ResourceNotFound | 实例不存在 | 指定的实例不存在 |
500 | InternalError | 服务内部错误 | 服务端异常 |
DescribeChannelInstanceStats - 获取渠道状态统计
接口描述
按渠道类型获取当前租户下所有实例的状态统计(启用 / 禁用 / 失效 / 总数)。
请求信息
认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同
Action:
DescribeChannelInstanceStats
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
ChannelType | string | 否 | 渠道类型,当前支持 |
|
TemplateId | string | 否 | 按模板 ID 筛选 |
|
请求示例
params = {
"Format": "JSON",
"Version": "2026-03-11",
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "DescribeChannelInstanceStats",
"RegionId": "cn-shanghai",
"ChannelType": "wechat",
}
params["Signature"] = _sign_v1(params, sk)
响应参数
名称 | 类型 | 描述 | 示例值 |
Success | boolean | 是否成功 |
|
Code | string | 错误码 |
|
HttpStatusCode | integer | 状态码 |
|
RequestId | string | 请求 ID |
|
Channels | array | 各渠道类型的统计数据(元素结构见下方) | — |
Channels 数组元素:
名称 | 类型 | 描述 | 示例值 |
ChannelType | string | 渠道类型 |
|
EnabledCount | integer | 启用中数量 |
|
DisabledCount | integer | 用户主动关闭数量 |
|
ExpiredCount | integer | 凭据失效数量(如微信端解绑) |
|
TotalCount | integer | 总接入数量 |
|
响应示例
{
"Success": true,
"Code": "200",
"HttpStatusCode": 200,
"RequestId": "EA12****-****-****-****-****E5C",
"Channels": [
{
"ChannelType": "wechat",
"EnabledCount": 1,
"DisabledCount": 1,
"ExpiredCount": 8,
"TotalCount": 10
}
]
}
错误码
HttpCode | Error Code | 错误信息 | 说明 |
401 | Unauthorized | 未授权 | AK/SK 无效 |
500 | InternalError | 服务内部错误 | 服务端异常 |
使用示例
Python
完整的示例代码请参考:
#!/usr/bin/env python3
""" JVS Crew Chat 示例 - 使用 POP V1 签名
使用前需要提供以下信息:
1. 阿里云 AK/SK(必需)
- 获取方式:阿里云 RAM 控制台 → AccessKey 管理 → 创建 AccessKey
- 配置方式:在项目根目录 .env 文件中添加:
ALIBABA_CLOUD_ACCESS_KEY_ID=你的AK
ALIBABA_CLOUD_ACCESS_KEY_SECRET=你的SK
- 注意:建议使用 RAM 子用户的 AK/SK,避免使用主账号
2. 可选配置项(修改下方代码中的常量)
- ENDPOINT: API 端点地址,默认 cn-shanghai
- REGION_ID: 地域 ID,默认 cn-shanghai
- EXTERNAL_USER_ID: 外部用户 ID,用于标识对话用户
- USER_MESSAGE: 要发送的消息内容
运行方式:
pip install requests python-dotenv
python jvscrew_chat_example.py
"""
import base64
import hashlib
import hmac
import json
import os
import time
import urllib.parse
import uuid
from datetime import datetime, timezone
import requests
from dotenv import load_dotenv
# 加载当前目录的 .env 文件
load_dotenv()
# ============ 配置 ============
ENDPOINT = "https://wuyingai.cn-shanghai.aliyuncs.com"
API_VERSION = "2026-03-11"
REGION_ID = "cn-shanghai"
EXTERNAL_USER_ID = "test-user-example"
USER_MESSAGE = "你好"
# ============ V1 签名实现 ============
def _pct(s: str) -> str:
"""RFC 3986 URL 编码"""
return urllib.parse.quote(str(s), safe="-_.~")
def _now_utc() -> str:
"""UTC 时间戳"""
return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
def _sign_v1(params: dict, sk: str) -> str:
"""计算阿里云 POP V1 签名"""
# 1. 参数排序 + URL 编码
pairs = [
f"{_pct(k)}={_pct(str(v))}"
for k, v in sorted(params.items())
if k != "Signature"
]
canonical = "&".join(pairs)
# 2. 构造待签名字符串
string_to_sign = f"POST&{_pct('/')}&{_pct(canonical)}"
# 3. HMAC-SHA1 签名
key = (sk + "&").encode("utf-8")
signature = base64.b64encode(
hmac.new(key, string_to_sign.encode("utf-8"), hashlib.sha1).digest()
).decode("ascii")
return signature
def get_access_token(ak: str, sk: str, external_user_id: str) -> str:
"""获取 AccessToken(使用 V1 签名)"""
params = {
"Format": "JSON",
"Version": API_VERSION,
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "GetAccessToken",
"RegionId": REGION_ID,
"ExternalUserId": external_user_id,
}
# 计算签名
params["Signature"] = _sign_v1(params, sk)
# 发送请求
url = f"{ENDPOINT}/?{urllib.parse.urlencode(params)}"
resp = requests.post(
url, headers={"Accept": "application/json"}, timeout=60)
resp.raise_for_status()
data = resp.json()
if not data.get("Success") and data.get("Code") not in ("200", "Success", None):
raise RuntimeError(f"GetAccessToken failed: {data}")
token = data.get("AccessToken")
if not token:
raise RuntimeError(f"No AccessToken in response: {data}")
return token
def chat_sse(jwt: str, external_user_id: str, session_id: str, text: str):
"""发起 Chat SSE 对话"""
url = f"{ENDPOINT}/api/agent/chat?Authorization={urllib.parse.quote(f'Bearer {jwt}')}"
payload = {
"ExternalUserId": external_user_id,
"SessionId": session_id,
"Input": json.dumps(
[{"Role": "user", "Content": [{"Type": "text", "Text": text}]}],
ensure_ascii=False,
),
}
headers = {
"Content-Type": "application/json",
"Accept": "text/event-stream",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"x-acs-version": API_VERSION,
"x-acs-action": "Chat",
"x-acs-date": _now_utc(),
}
resp = requests.post(url, json=payload, headers=headers,
stream=True, timeout=300)
resp.raise_for_status()
# 处理 SSE 流
# current_phase 用于区分 reasoning(思考)和 message(正式回复)阶段
current_phase = None # "reasoning" 或 "message"
for line in resp.iter_lines():
if not line:
continue
line = line.decode("utf-8")
if not line.startswith("data:"):
continue
raw = line[5:].strip()
if raw == "[DONE]":
break
try:
ev = json.loads(raw)
except json.JSONDecodeError:
continue
if not isinstance(ev, dict):
continue
obj = ev.get("Object") or ev.get("object")
typ = ev.get("Type") or ev.get("type")
status = ev.get("Status") or ev.get("status")
# 跟踪当前阶段:reasoning(思考)或 message(正式回复)
if obj == "message" and typ in ("reasoning", "message"):
current_phase = typ
# 只输出正式回复阶段的增量 content,跳过 reasoning 内容
if obj == "content" and typ == "text" and status == "in_progress":
if current_phase == "message":
text_content = ev.get("Text") or ev.get("text") or ""
print(text_content, end="", flush=True)
elif obj == "error":
print(f"\n错误: {json.dumps(ev, ensure_ascii=False)}")
break
elif obj == "response" and status == "completed":
print("\n对话完成")
break
print()
def main():
# 从环境变量读取 AK/SK
ak = os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID", "").strip()
sk = os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET", "").strip()
if not ak or not sk:
raise RuntimeError(
"请设置环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET\n"
"或在项目根目录 .env 文件中配置"
)
print(f"使用 AK: {ak[:8]}...")
print(f"ExternalUserId: {EXTERNAL_USER_ID}")
print(f"发送消息: {USER_MESSAGE}")
print("-" * 50)
# 1. 获取 Token
print("正在获取 AccessToken...")
token = get_access_token(ak, sk, EXTERNAL_USER_ID)
print(f"Token 获取成功")
# 2. 发起对话
session_id = f"session-{int(time.time() * 1000)}"
print(f"SessionId: {session_id}")
print("-" * 50)
print("AI 回复:")
chat_sse(token, EXTERNAL_USER_ID, session_id, USER_MESSAGE)
if __name__ == "__main__":
main()
文件上传完整示例
将本地文件上传到 Context 存储并同步到沙箱,需要依次完成三步:获取上传地址 → PUT 上传文件 → 同步到沙箱。
import hashlib
import hmac
import base64
import urllib.parse
import uuid
import requests
from datetime import datetime, timezone
def _pct(s: str) -> str:
return urllib.parse.quote(str(s), safe="-_.~")
def _now_utc() -> str:
return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
def _sign_v1(params: dict, sk: str) -> str:
pairs = [
f"{_pct(k)}={_pct(str(v))}"
for k, v in sorted(params.items())
if k != "Signature"
]
canonical = "&".join(pairs)
string_to_sign = f"POST&{_pct('/')}&{_pct(canonical)}"
key = (sk + "&").encode("utf-8")
return base64.b64encode(
hmac.new(key, string_to_sign.encode("utf-8"), hashlib.sha1).digest()
).decode("ascii")
ENDPOINT = "https://wuyingai.cn-shanghai.aliyuncs.com"
API_VERSION = "2026-03-11"
REGION_ID = "cn-shanghai"
def get_chat_file_upload_url(ak: str, sk: str, file_name: str,
external_user_id: str, template_id: str = "") -> dict:
"""步骤一:获取文件上传地址"""
params = {
"Format": "JSON",
"Version": API_VERSION,
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "GetChatFileUploadUrl",
"RegionId": REGION_ID,
"FileName": file_name,
"ExternalUserId": external_user_id,
}
if template_id:
params["TemplateId"] = template_id
params["Signature"] = _sign_v1(params, sk)
url = f"{ENDPOINT}/?{urllib.parse.urlencode(params)}"
resp = requests.post(url, headers={"Accept": "application/json"}, timeout=60)
resp.raise_for_status()
data = resp.json()
if not data.get("Success"):
raise RuntimeError(f"GetChatFileUploadUrl failed: {data}")
return data # 包含 UploadUrl、FileKey、SandboxPath
def upload_file_to_oss(upload_url: str, file_path: str) -> None:
"""步骤二:将文件 PUT 上传到预签名 URL(直传对象存储)"""
with open(file_path, "rb") as f:
file_content = f.read()
resp = requests.put(upload_url, data=file_content, timeout=120)
resp.raise_for_status()
def sync_context(ak: str, sk: str, external_user_id: str, file_key: str,
template_id: str = "") -> dict:
"""步骤三:同步文件到沙箱"""
params = {
"Format": "JSON",
"Version": API_VERSION,
"AccessKeyId": ak,
"SignatureMethod": "HMAC-SHA1",
"Timestamp": _now_utc(),
"SignatureVersion": "1.0",
"SignatureNonce": str(uuid.uuid4()),
"Action": "SyncContext",
"RegionId": REGION_ID,
"ExternalUserId": external_user_id,
"FileKey": file_key,
}
if template_id:
params["TemplateId"] = template_id
params["Signature"] = _sign_v1(params, sk)
url = f"{ENDPOINT}/?{urllib.parse.urlencode(params)}"
resp = requests.post(url, headers={"Accept": "application/json"}, timeout=60)
resp.raise_for_status()
data = resp.json()
if not data.get("Success"):
raise RuntimeError(f"SyncContext failed: {data}")
return data
def upload_and_sync(ak: str, sk: str, local_file_path: str,
external_user_id: str, template_id: str = "") -> str:
"""完整的文件上传流程,返回文件在沙箱中的路径"""
file_name = local_file_path.split("/")[-1]
# 步骤一:获取上传地址
print(f"正在获取文件上传地址: {file_name}")
upload_info = get_chat_file_upload_url(ak, sk, file_name, external_user_id, template_id)
upload_url = upload_info["UploadUrl"]
file_key = upload_info["FileKey"]
sandbox_path = upload_info["SandboxPath"]
print(f"FileKey: {file_key}, SandboxPath: {sandbox_path}")
# 步骤二:PUT 上传文件到对象存储
print(f"正在上传文件到对象存储...")
upload_file_to_oss(upload_url, local_file_path)
print("文件上传完成")
# 步骤三:同步到沙箱
print(f"正在同步文件到沙箱...")
sync_context(ak, sk, external_user_id, file_key, template_id)
print(f"文件已同步到沙箱路径: {sandbox_path}")
return sandbox_path
# 使用示例
if __name__ == "__main__":
import os
ak = os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID", "").strip()
sk = os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET", "").strip()
sandbox_path = upload_and_sync(
ak=ak,
sk=sk,
local_file_path="/path/to/report.pdf",
external_user_id="user-38764",
template_id="template-abc123", # 可选
)
print(f"文件已就绪,沙箱路径: {sandbox_path}")
# 之后即可在 Chat 接口的 Input 中通过 FileUrl 引用该路径