fix(parse): _parse_agent_action 支持 deepseek v4 DSML 原生工具调用格式——长上下文多轮时不解析会5轮耗尽

This commit is contained in:
ymq 2026-08-28 18:17:46 +08:00
parent c9d914b9ff
commit 8fafe18d91

View File

@ -1762,6 +1762,26 @@ def _parse_agent_action(raw):
if raw.startswith("```"):
raw = raw.split("\n", 1)[1].rsplit("```", 1)[0].strip()
# deepseek v4 原生格式(全角竖线):<DSMLinvoke name="...">…<DSMLparameter name="...">value</DSMLparameter></DSMLinvoke>
# 与旧版 <invoke> 同款解析:长上下文多轮时 deepseek 会自发输出该格式,不解析则全部判「未识别」→ 5 轮耗尽。
m = re.search(r'<DSMLinvoke\s+name="([^"]+)"[^>]*>(.*?)</DSMLinvoke>', raw, re.DOTALL)
if m:
tool = m.group(1).strip()
body = m.group(2)
params = {}
for pm in re.finditer(r'<DSMLparameter\s+name="([^"]+)"[^>]*>(.*?)</DSMLparameter>', 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<tool_calls><invoke name="..."><parameter name="..." string="true">...</parameter></invoke></tool_calls>
m = re.search(r'<invoke\s+name="([^"]+)"[^>]*>(.*?)</invoke>', raw, re.DOTALL)
if m: