# pms-agent 与 agent-lab-backend API 接口差异清单

基于以下两个项目源码进行对外 REST/SSE 接口契约比对：

- `D:\Code\pms-agent`
- `D:\Code\agent-lab\agent-lab-backend`

比对口径：

- 以控制器与 DTO 源码为准，不依赖 Swagger/OpenAPI 生成结果
- 以 `HTTP 方法 + 完整路径` 作为接口主键
- 比对请求参数、请求体、表单字段、返回 `Result<T>.data` 结构，以及 SSE 事件数据结构
- 仅按 HTTP 契约判断差异；纯 Java 签名差异如果不影响 HTTP 结构，则不单独计为不一致

## 1. 仅 `pms-agent` 存在

| 接口 | `pms-agent` | `agent-lab-backend` | 差异类型 |
|---|---|---|---|
| `GET /api/agent/care/stream` | 查询参数：`sessionId`、`message`；返回 `text/event-stream`，事件数据为字符串 | 无对应接口 | 仅单边存在 |

## 2. 仅 `agent-lab-backend` 存在

| 接口 | `pms-agent` | `agent-lab-backend` | 差异类型 |
|---|---|---|---|
| `POST /api/chat/sessions/{sessionId}/files` | 无对应接口 | `multipart/form-data`，表单字段：`file`；返回 `Result<ChatSessionFileResponse>` | 仅单边存在 |
| `GET /api/chat/sessions/{sessionId}/files` | 无对应接口 | 返回 `Result<List<ChatSessionFileResponse>>` | 仅单边存在 |
| `DELETE /api/chat/sessions/{sessionId}/files/{fileId}` | 无对应接口 | 返回 `Result<Void>` | 仅单边存在 |
| `GET /api/admin/settings/default-models` | 无对应接口 | 返回 `Result<DefaultModelSettingsResponse>`，含 `defaultModelConfigId`、`defaultEmbeddingModelConfigId`、`defaultRerankModelConfigId` 及 3 个默认模型摘要对象 | 仅单边存在 |
| `PUT /api/admin/settings/default-models` | 无对应接口 | 请求体含 `defaultModelConfigId`、`defaultEmbeddingModelConfigId`、`defaultRerankModelConfigId`；返回 `Result<DefaultModelSettingsResponse>` | 仅单边存在 |

## 3. 同路径但契约不一致

| 接口 | `pms-agent` | `agent-lab-backend` | 差异类型 |
|---|---|---|---|
| `GET /api/admin/agents` | 返回 `AgentSummaryResponse.modelConfigId: string` | 返回 `AgentSummaryResponse.modelConfigId: number` | 返回参数不一致 |
| `GET /api/admin/agents/{id}` | 返回 `AgentDetailResponse.modelConfigId: string` | 返回 `AgentDetailResponse.modelConfigId: number` | 返回参数不一致 |
| `POST /api/admin/agents` | 请求 `CreateAgentRequest.modelConfigId: string`；返回 `modelConfigId: string` | 请求 `CreateAgentRequest.modelConfigId: number`；返回 `modelConfigId: number` | 请求参数不一致、返回参数不一致 |
| `PUT /api/admin/agents/{id}` | 请求 `UpdateAgentRequest.modelConfigId: string`；返回 `modelConfigId: string` | 请求 `UpdateAgentRequest.modelConfigId: number`；返回 `modelConfigId: number` | 请求参数不一致、返回参数不一致 |
| `PATCH /api/admin/agents/{id}/toggle` | 返回 `modelConfigId: string` | 返回 `modelConfigId: number` | 返回参数不一致 |
| `GET /api/admin/chatbots` | 返回 `ChatbotSummaryResponse.modelConfigId: string` | 返回 `ChatbotSummaryResponse.modelConfigId: number` | 返回参数不一致 |
| `GET /api/admin/chatbots/{id}` | `ChatbotDetailResponse` 继承摘要结构，`modelConfigId: string` | `ChatbotDetailResponse` 继承摘要结构，`modelConfigId: number` | 返回参数不一致 |
| `POST /api/admin/chatbots` | 请求 `CreateChatbotRequest.modelConfigId: string`；返回 `modelConfigId: string` | 请求 `CreateChatbotRequest.modelConfigId: number`；返回 `modelConfigId: number` | 请求参数不一致、返回参数不一致 |
| `PUT /api/admin/chatbots/{id}` | 请求 `UpdateChatbotRequest.modelConfigId: string`；返回 `modelConfigId: string` | 请求 `UpdateChatbotRequest.modelConfigId: number`；返回 `modelConfigId: number` | 请求参数不一致、返回参数不一致 |
| `PATCH /api/admin/chatbots/{id}/toggle` | 返回 `modelConfigId: string` | 返回 `modelConfigId: number` | 返回参数不一致 |
| `GET /api/admin/providers` | 返回 `ProviderResponse.id: string` | 返回 `ProviderResponse.id: number` | 返回参数不一致 |
| `GET /api/admin/providers/{id}` | 返回 `ProviderResponse.id: string` | 返回 `ProviderResponse.id: number` | 返回参数不一致 |
| `POST /api/admin/providers` | 请求体一致；返回 `ProviderResponse.id: string` | 请求体一致；返回 `ProviderResponse.id: number` | 返回参数不一致 |
| `PUT /api/admin/providers/{id}` | 请求体一致；返回 `ProviderResponse.id: string` | 请求体一致；返回 `ProviderResponse.id: number` | 返回参数不一致 |
| `PATCH /api/admin/providers/{id}/toggle` | 返回 `ProviderResponse.id: string` | 返回 `ProviderResponse.id: number` | 返回参数不一致 |
| `GET /api/admin/providers/{providerId}/models` | 返回 `ModelConfigResponse.id: string`、`providerId: string` | 返回 `ModelConfigResponse.id: number`、`providerId: number` | 返回参数不一致 |
| `POST /api/admin/providers/{providerId}/models` | 请求体一致；返回 `id: string`、`providerId: string` | 请求体一致；返回 `id: number`、`providerId: number` | 返回参数不一致 |
| `PUT /api/admin/providers/{providerId}/models/{mid}` | 请求体一致；返回 `id: string`、`providerId: string` | 请求体一致；返回 `id: number`、`providerId: number` | 返回参数不一致 |
| `PATCH /api/admin/providers/{providerId}/models/{mid}/toggle` | 返回 `id: string`、`providerId: string` | 返回 `id: number`、`providerId: number` | 返回参数不一致 |
| `GET /api/admin/settings/default-model` | 返回 `DefaultModelResponse.modelConfigId: string` | 返回 `DefaultModelResponse.modelConfigId: number` | 返回参数不一致 |
| `PUT /api/admin/settings/default-model` | 请求体 `{ "modelConfigId": "..." }`；返回 `modelConfigId: string`；空值时报参数错误 | 请求体 `{ "modelConfigId": 123 }`；返回 `modelConfigId: number`；空值时返回成功且 `data` 为空模型 | 请求参数不一致、返回参数不一致 |

## 4. 补充说明

- 本次未列出的接口，按源码比对结果可视为一致。
- 已确认一致的主要接口包括：
  - `/api/chat/sessions*` 主聊天链路
  - `/api/admin/agents/{agentId}/fields*`
  - `/api/admin/chatbots/tools`
  - `/api/admin/providers/types`
