MCPcopy Create free account
hub / github.com/aurora-develop/aurora / RecoverFromText

Function RecoverFromText

internal/toolcall/recover.go:61–98  ·  view source on GitHub ↗

RecoverFromText 兜底:从已输出的纯文本里扫描 JSON 对象,抽出 (a) {"name":..., "arguments":...} 或 (b) {"cmd": [...]} / {"cmd": "..."} 这两种 chatgpt 沙箱形状 然后转成 ToolCall。返回的列表已去重。

(text string, tools []official.Tool)

Source from the content-addressed store, hash-verified

59// (b) {"cmd": [...]} / {"cmd": "..."} 这两种 chatgpt 沙箱形状
60// 然后转成 ToolCall。返回的列表已去重。
61func RecoverFromText(text string, tools []official.Tool) []official.ToolCall {
62 if !strings.Contains(text, "{") {
63 return nil
64 }
65 shellName, shellParam := ResolveShellTool(tools)
66 seen := make(map[string]bool)
67 var out []official.ToolCall
68 for _, obj := range iterJSONObjects(text) {
69 var tc *official.ToolCall
70 if name := pickString(obj, "name", "tool", "tool_name", "function"); name != "" {
71 tc = buildToolCallFromObject(obj)
72 } else if shellName != "" {
73 if cmd, ok := obj["cmd"]; ok {
74 if s := cmdToString(cmd); s != "" {
75 raw, _ := json.Marshal(map[string]string{shellParam: s})
76 tc = &official.ToolCall{
77 ID: generateCallID(),
78 Type: "function",
79 Function: official.ToolCallFunc{
80 Name: shellName,
81 Arguments: string(raw),
82 },
83 }
84 }
85 }
86 }
87 if tc == nil {
88 continue
89 }
90 key := tc.Function.Name + "\x00" + tc.Function.Arguments
91 if seen[key] {
92 continue
93 }
94 seen[key] = true
95 out = append(out, *tc)
96 }
97 return out
98}
99
100// iterJSONObjects 扫描 text 中所有花括号平衡的 JSON 对象。
101// 按出现顺序返回(只对顶层对象计数,字符串里的 {} 不算)。

Calls 6

ResolveShellToolFunction · 0.85
iterJSONObjectsFunction · 0.85
pickStringFunction · 0.85
buildToolCallFromObjectFunction · 0.85
cmdToStringFunction · 0.85
generateCallIDFunction · 0.85