标准知识问答(Chat)
POST /openapi/api/v1/chat/completions
使用租户配置进行知识问答或纯大模型对话。平台 API Key 要求 chat_v1=READ,请求头为 Authorization: Bearer tk-... 和 Content-Type: application/json。已开通租户用户契约的集成方也可按 契约协议 提供用户身份。
需要基于特定应用的配置对话,或传入外部访客标识时,请阅读 应用对话兼容接口。
请求参数
| 字段 | 类型 | 必填 | 默认值与规则 |
|---|---|---|---|
prompt | string | 条件必填 | 当前问题;与 messages 至少一项有效,非空时优先使用 prompt |
messages | array[object] | 条件必填 | prompt 为空时使用;最后一条必须为 role=user,前面的消息作为外部历史 |
messages[].role | string | 是 | user、assistant、system 等,最后一条要求 user |
messages[].content | string / object / array | 是 | 常规使用文本;兼容消息内容结构不代表所有模型都支持多模态 |
conversationId | string | 否 | 省略时新建会话;后续沿用返回值 |
containerId | array[string] | 否 | 知识库 code 列表,显式传入最多 10 个,须在当前用户可问答范围内 |
fileIds | array[string] | 否 | 进一步限定文件 code;文件须属于当前租户及本次可用知识库 |
ragSearch | boolean | 否 | 默认 true;false 时关闭知识检索 |
multipleDialog | boolean | 否 | 默认 true;使用 prompt 时配合相同 conversationId 进行多轮 |
stream | boolean | 否 | 默认 true;false 返回完整 JSON |
model | string | 否 | 部署方配置的模型编码;省略时使用租户默认模型 |
reasonStatus | boolean | 否 | 默认 false;推理模式实际支持取决于模型 |
temperature | number | 否 | 默认 0.95,0 < temperature <= 1 |
top_p | number | 否 | 默认 0.7,0 < top_p < 1 |
promptTemplate | string | 否 | 自定义 RAG 模板;ragSearch=true 时必须包含 ${question} 和 ${context} |
userId | string | 否 | 保留字段,最长 255;当前标准入口固定使用鉴权用户,传入不会切换对话身份 |
integrations | array[object] | 否 | 已开通的内置工具设置;每项包含 code、enabled,工具编码及可用性由部署方提供 |
containerId 省略时使用当前鉴权用户可问答的知识库,不等于整个租户的全部知识库。当前没有可用知识库时执行纯大模型回答。指定 fileIds 不会绕过知识库权限。
请求示例
非流式:
curl --request POST "${BASE_URL}/openapi/api/v1/chat/completions" \
--header "Authorization: Bearer ${AIS_API_KEY}" \
--header "Content-Type: application/json" \
--data '{
"prompt": "请介绍产品支持的部署方式",
"containerId": ["partner_kb_001"],
"ragSearch": true,
"multipleDialog": true,
"stream": false
}'
自行提供历史时,最后一条消息是本次问题,不要求消息必须以 user/assistant 严格成对:
{
"messages": [
{"role": "user", "content": "产品有哪些部署方式?"},
{"role": "assistant", "content": "可以按项目要求部署。"},
{"role": "user", "content": "对运行环境有什么要求?"}
],
"containerId": ["partner_kb_001"],
"stream": false
}
messages 模式使用调用方提供的历史;同时传 prompt 和 messages 时,优先使用 prompt,不进入 messages 历史分支。
非流式响应
成功直接返回对话对象,没有 code/message/data 外层包装。精简示例:
{
"created": 1788575400000,
"id": "message_001",
"conversationId": "conversation_001",
"model": "configured-model",
"costTime": 1200,
"usage": {
"completion_tokens": 30,
"prompt_tokens": 120,
"total_tokens": 150
},
"choices": [
{
"index": 0,
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": "请根据项目交付方案准备运行环境。"
}
}
],
"references": [],
"paragraphs": [],
"multiParts": []
}
响应字段
| 字段 | JSON 类型 | 说明 |
|---|---|---|
id | string | 本次响应标识 |
messageId | string / null | 消息标识,有值时保存,不等同会话 ID |
conversationId | string | 会话 ID,多轮续聊和历史查询复用 |
created | integer | 创建时间,Unix 毫秒 |
model | string | 实际使用的模型标识 |
modelDesc | string / null | 模型描述,可空 |
costTime | integer / null | 总处理耗时,毫秒 |
choices | array[object] | 回答结果 |
choices[].index | integer | 结果下标,通常从 0 开始 |
choices[].finish_reason | string / null | 结束原因;正常终止可为 stop,失败按实际值处理 |
choices[].message | object | 消息对象 |
choices[].message.role | string | 回答角色通常为 assistant |
choices[].message.content | string / object | 普通文本问答为字符串;兼容内容对象时按实际类型处理 |
choices[].message.reasoningContent | string / null | 模型提供且允许返回的推理内容扩展;不保证存在 |
usage | object / null | Token 统计,部分模型不提供完整统计 |
usage.prompt_tokens | integer / null | 输入 Token 数 |
usage.completion_tokens | integer / null | 输出 Token 数 |
usage.total_tokens | integer / null | 总 Token 数 |
references | array[object] | 文件级引用,字段见 Reference |
paragraphs | array[object] | 引用段落,字段见 ReferenceParagraph |
multiParts | array[object] | 多媒体引用,字段见 MultiPart |
无知识来源或尚未产生引用时,引用数组可以为空;不能据此假定整个回答失败。相反,有引用也不代表生成内容已通过业务审核。
引用文件编码为 dataSetId。引用 URL 按接口实际返回值使用,不硬编码对象存储签名地址。
SSE 流式响应
设置 stream=true,客户端按 text/event-stream 解析。命令行调试加 curl --no-buffer。
event:add
data:{"conversationId":"conversation_001","choices":[{"message":{"role":"assistant","content":"支持"}}]}
event:add
data:{"conversationId":"conversation_001","choices":[{"finish_reason":"stop","message":{"role":"assistant","content":""}}],"references":[],"paragraphs":[],"multiParts":[]}
上例展示事件格式,实际事件可能附带 id 和其他字段。逐事件累加文本,保留结束事件中的引用与 usage;中间事件可能尚未携带这些字段。此标准入口当前固定使用明文 JSON 数据,不需要 Base64 解码,不能沿用旧文档的 encode=true 说明。
建立 SSE 前的失败可能返回 JSON 错误;建立流之后还应处理流内异常和连接中断。不要把一次网络读取直接当成一个完整 SSE 事件。标准 Chat 限流时可能返回 HTTP 429 和 Retry-After,详见 错误处理。
流式消费检查表
| 阶段 | 客户端动作 |
|---|---|
| 建立连接 | 检查 HTTP 状态和 Content-Type;JSON 错误不能交给 SSE 解析器 |
| 接收事件 | 以空行识别 SSE 事件边界,将事件 data 解析为 JSON;一次网络读取可能包含半个或多个事件 |
| 展示文本 | 对增量内容累加;不要每次覆盖已生成的全部文本 |
| 读取扩展 | 保留 conversationId、usage 和引用;它们可能只在后续事件出现 |
| 正常结束 | 同时关注服务端结束事件、finish_reason 与连接状态,不把任意断连当成功 |
| 意外中断 | 标记答案不完整;需要重试时提醒可能重新生成,不承诺断点续传 |
SSE data 的字段类型与非流式响应一致,但每个事件通常只是其中一部分。只实现固定供应商的 [DONE] 或 choices[].delta 协议不足以消费 AIS 的 choices[].message 事件。