# AI配置测试保存功能说明

## 功能概述

在 web-admin 的 AI 配置管理页面中，测试接口成功后可以将测试时使用的参数保存到数据库中，包括：
- API完整URL
- API Token
- Bot ID
- Workflow ID
- 自定义请求头
- 自定义请求参数
- 是否支持流式输出

## 使用流程

### 1. 打开测试对话框
在 AI 配置列表中，点击某个配置的"测试"按钮，打开测试对话框。

### 2. 配置测试参数
测试对话框会自动填充当前配置的参数：
- **请求URL**: 从配置的 `apiBaseUrl` 字段获取
- **请求头**: 自动构建，包含 `Authorization` 和 `Content-Type`
- **请求体**: 自动构建，包含 `bot_id`、`user_id`、`stream`、`additional_messages` 等

### 3. 修改测试参数（可选）
您可以根据需要修改：
- 请求URL
- 请求头中的参数
- 请求体中的参数
- 测试消息内容
- 是否启用流式响应

### 4. 发送测试请求
点击"发送测试请求"或"发送流式测试"按钮，系统会向配置的API发送请求。

### 5. 查看响应结果
右侧会显示：
- 状态码
- 响应头
- 响应体

### 6. 保存测试配置
如果测试成功（状态码为200），会显示"保存测试配置"按钮。点击该按钮，系统会：

#### 6.1 解析请求头
- 提取 `Authorization` 头中的 Token（移除 "Bearer " 前缀）
- 将其他自定义请求头保存到 `customHeaders` 字段（JSON格式）

#### 6.2 解析请求体
- 提取 `bot_id` 保存到 `botId` 字段
- 提取 `workflow_id` 保存到 `workflowId` 字段
- 提取 `stream` 保存到 `supportStream` 字段
- 将其他自定义参数保存到 `customParams` 字段（JSON格式）

#### 6.3 更新配置
调用后端接口 `/aiConfig/updateFromTest`，更新配置信息。

## 后端接口

### 接口地址
```
PUT /aiConfig/updateFromTest
```

### 请求参数
```json
{
  "id": "配置ID",
  "apiBaseUrl": "完整的API URL",
  "apiToken": "API访问令牌",
  "botId": "Bot ID（Coze专用）",
  "workflowId": "Workflow ID（Coze专用）",
  "customHeaders": "自定义请求头（JSON字符串）",
  "customParams": "自定义参数（JSON字符串）",
  "supportStream": 1
}
```

### 响应示例
```json
{
  "code": 200,
  "message": "更新成功",
  "data": {
    "id": "1234567890",
    "configName": "测试配置",
    "apiBaseUrl": "https://api.coze.cn/v3/chat",
    "apiToken": "pat_xxx",
    "botId": "bot_123",
    "workflowId": "workflow_456",
    "customHeaders": "{\"X-Custom-Header\":\"value\"}",
    "customParams": "{\"custom_param\":\"value\"}",
    "supportStream": 1,
    ...
  }
}
```

## 参数提取规则

### 1. API Token提取
从请求头的 `Authorization` 字段中提取：
```json
{
  "Authorization": "Bearer pat_xxx"
}
```
提取结果：`apiToken = "pat_xxx"`

### 2. Bot ID提取
从请求体的 `bot_id` 字段中提取：
```json
{
  "bot_id": "bot_123"
}
```
提取结果：`botId = "bot_123"`

### 3. Workflow ID提取
从请求体的 `workflow_id` 字段中提取：
```json
{
  "workflow_id": "workflow_456"
}
```
提取结果：`workflowId = "workflow_456"`

### 4. 流式支持提取
从请求体的 `stream` 字段中提取：
```json
{
  "stream": true
}
```
提取结果：`supportStream = 1`

### 5. 自定义请求头
移除 `Authorization` 和 `Content-Type` 后的其他请求头：
```json
{
  "X-Custom-Header": "value",
  "X-Another-Header": "value2"
}
```
保存为JSON字符串到 `customHeaders` 字段

### 6. 自定义参数
移除 `bot_id`、`workflow_id`、`stream`、`user_id`、`additional_messages` 后的其他参数：
```json
{
  "custom_param": "value",
  "another_param": "value2"
}
```
保存为JSON字符串到 `customParams` 字段

## 使用示例

### 示例1：标准Coze配置

**测试前配置**:
```json
{
  "apiBaseUrl": "https://api.coze.cn",
  "apiToken": "old_token",
  "botId": "old_bot_id"
}
```

**测试请求**:
- URL: `https://api.coze.cn/v3/chat`
- 请求头:
  ```json
  {
    "Authorization": "Bearer new_token",
    "Content-Type": "application/json"
  }
  ```
- 请求体:
  ```json
  {
    "bot_id": "new_bot_id",
    "user_id": "test_user",
    "stream": false,
    "additional_messages": [...]
  }
  ```

**保存后配置**:
```json
{
  "apiBaseUrl": "https://api.coze.cn/v3/chat",
  "apiToken": "new_token",
  "botId": "new_bot_id",
  "supportStream": 0,
  "customHeaders": "",
  "customParams": ""
}
```

### 示例2：带自定义参数的配置

**测试请求**:
- URL: `https://api.coze.cn/v3/chat`
- 请求头:
  ```json
  {
    "Authorization": "Bearer token_123",
    "Content-Type": "application/json",
    "X-Custom-Header": "custom_value"
  }
  ```
- 请求体:
  ```json
  {
    "bot_id": "bot_456",
    "workflow_id": "workflow_789",
    "stream": true,
    "user_id": "test_user",
    "additional_messages": [...],
    "custom_param": "param_value"
  }
  ```

**保存后配置**:
```json
{
  "apiBaseUrl": "https://api.coze.cn/v3/chat",
  "apiToken": "token_123",
  "botId": "bot_456",
  "workflowId": "workflow_789",
  "supportStream": 1,
  "customHeaders": "{\"X-Custom-Header\":\"custom_value\"}",
  "customParams": "{\"custom_param\":\"param_value\"}"
}
```

## 注意事项

1. **测试成功才能保存**: 只有当测试请求返回状态码200时，才会显示"保存测试配置"按钮
2. **JSON格式验证**: 保存前会验证请求头和请求体是否为有效的JSON格式
3. **自动刷新**: 保存成功后会自动刷新配置列表
4. **字段覆盖**: 保存时只更新提供的字段，未提供的字段保持原值
5. **Token安全**: API Token会完整保存到数据库，请确保数据库安全

## 错误处理

### 1. 请求头格式错误
```
错误信息：请求头格式错误，无法解析
原因：请求头不是有效的JSON格式
解决：检查请求头的JSON格式是否正确
```

### 2. 请求体格式错误
```
错误信息：请求体格式错误，无法解析
原因：请求体不是有效的JSON格式
解决：检查请求体的JSON格式是否正确
```

### 3. 配置不存在
```
错误信息：测试配置不存在
原因：testConfig为空
解决：重新打开测试对话框
```

### 4. 保存失败
```
错误信息：保存失败: [具体错误信息]
原因：后端接口调用失败
解决：检查网络连接和后端服务状态
```

## 开发说明

### 前端文件
- **页面**: `web-admin/src/views/aiconfig/AiConfigList.vue`
- **API**: `web-admin/src/api/aiconfig.ts`
- **类型**: `web-admin/src/types/aiconfig.ts`

### 后端文件
- **Controller**: `backend-single/src/main/java/com/emotion/controller/AiConfigController.java`
- **Service**: `backend-single/src/main/java/com/emotion/service/AiConfigService.java`
- **ServiceImpl**: `backend-single/src/main/java/com/emotion/service/impl/AiConfigServiceImpl.java`
- **Request DTO**: `backend-single/src/main/java/com/emotion/dto/request/aiconfig/AiConfigTestUpdateRequest.java`

### 数据库字段
- `api_base_url`: API完整URL
- `api_token`: API访问令牌
- `bot_id`: Bot ID
- `workflow_id`: Workflow ID
- `custom_headers`: 自定义请求头（JSON字符串）
- `custom_params`: 自定义参数（JSON字符串）
- `support_stream`: 是否支持流式输出（0-不支持，1-支持）

## 更新日志

### 2025-12-22
- 新增测试后保存配置功能
- 新增 `AiConfigTestUpdateRequest` DTO
- 新增 `updateFromTestRequest` 服务方法
- 新增 `/aiConfig/updateFromTest` 接口
- 前端新增"保存测试配置"按钮和处理逻辑
