Round 16 reviewer consensus extended the round 12c asymmetric-fix: the GGUF agentic loop capped tool_calls to one when the caller opted out, but every other Studio-internal path that emits tool calls from llama-server output skipped the same guard. Mirror the cap in three places that have full ownership of the emitted list (passthrough verbatim paths are out of scope): 1. `AnthropicPassthroughEmitter` now takes `parallel_tool_calls` and silently drops streamed `delta.tool_calls` entries beyond the first index. Wired from `_anthropic_passthrough_stream`. 2. `_anthropic_passthrough_non_streaming` truncates the upstream `message.tool_calls` list before producing `tool_use` blocks. 3. `run_safetensors_tool_loop` truncates the parsed tool_calls list before appending the assistant message and executing tools. `InferenceOrchestrator.generate_chat_completion_with_tools` and the safetensors route now thread `parallel_tool_calls` through. Also harden `_build_passthrough_payload` to strip empty / non-string `stop` entries before forwarding to llama-server, matching the `_normalize_stop_for_provider` shape the external-provider helper already enforces. Test pins the AnthropicPassthroughEmitter serial-tool-call gate. |
||
|---|---|---|
| .. | ||
| backend | ||
| frontend | ||
| src-tauri | ||
| __init__.py | ||
| install_llama_prebuilt.py | ||
| install_python_stack.py | ||
| LICENSE.AGPL-3.0 | ||
| package-lock.json | ||
| package.json | ||
| setup.bat | ||
| setup.ps1 | ||
| setup.sh | ||
| Unsloth_Studio_Colab.ipynb | ||