fix(parse): DSML双竖线变体+叙述内嵌json代码块解析——实测两种新失败形态,兼容竖线数量任意变化

This commit is contained in:
ymq 2026-08-29 16:51:48 +08:00
parent cb0a87e65e
commit 519b4bfcf4

View File

@ -1766,12 +1766,13 @@ def _parse_agent_action(raw):
# deepseek v4 原生格式(全角竖线):<DSMLinvoke name="...">…<DSMLparameter name="...">value</DSMLparameter></DSMLinvoke>
# 与旧版 <invoke> 同款解析:长上下文多轮时 deepseek 会自发输出该格式,不解析则全部判「未识别」→ 5 轮耗尽。
m = re.search(r'<DSMLinvoke\s+name="([^"]+)"[^>]*>(.*?)</DSMLinvoke>', raw, re.DOTALL)
# ⚠️ 竖线数量会变:实测出现过单竖线 <DSMLinvoke> 和双竖线 <DSMLinvoke>,用 + 兼容任意数量。
m = re.search(r'<+DSML+invoke\s+name="([^"]+)"[^>]*>(.*?)</+DSML+invoke>', 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):
for pm in re.finditer(r'<+DSML+parameter\s+name="([^"]+)"[^>]*>(.*?)</+DSML+parameter>', body, re.DOTALL):
val = pm.group(2).strip()
try:
val = json.loads(val)
@ -1809,6 +1810,20 @@ def _parse_agent_action(raw):
return d
except (json.JSONDecodeError, ValueError):
pass
# 叙述文本里嵌的 ```json 代码块deepseek 常先说"我来加载技能"再贴 JSON tool_call
# 上面 startswith("```") 只剥离开头的围栏,处理不了带叙述前缀的;这里全文找第一个可解析的动作 JSON。
for fm in re.finditer(r'```(?:json)?\s*\n(.*?)\n?\s*```', raw, re.DOTALL):
try:
d = json.loads(fm.group(1).strip())
except (json.JSONDecodeError, ValueError):
continue
if isinstance(d, dict) and 'action' in d:
return d
# 兼容 {"tool":..,"params":..} 无 action 字段的写法
if isinstance(d, dict) and 'tool' in d:
return {"action": "tool_call", "tool": d.get("tool", ""), "params": d.get("params") or {}}
return {"action": "deliver", "result": raw}