From 960608cee9660ba32ade96e91d609718887b2606 Mon Sep 17 00:00:00 2001 From: 666ghj <670939375@qq.com> Date: Wed, 8 Oct 2025 23:01:23 +0800 Subject: [PATCH] Migrate Forum Host and Keyword Optimizer to use OpenAI client. --- ForumEngine/llm_host.py | 61 +++++++++--------------- InsightEngine/tools/keyword_optimizer.py | 49 ++++++++----------- 2 files changed, 42 insertions(+), 68 deletions(-) diff --git a/ForumEngine/llm_host.py b/ForumEngine/llm_host.py index c62b663..1d01670 100644 --- a/ForumEngine/llm_host.py +++ b/ForumEngine/llm_host.py @@ -3,8 +3,7 @@ 使用硅基流动的Qwen3模型作为论坛主持人,引导多个agent进行讨论 """ -import requests -import json +from openai import OpenAI import sys import os from typing import List, Dict, Any, Optional @@ -39,13 +38,17 @@ class ForumHost: api_key: 硅基流动API密钥,如果不提供则从配置文件读取 """ self.api_key = api_key or GUIJI_QWEN3_API_KEY - self.base_url = "https://api.siliconflow.cn/v1/chat/completions" - self.model = "Qwen/Qwen3-235B-A22B-Instruct-2507" # 使用更大的模型 - + if not self.api_key: raise ValueError("未找到硅基流动API密钥,请在config.py中设置GUIJI_QWEN3_API_KEY") - - # 记录历史发言,避免重复 + + self.client = OpenAI( + api_key=self.api_key, + base_url="https://api.siliconflow.cn/v1" + ) + self.model = "Qwen/Qwen3-235B-A22B-Instruct-2507" # Use larger model variant + + # Track previous summaries to avoid duplicates self.previous_summaries = [] def generate_host_speech(self, forum_logs: List[str]) -> Optional[str]: @@ -204,43 +207,23 @@ class ForumHost: @with_graceful_retry(SEARCH_API_RETRY_CONFIG, default_return={"success": False, "error": "API服务暂时不可用"}) def _call_qwen_api(self, system_prompt: str, user_prompt: str) -> Dict[str, Any]: """调用Qwen API""" - headers = { - "Authorization": f"Bearer {self.api_key}", - "Content-Type": "application/json" - } - - data = { - "model": self.model, - "messages": [ - {"role": "system", "content": system_prompt}, - {"role": "user", "content": user_prompt} - ], - "max_tokens": 14639, - "temperature": 0.6, - "top_p": 0.9 - } - try: - response = requests.post( - self.base_url, - headers=headers, - json=data, - timeout=300 # 超时设置300s + response = self.client.chat.completions.create( + model=self.model, + messages=[ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt} + ], + max_tokens=14639, + temperature=0.6, + top_p=0.9, ) - response.raise_for_status() - - result = response.json() - - if "choices" in result and len(result["choices"]) > 0: - content = result["choices"][0]["message"]["content"] + + if response.choices: + content = response.choices[0].message.content return {"success": True, "content": content} else: return {"success": False, "error": "API返回格式异常"} - - except requests.exceptions.Timeout: - return {"success": False, "error": "API请求超时"} - except requests.exceptions.RequestException as e: - return {"success": False, "error": f"网络请求错误: {str(e)}"} except Exception as e: return {"success": False, "error": f"API调用异常: {str(e)}"} diff --git a/InsightEngine/tools/keyword_optimizer.py b/InsightEngine/tools/keyword_optimizer.py index a862cd7..cbc56ea 100644 --- a/InsightEngine/tools/keyword_optimizer.py +++ b/InsightEngine/tools/keyword_optimizer.py @@ -3,7 +3,7 @@ 使用Qwen AI将Agent生成的搜索词优化为更适合舆情数据库查询的关键词 """ -import requests +from openai import OpenAI import json import sys import os @@ -46,11 +46,15 @@ class KeywordOptimizer: api_key: 硅基流动API密钥,如果不提供则从配置文件读取 """ self.api_key = api_key or GUIJI_QWEN3_API_KEY - self.base_url = "https://api.siliconflow.cn/v1/chat/completions" - self.model = "Qwen/Qwen3-30B-A3B-Instruct-2507" - + if not self.api_key: raise ValueError("未找到硅基流动API密钥,请在config.py中设置GUIJI_QWEN3_API_KEY") + + self.client = OpenAI( + api_key=self.api_key, + base_url="https://api.siliconflow.cn/v1" + ) + self.model = "Qwen/Qwen3-30B-A3B-Instruct-2507" def optimize_keywords(self, original_query: str, context: str = "") -> KeywordOptimizationResponse: """ @@ -178,35 +182,22 @@ class KeywordOptimizer: @with_graceful_retry(SEARCH_API_RETRY_CONFIG, default_return={"success": False, "error": "关键词优化服务暂时不可用"}) def _call_qwen_api(self, system_prompt: str, user_prompt: str) -> Dict[str, Any]: """调用Qwen API""" - headers = { - "Authorization": f"Bearer {self.api_key}", - "Content-Type": "application/json" - } - - data = { - "model": self.model, - "messages": [ - {"role": "system", "content": system_prompt}, - {"role": "user", "content": user_prompt} - ], - "max_tokens": 10000, - "temperature": 0.7 - } - try: - response = requests.post(self.base_url, headers=headers, json=data, timeout=30) - response.raise_for_status() - - result = response.json() - - if "choices" in result and len(result["choices"]) > 0: - content = result["choices"][0]["message"]["content"] + response = self.client.chat.completions.create( + model=self.model, + messages=[ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt} + ], + max_tokens=10000, + temperature=0.7, + ) + + if response.choices: + content = response.choices[0].message.content return {"success": True, "content": content} else: return {"success": False, "error": "API返回格式异常"} - - except requests.exceptions.RequestException as e: - return {"success": False, "error": f"网络请求错误: {str(e)}"} except Exception as e: return {"success": False, "error": f"API调用异常: {str(e)}"}