JVS Crew API 参考

更新时间:
复制 MD 格式

概述

JVS Crew 是阿里云无影团队开发的 AI 智能助手平台。通过本文档描述的 API,您可以将 JVS Crew 的 AI 对话能力集成到自己的应用中。

API 分为十类:

  • 会话交互 — 获取令牌、发起对话、上传文件

  • 技能管理 — 查询可用技能及启用状态、技能包上传与更新

  • 用户 MCP 管理 — 用户级 MCP 偏好、凭证绑定、专属 MCP 管理

  • 会话管理 — 列举/查看/删除历史会话

  • 环境变量 — 设置、获取、删除用户运行环境变量

  • 定时任务 — 创建/管理/监控定时执行任务

  • 计费查询 — 查看用量和消耗明细

  • 工作空间管理 — 同步、列举、下载和清理用户工作空间数据

  • 模板管理 — 获取模板详情、设置模板系统规则

  • 渠道管理 — 微信扫码绑定、渠道实例查询/修改/统计

快速开始

集成 JVS Crew 最少只需两步:

  1. 获取令牌 — 使用 AK/SK 调用 GetAccessToken,获取 AccessToken

  2. 发起对话 — 携带 AccessToken 调用 Chat,通过 SSE 流接收回复

完整 Python 示例参见 使用示例 章节。

基础信息

  • 协议: HTTPS

  • 生产 Base URL: https://wuyingai.cn-shanghai.aliyuncs.com

  • API 版本: 2026-03-11(所有接口的 x-acs-version 或 POP Version 参数)

认证方式

本文档中的 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 参数 Authorization=Bearer <token>

通用请求格式

两种认证方式对应不同的请求格式:

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

创建微信扫码绑定会话,返回二维码与 SessionKey

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

外部系统用户唯一标识

"user-38764"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

Message

string

错误详情(失败时返回)

null

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识(UUID 形态,首尾保留示意)

"EA12****-****-****-****-****E5C"

AccessToken

string

JWT,用于 Chat 的 Query 参数 Authorization;在一段时间内有效

"eyJhbGc****.eyJ********.****TCk"

AccessDeniedDetail

string

鉴权失败详情

null

响应示例

成功:

{
  "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 可查询任务状态

请求信息

  • 请求方法: POST

  • Content-Type: application/json

  • 响应 Content-Type: text/event-stream

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TemplateId

string

Agent 模板 ID

"template-abc123"

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

Accept

string

接受的响应类型

text/event-stream

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

Chat

x-acs-date

string

请求时间(ISO 8601 格式)

2026-03-18T06:21:31Z

Cache-Control

string

缓存控制

no-cache

Connection

string

连接类型

keep-alive

请求参数

名称

类型

必填

描述

示例值

SessionId

string

会话 ID,用于多轮对话上下文保持

"test-session-001"

ExternalUserId

string

外部系统用户 ID

"test-user"

Input

string

消息列表(JSON 字符串),按时间顺序排列

"[{\"Role\":\"user\",\"Content\":[{\"Type\":\"text\",\"Text\":\"你好\"}]}]"

RoutingKey

string

路由键,用于指定处理请求的后端实例

""

StreamOptions

object

流式输出控制选项。包含 IncludeReasoning(boolean,默认 true,是否包含模型思考过程)和 IncludeToolCalls(boolean,默认 true,是否包含工具调用详细信息)。不传或传空对象时行为与旧版一致。

{"IncludeReasoning": false, "IncludeToolCalls": false}

Settings

object

其他设置信息。包含输出文件模式控制参数OutputFileMode(string,可选urlbase64,当前为兼容旧版默认 base64,推荐使用url)

{"OutputFileMode": "url"}

StreamOptions 结构说明

StreamOptions 是可选的流式输出控制参数,用于精简 SSE 流返回的事件内容。

名称

类型

必填

默认值

描述

IncludeReasoning

boolean

true

是否包含模型思考过程。设为 false 时,SSE 流中将不包含 Type="reasoning" 的 message 及其 content 事件

IncludeToolCalls

boolean

true

是否包含工具调用详情。设为 false 时,SSE 流中将不包含 plugin_call/plugin_call_output/mcp_call/mcp_call_output 类型的 message 及其 content 事件

使用建议:面向终端用户的 C 端场景建议设置 "IncludeReasoning": false, "IncludeToolCalls": false,可大幅简化客户端解析逻辑。

注意

  • 未传 StreamOptions 或传空对象 {} 时,默认行为与旧版完全一致

  • 过滤仅影响 SSE 输出,不影响模型推理过程和工具调用的实际执行

  • 过滤后 SequenceNumber 不保证连续,但顺序正确

Settings 结构说明

名称

类型

必填

默认值

描述

OutputFileMode

string

base64

控制文件输出模式的参数,可选urlbase64, 当前为兼容旧版不传本参数默认使用 base64

使用建议:传递base64时,工具输出的file类型数据结构,以base64形式返回,但base64大小过大会影响SSE传输稳定性,故不推荐使用。传递url时,会传递临时可下载的url。

注意

  • 未传Settings 或传空对象 {} 时,默认行为为使用base64

  • 后续计划会切换为默认模式为url,故建议接入时使用url模式

Input 结构说明

Input 参数是一个 JSON 字符串(非对象数组),包含 Message 数组,需要先序列化为字符串再传递。

Message 结构(JSON 字符串内的数组元素):

名称

类型

必填

描述

示例值

枚举值

Role

string

消息角色

"user"

user / assistant / system / tool

Content

array

内容块列表

见下方 Content 结构

-

Content 结构(Message 中的 Content 数组元素):

名称

类型

必填

描述

示例值

枚举值

Type

string

内容类型

"text"

text / image / file

Text

string

文本内容(Type=text)

"帮我分析这张图片"

-

ImageUrl

string

图片 URL 或 base64(Type=image)

"https://example.com/img.jpg"

-

FileUrl

string

文件路径或 URL(Type=file)

"/workspace/report.pdf"

-

FileName

string

文件名称(Type=file 时可选,用于指定文件显示名称)

"report.pdf"

-

请求示例

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

事件对象类型

"response" / "message" / "content" / "error"

Id

string

消息唯一标识

"msg_xxx"

SessionId

string

会话 ID

"176405663****961"

SequenceNumber

string

事件序号,用于保证顺序

"1"

Response 事件字段

Object=response 事件是整个回复的生命周期包装,标记回复的开始与结束。

名称

类型

描述

枚举值

Status

string

回复状态

created / in_progress / completed

Message 事件字段

Object=message 事件表示一段具体的消息,通过 Type 字段区分消息类型。

名称

类型

描述

枚举值

Role

string

角色

user / assistant / system / tool

Type

string

消息类型

reasoning(模型思考过程) / message(正式回复)

Status

string

运行状态

in_progress / completed

Content

array

内容块列表(仅 completed 时携带)

见下方 Content 结构

CreatedAt

string

创建时间戳(Unix 秒)

"1773380609"

Content 结构(响应)

名称

类型

描述

示例值

Type

string

内容类型

"text" / "data"

Status

string

内容状态

"in_progress"(增量片段) / "completed"(聚合完整文本)

Text

string

文本内容

"您好"

Data

object

结构化数据(如工具调用)

{"call_id":"call_xxx","name":"get_weather", "output":"工具返回明细,文本格式"}

事件类型说明

事件类型

Object

描述

触发时机

回复创建

response

Status=created,整个回复的生命周期开始

SSE 流开始

回复进行中

response

Status=in_progress

开始生成内容

思考开始

message

Type=reasoning, Status=in_progress

模型开始推理

思考内容增量

content

思考阶段的文本片段(Status=in_progress

每生成一段思考文本

思考完成

message

Type=reasoning, Status=completed

推理结束

消息开始

message

Type=message, Status=in_progress

开始生成正式回复

消息内容增量

content

正式回复的文本片段(Status=in_progress

每生成一段回复文本

消息内容完成

content

聚合后的完整文本(Status=completed

正式回复文本生成完毕

消息完成

message

Type=message, Status=completed

正式回复结束

回复完成

response

Status=completed

SSE 流结束

错误

error

错误信息

发生错误时

心跳

:ping(注释行)

保持长连接,客户端忽略即可

空闲时每隔数秒

注意:思考阶段(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 存储空间。完整的文件上传流程分三步:

  1. 调用本接口获取 UploadUrlFileKey

  2. 使用 HTTP PUT 请求将文件内容上传到 UploadUrl(直传对象存储,无需额外签名)

  3. 凭该 FileKey 调用 SyncContext 将文件同步到沙箱,之后 Agent 方可使用该文件

请求信息

  • 认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同

  • Action: GetChatFileUploadUrl

请求参数

名称

类型

必填

描述

示例值

FileName

string

要上传的文件名称

"report.pdf"

ExternalUserId

string

外部系统用户唯一标识

"user-38764"

TemplateId

string

Agent 模板 ID

"template-abc123"

请求示例

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

是否成功

true

Code

string

错误码

"200"

HttpStatusCode

integer

状态码

200

RequestId

string

请求 ID

"EA12****-****-****-****-****E5C"

AccessDeniedDetail

string

鉴权失败详情

null

UploadUrl

string

文件上传 URL,客户端使用此 URL 上传文件

"https://..."

UploadHeadersHint

string

上传请求所需的额外 Header 提示

"..."

SandboxPath

string

文件在沙箱内的路径

"/home/wuying/jvscrew/uploads/report_a1b2c3d4.pdf"

FileKey

string

文件标识,后续调用 SyncContext 时需传入此值。注意:FileKey 由服务端生成,格式为 uploads/<原文件名>_<随机后缀>.<扩展名>,与原始文件名不同

"uploads/report_a1b2c3d4.pdf"

响应示例

成功:

{
  "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

外部系统用户唯一标识

"user-38764"

FileKey

string

文件标识(来自 GetChatFileUploadUrl 返回值)

"uploads/report_a1b2c3d4.pdf"

TemplateId

string

Agent 模板 ID

"template-abc123"

请求示例

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

是否成功

true

Code

string

错误码

"200"

HttpStatusCode

integer

状态码

200

RequestId

string

请求 ID

"EA12****-****-****-****-****E5C"

AccessDeniedDetail

string

鉴权失败详情

null

响应示例

成功:

{
  "Success": true,
  "Code": "200",
  "HttpStatusCode": 200,
  "RequestId": "EA12****-****-****-****-****E5C"
}

技能管理接口

ListSkills - 查询技能列表

接口描述

按技能类型分页查询当前租户、当前模板可见的技能列表,并返回每个技能在该模板下的启用状态。

Type 必须显式传入,且一次只能查询一种类型。如需展示完整技能列表,请分别调用 Type=builtinType=market 后在调用方侧合并。内置技能默认启用,市场技能默认禁用,响应中的 Enabled 字段已经是当前租户和模板下的最终启用状态。

请求信息

  • 认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同

  • Action: ListSkills

请求参数

名称

类型

必填

描述

示例值

Type

string

技能类型:builtin(内置技能)或 market(市场/企业技能)。缺失会返回 HTTP 417

"builtin"

TemplateId

string

Agent 模板 ID;不传时使用用户绑定的默认模板

"template-abc123"

PageNumber

integer

页码,从 1 开始,默认 1

1

PageSize

integer

每页条数,取值范围 1100,默认 20

50

Status

string

技能状态过滤,仅对 Type=market 生效;常用值:AVAILABLE / INIT / VERIFYING;不传表示不过滤

"AVAILABLE"

Tags

string

标签 ID 筛选,JSON 数组格式,多个标签为 OR 语义;仅对 Type=market 生效;不传表示不过滤

"[\"tag_001\",\"tag_002\"]"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

Skills

array

技能列表

见下方

TotalCount

string

符合条件的技能总数。注意该字段为字符串,使用前需按数字解析

"11"

PageNumber

integer

当前页码(回显请求参数)

1

PageSize

integer

每页条数(回显请求参数)

50

Skills 数组元素:

名称

类型

描述

示例值

SkillId

string

技能唯一 ID,内置技能通常以 builtin: 前缀开头

"builtin:deep_web_search"

SkillName

string

技能名,可用于后续技能开关类接口定位技能

"deep_web_search"

Type

string

技能类型,与请求参数 Type 一致:builtinmarket

"builtin"

Description

string

技能描述

"深度网络信息搜索"

Icon

string

图标,可能为 emoji 或图片 URL

"search"

GmtModified

string

最近修改时间;市场技能通常返回该字段

"2026-05-11T06:00:00Z"

Enabled

boolean

当前租户和模板下该技能是否启用

true

SkillStatus

string

市场技能状态;内置技能通常为空

"AVAILABLE"

Tags

array

租户标签列表;仅市场技能返回

["tag_001", "tag_002"]

响应示例

{
  "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

Type 取值非法

417

400

query → type: Field required

缺少必填参数 Type

503

ServiceUnavailable

Skill center unavailable

查询市场技能时上游技能中心暂不可用

500

InternalError

Internal server error

服务端内部错误,请记录 RequestId 反馈给技术支持

注意事项

  1. Type 只能传单一值,不能同时查询 builtinmarket

  2. PageSize 最大为 100,市场技能较多时请按页遍历。

  3. 响应会回显 PageNumberPageSize,可用于客户端翻页状态同步。

  4. TemplateId 不传时使用默认模板;不同模板下的 Enabled 状态相互独立。

  5. AK/SK 必须保存在服务端并完成签名,禁止在前端代码、浏览器或移动 App 包中暴露。


SetSkillPreference - 设置用户技能偏好

接口描述

为当前用户设置在指定 Agent 模板下对某个技能(builtin 或 market)的启用偏好。Preference 取值为 Enabled / Disabled / Default,其中 Default 会删除该用户对此技能的偏好记录,让该技能回落到模板自身的默认启用状态。

适用场景: 在前端给用户一个「单独打开/关闭某个技能」开关时,调用该接口持久化用户选择;用户点击「恢复默认」时传 Default

与模板的关系: 用户偏好优先级高于模板默认值。设置 Enabled / Disabled 会创建/更新偏好记录;设置 Default 会删除偏好记录,该技能再次跟随模板默认。

请求信息

  • 认证方式: JWT 令牌(Authorization Query 参数)

  • 请求方法: POST

  • Action: SetSkillPreference

请求参数

名称

类型

必填

描述

示例值

SkillId

string

技能唯一 ID。内置技能以 builtin: 前缀开头;市场技能为市场返回的 SkillId

"builtin:deep_web_search"

Preference

string

偏好值,可选 Enabled / Disabled / DefaultDefault 表示删除偏好记录、回落到模板默认

"Enabled"

TemplateId

string

Agent 模板 ID,不传则使用用户当前绑定的默认模板

"template-abc123"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

SkillId

string

此次操作对应的技能 ID(回显)

"builtin:deep_web_search"

UserPreference

string

此次操作设置的偏好值(回显),与请求 Preference 一致

"Enabled"

响应示例

{
  "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

Preference 取值非法

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

校验市场技能时上游技能中心暂不可用

注意事项

  1. Preference=Default 是删除而不是设置——它会移除该用户对此 SkillId 的偏好记录,使技能回落到模板自身的默认启用状态。

  2. SkillId 必须存在于全局 builtin 技能列表,或当前租户的市场技能列表中。

  3. 设置偏好后下一次对话生效。


ListSkillPreferences - 查询用户技能偏好列表

接口描述

分页列出当前用户在指定 Agent 模板下设置过的技能偏好。仅返回有显式偏好记录的 skill;没有偏好记录的技能不会出现在结果中。

返回内容: 每条记录包含 SkillIdUserPreferenceEnabledDisabled)、UpdatedAt 三个字段。Default 不会出现在 UserPreference 中——一旦用户选择 Default,该条偏好记录会被删除,从此跟随模板默认。

请求信息

  • 认证方式: JWT 令牌(Authorization Query 参数),与 SetSkillPreference 相同

  • 请求方法: POST

  • Action: ListSkillPreferences

请求参数

名称

类型

必填

描述

示例值

MaxResults

integer

每页最大返回数量,取值范围 1100,默认 100;传空字符串等价于不传

50

NextToken

string

翻页令牌,由上一次响应的 NextToken 字段获得;首次调用不传

"eyJwYWdlIjoyfQ=="

TemplateId

string

Agent 模板 ID,不传则使用用户当前绑定的默认模板

"template-abc123"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

SkillPreferences

array

用户技能偏好列表

见下方

NextToken

string

下一页令牌;为空表示已是最后一页

"eyJwYWdlIjozfQ=="

SkillPreferences 数组元素:

名称

类型

描述

示例值

SkillId

string

技能唯一 ID

"builtin:deep_web_search"

UserPreference

string

用户设置的偏好值,仅可能为 EnabledDisabled

"Enabled"

UpdatedAt

string

偏好最后更新时间(ISO 8601)

"2026-05-13T15:43:56.358003+08:00"

响应示例

{
  "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

服务内部错误

服务端异常,请稍后重试

注意事项

  1. 返回结果只包含用户主动设置过偏好的技能;如需展示完整技能列表,请配合 ListSkills 使用。

  2. UserPreference 不会出现 Default——Default 操作会删除偏好记录,使该技能在结果中消失。

  3. MaxResults 上限为 100;偏好数较多时请按 NextToken 翻页


GetSkillCenterCredential - 获取技能包上传凭证

接口描述

获取技能包文件的预签名上传 URL,用于将技能包上传至对象存储。完整的技能包上传流程分两步:

  1. 调用本接口获取 Url(预签名上传地址)

  2. 使用 HTTP PUT 请求将技能包 zip 文件上传到 Url(直传对象存储,无需额外签名,需设置 Content-Type: application/octet-stream

上传完成后,将该 Url 作为 FileUrl 传入 CreateSkillCenterSkillUpdateSkillCenterSkill 即可完成技能创建或更新。

请求信息

  • 认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同

  • Action: GetSkillCenterCredential

请求参数

名称

类型

必填

描述

示例值

FileName

string

待上传的技能包文件名

"my_tool_v2.zip"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

Url

string

预签名上传 URL,有效期有限,需尽快使用

"https://skill-packages-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/skills/upload/my_tool_v2.zip?Expires=..."

响应示例

成功:

{
  "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

缺少必填参数 FileName

401

Unauthorized

未授权

AK/SK 无效

500

InternalError

服务内部错误

服务端异常

注意事项

  1. 预签名地址有效期有限,获取后应尽快完成上传。

  2. 仅支持 .zip 格式的技能包文件。


CreateSkillCenterSkill - 创建市场技能

接口描述

创建一个新的市场技能。技能名称和描述从上传的 OSS 技能包中自动解析,无需手动指定。完整流程为:

  1. 调用 GetSkillCenterCredential 获取预签名上传 URL

  2. 使用 HTTP PUT 将技能包 zip 文件上传至该 URL

  3. 调用本接口,传入 FileUrl 完成技能创建

创建成功后默认触发安全检测,可通过 SkipVerify 参数跳过。

请求信息

  • 认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同

  • Action: CreateSkillCenterSkill

请求参数

名称

类型

必填

描述

示例值

FileUrl

string

技能包 OSS 文件 URL(由 GetSkillCenterCredential 返回)

"https://skill-packages-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/skills/upload/my_tool_v1.zip?Expires=..."

Icon

string

图标标识;不传则使用默认图标

"code"

Tags

string

标签 ID 列表,JSON 数组格式,最多 10 个;不传表示无标签

"[\"tag_001\",\"tag_002\"]"

SkipVerify

boolean

是否跳过安全检测,默认 false

false

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

SkillId

string

创建成功的技能 ID

"skill_abc123"

响应示例

成功:

{
  "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

缺少必填参数 FileUrl

400

InvalidParameter

Invalid fileUrl

FileUrl 格式非法,需为合法的 OSS URL

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

服务端异常

注意事项

  1. 技能名称和描述从技能包中自动解析,不支持通过请求参数指定。

  2. 创建后技能默认状态为 INIT,安全检测通过后变为 AVAILABLE;若跳过安全检测则直接变为 AVAILABLE


UpdateSkillCenterSkill - 更新市场技能

接口描述

更新已有市场技能的属性或技能包文件。当传入 FileUrl 时替换 OSS 文件;不传则仅更新 Icon、Tags 等属性。更新成功后默认触发安全检测,可通过 SkipVerify 参数跳过。

请求信息

  • 认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同

  • Action: UpdateSkillCenterSkill

请求参数

名称

类型

必填

描述

示例值

SkillId

string

要更新的技能 ID

"skill_abc123"

FileUrl

string

新技能包 OSS 文件 URL(由 GetSkillCenterCredential 返回);不传则不更新技能包文件

"https://skill-packages-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/skills/upload/my_tool_v2.zip?Expires=..."

Icon

string

图标标识;不传保留原值

"code"

Tags

string

标签 ID 列表,JSON 数组格式,最多 10 个;传 "[]" 清空标签,不传保留原标签

"[\"tag_001\",\"tag_002\"]"

SkipVerify

boolean

是否跳过安全检测,默认 false

false

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

SkillId

string

更新后的技能 ID

"skill_abc123"

响应示例

成功:

{
  "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

缺少必填参数 SkillId

400

InvalidParameter

Invalid fileUrl

FileUrl 格式非法,需为合法的 OSS URL

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

每页最大条数,默认 20,范围 1~100

20

NextToken

string

翻页令牌,首次查询不传或传空,后续传上一次响应返回的 NextToken

"eyJ..."

Tags

string

标签 ID 筛选,JSON 数组格式,多个标签为 OR 语义;不传表示不过滤

"[\"tag_001\",\"tag_002\"]"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

Skills

array

市场技能列表

见下方

TotalCount

integer

符合条件的技能总数

12

MaxResults

integer

实际使用的每页大小

20

NextToken

string

下一页令牌,为空表示已到末页

""

Skills 数组元素:

名称

类型

描述

示例值

SkillId

string

技能唯一 ID

"skill_abc123"

SkillName

string

技能名称

"my_automation_tool"

Description

string

技能描述

"自动化办公工具"

Icon

string

图标标识

"code"

GmtModified

string

最近修改时间,ISO 8601 格式

"2026-05-21T10:30:00Z"

SkillStatus

string

技能状态:AVAILABLE(可用)/ INIT(初始化)/ VERIFYING(检测中)/ OFFLINE(已下线)

"AVAILABLE"

EnabledTemplateCount

integer

被启用该技能的模板数量

3

TenantTags

array

租户标签列表

["tag_001", "tag_002"]

响应示例

成功:

{
  "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

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_idcrew_user_id)从 JWT claims 中获取。设置变更在下次会话时生效


SetUserMcpPreference - 设置用户 MCP 偏好

接口描述

设置当前用户对某个模板级 MCP 的启用偏好。Preference 取值为 enabled / disabled / default,其中 default 表示恢复跟随模板默认值(偏好记录保留,便于追溯操作时间)。

适用场景: 集成方在前端为用户提供「单独打开/关闭某个 MCP」开关时调用此接口持久化用户选择。

与模板的关系: 用户偏好优先级高于模板默认值。设置 enabled / disabled 会覆盖模板默认状态;设置 default 则回落到模板的 enabled 字段决定是否加载。

请求信息

  • 认证方式: JWT 令牌(Authorization Query 参数)

  • 请求方法: POST

  • Action: SetUserMcpPreference

请求参数

名称

类型

必填

描述

示例值

TemplateId

string

模板 ID,不传则使用租户默认模板

"template-abc123"

McpId

string

要操作的模板 MCP 标识

"amap_mcp"

Preference

string

偏好值,枚举:"enabled" / "disabled" / "default"

"disabled"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

IsEffective

boolean

写入后该 MCP 对此用户的实际启用状态

false

Source

string

当前状态来源:"user_override" / "template_default"

"user_override"

响应示例

{
  "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 令牌(Authorization Query 参数)

  • 请求方法: POST

  • Action: SetUserMcpCredential

请求参数

名称

类型

必填

描述

示例值

TemplateId

string

模板 ID,不传则使用租户默认模板

"template-abc123"

McpId

string

要绑定凭证的模板 MCP 标识

"amap_mcp"

Headers

map<string, string>

凭证头,如包含 Authorization 等

{"Authorization": "Bearer user_oauth_token"}

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

IsCredentialBound

boolean

写入后恒为 true

true

响应示例

{
  "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 令牌(Authorization Query 参数)

  • 请求方法: POST

  • Action: ClearUserMcpCredential

请求参数

名称

类型

必填

描述

示例值

TemplateId

string

模板 ID,不传则使用租户默认模板

"template-abc123"

McpId

string

要解绑凭证的模板 MCP 标识

"amap_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

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

IsCredentialBound

boolean

解绑后恒为 false

false

响应示例

{
  "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 令牌(Authorization Query 参数)

  • 请求方法: POST

  • Action: CreateUserMcp

请求参数

名称

类型

必填

描述

示例值

TemplateId

string

模板 ID,不传则使用租户默认模板

"template-abc123"

Name

string

MCP 名称,用于展示

"企业 OA"

Transport

string

传输协议,枚举:"streamable_http" / "sse"

"sse"

Url

string

MCP 服务端点 URL

"https://my-oa.internal/mcp/sse"

Headers

map<string, string>

请求头(含凭证)

{"Authorization": "Bearer my_token"}

Description

string

MCP 描述

"企业内部 OA 系统"

Timeout

number

连接超时(秒),默认 30

15

SseReadTimeout

number

SSE 读超时(秒),默认 300

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

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

McpId

string

系统生成的 MCP 标识

"usr_mcp_a1b2c3d4"

Name

string

名称

"企业 OA"

Transport

string

传输协议

"sse"

Url

string

服务端点 URL

"https://my-oa.internal/mcp/sse"

Headers

map<string, string> | null

请求头

{"Authorization": "Bearer my_oa_token"}

Description

string | null

描述

"企业内部 OA 系统"

Timeout

number

连接超时(秒)

15

SseReadTimeout

number

SSE 读超时(秒)

300

IsEnabled

boolean

启用状态

true

CreateTime

string

创建时间(ISO 8601)

"2026-05-27T10:00:00Z"

ModifyTime

string

最后修改时间(ISO 8601)

"2026-05-27T10:00:00Z"

响应示例

{
  "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 令牌(Authorization Query 参数)

  • 请求方法: POST

  • Action: UpdateUserMcp

请求参数

名称

类型

必填

描述

示例值

TemplateId

string

模板 ID,不传则使用租户默认模板

"template-abc123"

McpId

string

要更新的用户专属 MCP 标识

"usr_mcp_a1b2c3d4"

Name

string

名称(传则更新)

"企业 OA v2"

Transport

string

传输协议(传则更新)

"streamable_http"

Url

string

URL(传则更新)

"https://my-oa.internal/mcp/v2"

Headers

map<string, string>

请求头(传则全量替换,传空 map {} 则清空 headers)

{"Authorization": "Bearer new_token"}

Description

string

描述(传则更新)

"更新后的描述"

Timeout

number

连接超时(传则更新)

20

SseReadTimeout

number

SSE 读超时(传则更新)

600

IsEnabled

boolean

启用状态(传则更新)

false

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

McpId

string

MCP 标识

"usr_mcp_a1b2c3d4"

Name

string

名称

"企业 OA"

Transport

string

传输协议

"sse"

Url

string

服务端点 URL

"https://my-oa.internal/mcp/sse"

Headers

map<string, string> | null

请求头

{"Authorization": "Bearer new_refreshed_token"}

Description

string | null

描述

"企业内部 OA 系统"

Timeout

number

连接超时(秒)

20

SseReadTimeout

number

SSE 读超时(秒)

300

IsEnabled

boolean

启用状态

true

CreateTime

string

创建时间(ISO 8601)

"2026-05-27T10:00:00Z"

ModifyTime

string

最后修改时间(ISO 8601)

"2026-05-27T11:30:00Z"

响应示例

{
  "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 令牌(Authorization Query 参数)

  • 请求方法: POST

  • Action: DeleteUserMcp

请求参数

名称

类型

必填

描述

示例值

TemplateId

string

模板 ID,不传则使用租户默认模板

"template-abc123"

McpId

string

要删除的用户专属 MCP 标识

"usr_mcp_a1b2c3d4"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

响应示例

{
  "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 令牌(Authorization Query 参数)

  • 请求方法: POST

  • Action: GetUserMcp

请求参数

名称

类型

必填

描述

示例值

TemplateId

string

模板 ID,不传则使用租户默认模板

"template-abc123"

McpId

string

用户专属 MCP 标识

"usr_mcp_a1b2c3d4"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

McpId

string

MCP 标识

"usr_mcp_a1b2c3d4"

Name

string

名称

"企业 OA"

Transport

string

传输协议

"sse"

Url

string

服务端点 URL

"https://my-oa.internal/mcp/sse"

Headers

map<string, string> | null

请求头

{"Authorization": "Bearer my_oa_token"}

Description

string | null

描述

"企业内部 OA 系统"

Timeout

number

连接超时(秒)

15

SseReadTimeout

number

SSE 读超时(秒)

300

IsEnabled

boolean

启用状态

true

CreateTime

string

创建时间(ISO 8601)

"2026-05-27T10:00:00Z"

ModifyTime

string

最后修改时间(ISO 8601)

"2026-05-27T10:00:00Z"

响应示例

{
  "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 令牌(Authorization Query 参数)

  • 请求方法: POST

  • Action: ListUserMcps

请求参数

名称

类型

必填

描述

示例值

TemplateId

string

模板 ID,不传则使用租户默认模板

"template-abc123"

Source

string

来源过滤,枚举:"all" / "template" / "user_persistent",默认 "all"

"all"

MaxResults

integer

每页最大返回数量,取值范围 1100,默认 20

50

NextToken

string

翻页令牌,由上一次响应的 NextToken 字段获得;首次调用不传

"eyJwYWdlIjoyfQ=="

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

Mcps

array

MCP 列表(见下方 McpItem 结构)

见下方

NextToken

string

下一页令牌;为空表示已是最后一页

""

MaxResults

integer

实际使用的每页大小

50

Mcps 数组元素(McpItem):

名称

类型

条件

描述

示例值

McpId

string

所有

MCP 标识

"amap_mcp"

Name

string

所有

名称

"高德地图"

Description

string | null

所有

MCP 描述

"高德地图 MCP"

Transport

string

所有

传输协议

"streamable_http"

Url

string

所有

服务端点

"https://mcp.amap.com/sse"

Source

string

所有

来源:"template" / "user_persistent"

"template"

IsEffective

boolean

所有

该用户当前实际是否启用

true

Preference

string | null

Source=template

用户偏好:"enabled" / "disabled" / "default";无偏好记录时为 null

"default"

TemplateDefault

boolean | null

Source=template

模板 enabled 字段的值

true

IsCredentialBound

boolean | null

Source=template

用户是否绑定了专属凭证

true

Headers

map<string, string> | null

Source=user_persistent

用户专属 MCP 的请求头;模板级 MCP 不返回此字段

{"Authorization": "Bearer token"}

响应示例

{
  "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,用于在读取文件列表或下载文件前获取最新快照。

如果用户当前没有活跃沙箱,会返回成功且 SyncStatusno_active_session。此时 Context 中仍保留上次沙箱释放或同步后的快照,调用方可以继续使用 ListWorkspaceFiles 读取已有数据。

请求信息

  • 认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同

  • Action: SyncWorkspaceFiles

请求参数

名称

类型

必填

描述

示例值

ExternalUserId

string

外部系统用户唯一标识

"user-38764"

TemplateId

string

Agent 模板 ID;不传时使用用户绑定的默认模板

"template-abc123"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

Message

string

错误详情(失败时返回)

""

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

SyncStatus

string

同步状态:completed / no_active_session

"completed"

响应示例

同步完成:

{
  "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

参数错误

ExternalUserId 格式不正确

401

Unauthorized

未授权

AK/SK 无效

404

UserNotFound

User not found

ExternalUserId 尚未发起过会话,或已被删除。新用户请先调用一次 Chat

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

外部系统用户唯一标识

"user-38764"

Path

string

要列举的目录路径,相对工作空间根目录;不传或传 / 表示根目录

"active_skills"

MaxResults

integer

每页最大返回数量,取值范围 1100;默认 50

100

NextToken

string

上一页响应返回的翻页令牌;为空表示第一页

"cDoy"

TemplateId

string

Agent 模板 ID;不传时使用用户绑定的默认模板

"template-abc123"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

Message

string

错误详情(失败时返回)

null

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

Path

string

本次列举的目录路径

"/active_skills"

MaxResults

integer

本次请求的分页大小

100

NextToken

string

下一页令牌;没有更多数据时为 null

null

Files

array

文件或目录列表

见下方

Files 数组元素:

名称

类型

描述

示例值

FileName

string

文件或目录名称

"my-custom-skill"

FilePath

string

相对工作空间根目录的路径

"active_skills/my-custom-skill"

FileType

string

条目类型:file / directory

"directory"

Size

integer

文件大小,目录通常为 0

0

ModifiedAt

string

最近修改时间,ISO 8601 格式;无值时为 null

"2026-05-13T08:00:00Z"

响应示例

{
  "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

ExternalUserId 尚未发起过会话,或已被删除。新用户请先调用一次 Chat

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

外部系统用户唯一标识

"user-38764"

FilePath

string

文件路径,相对工作空间根目录

"active_skills/my-custom-skill/SKILL.md"

TemplateId

string

Agent 模板 ID;不传时使用用户绑定的默认模板

"template-abc123"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

Message

string

错误详情(失败时返回)

""

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

DownloadUrl

string

临时下载地址

"https://oss.example.com/presigned/..."

ExpiresInSeconds

integer

下载地址有效期,单位秒

3600

FileName

string

文件名

"SKILL.md"

FileSize

integer

文件大小,单位字节;无法获取时为 0

512

响应示例

{
  "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

未提供 FilePath

400

InvalidParameter

FilePath cannot point to directory

FilePath 指向目录

400

InvalidParameter

Path must not contain '..'

路径包含非法上级目录引用

401

Unauthorized

未授权

AK/SK 无效

404

UserNotFound

User not found

ExternalUserId 尚未发起过会话,或已被删除。新用户请先调用一次 Chat

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 下载、或在 ChatInput 中通过 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

外部系统用户唯一标识

"user-38764"

FilePath

string

工作空间内的相对文件路径,不能以 / 结尾,不能包含 ..

"documents/report.pdf"

TemplateId

string

Agent 模板 ID;不传时使用用户绑定的默认模板

"template-abc123"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

Message

string

错误详情(失败时返回)

""

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

UploadUrl

string

预签名上传 URL,对其发 HTTP PUT 即可上传文件内容

"https://oss.example.com/presigned-put/..."

ExpiresInSeconds

integer

上传地址有效期,单位秒

3600

FilePath

string

规范化后的相对文件路径

"documents/report.pdf"

MaxFileSize

integer

允许的最大文件大小,单位字节;当前为 50 MB

52428800

UploadHeadersHint

object

执行 PUT 时建议透传的 header;当前需带 Content-Type: "" 否则 OSS 返回 403

{"Content-Type": ""}

响应示例

成功:

{
  "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

未提供 FilePath 或为空字符串

400

InvalidParameter

FilePath cannot point to directory

FilePath/ 结尾,指向目录

400

InvalidParameter

Path must not contain '..'

路径包含非法上级目录引用

401

Unauthorized

未授权

AK/SK 无效

404

UserNotFound

User not found

ExternalUserId 尚未发起过会话,或已被删除。新用户请先调用一次 Chat

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

外部系统用户唯一标识

"user-38764"

FilePath

string

工作空间内的相对文件路径,不能以 / 结尾,不能包含 ..

"documents/report.pdf"

TemplateId

string

Agent 模板 ID;不传时使用用户绑定的默认模板

"template-abc123"

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

Message

string

错误详情(失败时返回)

""

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

响应示例

成功(文件存在并被删除):

{
  "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

未提供 FilePath 或为空字符串

400

InvalidParameter

FilePath cannot point to directory

FilePath/ 结尾,指向目录

400

InvalidParameter

Path must not contain '..'

路径包含非法上级目录引用

401

Unauthorized

未授权

AK/SK 无效

404

UserNotFound

User not found

ExternalUserId 尚未发起过会话,或已被删除

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

外部系统用户唯一标识

"user-38764"

TemplateId

string

Agent 模板 ID;不传时清理该用户的全部工作空间

"template-abc123"

请求示例

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

是否成功

true

Code

string

业务状态码

"ok"

Message

string

错误详情(失败时返回)

null

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

ExternalUserId

string

外部系统用户唯一标识

"user-38764"

ClearedCount

integer

清理成功的工作空间数量

1

FailedCount

integer

清理失败的工作空间数量

0

Workspaces

array

每个工作空间的清理结果

见下方

Workspaces 数组元素:

名称

类型

描述

示例值

TemplateId

string

Agent 模板 ID

"template-abc123"

Status

string

清理状态:cleared / failed

"cleared"

Error

string

失败原因;成功时为空

null

状态说明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

未提供 ExternalUserId

401

Unauthorized

未授权

AK/SK 无效

404

UserNotFound

User not found

用户不存在,或用户已删除

500

TenantConfigError

Tenant config is invalid

租户配置缺失或无效

500

InternalError

服务内部错误

服务端异常,请稍后重试


会话管理接口

ListSessions - 列举对话列表

接口描述

列举用户的会话列表。返回的每个元素包含 SessionId,可用于后续的会话历史查询、中止、删除等操作。

请求信息

  • 请求方法: GET(也接受 POST

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TemplateId

string

按 Agent 模板 ID 筛选

"template-abc123"

ExternalUserId

string

外部系统用户唯一标识

"user-38764"

Channel

string

按渠道筛选

"console" / "dingtalk" / "feishu"

请求头(Header)

名称

类型

必填

描述

示例值

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

ListSessions

x-acs-date

string

请求时间(ISO 8601 格式)

2026-03-25T06:00:00Z

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

Message

string

错误详情(失败时返回)

null

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

Chats

array

会话基本信息列表

见下方

AccessDeniedDetail

string

鉴权失败详情

null

Chats 数组元素:

名称

类型

描述

示例值

Id

string

会话 ID

"4bd0****02f"

Name

string

会话标题

"你好"

SessionId

string

会话标识,用于删除/停止等操作

"curl-test-session-****"

UserId

string

用户 ID

"u-open-****"

Channel

string

渠道名称

"console"

CreatedAt

string

会话创建时间(ISO 8601)

"2026-03-26T03:51:42.071603Z"

UpdatedAt

string

会话最后更新时间(ISO 8601)

"2026-03-26T03:52:03.000000Z"

Meta

map

扩展元数据

{}

Status

string

会话任务状态

"running" / "idle"

响应示例

成功:

{
  "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

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TemplateId

string

Agent 模板 ID

"template-abc123"

SessionId

string

要获取历史的会话 ID

"curl-test-session-****"

ExternalUserId

string

外部系统用户唯一标识

"user-38764"

请求头(Header)

名称

类型

必填

描述

示例值

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

ListSessionHistory

x-acs-date

string

请求时间(ISO 8601 格式)

2026-03-25T06:00:00Z

请求示例

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

是否成功

true

Code

string

业务状态码

"200"

Message

string

错误详情(失败时返回)

null

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

Messages

array

会话消息列表

见下方

Status

string

当前会话任务状态

"running" / "idle"

AccessDeniedDetail

string

鉴权失败详情

null

Messages 数组元素:

名称

类型

描述

示例值

Id

string

消息唯一标识

"msg_5e8d****aa1d"

Role

string

消息角色

"user" / "assistant"

Type

string

消息类型

"message"

Object

string

对象类型

"message"

Status

string

消息状态

"completed"

Error

string

错误信息(如有)

null

SequenceNumber

string

序号

null

Content

array

内容块列表

见下方

Metadata

map

扩展元数据

{"OriginalId":"msg_20e8****8ff3","timestamp":"2026-04-29 10:05:57.669"}

Metadata 字段:

名称

类型

描述

示例值

original_id

string

原始消息 ID

"msg_20e8****8ff3"

original_name

string

原始消息发送方名称

"user"

timestamp

string

消息创建时间,格式为 YYYY-MM-DD HH:mm:ss.SSS

"2026-04-29 10:05:57.669"

Content 数组元素:

名称

类型

描述

示例值

Object

string

对象类型

"content"

Status

string

状态

"completed"

Error

string

错误信息

null

MsgId

string

所属消息 ID

"msg_5e8d****aa1d"

Text

string

文本内容

"你好"

Data

string

结构化数据(工具调用等)

null

SequenceNumber

string

序号

null

响应示例

成功:

{
  "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

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TemplateId

string

Agent 模板 ID

"template-abc123"

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

StopSession

x-acs-date

string

请求时间(ISO 8601 格式)

2026-03-25T06:00:00Z

请求参数

名称

类型

必填

描述

示例值

SessionId

string

要中止的会话 ID

"test-session-001"

请求体示例

{
  "SessionId": "test-session-001"
}

响应参数

名称

类型

描述

示例值

Success

boolean

是否成功

true

Code

string

业务状态码

"200"

Message

string

错误详情(失败时返回)

null

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

AccessDeniedDetail

string

鉴权失败详情

null

Stopped

boolean

是否成功中止了正在运行的任务。true 表示找到并取消了任务,false 表示该会话当前没有正在运行的任务

true

响应示例

成功(任务已中止):

{
  "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 删除对话记录,包括对话元数据和会话状态文件。删除后该会话的历史消息将被清空,无法恢复。

请求信息

  • 请求方法: POST

  • Content-Type: application/json

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TemplateId

string

Agent 模板 ID

"template-abc123"

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

DeleteSession

x-acs-date

string

请求时间(ISO 8601 格式)

2026-03-25T06:00:00Z

请求参数

名称

类型

必填

描述

示例值

SessionId

string

要删除的会话 ID

"test-session-001"

请求体示例

{
  "SessionId": "test-session-001"
}

响应参数

名称

类型

描述

示例值

Success

boolean

是否成功

true

Code

string

业务状态码

"200"

Message

string

错误详情(失败时返回)

null

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

AccessDeniedDetail

string

鉴权失败详情

null

Deleted

boolean

是否成功删除

true

响应示例

成功:

{
  "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

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TemplateId

string

Agent 模板 ID

"template-abc123"

请求头(Header)

名称

类型

必填

描述

示例值

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

GetSandboxInfo

x-acs-date

string

请求时间(ISO 8601 格式)

2026-03-26T06:00:00Z

请求参数

无额外请求参数。用户身份由 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

是否成功

true

Code

string

业务状态码

"200"

Message

string

错误详情(失败时返回)

null

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

ResourceUrl

string

沙箱流化画面访问 URL

"https://..."

SandboxSessionId

string

沙箱会话 ID

"session-abc123"

SessionActive

string

沙箱会话是否激活

"true"

响应示例

成功(沙箱已激活):

{
  "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 执行时被访问和使用。

幂等性: 重复设置相同键名会更新其值和描述,不会产生重复记录。

请求信息

  • 请求方法: POST

  • Content-Type: application/json

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TemplateId

string

指定 Agent 模板 ID,不传则使用默认模板

template-abc123

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

SetAgentEnvVarForUser

x-acs-date

string

请求时间(ISO 8601 格式)

2026-05-13T06:00:00Z

请求参数

名称

类型

必填

描述

示例值

Variables

array

环境变量列表,见下方 Variables 结构

见下方

Variables 数组元素:

名称

类型

必填

描述

示例值

Key

string

环境变量键名

"GITHUB_TOKEN"

Value

string

环境变量值

"ghp-abc123***"

Description

string

环境变量描述

"GitHub Token"

请求体示例

{
  "Variables": [
    {
      "Key": "GITHUB_TOKEN",
      "Value": "ghp-abc123***",
      "Description": "GitHub Token"
    },
    {
      "Key": "SERVICE_URL",
      "Value": "https://api.example.com",
      "Description": "服务地址"
    }
  ]
}

响应参数

名称

类型

描述

示例值

Success

boolean

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"35A90F2B-3A2B-51A8-B5B1-19E9CF263C43"

ProcessedKey

array

已处理的环境变量键名列表

["GITHUB_TOKEN", "SERVICE_URL"]

响应示例

成功:

{
  "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),仅包含键名、描述和更新时间。

请求信息

  • 请求方法: POST

  • Content-Type: application/json

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TemplateId

string

指定 Agent 模板 ID,不传则使用默认模板

template-abc123

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

GetAgentEnvVarForUser

x-acs-date

string

请求时间(ISO 8601 格式)

2026-05-13T06:00:00Z

请求参数

名称

类型

必填

描述

示例值

Keys

array

要查询的环境变量键名列表,不传则返回所有环境变量

["GITHUB_TOKEN", "SERVICE_URL"]

MaxResults

integer

每页最大返回数量,默认 20,最大 100

20

NextToken

string

分页标记,用于获取下一页结果

"token-abc123"

请求体示例

查询指定键名:

{
  "Keys": ["GITHUB_TOKEN", "SERVICE_URL"]
}

分页查询所有:

{
  "MaxResults": 20,
  "NextToken": ""
}

响应参数

名称

类型

描述

示例值

Success

boolean

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"44091BCF-1A5B-5C41-B908-090996B8DFBE"

Variables

array

环境变量列表

见下方

Variables 数组元素:

名称

类型

描述

示例值

Key

string

环境变量键名

"GITHUB_TOKEN"

Description

string

环境变量描述

"GitHub Token"

UpdatedAt

string

最后更新时间(ISO 8601)

"2026-05-13T15:43:56.358003+08:00"

响应示例

成功:

{
  "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 环境变量。支持批量删除多个环境变量,删除后的变量将不再可用。

删除行为: 删除不存在的键名不会报错,操作仍返回成功。

请求信息

  • 请求方法: POST

  • Content-Type: application/json

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TemplateId

string

指定 Agent 模板 ID,不传则使用默认模板

template-abc123

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

DeleteAgentEnvVarForUser

x-acs-date

string

请求时间(ISO 8601 格式)

2026-05-13T06:00:00Z

请求参数

名称

类型

必填

描述

示例值

VariableKeys

array

要删除的环境变量键名列表

["GITHUB_TOKEN", "SERVICE_URL"]

请求体示例

{
  "VariableKeys": ["GITHUB_TOKEN", "SERVICE_URL"]
}

响应参数

名称

类型

描述

示例值

Success

boolean

是否成功

true

Code

string

业务状态码

"200"

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"90133DCF-4EDF-1A8F-A7A3-06E2A3F8971D"

DeletedKeys

array

已处理的环境变量键名列表(包括不存在的键名)

["GITHUB_TOKEN", "SERVICE_URL"]

响应示例

成功:

{
  "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

是否成功

true

Code

string

业务状态码

"ok"

Message

string

错误详情(失败时返回)

null

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

AccessDeniedDetail

string

鉴权失败详情

null

MonthlyCredit

float

当月已消耗积分(Credit)

125.50

MonthlySessions

integer

当月会话总数

42

AvgCreditPerSession

float

单会话平均消耗

2.99

CycleStart

string

账单周期起始日(ISO 8601)

"2026-04-01T00:00:00Z"

CycleEnd

string

账单周期结束日(ISO 8601)

"2026-04-30T23:59:59Z"

响应示例

成功:

{
  "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 过滤,多个用逗号分隔

"alice,bob"

PageSize

integer

每页数量,默认 20,最大 100

20

PageNumber

integer

页码,从 1 开始,默认 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

是否成功

true

Code

string

业务状态码

"ok"

Message

string

错误详情(失败时返回)

null

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

AccessDeniedDetail

string

鉴权失败详情

null

Users

array

用户消耗明细列表

见下方

TotalCount

integer

总用户数

15

PageSize

integer

每页数量

20

PageNumber

integer

当前页码

1

Users 数组元素:

名称

类型

描述

示例值

UserId

string

用户内部标识

"u-open-abc123"

ExternalUserId

string

外部用户标识(无则回退为 UserId)

"alice"

InstanceId

string

实例 ID(用于售卖侧对账)

"jvscrew-u-open-abc123"

MonthlyCredit

float

当月消耗积分

28.50

MonthlySessions

integer

当月会话数

12

MonthlyDurationHours

float

当月使用时长(小时)

3.25

MonthlyDurationMinutes

float

当月使用时长(分钟)

195.00

响应示例

成功:

{
  "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 个)

"session-abc,session-def"

TemplateId

string

Agent 模板 ID,仅返回属于该 Agent 的会话结果

"template-xyz"

请求示例

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

是否成功

true

Code

string

业务状态码

"ok"

Message

string

错误详情(失败时返回)

null

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

Sessions

array

会话消耗明细列表

见下方

Sessions 数组元素:

名称

类型

描述

示例值

SessionId

string

会话 ID

"session-abc"

TemplateId

string

所属 Agent 模板 ID(未匹配到则为 null)

"template-xyz"

UserId

string

平台内部用户 ID

"u-open-abc123"

ExternalUserId

string

外部用户 ID

"alice"

TotalCredit

float

该会话 Credit 总消耗

32.57

TotalDurationMs

integer

该会话总交互耗时(毫秒)

1173236

RecordCount

integer

交互记录数(交互轮次)

2

StartedAt

string

会话首次交互时间(ISO 8601)

"2026-04-23T13:50:48+08:00"

EndedAt

string

会话最后交互时间(ISO 8601)

"2026-04-23T14:18:40+08:00"

Records

array

每次交互的明细记录

见下方

Records 数组元素:

名称

类型

描述

示例值

TraceId

string

交互追踪 ID(唯一标识一次请求-响应)

"2766f06d****"

CreditAmount

float

本次交互消耗的 Credit 量

28.48

DurationMs

integer

本次交互耗时(毫秒)

1111096

CreatedAt

string

消耗产生时间(ISO 8601)

"2026-04-23T13:50:48+08:00"

行为说明

响应示例

成功(含真实数据和不存在的会话):

{
  "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(客户业务系统中的用户标识)

"alice"

TemplateId

string

Agent 模板 ID,仅返回该 Agent 产生的 Credit 消耗记录

"template-xyz"

FromDate

string

起始时间(含),支持 YYYY-MM-DDYYYY-MM-DDTHH:mm 两种格式

"2026-04-01""2026-04-23T13:00"

ToDate

string

结束时间(含),支持 YYYY-MM-DDYYYY-MM-DDTHH:mm 两种格式

"2026-04-24""2026-04-23T14:00"

PageSize

integer

每页数量,默认 20,最大 100

20

PageNumber

integer

页码,从 1 开始,默认 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

是否成功

true

Code

string

业务状态码

"ok"

Message

string

错误详情(失败时返回)

null

HttpStatusCode

integer

HTTP 状态码

200

RequestId

string

请求唯一标识

"EA12****-****-****-****-****E5C"

UserId

string

匹配到的内部用户 ID(无记录时为空字符串)

"u-open-abc123"

ExternalUserId

string

匹配到的外部用户 ID

"alice"

FromDate

string

查询起始时间(回显请求参数)

"2026-04-01"

ToDate

string

查询结束时间(回显请求参数)

"2026-04-24"

TotalCredit

float

该时间范围内的 Credit 总消耗

113.01

TotalCount

integer

符合条件的总记录数(用于分页计算)

38

TotalSessionCount

integer

涉及的不同会话数量

28

TotalDurationMs

integer

总交互耗时(毫秒)

17988410

PageSize

integer

每页数量

20

PageNumber

integer

当前页码

1

Records

array

Credit 消耗明细记录列表,按时间倒序

见下方

Records 数组元素:

名称

类型

描述

示例值

TraceId

string

交互追踪 ID

"2766f06d****"

SessionId

string

所属会话 ID

"my-session-123654"

TemplateId

string

所属 Agent 模板 ID

"template-zc9ecvdf"

CreditAmount

float

本次交互的 Credit 消耗量

28.48

DurationMs

integer

交互耗时(毫秒)

1111096

CreatedAt

string

消耗产生时间(ISO 8601)

"2026-04-23T13:50:48+08:00"

响应示例

成功:

{
  "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 令牌(Authorization Query 参数)

  • Action: CreateScheduledTask

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

CreateScheduledTask

x-acs-date

string

请求时间(ISO 8601 格式)

2026-04-22T06:00:00Z

请求参数

名称

类型

必填

描述

示例值

ExternalUserId

string

外部用户 ID(已通过 JWT 携带,可省略)

"user-38764"

Name

string

任务名称

"每日技术简报"

Instruction

string

任务指令,Agent 将按此执行

"帮我总结技术新闻"

TemplateId

string

模板 ID

"template-abc123"

Schedule

object

调度规则,见 Schedule 对象

Sinks

array

推送渠道,见 Sinks 对象

Stateful

boolean

是否在每次执行间将历史会话灌入 LLM prompt。默认 false:LLM 每次从空白上下文开始,不加载历史会话;执行记忆仍会累积保留(用户可在 Chat 中通过沙箱回查任务历史),且单次 input_tokens 不随执行次数增长。仅在任务确实依赖跨次会话记忆(例如「Excel表格去重通知」需对比上次执行结果)时显式设为 true。详见 Stateful 字段使用指南

false

请求示例

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

任务唯一标识

"bd0f7607-538c-47b4-9b1e-380e12947640"

TemplateId

string

模板 ID

"template-zc9ecvdf"

ExternalUserId

string

外部用户 ID

"verify-schedule-user"

Name

string

任务名称

"每日技术简报"

Status

string

任务状态:active(启用) / paused(暂停) / running(执行中) / failed(失败)

"active"

Instruction

string

任务指令

"帮我总结今天的技术新闻"

Schedule

object

调度配置

{"Type":"cron","Expr":"0 9 * * *","Timezone":"Asia/Shanghai"}

Sinks

array

推送渠道配置

[]

Stateful

boolean

是否在执行间将历史会话灌入 LLM prompt(true = 加载历史并覆盖更新,false = 不加载但仍累积保留);详见 Stateful 字段使用指南false 时按 POP 网关零值过滤规则在响应中不出现。

true

NextRunAt

string

下次执行时间(ISO 8601)

"2026-04-22T09:00:00+08:00"

LastRunAt

string

上次执行时间(新创建时为 null)

null

LastError

string

最近错误信息(新创建时为 null)

null

CreatedAt

string

创建时间(ISO 8601)

"2026-04-21T23:32:53+08:00"

UpdatedAt

string

更新时间(ISO 8601)

"2026-04-21T23:32:53+08:00"

SessionId

string

创建任务时所在 IM 会话的 session_id快照;通过 api/console 等非 IM 渠道创建时为 null

"sess-im-7f3a"

CreateChannel

string

创建任务时所在渠道快照:dingtalk / feishu / wecom / qq / api / console / schedule;由服务端在创建时自动捕获,调用方传值会被忽略

"dingtalk"

POP 网关字段过滤说明:POP 网关会自动过滤值为 null 或零值(数字 0、空字符串 ""、空数组 []、空对象 {})的字段。本文档定时任务相关接口的响应示例均默认遵循此规则,例如新建任务响应中 LastRunAt / LastErrornull 不会出现;分页响应中 TotalCount0 时也可能不出现。后续接口说明中的“被 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 渠道)创建的场景,SessionIdnull 被网关过滤不出现,CreateChannel"api"。其他创建场景的 CreateChannel 取值:

UpdateScheduledTask - 更新定时任务

接口描述

更新已有定时任务的配置。

请求信息

  • 认证方式: JWT 令牌(Authorization Query 参数),与 CreateScheduledTask 相同

  • Action: UpdateScheduledTask

参数位置TaskId / ExternalUserId 通过 URL Query 传递;Name / Instruction / TemplateId / Schedule / Sinks / Stateful 通过 JSON Body 传递。

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TaskId

string

要更新的任务 ID

bd0f7607-538c-47b4-9b1e-380e12947640

ExternalUserId

string

外部用户 ID(已通过 JWT 携带,可省略)

user-38764

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

UpdateScheduledTask

x-acs-date

string

请求时间(ISO 8601 格式)

2026-04-22T06:00:00Z

Body 参数

名称

类型

必填

描述

示例值

Name

string

新的任务名称

"每日技术简报-修订"

Instruction

string

新的任务指令

"帮我总结今天的技术新闻并推送到钉钉"

TemplateId

string

模板 ID

"template-abc123"

Schedule

object

新的调度规则

{"Type":"cron","Expr":"0 9 * * *","Timezone":"Asia/Shanghai"}

Sinks

array

新的推送渠道配置;不传则保留原值,传 [] 表示清空。

[{"Sink":"im_push","Channel":"dingtalk","ChannelInstanceId":"di-xxx","TargetUserId":"<user>","TargetSessionId":"","Meta":{}}]

Stateful

boolean

是否在执行间将历史会话灌入 LLM prompt;不传则保留原值,显式传 true / false 才会覆盖。语义详见 Stateful 字段使用指南

true

请求示例

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 晚于 CreatedAtLastErrornull 被 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 令牌(Authorization Query 参数),与 CreateScheduledTask 相同

  • Action: GetScheduledTask

Query 参数和请求头与 CreateScheduledTask 相同,x-acs-action 改为 GetScheduledTask

请求参数

名称

类型

必填

描述

示例值

ExternalUserId

string

外部用户 ID(已通过 JWT 携带,可省略)

"user-38764"

TaskId

string

任务 ID

"bd0f7607-538c-47b4-9b1e-380e12947640"

TemplateId

string

模板 ID

"template-abc123"

请求示例

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 / LastErrornull,会被 POP 网关过滤不出现(与 CreateScheduledTask 示例一致)。

错误码

HttpCode

Error Code

错误信息

说明

400

InvalidParameter

参数错误

TaskId 缺失或格式不正确

401

Unauthorized

未授权

Bearer Token 无效或已过期

404

NotFound

资源不存在

TaskId 未找到或不属于当前用户

500

InternalError

服务内部错误

服务端异常,请稍后重试


ListScheduledTasks - 分页列举任务

接口描述

分页查询用户下的所有定时任务。

请求信息

  • 认证方式: JWT 令牌(Authorization Query 参数),与 CreateScheduledTask 相同

  • Action: ListScheduledTasks

参数位置:本接口所有业务参数(PageNumber / PageSize / TemplateId / ExternalUserId)通过 URL Query 传递,请求 Body 为空。

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

PageNumber

integer

页码,默认 1

2

PageSize

integer

每页条数,默认 20,最大 100

20

TemplateId

string

按模板过滤

"template-abc123"

ExternalUserId

string

外部用户 ID(已通过 JWT 携带,可省略)

"user-38764"

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

ListScheduledTasks

x-acs-date

string

请求时间(ISO 8601 格式)

2026-04-22T06:00:00Z

请求 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 令牌(Authorization Query 参数),与 CreateScheduledTask 相同

  • Action: DeleteScheduledTask

参数位置:本接口所有业务参数(TaskId / ExternalUserId)通过 URL Query 传递,请求 Body 为空。

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TaskId

string

要删除的任务 ID

bd0f7607-538c-47b4-9b1e-380e12947640

ExternalUserId

string

外部用户 ID(已通过 JWT 携带,可省略)

user-38764

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

DeleteScheduledTask

x-acs-date

string

请求时间(ISO 8601 格式)

2026-04-22T06:00:00Z

请求 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 令牌(Authorization Query 参数),与 CreateScheduledTask 相同

  • Action: PauseScheduledTask

参数位置:本接口所有业务参数(TaskId / ExternalUserId)通过 URL Query 传递,请求 Body 为空。

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TaskId

string

要暂停的任务 ID

bd0f7607-538c-47b4-9b1e-380e12947640

ExternalUserId

string

外部用户 ID(已通过 JWT 携带,可省略)

user-38764

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

PauseScheduledTask

x-acs-date

string

请求时间(ISO 8601 格式)

2026-04-22T06:00:00Z

请求 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

任务状态(暂停后为 paused

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 令牌(Authorization Query 参数),与 CreateScheduledTask 相同

  • Action: ResumeScheduledTask

参数位置:本接口所有业务参数(TaskId / ExternalUserId)通过 URL Query 传递,请求 Body 为空。

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TaskId

string

要恢复的任务 ID

bd0f7607-538c-47b4-9b1e-380e12947640

ExternalUserId

string

外部用户 ID(已通过 JWT 携带,可省略)

user-38764

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

ResumeScheduledTask

x-acs-date

string

请求时间(ISO 8601 格式)

2026-04-22T06:00:00Z

请求 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

任务状态(恢复后为 active

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 缺失;或尝试恢复已执行完成的 once 类型任务

401

Unauthorized

未授权

Bearer Token 无效或已过期

404

NotFound

资源不存在

TaskId 未找到或不属于当前用户

500

InternalError

服务内部错误

服务端异常,请稍后重试


ListScheduledTaskRuns - 查询执行记录

接口描述

查询定时任务的执行记录列表,支持游标分页。

请求信息

  • 认证方式: JWT 令牌(Authorization Query 参数),与 CreateScheduledTask 相同

  • Action: ListScheduledTaskRuns

参数位置:本接口所有业务参数(TaskId / TemplateId / Since / Until / Order / Status / Cursor / PageSize / ExternalUserId)通过 URL Query 传递,请求 Body 为空。

Query 参数

名称

类型

必填

描述

示例值

Authorization

string

Bearer + 由 GetAccessToken 返回的 JWT;整段 URL 编码后放入 Query

Bearer%20eyJhb****...****k

TaskId

string

按任务 ID 过滤

bd0f7607-538c-47b4-9b1e-380e12947640

TemplateId

string

按模板 ID 过滤

template-abc123

Since

integer

时间下界(Unix 毫秒),左开区间 FinishedAt > Since

1714032000000

Until

integer

时间上界(Unix 毫秒),右闭区间 FinishedAt <= Until

1714118400000

Order

string

排序方向,大小写不敏感:asc(正序,默认) / desc(逆序,最新优先),亦可传 ASC/DESC

desc

Status

string

按终止状态过滤,仅接受 succeeded / failed

failed

Cursor

string

分页游标,来自上一次响应的 NextCursor

eyJpZCI6MTIzfQ==

PageSize

integer

每页条数,默认 50,范围 1-200

50

ExternalUserId

string

外部用户 ID(已通过 JWT 携带,可省略)

user-38764

请求头(Header)

名称

类型

必填

描述

示例值

Content-Type

string

请求内容类型

application/json

x-acs-version

string

API 版本

2026-03-11

x-acs-action

string

API 操作名称

ListScheduledTaskRuns

x-acs-date

string

请求时间(ISO 8601 格式)

2026-04-22T06:00:00Z

请求 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

执行状态:running / succeeded / failed仅反映任务主流程(LLM 执行)成败,不包含推送结果;推送结果请独立读取 PushStatus

ResultPayload

string

LLM 产出的文本结果。Status=failed 时必为空字符串或 null;Status=succeeded 时大多数情况下有值,但若 LLM 未产出 assistant 文本(如仅思考、仅工具调用)也可能为空,需按实际字段值判断

ErrorMessage

string

错误信息。Status=failed 时必有值;Status=succeeded 时必为 null,会被 POP 网关过滤不出现

PushSink

string

推送渠道类型

PushStatus

string

推送状态:pending / succeeded / failed / skipped。与 Status 相互独立;Status=succeededPushStatus=failed 可以并存(主流程成功但推送失败)

StartedAt

string

开始时间

FinishedAt

string

结束时间

CreatedAt

string

记录创建时间

⚠️ 字段读取约定:调用方应独立读取 ResultPayloadErrorMessagePushStatus,不要用 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

(网关拦截)

请求被拒绝

Since / PageSize 被作为字符串传入时,POP 网关会直接返回 503,不到达后端

500

InternalError

服务内部错误

服务端异常,请稍后重试


ListAllUserScheduledTasks - 查询用户定时任务列表

接口描述

管理员接口,以租户视角查询指定用户名下的定时任务列表。必须指定 ExternalUserId,限定在单个用户范围内操作。

  • Action: ListAllUserScheduledTasks

  • 认证方式: AK/SK 签名

  • HTTP 方法: GET

请求参数

参数名

类型

必填

说明

ExternalUserId

String

用户标识;不传时查询整个租户下所有任务

TemplateId

String

按模板 ID 过滤

Status

String

按状态过滤,可选值:activepausedfinishedrunning

SortBy

String

排序字段,大小写不敏感,可选值:CreatedAt(默认)、NextRunAt

Order

String

排序方向,大小写不敏感,可选值:ascdesc(默认)

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

行为

BY_TASK_IDS(默认)

必填非空(1~50 条)

可选(提供时进一步限定到该用户)

按 ID 精确删,幂等

USER_ALL

必须为空

必填

删该用户名下全部活跃任务

TENANT_ALL

必须为空

必须不传

删整租户下全部活跃任务

任何字段约束不满足均返回 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

BY_TASK_IDS 可选;USER_ALL 必填;TENANT_ALL 禁止

Scope

String(Query)

枚举 BY_TASK_IDS / USER_ALL / TENANT_ALL,默认 BY_TASK_IDS

TaskIds

String(Query, JSON 序列化数组)

视 Scope

BY_TASK_IDS 必填非空,1~50 条(以传入的原始数组长度计算,去重前;超出返回 400 InvalidTaskIds);其他 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

BY_TASK_IDS:目标态满足数(本次新删 + 已删除的幂等命中);USER_ALL / TENANT_ALL:本次实际改写的行数

FailedItems

Array of Object

BY_TASK_IDS 可能非空,列出范围内不存在的任务;其他 Scope 始终为空数组

FailedItems[].TaskId

String

失败的任务 ID

FailedItems[].Code

String

错误码,固定为 NotFound

FailedItems[].Message

String

错误原因,固定为 task not found

响应示例

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 与 TaskIds / ExternalUserId 组合不满足约束等

400

InvalidScope

Scope 值不在枚举范围(BY_TASK_IDS / USER_ALL / TENANT_ALL)

400

InvalidTaskIds

TaskIds 数组超过 50 条

403

Forbidden

租户权限不匹配

500

InternalError

服务内部错误


ListAllUserScheduledTaskRuns - 查询全部用户执行记录

接口描述

以租户视角查询整租户下所有用户的定时任务执行记录,用于运营/监控/审计场景;与 ListScheduledTaskRuns 的差异:

  • 鉴权使用 AK/SK(租户态);ExternalUserId 可由调用方按需作为过滤条件传入。

  • 首次调用必须显式给出 Since / Until 时间窗口,避免无下界全表扫描。

  • 仅返回已终止的执行记录(Statussucceededfailed),运行中的记录不在本接口语义内。

  • 默认按 FinishedAt 倒序返回(最新优先),便于运维排查。

请求信息

  • 认证方式: POP V1 签名(AK/SK)

  • Action: ListAllUserScheduledTaskRuns

请求参数

名称

类型

必填

描述

示例值

Since

integer

时间下界(Unix 毫秒),左开区间 FinishedAt > Since

1714032000000

Until

integer

时间上界(Unix 毫秒),右闭区间 FinishedAt <= Until

1714118400000

ExternalUserId

string

按外部用户过滤;缺省返回整租户所有用户

"alice"

TemplateId

string

按 Agent 模板 ID 过滤

"template-zc9ecvdf"

TaskId

string

按任务 ID 过滤

"bd0f7607-538c-47b4-9b1e-380e12947640"

Status

string

按终止状态过滤,仅接受 succeeded / failed;不支持 running

"failed"

Order

string

排序方向,大小写不敏感:asc / desc,默认 desc(最新优先)

"desc"

Cursor

string

上一次响应返回的 NextCursor,用于翻页;同一分页循环内 Order 不能改变

"eyJmaW5pc2hlZF9hdF91cyI6..."

PageSize

integer

每页条数,默认 50,范围 1-200

50

时间窗口说明
增量轮询用法首次调用:传 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

执行记录列表,按 FinishedAt + RunId 排序

NextCursor

string

下一页游标;为 null 表示当前窗口已拉完

Runs 数组元素

名称

类型

描述

RunId

string

执行记录唯一标识

TaskId

string

所属任务 ID

TemplateId

string

模板 ID

ExternalUserId

string

外部渠道投递的用户身份(如 IM、POP 调用方),租户视角下的稳定 ID

Status

string

执行状态:succeeded / failed(本接口不返回 running)。仅反映任务主流程(LLM 执行)成败,不包含推送结果;推送结果请独立读取 PushStatus

ResultPayload

string

LLM 产出的文本结果。Status=failed 时必为空字符串或 null;Status=succeeded 时大多数情况下有值,但若 LLM 未产出 assistant 文本(如仅思考、仅工具调用)也可能为空,需按实际字段值判断

ErrorMessage

string

错误信息。Status=failed 时必有值;Status=succeeded 时必为 null,会被 POP 网关过滤不出现

PushSink

string

推送渠道类型,如 im_push

PushStatus

string

推送状态:pending / succeeded / failed / skipped。与 Status 相互独立;Status=succeededPushStatus=failed 可以并存(主流程成功但推送失败)

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

未提供 Since

400

InvalidUntil

Until is required

未提供 Until

400

InvalidSinceUntilRange

since must be less than until (left-open right-closed (since, until])

Since >= Until,区间为空集

400

InvalidOrder

order must be one of: asc, desc

Order 取值非法

400

InvalidStatus

status must be one of: succeeded, failed

Status 取值非法(不接受 running

400

InvalidPageSize

PageSize must be between 1 and 200

页面大小超出范围

401

Unauthorized

未授权

AK/SK 无效

500

InternalError

服务内部错误

服务端异常,请稍后重试


定时任务数据结构

Schedule 对象

字段

类型

描述

Type

string

调度类型:cron / interval / once

Expr

string

调度表达式,格式取决于 Type

Timezone

string

时区,如 Asia/Shanghai

Type 与 Expr 对照表

Type

Expr 格式

示例

说明

cron

标准 cron 表达式

0 9 * * *

每天早上 9 点

cron

标准 cron 表达式

0 9 * * 1-5

工作日早上 9 点

interval

数字+单位

10m

每 10 分钟(周期性触发)

interval

数字+单位

2h

每 2 小时(周期性触发)

once

ISO 8601 绝对时间

2026-05-08T15:00:00

在指定时间触发一次(按 Timezone 解释,未来时间)

once

ISO 8601 绝对时间

2026-05-08T07:00:00Z

等价于 UTC 07:00(接受 Z 后缀)

once 类型的 Expr 必须是未来的绝对时间。任务执行完成后会自动从 ListScheduledTasks 中消失(内部置为 status=paused 并写入 deleted_at 软删除),但已产生的 Run 记录仍可通过 ListScheduledTaskRuns 查询。如需「N 分钟/小时后做一次」语义,请由调用方自行换算成绝对 ISO 8601 时间后再传入;本接口不接受 10m 这类相对偏移作为 once 的 Expr。传入过去时间的错误响应CreateScheduledTask / UpdateScheduledTask 在校验到 once 类型的 Expr 早于服务端当前时间时,返回 HTTP 400 错误响应(POP 风格信封 success=falsehttpStatusCode=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

推送方式,当前支持 im_push

Channel

string

渠道类型,如 dingtalk

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_iduser_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=succeededResultPayload 的写入。

Stateful 字段使用指南

Stateful 控制 Agent 在每次定时执行之间,LLM prompt 是否携带历史会话。它控制执行记忆是否落盘——两种取值都会累积保留执行记忆,区别在于是否把这些历史灌入下一次的 LLM prompt。

取值

LLM Prompt

执行记忆累积

token 消耗

适用场景

false默认,强烈推荐

不加载历史,prompt 仅含本次 Instruction

累积保留(默认最近 200 条 / 30 天上限内滚动),用户在 Chat 中可通过沙箱回查执行历史

仅取决于本次 Instruction 长度,不随执行次数增长

绝大多数任务:日报 / 简报 / 天气 / 定时提醒 / 邮件总结等每次独立产出的任务

true

加载上一次的完整会话历史灌入 prompt

整体覆盖更新为本次执行结束时的完整会话

随历史线性增长,长期运行会持续上涨

仅当任务必须依赖跨次会话记忆才能完成功能(典型如「Excel表格去重通知:只通知本次新增的行,对比上次已通知的行 ID」)

判定规则(按序匹配,命中即停)

  1. 任务说明明确提到「去重」「只通知新的」「跟上次对比」「累计统计」「记住上次」→ 选 true

  2. 任务每次执行只是「按当前时刻状态产出报告/提醒」,无需对比历史 → 选 false

  3. 不确定时优先选 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,跳过推送

PushStatusStatus 正交: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

"EA12****-****-****-****-****E5C"

Success

boolean

是否调用成功

true

Code

string

错误码,成功时为 "200"

"200"

Message

string

结果描述

""

HttpStatusCode

integer

HTTP 状态码

200

Items

array

模板列表(见下方)

Items 数组元素

名称

类型

描述

示例值

TenantId

string

租户 ID

"18363908****"

TemplateId

string

模板 ID

"template-abc123"

TemplateKey

string

模板唯一标识 Key

"default"

TodayActiveUsers

integer(int64)

今日活跃用户数(UTC 日期)

12

TodaySessions

integer(int64)

今日会话数

36

TodayCredit

number(float)

今日 Credit 消耗

125.8

UpdateAt

string

更新时间(ISO 8601)

"2026-06-04T10:30:00+08:00"

TodayActiveUsersTodaySessionsTodayCredit 为当日(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

"template-abc123"

请求示例

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

"EA12****-****-****-****-****E5C"

Success

boolean

是否调用成功

true

Code

string

错误码,成功时为 "200"

"200"

Message

string

结果描述

""

HttpStatusCode

integer

HTTP 状态码

200

Id

string

模板 ID

"template-abc123"

TenantId

string

租户 ID

"18363908****"

TemplateId

string

模板 ID

"template-abc123"

ModelTier

string

模型层级(pro / standard

"pro"

CreatedAt

string

创建时间(ISO 8601)

"2026-03-26T02:27:42Z"

UpdatedAt

string

更新时间(ISO 8601)

"2026-05-19T12:02:44+08:00"

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(builtin / market)和 SkillId

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

"template-abc123"

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

"EA12****-****-****-****-****E5C"

Success

boolean

是否调用成功

true

Code

string

错误码,成功时为 "200"

"200"

Message

string

结果描述

""

HttpStatusCode

integer

HTTP 状态码

200

TenantId

string

租户 ID

"18363908****"

TemplateId

string

模板 ID

"template-abc123"

TemplateSystemRules

string

已设置的系统规则内容

"你是一个专业的技术助手,请用简洁的中文回答问题。"

UpdatedAt

string

更新时间(ISO 8601)

"2026-05-19T12:01:27+08:00"

响应示例

成功响应

{
  "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 接入第三方对话渠道(当前支持微信)。绑定一个微信渠道实例的最小调用链:

  1. 调用 CreateChannelInstanceQrCode 拿到二维码与 SessionKey

  2. 终端用户使用微信扫描二维码并在手机端确认

  3. 客户端以 ~2 秒为间隔轮询 DescribeChannelInstanceQrCode,直到 Status=confirmed,得到 ChannelInstanceId

  4. 后续可使用 ListChannelInstances / DescribeChannelInstance / UpdateChannelInstance 管理该实例

⚠️ 渠道管理接口当前处于 Beta 阶段,接口字段、行为及限制可能在正式发布前调整。

CreateChannelInstanceQrCode - 获取扫码绑定二维码

接口描述

创建一个微信扫码绑定会话,返回二维码图片和用于轮询状态的 SessionKey。终端用户使用微信扫描该二维码并在手机端确认后,将自动完成渠道实例的创建与绑定。

会话有效期由后端控制,超过 ExpiresAt 后该 SessionKey 不可再使用,需要重新发起。

请求信息

  • 认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同

  • Action: CreateChannelInstanceQrCode

请求参数

名称

类型

必填

描述

示例值

ChannelType

string

渠道类型,当前仅支持 wechat

"wechat"

TemplateId

string

Agent 模板 ID

"template-rkvcno5m"

ExternalUserId

string

外部系统用户唯一标识

"externalUserId@1762926266827681"

说明: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

是否成功

true

Code

string

错误码

"200"

HttpStatusCode

integer

状态码

200

RequestId

string

请求 ID

"EA12****-****-****-****-****E5C"

SessionKey

string

会话 Key,用于轮询扫码状态

"qr-a1b2c3d4..."

QrcodeImgUrl

string

微信小程序 H5 短链(留痕用)

"https://liteapp.weixin.qq.com/q/..."

QrcodeImgBase64

string

二维码 PNG 图片的 base64 data URL,前端可直接用作 <img src>

"data:image/png;base64,iVBOR..."

ExpiresAt

long

会话过期时间(毫秒时间戳)

1779028328443

响应示例

{
  "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

参数错误

缺少必填参数(ChannelType / TemplateId / ExternalUserId),或 ChannelType 取值不是 wechat

401

Unauthorized

未授权

AK/SK 无效

500

InternalError

服务内部错误

上游异常,请记录 RequestId 反馈给技术支持


DescribeChannelInstanceQrCode - 查询扫码绑定状态

接口描述

查询扫码绑定会话的当前状态。客户端应以 ~2 秒间隔轮询此接口,直到状态变为 confirmed(绑定成功)或 expired(已过期)。

请求信息

  • 认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同

  • Action: DescribeChannelInstanceQrCode

请求参数

名称

类型

必填

描述

示例值

SessionKey

string

CreateChannelInstanceQrCode 返回的会话 Key

"qr-a1b2c3d4..."

请求示例

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

是否成功

true

Code

string

错误码

"200"

HttpStatusCode

integer

状态码

200

RequestId

string

请求 ID

"EA12****-****-****-****-****E5C"

Status

string

当前状态:waiting / scanned / confirmed / expired

"confirmed"

ChannelInstanceId

string

绑定成功时返回的渠道实例 ID(仅 confirmed 状态有值)

"ci-e3ab0ca5..."

ErrCode

string

失败原因码(仅 expired 状态有值)

null

ErrMsg

string

失败原因描述(仅 expired 状态有值)

null

ExpiresAt

long

会话过期时间(毫秒时间戳)

1779028328443

状态流转

Status

说明

客户端操作

waiting

等待用户扫码

继续轮询

scanned

用户已扫码,等待手机端确认

继续轮询

confirmed

绑定成功,ChannelInstanceId 有值

停止轮询,绑定完成

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

参数错误

缺少 SessionKey

401

Unauthorized

未授权

AK/SK 无效

404

ResourceNotFound

会话不存在

SessionKey 对应的扫码会话不存在或已被清理

500

InternalError

服务内部错误

服务端异常


ListChannelInstances - 查询渠道实例列表

接口描述

分页查询当前租户下的渠道实例列表。支持按渠道类型、模板、终端用户、状态筛选。

请求信息

  • 认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同

  • Action: ListChannelInstances

请求参数

名称

类型

必填

描述

示例值

ChannelType

string

渠道类型,当前支持 wechat

"wechat"

TemplateId

string

按模板 ID 筛选

"template-rkvcno5m"

ExternalUserId

string

按终端用户 ID 筛选

"externalUserId@1762926266827681"

Status

string

按状态筛选:enabled / disabled / expired。不传则返回除 deleted 之外的所有状态

"enabled"

PageSize

integer

每页数量,默认 20,最大 100

20

PageNumber

integer

页码,从 1 开始,默认 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

是否成功

true

Code

string

错误码

"200"

HttpStatusCode

integer

状态码

200

RequestId

string

请求 ID

"EA12****-****-****-****-****E5C"

Channels

array

渠道实例列表(元素结构见下方)

TotalCount

integer

符合条件的总记录数

1

PageSize

integer

每页数量

20

PageNumber

integer

当前页码

1

Channels 数组元素:

名称

类型

描述

示例值

ChannelInstanceId

string

渠道实例 ID

"ci-e3ab0ca5..."

TenantId

long

租户 ID(由 AK/SK 自动解析)

1762926266827681

TemplateId

string

模板 ID

"template-rkvcno5m"

ExternalUserId

string

终端用户 ID

"externalUserId@1762926266827681"

ChannelType

string

渠道类型

"wechat"

Name

string

实例展示名称

"我的微信机器人"

Status

string

实例状态:enabled / disabled / expired

"enabled"

GmtCreate

string

创建时间(ISO 8601)

"2026-05-10T06:30:00Z"

GmtModified

string

最后修改时间(ISO 8601)

"2026-05-11T01:00:00Z"

响应示例

{
  "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

参数错误

Status 取值非法、PageSize > 100、PageNumber < 1 等

401

Unauthorized

未授权

AK/SK 无效

500

InternalError

服务内部错误

服务端异常


DescribeChannelInstance - 查询渠道实例详情

接口描述

查询单个渠道实例的详细信息。支持两种定位方式:

  1. 通过实例 ID:传入 ChannelInstanceId

  2. 通过自然键:同时传入 TemplateIdExternalUserIdTenantId 由 AK/SK 解析)

两种方式二选一。

请求信息

  • 认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同

  • Action: DescribeChannelInstance

请求参数

名称

类型

必填

描述

示例值

ChannelType

string

渠道类型,当前支持 wechat

"wechat"

ChannelInstanceId

string

条件必填

渠道实例 ID(与自然键二选一)

"ci-e3ab0ca5..."

TemplateId

string

条件必填

模板 ID(自然键,需与 ExternalUserId 一起使用)

"template-rkvcno5m"

ExternalUserId

string

条件必填

终端用户 ID(自然键,需与 TemplateId 一起使用)

"externalUserId@1762926266827681"

请求示例

方式一:通过 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

是否成功

true

Code

string

错误码

"200"

HttpStatusCode

integer

状态码

200

RequestId

string

请求 ID

"EA12****-****-****-****-****E5C"

ChannelInstanceId

string

渠道实例 ID

"ci-e3ab0ca5..."

TenantId

long

租户 ID(由 AK/SK 自动解析)

1762926266827681

TemplateId

string

模板 ID

"template-rkvcno5m"

ExternalUserId

string

终端用户 ID

"externalUserId@1762926266827681"

ChannelType

string

渠道类型

"wechat"

Name

string

实例展示名称

"我的微信机器人"

Status

string

实例状态:enabled / disabled / expired

"enabled"

GmtCreate

string

创建时间(ISO 8601)

"2026-05-10T06:30:00Z"

GmtModified

string

最后修改时间(ISO 8601)

"2026-05-11T01:00:00Z"

响应示例

{
  "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

参数错误

两种定位方式都未提供完整参数(既未传 ChannelInstanceId,也未同时传 TemplateIdExternalUserId

401

Unauthorized

未授权

AK/SK 无效

404

ResourceNotFound

实例不存在

给定的 ChannelInstanceId 或自然键三元组不对应任何实例

500

InternalError

服务内部错误

服务端异常


UpdateChannelInstance - 修改渠道实例状态

接口描述

修改渠道实例的启用 / 禁用状态。禁用后该实例将停止收发消息;重新启用后恢复。

实例定位方式与 DescribeChannelInstance 相同(ChannelInstanceId 或自然键二选一)。

请求信息

  • 认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同

  • Action: UpdateChannelInstance

请求参数

名称

类型

必填

描述

示例值

ChannelType

string

渠道类型,当前支持 wechat

"wechat"

ChannelInstanceId

string

条件必填

渠道实例 ID(与自然键二选一)

"ci-e3ab0ca5..."

TemplateId

string

条件必填

模板 ID(自然键)

"template-rkvcno5m"

ExternalUserId

string

条件必填

终端用户 ID(自然键)

"externalUserId@1762926266827681"

Status

string

目标状态,仅允许 enableddisabled

"disabled"

状态转换规则

当前状态

允许转换到

说明

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

是否成功

true

Code

string

错误码

"200"

HttpStatusCode

integer

状态码

200

RequestId

string

请求 ID

"EA12****-****-****-****-****E5C"

ChannelInstanceId

string

渠道实例 ID

"ci-e3ab0ca5..."

TenantId

long

租户 ID

1762926266827681

TemplateId

string

模板 ID

"template-rkvcno5m"

ExternalUserId

string

终端用户 ID

"externalUserId@1762926266827681"

ChannelType

string

渠道类型

"wechat"

Name

string

实例展示名称

"我的微信机器人"

Status

string

更新后的状态

"disabled"

GmtCreate

string

创建时间(ISO 8601)

"2026-05-10T06:30:00Z"

GmtModified

string

最后修改时间(ISO 8601)

"2026-05-11T13:45:00Z"

响应示例

{
  "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

参数错误

Status 取值不是 enableddisabled、定位参数缺失,或当前状态不允许转换到目标状态(如 expiredenabled

401

Unauthorized

未授权

AK/SK 无效

404

ResourceNotFound

实例不存在

指定的实例不存在

500

InternalError

服务内部错误

服务端异常


DescribeChannelInstanceStats - 获取渠道状态统计

接口描述

按渠道类型获取当前租户下所有实例的状态统计(启用 / 禁用 / 失效 / 总数)。

请求信息

  • 认证方式: POP V1 签名(AK/SK),与 GetAccessToken 相同

  • Action: DescribeChannelInstanceStats

请求参数

名称

类型

必填

描述

示例值

ChannelType

string

渠道类型,当前支持 wechat。不传则统计所有类型

"wechat"

TemplateId

string

按模板 ID 筛选

"template-rkvcno5m"

请求示例

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

是否成功

true

Code

string

错误码

"200"

HttpStatusCode

integer

状态码

200

RequestId

string

请求 ID

"EA12****-****-****-****-****E5C"

Channels

array

各渠道类型的统计数据(元素结构见下方)

Channels 数组元素:

名称

类型

描述

示例值

ChannelType

string

渠道类型

"wechat"

EnabledCount

integer

启用中数量

1

DisabledCount

integer

用户主动关闭数量

1

ExpiredCount

integer

凭据失效数量(如微信端解绑)

8

TotalCount

integer

总接入数量

10

响应示例

{
  "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 引用该路径