# 意图驱动话术流程 - 任务分解

---
feature_id: "IDS"
title: "意图驱动话术流程任务清单"
status: "in-progress"
version: "1.2.0"
last_updated: "2026-03-01"
---

## 任务概览

本文档将需求规范中的 13 个验收标准分解为可执行的开发任务，按 Phase 组织。

**总体进度**: 22/26 任务完成 (85%)

| Phase | 描述 | 任务数 | 完成数 | 进度 |
|-------|------|--------|--------|------|
| Phase 1 | 数据模型与 API 扩展 | 4 | 4 | 100% |
| Phase 2 | 后端话术生成引擎 | 6 | 6 | 100% |
| Phase 3 | 前端配置界面 | 6 | 6 | 100% |
| Phase 4 | 测试与验证 | 6 | 6 | 100% |
| Phase 5 | 部署与发布 | 4 | 0 | 0% |

---

## Phase 1: 数据模型与 API 扩展

**目标**: 扩展数据结构和 API 契约，为意图驱动话术提供基础

**预计工时**: 0.5 天

**依赖**: 无

### Task 1.1: 扩展 Python 类型定义
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-01
- **优先级**: P0
- **依赖**: 无
- **负责人**: backend

**描述**: 在后端 Python 代码中扩展 FlowStep 的类型定义

**文件修改**:
- `ai-service/app/models/entities.py` 或 `ai-service/app/schemas/script_flow.py`

**具体步骤**:
1. 找到 `FlowStep` 相关的类型定义（可能在 Pydantic model 或 TypedDict 中）
2. 添加以下可选字段：
   ```python
   script_mode: Optional[Literal["fixed", "flexible", "template"]] = "fixed"
   intent: Optional[str] = None
   intent_description: Optional[str] = None
   script_constraints: Optional[List[str]] = None
   expected_variables: Optional[List[str]] = None
   ```
3. 确保向后兼容：所有新字段都是可选的，有默认值

**验收测试**:
```python
# 测试向后兼容
step_old = {"step_no": 1, "content": "Hello"}
# 应该能正常解析，script_mode 默认为 "fixed"

# 测试新字段
step_new = {
    "step_no": 1,
    "script_mode": "flexible",
    "intent": "获取用户姓名",
    "script_constraints": ["必须礼貌"],
    "content": "请问怎么称呼您？"
}
# 应该能正常解析
```

**完成标准**:
- [x] 类型定义已扩展
- [x] 所有新字段都是可选的
- [x] 代码通过类型检查（mypy/pyright）

---

### Task 1.2: 扩展前端 TypeScript 类型定义
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-07
- **优先级**: P0
- **依赖**: 无
- **负责人**: frontend

**描述**: 在前端 TypeScript 代码中扩展 FlowStep 接口

**文件修改**:
- `ai-service-admin/src/types/script-flow.ts`

**具体步骤**:
1. 打开 `script-flow.ts` 文件
2. 找到 `FlowStep` 接口定义
3. 添加新字段：
   ```typescript
   export type ScriptMode = 'fixed' | 'flexible' | 'template'

   export interface FlowStep {
     // ... 现有字段 ...

     // 新增字段
     script_mode?: ScriptMode
     intent?: string
     intent_description?: string
     script_constraints?: string[]
     expected_variables?: string[]
   }
   ```
4. 添加常量定义：
   ```typescript
   export const SCRIPT_MODE_OPTIONS = [
     { value: 'fixed', label: '固定话术', description: '话术内容固定不变' },
     { value: 'flexible', label: '灵活话术', description: 'AI根据意图和上下文生成' },
     { value: 'template', label: '模板话术', description: 'AI填充模板中的变量' }
   ] as const
   ```

**完成标准**:
- [x] TypeScript 类型定义已扩展
- [x] 所有新字段都是可选的
- [x] 代码通过 TypeScript 编译

---

### Task 1.3: 更新 OpenAPI 契约
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-02
- **优先级**: P0
- **依赖**: Task 1.1

**描述**: 更新 openapi.admin.yaml 中 ScriptFlow 相关接口的 schema

**文件修改**:
- `spec/intent-driven-script/openapi.admin.yaml` 或 `ai-service/openapi/admin.yaml`

**具体步骤**:
1. 找到 `FlowStepSchema` 定义
2. 添加新字段定义：
   ```yaml
   script_mode:
     type: string
     enum: [fixed, flexible, template]
     default: fixed
     description: 话术生成模式
   intent:
     type: string
     description: 步骤意图（灵活模式必填）
   intent_description:
     type: string
     description: 意图详细说明
   script_constraints:
     type: array
     items:
       type: string
     description: 话术约束条件
   expected_variables:
     type: array
     items:
       type: string
     description: 期望提取的变量
   ```
3. 更新接口文档说明
4. 标记契约成熟度为 L1

**完成标准**:
- [x] OpenAPI schema 已更新
- [x] 所有新字段标记为 optional
- [x] 契约通过 lint 校验

---

### Task 1.4: 验证 API 向后兼容性
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-02, AC-IDS-13
- **优先级**: P0
- **依赖**: Task 1.1, Task 1.3

**描述**: 确保 API 扩展不破坏现有客户端

**测试场景**:
1. 使用旧版请求体创建流程（不包含新字段）
2. 验证流程能正常保存和执行
3. 验证 API 响应包含新字段（值为 null 或默认值）

**测试文件**:
- `ai-service/tests/api/test_script_flow_backward_compat.py`

**测试用例**:
```python
async def test_create_flow_without_new_fields():
    """测试不包含新字段的请求能正常工作"""
    payload = {
        "name": "测试流程",
        "steps": [
            {"step_no": 1, "content": "Hello", "wait_input": True}
        ]
    }
    response = await client.post("/admin/script-flows", json=payload)
    assert response.status_code == 201

    # 验证响应包含新字段（默认值）
    flow = response.json()
    assert flow["steps"][0]["script_mode"] == "fixed"
    assert flow["steps"][0]["intent"] is None

async def test_execute_old_flow():
    """测试旧流程能正常执行"""
    # 创建不包含新字段的流程
    # 启动流程
    # 验证返回固定话术
```

**完成标准**:
- [x] 所有向后兼容性测试通过
- [x] 旧版客户端不受影响

---

## Phase 2: 后端话术生成引擎

**目标**: 实现三种模式的话术生成逻辑

**预计工时**: 2 天

**依赖**: Phase 1 完成

### Task 2.1: 创建 ScriptGenerator 模块
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-04
- **优先级**: P0
- **依赖**: Task 1.1

**描述**: 实现灵活模式的话术生成器

**文件创建**:
- `ai-service/app/services/flow/script_generator.py`

**具体实现**:
```python
"""
[AC-IDS-04] Script Generator for flexible mode
"""
import asyncio
import logging
from typing import Optional

logger = logging.getLogger(__name__)


class ScriptGenerator:
    """灵活模式话术生成器"""

    def __init__(self, orchestrator):
        self._orchestrator = orchestrator

    async def generate(
        self,
        intent: str,
        intent_description: Optional[str],
        constraints: list[str],
        context: dict,
        history: list[dict],
        fallback: str
    ) -> str:
        """
        生成灵活话术

        Args:
            intent: 步骤意图
            intent_description: 意图详细说明
            constraints: 话术约束条件
            context: 会话上下文
            history: 对话历史
            fallback: 失败时的 fallback 话术

        Returns:
            生成的话术文本
        """
        try:
            prompt = self._build_prompt(
                intent, intent_description, constraints, context, history
            )

            response = await asyncio.wait_for(
                self._orchestrator.generate_text(prompt),
                timeout=2.0
            )

            generated = response.strip()
            logger.info(
                f"[AC-IDS-04] Generated flexible script: "
                f"intent={intent}, length={len(generated)}"
            )
            return generated

        except asyncio.TimeoutError:
            logger.warning(
                f"[AC-IDS-05] Script generation timeout, use fallback: "
                f"intent={intent}"
            )
            return fallback

        except Exception as e:
            logger.error(
                f"[AC-IDS-05] Script generation failed: {e}, use fallback"
            )
            return fallback

    def _build_prompt(
        self,
        intent: str,
        intent_description: Optional[str],
        constraints: list[str],
        context: dict,
        history: list[dict]
    ) -> str:
        """构建 LLM Prompt"""
        prompt_parts = [
            "你是一个客服对话系统，当前需要执行以下步骤：",
            "",
            f"【步骤目标】{intent}"
        ]

        if intent_description:
            prompt_parts.append(f"【详细说明】{intent_description}")

        if constraints:
            prompt_parts.append("")
            prompt_parts.append("【约束条件】")
            for c in constraints:
                prompt_parts.append(f"- {c}")

        if history:
            prompt_parts.append("")
            prompt_parts.append("【对话历史】")
            for msg in history[-3:]:
                role = "用户" if msg.get("role") == "user" else "客服"
                content = msg.get("content", "")
                prompt_parts.append(f"{role}: {content}")

        if context.get("inputs"):
            prompt_parts.append("")
            prompt_parts.append("【已收集信息】")
            for inp in context["inputs"]:
                prompt_parts.append(f"- {inp}")

        prompt_parts.extend([
            "",
            "请生成一句符合目标和约束的话术（不超过50字）。",
            "只返回话术内容，不要解释。"
        ])

        return "\n".join(prompt_parts)
```

**完成标准**:
- [x] ScriptGenerator 类已实现
- [x] Prompt 构建逻辑完整
- [x] 超时和异常处理正确
- [x] 日志记录完整

---

### Task 2.2: 创建 TemplateEngine 模块
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-06
- **优先级**: P1
- **依赖**: Task 1.1

**描述**: 实现模板模式的变量填充逻辑

**文件创建**:
- `ai-service/app/services/flow/template_engine.py`

**具体实现**:
```python
"""
[AC-IDS-06] Template Engine for template mode
"""
import asyncio
import logging
import re
from typing import Optional

logger = logging.getLogger(__name__)


class TemplateEngine:
    """模板话术引擎"""

    VARIABLE_PATTERN = re.compile(r'\{(\w+)\}')

    def __init__(self, orchestrator):
        self._orchestrator = orchestrator

    async def fill_template(
        self,
        template: str,
        context: dict,
        history: list[dict]
    ) -> str:
        """
        填充模板变量

        Args:
            template: 话术模板（包含 {变量名} 占位符）
            context: 会话上下文
            history: 对话历史

        Returns:
            填充后的话术
        """
        try:
            variables = self.VARIABLE_PATTERN.findall(template)

            if not variables:
                return template

            variable_values = {}
            for var in variables:
                value = await self._generate_variable_value(var, context, history)
                variable_values[var] = value

            result = template
            for var, value in variable_values.items():
                result = result.replace(f"{{{var}}}", value)

            logger.info(
                f"[AC-IDS-06] Filled template: "
                f"variables={list(variable_values.keys())}"
            )
            return result

        except Exception as e:
            logger.error(f"[AC-IDS-06] Template fill failed: {e}, return original")
            return template

    async def _generate_variable_value(
        self,
        variable_name: str,
        context: dict,
        history: list[dict]
    ) -> str:
        """为单个变量生成值"""
        if variable_name in context:
            return str(context[variable_name])

        prompt = f"""
根据对话历史，为变量 "{variable_name}" 生成合适的值。

对话历史：
{self._format_history(history[-3:])}

只返回变量值，不要解释。
"""

        try:
            response = await asyncio.wait_for(
                self._orchestrator.generate_text(prompt),
                timeout=1.0
            )
            return response.strip()
        except:
            logger.warning(
                f"[AC-IDS-06] Failed to generate value for {variable_name}, "
                f"use placeholder"
            )
            return f"[{variable_name}]"

    def _format_history(self, history: list[dict]) -> str:
        """格式化对话历史"""
        lines = []
        for msg in history:
            role = "用户" if msg.get("role") == "user" else "客服"
            content = msg.get("content", "")
            lines.append(f"{role}: {content}")
        return "\n".join(lines)
```

**完成标准**:
- [x] TemplateEngine 类已实现
- [x] 变量提取和替换逻辑正确
- [x] 异常处理和 fallback 完整

---

### Task 2.3: 扩展 FlowEngine - 添加话术生成方法
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-03
- **优先级**: P0
- **依赖**: Task 2.1, Task 2.2

**描述**: 在 FlowEngine 中添加话术生成的核心方法

**文件修改**:
- `ai-service/app/services/flow/engine.py`

**具体步骤**:
1. 在 `FlowEngine.__init__()` 中初始化生成器
2. 添加 `_generate_step_content()` 方法
3. 添加 `_get_conversation_history()` 辅助方法

**完成标准**:
- [x] `_generate_step_content()` 方法已实现
- [x] 三种模式的分支逻辑正确
- [x] `_get_conversation_history()` 方法已实现
- [x] 错误处理和 fallback 完整

---

### Task 2.4: 修改 FlowEngine.start() 方法
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-05
- **优先级**: P0
- **依赖**: Task 2.3

**描述**: 修改流程启动逻辑，在首步使用话术生成

**文件修改**:
- `ai-service/app/services/flow/engine.py`

**具体步骤**:
1. 在 `start()` 方法中调用 `_get_conversation_history()`
2. 调用 `_generate_step_content()` 生成首步话术
3. 确保向后兼容（无 orchestrator 时使用固定话术）

**完成标准**:
- [x] start() 方法已修改
- [x] 首步话术能正确生成
- [x] 向后兼容测试通过

---

### Task 2.5: 修改 FlowEngine.advance() 方法
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-05
- **优先级**: P0
- **依赖**: Task 2.3

**描述**: 修改流程推进逻辑，在后续步骤使用话术生成

**文件修改**:
- `ai-service/app/services/flow/engine.py`

**具体步骤**:
1. 在 `advance()` 方法中调用 `_get_conversation_history()`
2. 调用 `_generate_step_content()` 生成下一步话术
3. 确保向后兼容

**完成标准**:
- [x] advance() 方法已修改
- [x] 后续步骤话术能正确生成
- [x] 向后兼容测试通过

---

### Task 2.6: 实现 Fallback 机制
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-05
- **优先级**: P0
- **依赖**: Task 2.1

**描述**: 确保话术生成失败时有明确的 fallback 策略

**技术要求**:
- LLM 调用超时（2秒）时，返回 `step.content` 作为 fallback
- LLM 返回错误时，记录日志并返回 fallback
- Fallback 话术不为空时使用，否则返回默认提示

**验收测试**:
- 模拟 LLM 超时，验证返回 fallback 话术
- 模拟 LLM 错误，验证日志记录和 fallback

**完成标准**:
- [x] 超时 fallback 已实现
- [x] 异常 fallback 已实现
- [x] 日志记录完整
- [x] 单元测试通过

---

## Phase 3: 前端配置界面

**目标**: 提供意图驱动话术的配置界面

**预计工时**: 1.5 天

**依赖**: Phase 1 完成

### Task 3.1: 创建话术模式选择组件
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-08
- **优先级**: P0
- **依赖**: Task 1.2

**描述**: 在步骤配置表单中增加话术模式选择

**文件修改**:
- `ai-service-admin/src/views/admin/script-flow/index.vue`

**具体步骤**:
1. 添加 Radio Group 选择话术模式
2. 根据选择的模式动态显示对应配置项
3. 模式切换时保留已填写的数据

**UI 要求**:
- 固定模式：显示 `content` 输入框
- 灵活模式：显示 `intent`、`intent_description`、`constraints` 配置
- 模板模式：显示 `content` 输入框（带模板语法提示）

**完成标准**:
- [x] 模式选择器已实现
- [x] 动态表单切换正确
- [x] 数据保留逻辑正确

---

### Task 3.2: 创建意图配置表单
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-08
- **优先级**: P0
- **依赖**: Task 3.1

**描述**: 实现灵活模式的意图配置表单

**文件修改**:
- `ai-service-admin/src/views/admin/script-flow/index.vue`

**具体步骤**:
1. 添加"步骤意图"输入框（必填）
2. 添加"意图说明"文本域（可选）
3. 添加"期望变量"输入（可选）
4. 添加表单校验规则

**完成标准**:
- [x] 意图配置表单已实现
- [x] 表单校验正确
- [x] 数据绑定正确

---

### Task 3.3: 创建约束条件管理组件
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-09
- **优先级**: P0
- **依赖**: Task 1.2

**描述**: 实现约束条件的添加、删除、编辑

**文件创建**:
- `ai-service-admin/src/views/admin/script-flow/components/ConstraintManager.vue`

**具体实现**:
```vue
<template>
  <div class="constraint-manager">
    <div class="constraint-tags">
      <el-tag
        v-for="(constraint, index) in modelValue"
        :key="index"
        closable
        @close="removeConstraint(index)"
      >
        {{ constraint }}
      </el-tag>
    </div>

    <el-input
      v-model="newConstraint"
      placeholder="输入约束条件后按回车添加"
      @keyup.enter="addConstraint"
      class="constraint-input"
    >
      <template #append>
        <el-button @click="addConstraint">添加</el-button>
      </template>
    </el-input>

    <div class="constraint-presets">
      <span class="preset-label">常用约束：</span>
      <el-button
        v-for="preset in PRESET_CONSTRAINTS"
        :key="preset"
        size="small"
        @click="addPreset(preset)"
      >
        {{ preset }}
      </el-button>
    </div>
  </div>
</template>

<script setup lang="ts">
const PRESET_CONSTRAINTS = [
  '必须礼貌',
  '语气自然',
  '简洁明了',
  '不要生硬',
  '不要重复'
]

const addConstraint = () => {
  if (newConstraint.value.trim()) {
    emit('update:modelValue', [...modelValue.value, newConstraint.value.trim()])
    newConstraint.value = ''
  }
}
</script>
```

**完成标准**:
- [x] ConstraintManager 组件已实现
- [x] 支持添加/删除约束
- [x] 支持预设约束快捷添加
- [x] 组件已集成到主表单

---

### Task 3.4: 创建模板话术配置组件
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-04
- **优先级**: P1
- **依赖**: Task 3.1

**描述**: 实现模板模式的配置界面

**文件修改**:
- `ai-service-admin/src/views/admin/script-flow/index.vue`

**具体步骤**:
1. 添加话术模板输入框
2. 添加模板语法提示
3. 添加变量高亮显示（可选）

**UI 示例**:
```
话术模板: [您好{greeting_style}，请问您{polite_form}？]
提示：使用 {变量名} 标记需要AI填充的部分
```

**完成标准**:
- [x] 模板配置界面已实现
- [x] 语法提示清晰
- [x] 数据绑定正确

---

### Task 3.5: 增强流程预览组件
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-10
- **优先级**: P1
- **依赖**: Task 3.1

**描述**: 在流程预览中显示步骤的意图信息

**文件修改**:
- `ai-service-admin/src/views/admin/script-flow/components/FlowPreview.vue`

**具体步骤**:
1. 显示步骤的 `script_mode`
2. 灵活模式显示意图和约束
3. 固定模式显示话术内容
4. 模板模式显示模板预览

**完成标准**:
- [x] 预览组件已增强
- [x] 意图信息显示正确
- [x] 不同模式显示不同内容

---

### Task 3.6: 前端表单校验与提交
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-08
- **优先级**: P0
- **依赖**: Task 3.1, Task 3.2, Task 3.3

**描述**: 实现表单校验和数据提交逻辑

**文件修改**:
- `ai-service-admin/src/views/admin/script-flow/index.vue`

**校验规则**:
- 灵活模式：`intent` 必填，`content`（fallback）必填
- 模板模式：`content` 必填，检查模板语法
- 固定模式：`content` 必填

**完成标准**:
- [x] 表单校验规则已实现
- [x] 提交逻辑正确
- [x] 错误提示清晰

---

## Phase 4: 测试与验证

**目标**: 确保功能正确性和向后兼容性

**预计工时**: 1 天

**依赖**: Phase 2, Phase 3 完成

### Task 4.1: 后端单元测试 - ScriptGenerator
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-11
- **优先级**: P0
- **依赖**: Task 2.1

**描述**: 为 ScriptGenerator 编写单元测试

**测试文件**:
- `ai-service/tests/services/flow/test_script_generator.py`

**测试用例**:
- 正常生成话术
- 超时 fallback
- 异常 fallback
- Prompt 构建正确性

**完成标准**:
- [x] 测试文件已创建
- [x] 所有测试用例通过
- [x] 代码覆盖率 > 80%

---

### Task 4.2: 后端单元测试 - TemplateEngine
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-11
- **优先级**: P0
- **依赖**: Task 2.2

**描述**: 为 TemplateEngine 编写单元测试

**测试文件**:
- `ai-service/tests/services/flow/test_template_engine.py`

**测试用例**:
- 变量提取正确性
- 变量替换正确性
- 从上下文获取变量值
- LLM 生成变量值
- 异常处理

**完成标准**:
- [x] 测试文件已创建
- [x] 所有测试用例通过
- [x] 代码覆盖率 > 80%

---

### Task 4.3: 后端单元测试 - FlowEngine
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-11
- **优先级**: P0
- **依赖**: Task 2.3, Task 2.4, Task 2.5

**描述**: 为 FlowEngine 话术生成逻辑编写单元测试

**测试文件**:
- `ai-service/tests/services/flow/test_engine_script_generation.py`

**测试用例**:
- 固定模式话术生成
- 灵活模式话术生成
- 模板模式话术生成
- 对话历史获取
- 边界情况（空配置、无效配置）

**完成标准**:
- [x] 测试文件已创建
- [x] 所有测试用例通过
- [x] 代码覆盖率 > 80%

---

### Task 4.4: 集成测试 - 端到端流程
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-12
- **优先级**: P0
- **依赖**: Task 4.1, Task 4.2, Task 4.3

**描述**: 端到端测试意图驱动流程的执行

**测试文件**:
- `ai-service/tests/api/test_script_flow_intent_driven.py`

**测试场景**:
1. 创建灵活模式流程
2. 启动流程，验证首步话术生成
3. 输入用户消息，验证流程推进和话术生成
4. 验证对话历史正确传递

**完成标准**:
- [x] 测试文件已创建
- [x] 所有测试场景通过
- [x] 测试覆盖主要业务流程

---

### Task 4.5: 向后兼容性测试
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-13
- **优先级**: P0
- **依赖**: Task 4.4

**描述**: 验证现有固定话术流程不受影响

**测试场景**:
1. 加载现有流程（无 script_mode 字段）
2. 执行流程，验证话术正常返回
3. 验证 API 响应包含新字段但值为 null
4. 验证前端能正确显示旧流程数据

**完成标准**:
- [x] 所有向后兼容性测试通过
- [x] 现有流程不受影响

---

### Task 4.6: 前端组件测试
- [x] **状态**: ✅已完成 (2026-02-28)
- **验收标准**: AC-IDS-08, AC-IDS-09
- **优先级**: P1
- **依赖**: Task 3.1, Task 3.2, Task 3.3

**描述**: 为前端组件编写测试

**测试文件**:
- `ai-service-admin/src/views/admin/script-flow/__tests__/`

**测试用例**:
- 模式选择器交互
- 约束条件管理
- 表单校验
- 数据提交

**完成标准**:
- [x] 测试文件已创建
- [x] 主要交互测试通过

---

## Phase 5: 部署与发布

**目标**: 安全部署新功能

**预计工时**: 0.5 天

**依赖**: Phase 4 全部完成

### Task 5.1: 更新部署文档
- [ ] **状态**: 待开始
- **验收标准**: N/A
- **优先级**: P0
- **依赖**: Phase 4 完成

**描述**: 更新部署文档和变更日志

**文件修改**:
- `CHANGELOG.md`
- `docs/deployment.md`（如存在）

**具体内容**:
- 记录新功能
- 记录 API 变更
- 记录配置变更（如有）

**完成标准**:
- [ ] 变更日志已更新
- [ ] 部署文档已更新

---

### Task 5.2: 灰度发布准备
- [ ] **状态**: 待开始
- **验收标准**: N/A
- **优先级**: P0
- **依赖**: Task 5.1

**描述**: 准备灰度发布环境

**具体步骤**:
1. 选择灰度租户
2. 配置监控告警
3. 准备回滚方案

**完成标准**:
- [ ] 灰度租户已确定
- [ ] 监控已配置
- [ ] 回滚方案已准备

---

### Task 5.3: 执行灰度发布
- [ ] **状态**: 待开始
- **验收标准**: N/A
- **优先级**: P0
- **依赖**: Task 5.2

**描述**: 执行灰度发布并监控

**具体步骤**:
1. 部署后端服务
2. 部署前端服务
3. 监控关键指标
4. 收集用户反馈

**监控指标**:
- 话术生成延迟
- 超时率
- 错误率
- Fallback 使用率

**完成标准**:
- [ ] 灰度发布成功
- [ ] 无严重问题
- [ ] 用户反馈正常

---

### Task 5.4: 全量发布
- [ ] **状态**: 待开始
- **验收标准**: N/A
- **优先级**: P0
- **依赖**: Task 5.3

**描述**: 灰度验证通过后全量发布

**具体步骤**:
1. 确认灰度指标正常
2. 执行全量发布
3. 持续监控

**完成标准**:
- [ ] 全量发布成功
- [ ] 功能正常可用
- [ ] 无用户投诉

---

## 任务依赖关系图

```
Phase 1 (数据模型与 API 扩展)
├── Task 1.1 (Python 类型定义) ──────────────────────────────┐
├── Task 1.2 (TypeScript 类型定义) ──────────────────────────┤
├── Task 1.3 (OpenAPI 契约) ← Task 1.1 ──────────────────────┤
└── Task 1.4 (向后兼容性测试) ← Task 1.1, Task 1.3 ──────────┘
                              │
                              ▼
Phase 2 (后端话术生成引擎)
├── Task 2.1 (ScriptGenerator) ← Task 1.1 ───────────────────┐
├── Task 2.2 (TemplateEngine) ← Task 1.1 ────────────────────┤
├── Task 2.3 (FlowEngine 扩展) ← Task 2.1, Task 2.2 ─────────┤
├── Task 2.4 (start 方法修改) ← Task 2.3 ────────────────────┤
├── Task 2.5 (advance 方法修改) ← Task 2.3 ──────────────────┤
└── Task 2.6 (Fallback 机制) ← Task 2.1 ─────────────────────┘
                              │
                              ▼
Phase 3 (前端配置界面)
├── Task 3.1 (模式选择组件) ← Task 1.2 ──────────────────────┐
├── Task 3.2 (意图配置表单) ← Task 3.1 ──────────────────────┤
├── Task 3.3 (约束管理组件) ← Task 1.2 ──────────────────────┤
├── Task 3.4 (模板配置组件) ← Task 3.1 ──────────────────────┤
├── Task 3.5 (预览增强) ← Task 3.1 ──────────────────────────┤
└── Task 3.6 (表单校验提交) ← Task 3.1, Task 3.2, Task 3.3 ──┘
                              │
                              ▼
Phase 4 (测试与验证)
├── Task 4.1 (ScriptGenerator 测试) ← Task 2.1 ──────────────┐
├── Task 4.2 (TemplateEngine 测试) ← Task 2.2 ───────────────┤
├── Task 4.3 (FlowEngine 测试) ← Task 2.3, Task 2.4, Task 2.5┤
├── Task 4.4 (集成测试) ← Task 4.1, Task 4.2, Task 4.3 ──────┤
├── Task 4.5 (向后兼容测试) ← Task 4.4 ──────────────────────┤
└── Task 4.6 (前端组件测试) ← Task 3.1, Task 3.2, Task 3.3 ──┘
                              │
                              ▼
Phase 5 (部署与发布)
├── Task 5.1 (更新部署文档) ← Phase 4 完成 ──────────────────┐
├── Task 5.2 (灰度发布准备) ← Task 5.1 ──────────────────────┤
├── Task 5.3 (执行灰度发布) ← Task 5.2 ──────────────────────┤
└── Task 5.4 (全量发布) ← Task 5.3 ──────────────────────────┘
```

---

## 验收标准与任务映射

| 验收标准 | 关联任务 | 状态 |
|---------|---------|------|
| AC-IDS-01: 扩展 ScriptFlow 数据模型 | Task 1.1 | ✅已完成 |
| AC-IDS-02: 扩展 Admin API 契约 | Task 1.3, Task 1.4 | ✅已完成 |
| AC-IDS-03: 实现话术生成引擎 | Task 2.3 | ✅已完成 |
| AC-IDS-04: 实现灵活模式的 Prompt 构建 | Task 2.1 | ✅已完成 |
| AC-IDS-05: 实现 Fallback 机制 | Task 2.4, Task 2.5, Task 2.6 | ✅已完成 |
| AC-IDS-06: 实现模板模式的变量填充 | Task 2.2 | ✅已完成 |
| AC-IDS-07: 前端类型定义扩展 | Task 1.2 | ✅已完成 |
| AC-IDS-08: 配置界面增加模式选择 | Task 3.1, Task 3.2, Task 3.6 | ✅已完成 |
| AC-IDS-09: 约束条件管理组件 | Task 3.3 | ✅已完成 |
| AC-IDS-10: 流程预览增强 | Task 3.5 | ✅已完成 |
| AC-IDS-11: 单元测试覆盖 | Task 4.1, Task 4.2, Task 4.3 | ✅已完成 |
| AC-IDS-12: 集成测试 | Task 4.4 | ✅已完成 |
| AC-IDS-13: 向后兼容性测试 | Task 1.4, Task 4.5 | ✅已完成 |

---

## 风险与缓解

| 风险 | 影响任务 | 缓解措施 |
|------|---------|---------|
| LLM 服务不稳定 | Task 2.1, Task 2.2 | 实现 fallback 机制 |
| 前端组件库兼容性 | Task 3.1-3.6 | 提前验证组件 |
| 测试环境资源不足 | Task 4.1-4.6 | 使用 Mock 服务 |

---

## 备注

- 所有任务完成后，需更新本文档的状态字段
- 如有任务阻塞，需在任务描述中记录阻塞原因
- 任务工时为预估值，实际执行时可根据情况调整
