Files
Aether/tests/services/test_upstream_stream_policy.py
T
fawney19 97d42703da feat(codex): 拆分openai:compact为独立端点,简化Codex请求为透传模式
- 新增openai:compact端点类型(EndpointKind.COMPACT),独立于openai:cli
- OpenAICompactAdapter继承OpenAICliAdapter,自动标记compact模式
- Codex请求补丁改为纯透传:仅清理内部标记,不再修改客户端payload
- stream_policy支持openai:compact独立策略,compact端点移除stream字段
- candidate_builder支持compact回退到cli端点
- auth_type: vertex_ai重命名为service_account,保持向后兼容
- Vertex Provider新增api_formats与auth_type组合校验
- KeyAllowedModels对话框改为从Provider获取模型,展示provider_model_name
- Dialog内Select组件自动禁用Portal,修复层级遮挡问题
- 新增Codex compact端点回填迁移脚本
2026-03-01 23:55:26 +08:00

118 lines
3.6 KiB
Python

from __future__ import annotations
from dataclasses import dataclass
from types import SimpleNamespace
from src.services.provider.adapters.codex.context import (
CodexRequestContext,
set_codex_request_context,
)
from src.services.provider.stream_policy import (
UpstreamStreamPolicy,
enforce_stream_mode_for_upstream,
get_upstream_stream_policy,
)
@dataclass
class _DummyEndpoint:
api_format: str
config: dict | None = None
provider: object | None = None
def test_get_upstream_stream_policy_defaults_to_auto() -> None:
ep = _DummyEndpoint(
api_format="openai:chat", config=None, provider=SimpleNamespace(provider_type="custom")
)
assert get_upstream_stream_policy(ep) == UpstreamStreamPolicy.AUTO
def test_get_upstream_stream_policy_codex_openai_cli_forces_stream() -> None:
ep = _DummyEndpoint(
api_format="openai:cli",
config=None,
provider=SimpleNamespace(provider_type="codex"),
)
assert get_upstream_stream_policy(ep) == UpstreamStreamPolicy.FORCE_STREAM
def test_get_upstream_stream_policy_codex_ignores_force_non_stream_config() -> None:
ep = _DummyEndpoint(
api_format="openai:cli",
config={"upstream_stream_policy": "force_non_stream"},
provider=SimpleNamespace(provider_type="codex"),
)
assert get_upstream_stream_policy(ep) == UpstreamStreamPolicy.FORCE_STREAM
def test_get_upstream_stream_policy_codex_compact_forces_non_stream() -> None:
ep = _DummyEndpoint(
api_format="openai:cli",
config=None,
provider=SimpleNamespace(provider_type="codex"),
)
try:
set_codex_request_context(CodexRequestContext(is_compact=True))
assert get_upstream_stream_policy(ep) == UpstreamStreamPolicy.FORCE_NON_STREAM
finally:
set_codex_request_context(None)
def test_get_upstream_stream_policy_codex_openai_compact_defaults_to_auto() -> None:
ep = _DummyEndpoint(
api_format="openai:compact",
config=None,
provider=SimpleNamespace(provider_type="codex"),
)
assert get_upstream_stream_policy(ep) == UpstreamStreamPolicy.AUTO
def test_enforce_stream_mode_for_upstream_openai_chat_sets_stream_options_usage() -> None:
body = {"stream": False}
out = enforce_stream_mode_for_upstream(
body,
provider_api_format="openai:chat",
upstream_is_stream=True,
)
assert out["stream"] is True
assert out["stream_options"]["include_usage"] is True
def test_enforce_stream_mode_for_upstream_gemini_drops_stream_field() -> None:
body = {"stream": True, "foo": "bar"}
out = enforce_stream_mode_for_upstream(
body,
provider_api_format="gemini:chat",
upstream_is_stream=False,
)
assert "stream" not in out
assert out["foo"] == "bar"
def test_enforce_stream_mode_for_upstream_openai_compact_drops_stream_field() -> None:
body = {"stream": True, "foo": "bar"}
out = enforce_stream_mode_for_upstream(
body,
provider_api_format="openai:compact",
upstream_is_stream=True,
)
assert "stream" not in out
assert out["foo"] == "bar"
def test_enforce_stream_mode_for_upstream_codex_compact_keeps_stream_absent() -> None:
body = {"stream": True, "foo": "bar"}
try:
set_codex_request_context(CodexRequestContext(is_compact=True))
out = enforce_stream_mode_for_upstream(
body,
provider_api_format="openai:cli",
upstream_is_stream=False,
)
finally:
set_codex_request_context(None)
assert "stream" not in out
assert out["foo"] == "bar"