refactor(llm_clients): build the client keyword arguments in llm_clients

- build_llm_kwargs(config) replaces the graph's _get_provider_kwargs, with the retry and token coercion beside it
This commit is contained in:
Yijia-Xiao
2026-09-24 05:00:36 +00:00
parent e7354d8af4
commit c9695673bf
6 changed files with 94 additions and 104 deletions
+6 -11
View File
@@ -13,7 +13,7 @@ import importlib
import pytest
import tradingagents.default_config as default_config_module
from tradingagents.graph.trading_graph import TradingAgentsGraph, _coerce_max_tokens
from tradingagents.llm_clients.factory import _coerce_max_tokens, build_llm_kwargs
# --- coercion / validation -------------------------------------------------
@@ -46,15 +46,10 @@ def test_coerce_rejects_non_integers(bad):
# --- forwarding into provider kwargs (right key per provider) --------------
def _bare_graph(config):
g = object.__new__(TradingAgentsGraph)
g.config = config
return g
@pytest.mark.unit
def test_not_forwarded_when_unset():
kwargs = _bare_graph({"llm_provider": "openai", "max_tokens": None})._get_provider_kwargs()
kwargs = build_llm_kwargs({"llm_provider": "openai", "max_tokens": None})
assert "max_tokens" not in kwargs
assert "max_output_tokens" not in kwargs
@@ -62,7 +57,7 @@ def test_not_forwarded_when_unset():
@pytest.mark.unit
@pytest.mark.parametrize("provider", ["openai", "anthropic", "deepseek", "openai_compatible"])
def test_forwarded_as_max_tokens_for_non_google(provider):
kwargs = _bare_graph({"llm_provider": provider, "max_tokens": 8192})._get_provider_kwargs()
kwargs = build_llm_kwargs({"llm_provider": provider, "max_tokens": 8192})
assert kwargs["max_tokens"] == 8192
assert "max_output_tokens" not in kwargs
@@ -70,21 +65,21 @@ def test_forwarded_as_max_tokens_for_non_google(provider):
@pytest.mark.unit
def test_forwarded_as_max_output_tokens_for_google():
# Gemini's kwarg name differs; forwarding plain max_tokens would be rejected.
kwargs = _bare_graph({"llm_provider": "google", "max_tokens": 8192})._get_provider_kwargs()
kwargs = build_llm_kwargs({"llm_provider": "google", "max_tokens": 8192})
assert kwargs["max_output_tokens"] == 8192
assert "max_tokens" not in kwargs
@pytest.mark.unit
def test_env_string_is_coerced():
kwargs = _bare_graph({"llm_provider": "openai", "max_tokens": "4096"})._get_provider_kwargs()
kwargs = build_llm_kwargs({"llm_provider": "openai", "max_tokens": "4096"})
assert kwargs["max_tokens"] == 4096
@pytest.mark.unit
def test_invalid_value_fails_loudly():
with pytest.raises(ValueError):
_bare_graph({"llm_provider": "openai", "max_tokens": 0})._get_provider_kwargs()
build_llm_kwargs({"llm_provider": "openai", "max_tokens": 0})
# --- client-side allowlists carry the kwarg --------------------------------