Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions runtime/__init__.py
Original file line number Diff line number Diff line change
@@ -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}")
2 changes: 2 additions & 0 deletions runtime/node/agent/providers/openai_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down
40 changes: 40 additions & 0 deletions tests/test_openai_provider_protocol.py
Original file line number Diff line number Diff line change
@@ -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
19 changes: 19 additions & 0 deletions tests/test_runtime_lazy_imports.py
Original file line number Diff line number Diff line change
@@ -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