From 99494283dad26e4f217c48697f927d77fceb6536 Mon Sep 17 00:00:00 2001 From: Yufeng He <40085740+he-yufeng@users.noreply.github.com> Date: Wed, 3 Jun 2026 19:14:30 +0800 Subject: [PATCH] fix(cli): serialize LiteLlm graph models safely --- src/google/adk/cli/utils/graph_serialization.py | 5 +++++ .../cli/utils/test_graph_serialization.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/google/adk/cli/utils/graph_serialization.py b/src/google/adk/cli/utils/graph_serialization.py index d400c395dd..baf98ff695 100644 --- a/src/google/adk/cli/utils/graph_serialization.py +++ b/src/google/adk/cli/utils/graph_serialization.py @@ -22,6 +22,7 @@ logger = logging.getLogger("google_adk." + __name__) from ...agents.base_agent import BaseAgent +from ...models.base_llm import BaseLlm from ...tools.base_toolset import BaseToolset # Node type mapping for cleaner lookup @@ -227,6 +228,10 @@ def serialize_agent(agent: BaseAgent) -> dict[str, Any]: # Handle nested agents if isinstance(value, BaseAgent): agent_dict[field_name] = serialize_agent(value) + elif isinstance(value, BaseLlm): + agent_dict[field_name] = value.model_dump( + mode="python", exclude={"llm_client"}, exclude_none=True + ) # Handle simple types and collections elif isinstance(value, (str, int, float, bool, list, dict)): agent_dict[field_name] = value diff --git a/tests/unittests/cli/utils/test_graph_serialization.py b/tests/unittests/cli/utils/test_graph_serialization.py index ba8e828841..08d4345857 100644 --- a/tests/unittests/cli/utils/test_graph_serialization.py +++ b/tests/unittests/cli/utils/test_graph_serialization.py @@ -14,7 +14,11 @@ """Tests for graph_serialization edge handling with routing maps.""" +import json + +from google.adk.agents import LlmAgent from google.adk.cli.utils.graph_serialization import serialize_agent +from google.adk.models.lite_llm import LiteLlm from google.adk.tools.base_toolset import BaseToolset from google.adk.workflow import START from google.adk.workflow import Workflow @@ -126,3 +130,15 @@ def __init__(self): assert len(result['tools']) == 1 assert result['tools'][0]['name'] == 'MockToolset' assert result['tools'][0]['type'] == 'tool' + + +def test_serialize_agent_with_litellm_model_is_json_safe() -> None: + agent = LlmAgent( + name='repro', + model=LiteLlm(model='ollama_chat/llama3'), + ) + + result = serialize_agent(agent) + + assert result['model'] == {'model': 'ollama_chat/llama3'} + json.dumps(result)