From 8fafe18d91d54af872ce2dbe08e29cbbb3f928d0 Mon Sep 17 00:00:00 2001 From: ymq Date: Fri, 28 Aug 2026 18:17:46 +0800 Subject: [PATCH] =?UTF-8?q?fix(parse):=20=5Fparse=5Fagent=5Faction=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20deepseek=20v4=20DSML=20=E5=8E=9F=E7=94=9F?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E8=B0=83=E7=94=A8=E6=A0=BC=E5=BC=8F=E2=80=94?= =?UTF-8?q?=E2=80=94=E9=95=BF=E4=B8=8A=E4=B8=8B=E6=96=87=E5=A4=9A=E8=BD=AE?= =?UTF-8?q?=E6=97=B6=E4=B8=8D=E8=A7=A3=E6=9E=90=E4=BC=9A5=E8=BD=AE?= =?UTF-8?q?=E8=80=97=E5=B0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipeline_service/agent_loop.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pipeline_service/agent_loop.py b/pipeline_service/agent_loop.py index 73ded22..5c7056b 100644 --- a/pipeline_service/agent_loop.py +++ b/pipeline_service/agent_loop.py @@ -1762,6 +1762,26 @@ def _parse_agent_action(raw): if raw.startswith("```"): raw = raw.split("\n", 1)[1].rsplit("```", 1)[0].strip() + # deepseek v4 原生格式(全角竖线):<|DSML||invoke name="...">…<|DSML||parameter name="...">value + # 与旧版 同款解析:长上下文多轮时 deepseek 会自发输出该格式,不解析则全部判「未识别」→ 5 轮耗尽。 + m = re.search(r'<|DSML||invoke\s+name="([^"]+)"[^>]*>(.*?)', raw, re.DOTALL) + if m: + tool = m.group(1).strip() + body = m.group(2) + params = {} + for pm in re.finditer(r'<|DSML||parameter\s+name="([^"]+)"[^>]*>(.*?)', body, re.DOTALL): + val = pm.group(2).strip() + try: + val = json.loads(val) + except (json.JSONDecodeError, ValueError): + pass + params[pm.group(1)] = val + if tool in ('deliver', 'deliver_result', 'submit', 'finish'): + return {"action": "deliver", **params} + if tool in ('ask', 'ask_question', 'ask_user'): + return {"action": "ask", "question": params.get("question", "")} + return {"action": "tool_call", "tool": tool, "params": params} + # deepseek 原生 function calling 输出 XML:... m = re.search(r']*>(.*?)', raw, re.DOTALL) if m: