HTTP SSE 是单向通道,客户端发起 HTTP 请求之后,服务端持续推送流式数据到客户端,此时不支持双向交互。
1. HTTP SSE 接口请求
请求地址:
https://wss.lke.cloud.tencent.com/v1/qbot/chat/sse
请求方式:POST
注意:
触发对话接口前,需要有已发布的应用。
1.1 参数说明
请放到 HTTP Body 中, 以 JSON 的形式发送,具体如下:
名称 | 类型 | 是否必填 | 说明 |
request_id | string(255) | 是 | 请求 ID,用于标识一个请求(作消息串联,建议每个请求使用不同的 request_id) |
content | string(6000) | 是 | 消息内容,如果发送图片,在此传递 markdown 格式的图片链接,例如![](图片连接),其中图片链接需要可公有读。 |
file_infos | Object 数组 | 否 | |
session_id | string(64) | 是 | 会话 ID,用于标识一个会话(外部系统提供,建议不同的用户端会话传入不同的 session_id,否则同一个应用下的不同用户的消息记录会串掉) 参数长度:2-64个字符 校验规则: ^[a-zA-Z0-9_-]{2,64}$ ,一般可以用 uuid 来生成该值 uuid 示例:1b9c0b03-dc83-47ac-8394-b366e3ea67ef |
bot_app_key | string | 是 | |
visitor_biz_id | string(64) | 是 | 访客 ID(外部输入,建议唯一,标识当前接入会话的用户) |
visitor_labels | Object 数组 | 否 | 知识标签(用于知识库中知识的检索过滤);知识标签结构为: {"name": "subject", "values": ["语文", "数学"]} 知识标签里面定义了相关的属性,属性标识,标签。 文档适用范围选择了“语文”,“数学”标签。 注意: visitor_labels 中的 name 字段对应上图中的属性标识。 |
streaming_throttle | int32 | 否 | 流式回复频率控制:控制应用回包频率。该值表示应用每积攒多少字符向调用方回包一次,值越小回包越频繁(体验上越流畅,但流量开销也越大)。当不传值或者为 0 时以系统配置为准。 注意: 该设置项也不会加快大模型输出的时间,只是改变了向调用方回包的频率。因此如果设置很大,则会出现很长时间没有回包的现象。 |
custom_variables | map[string]string | 否 | 自定义参数的值。可以配置多个 key: value 对,key 为自定义参数的参数名称,value 为对应的自定义参数的运行时的值。 |
system_role | string(2000) | 否 | 角色指令(提示词), 为空时使用应用配置默认设定,填写时取当前值。 |
visitor_labels 知识标签列表的数据结构:
名称 | 类型 | 说明 |
name | string | 知识标签名 |
values | string 数组 | 知识标签值 |
file_infos 文件信息的数据结构:
名称 | 类型 | 是否必填 | 说明 |
file_name | string | 是 | 文件名称 |
file_size | string | 是 | 实时文档解析接口返回的文件大小 |
file_url | string | 是 | 实时文档解析接口返回的文件 URL |
file_type | string | 是 | 文件类型 |
doc_id | string | 是 | 实时文档解析接口返回的 doc_id |
1.2 如何获取 AppKey
在应用管理界面,找到您处于运行中的应用(需要先发布),单击调用,会弹出“调用信息”窗口。
在调用信息窗口可以看到 AppKey,单击复制即可。
1.3 curl 调用示例
curl -XPOST -vvv --no-buffer --location 'https://wss.lke.cloud.tencent.com/v1/qbot/chat/sse' \\--header 'Content-Type: application/json' \\--data '{"content": "消息内容","bot_app_key": "<your appkey>","visitor_biz_id": "<your visitor id>","session_id": "<your session_id>","visitor_labels": []}'
1.4 postman 调用示例
2. HTTP SSE 接口返回
2.1 回复事件
事件名:reply
事件方向:后端 > 前端
注意:
如果收到的消息中 is_evil == true 表示该消息命中敏感信息,发送失败。
因并发超限导致排队超时,会下发 "超出并发数限制" 错误。
数据结构:
名称 | 类型 | 说明 |
request_id | string(255) | 请求 ID,用于标识一个请求(作消息串联,建议每个请求使用不同的 request_id) |
content | string | 消息内容 |
file_infos | Object 数组 | 文件信息 |
record_id | string(64) | 消息唯一 ID |
related_record_id | string(64) | 关联的消息唯一 ID |
session_id | string(64) | 会话 ID,用于标识一个会话(外部系统提供,建议不同的用户端会话传入不同的 session_id,否则同一个应用下的不同用户的消息记录会串掉) |
is_from_self | bool | 消息是否由自己发出 (如果是自己发出,显示在聊天框右侧,否则在左侧) |
can_rating | bool | 该消息记录是否能评价 |
timestamp | int64 | 消息时间戳(秒级) |
is_final | bool | 消息是否已输出完 (流式模式下,消息会多次返回,每次返回均覆盖之前的答案) (当 is_final == true 时,停止生成按钮隐藏,并且显示点赞点踩按钮) |
is_evil | bool | 是否被敏感词打击 |
is_llm_generated | bool | 是否为模型生成内容 |
reply_method | uint8 | 回复方式: 1: 大模型回复
2: 未知问题回复
3: 拒答问题回复
4: 敏感回复
5: 已采纳问答对优先回复
6: 欢迎语回复 7: 并发数超限回复
8: 全局干预知识
9: 任务流回复
10: 任务流答案 11: 搜索引擎回复
12: 知识润色后回复
13: 图片理解回复
14: 实时文档回复 |
knowledge | Object 数组 | 命中的知识 |
option_cards | string 数组 | 选项卡,任务流程专有 |
custom_params | string 数组 | 用户自定义业务参数,用于透传问答中业务参数 |
task_flow | Object | 任务流程调试信息 |
knowledge 命中的知识的数据结构:
名称 | 类型 | 说明 |
id | string | 命中的知识 ID |
type | uint32 | 命中的知识类型:
1: 问答
2: 文档片段 |
task_flow 任务流调试信息的数据结构:
名称 | 类型 | 说明 |
task_flow_name | string | 任务流程名称 |
task_flow_id | string | 任务流程 ID |
query_rewrite | string | 问题改写结果 |
hit_intent | string | 命中的意图 |
slot_info | map[string]Object | 运行时收集的槽位信息 |
api_response | map[string]Object | API 节点的返回信息 |
type | int | 任务流程回复类型 0:任务流程回复 1:任务流程静默回复 2:任务流程拉回话术 3:任务流程自定义回复 |
2.2 token 统计事件
事件名:token_stat
事件方向:后端 > 前端
数据结构:
名称 | 类型 | 说明 |
session_id | string(64) | 会话 id |
request_id | string(255) | 对应发送事件对应的请求 id |
record_id | string(64) | 对应发送事件对应的消息记录 id |
status_summary | string | 本轮对话状态, 处理中: processing, 成功: success, 失败: failed |
status_summary_title | string | 本轮对话状态描述 |
elapsed | int | 本轮调用耗时, 单位 ms |
token_count | int | 本轮请求消耗 token 数(当包含多个过程时, 计算将汇总) |
procedures | Object 数组 | 调用过程列表 |
procedures 调用过程列表的数据结构:
名称 | 类型 | 说明 |
name | string | 英文名, 与下面的 title 字段一一对应.
knowledge, task_flow, search_engine, image, large_language_model, pot_math, file |
title | string | 调用过程描述, 对应 name 字段, 各中文含义如下:
调用知识库, 调用任务流程, 调用搜索引擎, 调用图片理解, 大模型回复, 调用计算器, 阅读文件 |
status | string | 调用过程状态, 处理中: processing, 成功: success, 失败: failed |
input_count | int | 当次过程输入消耗 token 数 |
output_count | int | 当次过程输出消耗 token 数 |
count | int | 当次过程消耗总 token 数:输入 + 输出 |
示例:
["token_stat",{"type": "token_stat","payload": {"elapsed": 1616,"order_count": 50000000,"procedures": [{"count": 323,"input_count": 308,"name": "knowledge","output_count": 15,"status": "success","title": "调用知识库"}],"record_id": "Hpe_20240625_185659_215_EsH2uf8L","request_id": "8PUcDU6xyQ-301747294000","session_id": "2d071ef7-ef76-44df-84a4-9210672ed700c8","status_summary": "success","status_summary_title": "调用知识库","token_count": 323,"used_count": 553},"message_id": "89d91395-06bc-4f2e-b240-06f7b4498b0c6e"}]
2.3 参考来源事件
事件名:reference
事件方向:后端 > 前端
数据结构:
名称 | 类型 | 说明 |
record_id | string(64) | 消息唯一 ID |
references | Object 数组 | 参考来源 |
references 参考来源的数据结构:
2.4 错误事件
事件名:error
事件方向:后端 > 前端
数据结构:
名称 | 类型 | 说明 |
request_id | string(255) | 请求 ID,用于标识一个请求(作消息串联,建议每个请求使用不同的request_id) |
error | Object | 错误 |
error 错误的数据结构:
名称 | 类型 | 说明 |
code | uint32 | 错误码 |
message | string | 错误信息 |
2.5 返回示例
event:replydata:{"type":"reply","payload":{"can_rating":false,"content":"你是谁","from_avatar":"","from_name":"","is_evil":false,"is_final":true,"is_from_self":true,"is_llm_generated":false,"knowledge":null,"record_id":"83ecd23c-6283-48d0-ac5e-7d8ab604770d","related_record_id":"","reply_method":0,"request_id":"","session_id":"sse_session8","timestamp":1701330804,"trace_id":"5daf1726c254241810bb160b4c8efbed"},"message_id":"808727d6-260a-4b7f-8a70-99330feaef3f"}event:replydata:{"type":"reply","payload":{"can_rating":true,"content":"我是大模型知识引擎,能够回答各种问题和提供信息。","from_avatar":"https://qbot-1251316161.cos.ap-nanjing.myqcloud.com/avatar.png","from_name":"bot","is_evil":false,"is_final":true,"is_from_self":false,"is_llm_generated":true,"knowledge":[{"id":33386,"type":1},{"id":452,"type":1},{"id":33388,"type":1}],"record_id":"7cfaf2dc-8e95-475b-9aa5-d6a5d4358f71","related_record_id":"83ecd23c-6283-48d0-ac5e-7d8ab604770d","reply_method":1,"request_id":"","session_id":"sse_session8","timestamp":1701330805,"trace_id":"5daf1726c254241810bb160b4c8efbed"},"message_id":"21b3eb5b-b0eb-4a2c-907b-2a287ad26a34"}
event:errordata:{"type":"error","error":{"code":460004,"message":"应用不存在"}}
注意:
接口使用时需判断取值是否为200,是则正常返回。
3. 错误码
错误码 | 错误信息 |
400 | 请求参数错误, 请参阅接入文档 |
460001 | Token 校验失败 |
460002 | 事件处理器不存在 |
460004 | 应用不存在 |
460010 | 会话不存在或没有操作权限 |
460011 | 超出并发数限制 |
460020 | 模型请求超时 |
460021 | 知识库未发布 |
460024 | 标签不合法 |
460025 | 图像识别失败 |
460031 | 当前应用连接数超出请求限制,请稍后再试 |
460032 | 当前应用模型余额不足 |
460033 | 应用不存在或没有操作权限 |
460034 | 输入内容过长 |
4. 对话端 Demo 代码
Demo 代码描述了一个完整链接建立和消息收发流程。
4.1 后端版本
其他编程语言暂无 Demo,可以参考文档和现有 Demo 自行实现。