Drive the tool-call loop. If response_format is provided it is applied to every request. Returns (all_tool_calls, final_messages, final_content).
(
url, messages, tools, mock_tool_responses, stream, response_format=None,
max_turns=6,
)
| 179 | |
| 180 | |
| 181 | def run_tool_loop( |
| 182 | url, messages, tools, mock_tool_responses, stream, response_format=None, |
| 183 | max_turns=6, |
| 184 | ): |
| 185 | """ |
| 186 | Drive the tool-call loop. If response_format is provided it is applied to |
| 187 | every request. Returns (all_tool_calls, final_messages, final_content). |
| 188 | """ |
| 189 | msgs = list(messages) |
| 190 | all_tool_calls: list[dict] = [] |
| 191 | |
| 192 | for _ in range(max_turns): |
| 193 | result = chat_completion( |
| 194 | url, msgs, tools=tools, response_format=response_format, stream=stream |
| 195 | ) |
| 196 | if result is None: |
| 197 | return all_tool_calls, msgs, None |
| 198 | |
| 199 | tcs = result.get("tool_calls") or [] |
| 200 | content = result.get("content") or "" |
| 201 | |
| 202 | if not tcs: |
| 203 | if content: |
| 204 | _print(f"\n{DIM}{'·' * 60}{RESET}") |
| 205 | return all_tool_calls, msgs, content |
| 206 | |
| 207 | all_tool_calls.extend(tcs) |
| 208 | |
| 209 | assistant_msg: dict = { |
| 210 | "role": "assistant", |
| 211 | "content": content, |
| 212 | "tool_calls": tcs, |
| 213 | } |
| 214 | reasoning = result.get("reasoning_content") |
| 215 | if reasoning: |
| 216 | assistant_msg["reasoning_content"] = reasoning |
| 217 | msgs.append(assistant_msg) |
| 218 | |
| 219 | for tc in tcs: |
| 220 | tool_name = tc["function"]["name"] |
| 221 | try: |
| 222 | args = json.loads(tc["function"]["arguments"]) |
| 223 | except json.JSONDecodeError: |
| 224 | args = {} |
| 225 | |
| 226 | print_tool_call(tool_name, args) |
| 227 | |
| 228 | mock_fn = mock_tool_responses.get(tool_name) if mock_tool_responses else None |
| 229 | if mock_fn: |
| 230 | tool_result = mock_fn(args) |
| 231 | else: |
| 232 | tool_result = json.dumps({"error": f"Unknown tool: {tool_name}"}) |
| 233 | |
| 234 | print_tool_result(tool_result) |
| 235 | |
| 236 | msgs.append( |
| 237 | { |
| 238 | "role": "tool", |
no test coverage detected