backend/docs/TITLE_GENERATION_IMPLEMENTATION.md
packages/harness/deerflow/agents/thread_state.pytitle: str | None = None 字段到 ThreadStatepackages/harness/deerflow/config/title_config.py (新建)TitleConfig 配置类get_title_config() 和 set_title_config() 函数load_title_config_from_dict() 从配置文件加载packages/harness/deerflow/agents/title_middleware.py (新建)TitleMiddleware 类_should_generate_title() 检查是否需要生成_generate_title() 调用 LLM 生成标题after_agent() 钩子,在首次对话后自动触发packages/harness/deerflow/config/app_config.pyload_title_config_from_dictfrom_file() 中加载 title 配置packages/harness/deerflow/agents/lead_agent/agent.pyTitleMiddlewaremiddleware 列表:[SandboxMiddleware(), TitleMiddleware()]config.yamltitle:
enabled: true
max_words: 6
max_chars: 60
model_name: null
docs/AUTO_TITLE_GENERATION.md (新建)BACKEND_TODO.mdtests/test_title_generation.py (新建)| 方面 | State (✅ 采用) | Metadata (❌ 未采用) |
|---|---|---|
| 持久化 | 自动(通过 checkpointer) | 取决于实现,不可靠 |
| 版本控制 | 支持时间旅行 | 不支持 |
| 类型安全 | TypedDict 定义 | 任意字典 |
| 标准化 | LangGraph 核心机制 | 扩展功能 |
用户发送首条消息
↓
Agent 处理并返回回复
↓
TitleMiddleware.after_agent() 触发
↓
检查:是否首次对话?是否已有 title?
↓
调用 LLM 生成 title
↓
返回 {"title": "..."} 更新 state
↓
Checkpointer 自动持久化(如果配置了)
↓
客户端从 state.values.title 读取
# config.yaml
title:
enabled: true # 设为 false 禁用
title:
enabled: true
max_words: 8 # 标题最多 8 个词
max_chars: 80 # 标题最多 80 个字符
model_name: null # 使用默认模型
如果需要在本地开发时持久化 title:
# checkpointer.py
from langgraph.checkpoint.sqlite import SqliteSaver
checkpointer = SqliteSaver.from_conn_string("checkpoints.db")
// langgraph.json
{
"graphs": {
"lead_agent": "deerflow.agents:lead_agent"
},
"checkpointer": "checkpointer:checkpointer"
}
// 获取 thread title
const state = await client.threads.getState(threadId);
const title = state.values.title || "New Conversation";
// 显示在对话列表
<li>{title}</li>
⚠️ 注意:Title 在 state.values.title,而非 thread.metadata.title
# 运行测试
pytest tests/test_title_generation.py -v
# 运行所有测试
pytest
title.enabled = truestate.values.title(不是 thread.metadata.title)after_agent 中运行,不阻塞主流程gpt-3.5-turbo)max_words 和 max_chars实现完成时间: 2026-01-14