MemoryPanel 接口文档

August 25, 2026 · View on GitHub

服务:MemoryPanel(管控面板),端口 8125


1. 公共约定

1.1 Base URL 与端口

Base URL/api/v1/health 除外)
端口8125
方法GET /healthGET /api/v1/meta/instances 外,其余全部为 POST(RPC 风格)
Content-Typeapplication/json

1.2 鉴权

绝大多数业务接口依赖以下 Header(由中间件 validatePanelMetaHeaders 校验):

Header必填说明
x-tdai-service-id实例 ID,用于定位目标内核网关(instanceRegistry.resolve
x-tdai-user-key是*当前用户 key,用于内核侧 auth/verify 反查 caller 身份
x-request-id透传到响应信封 request_id,用于日志关联

* 例外:POST /meta/auth/verify(免 user-key,因为它本身就是验 key 的);POST /knowledge/status-callback(S2S 回调,无浏览器 header);GET /healthGET /meta/instances(无鉴权)。

1.3 响应信封

所有业务接口统一返回:

{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": { }
}
字段类型说明
codenumber0 成功;非 0 失败
messagestring成功固定 "ok";失败为大写下划线错误枚举(稳定契约,前端按此分支)
request_idstring请求 ID,来自 x-request-id 或服务端生成
dataany业务数据;失败时为 null

例外:GET /healthGET /meta/instances 不返回信封,直接返回裸 JSON(见 §3.1)。

1.4 HTTP 状态映射

HTTP status = envelope.code 的映射规则:

envelope.codeHTTP status
0200
400 ~ 599code
其余502

1.5 分页约定

  • 内核 list 接口默认 DEFAULT_PAGINATION = { limit: 20 }前端直接调 meta/* 的 list action 若不传 limit,只返回前 20 条
  • Panel 层聚合/业务接口(如 chat-memory/*knowledge/*/team-assets)内部已用分页拉全量,无需前端翻页。
  • task/list-with-agentslimit 上限 200;不传时内核按默认 20 条返回,但响应 limit 字段回显 50(已知不一致,见 §3.5)。

1.6 幂等约定

  • 知识类 create 接口(wiki/createcode-graph/create)靠同名/同资源幂等复用:重复创建返回已有资源,而非报错。
  • 创建类 meta/* action(user/createteam/createagent/createtask/create)在 Panel 层先查重,重名返回 409 中文提示。

1.7 请求 ID 链路

x-request-id(可选)→ 透传进信封 request_id → 转发内核时也携带,用于跨服务日志关联。


2. 接口目录

方法路径说明
GET/health健康检查(无鉴权,裸 JSON)
GET/api/v1/meta/instances实例列表(无鉴权,裸 JSON)
POST/api/v1/meta/*元数据透明代理(53 个 action,见 §3.2)
POST/api/v1/skill/*Skill 数据面透明代理(15 个 action,见 §3.3)
POST/api/v1/chat-memory/team-assets团队记忆资产列表
POST/api/v1/chat-memory/agent-fixed指定 Agent 的固定资产记忆
POST/api/v1/chat-memory/my-agents我的 Agent 记忆(一 agent 一块)
POST/api/v1/chat-memory/mine我 owner 的记忆资产列表
POST/api/v1/chat-memory/create创建独立记忆资产(mem-xxx)
POST/api/v1/chat-memory/import导入历史对话到 Agent 的 L0
POST/api/v1/chat-memory/patch-scope改记忆可见性(team ↔ private)
POST/api/v1/chat-memory/set-agent-fixed批量设置 Agent 固定记忆
POST/api/v1/chat-memory/allocate分配(借入)记忆到 Agent
POST/api/v1/chat-memory/unbind从 Agent 解绑记忆
POST/api/v1/chat-memory/layerL0/L1/L2/L3 分层懒加载
POST/api/v1/chat-memory/clear一键清空记忆内容(保留资产)
POST/api/v1/chat-memory/layer-delete分层批量删除(L0/L1)
POST/api/v1/chat-memory/layer-update分层编辑(L1/L2/L3)
POST/api/v1/chat-memory/search分层关键词检索(L0/L1)
POST/api/v1/task/list-with-agentsTask 列表聚合(含 linked agents)
POST/api/v1/agent-overview/bootstrapAgent 概览引导数据聚合
POST/api/v1/agent/delete-cascade删除 Agent(级联清 skill 后 archive)
POST/api/v1/knowledge/wiki/*Wiki 知识库业务路由(14 个,见 §3.8)
POST/api/v1/knowledge/code-graph/*Code-Graph 业务路由(8 个,见 §3.9)
POST/api/v1/knowledge/allocate知识分配/授权(5 个,见 §3.10)
POST/api/v1/knowledge/status-callbackKS 状态回调(S2S)
POST/api/v1/knowledge/{type}/team-assets团队知识资产池(2 个,见 §3.12)

3. 接口明细

3.1 健康检查与实例

GET /health

健康检查。无鉴权,无请求体,返回裸 JSON(非信封)

响应

{ "status": "ok" }

GET /api/v1/meta/instances

返回实例列表。无鉴权,无请求体,返回裸 JSON(非信封)

响应

{
  "instances": [
    {
      "instance_id": "inst_1",
      "name": "测试实例",
      "gateway_endpoint": "https://memory.ap-beijing.tencenttdai.com"
    }
  ]
}
字段类型说明
instancesobject[]实例公开信息列表(instanceRegistry.listPublic()api_key 是 secret 不下发
instances[].instance_idstring实例 ID
instances[].namestring实例名称
instances[].gateway_endpointstringPanel → Kernel 转发地址(非 secret,前端用于拼接客户端接入地址)
instances[].proxy_endpointstring?可选,客户端接入 baseUrl;未配置则前端回落 gateway_endpoint

3.2 元数据透明代理

POST /meta/*

{ action, ...payload } 转发到内核 /v3/meta/{action},信封原样透传。这是 Panel 对内核元数据面(user/team/agent/task/asset/acl 等)的统一入口。

鉴权x-tdai-service-id + x-tdai-user-key(仅 auth/verify 免 user-key)。

转发语义

  • 请求体整体透传给内核对应 action;响应信封原样返回。
  • 路径最后一段即 action 名(如 POST /meta/agent/list → 内核 agent/list)。
  • 白名单之外 action 返回 404 UNKNOWN_META_ACTIONagent-fixed-asset/* 返回 501 NOT_IN_SCOPE(该类操作由 Panel 业务路由内部直调,见 §3.4/§3.10)。

开放 action 清单(53 条)

实体action
usercreate、create-with-key、get、delete、list
user-keycreate、list、get、revoke、update
teamcreate、get、update、delete、list
team-memberadd、remove、list、get
agentcreate、get、update、delete、list、archive、set-default-template、get-default-template
taskcreate、get、update、delete、list、archive
task-agentlink、unlink、list
participation-logappend、list
assetcreate、get、update、delete、list、list-accessible、touch-usage
aclgrant、revoke、list、check
authverify
instance-quotaget
config/userget、set

未开放(501 NOT_IN_SCOPEagent-fixed-asset/setagent-fixed-asset/listagent-fixed-asset/list-with-detailagent-fixed-asset/summary-by-agents

Panel 层特殊处理(不纯透传)

action行为
user/createuser/create-with-keyteam/createagent/createtask/create先按 name/username/title 查重,重名返回 409 中文提示
agent/set-default-template不转发内核,Panel 本地写模板文件;需 system_admin 权限,否则 403 permission_denied;缺 team_id/template 返回 400 INVALID_PARAM
agent/get-default-template不转发内核,Panel 本地读模板文件
team-member/add成功后异步为默认 Agent 复制模板资产(best-effort)
user/list隐藏内部 knowledge-service 计费用户

示例agent/create):

// 请求
POST /api/v1/meta/agent/create
{ "team_id": "t_1", "owner_user_id": "u_1", "name": "发版助手" }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": { "agent_id": "agt_xxx", "name": "发版助手" }
}

3.3 Skill 数据面透明代理

POST /skill/*

{ action, ...payload } 转发到内核 /v3/skill/{action},信封原样透传。

鉴权x-tdai-service-id + x-tdai-user-key(强制,skill 需要 owner 身份)。

/meta/* 的差异

  • Skill 数据面有独立存储(skill_id 前缀 skl-):团队内可读、owner agent 可写。
  • 身份字段(user_id / team_id / agent_id / task_id)放 body,不放 Header。
  • 分页用嵌套 pagination.{limit, offset},body 原样透传。

开放 action 清单(15 条)

action说明
create创建 skill
update全量更新
patch局部更新
delete删除
get单查
list分页列表
search检索
versions版本列表
files/write写文件
files/remove删文件
files/read读文件
listing目录列举
extract抽取
export导出
conversation/add对话追加(skill 抽取主链路,2026-08 新增进白名单)

错误:未知 action 返回 404 UNKNOWN_SKILL_ACTION

示例list):

// 请求
POST /api/v1/skill/list
{
  "user_id": "u_1",
  "team_id": "t_1",
  "filters": { "status": ["active"] },
  "pagination": { "limit": 50, "offset": 0 }
}

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": {
    "items": [ { "skill_id": "skl_1", "name": "code-review", "owner_agent_id": "agt_1" } ],
    "total": 1
  }
}

3.4 Chat-Memory

记忆块(MemoryBlock)出参统一结构:

字段类型说明
idstring资产 ID(chat_memory-{team}-{agent} 或自建 mem-xxx
titlestring块标题
summarystring摘要(当前为占位文本)
uploaded_by_user_idstringowner 用户 ID
updated_at_msnumber更新时间(ms epoch)
layer_countsobject{ L0_messages, L1, L2, L3 }(当前为占位全 0)
scopestringteam / private
agent_idstring关联 agent(部分接口返回)

POST /chat-memory/team-assets

团队已共享的记忆资产列表(visibility=team,不区分 owner)。注意:此接口返回的 MemoryBlock 不含 scope 字段(团队资产 tab 语义上均为已共享)。

请求体

字段类型必填说明
team_idstring团队 ID

响应 data

字段类型说明
itemsMemoryBlock[]团队共享记忆块(不含 scope
totalnumber总数

示例

// 请求
{ "team_id": "t_1" }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": {
    "items": [ { "id": "chat_memory-t_1-agt_1", "title": "发版助手", "summary": "0 条 L1 · 0 条 L2 · 0 条 L3" } ],
    "total": 1
  }
}

POST /chat-memory/agent-fixed

指定 Agent 名下 chat_memory 类型的固定资产绑定列表。仅 Agent owner 可见

请求体

字段类型必填说明
agent_idstringAgent ID

响应 data{ items: MemoryBlock[], total },其中每条含 scopeteam/private)供前端灰化"已被 owner 设私密"的条目。

错误MISSING_AGENT_IDINVALID_USER_KEYAGENT_NOT_FOUNDNOT_YOUR_AGENT

POST /chat-memory/my-agents

"我的资产分配" tab:返回我 owner 的所有 Agent,每个 Agent 对应一块记忆(block.id = chat_memory-{team}-{agent})。

请求体{ team_id: string }

响应 data{ items: MemoryBlock[], total },每条含 agent_idscope(来自该 agent 自有记忆的 visibility)。

错误MISSING_TEAM_IDINVALID_USER_KEY

POST /chat-memory/mine

我(owner)名下的记忆资产列表。

请求体{ team_id: string }

响应 data{ items: MemoryBlock[], total }

错误MISSING_TEAM_IDINVALID_USER_KEY

POST /chat-memory/create

创建独立记忆资产(UserAsset,mem-xxx)。

请求体

字段类型必填说明
team_idstring团队 ID
titlestring标题,≤ 200 字符
scopestringteam(默认)/ private
descriptionstring描述

响应 dataMemoryBlockid 为新建 mem-xxx)。

错误MISSING_TEAM_IDINVALID_TITLEINVALID_USER_KEY

示例

// 请求
{ "team_id": "t_1", "title": "产品需求笔记", "scope": "team" }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": { "id": "mem_xxx", "title": "产品需求笔记", "scope": "team" }
}

POST /chat-memory/import

导入历史对话到 Agent 记忆池的 L0(走数据面 /v3/conversation/add,不新建资产)。

请求体

字段类型必填说明
team_idstring团队 ID
agent_idstring目标 Agent
messagesobject[][{ role, content, ts? }],≤ 100 条
session_idstring会话 ID,缺省自动生成 imported-{ts}

响应 data

字段类型说明
importedboolean固定 true
block_idstringchat_memory-{team}-{agent}
session_idstring实际 session
accepted_countnumber成功写入条数

错误MISSING_TEAM_IDMISSING_AGENT_IDMISSING_MESSAGESTOO_MANY_MESSAGESNO_VALID_MESSAGESAGENT_NOT_FOUNDAGENT_NOT_IN_TEAMNOT_YOUR_AGENT

示例

// 请求
{
  "team_id": "t_1",
  "agent_id": "agt_1",
  "messages": [ { "role": "user", "content": "帮我看看这个 bug" } ]
}

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": { "imported": true, "block_id": "chat_memory-t_1-agt_1", "accepted_count": 1 }
}

POST /chat-memory/patch-scope

修改记忆可见性(team ↔ private)。

请求体{ block_id: string, scope: "team" | "private" }

响应 data{ updated: true, id, scope }

错误MISSING_BLOCK_IDINVALID_SCOPEBLOCK_NOT_FOUNDNOT_CHAT_MEMORY

POST /chat-memory/set-agent-fixed

批量设置 Agent 的固定记忆(原子校验 + 单次全量 set)。

请求体

字段类型必填说明
agent_idstring目标 Agent
team_idstring团队 ID
block_idsstring[]要绑定的记忆块 ID(含自身 chat_memory-{team}-{agent}

响应 data{ updated: true, agent_id, block_ids }

错误MISSING_AGENT_IDMISSING_TEAM_IDIMPORT_LIMIT_EXCEEDEDAGENT_NOT_FOUNDAGENT_NOT_IN_TEAMNOT_YOUR_AGENTBLOCK_NOT_FOUNDNOT_CHAT_MEMORYTEAM_MISMATCHASSET_NOT_SHARED

POST /chat-memory/allocate

把一块共享记忆分配(借入)到指定 Agent。含"借入 ≤ 2 条"校验。

请求体

字段类型必填说明
block_idstring记忆块 ID
agent_idstring目标 Agent
team_idstring团队 ID

响应 data{ allocated: true, agent_id, block_id }

错误MISSING_BLOCK_IDMISSING_AGENT_IDMISSING_TEAM_IDBLOCK_NOT_FOUNDNOT_CHAT_MEMORYTEAM_MISMATCHAGENT_NOT_FOUNDAGENT_NOT_IN_TEAMNOT_YOUR_AGENTASSET_NOT_SHAREDIMPORT_LIMIT_EXCEEDED;重复分配返回 409 中文提示;把 agent 自己的 chat_memory-{team}-{agent} 再分配给自己返回 400 中文提示("不能把该 Agent 自己的记忆再分配给自己")。

示例

// 请求
{ "block_id": "chat_memory-t_1-agt_2", "agent_id": "agt_1", "team_id": "t_1" }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": { "allocated": true, "agent_id": "agt_1", "block_id": "chat_memory-t_1-agt_2" }
}

POST /chat-memory/unbind

从 Agent 解绑借入的记忆。

请求体{ block_id: string, agent_id: string, team_id: string }

响应 data{ unbound: true, agent_id, block_id }

错误MISSING_BLOCK_IDMISSING_AGENT_IDMISSING_TEAM_IDCANNOT_UNBIND_SELF_CHAT_MEMORYAGENT_NOT_FOUNDAGENT_NOT_IN_TEAMNOT_YOUR_AGENTBLOCK_NOT_FOUNDNOT_CHAT_MEMORYBINDING_NOT_FOUND

POST /chat-memory/layer

分层懒加载记忆内容。从 block_id 反解 team/agent 后调内核数据面。

请求体

字段类型必填说明
block_idstring记忆块 ID
layerstringL0 / L1 / L2 / L3
limitnumber合法值 (0, 200];不传、传 ≤0 或 >200 时回退 50(非 clamp,与 task/search 的 clamp 语义不同)
offsetnumber默认 0
before_tsstringL0 游标分页(ISO8601,翻页传上页最后一条时间)
time_startstring时间筛选起始(仅 L0/L1)
time_endstring时间筛选结束(仅 L0/L1)
pathstringL2 单条读取时指定文件路径

各层数据源:L0 → /v3/conversation/query;L1 → /v3/atomic/query;L2 → /v3/scenario/ls(列表)/ /v3/scenario/read(带 path);L3 → /v3/core/read

响应 data{ layer, items, total, limit, offset }items 每项结构:

字段类型说明
idstring条目 ID(L3 固定 "core"
titlestring标题(L0 为 role@session,L1 为类型,L2 为路径,L3 固定 "core memory"
rolestring?仅 L0 有:消息角色(user/assistant/tool 等)
bodystring内容
tagsstring[]标签
refsstring[]引用(当前恒空)
created_atstring时间(ISO)

读权限:owner / visibility=team / 已被 caller 名下 agent 借入,任一即可;否则 403 ASSET_NOT_ACCESSIBLE

错误MISSING_BLOCK_IDINVALID_LAYERBLOCK_NOT_FOUNDNOT_CHAT_MEMORYASSET_NOT_ACCESSIBLERANGE_TOO_LARGE(时间筛选范围过大,VDB 无法支撑)、LAYER_FETCH_ERROR

示例(L1)

// 请求
{ "block_id": "chat_memory-t_1-agt_1", "layer": "L1", "limit": 20, "offset": 0 }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": {
    "layer": "L1",
    "items": [ { "id": "rec_1", "title": "atomic", "body": "下周一发版", "tags": [], "refs": [] } ],
    "total": 1,
    "limit": 20,
    "offset": 0
  }
}

POST /chat-memory/clear

一键清空若干记忆的全部内容,保留资产本身(归属/绑定/ACL 不变)。仅资产 Owner

请求体{ memory_ids: string[] }(去重后 ≤ 100 条)。

响应:透传内核 /v3/chat-memory/clear 结果。

错误MISSING_MEMORY_IDSTOO_MANY_MEMORY_IDSBLOCK_NOT_FOUNDNOT_CHAT_MEMORYNOT_ASSET_OWNERCLEAR_FAILED

POST /chat-memory/layer-delete

L0/L1 列表批量删除。仅资产 Owner

请求体

字段类型必填说明
block_idstring记忆块 ID
layerstringL0 / L1
message_idsstring[]L0 用消息 ID,≤ 5000
session_idsstring[]L0 用会话 ID,≤ 100
idsstring[]L1 用记录 ID,≤ 5000

响应:透传内核 /v3/conversation/delete/v3/atomic/delete 结果(含 deleted_count)。

错误MISSING_BLOCK_IDINVALID_LAYERNOT_AGENT_MEMORYBLOCK_NOT_FOUNDNOT_CHAT_MEMORYNOT_ASSET_OWNERTOO_MANY_IDSMISSING_IDSLAYER_DELETE_FAILED

POST /chat-memory/layer-update

编辑单层记忆内容。仅资产 Owner

请求体

字段类型必填说明
block_idstring记忆块 ID
layerstringL1 / L2 / L3
idstringL1/L2 必填L1 记录主键 / L2 文件路径
contentstring新内容
summarystringL2 摘要

各层数据源:L1 → /v3/atomic/update;L2 → /v3/scenario/write(自动剥 META 头);L3 → /v3/core/write

响应:透传内核对应 write 接口结果。

错误MISSING_BLOCK_IDINVALID_LAYERMISSING_CONTENTMISSING_ITEM_IDNOT_AGENT_MEMORYBLOCK_NOT_FOUNDNOT_CHAT_MEMORYNOT_ASSET_OWNERLAYER_UPDATE_FAILED

POST /chat-memory/search

分层关键词检索(agent 维度跨 session 召回)。

请求体

字段类型必填说明
block_idstring记忆块 ID
layerstringL0 / L1,默认 L1
querystring检索词
limitnumber默认 30,上限 100
typestringL1 类型过滤

响应 data{ items, total }items 每项含 score(相关度);L1 的 id 可直接用于 layer-update

错误MISSING_BLOCK_IDMISSING_QUERYBLOCK_NOT_FOUNDNOT_CHAT_MEMORYASSET_NOT_ACCESSIBLESEARCH_FAILED

示例

// 请求
{ "block_id": "chat_memory-t_1-agt_1", "layer": "L1", "query": "发版" }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": {
    "items": [ { "id": "rec_1", "title": "atomic", "body": "下周一发版", "score": 0.92 } ],
    "total": 1
  }
}

3.5 Task

POST /task/list-with-agents

聚合 task/list + 批量 task-agent/list,一次返回 task 及其关联 agents,消除前端 N+1(否则需 2N+1 次请求)。

上游meta/task/listmeta/task-agent/list

请求体

字段类型必填默认说明
team_idstring团队 ID
limitnumber单页数量,上限 200。注意:不传 limit 时响应 limit 字段回显 50,但内核 task/list 实际按默认 20 条返回
offsetnumber0偏移
statusstring按状态过滤
titlestring标题过滤

响应 data

字段类型说明
itemsTaskWithAgents[]task 列表,每条含 agents 子数组
totalnumber总数
limitnumber本次实际 limit
offsetnumber本次实际 offset

TaskWithAgents:task 字段(task_idteam_idtitledescription?statussource_type?risk_level?created_atupdated_at)+ agents: TaskAgent[]agent_idtask_idteam_idstatuscreated_at)。

错误MISSING_TEAM_ID

示例

// 请求
{ "team_id": "t_1", "limit": 10 }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": {
    "items": [
      { "task_id": "tsk_1", "title": "灰度验证", "status": "active", "agents": [ { "agent_id": "agt_1" } ] }
    ],
    "total": 1,
    "limit": 10,
    "offset": 0
  }
}

3.6 Agent 概览

POST /agent-overview/bootstrap

聚合返回 Agent 概览页所需的全部资产引导数据(skill / code-graph / wiki / chat-memory 资产池 + 各 agent 挂载计数)。

上游meta/asset/list-accessible(4 类资产)、meta/agent/listskill/listmeta/agent-fixed-asset/summary-by-agents

请求体

字段类型必填说明
team_idstring团队 ID
agent_idsstring[]限定统计的 agent;缺省为 team 下全部 active agent

响应 data

字段类型说明
assets.skillsMountable[]团队共享 skill 资产
assets.codeGraphsMountable[]团队 code-graph 资产
assets.wikisMountable[]团队 wiki 资产
assets.chatMemoriesMountable[]团队共享记忆资产
countsobject{ [agent_id]: { skills, code_graph, llm_wiki, chat_memory } }(挂载计数)

Mountable{ key, title, group, slug, status }counts 标记为 @deprecated,内部已改用 summary-by-agents

错误MISSING_TEAM_IDINVALID_USER_KEYNOT_TEAM_MEMBER

示例

// 请求
{ "team_id": "t_1" }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": {
    "assets": { "skills": [], "codeGraphs": [], "wikis": [], "chatMemories": [] },
    "counts": { "agt_1": { "skills": 2, "code_graph": 1, "llm_wiki": 0, "chat_memory": 1 } }
  }
}

3.7 Agent 生命周期

POST /agent/delete-cascade

删除 Agent:先级联删除其名下所有 active skill,再调内核 agent/archive(archive 内部会顺手清 chat_memory)。

上游skill/listskill/deletemeta/agent/archive

请求体{ agent_id: string }

响应 data

字段类型说明
archivedboolean固定 true
agent_idstring被归档的 agent
deleted_skill_countnumber已删 skill 数
deleted_skill_idsstring[]已删 skill ID 列表

错误MISSING_AGENT_IDINVALID_USER_KEYAGENT_NOT_FOUNDNOT_YOUR_AGENT;任一 skill 删除失败返回 500 SKILL_DELETE_FAILED(含 failed_skill_iddeleted_skill_ids),此时 agent 不会 archive。

示例

// 请求
{ "agent_id": "agt_1" }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": { "archived": true, "agent_id": "agt_1", "deleted_skill_count": 2, "deleted_skill_ids": ["skl_1", "skl_2"] }
}

3.8 Knowledge - Wiki

门控约定:带 team_id 的端点(list/create/raw/write)要求 team 成员;id-only 端点(get/ingest/delete/graph/page/search/raw/ls 等)要求有效 caller + 读/写权限(requireKnowledgeRead)。 统一透传 KS(知识服务)/v3/wiki/*,信封由 Panel 组装。

POST /knowledge/wiki/list

@deprecated(面板 UI 已改用 team-assets/my-assets)。

请求体{ team_id: string, status?: string, limit?: number, offset?: number }

错误MISSING_TEAM_IDINVALID_USER_KEYNOT_TEAM_MEMBER

POST /knowledge/wiki/create

创建 Wiki 知识库,并幂等登记 meta_asset(asset_id = wiki_id)。

请求体{ team_id: string, name: string }

响应 data:KS wiki 详情(含 wiki_idservice_url 等)。

错误MISSING_TEAM_IDMISSING_NAMEINVALID_USER_KEYNOT_TEAM_MEMBER

示例

// 请求
{ "team_id": "t_1", "name": "团队 wiki" }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": { "wiki_id": "wiki_1", "name": "团队 wiki", "status": "processing" }
}

POST /knowledge/wiki/ingest

触发 Wiki 抽取(需 write 权限,空 wiki 拒绝)。

请求体{ wiki_id: string }

错误MISSING_WIKI_IDINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUNDWIKI_EMPTY_NO_SOURCES

POST /knowledge/wiki/get

查询 Wiki 详情(聚合 Panel 内存 ingest 进度到 progress 字段)。

请求体{ wiki_id: string }

响应 data:KS wiki 详情 + progress(ingest 进度)。

错误MISSING_WIKI_IDINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND

POST /knowledge/wiki/delete

删除 Wiki(三处:KS + 内核明细 + meta_asset 级联)。

请求体{ wiki_ids: string[] }

响应 data:KS delete 结果。

错误MISSING_WIKI_IDINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND

POST /knowledge/wiki/graph

查询 Wiki 知识图谱。

请求体{ wiki_id: string }

错误MISSING_WIKI_IDINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND

POST /knowledge/wiki/page/ls

列出 Wiki 页面。

请求体{ wiki_id: string }

错误MISSING_WIKI_IDINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND

POST /knowledge/wiki/page/read

读取指定页面。

请求体{ wiki_id: string, refs: string[] }

错误MISSING_WIKI_IDMISSING_REFSINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND

示例

// 请求
{ "wiki_id": "wiki_1", "refs": ["page/首页"] }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": { "pages": [ { "ref": "page/首页", "content": "..." } ] }
}

POST /knowledge/wiki/page/rm

删除页面(需 write 权限)。

请求体{ wiki_id: string, refs: string[] }

错误MISSING_WIKI_IDMISSING_REFSINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUNDMISSING_TEAM_ID

POST /knowledge/wiki/search

检索 Wiki。

请求体{ wiki_id: string, query: string, limit?: number }

错误MISSING_WIKI_IDMISSING_QUERYINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND

POST /knowledge/wiki/raw/ls

列出原始源文件。

请求体{ wiki_id: string }

错误MISSING_WIKI_IDINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND

POST /knowledge/wiki/raw/read

读取原始源文件内容。

请求体{ wiki_id: string, filenames: string[] }

错误MISSING_WIKI_IDMISSING_FILENAMESINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND

POST /knowledge/wiki/raw/rm

删除原始源文件(需 write 权限)。

请求体{ wiki_id: string, filenames: string[] }

错误MISSING_WIKI_IDMISSING_FILENAMESINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUNDMISSING_TEAM_ID

POST /knowledge/wiki/raw/write

上传源文件(team 门控 + 大小限制)。

请求体

字段类型必填说明
team_idstring团队 ID
wiki_idstringWiki ID
filesobject[][{ path, content, ... }],单文件 ≤ 512KB,单次 ≤ 10 个,总 ≤ 5MB

错误MISSING_TEAM_IDMISSING_WIKI_IDMISSING_FILESTOO_MANY_FILESFILE_TOO_LARGETOTAL_TOO_LARGEINVALID_USER_KEYNOT_TEAM_MEMBER


3.9 Knowledge - Code-Graph

POST /knowledge/code-graph/list

@deprecated(面板 UI 已改用 team-assets/my-assets)。

请求体{ team_id: string, status?: string, limit?: number, offset?: number }

错误MISSING_TEAM_IDINVALID_USER_KEYNOT_TEAM_MEMBER

POST /knowledge/code-graph/create

创建 Code-Graph(KS 创建后自动 build,meta 在 ready callback 时登记)。

请求体

字段类型必填说明
team_idstring团队 ID
repo_urlstring仓库地址
branchstring分支
repo_namestring仓库名

响应 data:KS code-graph 详情(含 code_graph_id)。

错误MISSING_TEAM_IDMISSING_REPO_URLINVALID_USER_KEYNOT_TEAM_MEMBER

示例

// 请求
{ "team_id": "t_1", "repo_url": "https://github.com/org/repo", "branch": "main" }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": { "code_graph_id": "cg_1", "repo_url": "https://github.com/org/repo", "status": "building" }
}

POST /knowledge/code-graph/register-meta

Code-Graph ready 后由 owner 登记 meta_asset(前端兜底路径,幂等)。

请求体{ team_id: string, code_graph_id: string }

响应 data{ registered: true, code_graph_id }

错误MISSING_TEAM_IDMISSING_CODE_GRAPH_IDINVALID_USER_KEYNOT_TEAM_MEMBERFORBIDDENKNOWLEDGE_NOT_FOUNDCODE_GRAPH_NOT_READYNOT_RESOURCE_OWNER

POST /knowledge/code-graph/get

查询 Code-Graph 详情(构建中无 meta 时 owner 可读)。

请求体{ code_graph_id: string }

错误MISSING_CODE_GRAPH_IDINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND

POST /knowledge/code-graph/sync

触发 Code-Graph 同步(需 write 权限)。

请求体{ code_graph_id: string }

错误MISSING_CODE_GRAPH_IDINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND

POST /knowledge/code-graph/delete

删除 Code-Graph(三处级联)。

请求体{ code_graph_ids: string[] }

错误MISSING_CODE_GRAPH_IDINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND

POST /knowledge/code-graph/search

Code-Graph 代码检索。

请求体{ code_graph_id: string, query: string, kind?: string, limit?: number }

响应 data:KS 返回的 { text, isError } 文本块。

错误MISSING_CODE_GRAPH_IDMISSING_QUERYINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND

示例

// 请求
{ "code_graph_id": "cg_1", "query": "用户登录逻辑" }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": { "text": "...", "isError": false }
}

POST /knowledge/code-graph/explore

Code-Graph 代码探索。

请求体{ code_graph_id: string, query: string, maxFiles?: number }

响应 data:KS 返回的 { text, isError } 文本块。

错误MISSING_CODE_GRAPH_IDMISSING_QUERYINVALID_USER_KEYFORBIDDENNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUND


3.10 Knowledge - 分配与授权

POST /knowledge/allocate

把 knowledge 资产绑定到 Agent(injection_mode = 'tool')。

请求体

字段类型必填说明
knowledge_idstring资产 ID(wiki_id / cg_id)
agent_idstring目标 Agent
team_idstring团队 ID

响应 data{ allocated: true, agent_id, knowledge_id }

错误MISSING_KNOWLEDGE_IDMISSING_AGENT_IDMISSING_TEAM_IDINVALID_USER_KEYNOT_TEAM_MEMBERKNOWLEDGE_NOT_FOUNDNOT_KNOWLEDGE_ASSETTEAM_MISMATCHAGENT_NOT_FOUNDAGENT_NOT_IN_TEAMALREADY_ALLOCATED

示例

// 请求
{ "knowledge_id": "wiki_1", "agent_id": "agt_1", "team_id": "t_1" }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": { "allocated": true, "agent_id": "agt_1", "knowledge_id": "wiki_1" }
}

POST /knowledge/unbind

从 Agent 解绑 knowledge 资产(仅 agent owner)。

请求体{ knowledge_id: string, agent_id: string }

响应 data{ unbound: true, agent_id, knowledge_id }

错误MISSING_KNOWLEDGE_IDMISSING_AGENT_IDINVALID_USER_KEYAGENT_NOT_FOUNDNOT_YOUR_AGENTBINDING_NOT_FOUND

POST /knowledge/agent-fixed

列出 Agent 绑定的 wiki/code_graph 固定资产。

请求体{ agent_id: string }

响应 data{ items: FixedAsset[], total },每条含 knowledge_idasset_typenamedescriptionstatusvisibilityagent_id

错误MISSING_AGENT_IDINVALID_USER_KEYAGENT_NOT_FOUNDNOT_TEAM_MEMBER

POST /knowledge/set-visibility

设置资产可见性(走 meta/asset/update,owner-only 由内核保证)。

请求体{ knowledge_id: string, visibility: string }private/team/restricted/agent/task

错误MISSING_KNOWLEDGE_IDINVALID_VISIBILITY

POST /knowledge/grant

给资产授权(走 meta/acl/grant,owner-only 由内核保证)。

请求体{ knowledge_id: string, subject_type: string, subject_id: string, permission: string }

错误MISSING_KNOWLEDGE_IDMISSING_GRANT_FIELDS


3.11 Knowledge - 状态回调

POST /knowledge/status-callback

KS → Panel 的 S2S 状态回调(ingest/sync 完成或进度更新)。无鉴权(S2S,无浏览器 header)。

请求体(两种形态):

① 终态回调(status = ready | failed):

字段类型必填说明
knowledge_idstring资源 ID
typestringwiki / code-graph
statusstringready / failed
summarystringready 时携带的摘要
service_idstring实例 ID(用于解析内核凭证)
sync_errorstringfailed 时的错误
run_idstringingest 代际

② 进度回调(event = ingest_progress):

字段类型必填说明
eventstringingest_progress
wiki_idstringWiki ID
progressobject{ phase, total, completed, failed, skipped, percent }

响应 datanullcode=0 固定 ack)。

语义ready 时 Panel 会写内核明细 entity_knowledge/v3/knowledge/create)并注册 meta_asset;failed 时不写。

示例

// 请求(终态 ready)
{
  "knowledge_id": "wiki_1",
  "type": "wiki",
  "status": "ready",
  "summary": "团队 wiki 摘要",
  "service_id": "inst_1"
}

// 响应
{ "code": 0, "message": "ok", "request_id": "", "data": null }

3.12 Knowledge - 团队资产

POST /knowledge/wiki/team-assets

团队 Wiki 资产池(meta list-accessible + KS get 补运营状态,并合并 KS 侧未注册 meta 的"创建中/失败"资源)。

请求体{ team_id: string }

响应 data{ items: KnowledgeAssetListItem[], total }

错误MISSING_TEAM_IDINVALID_USER_KEYNOT_TEAM_MEMBER

示例

// 请求
{ "team_id": "t_1" }

// 响应
{
  "code": 0,
  "message": "ok",
  "request_id": "abc-123",
  "data": {
    "items": [ { "knowledge_id": "wiki_1", "asset_type": "llm_wiki", "name": "团队 wiki", "status": "ready" } ],
    "total": 1
  }
}

POST /knowledge/code-graph/team-assets

团队 Code-Graph 资产池(结构同 wiki/team-assetsasset_type = code_graph)。

请求体{ team_id: string }

响应 data{ items, total }

错误MISSING_TEAM_IDINVALID_USER_KEYNOT_TEAM_MEMBER


4. 附录

4.1 废弃接口

接口状态替代
POST /knowledge/wiki/list@deprecatedPOST /knowledge/wiki/team-assets
POST /knowledge/code-graph/list@deprecatedPOST /knowledge/code-graph/team-assets
POST /agent-overview/bootstrapcounts 字段@deprecated内部改用 agent-fixed-asset/summary-by-agents

4.2 错误 message 枚举汇总

message 是稳定契约,前端按此分支;新增错误码需同步本表。

注意三类 message 格式例外(均为 Panel 组装、非纯枚举):

  1. 数据面失败类LAYER_FETCH_ERROR / CLEAR_FAILED / LAYER_DELETE_FAILED / LAYER_UPDATE_FAILED / SEARCH_FAILED):实际值为 "<CODE>: <err.message>"(带 : 详情 后缀),前端应 startsWith(CODE) 而非精确等值匹配。
  2. POST /knowledge/status-callback 的 400message 是小写英文句子("wiki_id and progress fields are required" / "knowledge_id, type, status are required"),非枚举。该接口是 S2S 回调,前端不直接消费,可忽略。
  3. 中文句子类respondControlError 直接塞中文,非枚举,startsWith(CODE) 也匹配不到):meta/* create 查重 409("已存在同名…请更换名称后重试")、chat-memory/allocate 重复分配 409("这条记忆已经分配给该 Agent")、自己分配自己 400("不能把该 Agent 自己的记忆再分配给自己")。前端需按 message 文案或 HTTP 状态兜底,不能按 CODE 枚举分支。

通用(Header / 鉴权 / 框架)

HTTPmessage说明
400MISSING_INSTANCE_IDx-tdai-service-id
400INVALID_INSTANCE实例不存在/无效
400MISSING_USER_KEYx-tdai-user-key
401INVALID_USER_KEYuser_key 无效(auth/verify 失败)
403NOT_TEAM_MEMBER非团队成员
403FORBIDDEN无资源访问权限
404KNOWLEDGE_NOT_FOUND知识资源不存在
500INTERNAL未捕获异常
502UPSTREAM_ERROR上游 KS 错误

Meta / Skill 代理

HTTPmessage说明
404UNKNOWN_META_ACTION未知 meta action
404UNKNOWN_SKILL_ACTION未知 skill action
501NOT_IN_SCOPEaction 未对面板开放(agent-fixed-asset/*)
403permission_denied非 system_admin 操作默认模板
400INVALID_PARAMagent/set-default-templateteam_id/template

Chat-Memory

HTTPmessage说明
400MISSING_TEAM_ID / MISSING_AGENT_ID / MISSING_BLOCK_ID / MISSING_QUERY缺必填字段
400INVALID_TITLE / INVALID_SCOPE / INVALID_LAYER参数非法
400MISSING_MESSAGES / TOO_MANY_MESSAGES / NO_VALID_MESSAGES导入消息非法
400MISSING_MEMORY_IDS / TOO_MANY_MEMORY_IDSclear 参数非法
400MISSING_IDS / TOO_MANY_IDS批量删除参数非法
400MISSING_CONTENT / MISSING_ITEM_IDlayer-update 参数非法
400NOT_CHAT_MEMORY / NOT_AGENT_MEMORY / TEAM_MISMATCH / AGENT_NOT_IN_TEAM资源类型/归属不符
400CANNOT_UNBIND_SELF_CHAT_MEMORY / IMPORT_LIMIT_EXCEEDED业务规则拦截
400RANGE_TOO_LARGE时间筛选范围过大(VDB 无法支撑)
403NOT_YOUR_AGENT / NOT_ASSET_OWNER / ASSET_NOT_SHARED / ASSET_NOT_ACCESSIBLE权限拒绝
404BLOCK_NOT_FOUND / AGENT_NOT_FOUND / BINDING_NOT_FOUND资源不存在
500LAYER_FETCH_ERROR / CLEAR_FAILED / LAYER_DELETE_FAILED / LAYER_UPDATE_FAILED / SEARCH_FAILED数据面异常

Knowledge

HTTPmessage说明
400MISSING_NAME / MISSING_WIKI_ID / MISSING_REFS / MISSING_FILENAMES / MISSING_FILES缺必填字段
400MISSING_CODE_GRAPH_ID / MISSING_REPO_URL / MISSING_QUERY缺必填字段
400MISSING_KNOWLEDGE_ID / MISSING_AGENT_ID / MISSING_GRANT_FIELDS缺必填字段
400NOT_KNOWLEDGE_ASSET / TEAM_MISMATCH / AGENT_NOT_IN_TEAM / INVALID_VISIBILITY资源类型/归属非法
400WIKI_EMPTY_NO_SOURCES空 wiki 禁止 ingest
403NOT_RESOURCE_OWNER / NOT_YOUR_AGENT权限拒绝
409ALREADY_ALLOCATED / CODE_GRAPH_NOT_READY状态冲突
404AGENT_NOT_FOUND / BINDING_NOT_FOUND资源不存在
413TOO_MANY_FILES / FILE_TOO_LARGE / TOTAL_TOO_LARGE上传超限

Agent / Task

HTTPmessage说明
400MISSING_AGENT_ID / MISSING_TEAM_ID缺必填字段
403NOT_YOUR_AGENT非 agent owner
404AGENT_NOT_FOUNDagent 不存在
500SKILL_DELETE_FAILED级联删除 skill 失败