From e6ccd3b6f52d9e114a67d5936a33b2b43aa7c6a2 Mon Sep 17 00:00:00 2001 From: hzhaoy Date: Wed, 22 Apr 2026 14:31:56 +0800 Subject: [PATCH] fix(cli): avoid eager model initialization for default provider --- src/deep_code_agent/cli.py | 2 +- tests/test_cli.py | 64 +++++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/deep_code_agent/cli.py b/src/deep_code_agent/cli.py index 544bb19..305e075 100644 --- a/src/deep_code_agent/cli.py +++ b/src/deep_code_agent/cli.py @@ -38,7 +38,7 @@ def _initialize_agent(args, codebase_dir: str) -> Any: load_dotenv() model = None - if any([args.model_name, args.api_key, args.base_url]) or args.model_provider: + if any([args.model_name, args.api_key, args.base_url]) or args.model_provider != "openai": model = create_chat_model( model_name=args.model_name, model_provider=args.model_provider, diff --git a/tests/test_cli.py b/tests/test_cli.py index 6b18322..6c5feed 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,11 +1,12 @@ """Tests for CLI argument handling.""" +from types import SimpleNamespace from unittest.mock import patch import pytest from deep_code_agent import __version__ -from deep_code_agent.cli import main +from deep_code_agent.cli import _initialize_agent, main def test_main_prints_version_and_exits(capsys): @@ -17,3 +18,64 @@ def test_main_prints_version_and_exits(capsys): assert exc_info.value.code == 0 captured = capsys.readouterr() assert captured.out.strip() == f"deep-code-agent {__version__}" + + +@patch("dotenv.load_dotenv") +@patch("deep_code_agent.code_agent.create_code_agent") +@patch("deep_code_agent.models.llms.langchain_chat.create_chat_model") +@patch("langgraph.checkpoint.memory.InMemorySaver") +def test_initialize_agent_skips_model_creation_for_default_provider( + mock_checkpointer, + mock_create_chat_model, + mock_create_code_agent, + _mock_load_dotenv, +): + """Default provider should defer model creation to create_code_agent.""" + args = SimpleNamespace( + model_name=None, + model_provider="openai", + api_key=None, + base_url=None, + backend_type="state", + ) + + _initialize_agent(args, "/tmp/project") + + mock_create_chat_model.assert_not_called() + mock_create_code_agent.assert_called_once() + assert mock_create_code_agent.call_args.kwargs["model"] is None + assert mock_create_code_agent.call_args.kwargs["backend_type"] == "state" + assert mock_create_code_agent.call_args.kwargs["checkpointer"] is mock_checkpointer.return_value + + +@patch("dotenv.load_dotenv") +@patch("deep_code_agent.code_agent.create_code_agent") +@patch("deep_code_agent.models.llms.langchain_chat.create_chat_model") +@patch("langgraph.checkpoint.memory.InMemorySaver") +def test_initialize_agent_builds_model_for_explicit_provider( + mock_checkpointer, + mock_create_chat_model, + mock_create_code_agent, + _mock_load_dotenv, +): + """Non-default provider should still trigger explicit model creation.""" + args = SimpleNamespace( + model_name=None, + model_provider="anthropic", + api_key=None, + base_url=None, + backend_type="filesystem", + ) + mock_create_chat_model.return_value = object() + + _initialize_agent(args, "/tmp/project") + + mock_create_chat_model.assert_called_once_with( + model_name=None, + model_provider="anthropic", + api_key=None, + base_url=None, + ) + assert mock_create_code_agent.call_args.kwargs["model"] is mock_create_chat_model.return_value + assert mock_create_code_agent.call_args.kwargs["backend_type"] == "filesystem" + assert mock_create_code_agent.call_args.kwargs["checkpointer"] is mock_checkpointer.return_value