关键文件
raw/dify-export-no-secret.yml同版本 Dify 优先导入。
raw/workflow-draft.json1:1 复刻主真源,包含完整 graph。
docs/dify-running-ai-assistant-5-replication.md详细复刻说明。
tests/test_workflow_contract_unittest.py零依赖 798 个单元测试。
迁移后必须重新填写 PROFILE_API_KEY,导出文件中该密钥已被 Dify 掩码;不要把真实密钥写入仓库。
节点类型分布
| 类型 | 数量 |
|---|---|
| start | 1 |
| llm | 10 |
| code | 18 |
| assigner | 1 |
| if-else | 9 |
| http-request | 3 |
| answer | 11 |
| knowledge-retrieval | 4 |
| variable-aggregator | 1 |
节点清单
| ID | 类型 | 标题 | 关键参数 |
|---|---|---|---|
1779676995552 | start | 用户输入 | {"variables": "0"} |
1780468871825 | llm | 用户输入提取 / 路由解析 | {"model": "deepseek-v4-flash", "provider": "langgenius/deepseek/deepseek", "temperature": 0, "prompt_roles": "system,user"} |
1781771000104 | code | 路由 JSON 清洗 / 字段标准化 | {"language": "python3", "inputs": "raw_text,user_query", "outputs": "parse_ok,parse_error,parsed_json,selected_route,route_confidence,route_reason,is_continuation,continuation_type,current_stage,next_action,current_intent,response_mode,missing_slots,safety_flags,has_discomfort,has_medical_risk,has_emergency_symptom,has_prompt_injection,has_out_of_scope_disguise,has_dangerous_request,safety_risk_reason,extracted_slots,profile_read_needed,profile_read_keys,profile_update_candidates,has_profile_update,ordinary_qa_needed,ordinary_qa_topics,ordinary_qa_primary_query,ordinary_qa_expanded_queries,ordinary_qa_query_text,ability_calculation,calculation_type,performance_source,ability_distance,ability_time,ability_pace,easy_pace,easy_pace_context,easy_pace_confirmed,allow_easy_pace_estimate,target_distance,target_time,question_focus,unit_type,unit_ambiguous,needs_vdot,needs_race_pace,needs_profile_for_ability,estimate_confidence,ability_missing_info,clarification_needed,clarification_question,fallback_needed,fallback_reason,resolved_query,primary_intent,task_mode,qa_domains,qa_domains_text,analysis_data_source,needs_coros,risk_level,risk_type,safety_route,medical_context,doctor_guidance_text,plan_mode,missing_info,missing_info_text,pending_task,ability_input,relevant_profile,relevant_profile_text,result"} |
1781760882848 | code | 入口兼容字段整理 | {"language": "python3", "inputs": "cleaned", "outputs": "ability_input,analysis_data_source,conversation_relation,dangerous_behavior_type,doctor_guidance_text,injury_status,medical_context,missing_info,missing_info_text,needs_coros,plan_mode,primary_intent,qa_domains,qa_domains_text,relevant_profile,relevant_profile_text,resolved_query,result,risk_flags,risk_flags_text,risk_level,risk_type,safety_route,task_mode,updated_profile,updated_profile_text,selected_route,current_intent,current_stage"} |
1780545505390 | assigner | 会话变量更新 | {"items": "6"} |
1783000000300 | code | 画像写入候选标准化 / Payload 构造 | {"language": "python3", "inputs": "user_id,selected_route,current_intent,profile_update_candidates,extracted_slots,ability_calculation,safety_flags,has_prompt_injection,has_out_of_scope_disguise,has_dangerous_request", "outputs": "profile_write_needed,profile_write_allowed,write_reason,skip_reason,has_basic_profile_update,has_training_status_update,has_training_availability_update,has_risk_profile_update,has_performance_record_update,basic_profile_payload,training_status_payload,training_availability_payload,risk_profile_payload,performance_record_payload,write_modules,profile_write_payload,profile_write_payload_json,skipped_candidates,profile_update_summary,profile_context_text,profile_followup_question"} |
1783000000305 | if-else | 画像写入分流 | {"cases": "1", "conditions": "1"} |
1783000000301 | http-request | 统一保存用户画像 | {"method": "post", "url": "{{#env.PROFILE_API_BASE_URL#}}/profile/upsert", "error_strategy": "fail-branch"} |
1780469319091 | if-else | 主分流 | {"cases": "4", "conditions": "4"} |
1780469932737 | llm | 身体不适固定回复 | {"model": "deepseek-v4-flash", "provider": "langgenius/deepseek/deepseek", "temperature": 0.4, "prompt_roles": "system,user"} |
1780536637801 | answer | 输出-医疗急症安全回复 | {"answer": "{{#1780469932737.text#}}"} |
1782100000011 | answer | 超范围固定回复 | {"answer": "抱歉,这个问题超出了我目前的专业解答范围。 我主要擅长跑步训练、训练计划、配速评估、训练分析、运动营养和赛事补给策略。如果你有这些方面的问题,我可以继续帮你分析和建议。"} |
1782001000002 | code | 普通问答检索配置 | {"language": "python3", "inputs": "query,topics,ordinary_qa_query_text", "outputs": "answer_scope,excluded_terms_json,knowledge_route,needs_evidence_review,product_specific,retrieval_query,source_policy"} |
1782001000003 | if-else | 日常问答知识域路由 | {"cases": "2", "conditions": "2"} |
1780478651801 | knowledge-retrieval | 跑步通用知识检索 | {"datasets": "4393a498-bef1-4469-92d8-591fc5169ea2", "retrieval_mode": "multiple", "query": "1782001000002.retrieval_query"} |
1782001000004 | knowledge-retrieval | 运动营养与产品知识检索 | {"datasets": "ead9bb6a-57e7-4a6d-a39d-5e13f11d32ca", "retrieval_mode": "multiple", "query": "1782001000002.retrieval_query"} |
1782001000005 | code | 跑步知识证据整理 | {"language": "python3", "inputs": "retrieval_result,retrieval_query,knowledge_route,answer_scope,excluded_terms_json,source_policy,product_specific,needs_evidence_review", "outputs": "evidence_text"} |
1782001000006 | code | 营养知识证据整理 | {"language": "python3", "inputs": "retrieval_result,retrieval_query,knowledge_route,answer_scope,excluded_terms_json,source_policy,product_specific,needs_evidence_review", "outputs": "evidence_text"} |
1782001000007 | variable-aggregator | 日常问答证据聚合 | {"variables": "1782001000005.evidence_text,1782001000006.evidence_text"} |
1780478708723 | llm | 普通问答生成 | {"model": "deepseek-v4-flash", "provider": "langgenius/deepseek/deepseek", "temperature": 0.3, "prompt_roles": "system,user"} |
1780536649345 | answer | 输出-日常问答 | {"answer": "{{#1780478708723.text#}}"} |
1780536284962 | code | VDOT 能力基准计算 | {"language": "python3", "inputs": "vdot_input_mode,distance,time,easy_pace,saved_vdot,saved_training_paces,question_focus,performance_source,estimate_confidence,notes", "outputs": "result"} |
1780535635827 | if-else | VDOT 结果后续路由 | {"cases": "4", "conditions": "5"} |
1780536548441 | llm | VDOT / 配速回答生成 | {"model": "deepseek-v4-flash", "provider": "langgenius/deepseek/deepseek", "temperature": 0.3, "prompt_roles": "system,user"} |
1780536661204 | answer | 输出-能力评估 | {"answer": "{{#1780536548441.text#}}"} |
1783000000101 | http-request | 读取用户画像 | {"method": "get", "url": "{{#env.PROFILE_API_BASE_URL#}}/profile/{{#sys.user_id#}}", "error_strategy": "fail-branch"} |
1780645110626 | http-request | 读取COROS最近30天数据 | {"method": "get", "url": "https://coros-connector.onrender.com/coros/runs?user_id={{#sys.user_id#}}&days=30", "error_strategy": "fail-branch"} |
1780645215873 | code | COROS训练统计 | {"language": "python3", "inputs": "http_body,status_code", "outputs": "connected,runs_summary,training_stats"} |
1780479405124 | llm | COROS训练分析 | {"model": "deepseek-v4-flash", "provider": "langgenius/deepseek/deepseek", "temperature": 0.4, "prompt_roles": "system,user"} |
1780536679787 | answer | 输出-COROS训练分析 | {"answer": "{{#1780479405124.text#}}"} |
1781771000101 | llm | 用户提供数据训练分析 | {"model": "deepseek-v4-flash", "provider": "langgenius/deepseek/deepseek", "temperature": 0.4, "prompt_roles": "system,user"} |
1781771000102 | answer | 输出-用户数据训练分析 | {"answer": "{{#1781771000101.text#}}"} |
1781771000103 | answer | COROS读取失败 | {"answer": "当前无法读取你的COROS最近30天训练记录,因此不能可靠分析跑量、配速、心率和负荷变化。 你可以检查COROS授权与连接服务,或直接提供最近4周的周跑量、每周训练次数、最长跑、典型配速和平均心率。 {{#1781760882848.d"} |
1782001000008 | code | 训练计划检索配置 | {"language": "python3", "inputs": "query,plan_mode,plan_context_text,answer_scope_from_check,missing_info_text,can_use_exact_training_paces,ability_result", "outputs": "answer_scope,excluded_terms_json,needs_evidence_review,product_specific,retrieval_query,source_policy"} |
1780480474845 | knowledge-retrieval | 训练计划窄范围检索 | {"datasets": "4393a498-bef1-4469-92d8-591fc5169ea2", "retrieval_mode": "multiple", "query": "1782001000008.retrieval_query"} |
1782001000009 | code | 训练计划证据整理 | {"language": "python3", "inputs": "retrieval_result,retrieval_query,knowledge_route,answer_scope,excluded_terms_json,source_policy,product_specific,needs_evidence_review", "outputs": "evidence_text"} |
1782300000001 | code | 训练计划营养检索配置 | {"language": "python3", "inputs": "query,plan_mode,profile_text,ability_result", "outputs": "nutrition_answer_scope,nutrition_excluded_terms_json,nutrition_needs_evidence_review,nutrition_product_specific,nutrition_retrieval_query,nutrition_source_policy,supplement_structure_policy"} |
1782300000002 | knowledge-retrieval | 训练计划营养与产品知识检索 | {"datasets": "ead9bb6a-57e7-4a6d-a39d-5e13f11d32ca", "retrieval_mode": "multiple", "query": "1782300000001.nutrition_retrieval_query"} |
1782300000003 | code | 训练计划营养证据整理 | {"language": "python3", "inputs": "retrieval_result,retrieval_query,answer_scope,excluded_terms_json,source_policy,product_specific,needs_evidence_review", "outputs": "evidence_text"} |
1780480510371 | llm | 训练计划生成 | {"model": "deepseek-v4-flash", "provider": "langgenius/deepseek/deepseek", "temperature": 0.5, "prompt_roles": "system,user"} |
1780536689356 | answer | 输出-训练计划 | {"answer": "{{#1780480510371.text#}}"} |
1783600000007 | if-else | 训练计划与分析二级分流 | {"cases": "3", "conditions": "3"} |
1783500000011 | code | 配速计算准备 / 字段校验 | {"language": "python3", "inputs": "calculation_type,performance_source,ability_distance,ability_time,ability_pace,easy_pace,easy_pace_confirmed,allow_easy_pace_estimate,target_distance,target_time,question_focus,unit_type,unit_ambiguous,needs_vdot,needs_race_pace,needs_profile_for_ability,ability_missing_info", "outputs": "ability_ready,next_calc_action,calculation_type,performance_source,distance,time,pace,easy_pace,easy_pace_confirmed,target_distance,target_time,question_focus,missing_info,error_reason"} |
1783500000012 | if-else | 配速计算类型判断 | {"cases": "4", "conditions": "5"} |
1783500000014 | code | 比赛配速计算 | {"language": "python3", "inputs": "target_distance,target_time,question_focus", "outputs": "race_pace_ready,target_distance,target_time,distance_km,average_pace,average_speed_kmh,question_focus,error"} |
1783500000015 | llm | 配速信息不足回复 | {"model": "deepseek-v4-flash", "provider": "langgenius/deepseek/deepseek", "temperature": 0.4, "prompt_roles": "system,user"} |
1783500000025 | answer | 输出-配速信息不足 | {"answer": "{{#1783500000015.text#}}"} |
1783500000018 | llm | 配速计算兜底回复 | {"model": "deepseek-v4-flash", "provider": "langgenius/deepseek/deepseek", "temperature": 0.4, "prompt_roles": "system,user"} |
1783500000028 | answer | 输出-配速兜底 | {"answer": "{{#1783500000018.text#}}"} |
1783500000017 | llm | 比赛配速回答生成 | {"model": "deepseek-v4-flash", "provider": "langgenius/deepseek/deepseek", "temperature": 0.4, "prompt_roles": "system,user"} |
1783500000027 | answer | 输出-比赛配速 | {"answer": "{{#1783500000017.text#}}"} |
1783500000022 | code | VDOT 计算输入合并 / 标准化 | {"language": "python3", "inputs": "next_calc_action,direct_distance,direct_time,direct_pace,direct_easy_pace,direct_easy_pace_confirmed,allow_easy_pace_estimate,direct_question_focus,direct_performance_source,profile_ability_action,profile_distance,profile_time,saved_vdot,saved_training_paces,profile_question_focus,profile_performance_source,plan_ability_basis", "outputs": "vdot_input_ready,vdot_input_mode,vdot_input_source,distance,time,pace,easy_pace,easy_pace_confirmed,saved_vdot,saved_training_paces,question_focus,performance_source,source_date,source_label,source_confidence,estimate_confidence,missing_info,error_reason,notes"} |
1783500000019 | if-else | 画像读取用途分流 | {"cases": "2", "conditions": "2"} |
1783500000020 | code | 从用户画像提取能力依据 | {"language": "python3", "inputs": "profile_raw,question_focus", "outputs": "profile_ability_found,profile_ability_action,performance_source,distance,time,pace,saved_vdot,saved_training_paces,question_focus,source_date,source_label,source_confidence,estimate_confidence,missing_info,error_reason,notes"} |
1783500000021 | if-else | 画像能力结果分流 | {"cases": "1", "conditions": "2"} |
1783500000023 | code | 训练计划信息合并 / 标准化 | {"language": "python3", "inputs": "extracted_slots,profile_raw", "outputs": "plan_context_ready,goal,basic_profile,current_training,training_availability,risk_profile,ability_basis,source_map,conflicts,preliminary_missing_slots,notes"} |
1783500000024 | code | 训练计划资料完整度判断 | {"language": "python3", "inputs": "user_query,goal,current_training,training_availability,risk_profile,ability_basis,preliminary_missing_slots", "outputs": "plan_check_ready,route_action,plan_mode,needs_vdot_for_plan,can_use_exact_training_paces,personalization_level,missing_info,missing_info_text,answer_scope,plan_safety_note,doctor_guidance_needed,doctor_guidance_text,plan_context_text,error_reason"} |
1783500000026 | if-else | 训练计划VDOT需求判断 | {"cases": "1", "conditions": "1"} |
连线清单
| # | Source | Source Handle | Target | Target Handle |
|---|---|---|---|---|
| 1 | 用户输入 | source | 用户输入提取 / 路由解析 | target |
| 2 | 用户输入提取 / 路由解析 | source | 路由 JSON 清洗 / 字段标准化 | target |
| 3 | 路由 JSON 清洗 / 字段标准化 | source | 入口兼容字段整理 | target |
| 4 | 入口兼容字段整理 | source | 会话变量更新 | target |
| 5 | 会话变量更新 | source | 画像写入候选标准化 / Payload 构造 | target |
| 6 | 画像写入候选标准化 / Payload 构造 | source | 画像写入分流 | target |
| 7 | 画像写入分流 | profile-write-needed | 统一保存用户画像 | target |
| 8 | 画像写入分流 | false | 主分流 | target |
| 9 | 统一保存用户画像 | source | 主分流 | target |
| 10 | 统一保存用户画像 | fail-branch | 主分流 | target |
| 11 | 主分流 | route-discomfort | 身体不适固定回复 | target |
| 12 | 身体不适固定回复 | source | 输出-医疗急症安全回复 | target |
| 13 | 主分流 | route-out-of-scope | 超范围固定回复 | target |
| 14 | 主分流 | route-training | 训练计划与分析二级分流 | target |
| 15 | 主分流 | route-ordinary | 普通问答检索配置 | target |
| 16 | 主分流 | false | 超范围固定回复 | target |
| 17 | 普通问答检索配置 | source | 日常问答知识域路由 | target |
| 18 | 日常问答知识域路由 | daily-route-running | 跑步通用知识检索 | target |
| 19 | 日常问答知识域路由 | daily-route-nutrition | 运动营养与产品知识检索 | target |
| 20 | 日常问答知识域路由 | false | 跑步通用知识检索 | target |
| 21 | 跑步通用知识检索 | source | 跑步知识证据整理 | target |
| 22 | 运动营养与产品知识检索 | source | 营养知识证据整理 | target |
| 23 | 跑步知识证据整理 | source | 日常问答证据聚合 | target |
| 24 | 营养知识证据整理 | source | 日常问答证据聚合 | target |
| 25 | 日常问答证据聚合 | source | 普通问答生成 | target |
| 26 | 普通问答生成 | source | 输出-日常问答 | target |
| 27 | 训练计划与分析二级分流 | intent-ability | 配速计算准备 / 字段校验 | target |
| 28 | 训练计划与分析二级分流 | intent-plan | 读取用户画像 | target |
| 29 | 训练计划与分析二级分流 | intent-analysis | VDOT 结果后续路由 | target |
| 30 | 训练计划与分析二级分流 | false | 普通问答检索配置 | target |
| 31 | 配速计算准备 / 字段校验 | source | 配速计算类型判断 | target |
| 32 | 配速计算类型判断 | calc-missing | 配速信息不足回复 | target |
| 33 | 配速信息不足回复 | source | 输出-配速信息不足 | target |
| 34 | 配速计算类型判断 | calc-need-profile | 读取用户画像 | target |
| 35 | 配速计算类型判断 | calc-race-pace | 比赛配速计算 | target |
| 36 | 比赛配速计算 | source | 比赛配速回答生成 | target |
| 37 | 比赛配速回答生成 | source | 输出-比赛配速 | target |
| 38 | 配速计算类型判断 | calc-vdot | VDOT 计算输入合并 / 标准化 | target |
| 39 | 配速计算类型判断 | false | 配速计算兜底回复 | target |
| 40 | 配速计算兜底回复 | source | 输出-配速兜底 | target |
| 41 | 读取用户画像 | source | 画像读取用途分流 | target |
| 42 | 读取用户画像 | fail-branch | 画像读取用途分流 | target |
| 43 | 画像读取用途分流 | profile-for-ability | 从用户画像提取能力依据 | target |
| 44 | 从用户画像提取能力依据 | source | 画像能力结果分流 | target |
| 45 | 画像能力结果分流 | profile-vdot | VDOT 计算输入合并 / 标准化 | target |
| 46 | 画像能力结果分流 | false | 配速信息不足回复 | target |
| 47 | 画像读取用途分流 | profile-for-plan | 训练计划信息合并 / 标准化 | target |
| 48 | 训练计划信息合并 / 标准化 | source | 训练计划资料完整度判断 | target |
| 49 | 训练计划资料完整度判断 | source | 训练计划VDOT需求判断 | target |
| 50 | 训练计划VDOT需求判断 | plan-needs-vdot | VDOT 计算输入合并 / 标准化 | target |
| 51 | 训练计划VDOT需求判断 | false | 训练计划检索配置 | target |
| 52 | VDOT 计算输入合并 / 标准化 | source | VDOT 能力基准计算 | target |
| 53 | VDOT 能力基准计算 | source | VDOT 结果后续路由 | target |
| 54 | VDOT 结果后续路由 | vdot-to-answer | VDOT / 配速回答生成 | target |
| 55 | VDOT / 配速回答生成 | source | 输出-能力评估 | target |
| 56 | VDOT 结果后续路由 | vdot-to-plan | 训练计划检索配置 | target |
| 57 | VDOT 结果后续路由 | analysis-coros | 读取COROS最近30天数据 | target |
| 58 | 读取COROS最近30天数据 | source | COROS训练统计 | target |
| 59 | COROS训练统计 | source | COROS训练分析 | target |
| 60 | COROS训练分析 | source | 输出-COROS训练分析 | target |
| 61 | 读取COROS最近30天数据 | fail-branch | COROS读取失败 | target |
| 62 | VDOT 结果后续路由 | analysis-user | 用户提供数据训练分析 | target |
| 63 | VDOT 结果后续路由 | false | 用户提供数据训练分析 | target |
| 64 | 用户提供数据训练分析 | source | 输出-用户数据训练分析 | target |
| 65 | 训练计划检索配置 | source | 训练计划窄范围检索 | target |
| 66 | 训练计划检索配置 | source | 训练计划营养检索配置 | target |
| 67 | 训练计划窄范围检索 | source | 训练计划证据整理 | target |
| 68 | 训练计划证据整理 | source | 训练计划生成 | target |
| 69 | 训练计划营养检索配置 | source | 训练计划营养与产品知识检索 | target |
| 70 | 训练计划营养与产品知识检索 | source | 训练计划营养证据整理 | target |
| 71 | 训练计划营养证据整理 | source | 训练计划生成 | target |
| 72 | 训练计划生成 | source | 输出-训练计划 | target |