# 智能体广场跳转后 listChatSessions 传参 agentId
- **日期**: 2026-08-04
- **状态**: 已批准,待实施
## 背景
从智能体广场(`marketplace.vue`)点击智能体进入前端聊天页面(`Frontend/index.vue`)时,路由携带 `query.agentId`。当前页面已读取该值并在 WebSocket 发送消息时回传,但会话侧边栏调用 `listChatSessions()` 获取会话列表时未携带 `agentId`,导致列表不能按智能体过滤。
## 目标
从智能体广场跳转进入前端页面后,会话侧边栏调用 `listChatSessions()` 时附带 `agentId` 作为查询参数,后端据此只返回该智能体下的会话。其他入口(无 `agentId`)行为不变。
## 非目标
- 不修改 `marketplace.vue` 现有跳转逻辑
- 不修改 WebSocket 消息体(`agentId` 已附带,不在范围内)
- 不修改其他 list API(`listLlmModels`、`listAgentProjects` 等)
- 不引入状态管理库(Pinia 等)
## 设计
### 1. API 层 `src/api/frontend/index.js`
`listChatSessions` 改为接收可选 `agentId`,作为 GET 查询参数:
```js
export function listChatSessions(agentId) {
return chatRequest({
url: '/llm/chatSession/list',
method: 'get',
params: agentId ? { agentId: Number(agentId) } : {}
})
}
```
- 不传或传 `null`/`undefined`/空字符串时,`params` 为空对象,行为与现状完全一致
- `agentId` 通过 `Number()` 转为数字,与 WebSocket 发送处的转换(`messageData.agentId = Number(agentId.value)`)保持一致
### 2. 父组件 `src/views/frontend/index.vue`
模板中已存在 ``,新增 `:agent-id` 绑定:
```vue
```
`agentId` ref(第 162 行)已存在,由 `route.query.agentId` 赋值,无需新增状态。
### 3. 子组件 `src/views/frontend/components/ConversationSidebar.vue`
- 新增 prop 定义:
```js
const props = defineProps({
agentId: { type: [String, Number], default: null }
})
```
- 第 131 行 `fetchSessions`:
```js
const res = await listChatSessions(props.agentId)
```
- 第 207 行 `refreshQuiet`:
```js
const res = await listChatSessions(props.agentId)
```
由于 `props.agentId` 是响应式的,直接读取即可拿到最新值,无需 `watch`。
## 数据流
```
marketplace.vue (handleAgentClick)
└─ router.push({ name: 'Frontend', query: { agentId, name } })
└─ index.vue (onMounted: agentId.value = route.query.agentId)
└─
└─ fetchSessions() / refreshQuiet()
└─ listChatSessions(props.agentId)
└─ GET /llm/chatSession/list?agentId=
```
## 边界与错误处理
| 输入 | 行为 |
|---|---|
| `agentId` 未提供 | 不带 `agentId` 参数,返回全部会话 |
| `agentId = ''` 或 `null` | 同上 |
| `agentId = '123'`(字符串) | `Number('123') = 123`,作为查询参数 |
| `agentId = 0` 或无效数字 | 后端按 `0` 处理,与现状一致 |
不引入额外的错误处理;网络错误沿用现有的 `console.error` 与 UI 行为。
## 验证
1. **从智能体广场跳转**:
- 进入智能体 A → 侧边栏只显示智能体 A 的会话
- 返回广场,进入智能体 B → 侧边栏只显示智能体 B 的会话
2. **直接进入 `/frontend`**(无 query):侧边栏显示全部会话,行为与现状一致
3. **新建会话后**:通过 `refreshQuiet` 刷新时仍按当前 `agentId` 过滤
4. **删除/重命名会话**:调用 `deleteChatSession`/`renameChatSession`,刷新后列表仍正确过滤
## 涉及文件
| 文件 | 变更类型 |
|---|---|
| `src/api/frontend/index.js` | 修改 `listChatSessions` 签名 |
| `src/views/frontend/index.vue` | 模板新增 `:agent-id` 绑定 |
| `src/views/frontend/components/ConversationSidebar.vue` | 新增 prop;两处 `listChatSessions` 调用透传参数 |
## 实施依赖
无新增依赖。沿用现有 axios、`vue-router`、`@element-plus`。