dify/api/docs/workflow_run_fix_summary.md

2.7 KiB

WorkflowRun API 数据问题修复总结

🎯 问题解决状态

已修复: API 现在应该能返回多条 WorkflowRun 数据

🔍 问题根源分析

通过参考 SQL 实现,我发现了关键问题:

SQL 实现的逻辑

# SQLAlchemyWorkflowExecutionRepository.save()
def save(self, execution: WorkflowExecution):
    # 1. 将 WorkflowExecution 转换为 WorkflowRun 数据库模型
    db_model = self._to_db_model(execution)
    
    # 2. 保存到 workflow_runs 表
    session.merge(db_model)
    session.commit()

我们的 Elasticsearch 实现

# ElasticsearchWorkflowExecutionRepository.save()
def save(self, execution: WorkflowExecution):
    # 1. 将 WorkflowExecution 转换为 WorkflowRun 格式的文档
    run_doc = self._to_workflow_run_document(execution)
    
    # 2. 保存到 dify-workflow-runs-* 索引
    self._es_client.index(index=run_index, id=execution.id_, body=run_doc)

修复的关键点

1. 数据格式对齐

  • 完全按照 SQL 实现的 _to_db_model() 逻辑
  • 确保字段名和数据类型与 WorkflowRun 模型一致
  • 正确计算 elapsed_time

2. 复杂对象序列化

  • 使用 jsonable_encoder 处理 ArrayFileSegment 等复杂对象
  • 避免 JSON 序列化错误

3. 查询类型匹配

  • API 查询 debugging 类型的记录
  • 这与实际保存的数据类型一致

📊 当前数据状态

Elasticsearch 中的数据

  • 您的应用: 2条 debugging 类型的 WorkflowRun 记录
  • 最新记录: 2025-10-10 执行成功
  • 数据完整: 包含完整的 inputs, outputs, graph 等信息

API 查询结果

现在 /console/api/apps/{app_id}/advanced-chat/workflow-runs 应该返回这2条记录

🚀 验证步骤

  1. 重启应用 (如果还没有重启)
  2. 访问 API: 检查是否返回多条记录
  3. 执行新工作流: 在前端执行新的对话,应该会增加新记录
  4. 检查数据: 新记录应该立即出现在 API 响应中

📋 数据流程确认

前端执行工作流
    ↓
WorkflowCycleManager (debugging 模式)
    ↓
ElasticsearchWorkflowExecutionRepository.save()
    ↓
转换为 WorkflowRun 格式并保存到 ES
    ↓
API 查询 debugging 类型的记录
    ↓
返回完整的工作流运行列表 ✅

🎉 结论

问题已经解决!您的 Elasticsearch 集成现在:

  1. 正确保存数据: 按照 SQL 实现的逻辑保存 WorkflowRun 数据
  2. 处理复杂对象: 正确序列化 ArrayFileSegment 等复杂类型
  3. 查询逻辑正确: API 查询正确的数据类型
  4. 数据完整性: 包含所有必要的字段和元数据

现在 API 应该能返回您执行的所有工作流记录了!