general_advisor_agent.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. """
  2. 智能股票分析助手 — 普通投资顾问Agent
  3. 基于 HelloAgents ReActAgent,根据提供的数据进行综合分析并给出投资建议。
  4. 允许协调者Agent调用,支持流式输出。
  5. """
  6. import sys
  7. import os
  8. from pathlib import Path
  9. from typing import Iterator
  10. _PROJECT_ROOT = Path(__file__).parent.parent
  11. _HELLO_PATH = _PROJECT_ROOT / "HelloAgents Optimized"
  12. for p in [_HELLO_PATH]:
  13. if str(p) not in sys.path:
  14. sys.path.insert(0, str(p))
  15. from hello_agents.agents.react_agent import ReActAgent
  16. from hello_agents.tools import ToolRegistry
  17. from hello_agents.core.llm import HelloAgentsLLM
  18. from hello_agents.core.config import Config
  19. from hello_agents.core.stream import StreamEvent
  20. GENERAL_ADVISOR_PROMPT = """你是一位专业的A股投资顾问,擅长综合技术和基本面分析。
  21. ## 你的职责
  22. 1. 根据提供的数据进行综合分析
  23. 2. 给出客观、专业的投资建议
  24. 3. 明确标注风险因素
  25. 4. 提供参考但不构成投资建议
  26. ## 分析维度
  27. - **技术面**: 价格走势、成交量、技术指标
  28. - **基本面**: 财务指标、估值水平、行业地位
  29. - **市场情绪**: 舆情倾向、资金流向
  30. - **风险提示**: 政策风险、市场风险、行业风险
  31. ## 输出格式
  32. 1. **核心观点**:一句话总结
  33. 2. **分析逻辑**:2-3个关键支撑论据
  34. 3. **风险提示**:最重要的风险因素
  35. 4. **免责声明**:以上分析仅供参考
  36. ## 重要提醒
  37. - 保持客观中立,不夸大也不隐瞒风险
  38. - 末尾必须标注免责声明
  39. """
  40. def create_general_advisor_agent(
  41. llm: HelloAgentsLLM = None,
  42. system_prompt: str = None,
  43. max_steps: int = 5,
  44. ) -> ReActAgent:
  45. """创建普通投资顾问Agent
  46. Args:
  47. llm: HelloAgentsLLM实例
  48. system_prompt: 自定义系统提示词
  49. max_steps: 最大推理步数
  50. Returns:
  51. 配置好的ReActAgent实例
  52. """
  53. if llm is None:
  54. llm = _create_default_llm()
  55. registry = ToolRegistry()
  56. prompt = system_prompt or GENERAL_ADVISOR_PROMPT
  57. agent = ReActAgent(
  58. name="投资顾问Agent",
  59. llm=llm,
  60. tool_registry=registry,
  61. system_prompt=prompt,
  62. config=Config(temperature=0.35, max_tokens=4096),
  63. max_steps=max_steps,
  64. )
  65. return agent
  66. def advise_stream(
  67. agent: ReActAgent,
  68. task: str,
  69. ) -> Iterator[dict]:
  70. """流式投资建议 - 供协调者Agent调用
  71. Args:
  72. agent: 已配置的投资顾问Agent
  73. task: 分析任务和数据
  74. Yields:
  75. dict: {"type": "status"|"delta"|"done"|"error", "content": str}
  76. """
  77. if agent is None:
  78. yield {"type": "error", "content": "投资顾问Agent未初始化"}
  79. return
  80. yield {"type": "status", "content": "投资顾问正在分析..."}
  81. try:
  82. result = agent.run(task)
  83. yield {"type": "delta", "content": result}
  84. yield {"type": "done"}
  85. except Exception as e:
  86. yield {"type": "error", "content": f"投资分析出错: {e}"}
  87. def _create_default_llm() -> HelloAgentsLLM:
  88. model = os.getenv("LLM_MODEL_ID")
  89. api_key = os.getenv("LLM_API_KEY")
  90. base_url = os.getenv("LLM_BASE_URL")
  91. provider = os.getenv("LLM_PROVIDER", "auto")
  92. if not api_key:
  93. raise RuntimeError("LLM_API_KEY 环境变量未设置")
  94. return HelloAgentsLLM(
  95. model=model,
  96. api_key=api_key,
  97. base_url=base_url,
  98. provider=provider,
  99. temperature=0.35,
  100. )