| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- """
- 智能股票分析助手 — 普通投资顾问Agent
- 基于 HelloAgents ReActAgent,根据提供的数据进行综合分析并给出投资建议。
- 允许协调者Agent调用,支持流式输出。
- """
- import sys
- import os
- from pathlib import Path
- from typing import Iterator
- _PROJECT_ROOT = Path(__file__).parent.parent
- _HELLO_PATH = _PROJECT_ROOT / "HelloAgents Optimized"
- for p in [_HELLO_PATH]:
- if str(p) not in sys.path:
- sys.path.insert(0, str(p))
- from hello_agents.agents.react_agent import ReActAgent
- from hello_agents.tools import ToolRegistry
- from hello_agents.core.llm import HelloAgentsLLM
- from hello_agents.core.config import Config
- from hello_agents.core.stream import StreamEvent
- GENERAL_ADVISOR_PROMPT = """你是一位专业的A股投资顾问,擅长综合技术和基本面分析。
- ## 你的职责
- 1. 根据提供的数据进行综合分析
- 2. 给出客观、专业的投资建议
- 3. 明确标注风险因素
- 4. 提供参考但不构成投资建议
- ## 分析维度
- - **技术面**: 价格走势、成交量、技术指标
- - **基本面**: 财务指标、估值水平、行业地位
- - **市场情绪**: 舆情倾向、资金流向
- - **风险提示**: 政策风险、市场风险、行业风险
- ## 输出格式
- 1. **核心观点**:一句话总结
- 2. **分析逻辑**:2-3个关键支撑论据
- 3. **风险提示**:最重要的风险因素
- 4. **免责声明**:以上分析仅供参考
- ## 重要提醒
- - 保持客观中立,不夸大也不隐瞒风险
- - 末尾必须标注免责声明
- """
- def create_general_advisor_agent(
- llm: HelloAgentsLLM = None,
- system_prompt: str = None,
- max_steps: int = 5,
- ) -> ReActAgent:
- """创建普通投资顾问Agent
- Args:
- llm: HelloAgentsLLM实例
- system_prompt: 自定义系统提示词
- max_steps: 最大推理步数
- Returns:
- 配置好的ReActAgent实例
- """
- if llm is None:
- llm = _create_default_llm()
- registry = ToolRegistry()
- prompt = system_prompt or GENERAL_ADVISOR_PROMPT
- agent = ReActAgent(
- name="投资顾问Agent",
- llm=llm,
- tool_registry=registry,
- system_prompt=prompt,
- config=Config(temperature=0.35, max_tokens=4096),
- max_steps=max_steps,
- )
- return agent
- def advise_stream(
- agent: ReActAgent,
- task: str,
- ) -> Iterator[dict]:
- """流式投资建议 - 供协调者Agent调用
- Args:
- agent: 已配置的投资顾问Agent
- task: 分析任务和数据
- Yields:
- dict: {"type": "status"|"delta"|"done"|"error", "content": str}
- """
- if agent is None:
- yield {"type": "error", "content": "投资顾问Agent未初始化"}
- return
- yield {"type": "status", "content": "投资顾问正在分析..."}
- try:
- result = agent.run(task)
- yield {"type": "delta", "content": result}
- yield {"type": "done"}
- except Exception as e:
- yield {"type": "error", "content": f"投资分析出错: {e}"}
- def _create_default_llm() -> HelloAgentsLLM:
- model = os.getenv("LLM_MODEL_ID")
- api_key = os.getenv("LLM_API_KEY")
- base_url = os.getenv("LLM_BASE_URL")
- provider = os.getenv("LLM_PROVIDER", "auto")
- if not api_key:
- raise RuntimeError("LLM_API_KEY 环境变量未设置")
- return HelloAgentsLLM(
- model=model,
- api_key=api_key,
- base_url=base_url,
- provider=provider,
- temperature=0.35,
- )
|