From fd56a9e6194ca77d9f8a6271e7675ea06f0cdb57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E7=A8=8B?= Date: Tue, 7 Jul 2026 16:30:58 +0800 Subject: [PATCH] Fix runtime imports and OpenAI protocol param --- runtime/__init__.py | 15 ++++++- .../node/agent/providers/openai_provider.py | 2 + tests/test_openai_provider_protocol.py | 40 +++++++++++++++++++ tests/test_runtime_lazy_imports.py | 19 +++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 tests/test_openai_provider_protocol.py create mode 100644 tests/test_runtime_lazy_imports.py diff --git a/runtime/__init__.py b/runtime/__init__.py index 5f543861eb..9dd3845bbd 100755 --- a/runtime/__init__.py +++ b/runtime/__init__.py @@ -1,3 +1,14 @@ -from runtime.sdk import WorkflowMetaInfo, WorkflowRunResult, run_workflow - __all__ = ["WorkflowMetaInfo", "WorkflowRunResult", "run_workflow"] + + +def __getattr__(name): + if name in __all__: + from runtime.sdk import WorkflowMetaInfo, WorkflowRunResult, run_workflow + + values = { + "WorkflowMetaInfo": WorkflowMetaInfo, + "WorkflowRunResult": WorkflowRunResult, + "run_workflow": run_workflow, + } + return values[name] + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/runtime/node/agent/providers/openai_provider.py b/runtime/node/agent/providers/openai_provider.py index 809f6a00a7..22b5674312 100755 --- a/runtime/node/agent/providers/openai_provider.py +++ b/runtime/node/agent/providers/openai_provider.py @@ -173,6 +173,7 @@ def _build_request_payload( ) -> Dict[str, Any]: """Construct the Responses API payload from event timeline.""" params = dict(raw_params) + params.pop("protocol", None) max_tokens = params.pop("max_tokens", None) max_output_tokens = params.pop("max_output_tokens", None) if max_output_tokens is None and max_tokens is not None: @@ -234,6 +235,7 @@ def _build_chat_payload( ) -> Dict[str, Any]: """Construct standard Chat Completions API payload.""" params = dict(raw_params) + params.pop("protocol", None) max_output_tokens = params.pop("max_output_tokens", None) max_tokens = params.pop("max_tokens", None) if max_tokens is None and max_output_tokens is not None: diff --git a/tests/test_openai_provider_protocol.py b/tests/test_openai_provider_protocol.py new file mode 100644 index 0000000000..8f5e652046 --- /dev/null +++ b/tests/test_openai_provider_protocol.py @@ -0,0 +1,40 @@ +"""Regression tests for OpenAI provider internal protocol routing.""" + +from entity.configs.node.agent import AgentConfig +from entity.messages import Message, MessageRole +from runtime.node.agent.providers.openai_provider import OpenAIProvider + + +def _provider() -> OpenAIProvider: + return OpenAIProvider( + AgentConfig( + path="test.model", + provider="openai", + base_url="", + name="gpt-test", + api_key="test-key", + params={}, + ) + ) + + +def test_responses_payload_does_not_forward_protocol_param(): + payload = _provider()._build_request_payload( + [Message(role=MessageRole.USER, content="hello")], + tool_specs=None, + raw_params={"protocol": "responses", "temperature": 0.2}, + ) + + assert payload["temperature"] == 0.2 + assert "protocol" not in payload + + +def test_chat_payload_does_not_forward_protocol_param(): + payload = _provider()._build_chat_payload( + [Message(role=MessageRole.USER, content="hello")], + tool_specs=None, + raw_params={"protocol": "chat", "temperature": 0.2}, + ) + + assert payload["temperature"] == 0.2 + assert "protocol" not in payload diff --git a/tests/test_runtime_lazy_imports.py b/tests/test_runtime_lazy_imports.py new file mode 100644 index 0000000000..42818be7c6 --- /dev/null +++ b/tests/test_runtime_lazy_imports.py @@ -0,0 +1,19 @@ +"""Regression tests for runtime package import side effects.""" + +import subprocess +import sys + + +def test_check_module_imports_without_runtime_circular_import(): + result = subprocess.run( + [ + sys.executable, + "-c", + "from check.check import load_config; assert callable(load_config)", + ], + check=False, + capture_output=True, + text=True, + ) + + assert result.returncode == 0, result.stderr