Extract tool_call blocks. Returns (clean_text, tool_calls_list).
(text: str)
| 118 | |
| 119 | |
| 120 | def parse_tool_calls(text: str) -> tuple: |
| 121 | """Extract tool_call blocks. Returns (clean_text, tool_calls_list).""" |
| 122 | tool_calls = [] |
| 123 | pattern = r'```tool_call\s*\n(.*?)\n```' |
| 124 | clean_parts = [] |
| 125 | last_end = 0 |
| 126 | for m in re.finditer(pattern, text, re.DOTALL): |
| 127 | clean_parts.append(text[last_end:m.start()]) |
| 128 | last_end = m.end() |
| 129 | try: |
| 130 | data = json.loads(m.group(1).strip()) |
| 131 | tool_calls.append({ |
| 132 | "id": f"call_{uuid.uuid4().hex[:8]}", |
| 133 | "type": "function", |
| 134 | "function": { |
| 135 | "name": data["name"], |
| 136 | "arguments": json.dumps(data.get("arguments", {}), ensure_ascii=False), |
| 137 | }, |
| 138 | }) |
| 139 | except (json.JSONDecodeError, KeyError): |
| 140 | pass |
| 141 | clean_parts.append(text[last_end:]) |
| 142 | clean = "".join(clean_parts).strip() |
| 143 | return clean, tool_calls |
| 144 | |
| 145 | |
| 146 | # ─── Google Native API helpers ───────────────────────────────────────────────── |
no outgoing calls
no test coverage detected