test_photo_answer.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. """
  2. 拍照解题功能测试脚本
  3. 测试百炼EduTutor API的调用
  4. 注意:需要提供用户的 DASHSCOPE_API_KEY
  5. """
  6. import os
  7. import sys
  8. import asyncio
  9. from pathlib import Path
  10. # 添加项目根目录到Python路径
  11. project_root = Path(__file__).parent.parent
  12. sys.path.insert(0, str(project_root))
  13. from app.services.edututor_client import BailianEduTutorClient
  14. async def test_answer_stream(api_key: str):
  15. """测试流式解答"""
  16. print("=" * 50)
  17. print("测试拍照解题流式API")
  18. print("=" * 50)
  19. # 创建客户端(使用用户的 API Key)
  20. client = BailianEduTutorClient(api_key=api_key)
  21. # 测试图片URL(需要替换为实际的图片URL)
  22. test_image_url = input("\n请输入题目图片URL: ").strip()
  23. if not test_image_url:
  24. test_image_url = "https://your-oss-bucket.oss-cn-hangzhou.aliyuncs.com/test-question.jpg"
  25. print(f"\n图片URL: {test_image_url}")
  26. print(f"年级: 6 (六年级)")
  27. print(f"学段: primary (小学)")
  28. print(f"学科: math (数学)")
  29. print("\n开始解题...\n")
  30. try:
  31. full_answer = ""
  32. async for event in client.answer_sse_async(
  33. image_url=test_image_url,
  34. grade=6,
  35. stage='primary',
  36. subject='math'
  37. ):
  38. if event['type'] == 'chunk':
  39. content = event['content']
  40. print(content, end='', flush=True)
  41. full_answer += content
  42. elif event['type'] == 'finish':
  43. tokens = event.get('tokens', {})
  44. print(f"\n\n{'=' * 50}")
  45. print(f"解题完成!")
  46. print(f"输入Token: {tokens.get('input', 0)}")
  47. print(f"输出Token: {tokens.get('output', 0)}")
  48. print(f"{'=' * 50}")
  49. print(f"\n完整答案长度: {len(full_answer)} 字符")
  50. except Exception as e:
  51. print(f"\n错误: {e}")
  52. import traceback
  53. traceback.print_exc()
  54. def test_answer_sync(api_key: str):
  55. """测试同步解答"""
  56. print("=" * 50)
  57. print("测试拍照解题同步API")
  58. print("=" * 50)
  59. # 创建客户端(使用用户的 API Key)
  60. client = BailianEduTutorClient(api_key=api_key)
  61. # 测试图片URL
  62. test_image_url = input("\n请输入题目图片URL: ").strip()
  63. if not test_image_url:
  64. test_image_url = "https://your-oss-bucket.oss-cn-hangzhou.aliyuncs.com/test-question.jpg"
  65. print(f"\n图片URL: {test_image_url}")
  66. print(f"年级: 6 (六年级)")
  67. print(f"学段: primary (小学)")
  68. print(f"学科: math (数学)")
  69. print("\n开始解题...\n")
  70. try:
  71. result = client.answer_sync(
  72. image_url=test_image_url,
  73. grade=6,
  74. stage='primary',
  75. subject='math'
  76. )
  77. print(f"解答内容:\n{result['answer']}")
  78. print(f"\n{'=' * 50}")
  79. print(f"输入Token: {result['input_tokens']}")
  80. print(f"输出Token: {result['output_tokens']}")
  81. print(f"{'=' * 50}")
  82. except Exception as e:
  83. print(f"\n错误: {e}")
  84. import traceback
  85. traceback.print_exc()
  86. def check_environment():
  87. """检查环境配置"""
  88. print("=" * 50)
  89. print("检查环境配置")
  90. print("=" * 50)
  91. required_vars = [
  92. 'BAILIAN_WORKSPACE_ID'
  93. ]
  94. missing_vars = []
  95. for var in required_vars:
  96. value = os.getenv(var)
  97. if value:
  98. print(f"✓ {var}: {value}")
  99. else:
  100. print(f"✗ {var}: 未设置")
  101. missing_vars.append(var)
  102. print("=" * 50)
  103. if missing_vars:
  104. print(f"\n警告: 缺少以下必需环境变量: {', '.join(missing_vars)}")
  105. print("请在 .env 文件中配置这些变量")
  106. return False
  107. print("\n✓ 环境配置检查通过")
  108. return True
  109. def main():
  110. """主函数"""
  111. print("\n拍照解题功能测试\n")
  112. # 检查环境
  113. if not check_environment():
  114. return
  115. # 获取用户 API Key
  116. print("\n" + "=" * 50)
  117. api_key = input("请输入用户的 DASHSCOPE_API_KEY: ").strip()
  118. if not api_key:
  119. print("错误: API Key 不能为空")
  120. return
  121. # 选择测试模式
  122. print("\n请选择测试模式:")
  123. print("1. 流式解答测试 (推荐)")
  124. print("2. 同步解答测试")
  125. print("3. 退出")
  126. choice = input("\n请输入选项 (1-3): ").strip()
  127. if choice == '1':
  128. asyncio.run(test_answer_stream(api_key))
  129. elif choice == '2':
  130. test_answer_sync(api_key)
  131. elif choice == '3':
  132. print("退出测试")
  133. else:
  134. print("无效选项")
  135. if __name__ == '__main__':
  136. main()