API 列表
本文以 HTTP 调用为例,介绍 DolphinX API 的请求方法、接口地址、请求参数、请求示例及响应示例。HTTP 与 WebSocket 的字段映射关系见 WebSocket 协议。
- 执行 curl 示例前需获取 BASE_URL 和
TOKEN:
BASE_URL='http://<host>:<port>' # 部署了 DolphinX 的 Server 地址 TOKEN='<dolphindb-token>' # DolphinDB 登录 token,通过 /api/login 接口获取 - 本文的响应示例只展示 data 字段中的内容。实际调用 API 时,拿到的是完整 envelope,需要从 data 字段中取业务数据。详情参见3. 响应格式。
1. Agent 发现与可用配置
1.1 获取可访问的 Agent
获取当前用户可访问的 Agent。
请求方法和地址
GET /agent-bus/v1/agent/accessible
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| status | query | int | 否 | Agent 状态值。
注: 设置 status=1
或不设置该参数时返回 ACTIVE Agent;设置为 0、2 或 3 时返回空列表。 |
| offset | query | int | 否 | 跳过前 offset 条数据,必须为非负整数。默认值为 0。 |
| limit | query | int | 否 | 返回条数上限,必须为非负整数。0 表示返回空列表,默认值为 100。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/agent/accessible?offset=0&limit=100" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_agent_accessible"
响应示例
items 数组中每个元素都对应一个 Agent 的信息,字段说明请参考 AgentInfo。size 表示 items 数组的长度,即可访问的 Agent 的数量。
{
"items": [
{
"agentId": "agent_builtin_xxx",
"agentName": "DolphinDB Coding Agent",
"description": "用于 DolphinDB 开发、调试、脚本生成和数据分析的内置编程助手。",
"status": 1,
"statusName": "ACTIVE",
"systemPrompt": "你是 DolphinDB Coding Agent,负责替用户完成 DolphinDB 相关的代码编写、调试、脚本生成、数据分析和问题排查。\r\n\r\n能执行就直接执行,尽量把工作推进到可用结果,而不是只给建议。回答要直接、可靠、便于复查;信息不足时只问必要问题,不臆造表结构、接口或运行结果。",
"llmConfigId": "llm_f5796495-21ce-8990-4e40-xxx",
"contextConfig": {
"includeSkillCatalog": true,
"includeMemory": true
},
"memoryConfig": {
"embeddingEnabled": false
},
"config": {
"builtin": true,
"builtinVersion": "2026.06.02",
"agentKind": "coding"
},
"version": 3,
"schemaVersion": 1,
"extra": "",
"createTime": "2026.06.29 14:20:30.596",
"updateTime": "2026.06.29 14:22:09.107",
"myPermission": "AGENT_ADMIN"
}
],
"offset": 0,
"limit": 100,
"size": 1
}
1.2 获取指定 Agent
根据 Agent ID 获取指定 Agent。
请求方法和地址
GET /agent-bus/v1/agent/{agentId}
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| agentId | path | string | 是 | Agent ID。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/agent/${agentId}" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_agent_get"
响应示例
返回指定 Agent 的信息,字段说明请参考 AgentInfo。
{
"agentId": "agent_builtin_xxx",
"agentName": "DolphinDB Coding Agent",
"description": "用于 DolphinDB 开发、调试、脚本生成和数据分析的内置编程助手。",
"status": 1,
"statusName": "ACTIVE",
"systemPrompt": "你是 DolphinDB Coding Agent,负责替用户完成 DolphinDB 相关的代码编写、调试、脚本生成、数据分析和问题排查。\r\n\r\n能执行就直接执行,尽量把工作推进到可用结果,而不是只给建议。回答要直接、可靠、便于复查;信息不足时只问必要问题,不臆造表结构、接口或运行结果。",
"llmConfigId": "llm_f5796495-21ce-8990-4e40-xxx",
"contextConfig": {
"includeSkillCatalog": true,
"includeMemory": true
},
"memoryConfig": {
"embeddingEnabled": false
},
"config": {
"builtin": true,
"builtinVersion": "2026.06.02",
"agentKind": "coding"
},
"version": 3,
"schemaVersion": 1,
"extra": "",
"createTime": "2026.06.29 14:20:30.596",
"updateTime": "2026.06.29 14:22:09.107"
}
1.3 获取可选择的 LLM
根据 Agent ID 获取指定 Agent 下可选择的 LLM。
请求方法和地址
GET /agent-bus/v1/agent/{agentId}/llm/selectable
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| agentId | path | string | 是 | Agent ID。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/agent/${agentId}/llm/selectable" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_agent_llm_selectable"
响应示例
items 数组中每个元素都对应一个 LLM 的信息,字段说明请参考 SelectableLlmInfo。size 表示 items 数组的长度,即可选择的 LLM 的数量。
{
"defaultLlmConfigId": "llm_f5796495-21ce-8990-xxx",
"items": [
{
"llmConfigId": "llm_f5796495-21ce-8990-xxx",
"name": "gpt",
"providerId": "provider_d69bdb29-70e7-f9ab-cc42-xxx",
"provider": {
"providerId": "provider_d69bdb29-70e7-f9ab-cc42-xxx",
"name": "gpt",
"adapterType": "openai-compatible",
"baseUrl": "https://xxx",
"apiKey": "***************************************************",
"enabled": true,
"schemaVersion": 1,
"extra": "",
"createTime": "2026.06.29 14:21:42.339",
"updateTime": "2026.06.29 14:21:42.339"
},
"model": "gpt-5.5",
"capability": "chat",
"embeddingDimension": 0,
"embeddingMetric": "",
"embeddingNormalize": false,
"requestPath": "/v1/chat/completions",
"defaultParams": {},
"contextWindow": null,
"maxConcurrency": null,
"rateLimitRPM": null,
"timeoutMs": null,
"retryConfig": {},
"enabled": true,
"schemaVersion": 1,
"customData": "{\"tool_call\":true}",
"extra": "",
"createTime": "2026.06.29 14:22:01.843",
"updateTime": "2026.06.29 14:22:01.843",
"source": "agent",
"isAgentDefault": true,
"fallbackPriority": 0,
"participatesInFallback": true
}
],
"size": 1
}
2. 会话管理
2.1 创建会话
使用指定 Agent 创建一个会话。
请求方法和地址
POST /agent-bus/v1/session/create
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| agentId | body | string | 是 | 处于 ACTIVE 状态的 Agent 的 ID。 |
| title | body | string | 否 | 会话标题。 |
| llmConfigId | body | string | 否 | 当前用户在指定 Agent 下,可选 LLM 配置的 ID。 |
| metadata | body | object | 否 | JSON 格式的自定义元数据。DolphinX 不对该数据进行处理。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/session/create" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_session_create" \
-d '{"agentId":"agent_xxx","title":"测试会话"}'
响应示例
响应字段说明参考 SessionInfo。
{
"sessionId": "8280cfd0-92c6-6bae-1844-xxx",
"agentId": "agent_builtin_3f9e3c9d-1b10-4d12-9d4a-xxx",
"userId": "admin",
"llmConfigId": "",
"title": "测试会话",
"metadata": {},
"schemaVersion": 1,
"extra": "",
"createTime": "2026.06.30 10:54:22.665",
"updateTime": "2026.06.30 10:54:22.665"
}
2.2 获取会话
根据会话 ID 获取指定会话。
请求方法和地址
GET /agent-bus/v1/session/{sessionId}
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/session/${sessionId}" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_session_get"
响应示例
响应字段说明参考 SessionInfo。
{
"sessionId": "8280cfd0-92c6-6bae-1844-xxx",
"agentId": "agent_builtin_3f9e3c9d-1b10-4d12-9d4a-xxx",
"userId": "admin",
"llmConfigId": "",
"title": "测试会话",
"metadata": {},
"schemaVersion": 1,
"extra": "",
"createTime": "2026.06.30 10:54:22.665",
"updateTime": "2026.06.30 10:54:22.665"
}
2.3 更新会话
更新指定会话的信息。只有会话 owner 才有权限更新。
请求方法和地址
PUT /agent-bus/v1/session/{sessionId}
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 请求地址已提供会话 ID 时可不设置该参数 | 会话 ID。若同时在请求地址和请求体中设置,ID 必须保持一致。 |
| title | body | string | 否 | 会话标题。 |
| llmConfigId | body | string | 否 | 当前用户在指定会话对应的 Agent 下,可选 LLM 的配置 ID。为空时表示清除原有的 LLM 配置。 |
| metadata | body | object | 否 | JSON 格式的自定义元数据。只能整体替换。 |
请求示例
curl -X PUT "${BASE_URL}/agent-bus/v1/session/${sessionId}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_session_update" \
-d '{"title":"更新后的会话标题","metadata":{"source":"curl-demo"}}'
响应示例
响应字段说明参考 SessionInfo。
{
"sessionId": "8280cfd0-92c6-6bae-1844-xxx",
"agentId": "agent_builtin_3f9e3c9d-1b10-4d12-9d4a-xxx",
"userId": "admin",
"llmConfigId": "",
"title": "更新后的会话标题",
"metadata": {"source": "curl-demo"},
"schemaVersion": 1,
"extra": "",
"createTime": "2026.06.30 10:54:22.665",
"updateTime": "2026.06.30 10:54:22.665"
}
2.4 删除会话
删除指定会话。
- 只有会话 owner 才有权限删除会话。
- 删除后对应的会话消息、会话的附件记录、Workspace 会被彻底删除。
- 对不存在的 sessionId 返回
deleted=true。 - 删除开始后,无法在该会话中发送新消息。
- 删除会话后,调用对应的
GET /session/{sessionId}和GET /session/{sessionId}/messages接口返回 BUS_SESSION_NOT_FOUND。
请求方法和地址
DELETE /agent-bus/v1/session/{sessionId}
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
请求示例
curl -X DELETE "${BASE_URL}/agent-bus/v1/session/${sessionId}" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_session_delete"
响应示例
{
"sessionId": "8280cfd0-92c6-6bae-1844-xxx",
"deleted": true
}
2.5 列举会话
列举当前用户创建的会话。该接口不支持跨用户会话查询。
请求方法和地址
GET /agent-bus/v1/session/list
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| agentId | query | string | 是 | Agent ID。也可以在请求地址中或通过 x-agent-id 请求头指定 ID。 |
| offset | query | int | 否 | 跳过前 offset 条数据,必须为非负整数。默认值为 0。 |
| limit | query | int | 否 | 返回条数上限,必须为非负整数。0 表示返回空列表,默认值为 100。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/session/list?agentId=agent_xxx&offset=0&limit=100" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_session_list"
响应示例
items 数组中每个元素都对应一个会话的信息,字段说明请参考 SessionInfo。size 表示 items 数组的长度,即会话的数量。
{
"items": [
{"sessionId": "100d1675-0a36-70a0-cf48-xxx",
"agentId": "agent_builtin_3f9e3c9d-1b10-4d12-9d4a-xxx",
"userId": "admin",
"llmConfigId": "",
"title": "测试会话",
"metadata": {},
"schemaVersion": 1,
"extra": "",
"createTime": "2026.06.30 10:44:55.744",
"updateTime": "2026.06.30 10:44:55.744"
}],
"offset": 0,
"limit": 100,
"size": 1
}
3. 会话附件管理
支持在会话中上传以下格式的附件:
- 图片格式支持 png、jpg、jpeg、webp、gif。
- 文档格式参考 DocParser。
3.1 初始化附件上传
声明待上传附件的元数据;实际上传需要使用分片上传接口。
请求方法和地址
POST /agent-bus/v1/session/{sessionId}/attachments
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| filename | body | string | 是 | 待上传附件的名称。 |
| mimeType | body | string | 是 | 附件的 MIME 类型,格式为类型/子类型。例如,附件为 PNG 图片,填写
"image/png"。 |
| byteSize | body | long | 是 | 整个附件的字节数。 |
| sha256 | body | string | 是 | 整个附件的 SHA-256,64 位十六进制字符串。 |
| extra | body | string | 否 | 额外信息。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/session/${sessionId}/attachments" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: attachment_upload_init" \
-d "{
\"filename\": \"architecture.png\",
\"mimeType\": \"image/png\",
\"byteSize\": 417996,
\"sha256\": \"${file_sha256}\",
\"extra\": \"image of DolphinDB architecture\"
}"
响应示例
响应字段说明参考 SessionAttachmentInfo。除了 SessionAttachmentInfo,还额外包含分片信息 partSize、partCount 和 uploadedPartCount。
{
"attachmentId": "img_e80e3523ea5ad6bae8f6b2c0985daeb0",
"sessionId": "5884131e-3a03-078d-df44-8315b4e9a277",
"agentId": "agent_builtin_3f9e3c9d-1b10-4d12-9d4a-0d47a9dfb001",
"userId": "admin",
"filename": "architecture.png",
"mimeType": "image/png",
"kind": "image",
"byteSize": 417996,
"sha256": "72d9842aaef8ee95b52dd60eba7896b439c10d2c7174675bd9b0977d2f80f53c",
"uploadStatus": "UPLOADING",
"parseStatus": "NOT_APPLICABLE",
"indexStatus": "NOT_APPLICABLE",
"parseError": null,
"indexError": null,
"schemaVersion": 2,
"extra": "image of DolphinDB architecture",
"createTime": "2026.09.03 11:23:43.301",
"updateTime": "2026.09.03 11:23:43.301",
"partSize": 4194304,
"partCount": 1,
"uploadedPartCount": 0
}
3.2 上传附件分片
分片上传附件实际数据。
请求方法和地址
PUT /agent-bus/v1/session/{sessionId}/attachments/{attachmentId}/parts/{partNo}
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| attachmentId | path | string | 是 | 附件 ID。 |
| partNo | path | int | 是 | 分片编号,从 0 开始。 |
| X-Part-SHA256 | header | string | 是 | 当前分片的 SHA-256 校验值,用于校验分片数据的完整性。 |
| / | body | binary | 是 | 当前分片的二进制数据,内容类型为
application/octet-stream。 |
请求示例
curl -X PUT "${BASE_URL}/agent-bus/v1/session/${sessionId}/attachments/${attachmentId}/parts/0" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/octet-stream" \
-H "X-Part-SHA256: ${PART_SHA256}" \
--data-binary "@${PART}"
响应示例
响应字段说明参考 SessionAttachmentInfo。除了 SessionAttachmentInfo,还额外包含分片信息 partSize、partCount 和 uploadedPartCount
{
"attachmentId": "img_e80e3523ea5ad6bae8f6b2c0985daeb0",
"sessionId": "5884131e-3a03-078d-df44-8315b4e9a277",
"agentId": "agent_builtin_3f9e3c9d-1b10-4d12-9d4a-0d47a9dfb001",
"userId": "admin",
"filename": "architecture.png",
"mimeType": "image/png",
"kind": "image",
"byteSize": 417996,
"sha256": "72d9842aaef8ee95b52dd60eba7896b439c10d2c7174675bd9b0977d2f80f53c",
"uploadStatus": "UPLOADING",
"parseStatus": "NOT_APPLICABLE",
"indexStatus": "NOT_APPLICABLE",
"parseError": null,
"indexError": null,
"schemaVersion": 2,
"extra": "image of DolphinDB architecture",
"createTime": "2026.09.03 11:23:43.301",
"updateTime": "2026.09.03 11:23:43.301",
"partSize": 4194304,
"partCount": 1,
"uploadedPartCount": 1
}
3.3 完成附件上传
验证分片数量、每片大小和整个附件的 SHA-256,解析附件并建立索引,完成附件上传。
附件解析和索引建立分别依赖 DocParser 和 ModelInference 插件,处理附件的 DolphinDB 节点须加载对应插件,否则 parseStatus 或 indexStatus 将分别为 PARSE_FAILED 或 INDEX_FAILED。
请求方法和地址
POST /agent-bus/v1/session/{sessionId}/attachments/{attachmentId}/complete
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| attachmentId | path | string | 是 | 附件 ID。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/session/${sessionId}/attachments/${attachmentId}/complete" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: attachment_upload_complete"
响应示例
响应字段说明参考 SessionAttachmentInfo。
-
图片上传成功:返回
uploadStatus=COMMITTED,解析和索引状态为 NOT_APPLICABLE。 -
文档解析成功:返回
parseStatus=PARSED、indexStatus=INDEXING。 -
文档解析失败:返回
parseStatus=PARSE_FAILED和 parseError,可再次调用该接口进行重试。 -
索引建立成功:返回
indexStatus=READY -
索引建立失败:返回
indexStatus=INDEX_FAILED,可调用index接口进行重试。
{
"attachmentId": "img_e80e3523ea5ad6bae8f6b2c0985daeb0",
"sessionId": "5884131e-3a03-078d-df44-8315b4e9a277",
"agentId": "agent_builtin_3f9e3c9d-1b10-4d12-9d4a-0d47a9dfb001",
"userId": "admin",
"filename": "architecture.png",
"mimeType": "image/png",
"kind": "image",
"byteSize": 417996,
"sha256": "72d9842aaef8ee95b52dd60eba7896b439c10d2c7174675bd9b0977d2f80f53c",
"uploadStatus": "COMMITTED",
"parseStatus": "NOT_APPLICABLE",
"indexStatus": "NOT_APPLICABLE",
"parseError": null,
"indexError": null,
"schemaVersion": 2,
"extra": "image of DolphinDB architecture",
"createTime": "2026.09.03 11:23:43.301",
"updateTime": "2026.09.03 14:22:34.651"
}
3.4 重新建立索引
在附件解析成功(parseStatus=PARSED)但索引建立失败时,可以调用本接口进行重试。
请求方法和地址
POST /agent-bus/v1/session/{sessionId}/attachments/{attachmentId}/index
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| attachmentId | path | string | 是 | 附件 ID。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/session/${sessionId}/attachments/${attachmentId}/index" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: attachment_index"
响应示例
响应字段说明参考 SessionAttachmentInfo。
{
"attachmentId": "doc_20c06b45a8f42998ddab4846343a25c8",
"sessionId": "5884131e-3a03-078d-df44-8315b4e9a277",
"agentId": "agent_builtin_3f9e3c9d-1b10-4d12-9d4a-0d47a9dfb001",
"userId": "admin",
"filename": "README.md",
"mimeType": "text/markdown",
"kind": "text",
"byteSize": 91,
"sha256": "d49c9511f1e7314af7f2488005c05eedc99a0716558fc19aa226cae05e1254d6",
"uploadStatus": "COMMITTED",
"parseStatus": "PARSED",
"indexStatus": "READY",
"parseError": null,
"indexError": null,
"schemaVersion": 2,
"extra": "README file for the project",
"createTime": "2026.09.03 14:34:55.178",
"updateTime": "2026.09.03 14:46:48.644"
}
3.5 列举会话附件
列举指定会话中的附件。
请求方法和地址
GET /agent-bus/v1/session/{sessionId}/attachments
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/session/${sessionId}/attachments" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: attachment_list"
响应示例
items 数组中每个元素都对应一个附件的信息,字段说明请参考 SessionAttachmentInfo。
{
"sessionId": "5884131e-3a03-078d-df44-8315b4e9a277",
"items": [
{
"attachmentId": "img_e80e3523ea5ad6bae8f6b2c0985daeb0",
"sessionId": "5884131e-3a03-078d-df44-8315b4e9a277",
"agentId": "agent_builtin_3f9e3c9d-1b10-4d12-9d4a-0d47a9dfb001",
"userId": "admin",
"filename": "architecture.png",
"mimeType": "image/png",
"kind": "image",
"byteSize": 417996,
"sha256": "72d9842aaef8ee95b52dd60eba7896b439c10d2c7174675bd9b0977d2f80f53c",
"uploadStatus": "COMMITTED",
"parseStatus": "NOT_APPLICABLE",
"indexStatus": "NOT_APPLICABLE",
"parseError": null,
"indexError": null,
"schemaVersion": 2,
"extra": "image of DolphinDB architecture",
"createTime": "2026.09.03 11:23:43.301",
"updateTime": "2026.09.03 14:22:34.651"
}
],
"offset": 0,
"limit": 100,
"size": 1
}
3.6 获取附件信息
获取指定附件的信息。
请求方法和地址
GET /agent-bus/v1/session/{sessionId}/attachments/{attachmentId}
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| attachmentId | path | string | 是 | 附件 ID。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/session/${sessionId}/attachments/{attachmentId}" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: attachment_info"
响应示例
响应字段说明参考 SessionAttachmentInfo。
{
"attachmentId": "doc_20c06b45a8f42998ddab4846343a25c8",
"sessionId": "5884131e-3a03-078d-df44-8315b4e9a277",
"agentId": "agent_builtin_3f9e3c9d-1b10-4d12-9d4a-0d47a9dfb001",
"userId": "admin",
"filename": "README.md",
"mimeType": "text/markdown",
"kind": "text",
"byteSize": 91,
"sha256": "d49c9511f1e7314af7f2488005c05eedc99a0716558fc19aa226cae05e1254d6",
"uploadStatus": "COMMITTED",
"parseStatus": "PARSED",
"indexStatus": "READY",
"parseError": null,
"indexError": null,
"schemaVersion": 2,
"extra": "README file for the project",
"createTime": "2026.09.03 14:34:55.178",
"updateTime": "2026.09.03 14:46:48.644"
}
3.7 下载附件原文件
直接返回上传时的原始文件字节,不返回 JSON envelope,也不进行 Base64 编码。附件必须处于
uploadStatus=COMMITTED 状态;解析和索引状态不影响下载。
请求方法和地址
GET /agent-bus/v1/session/{sessionId}/attachments/{attachmentId}/content
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| attachmentId | path | string | 是 | 附件 ID。 |
请求示例
OUTPUT='./downloaded-file'
curl -i GET "$BASE_URL/agent-bus/v1/session/${sessionId}/attachments/${attachmentId}/content" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: attachment_download" \
--output "${OUTPUT}"
响应示例
HTTP/1.1 200 OK
Content-Length: 91
X-Content-SHA256: d49c9511f1e7314af7f2488005c05eedc99a0716558fc19aa226cae05e1254d6
X-Agent-Bus-Streaming: false
Content-Type: text/markdown
Access-Control-Expose-Headers: Content-Disposition, X-Content-SHA256
Content-Disposition: attachment; filename="README.md"; filename*=UTF-8''README.md
Access-Control-Allow-Origin: *
Connection: close
# 测试附件上传
这是一份 md 文件,文件大小很小,用于上传测试。
3.8 检索附件内容
在附件中检索指定内容。
只有
uploadStatus=COMMITTED、parseStatus=PARSED、indexStatus=READY
的非图片附件可以参与检索。显式传入的附件 ID 必须属于指定的会话。
请求方法和地址
POST /agent-bus/v1/session/{sessionId}/attachments/retrieve
请求参数
| 字段 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| query | body | string | 是 | 待检索的内容,UTF-8 编码不超过 16 KiB。 |
| attachmentIds | body | string[] | 否 | 指定需要检索的附件,为空或省略时检索当前会话下全部可检索附件,默认为空。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/session/${sessionId}/attachments/retrieve" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: attachment_retrieve" \
-d "{
\"query\": \"测试\",
\"attachmentIds\": [\"${attachmentId}\"]
}"
响应示例
{
"retrievalId": "ret_bcc831d2-1861-e5b9-e244-ee69cf714298",
"resultStatus": "OK",
"items": [
{
"chunkId": "chk_909c5cf36fe6736745fd69fce0a8dc36",
"content": "# 测试附件上传",
"source": {
"attachmentId": "doc_20c06b45a8f42998ddab4846343a25c8",
"fileName": "README.md",
"pageNo": null
}
},
{
"chunkId": "chk_c87b675323193785f1fe7855c47b86de",
"content": "这是一份 md 文件,文件大小很小,用于上传测试。",
"source": {
"attachmentId": "doc_20c06b45a8f42998ddab4846343a25c8",
"fileName": "README.md",
"pageNo": null
}
}
]
}
3.9 删除附件
删除指定的附件。
请求方法和地址
DELETE /agent-bus/v1/session/{sessionId}/attachments/{attachmentId}
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| attachmentId | path | string | 是 | 附件 ID。 |
请求示例
curl -X DELETE "$BASE_URL/agent-bus/v1/session/${sessionId}/attachments/${attachmentId}" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: attachment_delete"
响应示例
deleted=true 表示逻辑删除已经生效且后台清理任务已提交。
{
"attachmentId": "img_b17760a09aeba5eb7ae6a56f04e8e7a3",
"deleted": true
}
4. 对话补全
在指定会话中推进一轮对话。可以提交新的用户消息,也可以提交工具调用的执行结果。DolphinX 会自动完成权限校验、会话写入、上下文组装、模型选择、LLM 调用、助手回复落库和 token 消耗记录。
接口支持流式和非流式返回,默认流式返回。自动组装与手动组装共用同一个请求地址,通过请求体中是否包含 assemblyConfig 参数切换:
- 不包含 assemblyConfig 时进行自动组装,适合常规对话。
- 包含 assemblyConfig 时进行手动组装,适合调用方自行控制上下文块、工具定义或临时指令的场景。
请求方法和地址
POST /agent-bus/v1/chat/completions
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | body | string | 是 | 会话 ID,必须属于当前登录用户。 |
| message | body | string | 条件必填 | 用户消息文本;与 content 互斥。 |
| content | body | ContentPart[] | 条件必填 | 多模态用户消息内容块;与 message 互斥。 |
| toolResults | body | ToolResult[] | 条件必填 | 工具执行结果列表,必须对应上一轮 assistant 返回的 toolCalls;可单独提交,也可与一种用户消息输入(message / content)同时提交。 |
| stream | body | bool | 否 | 是否流式返回,默认值为 true。 |
| contextEvent | body | bool | 否 | 是否在流式响应中返回上下文处理过程事件,默认值为 false。仅对 stream=true 的
HTTP SSE 和 WebSocket 请求生效。注: 开启后,自动摘要/上下文压缩等过程会以 EVENT 事件返回,便于前端展示“正在压缩上下文”等状态;这些事件不是 LLM
回复内容。 |
| includeReasoning | body | bool | 否 | 是否返回思考过程,默认值为 false。 |
| tools | body | ToolDefinition[] | 否 | 应用层工具定义列表,使用 OpenAI function calling 格式。 |
| activeSkillNames | body | string[] | 否 | 本次请求主动加载的技能名称列表。只用于显式注入这些技能的详细指令,不表示模型自主选择的技能,也不维护渐进式加载状态;后续是否继续加载由调用方决定。 |
| llmConfigId | body | string | 否 | 本次请求使用的 LLM 配置 ID,临时覆盖会话或 Agent 默认配置。 |
| model | body | string | 否 | 临时覆盖本次请求中的模型名称。通常应通过 llmConfigId 选择模型,仅在同一 LLM 配置下需要临时指定兼容模型名时使用。该参数不改变 llmConfigId、权限校验、上下文窗口或备用 LLM 配置切换策略 |
| temperature | body | double | 否 | 临时覆盖本次采样温度,取值范围为 [0, 2]。值越低输出越稳定,值越高输出越发散。 |
| maxTokens / max_tokens / max_completion_tokens | body | int | 否 | 临时覆盖本次输出 token 上限;也会影响上下文组装时预留的输出预算。三个参数等价,建议只传一个。 |
| topP / top_p | body | double | 否 | 临时覆盖 nucleus sampling 参数,取值范围为 (0, 1]。值越小输出越收敛。两个参数等价,建议只传一个。 |
| stop | body | string / string[] | 否 | 临时设置本次停止序列;生成内容命中任一序列时停止。 |
| extensions | body | object | 否 | 直接透传到模型服务提供方的参数。 |
| assemblyConfig | body | object | 否 | 手动组装配置,由应用层控制上下文构成。仅在需要手动组装时设置该参数。assemblyConfig 的内部结构参考下方表格。 |
assemblyConfig 结构:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| systemPrompt | string | 否 | 自定义系统提示词,覆盖 Agent 默认的系统提示词。 |
| contextBlocks | ContextBlock[] | 否 | 自定义上下文块列表,按 position 插入组装管线。详情参考见下方 ContextBlock 结构与手动组装流程。 |
| tools | ToolDefinition[] | 否 | 应用层工具定义列表,使用 OpenAI function calling 格式。 |
| activeSkillNames | string[] | 否 | 本次请求主动加载的技能名称列表。只用于显式注入这些技能的详细指令,不表示模型自主选择的技能,也不维护渐进式加载状态;后续是否继续加载由调用方决定。 |
| excludeSkillNames | string[] | 否 | 排除的技能名称列表。 |
| noSkillCatalog | bool | 否 | 是否跳过技能目录自动注入,默认值为 false。 |
ToolResult 结构:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| toolCallId / tool_call_id | string | 是 | 工具调用 ID,需与上一轮 assistant 返回的 toolCalls[].id
一致。 |
| content | string | 否 | 工具执行结果的文本内容。 |
ContextBlock 结构:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 是 | 块标识符,仅用于校验和调试,不注入提示词。 |
| content | string | 是 | 注入的文本内容。 |
| position | string | 否 | 文本插入位置,可选值为 after_system、before_history(默认值)、before_current_turn。 |
ContentPart 支持以下内容块:
文本块结构:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| type | string | 是 | 固定为 text。 |
| text | string | 是 | 文本内容,必须为非空字符串。 |
图片块结构:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| type | string | 是 | 推荐使用 image_url;兼容值为 image。 |
| image_url | object | 条件必填 | type=image_url 时使用,用于传入图片的 Data URL,结构为
{"url":"{Data URL}"}。 |
| url | string | 条件必填 | type=image 时使用,值为图片 Data URL。 |
附件引用块结构:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| type | string | 是 | 固定为 attachment。 |
| attachmentId | string | 是 | 附件 ID;附件必须属于当前 session 且已经完成上传。 |
-
图片地址只支持
data:<mimeType>;base64,<data>Data URL,不支持直接发送 HTTP/HTTPS URL 或本地路径。调用方也可以先上传图片,再通过attachmentId引用。 -
使用 content 时,文本也必须放在 text 块中,不能同时传 message。
示例:
{
"sessionId": "sess_xxx",
"stream": false,
"content": [
{"type": "text", "text": "请描述图片内容,并识别图片中的文字"},
{
"type": "image_url",
"image_url": {"url": "data:image/png;base64,iVBORw0KGgo..."}
}
]
}
自动组装
以下步骤由 DolphinX 在后台完成,调用方只需提交本轮 message 或 toolResults。
- 校验会话权限,并解析本次要使用的 LLM 配置。
- 加载 Agent 配置、系统提示词、技能目录、显式加载的技能详细指令和相关记忆。
- 必要时执行自动摘要。
- 通过上下文窗口检查后,将当前轮输入写入会话并调用 LLM。
- 将模型输出和 token 消耗写入会话,并返回本次响应。
手动组装
- after_system 的 block 会顺序追加到前一条系统提示词末尾;若本次组装没有系统提示词,after_system 会转化为首条
role=system消息。 - before_history 会包装成应用参考上下文,插入到 latest summary 之后、raw history 之前。
- before_current_turn 会包装成应用运行时上下文并折叠进当前轮 message。
- after_system 用于全局规则,before_history 用于本轮参考资料,before_current_turn 用于需要贴近当前轮的运行时状态或动态快照。
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/chat/completions" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_chat_completions" \
-d '{"sessionId":"sess_001","message":"你好,请介绍一下 DolphinX。","stream":false}'
响应示例
自动组装和手动组装的响应 data 结构一致。stream=false 时该结构作为 HTTP JSON envelope 的 data 返回;stream=true 时完整结果在 STREAM_END.data 返回。
reasoning 表示 LLM 提供商返回的可展示思考过程,只用于展示,不保证完整或等价于模型内部推理;DolphinX 只在 includeReasoning=true 时提取并返回,不必持久化存储。
{
"requestId": "req_xxx",
"sessionId": "sess_001",
"model": "gpt-4",
"llmConfigId": "llm_actual",
"content": "这是 LLM 的回复...",
"reasoning": "LLM 提供商返回的可展示思考过程;未开启或未返回时为空",
"toolCalls": [
{
"id": "call_xxx",
"type": "function",
"function": {
"name": "search_database",
"arguments": "{\"query\":\"SELECT ...\"}"
}
}
],
"finishReason": "stop",
"usage": {
"promptTokens": 1200,
"completionTokens": 300,
"totalTokens": 1500
},
"latencyMs": 2500,
"metadata": {
"llmConfigId": "llm_actual",
"requestedLlmConfigId": "llm_requested",
"fallbackApplied": false
}
}
- 流式响应中,
STREAM_CHUNK.data.content是正文增量,toolCallDeltas是工具调用增量;增量可能不完整,只用于实时展示。执行工具、入库或业务判断以STREAM_END.data.toolCalls为准。 STREAM_REASONING.data.reasoning只在includeReasoning=true且 LLM 提供商返回可展示思考过程时出现。- metadata 记录本次实际使用的 LLM 配置。
fallbackApplied=true表示首选 LLM 配置调用失败后,DolphinX 改用了备用 LLM 配置;此时会额外返回 fallbackFromLlmConfigId(原配置 ID)、fallbackReason(失败原因)和 fallbackStatusCode(失败状态码)。 context.compaction事件只在contextEvent=true且本次请求实际触发上下文压缩时返回,可能出现在 STREAM_START 之前;普通 HTTP JSON 响应会忽略 contextEvent。
服务端根据请求中的 sessionId 解析对应 Agent 和用户,在调用 LLM Provider 前检查 Token 预算。如果预算不足,会在调用 Provider 前返回错误:
{
"error": {
"code": "BUS_LLM_QUOTA_EXCEEDED",
"message": "LLM_TOKEN_BUDGET_EXCEEDED: agent token budget exceeded: agentId=agent_xxx, projectedTokens=4096, remainingTokens=1024"
}
}
- 预算不足时不会调用 LLM Provider,因此不会增加 LLM usage。
- Agent 总预算和 LLM 配置预算都配置时,先检查 Agent 总预算,再检查当前 llmConfigId 的配置预算。
5. 技能管理
5.1 获取 Agent 的技能目录
获取指定 Agent 下当前用户可见、可由 LLM 发现的技能摘要。调用 /chat/completions 时,DolphinX 默认会将技能目录注入上下文,调用方通常无需手动调用本接口。本接口主要用于预览、调试或自定义上下文组装。手动组装模式下可通过 assemblyConfig.noSkillCatalog=true 关闭自动注入。
请求方法和地址
GET /agent-bus/v1/skill/{agentId}/catalog
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| agentId | path | string | 是 | Agent ID。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/skill/${agentId}/catalog" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_skill_catalog"
响应示例
响应字段说明参考 SkillInfo。
{
"agentId": "agent_builtin_3f9e3c9d-1b10-4d12-9d4a-xxx",
"userId": "admin",
"catalog":
[
{
"skillId": "sk_6d9fbb7a-9597-7a97-ed4b-a5cccea178a1",
"name": "ddb-ml",
"description": "DolphinDB Web 侧机器学习数据工作流单技能。用于元数据发现、数据预览、过滤、聚合、join、字段角色推断、数据清洗、特征工程、分类、回归和聚类任务;不覆盖调查报告、时序报告或数据库管理。",
"argumentHint": ""
},
...
],"size": 4
}
5.2 获取技能主指令
返回指定技能的主指令内容。
请求方法和地址
GET /agent-bus/v1/skill/{skillId}/instruction
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| skillId | path | string | 是 | 技能 ID。 |
| agentId | query | string | 是 | Agent ID。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/skill/${skillId}/instruction?agentId=agent_xxx" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_skill_instruction"
响应示例
{
"skillId": "skill_xxx",
"name": "search-database",
"description": "Search distributed tables",
"instruction": "完整的 Skill 主指令 Markdown 内容..."
}
5.3 列出技能包文件
返回技能包内文件清单,只包含文件元信息,不返回文件内容。
请求方法和地址
GET /agent-bus/v1/skill/{skillId}/files/list
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| skillId | path | string | 是 | 技能 ID。 |
| agentId | query | string | 是 | Agent ID。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/skill/${skillId}/files/list?agentId=agent_xxx" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_skill_files_list"
响应示例
{
"skillId": "skill_xxx",
"items": [
{
"skillId": "skill_xxx",
"filePath": "references/model-selection-guide.md",
"size": 2048,
"isText": true,
"lineCount": 80
}
],
"size": 1
}
响应字段说明
- filePath:技能包文件相对于根目录的路径。
- isText:表示服务端是否按文本文件处理;非文本文件读取时会返回完整原始内容的 base64 编码。
5.4 获取技能包单个文件
获取技能包内指定文件的内容。
请求方法和地址
GET /agent-bus/v1/skill/{skillId}/files/get
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| skillId | path | string | 是 | 技能 ID。 |
| agentId | query | string | 是 | Agent ID。 |
| filePath | query | string | 是 | 技能包文件相对于根目录的路径。 |
| lineStart | query | int | 否 | 文本文件 1-based 起始行;默认值为 0,表示读取完整文件。 |
| lineLimit | query | int | 否 | 读取行数;默认值为 120,最大值为 300。 |
| raw | body | bool | 否 | 兼容参数;响应中的 content 始终为原始文件内容的 base64 编码。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/skill/${skillId}/files/get?agentId=agent_xxx&filePath=references/model-selection-guide.md&lineStart=1&lineLimit=120" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_skill_files_get"
响应示例
{
"skillId": "skill_xxx",
"filePath": "references/model-selection-guide.md",
"isText": true,
"lineCount": 42,
"raw": false,
"lineStart": 1,
"lineEnd": 42,
"encoding": "base64",
"content": "<base64 内容>",
"size": 1024
}
- 文本文件指定 lineStart / lineLimit 时,只返回对应行范围。
- 非文本文件不支持按行读取,始终返回完整原始内容。
- 大文件建议使用分段读取控制响应大小。
5.5 检索技能包文本文件
在技能包文本文件中按字符串查找内容。该接口适合工具按需读取,避免将全量文件装配进上下文。
请求方法和地址
POST /agent-bus/v1/skill/{skillId}/files/search
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| skillId | path | string | 是 | 技能 ID。 |
| agentId | body | string | 是 | Agent ID。 |
| query | body | string | 条件必填 | 搜索单个字符串,1 到 1024 字节。query、all、any 必须且只能提供一个。 |
| all | body | string[] | 条件必填 | 多个字符串全部匹配才命中。最多 5 个,每个 1 到 1024 字节。 |
| any | body | string[] | 条件必填 | 多个字符串中,任意一个匹配即命中。最多 5 个,每个 1 到 1024 字节。 |
| scope | body | string | 否 | 匹配粒度,可选值: file(整个文件)或 line(单行),默认值为 file。 |
| caseSensitive | body | bool | 否 | 是否大小写敏感,默认值为 false。 |
| filePaths | body | string[] | 否 | 限定搜索的技能包内相对路径列表。 |
| extensions | body | string[] | 否 | 限定文件后缀,如 [".md", ".json"]。 |
| contextLines | body | int | 否 | 每个命中行前后的上下文行数,默认值为 3,最大值为 10。 |
| maxResults | body | int | 否 | 命中总数安全阈值,默认值为 1000,最大值为 5000。 |
| maxPerFile | body | int | 否 | 单个文件命中数安全阈值,默认值为 200,最大值为 1000。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/skill/${skillId}/files/search" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_skill_files_search" \
-d '{"agentId":"agent_xxx","query":"DolphinDB","scope":"line","contextLines":2,"maxResults":20}'
响应示例
{
"skillId": "skill_xxx",
"terms": ["RSI"],
"mode": "query",
"scope": "file",
"resultCount": 1,
"skippedCount": 0,
"matches": [
{
"skillId": "skill_xxx",
"filePath": "refs/indicators/rsi.json",
"size": 668,
"isText": true,
"lineCount": 24,
"line": 3,
"column": 12,
"term": "RSI",
"text": "\"name\": \"RSI\"",
"before": ["{"],
"after": [" \"period\": 14"]
}
],
"skipped": []
}
- 用于在技能包文本文件中按字符串查找内容,适合工具按需读取,避免将全量文件装配进上下文。
- 仅检索文本文件;非文本文件或超过可检索大小上限的文本文件会出现在 skipped 中,reason 可能为 non_text 或 too_large。
- 搜索词按字面量子串匹配,不拆词、不支持 regex、不打分;大小写由 caseSensitive 控制。
scope=file按整文件判断是否满足条件,例如all=["foo","bar"]只要求同一文件内同时出现;响应仍返回实际命中的行。scope=line按单行判断是否满足条件,例如all=["foo","bar"]要求同一行内同时出现。- 结果按技能包文件顺序和行号稳定返回,不做相关性排序。
- 命中数量超过 maxResults 或 maxPerFile 时返回错误,不返回部分结果;调用方应使用更精确的pattern做查找。
5.6 批量获取技能包文件
批量获取技能包内指定文件的内容。
请求方法和地址
POST /agent-bus/v1/skill/{skillId}/files/batchGet
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| skillId | path | string | 是 | 技能 ID。 |
| agentId | body | string | 是 | Agent ID。 |
| filePaths | body | string / string[] | 是 | 相对于技能包根目录的文件路径。传单个字符串时按一个文件处理;传空数组返回空列表。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/skill/${skillId}/files/batchGet" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_skill_files_batch_get" \
-d '{"agentId":"agent_xxx","filePaths":["SKILL.md","reference.md"]}'
响应示例
{
"skillId": "skill_xxx",
"items": [
{
"skillId": "skill_xxx",
"filePath": "SKILL.md",
"encoding": "base64",
"content": "<base64 内容>",
"size": 2048
}
],
"size": 1
}
6. 知识库访问
6.1 列举知识库
列举与指定 Agent 绑定的活跃知识库。
请求方法和地址
POST /agent-bus/v1/knowledge/available
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | body | string | 条件必填 | 会话 ID。未指定 agentId 时,必须指定 sessionId。 |
| agentId | body | string | 条件必填 | Agent ID。未指定 sessionId 时,必须指定 agentId。 |
同时指定 sessionId 和 agentId 时,sessionId 所属的 Agent 必须与 agentId 对应的 Agent 一致。
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/knowledge/available" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: knowledge_available" \
-d "{
\"agentId\": \"${agentId}\",
\"sessionId\": \"${sessionId}\"
}"
响应示例
items 数组中每个元素都对应一个知识库,每个元素包含以下三个字段:
-
knowledgeBaseId:知识库 ID,用于后续
retrieve和read接口 -
name:知识库名称
-
description:知识库描述
{
"items": [
{
"knowledgeBaseId": "kb_c0566aa1-e175-5ba6-ef4f-ff93ae4cbb0d",
"name": "产品手册",
"description": "测试"
}
]
}
6.2 检索知识库
根据指定内容检索知识库。一次请求仅能检索一个知识库;需要跨库检索时,可先调用 available 接口,再分别调用多次
retrieve 接口并自行编排结果。
请求方法和地址
POST /agent-bus/v1/knowledge/retrieve
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | body | string | 条件必填 | 会话 ID。未指定 agentId 时,必须指定 sessionId。 |
| agentId | body | string | 条件必填 | Agent ID。未指定 sessionId 时,必须指定 agentId。 |
| knowledgeBaseId | body | string | 是 | 知识库 ID。知识库必须是与目标 Agent 绑定的活跃知识库。 |
| query | body | string | 是 | 待检索的内容,去除首尾空白后必须是非空字符串;原始 UTF-8 最大 16 KiB。 |
同时指定 sessionId 和 agentId 时,sessionId 所属的 Agent 必须与 agentId 对应的 Agent 一致。
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/knowledge/retrieve" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: knowledge_retrieve" \
-d "{
\"agentId\": \"${agentId}\",
\"knowledgeBaseId\": \"${knowledgeBaseId}\",
\"query\": \"测试\"
}"
响应示例
items 数组中每一个元素为知识库中与检索内容匹配的 chunk 信息,字段说明请参考 ChunkInfo;如果 items 为空,表示知识库中无相关内容。
{
"retrievalId": "ret_ea36ee47-073e-caa0-4847-d64b5536f6d6",
"resultStatus": "OK",
"items": [
{
"chunkId": "chk_249b86f3bbea9c810625581497941915",
"content": "# 测试附件上传",
"source": {
"documentId": "doc_5eeaa1fb2afd07d21110cbfa45c141cf",
"fileName": "README.md",
"pageNo": null
}
},
{
"chunkId": "chk_e033d9d3a223caa93c668e8a32ee86e7",
"content": "这是一份 md 文件,文件大小很小,用于上传测试。",
"source": {
"documentId": "doc_5eeaa1fb2afd07d21110cbfa45c141cf",
"fileName": "README.md",
"pageNo": null
}
}
]
}
6.3 读取 chunk 及相邻内容
根据指定 chunkId 读取该 chunk 及相邻 chunk 的信息。
仅查询知识库当前生效的索引,且目标文档必须仍处于 ACTIVE 状态。索引更新后,旧 chunkId 可能失效;如需再次查询,应重新调用
retrieve 获取最新结果,不建议将 chunkId 作为长期引用缓存。
请求方法和地址
POST /agent-bus/v1/knowledge/read
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | body | string | 条件必填 | 会话 ID。未指定 agentId 时,必须指定 sessionId。 |
| agentId | body | string | 条件必填 | Agent ID。未指定 sessionId 时,必须指定 agentId。 |
| knowledgeBaseId | body | string | 是 | 知识库 ID。知识库必须是与目标 Agent 绑定的活跃知识库。 |
| chunkId | body | string | 是 | Chunk ID。通过 retrieve 接口获取 |
| before | body | int | 否 | 返回指定 chunk 前 n 个 chunk 的信息;取值范围为 [0, 5],默认值为 0。 |
| after | body | int | 否 | 返回指定 chunk 后 n 个 chunk 的信息;取值范围为 [0, 5],默认值为 0。 |
同时指定 sessionId 和 agentId 时,sessionId 所属的 Agent 必须与 agentId 对应的 Agent 一致。
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/knowledge/read" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: knowledge_read" \
-d "{
\"agentId\": \"${agentId}\",
\"knowledgeBaseId\": \"${knowledgeBaseId}\",
\"chunkId\": \"${chunkId}\",
\"before\": 1,
\"after\": 1
}"
响应示例
item 是指定 chunk 的信息;before 和 after 数组中的元素是指定 chunk 相邻前后的 chunk 信息,其元素结构与 item 相同,字段说明请参考 ChunkInfo。
{
"item": {
"chunkId": "chk_249b86f3bbea9c810625581497941915",
"content": "# 测试附件上传",
"source": {
"documentId": "doc_5eeaa1fb2afd07d21110cbfa45c141cf",
"fileName": "README.md",
"pageNo": null
}
},
"before": [],
"after": [
{
"chunkId": "chk_e033d9d3a223caa93c668e8a32ee86e7",
"content": "这是一份 md 文件,文件大小很小,用于上传测试。",
"source": {
"documentId": "doc_5eeaa1fb2afd07d21110cbfa45c141cf",
"fileName": "README.md",
"pageNo": null
}
}
]
}
7. Workspace 管理
Workspace 是面向 Agent 的会话级临时文本文件区。它用于保存中间代码、脚本和局部修改结果,避免模型在对话中反复全量输出文件内容。
通用约束
- Workspace 由 sessionId 定位,当前用户必须是该会话的创建者。
- 文件在单个会话 Workspace 内平铺,不支持子目录。name 只能是普通文件名,不能包含
/、\、..,不能以.开头。 read/search/write/replace只面向 UTF-8 文本文件。- 单 workspace 默认限制为 100 个文件、5 MiB 总大小、512 KiB 单文件大小;其中总大小由部署参数 maxAgentWorkspaceBytes 控制。读取和搜索有服务端保护上限。
Workspace 文件 hash
Workspace 中的 hash 值是读 Workspace 文件时 DolphinX 侧返回的字段,Agent 在进行文件修改操作时需要带着此 hash 值,用于确保待修改的文件和之前读取时是一样的(防止陈旧读)。
格式:
xxh64:<16位hex>:<size>
- 调用
workspace.replace修改文件时,必须把上次从同一文件的workspace.read、workspace.search、workspace.write或workspace.replace拿到的 hash 放入请求体。 - 服务端执行
workspace.replace前会重新读取当前文件并计算 hash;如果请求中的 hash 与当前文件 hash 不一致,请求会被拒绝,错误为 REPLACE_REJECTED、error.reason="stale_file"。客户端应重新read或search后再生成替换请求。
可获得和使用 hash 的接口:
| 接口 | 是否返回 hash | 如何使用 |
|---|---|---|
| workspace.read | 是,响应字段 hash | 表示被读取文件的完整内容摘要,可直接作为后续
workspace.replace.hash。 |
| workspace.search | 是,每个 matches[].hash |
表示对应 matches[].name 文件的完整内容摘要,可作为修改该文件时的
workspace.replace.hash。 |
| workspace.write | 是,响应字段 hash | 表示写入后的完整文件摘要,可作为后续
workspace.replace.hash。 |
| workspace.replace | 请求必须携带 hash;成功响应返回新 hash | 请求中的 hash 用于陈旧读检测;响应中的新 hash 应用于后续继续修改同一文件。 |
7.1 列出 Workspace 文件
列出当前会话 Workspace 根目录下的普通文件。
请求方法和地址
GET /agent-bus/v1/workspace/{sessionId}/files
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/workspace/sess_001/files" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_workspace_list"
响应示例
{
"items": [
{
"name": "main.dos",
"type": "file",
"size": 2048,
"updateTime": "2026-05-21T10:00:00.000"
}
],
"size": 1
}
7.2 读取 Workspace 文件
读取指定 Workspace 文件的内容。
请求方法和地址
GET /agent-bus/v1/workspace/{sessionId}/file
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| name | query | string | 是 | 文件名,不支持路径。 |
| startLine | query | int | 否 | 起始行,1-based;缺省从第 1 行开始。 |
| endLine | query | int | 否 | 结束行,闭区间;缺省读到文件尾。 |
请求示例
curl -X GET "${BASE_URL}/agent-bus/v1/workspace/sess_001/file?name=main.dos&startLine=1&endLine=120" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_workspace_read"
响应示例
{
"name": "main.dos",
"content": "def main(){\n return 1\n}\n",
"size": 1024,
"lineCount": 42,
"startLine": 1,
"endLine": 3,
"hash": "xxh64:4f9a2c18b7e301d2:1024"
}
- size 是完整文件字节数,lineCount 是完整文件行数。
- 请参考本小节开头关于 hash 的说明。
- 构造
workspace.replace.replacements[].old时,应从本接口返回的 content 中精确复制旧片段;多行替换或换行敏感修改应优先使用workspace.read获取足够上下文。
7.3 写入 Workspace 文件
创建文件或整体写入文件。小范围修改优先使用 workspace.replace。
请求方法和地址
POST /agent-bus/v1/workspace/{sessionId}/file
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| name | body | string | 是 | 文件名,不支持路径。 |
| content | body | string | 是 | UTF-8 文本内容。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/workspace/${sessionId}/file" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_workspace_write" \
-d '{"name":"main.dos","content":"def main(){\n return 1\n}\n"}'
响应示例
{
"name": "main.dos",
"created": true,
"changed": true,
"size": 31,
"hash": "xxh64:4f9a2c18b7e301d2:31"
}
7.4 删除 Workspace 文件
删除当前会话 Workspace 内的指定文件。不支持目录删除、递归删除、批量删除、通配符删除或清空 Workspace。
请求方法和地址
DELETE /agent-bus/v1/workspace/{sessionId}/file
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| name | body | string | 是 | 文件名,不支持路径。 |
请求示例
curl -X DELETE "${BASE_URL}/agent-bus/v1/workspace/${sessionId}/file" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_workspace_delete" \
-d '{"name":"main.dos"}'
响应示例
{
"name": "main.dos",
"deleted": true,
"size": 2048
}
7.5 搜索 Workspace 文件
在 Workspace 文本文件中按字符串定位内容。该接口适合工具按需读取。
请求方法和地址
POST /agent-bus/v1/workspace/{sessionId}/search
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| query | body | string | 条件必填 | 搜索单个字符串,1 到 1024 字节。query、all、any 必须且只能提供一个。 |
| all | body | string[] | 条件必填 | 多个字符串全部匹配才命中。最多 5 个,每个 1 到 1024 字节。 |
| any | body | string[] | 条件必填 | 多个字符串任意一个匹配即命中。最多 5 个,每个 1 到 1024 字节。 |
| scope | body | string | 否 | 匹配粒度,可选值: file(整个文件)或 line(单行),默认值为 file。 |
| caseSensitive | body | bool | 否 | 是否大小写敏感,默认值为 false。 |
| names | body | string[] | 否 | 限定搜索的文件名列表。 |
| extensions | body | string[] | 否 | 限定文件后缀,如 [".dos", ".md"]。 |
| contextLines | body | int | 否 | 每个命中行前后的上下文行数,默认值为 0,最大值为 10。 |
| maxResults | body | int | 否 | 命中总数安全阈值,默认值为 1000,最大值为 5000。 |
| maxPerFile | body | int | 否 | 单个文件命中数安全阈值,默认值为 200,最大值为 1000。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/workspace/${sessionId}/search" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_workspace_search" \
-d '{"query":"submitOrder","scope":"line","contextLines":1,"maxResults":20}'
响应示例
{
"terms": ["submitOrder", "RSI"],
"mode": "all",
"scope": "file",
"resultCount": 1,
"skippedCount": 0,
"matches": [
{
"name": "main.dos",
"hash": "xxh64:4f9a2c18b7e301d2:1024",
"line": 37,
"column": 12,
"term": "submitOrder",
"text": "submitOrder(account, symbol, qty)",
"before": ["if(rsi < 30){"],
"after": ["}"]
}
],
"skipped": []
}
- 用于在 Workspace 文本文件中按字符串定位内容,适合工具按需读取。
- 仅检索 UTF-8 文本文件;超过单文件大小上限或非 UTF-8 文件会出现在 skipped 中,reason 可能为 too_large 或 invalid_utf8。
- 搜索词按字面量子串匹配,不拆词、不支持 regex、不打分;大小写由 caseSensitive 控制。
scope=file按整文件判断是否满足条件,例如all=["foo","bar"]只要求同一文件内同时出现;响应仍返回实际命中的行。scope=line按单行判断是否满足条件,例如all=["foo","bar"]要求同一行内同时出现。- 命中数量超过 maxResults 或 maxPerFile 时返回错误,不返回部分结果;调用方应缩小范围后重试。
- 请参考本小节开头关于hash的说明。
workspace.search适合定位文件和行号;搜索返回的 text、before、after 是按行组织的上下文。需要构造多行或换行敏感的 old 片段时,应再调用workspace.read读取目标行附近内容。
7.6 局部修改 Workspace 文件
使用精确旧片段对 Workspace 文件进行局部替换。请求必须携带文件 hash,用于陈旧读检测。
请求方法和地址
POST /agent-bus/v1/workspace/{sessionId}/replace
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| name | body | string | 是 | 要修改的已有文件名,不支持路径。 |
| hash | body | string | 是 | 文件 hash,格式如
xxh64:<16位hex>:<size>。 |
| replacements | body | object[] | 是 | 有序替换列表,不能为空。 |
| replacements[].old | body | string | 是 | 精确旧片段,不能为空。 |
| replacements[].new | body | string | 是 | 新片段,可以为空字符串;空字符串表示删除旧片段。 |
| replacements[].replaceAll | body | bool | 否 | 是否替换所有匹配,默认值为 false。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/workspace/${sessionId}/replace" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_workspace_replace" \
-d '{"name":"main.dos","hash":"xxh64:<hash>:<size>","replacements":[{"old":"return 1","new":"return 2"}]}'
响应示例
{
"name": "main.dos",
"changed": true,
"lineCount": 3,
"replacementCount": 2,
"occurrenceCount": 5,
"hash": "xxh64:7c1d0b2a9910ef43:1048"
}
- 多条 replacement 按数组顺序应用。如果有多条 replacement,第二条会在第一条替换后的内容里执行。所以如果第一条生成了某些新文本,第二条也可能匹配到这些新文本。
replaceAll=false时,old 必须恰好出现一次;0 次或多次都拒绝。replaceAll=true时,old 必须至少出现一次,服务端替换所有非重叠匹配。- 任意一条 replacement 失败时,整个请求失败且原文件保持不变。
8. 发起外部网络请求
通过 DolphinX 访问外部 HTTP(S) 资源。DolphinX 负责安全校验、限流、发起请求和返回原始 HTTP 响应摘要;页面解析、检索排序、重定向处理等逻辑由应用层负责。
请求方法和地址
POST /agent-bus/v1/network/fetch
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| agentId | body | string | 条件必填 | Agent ID。 |
| method | body | string | 是 | 仅支持 "GET" 和 "POST",大小写不敏感。 |
| url | body | string | 是 | 完整的 http:// 或 https:// URL。目前仅允许访问 dolphindb.cn、dolphindb.com 及其子域名,按域名边界匹配。仅允许默认端口:HTTP 80、HTTPS 443;不跟随 3xx 重定向。URL 不允许包含空格、控制字符、fragment、userinfo 或 IP literal host。 |
| headers | body | object | 否 | 透传到目标站点的请求头,值必须为标量字符串。请求头会做安全过滤;禁止设置 Host、Content-Length、Transfer-Encoding、Connection、认证/Cookie/代理相关头、Accept-Encoding 以及 hop-by-hop 头。DolphinX 固定使用 Accept-Encoding: identity。 |
| body | body | string | 否 | POST 请求体。GET 请求不允许携带 body。
|
| timeoutMs | body | int | 否 | 请求超时时间,默认值为 10000,最大值为 30000。 |
| maxBodyBytes | body | long | 否 |
响应 body 最大读取字节数,默认值为 2097152,最大值为 33554432。 body 被截断时 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/network/fetch" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_network_fetch" \
-d '{"agentId":"agent_xxx","method":"GET","url":"https://docs.dolphindb.cn/zh/","timeoutMs":10000,"maxBodyBytes":1048576}'
响应示例
响应字段说明参考 NetworkFetchResponse。
{
"url": "https://docs.dolphindb.cn/zh/tutorials/in_memory_table.html",
"method": "GET",
"statusCode": 200,
"statusText": "OK",
"headers": {
"content-type": "text/html; charset=utf-8"
},
"contentType": "text/html; charset=utf-8",
"contentEncoding": "",
"body": "<!doctype html>...",
"truncated": false,
"bodyOmitted": false,
"bodyUtf8Sanitized": false,
"latencyMs": 321
}
9. 调用 MCP 工具
执行 /chat/completions 返回的 MCP tool call。
请求方法和地址
POST /agent-bus/v1/mcp/tools/call
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | body | string | 是 | 会话 ID,必须属于当前登录用户;DolphinX 从会话解析所属 Agent。 |
| toolName / name | body | string | 是 | 要执行的 MCP 合成工具名,通常来自上一轮
toolCalls[].function.name。 |
| arguments | body | object | 否 | 工具参数 JSON object;未传时使用空对象。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/mcp/tools/call" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_mcp_tools_call" \
-d '{"sessionId":"sess_001","toolName":"mcp_server_tool_name","arguments":{"query":"DolphinDB"}}'
响应示例
响应字段说明参考 McpToolCallResult。
{
"ok": true,
"isError": false,
"truncated": false,
"content": [
{
"type": "text",
"text": "..."
}
]
}
- 本接口只负责执行已绑定 MCP Server 中的 tools,不用于配置 MCP Server 或绑定关系;配置类能力由 DolphinX 管控系统维护,不作为外部开发者 API 发布。
- toolName 是 DolphinX 生成的合成工具名,用于避免不同 MCP Server 的工具名冲突。应用侧通常直接使用 LLM 返回的
toolCalls[].function.name,不需要解析该名称。 - 当 MCP Server 返回工具级错误时,接口仍可能返回
ok=false或isError=true的业务结果;调用方应将响应内容作为 tool result 回填给模型,由模型继续处理。
10. 生成会话摘要
DolphinX 会在 chat.completions 上下文过长时自动做上下文压缩。该接口仅用于需要手动压缩的场景。
请求方法和地址
POST /agent-bus/v1/session/{sessionId}/summary
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| instructions | body | string | 否 | 额外的摘要指令,追加到摘要 prompt 中。 |
| llmConfigId | body | string | 否 | 本次摘要优先使用的 LLM 配置 ID。 |
| force | body | bool | 否 | 是否强制生成,默认值为 false。为 true 时最新 summary 之后的全部 raw 历史纳入本次摘要。 |
| metadata | body | object | 否 | 自定义元数据,JSON 格式。DolphinX 只负责透传。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/session/${sessionId}/summary" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_session_summary" \
-d '{"force":false,"instructions":"请保留本轮会话中的数据库路径、表名和关键结论。"}'
响应示例
响应字段说明参考 SummaryResult。
{
"sessionId": "sess_001",
"generated": true,
"reason": "",
"trigger": "manual",
"summaryUpToSeqNum": 50,
"messageId": "msg_xxx",
"sequenceNum": 51,
"role": "system",
"contentType": "summary",
"content": "摘要内容...",
"metadata": {
"summaryUpToSeqNum": 50,
"trigger": "manual"
}
}
11. 预览上下文
预览上下文组装结果但不调用 LLM。可用于检查 token 预算分配、确认技能和记忆是否正确注入。
请求方法和地址
POST /agent-bus/v1/context/preview
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | body | string | 是 | 会话 ID,必须属于当前登录用户可读范围。 |
| message | body | string | 条件必填 | 用户消息文本;与 content 互斥。 |
| content | body | ContentPart[] | 条件必填 | 多模态用户消息内容块;与 message 互斥。 |
| toolResults | body | ToolResult[] | 条件必填 | 工具执行结果列表,必须对应上一轮 assistant 返回的 toolCalls;可单独提交,也可与一种用户消息输入(message / content)同时提交。 |
| tools | body | ToolDefinition[] | 否 | 工具定义列表。存在 assemblyConfig 时请改放到
assemblyConfig.tools。 |
| activeSkillNames | body | string[] | 否 | 本次主动加载的技能名称。存在 assemblyConfig 时请改放到
assemblyConfig.activeSkillNames。 |
| llmConfigId | body | string | 否 | 用于解析上下文窗口和 token 预算的 LLM 配置 ID。 |
| assemblyConfig | body | object | 否 | 手动组装配置,结构同 Chat Completions 的手动组装模式。 |
| maxTokens / max_tokens / max_completion_tokens | body | int | 否 | 输出 token 预留预算;三个字段等价,建议只传一个。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/context/preview" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_context_preview" \
-d '{"sessionId":"sess_001","message":"请预览这轮请求会组装哪些上下文。","maxTokens":1024}'
响应示例
{
"agentId": "agent_001",
"sessionId": "sess_001",
"assemblyMode": "auto",
"messages": [
{
"role": "system",
"content": "..."
},
{
"role": "user",
"content": "当前问题"
}
],
"tools": [],
"estimatedTokens": 4200,
"detail": {
"assemblyMode": "auto",
"historyMode": "summary-first",
"memoriesIncluded": 2,
"messagesIncluded": 8,
"skillsInCatalog": 3,
"activeInstructions": 1,
"toolsIncluded": 2,
"summaryIncluded": true,
"summaryUpToSeqNum": 40,
"historyFromSeq": 41,
"historyToSeq": 48
},
"tokenBreakdown": {
"systemPrompt": 200,
"skillCatalog": 300,
"skillInstructions": 600,
"memoryContext": 300,
"summaryMessage": 120,
"historyMessages": 2200,
"externalContext": 0,
"userMessage": 50,
"toolDefinitions": 430
}
}
detail 字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
| assemblyMode | string | "auto" 或 "manual"。 |
| memoriesIncluded | int | 实际注入到上下文中的记忆条数。 |
| messagesIncluded | int | 实际包含的历史消息条数。 |
| skillsInCatalog | int | 技能目录中包含的技能数。 |
| activeInstructions | int | 已加载的技能详细指令数。 |
| toolsIncluded | int | 工具定义数量。 |
| historyMode | string | 历史组装模式,固定为 "summary-first"。 |
| summaryIncluded | bool | 本次是否注入了 latest summary。 |
| summaryUpToSeqNum | long | 本次使用的 latest summary 覆盖边界;未使用 summary 时为 0。 |
| historyFromSeq | long | raw tail 起始序列号。 |
| historyToSeq | long | raw tail 结束序列号。 |
tokenBreakdown 字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
| systemPrompt | int | 系统提示词估算 token 数。 |
| skillCatalog | int | 技能目录估算 token 数。 |
| skillInstructions | int | 技能详细指令估算 token 数。 |
| memoryContext | int | 记忆内容估算 token 数。 |
| summaryMessage | int | latest summary 估算 token 数。 |
| historyMessages | int | 历史消息估算 token 数。 |
| externalContext | int | contextBlocks 等外部上下文估算 token 数。 |
| userMessage | int | 当前用户消息估算 token 数;若本轮仅提供 toolResults 则为 0。 |
| toolDefinitions | int | 工具定义估算 token 数。 |
12. 底层接口
12.1 LLM Complete(直接调用 LLM)
绕过上下文组装,直接发送消息给 LLM。适用于应用自行与 LLM 交互的场景。
请求方法和地址
POST /agent-bus/v1/llm/complete
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| agentId | body | string | 条件必填 | Agent ID。 |
| sessionId | body | string | 否 | 会话 ID。 |
| messages | body | LLMMessage[] | 是 | 完整的消息列表,由应用层自行构建,直接发送给 LLM。详情参考见下方 LLMMessage 结构。 |
| tools | body | ToolDefinition[] | 否 | 工具定义列表,使用 OpenAI function calling 格式。 |
| model | body | string | 否 | 临时设置本次请求的模型名。 |
| stream | body | bool | 否 | 是否流式返回,默认值为 true。 |
| includeReasoning | body | bool | 否 | 是否返回思考过程,默认值为 false。 |
| llmConfigId | body | string | 否 | LLM 配置 ID。 |
| requestId | body | string | 否 | 请求追踪 ID,不指定时自动生成。 |
| temperature | body | double | 否 | 临时覆盖本次采样温度,范围为 [0, 2]。值越低输出越稳定,值越高输出越发散。 |
| maxTokens / max_tokens / max_completion_tokens | body | int | 否 | 临时覆盖本次输出 token 上限。三个字段等价,建议只传一个。 |
| topP / top_p | body | double | 否 | 临时覆盖 nucleus sampling 参数,范围为 (0, 1]。值越小输出越收敛。两个参数等价,建议只传一个。 |
| stop | body | string / string[] | 否 | 临时设置本次停止序列。生成内容命中任一序列时停止。可传字符串或字符串数组。 |
| persistMessage | body | bool | 否 | 仅在指定 sessionId 时有效;为 true 时把模型回复追加到该会话。 |
| extensions | body | object | 否 | 直接透传到模型服务提供方的参数。 |
LLMMessage 结构:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| role | string | 是 | 消息角色。有效值如下:
|
| content | string / ContentPart[] | 条件必填 | 纯文本字符串或内容块数组;content 和 tool_calls 至少提供一个。有关
ContentPart 的字段说明请参考 chat/completions
接口。 |
| tool_calls | ToolCall[] | 条件必填 | assistant 发起的工具调用列表;回传历史工具调用时,将响应中的 toolCalls 放入此字段;content 和 tool_calls 至少提供一个。 |
| toolCallId / tool_call_id | string | 条件必填 | role=tool 时必填,关联 assistant 消息中对应的
tool_calls[].id |
| reasoning | string | 否 | 回传历史 assistant 消息中的 reasoning 文本。 |
请求示例
curl -X POST "${BASE_URL}/agent-bus/v1/llm/complete" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_llm_complete" \
-d '{"agentId":"agent_xxx","messages":[{"role":"user","content":"你好,请用一句话介绍 DolphinX。"}],"stream":false}'
响应示例
响应结构同 Chat Completions 响应。
{
"requestId": "req_xxx",
"sessionId": "sess_001",
"model": "gpt-4",
"llmConfigId": "llm_actual",
"content": "这是 LLM 的回复...",
"reasoning": "",
"toolCalls": [],
"finishReason": "stop",
"usage": {
"promptTokens": 1200,
"completionTokens": 300,
"totalTokens": 1500
},
"latencyMs": 2500,
"metadata": {
"llmConfigId": "llm_actual",
"requestedLlmConfigId": "llm_requested",
"fallbackApplied": false
}
}
服务端根据请求中的 agentId 或 sessionId 解析对应 Agent 和用户,在调用 LLM Provider 前检查 Token 预算。如果预算不足,会在调用 Provider 前返回错误:
{
"error": {
"code": "BUS_LLM_QUOTA_EXCEEDED",
"message": "LLM_TOKEN_BUDGET_EXCEEDED: model token budget exceeded: agentId=agent_xxx, llmConfigId=llm_xxx, projectedTokens=4096, remainingTokens=1024"
}
}
预算不足时不会调用 LLM Provider,因此不会增加 LLM usage。
12.2 获取消息列表
获取指定会话的消息列表。
请求方法和地址
GET /agent-bus/v1/session/{sessionId}/messages
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| sessionId | path | string | 是 | 会话 ID。 |
| startSeq | query | long | 否 | 起始消息序列号,默认值为 1。 |
| endSeq | query | long | 否 | 结束消息序列号,默认不限制结束序列号。 |
| limit | query | int | 否 | 最多返回的消息条数,必须和 from 参数一同指定;默认不限制消息条数。 |
| from | query | string | 否 | 指定提取消息的位置,必须和 limit 参数一同指定,有效值如下:
|
请求示例
例 1:获取序列号 1-100 之内的消息
curl -X GET "${BASE_URL}/agent-bus/v1/session/sess_001/messages?startSeq=1&endSeq=100" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_session_messages"
例 2:获取最新的 50 条消息
curl -X GET "${BASE_URL}/agent-bus/v1/session/${sessionId}/messages?limit=50&from=tail" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_session_messages"
例 3:从第 100 条消息开始往前获取 50 条消息
curl -X GET "${BASE_URL}/agent-bus/v1/session/${sessionId}/messages?endSeq=100&limit=50&from=tail" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_session_messages"
例 4:从第 150 条消息开始往后获取 50 条消息
curl -X GET "${BASE_URL}/agent-bus/v1/session/${sessionId}/messages?startSeq=150&limit=50&from=front" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-H "x-request-id: req_session_messages"
响应示例
响应字段说明参考 MessageInfo。
{
"sessionId": "sess_001",
"items": [
{
"messageId": "msg_xxx",
"sessionId": "sess_001",
"agentId": "agent_xxx",
"sequenceNum": 1,
"role": "user",
"contentType": "text",
"content": "你好",
"metadata": {},
"createTime": "2026.06.30 10:54:22.665"
}
],
"size": 1
}
