Files
WeKnora/docs/api/session.md
T
nullkey 1c7171b2c6 docs(api): rewrite markdown to match current routes
Refs #890 #1049 #1168.

按集成方视角全量审计 17 个 API markdown 文档与 internal/router/router.go
对齐。每个端点新增参数说明小节(path/query/body 字段含义)和响应字段
含义说明(#1168 的核心诉求)。

【与代码对齐】
- 删除已下线端点:system.md 中的 /system/minio/buckets(代码中已无对
  应路由)。
- 修正路径错误:chunk.md 中 /chunks/get-by-id/:id → /chunks/by-id/:id;
  /chunks/:id/delete-question → /chunks/by-id/:id/questions;
  organization.md 中 /organizations/preview/:invite_code → :code。
- 修正字段类型:faq tag_id / entry_id 由 string 改为 int64;
  knowledge.search 响应结构纠正。
- 补齐缺失端点(move-targets、batch-delete、move/progress、pin/unpin/
  stop/continue-stream、tool-approvals、organization agent-shares 等
  30+ 条)。

【精简】
- knowledge-base.md / model.md 把重复 5 次 / 3 次的完整对象样例
  收敛为指向首次出现("字段结构同 POST /xxx 响应"),节省约 400 行
  而不损失信息(仅去重,原作者写的每个字段定义都保留可达)。
- 示例 X-API-Key 统一为 sk-xxxxx(避免读者复制看似真实的 key)。

【清理】
- 删除内部实现细节引用:mcp-service.md 中 6 处 "issue #1173"、
  organization.md 中 "RegisterOrganizationRoutes" 等。

不动 initialization.md:其中端点(KB 配置、模型连通性测试、Ollama 管理)
对集成方有实用价值,保留原作者写好的内容不删。

格式统一遵循 web-search.md 重写后的范式(路由表 + 每端点方法/路径 +
参数表 + curl + 响应 JSON + 字段说明)。
2026-05-12 13:16:58 +08:00

478 lines
14 KiB
Markdown
Raw 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
[返回目录](./README.md)
会话(Session)是纯粹的对话容器,仅存储基础信息(标题、描述、置顶状态等)。所有与知识库、模型、检索策略相关的配置均在查询时由 Custom Agent 提供,不再存储在会话中。
| 方法 | 路径 | 描述 |
| ------ | ------------------------------------------ | ----------------------------- |
| POST | `/sessions` | 创建会话 |
| DELETE | `/sessions/batch` | 批量删除会话 |
| GET | `/sessions/:id` | 获取会话详情 |
| GET | `/sessions` | 获取当前租户的会话列表 |
| PUT | `/sessions/:id` | 更新会话 |
| DELETE | `/sessions/:id` | 删除会话 |
| DELETE | `/sessions/:id/messages` | 清空会话消息 |
| POST | `/sessions/:session_id/generate_title` | 生成会话标题 |
| POST | `/sessions/:session_id/stop` | 停止生成 |
| POST | `/sessions/:session_id/pin` | 置顶会话 |
| DELETE | `/sessions/:id/pin` | 取消置顶会话 |
| GET | `/sessions/continue-stream/:session_id` | 继续未完成的流式响应 |
> **路由命名说明**:置顶接口的 POST 与 DELETE 使用了不同的路径参数名(POST 用 `:session_id`DELETE 用 `:id`)。这是由于 gin 路由器为每个 HTTP 方法维护独立的 radix tree,且既有树中的通配符命名不同,必须保留以避免注册时的 `wildcard conflicts` panic。两者语义上都指会话 ID。
## POST `/sessions` - 创建会话
**请求**:
```curl
curl --location 'http://localhost:8080/api/v1/sessions' \
--header 'X-API-Key: sk-xxxxx' \
--header 'Content-Type: application/json' \
--data '{
"title": "我的新对话",
"description": "关于 AI 的讨论"
}'
```
**请求参数**:
| 字段 | 类型 | 必填 | 描述 |
| ------------- | ------ | ---- | -------- |
| `title` | string | 否 | 会话标题 |
| `description` | string | 否 | 会话描述 |
**响应**:
```json
{
"success": true,
"data": {
"id": "411d6b70-9a85-4d03-bb74-aab0fd8bd12f",
"title": "我的新对话",
"description": "关于 AI 的讨论",
"tenant_id": 1,
"user_id": "u-001",
"is_pinned": false,
"created_at": "2026-03-27T12:26:19.611616+08:00",
"updated_at": "2026-03-27T12:26:19.611616+08:00",
"deleted_at": null
}
}
```
> 通过 API-Key 调用时 `user_id` 可能为空,此时会话以租户级可见。
## DELETE `/sessions/batch` - 批量删除会话
支持两种模式:按 ID 列表批量删除,或删除当前租户的所有会话。
**请求 - 按 ID 列表删除**:
```curl
curl --location --request DELETE 'http://localhost:8080/api/v1/sessions/batch' \
--header 'X-API-Key: sk-xxxxx' \
--header 'Content-Type: application/json' \
--data '{
"ids": [
"411d6b70-9a85-4d03-bb74-aab0fd8bd12f",
"ceb9babb-1e30-41d7-817d-fd584954304b"
]
}'
```
**请求 - 删除所有会话**:
```curl
curl --location --request DELETE 'http://localhost:8080/api/v1/sessions/batch' \
--header 'X-API-Key: sk-xxxxx' \
--header 'Content-Type: application/json' \
--data '{
"delete_all": true
}'
```
**请求参数**:
| 字段 | 类型 | 必填 | 描述 |
| ------------ | -------- | ---- | ---------------------------------------------------------- |
| `ids` | string[] | 否 | 要删除的会话 ID 列表(`delete_all``false` 时必填) |
| `delete_all` | bool | 否 | 设为 `true` 时删除当前租户的所有会话,忽略 `ids` 字段 |
**响应**:
```json
{
"success": true,
"message": "Sessions deleted successfully"
}
```
`delete_all=true``message``"All sessions deleted successfully"`
## GET `/sessions/:id` - 获取会话详情
**请求**:
```curl
curl --location 'http://localhost:8080/api/v1/sessions/ceb9babb-1e30-41d7-817d-fd584954304b' \
--header 'X-API-Key: sk-xxxxx' \
--header 'Content-Type: application/json'
```
**路径参数**:
| 字段 | 类型 | 必填 | 描述 |
| ---- | ------ | ---- | ------- |
| `id` | string | 是 | 会话 ID |
**响应**:
```json
{
"success": true,
"data": {
"id": "ceb9babb-1e30-41d7-817d-fd584954304b",
"title": "模型优化策略",
"description": "",
"tenant_id": 1,
"user_id": "u-001",
"is_pinned": true,
"pinned_at": "2026-04-01T09:12:33.123456+08:00",
"created_at": "2026-03-27T10:24:38.308596+08:00",
"updated_at": "2026-03-27T10:25:41.317761+08:00",
"deleted_at": null
}
}
```
会话不存在时返回 `404`
## GET `/sessions` - 获取当前租户的会话列表
获取当前租户的会话列表,支持分页、关键字搜索、按来源 / Agent 过滤。
**请求**:
```curl
curl --location 'http://localhost:8080/api/v1/sessions?page=1&page_size=10&keyword=AI&source=web' \
--header 'X-API-Key: sk-xxxxx' \
--header 'Content-Type: application/json'
```
**查询参数**:
| 字段 | 类型 | 必填 | 描述 |
| ----------- | ------ | ---- | ----------------------------------------------------------------- |
| `page` | int | 否 | 页码(默认 1) |
| `page_size` | int | 否 | 每页数量(默认 10) |
| `keyword` | string | 否 | 按标题模糊匹配(ILIKE `%keyword%`) |
| `source` | string | 否 | 来源过滤:`web`(无 IM 映射)或 IM 平台名,如 `feishu``wechat``slack` |
| `agent_id` | string | 否 | 按 Agent 过滤(仅对 IM 会话生效) |
**响应**:
```json
{
"success": true,
"data": [
{
"id": "411d6b70-9a85-4d03-bb74-aab0fd8bd12f",
"title": "我的新对话",
"description": "",
"tenant_id": 1,
"user_id": "u-001",
"is_pinned": true,
"pinned_at": "2026-04-01T09:12:33.123456+08:00",
"created_at": "2026-03-27T12:26:19.611616+08:00",
"updated_at": "2026-03-27T12:26:19.611616+08:00",
"deleted_at": null,
"im_platform": "feishu",
"im_chat_id": "oc_xxx",
"im_agent_id": "agent-001"
}
],
"total": 1,
"page": 1,
"page_size": 10
}
```
> 列表项始终包含置顶状态字段,IM 来源相关字段(`im_platform`、`im_chat_id`、`im_thread_id`、`im_user_id`、`im_agent_id`、`im_channel_id`)仅对 IM 创建的会话填充,Web 会话省略。
## PUT `/sessions/:id` - 更新会话
**请求**:
```curl
curl --location --request PUT 'http://localhost:8080/api/v1/sessions/411d6b70-9a85-4d03-bb74-aab0fd8bd12f' \
--header 'X-API-Key: sk-xxxxx' \
--header 'Content-Type: application/json' \
--data '{
"title": "WeKnora 技术讨论",
"description": "关于 WeKnora 架构的讨论"
}'
```
**路径参数**:
| 字段 | 类型 | 必填 | 描述 |
| ---- | ------ | ---- | ------- |
| `id` | string | 是 | 会话 ID |
**请求参数**:
| 字段 | 类型 | 必填 | 描述 |
| ------------- | ------ | ---- | -------- |
| `title` | string | 否 | 会话标题 |
| `description` | string | 否 | 会话描述 |
**响应**:
```json
{
"success": true,
"data": {
"id": "411d6b70-9a85-4d03-bb74-aab0fd8bd12f",
"title": "WeKnora 技术讨论",
"description": "关于 WeKnora 架构的讨论",
"tenant_id": 1,
"user_id": "u-001",
"is_pinned": false,
"created_at": "2026-03-27T12:26:19.611616+08:00",
"updated_at": "2026-03-27T14:20:56.738424+08:00",
"deleted_at": null
}
}
```
会话不存在时返回 `404`
## DELETE `/sessions/:id` - 删除会话
**请求**:
```curl
curl --location --request DELETE 'http://localhost:8080/api/v1/sessions/411d6b70-9a85-4d03-bb74-aab0fd8bd12f' \
--header 'X-API-Key: sk-xxxxx' \
--header 'Content-Type: application/json'
```
**路径参数**:
| 字段 | 类型 | 必填 | 描述 |
| ---- | ------ | ---- | ------- |
| `id` | string | 是 | 会话 ID |
**响应**:
```json
{
"success": true,
"message": "Session deleted successfully"
}
```
## DELETE `/sessions/:id/messages` - 清空会话消息
删除会话中的所有消息,同时清除 LLM 上下文和聊天历史知识库条目。会话本身保留。
**请求**:
```curl
curl --location --request DELETE 'http://localhost:8080/api/v1/sessions/ceb9babb-1e30-41d7-817d-fd584954304b/messages' \
--header 'X-API-Key: sk-xxxxx' \
--header 'Content-Type: application/json'
```
**路径参数**:
| 字段 | 类型 | 必填 | 描述 |
| ---- | ------ | ---- | ------- |
| `id` | string | 是 | 会话 ID |
**响应**:
```json
{
"success": true,
"message": "Session messages cleared successfully"
}
```
## POST `/sessions/:session_id/generate_title` - 生成会话标题
根据消息内容自动生成会话标题。
**请求**:
```curl
curl --location 'http://localhost:8080/api/v1/sessions/ceb9babb-1e30-41d7-817d-fd584954304b/generate_title' \
--header 'X-API-Key: sk-xxxxx' \
--header 'Content-Type: application/json' \
--data '{
"messages": [
{
"role": "user",
"content": "你好,我想了解关于人工智能的知识"
},
{
"role": "assistant",
"content": "人工智能是计算机科学的一个分支..."
}
]
}'
```
**路径参数**:
| 字段 | 类型 | 必填 | 描述 |
| ------------ | ------ | ---- | ------- |
| `session_id` | string | 是 | 会话 ID |
**请求参数**:
| 字段 | 类型 | 必填 | 描述 |
| ---------- | --------- | ---- | ---------------------------- |
| `messages` | Message[] | 是 | 用作标题生成上下文的消息列表 |
**响应**:
```json
{
"success": true,
"data": "人工智能基础知识"
}
```
## POST `/sessions/:session_id/stop` - 停止生成
停止当前正在进行的助手回复生成任务。后端会向流中追加一条 `stop` 事件,由活跃的 SSE 处理协程感知并发起取消。
**请求**:
```curl
curl --location 'http://localhost:8080/api/v1/sessions/7c966c74-610e-4516-8d5b-05e14b2e4ee0/stop' \
--header 'X-API-Key: sk-xxxxx' \
--header 'Content-Type: application/json' \
--data '{
"message_id": "ebbf7e53-dfe6-44d5-882f-36a4104910b5"
}'
```
**路径参数**:
| 字段 | 类型 | 必填 | 描述 |
| ------------ | ------ | ---- | ------- |
| `session_id` | string | 是 | 会话 ID |
**请求参数**:
| 字段 | 类型 | 必填 | 描述 |
| ------------ | ------ | ---- | ----------------------- |
| `message_id` | string | 是 | 要停止生成的助手消息 ID |
**响应**:
```json
{
"success": true,
"message": "Generation stopped"
}
```
若消息已完成(无需停止):
```json
{
"success": true,
"message": "Message already completed"
}
```
> 消息不属于当前会话返回 `403`;消息或会话不存在返回 `404`。
## POST `/sessions/:session_id/pin` - 置顶会话
将指定会话置顶(用户维度)。
**请求**:
```curl
curl --location --request POST 'http://localhost:8080/api/v1/sessions/ceb9babb-1e30-41d7-817d-fd584954304b/pin' \
--header 'X-API-Key: sk-xxxxx'
```
**路径参数**:
| 字段 | 类型 | 必填 | 描述 |
| ------------ | ------ | ---- | ------- |
| `session_id` | string | 是 | 会话 ID |
**响应**:
```json
{
"success": true,
"is_pinned": true
}
```
会话不存在或对当前用户不可见时返回 `404`
## DELETE `/sessions/:id/pin` - 取消置顶会话
取消指定会话的置顶。
**请求**:
```curl
curl --location --request DELETE 'http://localhost:8080/api/v1/sessions/ceb9babb-1e30-41d7-817d-fd584954304b/pin' \
--header 'X-API-Key: sk-xxxxx'
```
**路径参数**:
| 字段 | 类型 | 必填 | 描述 |
| ---- | ------ | ---- | ------- |
| `id` | string | 是 | 会话 ID |
**响应**:
```json
{
"success": true,
"is_pinned": false
}
```
> 同上,`POST /pin` 与 `DELETE /pin` 路径参数名不同,但语义上都是会话 ID。
## GET `/sessions/continue-stream/:session_id` - 继续未完成的流式响应
用于在 SSE 连接断开后重新连接正在进行的流式响应:先回放该消息已产生的所有事件,再继续推送后续事件,直至 `complete`
**路径参数**:
| 字段 | 类型 | 必填 | 描述 |
| ------------ | ------ | ---- | ------- |
| `session_id` | string | 是 | 会话 ID |
**查询参数**:
| 字段 | 类型 | 必填 | 描述 |
| ------------ | ------ | ---- | ------------------------------------------------------------------------------- |
| `message_id` | string | 是 | 从 `/messages/:session_id/load` 接口中获取的 `is_completed``false` 的消息 ID |
**请求**:
```curl
curl --location 'http://localhost:8080/api/v1/sessions/continue-stream/ceb9babb-1e30-41d7-817d-fd584954304b?message_id=b8b90eeb-7dd5-4cf9-81c6-5ebcbd759451' \
--header 'X-API-Key: sk-xxxxx' \
--header 'Content-Type: application/json'
```
**响应格式**:
服务器端事件流(Server-Sent Events),事件结构与 `/knowledge-chat/:session_id``/agent-chat/:session_id` 返回结果一致。若该消息当前在流中已无事件返回 `404 No stream events found`;若消息记录不存在返回 `404 Incomplete message not found`