# 自动 Title 生成功能实现总结 ## ✅ 已完成的工作 ### 1. 核心实现文件 #### [`packages/harness/deerflow/agents/thread_state.py`](../packages/harness/deerflow/agents/thread_state.py) - ✅ 添加 `title: str | None = None` 字段到 `ThreadState` #### [`packages/harness/deerflow/config/title_config.py`](../packages/harness/deerflow/config/title_config.py) (新建) - ✅ 创建 `TitleConfig` 配置类 - ✅ 支持配置:enabled, max_words, max_chars, model_name, prompt_template - ✅ 提供 `get_title_config()` 和 `set_title_config()` 函数 - ✅ 提供 `load_title_config_from_dict()` 从配置文件加载 #### [`packages/harness/deerflow/agents/title_middleware.py`](../packages/harness/deerflow/agents/title_middleware.py) (新建) - ✅ 创建 `TitleMiddleware` 类 - ✅ 实现 `_should_generate_title()` 检查是否需要生成 - ✅ 实现 `_generate_title()` 调用 LLM 生成标题 - ✅ 实现 `after_agent()` 钩子,在首次对话后自动触发 - ✅ 包含 fallback 策略(LLM 失败时使用用户消息前几个词) #### [`packages/harness/deerflow/config/app_config.py`](../packages/harness/deerflow/config/app_config.py) - ✅ 导入 `load_title_config_from_dict` - ✅ 在 `from_file()` 中加载 title 配置 #### [`packages/harness/deerflow/agents/lead_agent/agent.py`](../packages/harness/deerflow/agents/lead_agent/agent.py) - ✅ 导入 `TitleMiddleware` - ✅ 注册到 `middleware` 列表:`[SandboxMiddleware(), TitleMiddleware()]` ### 2. 配置文件 #### [`config.yaml`](../config.yaml) - ✅ 添加 title 配置段: ```yaml title: enabled: true max_words: 6 max_chars: 60 model_name: null ``` ### 3. 文档 #### [`docs/AUTO_TITLE_GENERATION.md`](../docs/AUTO_TITLE_GENERATION.md) (新建) - ✅ 完整的功能说明文档 - ✅ 实现方式和架构设计 - ✅ 配置说明 - ✅ 客户端使用示例(TypeScript) - ✅ 工作流程图(Mermaid) - ✅ 故障排查指南 - ✅ State vs Metadata 对比 #### [`BACKEND_TODO.md`](../BACKEND_TODO.md) - ✅ 添加功能完成记录 ### 4. 测试 #### [`tests/test_title_generation.py`](../tests/test_title_generation.py) (新建) - ✅ 配置类测试 - ✅ Middleware 初始化测试 - ✅ TODO: 集成测试(需要 mock Runtime) --- ## 🎯 核心设计决策 ### 为什么使用 State 而非 Metadata? | 方面 | State (✅ 采用) | Metadata (❌ 未采用) | |------|----------------|---------------------| | **持久化** | 自动(通过 checkpointer) | 取决于实现,不可靠 | | **版本控制** | 支持时间旅行 | 不支持 | | **类型安全** | TypedDict 定义 | 任意字典 | | **标准化** | LangGraph 核心机制 | 扩展功能 | ### 工作流程 ``` 用户发送首条消息 ↓ Agent 处理并返回回复 ↓ TitleMiddleware.after_agent() 触发 ↓ 检查:是否首次对话?是否已有 title? ↓ 调用 LLM 生成 title ↓ 返回 {"title": "..."} 更新 state ↓ Checkpointer 自动持久化(如果配置了) ↓ 客户端从 state.values.title 读取 ``` --- ## 📋 使用指南 ### 后端配置 1. **启用/禁用功能** ```yaml # config.yaml title: enabled: true # 设为 false 禁用 ``` 2. **自定义配置** ```yaml title: enabled: true max_words: 8 # 标题最多 8 个词 max_chars: 80 # 标题最多 80 个字符 model_name: null # 使用默认模型 ``` 3. **配置持久化(可选)** 如果需要在本地开发时持久化 title: ```python # checkpointer.py from langgraph.checkpoint.sqlite import SqliteSaver checkpointer = SqliteSaver.from_conn_string("checkpoints.db") ``` ```json // langgraph.json { "graphs": { "lead_agent": "deerflow.agents:lead_agent" }, "checkpointer": "checkpointer:checkpointer" } ``` ### 客户端使用 ```typescript // 获取 thread title const state = await client.threads.getState(threadId); const title = state.values.title || "New Conversation"; // 显示在对话列表