From 271938b8239804595dc6f272079b5f49b2d5852b Mon Sep 17 00:00:00 2001 From: aaron <> Date: Tue, 10 Feb 2026 00:04:22 +0800 Subject: [PATCH] update --- backend/app/agent/smart_agent.py | 22 ++++++++---- backend/app/config.py | 4 +++ .../app/crypto_agent/llm_signal_analyzer.py | 7 ++-- backend/app/services/llm_service.py | 16 ++++++--- backend/app/services/multi_llm_service.py | 16 ++++++--- frontend/css/style.css | 6 ++++ frontend/index.html | 8 ++--- frontend/js/app.js | 36 ++----------------- 8 files changed, 57 insertions(+), 58 deletions(-) diff --git a/backend/app/agent/smart_agent.py b/backend/app/agent/smart_agent.py index 9062f3c..393bcf3 100644 --- a/backend/app/agent/smart_agent.py +++ b/backend/app/agent/smart_agent.py @@ -37,11 +37,14 @@ class SmartStockAgent: # 注册技能 self._register_skills() + # 获取配置的模型 + self.model_override = getattr(self.settings, 'smart_agent_model', None) + # 检查LLM是否可用 self.use_llm = bool(self.settings.zhipuai_api_key) and llm_service.client is not None if self.use_llm: - logger.info("Smart Agent初始化完成(智能模式 + LLM深度集成 + Tushare Pro高级数据)") + logger.info(f"Smart Agent初始化完成(智能模式 + LLM深度集成 + Tushare Pro高级数据,模型: {self.model_override or '默认'})") else: logger.warning("Smart Agent初始化完成(规则模式,建议配置LLM)") @@ -50,7 +53,7 @@ class SmartStockAgent: loop = asyncio.get_event_loop() return await loop.run_in_executor( None, - lambda: llm_service.chat(messages, temperature, max_tokens) + lambda: llm_service.chat(messages, temperature, max_tokens, model_override=self.model_override) ) def _register_skills(self): @@ -2088,7 +2091,8 @@ RSI:{technical.get('rsi', 0):.2f if technical.get('rsi') else '计算中'} stream = llm_service.chat_stream( messages=[{"role": "user", "content": prompt}], temperature=0.7, - max_tokens=2500 # 增加 token 数量以容纳新闻分析 + max_tokens=2500, # 增加 token 数量以容纳新闻分析 + model_override=self.model_override ) for chunk in stream: @@ -2163,7 +2167,8 @@ RSI:{technical.get('rsi', 0):.2f if technical.get('rsi') else '计算中'} stream = llm_service.chat_stream( messages=[{"role": "user", "content": prompt}], temperature=0.7, - max_tokens=2500 + max_tokens=2500, + model_override=self.model_override ) for chunk in stream: @@ -2480,7 +2485,8 @@ RSI:{technical.get('rsi', 0):.2f if technical.get('rsi') else '计算中'} stream = llm_service.chat_stream( messages=[{"role": "user", "content": prompt}], temperature=0.7, - max_tokens=2500 + max_tokens=2500, + model_override=self.model_override ) # 在线程中迭代同步生成器,避免阻塞事件循环 @@ -2581,7 +2587,8 @@ MACD:{f"{technical.get('macd'):.4f}" if technical.get('macd') else '计算中' stream = llm_service.chat_stream( messages=[{"role": "user", "content": prompt}], temperature=0.7, - max_tokens=2500 # 增加 token 数量以容纳新闻分析 + max_tokens=2500, # 增加 token 数量以容纳新闻分析 + model_override=self.model_override ) # 在线程中迭代同步生成器,避免阻塞事件循环 @@ -2984,7 +2991,8 @@ MACD:{f"{technical.get('macd'):.4f}" if technical.get('macd') else '计算中' stream = llm_service.chat_stream( messages=[{"role": "user", "content": prompt}], temperature=0.7, - max_tokens=self._calculate_max_tokens(intent) + max_tokens=self._calculate_max_tokens(intent), + model_override=self.model_override ) for chunk in stream: diff --git a/backend/app/config.py b/backend/app/config.py index 253b4ef..a6ddb57 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -116,6 +116,10 @@ class Settings(BaseSettings): paper_trading_position_b: float = 500 # B级信号仓位 (USDT) paper_trading_position_c: float = 200 # C级信号仓位 (USDT) + # Agent 模型配置 (可选值: zhipu, deepseek) + smart_agent_model: str = "deepseek" # SmartAgent 使用的模型 + crypto_agent_model: str = "deepseek" # CryptoAgent 使用的模型 + class Config: env_file = find_env_file() case_sensitive = False diff --git a/backend/app/crypto_agent/llm_signal_analyzer.py b/backend/app/crypto_agent/llm_signal_analyzer.py index 9dea52b..9ee1e33 100644 --- a/backend/app/crypto_agent/llm_signal_analyzer.py +++ b/backend/app/crypto_agent/llm_signal_analyzer.py @@ -143,8 +143,11 @@ class LLMSignalAnalyzer: def __init__(self): """初始化分析器""" + from app.config import get_settings self.news_service = get_news_service() - logger.info("LLM 信号分析器初始化完成(含新闻舆情)") + settings = get_settings() + self.model_override = getattr(settings, 'crypto_agent_model', None) + logger.info(f"LLM 信号分析器初始化完成(含新闻舆情,模型: {self.model_override or '默认'})") async def analyze(self, symbol: str, data: Dict[str, pd.DataFrame], symbols: List[str] = None) -> Dict[str, Any]: @@ -170,7 +173,7 @@ class LLMSignalAnalyzer: response = llm_service.chat([ {"role": "system", "content": self.SYSTEM_PROMPT}, {"role": "user", "content": data_prompt} - ]) + ], model_override=self.model_override) if not response: logger.warning(f"{symbol} LLM 分析无响应") diff --git a/backend/app/services/llm_service.py b/backend/app/services/llm_service.py index e8c7265..c05bdba 100644 --- a/backend/app/services/llm_service.py +++ b/backend/app/services/llm_service.py @@ -19,16 +19,18 @@ class LLMService: messages: List[Dict[str, str]], model: str = None, temperature: float = 0.7, - max_tokens: int = 2000 + max_tokens: int = 2000, + model_override: str = None ) -> Optional[str]: """ 调用LLM进行对话 Args: messages: 消息列表 - model: 模型名称(忽略,使用当前选择的模型) + model: 模型名称(已废弃,使用 model_override) temperature: 温度参数 max_tokens: 最大token数 + model_override: 指定使用的模型 (zhipu/deepseek) Returns: LLM响应文本 @@ -36,7 +38,8 @@ class LLMService: return self.multi_service.chat( messages=messages, temperature=temperature, - max_tokens=max_tokens + max_tokens=max_tokens, + model_override=model_override ) def analyze_intent(self, user_message: str) -> Dict[str, Any]: @@ -47,7 +50,8 @@ class LLMService: self, messages: List[Dict[str, str]], temperature: float = 0.7, - max_tokens: int = 2000 + max_tokens: int = 2000, + model_override: str = None ): """ 流式调用LLM进行对话 @@ -56,6 +60,7 @@ class LLMService: messages: 消息列表 temperature: 温度参数 max_tokens: 最大token数 + model_override: 指定使用的模型 (zhipu/deepseek) Yields: LLM响应的文本片段 @@ -63,7 +68,8 @@ class LLMService: return self.multi_service.chat_stream( messages=messages, temperature=temperature, - max_tokens=max_tokens + max_tokens=max_tokens, + model_override=model_override ) diff --git a/backend/app/services/multi_llm_service.py b/backend/app/services/multi_llm_service.py index 3745569..64fd888 100644 --- a/backend/app/services/multi_llm_service.py +++ b/backend/app/services/multi_llm_service.py @@ -66,8 +66,12 @@ class MultiLLMService: except Exception as e: logger.error(f"DeepSeek初始化失败: {e}") - # 设置默认模型(优先DeepSeek,因为更便宜) - if 'deepseek' in self.clients: + # 设置默认模型(优先使用配置文件中的设置) + preferred_model = getattr(settings, 'smart_agent_model', None) + if preferred_model and preferred_model in self.clients: + self.current_model = preferred_model + logger.info(f"使用配置的模型: {preferred_model}") + elif 'deepseek' in self.clients: self.current_model = 'deepseek' elif 'zhipu' in self.clients: self.current_model = 'zhipu' @@ -138,10 +142,12 @@ class MultiLLMService: if provider == 'zhipu': # 智谱AI调用 + # Zhipu对参数更严格,temperature范围是0.0-1.0 + safe_temperature = max(0.0, min(1.0, temperature)) response = client.chat.completions.create( model=model_id, messages=messages, - temperature=temperature, + temperature=safe_temperature, max_tokens=max_tokens ) elif provider == 'deepseek': @@ -205,10 +211,12 @@ class MultiLLMService: if provider == 'zhipu': # 智谱AI流式调用 + # Zhipu对参数更严格,temperature范围是0.0-1.0 + safe_temperature = max(0.0, min(1.0, temperature)) response = client.chat.completions.create( model=model_id, messages=messages, - temperature=temperature, + temperature=safe_temperature, max_tokens=max_tokens, stream=True ) diff --git a/frontend/css/style.css b/frontend/css/style.css index 0d4abac..9240f25 100644 --- a/frontend/css/style.css +++ b/frontend/css/style.css @@ -135,6 +135,12 @@ html, body { color: var(--text-primary); } +.model-name { + color: var(--text-primary); + font-size: 13px; + font-family: inherit; +} + .status { display: flex; align-items: center; diff --git a/frontend/index.html b/frontend/index.html index 507a1e0..aee8047 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -29,17 +29,13 @@ Tradus|AI金融智能体