From 0f7003a2aeb84651230b0fcbcb8403e4ed957af8 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Fri, 6 Nov 2026 19:12:13 -0800 Subject: [PATCH] fix(ollama): keep replayed tool arguments out of a rejected replay's error chain --- litellm/llms/ollama/chat/transformation.py | 6 +++--- .../llms/ollama/test_ollama_chat_transformation.py | 10 +++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/litellm/llms/ollama/chat/transformation.py b/litellm/llms/ollama/chat/transformation.py index ee795d2f49c..1e3e6186dd1 100644 --- a/litellm/llms/ollama/chat/transformation.py +++ b/litellm/llms/ollama/chat/transformation.py @@ -55,18 +55,18 @@ def _to_ollama_tool_call_function(model: str, tool_call: ChatCompletionAssistant name: Final = function.get("name") or "" raw_arguments: Final[object] = function.get("arguments") try: - parsed: Final = ( + parsed: Final[object] = ( parse_tool_call_arguments(raw_arguments, tool_name=name, context="Ollama chat request") if isinstance(raw_arguments, str) or raw_arguments is None else raw_arguments ) arguments: Final = _TOOL_CALL_ARGUMENTS.validate_python({} if parsed is None else parsed) - except ValueError as e: + except ValueError: raise litellm.BadRequestError( message=f"OllamaException - arguments of assistant tool call {tool_call.get('id')!r} are not a JSON object", model=model, llm_provider="ollama_chat", - ) from e + ) from None return OllamaToolCallFunction(name=name, arguments=arguments) diff --git a/tests/unit/llms/ollama/test_ollama_chat_transformation.py b/tests/unit/llms/ollama/test_ollama_chat_transformation.py index acd52987144..36df47deaab 100644 --- a/tests/unit/llms/ollama/test_ollama_chat_transformation.py +++ b/tests/unit/llms/ollama/test_ollama_chat_transformation.py @@ -4,6 +4,7 @@ import itertools import logging import os import sys +import traceback from typing import Final, cast import pytest @@ -1099,10 +1100,12 @@ class TestOllamaToolCallTransformation: @pytest.mark.parametrize( "arguments", - ['{"path": "a.rs"}{"path": "b.rs"}', '["a.rs", "b.rs"]', '[["path", "a.rs"]]'], - ids=["glued", "array", "pairs"], + ['{"path": "a.rs"}{"path": "b.rs"}', '["a.rs", "b.rs"]', '[["path", "a.rs"]]', "[]"], + ids=["glued", "array", "pairs", "empty_array"], ) - def test_replayed_tool_call_arguments_that_are_not_an_object_answer_400(self, arguments: str): + def test_replayed_tool_call_arguments_that_are_not_an_object_answer_400_without_echoing_them( + self, arguments: str + ): with pytest.raises(litellm.BadRequestError) as exc_info: litellm.completion( model="ollama_chat/qwen3:8b", @@ -1112,6 +1115,7 @@ class TestOllamaToolCallTransformation: assert exc_info.value.status_code == 400 assert "call_abc123" in str(exc_info.value) + assert "a.rs" not in "".join(traceback.format_exception(exc_info.value)) class TestOllamaStreamingParallelToolCallIndex: