diff --git a/packages/langchain-agents/src/launchdarkly_ai_langchain_agents/handler.py b/packages/langchain-agents/src/launchdarkly_ai_langchain_agents/handler.py index bc72beb3..2bbcecf7 100644 --- a/packages/langchain-agents/src/launchdarkly_ai_langchain_agents/handler.py +++ b/packages/langchain-agents/src/launchdarkly_ai_langchain_agents/handler.py @@ -174,9 +174,8 @@ def _model_constructor_kwargs( ) -> dict[str, Any]: raw = (config.get("model") or {}).get("parameters") parameters = dict(raw) if isinstance(raw, dict) else {} - provider = str((config.get("provider") or {}).get("name") or "").lower() - if provider == "bedrock": - parameters.pop("tools", None) + # Tools are bound from config["tools"]. A tools key here is forwarded raw and rejected. + parameters.pop("tools", None) parameters["model"] = _resolved_model_name(config, fallback_name) return parameters @@ -191,7 +190,7 @@ def _make_default_chat_model(config: AiConfigRep) -> Any: Instantiate the appropriate LangChain chat model based on ``config.provider.name``. Falls back to ``ChatOpenAI`` when the provider is not recognised. Requires the matching ``langchain-`` integration package to be installed. - ``model.parameters`` are passed through unchanged. + ``model.parameters`` are passed through, except ``tools``, which is bound separately. """ import importlib diff --git a/packages/langchain-agents/src/launchdarkly_ai_langchain_agents/native_graph.py b/packages/langchain-agents/src/launchdarkly_ai_langchain_agents/native_graph.py index b0635866..74addbde 100644 --- a/packages/langchain-agents/src/launchdarkly_ai_langchain_agents/native_graph.py +++ b/packages/langchain-agents/src/launchdarkly_ai_langchain_agents/native_graph.py @@ -203,6 +203,8 @@ async def _traverse_node(node: GraphNode) -> None: model_cfg = node.config.get("model") or {} raw = model_cfg.get("parameters") kwargs = dict(raw) if isinstance(raw, dict) else {} + # Tools are bound from the node config. A tools key here is forwarded raw and rejected. + kwargs.pop("tools", None) kwargs["model"] = model_cfg.get("name") or "gpt-4o" chat_model = lc_openai.ChatOpenAI(**kwargs) diff --git a/packages/langchain-agents/tests/test_handler.py b/packages/langchain-agents/tests/test_handler.py index 1861a1ed..69a34c94 100644 --- a/packages/langchain-agents/tests/test_handler.py +++ b/packages/langchain-agents/tests/test_handler.py @@ -2223,7 +2223,6 @@ async def test_default_openai_constructor_receives_parameters(self) -> None: assert ctor.call_args.kwargs == { "temperature": 0.2, "max_tokens": 512, - "tools": [{"name": "openai-tool"}], "model": "gpt-4o", } diff --git a/packages/langchain-agents/tests/test_native_graph.py b/packages/langchain-agents/tests/test_native_graph.py index 53457ddc..1b9ef9bf 100644 --- a/packages/langchain-agents/tests/test_native_graph.py +++ b/packages/langchain-agents/tests/test_native_graph.py @@ -302,7 +302,11 @@ async def test_default_chat_openai_receives_model_parameters(self) -> None: "config": { "model": { "name": "gpt-4o", - "parameters": {"temperature": 0.2, "max_tokens": 512}, + "parameters": { + "temperature": 0.2, + "max_tokens": 512, + "tools": [{"name": "openai-tool"}], + }, }, "instructions": "help", }, diff --git a/packages/langchain-messages/src/launchdarkly_ai_langchain_messages/handler.py b/packages/langchain-messages/src/launchdarkly_ai_langchain_messages/handler.py index b30e8b80..0ddd6663 100644 --- a/packages/langchain-messages/src/launchdarkly_ai_langchain_messages/handler.py +++ b/packages/langchain-messages/src/launchdarkly_ai_langchain_messages/handler.py @@ -230,9 +230,8 @@ def _model_constructor_kwargs( ) -> dict[str, Any]: raw = (config.get("model") or {}).get("parameters") parameters = dict(raw) if isinstance(raw, dict) else {} - provider = str((config.get("provider") or {}).get("name") or "").lower() - if provider == "bedrock": - parameters.pop("tools", None) + # Tools are bound from config["tools"]. A tools key here is forwarded raw and rejected. + parameters.pop("tools", None) # Name from the config always wins over a colliding ``model`` key in the parameter bag. parameters["model"] = _resolved_model_name(config, fallback_name) return parameters @@ -248,7 +247,7 @@ def _make_default_chat_model(config: AiConfigRep, importlib: Any) -> Any: Instantiate the appropriate LangChain chat model based on ``config.provider.name``. Falls back to ``ChatOpenAI`` when the provider is not recognised. Requires the matching ``langchain-`` integration package to be installed. - ``model.parameters`` are passed through unchanged. + ``model.parameters`` are passed through, except ``tools``, which is bound separately. """ provider = config.get("provider", {}).get("name", "openai").lower() if provider == "anthropic": diff --git a/packages/langchain-messages/tests/test_handler.py b/packages/langchain-messages/tests/test_handler.py index d00e43fe..f23e4cd5 100644 --- a/packages/langchain-messages/tests/test_handler.py +++ b/packages/langchain-messages/tests/test_handler.py @@ -2381,7 +2381,6 @@ async def test_default_openai_constructor_receives_parameters(self) -> None: assert ctor.call_args.kwargs == { "temperature": 0.2, "max_tokens": 512, - "tools": [{"name": "openai-tool"}], "model": "gpt-4o", }