From 8a9d0f82948e63860d123dbf709be89ce71e198c Mon Sep 17 00:00:00 2001 From: ymq Date: Fri, 4 Sep 2026 19:32:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(llm=5Fbridge):=20=E4=BF=AE=E5=A4=8Dpurpose?= =?UTF-8?q?=E7=A2=B0=E6=92=9E=E2=80=94=E2=80=943=E4=B8=AA=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E5=87=BD=E6=95=B0=E8=A1=A5purpose=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E5=B9=B6=E5=A1=9Epayload.=5Fpurpose(=E4=B8=8A=E8=BD=AE?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=94=B6=E6=95=9B=E6=97=B6=E4=B8=A2=E5=A4=B1?= =?UTF-8?q?,4=E5=A4=84=E8=B0=83=E7=94=A8=E7=82=B9=E4=BC=A0purpose=3D'utili?= =?UTF-8?q?ty'=E4=BC=9ATypeError)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipeline_service/llm_bridge.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/pipeline_service/llm_bridge.py b/pipeline_service/llm_bridge.py index 769805a..e7ee630 100644 --- a/pipeline_service/llm_bridge.py +++ b/pipeline_service/llm_bridge.py @@ -105,11 +105,13 @@ def _no_llm_error(model_name=None, org_id=None) -> ValueError: async def llm_call(prompt: str, model: str = None, temperature: float = 0.7, - org_id: str = None, user_id: str = None) -> str: + org_id: str = None, user_id: str = None, purpose: str = '') -> str: """Call LLM and return text response. 统一走模型治理推理 API(门禁链 + 双维度记账)。 org_id 为空 = 系统级('0'),与旧语义(不过滤机构)等价。 + purpose='utility':辅助任务(分类/选择/摘要),治理层按用途选模型链 + (机构策略配置辅助模型优先),经 payload 的 _purpose 键透传到端点。 """ # 兼容旧优先级:harnessed_agent(若宿主加载了独立推理后端) try: @@ -129,6 +131,8 @@ async def llm_call(prompt: str, model: str = None, temperature: float = 0.7, "messages": [{"role": "user", "content": prompt}], "temperature": temperature, } + if purpose: + payload["_purpose"] = purpose data = await _http_chat(payload, org_id or '0', user_id or '', model or '') try: return data["choices"][0]["message"]["content"] @@ -143,9 +147,14 @@ async def call_llm(tenant_id: str, prompt: str, model: str = None, temperature: async def llm_call_msgs(messages: list, model: str = None, temperature: float = 0.7, - org_id: str = None, user_id: str = None) -> str: - """Call LLM with full message array (system/user/assistant).""" + org_id: str = None, user_id: str = None, purpose: str = '') -> str: + """Call LLM with full message array (system/user/assistant). + + purpose='utility':辅助任务(分类/选择/摘要),治理层按用途选模型链。 + """ payload = {"model": model or '', "messages": messages, "temperature": temperature} + if purpose: + payload["_purpose"] = purpose data = await _http_chat(payload, org_id or '0', user_id or '', model or '') try: return data["choices"][0]["message"]["content"] @@ -156,17 +165,20 @@ async def llm_call_msgs(messages: list, model: str = None, temperature: float = async def llm_call_msgs_native(messages: list, tools: list = None, model: str = None, temperature: float = 0.7, org_id: str = None, - user_id: str = None) -> dict: + user_id: str = None, purpose: str = '') -> dict: """Native function calling. 传入 tools JSON schema,返回 message dict。 Returns: {"content": str, "tool_calls": [{"id","type","function":{"name","arguments"}}]} 当模型返回 tool_calls 时,content 通常为空字符串。 + purpose='utility':辅助任务(分类/选择/摘要),治理层按用途选模型链。 """ payload = {"model": model or '', "messages": messages, "temperature": temperature} if tools: payload["tools"] = tools payload["tool_choice"] = "auto" + if purpose: + payload["_purpose"] = purpose data = await _http_chat(payload, org_id or '0', user_id or '', model or '') try: msg = data["choices"][0]["message"]