run_inspiration_test.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. """
  2. 测试灵感点生成选题
  3. """
  4. import asyncio
  5. import sys
  6. from pathlib import Path
  7. sys.path.insert(0, str(Path(__file__).parent.parent.parent))
  8. from dotenv import load_dotenv
  9. load_dotenv()
  10. from agent.core.runner import AgentRunner, RunConfig
  11. from agent.llm import create_openrouter_llm_call
  12. from agent.llm.prompts import SimplePrompt
  13. from agent.trace import FileSystemTraceStore, Message, Trace
  14. from agent.utils import setup_logging
  15. from agent.cli import InteractiveController
  16. # 导入工具
  17. import examples.create.tool # noqa: F401
  18. # 导入项目配置
  19. from config import DEBUG, LOG_LEVEL, RUN_CONFIG, TRACE_STORE_PATH
  20. import logging
  21. logger = logging.getLogger(__name__)
  22. async def main():
  23. setup_logging(level=LOG_LEVEL)
  24. base_dir = Path(__file__).parent
  25. prompt_path = base_dir / "test_inspiration.prompt"
  26. # 加载 prompt
  27. prompt = SimplePrompt(prompt_path)
  28. # 注入流程文档
  29. process_path = base_dir / "PRD" / "inspiration_to_topic_process_v2.md"
  30. if process_path.exists():
  31. process_content = process_path.read_text(encoding="utf-8")
  32. if "system" in prompt._messages:
  33. prompt._messages["system"] = prompt._messages["system"].replace(
  34. "{inspiration_to_topic_process_v2}", process_content
  35. )
  36. messages = prompt.build_messages()
  37. # 创建 runner
  38. store = FileSystemTraceStore(base_path=TRACE_STORE_PATH)
  39. runner = AgentRunner(
  40. trace_store=store,
  41. llm_call=create_openrouter_llm_call(model=f"anthropic/{RUN_CONFIG.model}"),
  42. debug=DEBUG,
  43. )
  44. # 创建交互控制器
  45. interactive = InteractiveController(
  46. runner=runner,
  47. store=store,
  48. enable_stdin_check=True,
  49. )
  50. # 运行
  51. config = RUN_CONFIG
  52. current_trace_id = None
  53. current_sequence = 0
  54. should_exit = False
  55. logger.info("💡 交互提示:")
  56. logger.info(" - 执行过程中输入 'p' 或 'pause' 暂停并进入交互模式")
  57. logger.info(" - 执行过程中输入 'q' 或 'quit' 停止执行")
  58. logger.info("")
  59. try:
  60. async for item in runner.run(messages=messages, config=config):
  61. # 检查用户输入
  62. cmd = interactive.check_stdin()
  63. if cmd == "pause":
  64. logger.info("\n⏸️ 正在暂停执行...")
  65. if current_trace_id:
  66. await runner.stop(current_trace_id)
  67. await asyncio.sleep(0.5)
  68. menu_result = await interactive.show_menu(current_trace_id, current_sequence)
  69. if menu_result["action"] == "stop":
  70. should_exit = True
  71. break
  72. if menu_result["action"] == "continue":
  73. new_messages = menu_result.get("messages", [])
  74. if new_messages:
  75. # 用户输入了反馈,在当前 trace 上继续执行
  76. continue_config = RunConfig(
  77. model=config.model,
  78. trace_id=current_trace_id,
  79. after_sequence=current_sequence
  80. )
  81. async for item2 in runner.run(messages=new_messages, config=continue_config):
  82. if isinstance(item2, Message):
  83. current_sequence = item2.sequence
  84. print(item2)
  85. break
  86. elif cmd == "quit":
  87. logger.info("\n🛑 用户请求停止...")
  88. if current_trace_id:
  89. await runner.stop(current_trace_id)
  90. should_exit = True
  91. break
  92. if isinstance(item, Trace):
  93. current_trace_id = item.trace_id
  94. # 如果 trace 完成,进入交互模式等待反馈
  95. if item.status == "completed":
  96. logger.info("\n✅ Agent 执行完成,等待用户反馈...")
  97. logger.info("💡 按 'p' 键进入交互模式,输入反馈或输入 'q' 退出")
  98. # 等待用户输入
  99. while True:
  100. await asyncio.sleep(0.5)
  101. cmd = interactive.check_stdin()
  102. if cmd == "pause":
  103. menu_result = await interactive.show_menu(current_trace_id, current_sequence)
  104. if menu_result["action"] == "stop":
  105. should_exit = True
  106. break
  107. if menu_result["action"] == "continue":
  108. new_messages = menu_result.get("messages", [])
  109. if new_messages:
  110. # 用户输入了反馈,在当前 trace 上继续执行
  111. continue_config = RunConfig(
  112. model=config.model,
  113. trace_id=current_trace_id,
  114. after_sequence=current_sequence
  115. )
  116. async for item2 in runner.run(messages=new_messages, config=continue_config):
  117. if isinstance(item2, Message):
  118. current_sequence = item2.sequence
  119. print(item2)
  120. break
  121. elif cmd == "quit":
  122. should_exit = True
  123. break
  124. if should_exit:
  125. break
  126. elif isinstance(item, Message):
  127. current_sequence = item.sequence
  128. print(item)
  129. except KeyboardInterrupt:
  130. logger.info("\n\n用户中断 (Ctrl+C)")
  131. if current_trace_id:
  132. await runner.stop(current_trace_id)
  133. if __name__ == "__main__":
  134. asyncio.run(main())