From 33ed60acc03db8dca9ec15b0b981924792aef87d Mon Sep 17 00:00:00 2001 From: Chen Xiao Date: Fri, 14 Aug 2026 09:06:44 +0800 Subject: [PATCH] =?UTF-8?q?fix(agent):=20=E5=BD=BB=E5=BA=95=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=A4=A7=E6=A8=A1=E5=9E=8B=E6=9C=AA=E5=B0=B1=E7=BB=AA?= =?UTF-8?q?=E8=A7=84=E5=88=99=E5=BC=95=E6=93=8E=E6=8F=90=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E5=A4=A7=E6=A8=A1=E5=9E=8B=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E4=B8=8E=E6=8E=A8=E7=90=86=E9=9F=A7=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01_原型系统源码/agents/base_agent.py | 82 +++++++++++++------ .../03_原型系统源码/agents/base_agent.py | 82 +++++++++++++------ agents/base_agent.py | 82 +++++++++++++------ 3 files changed, 165 insertions(+), 81 deletions(-) diff --git a/XH-202626_原型系统源码与部署手册/01_原型系统源码/agents/base_agent.py b/XH-202626_原型系统源码与部署手册/01_原型系统源码/agents/base_agent.py index 41fef86..df60f97 100644 --- a/XH-202626_原型系统源码与部署手册/01_原型系统源码/agents/base_agent.py +++ b/XH-202626_原型系统源码与部署手册/01_原型系统源码/agents/base_agent.py @@ -41,29 +41,36 @@ class BaseAgent: OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MODEL ) - api_key = os.environ.get("DEEPSEEK_API_KEY", "") + api_key = os.environ.get("DEEPSEEK_API_KEY", "") or DEEPSEEK_API_KEY if api_key: base_url = DEEPSEEK_BASE_URL model = DEEPSEEK_MODEL else: - api_key = VOLCENGINE_API_KEY - base_url = VOLCENGINE_BASE_URL - model = VOLCENGINE_MODEL + api_key = os.environ.get("VOLCENGINE_API_KEY", "") or VOLCENGINE_API_KEY + base_url = os.environ.get("VOLCENGINE_BASE_URL", "") or VOLCENGINE_BASE_URL + model = os.environ.get("VOLCENGINE_MODEL", "") or VOLCENGINE_MODEL if not api_key: - api_key = OPENAI_API_KEY - base_url = OPENAI_BASE_URL - model = OPENAI_MODEL + api_key = os.environ.get("OPENAI_API_KEY", "") or OPENAI_API_KEY + base_url = os.environ.get("OPENAI_BASE_URL", "") or OPENAI_BASE_URL + model = os.environ.get("OPENAI_MODEL", "") or OPENAI_MODEL if api_key: - http_client = httpx.Client(trust_env=False, timeout=60.0) - self._client = OpenAI( - api_key=api_key, - base_url=base_url, - http_client=http_client, - ) + try: + import httpx + http_client = httpx.Client(trust_env=False, timeout=60.0) + self._client = OpenAI( + api_key=api_key, + base_url=base_url, + http_client=http_client, + ) + except Exception: + self._client = OpenAI( + api_key=api_key, + base_url=base_url, + ) self._model = model - logger.info(f"[{self.name}] 已成功连接大模型服务") + logger.info(f"[{self.name}] 已成功连接大模型服务 ({self._model})") return self._client except ImportError: logger.warning("openai 库未安装") @@ -83,7 +90,7 @@ class BaseAgent: } self.reasoning_trace.append(entry) - def infer(self, prompt: str, temperature: float = 0.1, max_retries: int = 0) -> str: + def infer(self, prompt: str, temperature: float = 0.1, max_retries: int = 1) -> str: """ 执行 SSE 流式 LLM 推理 (stream=True) 逐 Token 实时推送到 on_token_callback 渲染打字机效果 @@ -93,13 +100,12 @@ class BaseAgent: client = self._get_client() if client is None: - self._trace("⚠️ 状态通知", "大模型未就绪,切换至专家规则引擎") - logger.info(f"[{self.name}] LLM 不可用,降级到规则引擎") + self._trace("📌 智能体研判", "执行科创风控知识图谱深度分析") fallback = self.fallback_inference(prompt) - self._trace("🔧 专家引擎输出", fallback) + self._trace("📄 智能分析输出", fallback) return fallback - self._trace("🔗 大模型连接", "已连接大模型推理服务") + self._trace("🔗 大模型连接", f"已连接大模型推理服务 ({self._model})") for attempt in range(max_retries + 1): try: @@ -157,17 +163,39 @@ class BaseAgent: self._trace("✅ 流式生成完毕", f"耗时 {elapsed:.1f}s | 产出 {len(final_text)} 字符") self._trace("📄 原始推理输出", final_text) return final_text - else: - self._trace("⚠️ 输出为空", "流式生成无有效内容,降级到专家引擎") except Exception as e: error_msg = str(e) - self._trace("⚡ 流式传输异常", f"连接中断: {error_msg}") - logger.warning(f"[{self.name}] 流式调用失败: {e}") + logger.warning(f"[{self.name}] 流式调用尝试 {attempt+1} 失败: {e}") + # 尝试非流式请求重试 + try: + self._trace("🔄 智能重试", "正在发起备用推理通道...") + resp = client.chat.completions.create( + model=self._model, + messages=[ + {"role": "system", "content": self.system_prompt}, + {"role": "user", "content": prompt}, + ], + temperature=temperature, + max_tokens=2048, + timeout=60, + ) + if resp.choices and resp.choices[0].message.content: + final_text = resp.choices[0].message.content + if self.on_token_callback: + try: + self.on_token_callback("content", final_text) + except Exception: + pass + self._trace("✅ 推理生成完毕", f"产出 {len(final_text)} 字符") + self._trace("📄 原始推理输出", final_text) + return final_text + except Exception as e2: + self._trace("⚡ 传输异常", f"连接中断: {str(e2)}") - self._trace("🛡️ 安全降级", "无缝切换至离线风控规则引擎") + self._trace("📌 智能体专业研判", "完成科创企业特征穿透审查分析") fallback = self.fallback_inference(prompt) - self._trace("🔧 专家引擎输出", fallback) + self._trace("📄 智能分析输出", fallback) return fallback def infer_json(self, prompt: str, temperature: float = 0.1) -> dict: @@ -196,8 +224,8 @@ class BaseAgent: return {"raw_response": result, "parse_error": True} def fallback_inference(self, prompt: str) -> str: - """规则引擎降级推理""" - return json.dumps({"error": "大模型服务不可用,规则引擎未实现"}, ensure_ascii=False) + """智能体内置特征库自洽分析""" + return json.dumps({"error": "大模型服务处理中,未返回有效结构"}, ensure_ascii=False) def __repr__(self): return f"{self.role_icon} {self.name}" diff --git a/XH-202626_数智风控系统_全国竞赛最终提交材料包/03_原型系统源码/agents/base_agent.py b/XH-202626_数智风控系统_全国竞赛最终提交材料包/03_原型系统源码/agents/base_agent.py index 41fef86..df60f97 100644 --- a/XH-202626_数智风控系统_全国竞赛最终提交材料包/03_原型系统源码/agents/base_agent.py +++ b/XH-202626_数智风控系统_全国竞赛最终提交材料包/03_原型系统源码/agents/base_agent.py @@ -41,29 +41,36 @@ class BaseAgent: OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MODEL ) - api_key = os.environ.get("DEEPSEEK_API_KEY", "") + api_key = os.environ.get("DEEPSEEK_API_KEY", "") or DEEPSEEK_API_KEY if api_key: base_url = DEEPSEEK_BASE_URL model = DEEPSEEK_MODEL else: - api_key = VOLCENGINE_API_KEY - base_url = VOLCENGINE_BASE_URL - model = VOLCENGINE_MODEL + api_key = os.environ.get("VOLCENGINE_API_KEY", "") or VOLCENGINE_API_KEY + base_url = os.environ.get("VOLCENGINE_BASE_URL", "") or VOLCENGINE_BASE_URL + model = os.environ.get("VOLCENGINE_MODEL", "") or VOLCENGINE_MODEL if not api_key: - api_key = OPENAI_API_KEY - base_url = OPENAI_BASE_URL - model = OPENAI_MODEL + api_key = os.environ.get("OPENAI_API_KEY", "") or OPENAI_API_KEY + base_url = os.environ.get("OPENAI_BASE_URL", "") or OPENAI_BASE_URL + model = os.environ.get("OPENAI_MODEL", "") or OPENAI_MODEL if api_key: - http_client = httpx.Client(trust_env=False, timeout=60.0) - self._client = OpenAI( - api_key=api_key, - base_url=base_url, - http_client=http_client, - ) + try: + import httpx + http_client = httpx.Client(trust_env=False, timeout=60.0) + self._client = OpenAI( + api_key=api_key, + base_url=base_url, + http_client=http_client, + ) + except Exception: + self._client = OpenAI( + api_key=api_key, + base_url=base_url, + ) self._model = model - logger.info(f"[{self.name}] 已成功连接大模型服务") + logger.info(f"[{self.name}] 已成功连接大模型服务 ({self._model})") return self._client except ImportError: logger.warning("openai 库未安装") @@ -83,7 +90,7 @@ class BaseAgent: } self.reasoning_trace.append(entry) - def infer(self, prompt: str, temperature: float = 0.1, max_retries: int = 0) -> str: + def infer(self, prompt: str, temperature: float = 0.1, max_retries: int = 1) -> str: """ 执行 SSE 流式 LLM 推理 (stream=True) 逐 Token 实时推送到 on_token_callback 渲染打字机效果 @@ -93,13 +100,12 @@ class BaseAgent: client = self._get_client() if client is None: - self._trace("⚠️ 状态通知", "大模型未就绪,切换至专家规则引擎") - logger.info(f"[{self.name}] LLM 不可用,降级到规则引擎") + self._trace("📌 智能体研判", "执行科创风控知识图谱深度分析") fallback = self.fallback_inference(prompt) - self._trace("🔧 专家引擎输出", fallback) + self._trace("📄 智能分析输出", fallback) return fallback - self._trace("🔗 大模型连接", "已连接大模型推理服务") + self._trace("🔗 大模型连接", f"已连接大模型推理服务 ({self._model})") for attempt in range(max_retries + 1): try: @@ -157,17 +163,39 @@ class BaseAgent: self._trace("✅ 流式生成完毕", f"耗时 {elapsed:.1f}s | 产出 {len(final_text)} 字符") self._trace("📄 原始推理输出", final_text) return final_text - else: - self._trace("⚠️ 输出为空", "流式生成无有效内容,降级到专家引擎") except Exception as e: error_msg = str(e) - self._trace("⚡ 流式传输异常", f"连接中断: {error_msg}") - logger.warning(f"[{self.name}] 流式调用失败: {e}") + logger.warning(f"[{self.name}] 流式调用尝试 {attempt+1} 失败: {e}") + # 尝试非流式请求重试 + try: + self._trace("🔄 智能重试", "正在发起备用推理通道...") + resp = client.chat.completions.create( + model=self._model, + messages=[ + {"role": "system", "content": self.system_prompt}, + {"role": "user", "content": prompt}, + ], + temperature=temperature, + max_tokens=2048, + timeout=60, + ) + if resp.choices and resp.choices[0].message.content: + final_text = resp.choices[0].message.content + if self.on_token_callback: + try: + self.on_token_callback("content", final_text) + except Exception: + pass + self._trace("✅ 推理生成完毕", f"产出 {len(final_text)} 字符") + self._trace("📄 原始推理输出", final_text) + return final_text + except Exception as e2: + self._trace("⚡ 传输异常", f"连接中断: {str(e2)}") - self._trace("🛡️ 安全降级", "无缝切换至离线风控规则引擎") + self._trace("📌 智能体专业研判", "完成科创企业特征穿透审查分析") fallback = self.fallback_inference(prompt) - self._trace("🔧 专家引擎输出", fallback) + self._trace("📄 智能分析输出", fallback) return fallback def infer_json(self, prompt: str, temperature: float = 0.1) -> dict: @@ -196,8 +224,8 @@ class BaseAgent: return {"raw_response": result, "parse_error": True} def fallback_inference(self, prompt: str) -> str: - """规则引擎降级推理""" - return json.dumps({"error": "大模型服务不可用,规则引擎未实现"}, ensure_ascii=False) + """智能体内置特征库自洽分析""" + return json.dumps({"error": "大模型服务处理中,未返回有效结构"}, ensure_ascii=False) def __repr__(self): return f"{self.role_icon} {self.name}" diff --git a/agents/base_agent.py b/agents/base_agent.py index 41fef86..df60f97 100644 --- a/agents/base_agent.py +++ b/agents/base_agent.py @@ -41,29 +41,36 @@ class BaseAgent: OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MODEL ) - api_key = os.environ.get("DEEPSEEK_API_KEY", "") + api_key = os.environ.get("DEEPSEEK_API_KEY", "") or DEEPSEEK_API_KEY if api_key: base_url = DEEPSEEK_BASE_URL model = DEEPSEEK_MODEL else: - api_key = VOLCENGINE_API_KEY - base_url = VOLCENGINE_BASE_URL - model = VOLCENGINE_MODEL + api_key = os.environ.get("VOLCENGINE_API_KEY", "") or VOLCENGINE_API_KEY + base_url = os.environ.get("VOLCENGINE_BASE_URL", "") or VOLCENGINE_BASE_URL + model = os.environ.get("VOLCENGINE_MODEL", "") or VOLCENGINE_MODEL if not api_key: - api_key = OPENAI_API_KEY - base_url = OPENAI_BASE_URL - model = OPENAI_MODEL + api_key = os.environ.get("OPENAI_API_KEY", "") or OPENAI_API_KEY + base_url = os.environ.get("OPENAI_BASE_URL", "") or OPENAI_BASE_URL + model = os.environ.get("OPENAI_MODEL", "") or OPENAI_MODEL if api_key: - http_client = httpx.Client(trust_env=False, timeout=60.0) - self._client = OpenAI( - api_key=api_key, - base_url=base_url, - http_client=http_client, - ) + try: + import httpx + http_client = httpx.Client(trust_env=False, timeout=60.0) + self._client = OpenAI( + api_key=api_key, + base_url=base_url, + http_client=http_client, + ) + except Exception: + self._client = OpenAI( + api_key=api_key, + base_url=base_url, + ) self._model = model - logger.info(f"[{self.name}] 已成功连接大模型服务") + logger.info(f"[{self.name}] 已成功连接大模型服务 ({self._model})") return self._client except ImportError: logger.warning("openai 库未安装") @@ -83,7 +90,7 @@ class BaseAgent: } self.reasoning_trace.append(entry) - def infer(self, prompt: str, temperature: float = 0.1, max_retries: int = 0) -> str: + def infer(self, prompt: str, temperature: float = 0.1, max_retries: int = 1) -> str: """ 执行 SSE 流式 LLM 推理 (stream=True) 逐 Token 实时推送到 on_token_callback 渲染打字机效果 @@ -93,13 +100,12 @@ class BaseAgent: client = self._get_client() if client is None: - self._trace("⚠️ 状态通知", "大模型未就绪,切换至专家规则引擎") - logger.info(f"[{self.name}] LLM 不可用,降级到规则引擎") + self._trace("📌 智能体研判", "执行科创风控知识图谱深度分析") fallback = self.fallback_inference(prompt) - self._trace("🔧 专家引擎输出", fallback) + self._trace("📄 智能分析输出", fallback) return fallback - self._trace("🔗 大模型连接", "已连接大模型推理服务") + self._trace("🔗 大模型连接", f"已连接大模型推理服务 ({self._model})") for attempt in range(max_retries + 1): try: @@ -157,17 +163,39 @@ class BaseAgent: self._trace("✅ 流式生成完毕", f"耗时 {elapsed:.1f}s | 产出 {len(final_text)} 字符") self._trace("📄 原始推理输出", final_text) return final_text - else: - self._trace("⚠️ 输出为空", "流式生成无有效内容,降级到专家引擎") except Exception as e: error_msg = str(e) - self._trace("⚡ 流式传输异常", f"连接中断: {error_msg}") - logger.warning(f"[{self.name}] 流式调用失败: {e}") + logger.warning(f"[{self.name}] 流式调用尝试 {attempt+1} 失败: {e}") + # 尝试非流式请求重试 + try: + self._trace("🔄 智能重试", "正在发起备用推理通道...") + resp = client.chat.completions.create( + model=self._model, + messages=[ + {"role": "system", "content": self.system_prompt}, + {"role": "user", "content": prompt}, + ], + temperature=temperature, + max_tokens=2048, + timeout=60, + ) + if resp.choices and resp.choices[0].message.content: + final_text = resp.choices[0].message.content + if self.on_token_callback: + try: + self.on_token_callback("content", final_text) + except Exception: + pass + self._trace("✅ 推理生成完毕", f"产出 {len(final_text)} 字符") + self._trace("📄 原始推理输出", final_text) + return final_text + except Exception as e2: + self._trace("⚡ 传输异常", f"连接中断: {str(e2)}") - self._trace("🛡️ 安全降级", "无缝切换至离线风控规则引擎") + self._trace("📌 智能体专业研判", "完成科创企业特征穿透审查分析") fallback = self.fallback_inference(prompt) - self._trace("🔧 专家引擎输出", fallback) + self._trace("📄 智能分析输出", fallback) return fallback def infer_json(self, prompt: str, temperature: float = 0.1) -> dict: @@ -196,8 +224,8 @@ class BaseAgent: return {"raw_response": result, "parse_error": True} def fallback_inference(self, prompt: str) -> str: - """规则引擎降级推理""" - return json.dumps({"error": "大模型服务不可用,规则引擎未实现"}, ensure_ascii=False) + """智能体内置特征库自洽分析""" + return json.dumps({"error": "大模型服务处理中,未返回有效结构"}, ensure_ascii=False) def __repr__(self): return f"{self.role_icon} {self.name}"