test_difficulty_flow_debug.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 测试difficulty字段完整流程调试
  5. 用于验证从目标创建到Coze API调用的完整链路
  6. """
  7. import requests
  8. import json
  9. import time
  10. # 服务器配置
  11. BASE_URL = "http://localhost:8080"
  12. def test_complete_difficulty_flow():
  13. """
  14. 测试完整的difficulty字段流程
  15. """
  16. print("=== 开始测试difficulty字段完整流程 ===")
  17. # 步骤1: 创建目标
  18. print("\n步骤1: 创建学习目标")
  19. goal_data = {
  20. "userId": 1,
  21. "subject": "数学",
  22. "goalType": "选择题",
  23. "goalContent": "加减法",
  24. "difficulty": "中等",
  25. "totalQuantity": 1
  26. }
  27. print(f"创建目标请求: {json.dumps(goal_data, ensure_ascii=False, indent=2)}")
  28. try:
  29. response = requests.post(f"{BASE_URL}/api/goals", json=goal_data)
  30. print(f"目标创建响应状态: {response.status_code}")
  31. print(f"目标创建响应: {response.text}")
  32. if response.status_code == 200:
  33. goal_response = response.json()
  34. if goal_response.get("code") == 200 and "data" in goal_response:
  35. goal_id = goal_response["data"]["goalId"]
  36. saved_difficulty = goal_response["data"]["difficulty"]
  37. print(f"✅ 目标创建成功,goalId: {goal_id}, 保存的difficulty: {saved_difficulty}")
  38. # 步骤2: 调用Coze API生成题目
  39. print(f"\n步骤2: 调用Coze API生成题目")
  40. coze_data = {
  41. "userId": 1,
  42. "goalId": goal_id,
  43. "subject": goal_data["subject"],
  44. "type": goal_data["goalType"],
  45. "difficulty": goal_data["difficulty"],
  46. "totalQuantity": goal_data["totalQuantity"],
  47. "knowledgePoint": goal_data["goalContent"]
  48. }
  49. print(f"Coze请求数据: {json.dumps(coze_data, ensure_ascii=False, indent=2)}")
  50. coze_response = requests.post(f"{BASE_URL}/api/coze/generate-questions", json=coze_data)
  51. print(f"Coze API响应状态: {coze_response.status_code}")
  52. print(f"Coze API响应: {coze_response.text}")
  53. if coze_response.status_code == 200:
  54. coze_result = coze_response.json()
  55. if coze_result.get("success"):
  56. questions = coze_result.get("questions", [])
  57. print(f"✅ Coze API调用成功,生成题目数量: {len(questions)}")
  58. # 步骤3: 检查生成题目的difficulty字段
  59. print(f"\n步骤3: 检查生成题目的difficulty字段")
  60. for i, question in enumerate(questions):
  61. question_difficulty = question.get("difficulty")
  62. print(f"题目{i+1} - difficulty: {question_difficulty}, 预期: {goal_data['difficulty']}")
  63. if question_difficulty == goal_data["difficulty"]:
  64. print(f"✅ 题目{i+1} difficulty字段正确")
  65. elif question_difficulty is None:
  66. print(f"❌ 题目{i+1} difficulty字段为null")
  67. else:
  68. print(f"⚠️ 题目{i+1} difficulty字段不匹配: {question_difficulty} != {goal_data['difficulty']}")
  69. # 步骤4: 从数据库查询验证
  70. print(f"\n步骤4: 从数据库查询验证")
  71. time.sleep(1) # 等待数据保存完成
  72. db_response = requests.get(f"{BASE_URL}/api/ai/questions/{goal_id}")
  73. if db_response.status_code == 200:
  74. db_result = db_response.json()
  75. if db_result.get("code") == 200:
  76. db_questions = db_result.get("data", [])
  77. print(f"数据库中题目数量: {len(db_questions)}")
  78. for i, db_question in enumerate(db_questions):
  79. db_difficulty = db_question.get("difficulty")
  80. print(f"数据库题目{i+1} - difficulty: {db_difficulty}")
  81. if db_difficulty == goal_data["difficulty"]:
  82. print(f"✅ 数据库题目{i+1} difficulty字段正确")
  83. elif db_difficulty is None:
  84. print(f"❌ 数据库题目{i+1} difficulty字段为null")
  85. else:
  86. print(f"⚠️ 数据库题目{i+1} difficulty字段不匹配")
  87. else:
  88. print(f"❌ 查询数据库题目失败: {db_result.get('message')}")
  89. else:
  90. print(f"❌ 查询数据库题目请求失败: {db_response.status_code}")
  91. else:
  92. print(f"❌ Coze API调用失败: {coze_result.get('message')}")
  93. else:
  94. print(f"❌ Coze API请求失败: {coze_response.status_code}")
  95. else:
  96. print(f"❌ 目标创建失败: {goal_response.get('message')}")
  97. else:
  98. print(f"❌ 目标创建请求失败: {response.status_code}")
  99. except Exception as e:
  100. print(f"❌ 测试过程中发生错误: {str(e)}")
  101. print("\n=== 测试完成 ===")
  102. def analyze_problem():
  103. """
  104. 分析问题并提供解决方案
  105. """
  106. print("\n=== 问题分析 ===")
  107. print("根据代码分析,difficulty字段传递链路如下:")
  108. print("1. Android客户端 -> /api/goals (目标创建) ✅ 正确保存difficulty")
  109. print("2. Android客户端 -> /api/coze/generate-questions (Coze API调用) ✅ 正确传递difficulty")
  110. print("3. CozeWorkflowService.buildCozeRequest() ✅ 正确构建请求参数")
  111. print("4. Coze API调用 ❓ 可能返回difficulty为null")
  112. print("5. CozeWorkflowService.parseQuestion() ✅ 正确解析difficulty字段")
  113. print("6. AIQuestionService.saveCozeQuestionsToGoalDetail() ✅ 正确保存difficulty字段")
  114. print("\n=== 可能的问题原因 ===")
  115. print("1. Coze API本身返回的difficulty字段为null")
  116. print("2. Coze工作流配置问题,没有正确处理difficulty参数")
  117. print("3. Coze API响应格式变化,difficulty字段位置不对")
  118. print("\n=== 建议的解决方案 ===")
  119. print("1. 在CozeWorkflowService.parseQuestion()中添加fallback逻辑")
  120. print("2. 如果Coze返回的difficulty为null,使用请求中的difficulty")
  121. print("3. 添加更详细的日志记录Coze API的原始响应")
  122. print("4. 检查Coze工作流配置,确保正确处理difficulty参数")
  123. if __name__ == "__main__":
  124. test_complete_difficulty_flow()
  125. analyze_problem()