Files
yawan f7fc992f57
Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
WeKnora deployment source with the reviewed wiki identity, summary and recovery fixes
2026-09-22 16:19:06 +08:00

401 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# API 参考:Agent、MCP 与技能
路由注册:`internal/router/router.go` 的 `RegisterCustomAgentRoutes`、`RegisterMCPServiceRoutes`、`RegisterSkillRoutes`、`RegisterUserFavoriteRoutes`。Handler:`internal/handler/custom_agent.go`、`internal/handler/mcp_service.go`、`internal/handler/mcp_credentials.go`、`internal/handler/mcp_oauth.go`、`internal/handler/skill_handler.go`、`internal/handler/user_resource_favorite.go`。
## Agent(/api/v1/agents)
读:Viewer+(API key `read_agents`/`manage_agents`/`chat`/full);写:创建者 OR Admin+(API key `manage_agents`/full);内置 Agent(`is_builtin=true`)始终 Admin+。
### GET /api/v1/agents/placeholders
用途:提示词占位符定义(须先于 `/:id` 注册)。权限:Viewer+。
响应:200 `{"success":true,"data":{"all":{...},"system_prompt":{...},"agent_system_prompt":{...},"context_template":{...},"rewrite_system_prompt":{...},"rewrite_prompt":{...},"fallback_prompt":{...}}}`
```bash
curl $BASE/api/v1/agents/placeholders -H "Authorization: Bearer $TOKEN"
```
### GET /api/v1/agents/type-presets
用途:智能推理 Agent 类型预设(rag-qa / wiki-qa / hybrid / custom 等)。权限:Viewer+。
响应:200 `{"success":true,"data":[{type,system_prompt,allowed_tools,kb_compatibility}]}`
```bash
curl $BASE/api/v1/agents/type-presets -H "Authorization: Bearer $TOKEN"
```
### POST /api/v1/agents
用途:创建自定义 Agent。权限:Contributor+。
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `name` | string | 是(`binding:"required"`) | 名称 |
| `description` | string | 否 | 描述 |
| `avatar` | string | 否 | 头像/emoji |
| `config` | object | 否 | Agent 配置(`types.CustomAgentConfig`,见下) |
`config` 主要字段:`agent_mode`(`quick-answer`/`smart-reasoning`)、`agent_type`(`rag-qa/wiki-qa/hybrid-rag-wiki/data-analysis/custom`)、`system_prompt`、`model_id`、`temperature`(0-2,非法返回 code 2103)、`max_iterations`(1-20,非法返回 code 2102)、`allowed_tools`(智能推理必填至少一个,code 2101)、`mcp_selection_mode`/`mcp_services`、`skills_selection_mode`、`kb_selection_mode`/`knowledge_bases`、`web_search_enabled`、`question_suggestions` 等(完整定义见 `internal/types/custom_agent.go`)。
响应:201 `{"success":true,"data":{id,name,description,avatar,is_builtin,created_by,config,creator_name,...}}`
```bash
curl -X POST $BASE/api/v1/agents -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"name":"售后助手","config":{"agent_mode":"quick-answer","kb_selection_mode":"selected","knowledge_bases":["kb-1"]}}'
```
### GET /api/v1/agents
用途:Agent 列表(含内置)。权限:Viewer+。查询参数:`creator`(`mine`/`others`,可选)。
响应:200 `{"success":true,"data":[Agent],"disabled_own_agent_ids":[...]}`
```bash
curl $BASE/api/v1/agents -H "X-API-Key: $API_KEY"
```
### GET /api/v1/agents/:id
用途:Agent 详情。权限:Viewer+。
响应:200 `{"success":true,"data":{Agent}}`
```bash
curl $BASE/api/v1/agents/agent-1 -H "Authorization: Bearer $TOKEN"
```
### PUT /api/v1/agents/:id
用途:更新 Agent。权限:创建者 OR Admin+。请求体:`name/description/avatar/config`(均可选)。
响应:200 `{"success":true,"data":{Agent}}`
```bash
curl -X PUT $BASE/api/v1/agents/agent-1 -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"description":"更新描述"}'
```
### DELETE /api/v1/agents/:id
用途:删除 Agent。权限:创建者 OR Admin+。
响应:200 `{"success":true,"message":"Agent deleted successfully"}`
```bash
curl -X DELETE $BASE/api/v1/agents/agent-1 -H "Authorization: Bearer $TOKEN"
```
### POST /api/v1/agents/:id/copy
用途:复制 Agent(副本归调用者)。权限:Contributor+。无请求体。
响应:201 `{"success":true,"data":{新 Agent}}`
```bash
curl -X POST $BASE/api/v1/agents/agent-1/copy -H "Authorization: Bearer $TOKEN"
```
### GET /api/v1/agents/:id/suggested-questions
用途:Agent 起始建议问题(注册在组外以避免与 `/agents/:id/shares` 冲突)。权限:Viewer+;API key `read_agents`/`manage_agents`/`chat`/full。
| 查询参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `knowledge_base_ids` | string | 否 | 逗号分隔 KB |
| `knowledge_ids` | string | 否 | 逗号分隔知识 ID |
| `tag_scopes` | string | 否 | JSON 数组的标签范围 |
| `limit` | int | 否 | 上限 30 |
响应:200 `{"success":true,"data":{"questions":[{question,source,knowledge_base_id}]}}`
```bash
curl "$BASE/api/v1/agents/agent-1/suggested-questions?limit=6" -H "X-API-Key: $API_KEY"
```
## MCP 服务(/api/v1/mcp-services)
空间级外部工具服务集成。读:Viewer+;写/测试/审批策略:Admin+。API key:`manage_mcp_services`/full。Handler: `internal/handler/mcp_service.go`
### POST /api/v1/mcp-services
用途:创建 MCP 服务。权限:Admin+。
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `name` | string | 是 | 名称 |
| `description` | string | 否 | 描述 |
| `enabled` | bool | 否 | 启用 |
| `transport_type` | string | 是 | `sse` / `http-streamable` / `stdio` |
| `url` | *string | 否 | 服务 URL(SSE/HTTP) |
| `headers` | map[string]string | 否 | HTTP 头 |
| `auth_config` | object | 否 | `auth_type`(`api_key/bearer/oauth`)、`api_key_header`、`custom_headers`、`scopes`、`auth_server_metadata_url`(密钥走 credentials 子资源) |
| `advanced_config` | object | 否 | 超时/重试 |
| `stdio_config` | object | 否 | stdio 命令与参数 |
| `env_vars` | map[string]string | 否 | 环境变量 |
响应:200 `{"success":true,"data":{MCPServiceResponse}}`(含 `credentials:{api_key:{configured},token:{configured}}`)
```bash
curl -X POST $BASE/api/v1/mcp-services -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"name":"github","transport_type":"sse","url":"https://mcp.example.com/sse"}'
```
### GET /api/v1/mcp-services
用途:MCP 服务列表。权限:Viewer+。响应:200 `{"success":true,"data":[MCPServiceResponse]}`
```bash
curl $BASE/api/v1/mcp-services -H "Authorization: Bearer $TOKEN"
```
### GET /api/v1/mcp-services/:id
用途:详情。权限:Viewer+。响应:200 `{"success":true,"data":{MCPServiceResponse}}`
```bash
curl $BASE/api/v1/mcp-services/mcp-1 -H "Authorization: Bearer $TOKEN"
```
### PUT /api/v1/mcp-services/:id
用途:部分更新(map 语义;`auth_config` 中不可携带 api_key/token)。权限:Admin+。字段同创建(均可选)。
响应:200 `{"success":true,"data":{MCPServiceResponse}}`
```bash
curl -X PUT $BASE/api/v1/mcp-services/mcp-1 -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"enabled":false}'
```
### DELETE /api/v1/mcp-services/:id
用途:删除。权限:Admin+。响应:200 `{"success":true,"message":"MCP service deleted successfully"}`
```bash
curl -X DELETE $BASE/api/v1/mcp-services/mcp-1 -H "Authorization: Bearer $TOKEN"
```
### POST /api/v1/mcp-services/:id/test
用途:连接测试(探测外部服务)。权限:Admin+。响应:200 `{"success":true,"data":{"success","message","oauth_required","tools":[...],"resources":[...]}}`
```bash
curl -X POST $BASE/api/v1/mcp-services/mcp-1/test -H "Authorization: Bearer $TOKEN"
```
### GET /api/v1/mcp-services/:id/tools
用途:工具列表。权限:Viewer+。响应:200 `{"success":true,"data":[{name,description,inputSchema,require_approval}]}`
```bash
curl $BASE/api/v1/mcp-services/mcp-1/tools -H "Authorization: Bearer $TOKEN"
```
### GET /api/v1/mcp-services/:id/resources
用途:资源列表。权限:Viewer+。响应:200 `{"success":true,"data":[{uri,name,description,mimeType}]}`
```bash
curl $BASE/api/v1/mcp-services/mcp-1/resources -H "Authorization: Bearer $TOKEN"
```
### PUT /api/v1/mcp-services/:id/credentials
用途:设置密钥(`api_key`/`token`,指针字段,省略保留)。权限:Admin+。Handler: `internal/handler/mcp_credentials.go`
响应:200 `{"success":true,"data":{"fields":{"api_key":{"configured"},"token":{"configured"}}}}`
```bash
curl -X PUT $BASE/api/v1/mcp-services/mcp-1/credentials -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"token":"ghp_..."}'
```
### DELETE /api/v1/mcp-services/:id/credentials/:field
用途:删除凭证字段(`api_key` 或 `token`)。权限:Admin+。响应:204。
```bash
curl -X DELETE $BASE/api/v1/mcp-services/mcp-1/credentials/token -H "Authorization: Bearer $TOKEN"
```
### GET /api/v1/mcp-services/:id/tool-approvals
用途:工具人工审批策略列表。权限:Viewer+。响应:200 `{"success":true,"data":[{service_id,tool_name,require_approval,...}]}`
```bash
curl $BASE/api/v1/mcp-services/mcp-1/tool-approvals -H "Authorization: Bearer $TOKEN"
```
### PUT /api/v1/mcp-services/:id/tool-approvals/:tool_name
用途:设置某工具是否需人工审批。权限:Admin+。请求体:`{"require_approval":true}`(必填)。
响应:200 `{"success":true}`
```bash
curl -X PUT $BASE/api/v1/mcp-services/mcp-1/tool-approvals/create_issue \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' -d '{"require_approval":true}'
```
## MCP OAuth
Handler: `internal/handler/mcp_oauth.go`
### GET /api/v1/mcp-oauth/callback
用途:第三方 OAuth 授权回调(免认证,靠单次 `state` 参数认证;注册在 `/mcp-services` 组之外)。查询参数:`code`、`state`、`error`。
响应:302 重定向到前端(成功 `#mcp_oauth_result=success`,失败 `#mcp_oauth_error=<code>`)。
```bash
curl -i "$BASE/api/v1/mcp-oauth/callback?code=xxx&state=yyy"
```
### POST /api/v1/mcp-services/:id/oauth/authorize-url
用途:生成用户级授权 URL。权限:Viewer+。
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `redirect_uri` | string | 是 | 后端回调 URL(绝对地址) |
| `frontend_redirect` | string | 否 | 回调后前端跳转(默认 `/`) |
响应:200 `{"success":true,"data":{"authorization_url","authorization_attempt"}}`
```bash
curl -X POST $BASE/api/v1/mcp-services/mcp-1/oauth/authorize-url -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"redirect_uri":"'$BASE'/api/v1/mcp-oauth/callback"}'
```
### GET /api/v1/mcp-services/:id/oauth/status
用途:查询本人授权状态。权限:Viewer+。查询参数:`authorization_attempt`(可选)。
响应:200 `{"success":true,"data":{"authorized","state":"authorized|pending","refresh_available","expires_at"}}`
```bash
curl $BASE/api/v1/mcp-services/mcp-1/oauth/status -H "Authorization: Bearer $TOKEN"
```
### DELETE /api/v1/mcp-services/:id/oauth/token
用途:吊销本人 OAuth token。权限:Viewer+。响应:204。
```bash
curl -X DELETE $BASE/api/v1/mcp-services/mcp-1/oauth/token -H "Authorization: Bearer $TOKEN"
```
## Agent 运行时交互(/api/v1/agent)
对话中的人工审批与 OAuth 恢复;权限均 Viewer+(发起会话的人才有上下文),API key 默认拒绝。
### POST /api/v1/agent/tool-approvals/:pending_id
用途:裁决待审批的工具调用。Handler: `internal/handler/mcp_service.go` 的 `ResolveToolApproval`。
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `decision` | string | 是(`binding:"required"`) | `approve` / `reject` |
| `modified_args` | JSON | 否 | 修改后的工具参数 |
| `reason` | string | 否 | 理由 |
响应:200 `{"success":true}`
```bash
curl -X POST $BASE/api/v1/agent/tool-approvals/p-1 -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"decision":"approve"}'
```
### POST /api/v1/agent/mcp-oauth-resolutions/:pending_id
用途:恢复因 MCP OAuth 暂停的 Agent 运行。Handler: `internal/handler/mcp_oauth.go`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `service_id` | string | 是(`binding:"required"`) | MCP 服务 ID |
| `decision` | string | 否 | `authorize`(默认)/ `cancel` |
响应:200 `{"success":true}`
```bash
curl -X POST $BASE/api/v1/agent/mcp-oauth-resolutions/p-1 -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"service_id":"mcp-1"}'
```
### POST /api/v1/agent/mcp-oauth-resolutions/:pending_id/cancel
用途:取消暂停中的 OAuth 流程。无请求体。
响应:200 `{"success":true}`
```bash
curl -X POST $BASE/api/v1/agent/mcp-oauth-resolutions/p-1/cancel -H "Authorization: Bearer $TOKEN"
```
## 技能(/api/v1/skills)
### GET /api/v1/skills
用途:预加载技能列表(只读)。权限:Viewer+,仅 JWT。Handler: `internal/handler/skill_handler.go`
响应:200 `{"success":true,"data":[{name,description}],"skills_available":bool}`
```bash
curl $BASE/api/v1/skills -H "Authorization: Bearer $TOKEN"
```
安装、停用、文件浏览与环境变量走沙箱配置前缀 `/api/v1/sandbox-configs/{id}/skills*` 以及 `/api/v1/me/env-vars*`,完整示例见仓库 [`docs/api/skill.md`](../../docs/api/skill.md)。
## 长期记忆(/api/v1/memory)
跨会话记忆始终绑定当前调用者,路径里没有 subject id。权限:Viewer+;API Key 必须 full-access。Handler: `internal/handler/memory.go`
| 方法 | 路径 | 用途 |
| --- | --- | --- |
| GET/PUT | `/memory/settings` | 个人开关(空间级开关由管理员在租户设置里改) |
| GET/POST/DELETE | `/memory/items` | 列出 / 手动新增 / 清空 |
| PUT/DELETE | `/memory/items/{id}` | 修改 / 删除 |
| POST | `/memory/items/{id}/confirm` `/reject` | 确认或否决推断出的记忆 |
| GET | `/memory/topics` `/memory/documents` | 主题计数、文档亲和度 |
| GET | `/memory/export` | JSON 导出 |
| POST | `/memory/consolidate` | 立刻整理 |
完整字段与 curl 见仓库 [`docs/api/memory.md`](../../docs/api/memory.md)。
## 用户收藏(/api/v1/user/favorites)
按用户维度存储(非资源创建者维度);权限均 Viewer+,仅 JWT(API key 默认拒绝)。Handler: `internal/handler/user_resource_favorite.go`
### GET /api/v1/user/favorites
用途:收藏列表。查询参数:`type`(必填,`kb` 或 `agent`)。
响应:200 `{"success":true,"data":[{type,id,created_at}]}`
```bash
curl "$BASE/api/v1/user/favorites?type=kb" -H "Authorization: Bearer $TOKEN"
```
### POST /api/v1/user/favorites
用途:添加收藏。请求体:`{"type":"kb|agent","id":"<资源ID>"}`(均必填)。
响应:200 `{"success":true}`
```bash
curl -X POST $BASE/api/v1/user/favorites -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"type":"kb","id":"kb-1"}'
```
### DELETE /api/v1/user/favorites/:type/:id
用途:取消收藏。路径参数:`type`、`id`。
响应:200 `{"success":true}`
```bash
curl -X DELETE $BASE/api/v1/user/favorites/kb/kb-1 -H "Authorization: Bearer $TOKEN"
```