
Conversation title is overwritten with an empty string when title generation returns no content
快速结论:当自动生成对话标题的 LLM 返回空字符串或仅含空白字符时,Dify 会直接将空值写入对话标题,导致对话标题变为空白。优先排查 LLMGenerator.generate_conversation_name() 的结果处理逻辑。
问题场景
该问题出现在使用 Dify API 或 WebUI 时,由以下两个路径触发:
- API 路径:调用
POST /api/conversations/{conversation_id}/name且 body 包含{"auto_generate": true}。 - 后台任务路径:新对话首条消息后自动触发的后台标题生成任务。
当用于标题生成的 LLM 返回空响应(空字符串或仅空白字符)时,对话标题会被直接覆盖为空字符串。
报错原文
Conversation title is overwritten with an empty string.
- API returns a successful response with "name": "".
- The conversation title becomes blank in the UI.
原因分析
根因位于 LLMGenerator.generate_conversation_name() 方法中:当 LLM 响应为空时,该方法明确返回空字符串(代码链接)。而两个调用方均未对结果进行空值/空白校验,直接将返回值写入 conversation.name:
- API 路径:
ConversationService.auto_generate_name()直接赋值,未校验(代码链接)。 - 后台任务路径:
MessageCycleManager._generate_conversation_name_worker()同样直接赋值,其回退逻辑仅在异常时触发,而非空字符串响应时(代码链接)。
有趣的是,手动重命名路径(auto_generate=False)在请求 schema 层面具有空名称校验,但 auto_generate=True 时绕过了此校验。
环境排查
- Dify 版本:1.15.0 及可能受影响的其他版本(基于 Issue 中的版本信息)。
- 部署方式:Self Hosted(Source 或 Docker)。
- LLM 配置:用于标题生成的模型是否可能返回空响应(如模型响应格式问题、内容过滤等)。
解决步骤
- 可优先尝试:在
LLMGenerator.generate_conversation_name()调用后,添加空值/空白校验。如果返回空字符串,则回退为首条用户消息的截断版本(遵循现有截断规则)。 - 修复位置 1:修改
api/services/conversation_service.py中的auto_generate_name()方法,在赋值前校验generate_conversation_name()的返回值。 - 修复位置 2:修改
api/core/app/task_pipeline/message_cycle_manager.py中的_generate_conversation_name_worker()方法,在赋值前校验返回值,或添加空响应时的回退逻辑。 - 如有需要:在
api/core/llm_generator/llm_generator.py中的generate_conversation_name()方法(约第167-168行)修改其空返回值行为,改为触发回退机制。 - 测试:编写可复现的测试用例,模拟 LLM 返回空字符串的场景,验证修复后标题不会被覆盖为空。
验证方法
部署修复后,通过以下方式验证:
- API 测试:使用模拟 LLM 返回空字符串的配置,调用
POST /api/conversations/{conversation_id}/name且auto_generate=true,检查响应中的name字段不应为空。 - UI 测试:发送首条消息触发自动标题生成,确保 LLM 返回空时对话标题不会变为空白,而是保留原有标题或显示首条消息截断。
- 回归测试:确认手动重命名路径(
auto_generate=false)功能不受影响。

![[Bug]: OpenAPI MCP `extra_headers` are not forwarded from client requests](https://www.chat-gpts.plus/wp-content/uploads/2026/07/26794-1f631a72-768x403.jpg)

