# 大模型网关转发测试用例

> 实现：`com.ruoyi.web.kb.controller.KbOpenAiProxyController`（**须若依 Token，非匿名**）

---

## 1. 单元测试（Service / Controller 逻辑）

| 编号 | 用例类 | 预期 |
| --- | --- | --- |
| UT-KB-LLM-001 | `KbOpenAiProxyServiceImplTest.listModelsForwardsAuth` | GET 上游 `/v1/models`，Bearer 为 `ruoyi.kb.api-key` |
| UT-KB-LLM-007 | `KbOpenAiProxyControllerApiTest.models` | MockMvc `GET /v1/models` 路由与响应（standalone 不测 Security） |
| UT-KB-LLM-002 | `KbOpenAiProxyServiceImplTest.chatCompletionsForwardsBody` | POST 上游 `/v1/chat/completions` |
| UT-KB-LLM-003 | `KbOpenAiProxyServiceImplTest.detectsStreamRequest` | 识别 `stream:true` |
| UT-KB-LLM-004 | `KbOpenAiProxyServiceImplTest.rejectsWithoutApiKey` | 未配置服务端 api-key 抛异常 |
| UT-KB-LLM-005 | `KbOpenAiProxyControllerApiTest.chatNonStream` | 非流式转发逻辑 |
| UT-KB-LLM-006 | `KbOpenAiProxyControllerApiTest.chatStream` | 流式 SSE 写出 `data:` |

```bash
mvn -pl baqing-admin test -Dtest=KbOpenAiProxyServiceImplTest,KbOpenAiProxyControllerApiTest
```

---

## 2. 接口联调（须启动 8010 + 有效若依 Token）

先 `POST /login` 获取 `token`，后续请求：

`Authorization: Bearer {token}`

| 编号 | 步骤 | 预期 |
| --- | --- | --- |
| IT-KB-LLM-001 | `GET http://localhost:8010/v1/models` + Token | HTTP **200** |
| IT-KB-LLM-002 | `POST .../v1/chat/completions`，`stream:false` + Token | JSON 含 `choices` |
| IT-KB-LLM-003 | 同上 `stream:true` + Token | `text/event-stream` |
| IT-KB-LLM-004 | 上述任一路径 **不带** Token | HTTP **401** |
| IT-KB-LLM-005 | 仅带 `VUE_APP_LLM_API_KEY`、不带若依 Token | HTTP **401**（大模型 Key 不能代替登录态） |

**curl 示例（模型列表）**

```bash
curl -s -H "Authorization: Bearer {若依token}" http://localhost:8010/v1/models
```

---

## 3. 前端回归（经 8010 转发）

| 编号 | 步骤 | 预期 |
| --- | --- | --- |
| FE-KB-LLM-001 | 管理端已登录，`VUE_APP_LLM_BASE_URL` 指向 8010，对话请求 Header 为 **若依 Token** | 对话成功 |
| FE-KB-LLM-002 | 同上但 Header 仍为 `VUE_APP_LLM_API_KEY` | **401**，需按 `doc/大模型/大模型网关转发接口说明.md` §6 改造 |

---

## 4. 修订记录

| 版本 | 日期 | 说明 |
| --- | --- | --- |
| 1.0 | 2026-05-25 | 初版 |
| 1.1 | 2026-05-25 | 补充 IT/UT 编号 |
| 1.2 | 2026-05-25 | **IT-004/005、FE 用例**：须若依 Token，禁止匿名 |
