From 2f0f026fdbe7547826199242cafa421447a207c1 Mon Sep 17 00:00:00 2001 From: ZhouYongyou <128128010+zhouyongyou@users.noreply.github.com> Date: Tue, 4 Nov 2025 22:41:35 +0800 Subject: [PATCH] =?UTF-8?q?fix(decision):=20handle=20fullwidth=20JSON=20ch?= =?UTF-8?q?aracters=20from=20AI=20responses=20Extends=20fixMissingQuotes()?= =?UTF-8?q?=20to=20replace=20fullwidth=20brackets,=20colons,=20and=20comma?= =?UTF-8?q?s=20that=20Claude=20AI=20occasionally=20outputs,=20preventing?= =?UTF-8?q?=20JSON=20parsing=20failures.=20Root=20cause:=20AI=20can=20outp?= =?UTF-8?q?ut=20fullwidth=20characters=20like=20=EF=BC=BB=EF=BD=9B?= =?UTF-8?q?=EF=BC=9A=EF=BC=8C=20instead=20of=20[{=20:,=20Error:=20"JSON=20?= =?UTF-8?q?=E5=BF=85=E9=A1=BB=E4=BB=A5=20[{=20=E5=BC=80=E5=A4=B4=EF=BC=8C?= =?UTF-8?q?=E5=AE=9E=E9=99=85:=20[=20{"symbol":=20"BTCU"=20Fix:=20Replace?= =?UTF-8?q?=20all=20fullwidth=20JSON=20syntax=20characters:=20-=20?= =?UTF-8?q?=EF=BC=BB=EF=BC=BD=20(U+FF3B/FF3D)=20=E2=86=92=20[]=20-=20?= =?UTF-8?q?=EF=BD=9B=EF=BD=9D=20(U+FF5B/FF5D)=20=E2=86=92=20{}=20-=20?= =?UTF-8?q?=EF=BC=9A=20(U+FF1A)=20=E2=86=92=20:=20-=20=EF=BC=8C=20(U+FF0C)?= =?UTF-8?q?=20=E2=86=92=20,=20Test=20case:=20Input:=20=20=EF=BC=BB?= =?UTF-8?q?=EF=BD=9B\"symbol\"=EF=BC=9A\"BTCUSDT\"=EF=BC=8C\"action\"?= =?UTF-8?q?=EF=BC=9A\"open=5Fshort\"=EF=BD=9D=EF=BC=BD=20Output:=20[{\"sym?= =?UTF-8?q?bol\":\"BTCUSDT\",\"action\":\"open=5Fshort\"}]=20Co-Authored-B?= =?UTF-8?q?y:=20tinkle-community=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decision/engine.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/decision/engine.go b/decision/engine.go index df48d534..9a75df38 100644 --- a/decision/engine.go +++ b/decision/engine.go @@ -459,12 +459,22 @@ func extractDecisions(response string) ([]Decision, error) { return decisions, nil } -// fixMissingQuotes 替换中文引号为英文引号(避免输入法自动转换) +// fixMissingQuotes 替换中文引号和全角字符为英文引号和半角字符(避免AI输出全角JSON字符导致解析失败) func fixMissingQuotes(jsonStr string) string { + // 替换中文引号 jsonStr = strings.ReplaceAll(jsonStr, "\u201c", "\"") // " jsonStr = strings.ReplaceAll(jsonStr, "\u201d", "\"") // " jsonStr = strings.ReplaceAll(jsonStr, "\u2018", "'") // ' jsonStr = strings.ReplaceAll(jsonStr, "\u2019", "'") // ' + + // ⚠️ 替换全角括号、冒号、逗号(防止AI输出全角JSON字符) + jsonStr = strings.ReplaceAll(jsonStr, "[", "[") // U+FF3B 全角左方括号 + jsonStr = strings.ReplaceAll(jsonStr, "]", "]") // U+FF3D 全角右方括号 + jsonStr = strings.ReplaceAll(jsonStr, "{", "{") // U+FF5B 全角左花括号 + jsonStr = strings.ReplaceAll(jsonStr, "}", "}") // U+FF5D 全角右花括号 + jsonStr = strings.ReplaceAll(jsonStr, ":", ":") // U+FF1A 全角冒号 + jsonStr = strings.ReplaceAll(jsonStr, ",", ",") // U+FF0C 全角逗号 + return jsonStr }