slashx.response.v1 字段详解
这是 HTTP 服务商返回给 SlashX 的格式。本文按代码中的协议定义(provider-protocol-v1.ts)逐字段说明。
schemaVersion 固定为 "slashx.response.v1"。
完整示例
一个覆盖所有字段 的完整成功响应(含全部可选字段),下面的字段表可逐项对照。真实场景下大部分字段会缺失,这里为演示协议全貌而全放上:
json
{
"schemaVersion" : "slashx.response.v1" ,
"runId" : "f47ac10b-58cc-4372-a567-0e02b2c3d479" ,
"traceId" : "9c858901-8a57-4791-81fe-4c455b099bc9" ,
"runStatus" : "success" ,
"progress" : 1 ,
"messages" : [
{
"id" : "f47ac10b-58cc-4372-a567-0e02b2c3d479" ,
"role" : "assistant" ,
"status" : "success" ,
"delta" : false ,
"done" : true ,
"content" : {
"text" : "支持 7 天无理由退货[1]。下面是退货入口:" ,
"images" : [
{ "url" : "https://cdn.example.com/guide.png" , "mimeType" : "image/png" , "fileName" : "退货指引.png" , "meta" : { "width" : 800 , "height" : 600 } }
] ,
"videos" : [
{ "url" : "https://cdn.example.com/demo.mp4" , "mimeType" : "video/mp4" , "fileName" : "退货演示.mp4" }
] ,
"audio" : [
{ "url" : "https://cdn.example.com/tip.mp3" , "mimeType" : "audio/mpeg" , "fileName" : "语音提示.mp3" }
] ,
"attachments" : [
{ "url" : "https://cdn.example.com/policy.pdf" , "mimeType" : "application/pdf" , "fileName" : "退货政策.pdf" , "attachmentType" : "document" }
] ,
"citations" : [
{ "index" : 1 , "title" : "退货政策" , "url" : "https://example.com/policy" , "snippet" : "自签收起 7 日内…" , "meta" : { "source" : "kb" } }
] ,
"cards" : [
{
"type" : "product" ,
"title" : "无线降噪耳机" ,
"subtitle" : "旗舰款 · 现货" ,
"imageUrl" : "https://cdn.example.com/headphone.png" ,
"fields" : [
{ "label" : "价格" , "value" : "¥999" } ,
{ "label" : "库存" , "value" : "充足" }
] ,
"actions" : [
{ "label" : "立即购买" , "kind" : "open_url" , "value" : "https://example.com/buy/123" }
] ,
"meta" : { "skuId" : "123" }
}
] ,
"actions" : [
{ "label" : "申请退货" , "kind" : "open_url" , "value" : "https://example.com/refund" , "meta" : { "track" : "refund_btn" } }
]
} ,
"meta" : {
"toolName" : "order_lookup" ,
"modelUsed" : "gpt-4o" ,
"thinkingDurationMs" : 320 ,
"finishReason" : "stop"
}
}
] ,
"conversationUpdate" : { "title" : "退货咨询" , "modeTag" : "after_sales" } ,
"usage" : {
"promptTokens" : 220 ,
"completionTokens" : 48 ,
"totalTokens" : 268 ,
"costUsd" : 0.0021 ,
"modelUsed" : "gpt-4o" ,
"latencyMs" : 1280
} ,
"nextPoll" : { "afterMs" : 2000 , "url" : "https://example.com/poll/run-123" } ,
"extensions" : { "anyCustomKey" : "任意自定义数据" }
}
复制
上面把所有字段都列出来了,仅用于展示协议全貌。error 字段未出现在这里——它只在失败响应(runStatus: "error")中出现,见下方「场景化响应示例 → 业务失败」。
顶层字段
字段 类型 必填 说明 示例 / 取值 schemaVersionstring 必填固定值 "slashx.response.v1"(固定)runIdstring(uuid) 可选同步可省略(沿用请求的 runId) "f47ac10b-58cc-4372-a567-0e02b2c3d479"traceIdstring(uuid) 可选追踪 ID "9c858901-8a57-4791-81fe-4c455b099bc9"runStatusenum 可选运行状态,默认 success "pending" / "running" / "success" / "error" / "cancelled"progressnumber 可选进度,范围 0~1 1messagesarray 可选助手消息列表,默认 [] 见 messages 小节 conversationUpdateobject 可选更新会话标题/模式标签 { "title": "退货咨询", "modeTag": "after_sales" }usageobject 可选token 用量(按 token 计费必填) 见 usage 小节 errorobject 可选错误详情(runStatus: error 时填) 见 error 小节 nextPollobject 可选异步轮询提示(afterMs 必填正整数,url 可选) { "afterMs": 2000, "url": "https://..." }extensionsobject 可选扩展字段,默认 {} { "anyCustomKey": "任意数据" }
异步 Operation 响应
当 Operation Contract 声明 taskSupport: "async" 或 "both" 时,服务商可以先返回:
json
{
"schemaVersion" : "slashx.response.v1" ,
"runStatus" : "running" ,
"progress" : 0.05 ,
"messages" : [ ] ,
"nextPoll" : {
"afterMs" : 3000 ,
"url" : "https://provider.example/tasks/task-123"
} ,
"extensions" : {
"externalRunId" : "task-123" ,
"cancelUrl" : "https://provider.example/tasks/task-123"
}
}
复制
SlashX 的启动请求会在 extensions.slashxAsync 中提供 callbackUrl、高熵 callbackToken、callbackExpiresAt 和可选 idempotencyKey。完成后向 callbackUrl POST 完整的 slashx.response.v1,并通过 X-SlashX-Callback-Token(或 Authorization: Bearer)原样提交 token。数据库只保存 token 摘要;不要把 token 写入日志。
若返回 nextPoll.url,当前 HTTP Provider 要求它与应用 endpoint 同源;SlashX 会按 afterMs 使用原连接鉴权发起 GET。声明支持取消时,cancelUrl 也必须同源,SlashX 使用 DELETE 尽力取消。最终回调和轮询结果都必须返回 success、error 或 cancelled,pending/running 不会被当作成功。
messages(助手消息)
每条消息:
字段 类型 必填 说明 示例 / 取值 idstring 必填消息 ID(建议用请求的 runId) "f47ac10b-58cc-4372-a567-0e02b2c3d479"roleenum 可选消息角色,默认 assistant "assistant" / "thinking" / "tool" / "system" / "error"statusenum 可选消息状态,默认 success "pending" / "streaming" / "success" / "error" / "cancelled"deltaboolean 可选是否为增量帧,默认 false true / falsedoneboolean 可选是否为最后一帧,默认 true true / falsecontentobject 必填消息内容,见下 见 content 小节 metaobject 可选消息元数据,见下 见 meta 小节
content(消息内容)
字段 类型 必填 说明 示例 / 取值 textstring 可选文本,默认空 "支持 7 天无理由退货"imagesarray 可选图片(元素 url 必填) 见 AssistantMedia videosarray 可选视频,同 AssistantMedia 结构 见 AssistantMedia audioarray 可选音频,同 AssistantMedia 结构 见 AssistantMedia attachmentsarray 可选附件,额外含 attachmentType 见 AssistantMedia(+attachmentType) citationsarray 可选引用来源,见下 见 citations 小节 cardsarray 可选结构化卡片,见下 见 cards 小节 actionsarray 可选快捷操作按钮,见下 见 actions 小节
AssistantMedia(助手返回的媒体)
images / videos / audio / attachments 的元素结构:
字段 必填 说明 示例 / 取值 url 必填资源 URL(响应里必填,不能只给 base64) "https://cdn.example.com/out.png"mimeType 可选MIME 类型,默认 application/octet-stream "image/png" / "video/mp4" / "audio/mpeg"fileName 可选文件名,默认空 "结果.png"meta 可选附加元数据 { "width": 800 }attachmentType 可选仅 attachments 有,标注附件类型 "document" / "video" / "audio" / "image"(也可自定义)
meta(消息元数据)
字段 类型 必填 说明 示例 / 取值 toolNamestring 可选工具名(role: tool 时用) "order_lookup"modelUsedstring 可选实际使用的模型 "gpt-4o"thinkingDurationMsnumber 可选思考耗时(毫秒,非负整数) 320finishReasonstring 可选结束原因 "stop" / "length" 等
助手返回的媒体里 url 是必填的(请求里的媒体允许 base64,但响应里建议给可访问 URL)。
citations(引用)
字段 类型 必填 说明 示例 / 取值 indexnumber 可选角标序号(正整数) 1titlestring 必填来源标题 "退货政策"urlstring 可选来源链接 "https://example.com/policy"snippetstring 可选原文摘录 "自签收起 7 日内…"metaobject 可选附加元数据 { "source": "kb" }
actions(操作按钮)
字段 类型 必填 说明 示例 / 取值 labelstring 必填按钮文字 "申请退货"kindenum 必填按钮类型 "send_message" / "open_url" / "copy" / "feedback" / "custom"valuestring 必填按钮值(要发送的文本、要打开的 URL 等) "https://example.com/refund"metaobject 可选附加元数据 { "track": "refund_btn" }
cards(卡片)
字段 类型 必填 说明 示例 / 取值 typestring 必填卡片类型(自由字符串) "product" / "order" 等自定义titlestring 可选标题 "无线降噪耳机"subtitlestring 可选副标题 "旗舰款 · 现货"imageUrlstring 可选卡片图 "https://cdn.example.com/headphone.png"fieldsarray 可选{ label, value } 列表[{ "label": "价格", "value": "¥999" }]actionsarray 可选卡片内按钮(结构同上 actions) 见 actions 小节 metaobject 可选附加元数据 { "skuId": "123" }
usage(用量)
字段 类型 必填 说明 示例 / 取值 promptTokensnumber 可选输入 token(非负整数) 220completionTokensnumber 可选输出 token(按 token 计费时必填 ,非负整数) 48totalTokensnumber 可选总 token(建议返回,非负整数) 268costUsdnumber 可选成本(美元,非负) 0.0021modelUsedstring 可选实际使用的模型 "gpt-4o"latencyMsnumber 可选耗时(毫秒,非负整数) 1280
如果智能体配置了按 token 计费,请务必分别返回 usage.promptTokens(输入)与 usage.completionTokens(输出),SlashX 按输入/输出单价分别精确计费。仅返回 totalTokens 时会按输出单价对全部 token 计费(偏贵)。
error(错误详情)
字段 类型 必填 说明 示例 / 取值 codestring 必填错误码(自定义字符串) "ORDER_NOT_FOUND"messagestring 必填错误信息 "找不到该订单"userVisibleboolean 可选是否展示给用户,默认 true true / falseretryableboolean 可选是否可重试,默认 false true / false
当 runStatus: "error" 或带 error 时,SlashX 会自动退还本次前置扣费。
场景化响应示例
不同业务场景下,建议这样返回。直接照着改即可。
1. 最简纯文本(最常用)
json
{
"schemaVersion" : "slashx.response.v1" ,
"runStatus" : "success" ,
"messages" : [
{ "id" : "m-1" , "role" : "assistant" , "content" : { "text" : "你好,有什么可以帮你?" } }
]
}
复制
2. 按 token 计费:带 usage
如果智能体配了按 token 计费,必须分别带 usage.promptTokens 与 usage.completionTokens(分别按输入/输出单价计费)。仅返回 totalTokens 时会按输出单价对全部 token 计费(偏贵)。
json
{
"schemaVersion" : "slashx.response.v1" ,
"runStatus" : "success" ,
"messages" : [
{ "id" : "m-1" , "role" : "assistant" , "content" : { "text" : "已为你查询完成。" } }
] ,
"usage" : { "promptTokens" : 120 , "completionTokens" : 30 , "totalTokens" : 150 , "modelUsed" : "gpt-4o" }
}
复制
3. 返回图片
json
{
"schemaVersion" : "slashx.response.v1" ,
"runStatus" : "success" ,
"messages" : [
{
"id" : "m-1" ,
"role" : "assistant" ,
"content" : {
"text" : "这是为你生成的图:" ,
"images" : [
{ "url" : "https://cdn.example.com/out.png" , "mimeType" : "image/png" , "fileName" : "结果.png" }
]
}
}
]
}
复制
4. 返回文件附件
json
{
"schemaVersion" : "slashx.response.v1" ,
"runStatus" : "success" ,
"messages" : [
{
"id" : "m-1" ,
"role" : "assistant" ,
"content" : {
"text" : "报表已生成,请下载:" ,
"attachments" : [
{ "url" : "https://cdn.example.com/report.xlsx" , "mimeType" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" , "fileName" : "月度报表.xlsx" , "attachmentType" : "document" }
]
}
}
]
}
复制
5. 带引用来源(知识库 / RAG 场景)
json
{
"schemaVersion" : "slashx.response.v1" ,
"runStatus" : "success" ,
"messages" : [
{
"id" : "m-1" ,
"role" : "assistant" ,
"content" : {
"text" : "根据公司规定,年假为 10 天[1],可跨年使用[2]。" ,
"citations" : [
{ "index" : 1 , "title" : "员工手册 v3" , "url" : "https://example.com/handbook#leave" , "snippet" : "全职员工每年享有 10 天带薪年假…" } ,
{ "index" : 2 , "title" : "年假管理细则" , "url" : "https://example.com/leave-policy" , "snippet" : "未休年假可顺延至次年 3 月…" }
]
}
}
]
}
复制
6. 带快捷操作按钮
json
{
"schemaVersion" : "slashx.response.v1" ,
"runStatus" : "success" ,
"messages" : [
{
"id" : "m-1" ,
"role" : "assistant" ,
"content" : {
"text" : "我能帮你处理订单,想做什么?" ,
"actions" : [
{ "label" : "查询物流" , "kind" : "send_message" , "value" : "查一下我的物流" } ,
{ "label" : "申请退款" , "kind" : "open_url" , "value" : "https://example.com/refund" } ,
{ "label" : "复制订单号" , "kind" : "copy" , "value" : "NO20260610001" }
]
}
}
]
}
复制
7. 带结构化卡片(商品 / 订单展示)
json
{
"schemaVersion" : "slashx.response.v1" ,
"runStatus" : "success" ,
"messages" : [
{
"id" : "m-1" ,
"role" : "assistant" ,
"content" : {
"text" : "为你找到这款商品:" ,
"cards" : [
{
"type" : "product" ,
"title" : "无线降噪耳机" ,
"subtitle" : "旗舰款 · 现货" ,
"imageUrl" : "https://cdn.example.com/headphone.png" ,
"fields" : [
{ "label" : "价格" , "value" : "¥999" } ,
{ "label" : "库存" , "value" : "充足" }
] ,
"actions" : [
{ "label" : "立即购买" , "kind" : "open_url" , "value" : "https://example.com/buy/123" }
]
}
]
}
}
]
}
复制
8. 业务失败(会触发自动退款)
json
{
"schemaVersion" : "slashx.response.v1" ,
"runStatus" : "error" ,
"error" : {
"code" : "ORDER_NOT_FOUND" ,
"message" : "找不到该订单,请确认订单号" ,
"userVisible" : true ,
"retryable" : false
}
}
复制
9. 更新会话标题
首次对话时可顺便给会话设一个标题(展示在用户的会话列表里)。
json
{
"schemaVersion" : "slashx.response.v1" ,
"runStatus" : "success" ,
"messages" : [
{ "id" : "m-1" , "role" : "assistant" , "content" : { "text" : "好的,我们来规划你的三亚行程。" } }
] ,
"conversationUpdate" : { "title" : "三亚旅行规划" }
}
复制
容错说明
SlashX 对非标准格式有容错:能从 content.text、或顶层的 output/result/message/text/body 等字段提取文本兜底。所以下面这种最简结构也能识别出文本:
json
{ "text" : "直接返回纯文本也行" }
复制
但生产环境强烈建议严格用上面的 slashx.response.v1 结构 ,否则无法使用多媒体、引用、卡片、按 token 计费(需 usage)等能力。