# 配置选项

助手配置界面包含多个标签页，每个标签页负责不同方面的配置。

## 全局设置

全局设置定义助手的核心对话能力。

| 配置项 | 说明 | 建议值 |
|-------|------|--------|
| 助手名称 | 用于标识和管理 | 简洁明确 |
| 系统提示词 | 定义角色、任务和约束 | 详见[提示词指南](prompts.md) |
| 开场白 | 对话开始时的问候语 | 简短友好 |
| 温度参数 | 控制回复随机性 | 0.7（通用）/ 0.3（严谨） |
| 上下文长度 | 保留的历史消息数 | 10-20 |

### 高级选项

- **首轮模式** - 设置首次对话的触发方式
- **打断检测** - 用户打断时的处理策略
- **超时设置** - 无响应时的处理

## 语音配置

配置语音识别和语音合成参数。

### TTS 语音合成

| 配置 | 说明 |
|------|------|
| TTS 引擎 | 选择语音合成服务（阿里/火山/Minimax） |
| 音色 | 选择语音风格和性别 |
| 语速 | 语音播放速度（0.5-2.0） |
| 音量 | 语音输出音量（0-100） |
| 音调 | 语音音调高低（0.5-2.0） |

### ASR 语音识别

| 配置 | 说明 |
|------|------|
| ASR 引擎 | 选择语音识别服务 |
| 语言 | 识别语言（中文/英文/多语言） |
| 热词 | 提高特定词汇识别准确率 |

## 工具绑定

配置助手可调用的外部工具。

### 可用工具类型

| 工具 | 说明 |
|------|------|
| 搜索工具 | 网络搜索获取信息 |
| 天气查询 | 查询天气预报 |
| 计算器 | 数学计算 |
| 知识库检索 | RAG 知识检索 |
| 自定义工具 | HTTP 回调外部 API |

### 配置步骤

1. 在工具列表中勾选需要的工具
2. 配置工具参数（如有）
3. 测试工具调用是否正常

## 知识关联

关联 RAG 知识库，让助手能够回答专业领域问题。

### 配置参数

| 参数 | 说明 | 建议值 |
|------|------|--------|
| 知识库 | 选择要关联的知识库 | - |
| 相似度阈值 | 低于此分数不返回 | 0.7 |
| 返回数量 | 单次检索返回条数 | 3 |
| 检索策略 | 混合/向量/关键词 | 混合 |

### 多知识库

支持关联多个知识库，系统会自动合并检索结果。

## 外部链接

配置第三方服务集成和 Webhook 回调。

### Webhook 配置

| 字段 | 说明 |
|------|------|
| 回调 URL | 接收事件的 HTTP 端点 |
| 事件类型 | 订阅的事件（对话开始/结束/工具调用等） |
| 认证方式 | API Key / Bearer Token / 无 |

### 支持的事件

- `conversation.started` - 对话开始
- `conversation.ended` - 对话结束
- `tool.called` - 工具被调用
- `human.transfer` - 转人工

## 配置持久化与运行时覆盖

助手配置分为两层：

1. **数据库持久化配置（基线配置）**：通过助手管理 API 保存，后续会话默认读取这一层。
2. **会话级覆盖配置（runtime overrides）**：仅对当前 WebSocket 会话生效，不会写回数据库。

### 哪些配置会存到数据库

以下字段会持久化在 `assistants` / `assistant_opener_audio` 等表中（通过创建/更新助手写入）：

| 类别 | 典型字段 |
|------|---------|
| 对话行为 | `name`、`prompt`、`opener`、`firstTurnMode`、`generatedOpenerEnabled` |
| 输出与打断 | `voiceOutputEnabled`、`voice`、`speed`、`botCannotBeInterrupted`、`interruptionSensitivity` |
| 工具与知识库 | `tools`、`knowledgeBaseId` |
| 模型与外部模式 | `configMode`、`apiUrl`、`apiKey`、`llmModelId`、`asrModelId`、`embeddingModelId`、`rerankModelId` |
| 开场音频 | `openerAudioEnabled` 及音频文件状态（`ready`、`durationMs` 等） |

> 引擎在连接时通过 `assistant_id` 从后端读取该助手的 `sessionStartMetadata` 作为默认运行配置。

### 哪些配置可以在会话中覆盖

客户端可在 `session.start.metadata.overrides` 中覆盖以下白名单字段（仅当前会话有效）：

- `systemPrompt`
- `greeting`
- `firstTurnMode`
- `generatedOpenerEnabled`
- `output`
- `bargeIn`
- `knowledgeBaseId`
- `knowledge`
- `tools`
- `openerAudio`

以下字段不能由客户端覆盖：

- `services`（模型 provider / apiKey / baseUrl 等）
- `assistantId` / `appId` / `configVersionId`（及下划线变体）
- 包含密钥语义的字段（如 `apiKey`、`token`、`secret`、`password`、`authorization`）

### 覆盖示例（代码）

下面示例展示「数据库基线配置 + 会话 overrides」的最终效果。

```json
// 1) 数据库存储的基线配置（示意）
// GET /api/v1/assistants/asst_demo/config -> sessionStartMetadata
{
  "systemPrompt": "你是电商客服助手，回答要简洁。",
  "greeting": "你好，我是你的客服助手。",
  "firstTurnMode": "bot_first",
  "output": { "mode": "audio" },
  "knowledgeBaseId": "kb_orders",
  "tools": [
    { "type": "function", "function": { "name": "query_order" } }
  ]
}
```

```json
// 2) 客户端发起会话时的覆盖
{
  "type": "session.start",
  "metadata": {
    "channel": "web",
    "history": { "userId": 1001 },
    "overrides": {
      "greeting": "你好，我来帮你查订单进度。",
      "output": { "mode": "text" },
      "knowledgeBaseId": "kb_vip_orders",
      "tools": [
        { "type": "function", "function": { "name": "query_vip_order" } }
      ]
    }
  }
}
```

```json
// 3) 引擎合并后的有效配置（示意）
{
  "assistantId": "asst_demo",
  "systemPrompt": "你是电商客服助手，回答要简洁。",
  "greeting": "你好，我来帮你查订单进度。",
  "firstTurnMode": "bot_first",
  "output": { "mode": "text" },
  "knowledgeBaseId": "kb_vip_orders",
  "tools": [
    { "type": "function", "function": { "name": "query_vip_order" } }
  ],
  "channel": "web",
  "history": { "userId": 1001 }
}
```

合并规则可简化为：

```python
effective = {**db_session_start_metadata, **metadata.overrides}
```

当 `WS_EMIT_CONFIG_RESOLVED=true` 时，服务端会返回 `config.resolved`（公开、安全裁剪后的快照）用于前端调试当前生效配置。

## 配置导入导出

### 导出配置

1. 在助手详情页点击 **更多**
2. 选择 **导出配置**
3. 下载 JSON 格式的配置文件

### 导入配置

1. 点击 **新建助手**
2. 选择 **从配置导入**
3. 上传配置文件
