478 lines
16 KiB
Python
478 lines
16 KiB
Python
"""Contract tests for the opt-in non-reasoning compression fast lane."""
|
|
|
|
import time
|
|
from types import SimpleNamespace
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
|
|
def _resolve(config, *, provider="ollama", model="qwen3:8b", requested_model=None):
|
|
from agent.auxiliary_client import resolve_compression_fast_lane
|
|
|
|
with patch(
|
|
"agent.auxiliary_client._get_auxiliary_task_config",
|
|
return_value=config,
|
|
):
|
|
return resolve_compression_fast_lane(
|
|
provider,
|
|
model,
|
|
requested_model=requested_model,
|
|
)
|
|
|
|
|
|
def test_explicit_non_reasoning_compression_route_is_certified_and_bounded():
|
|
lane = _resolve(
|
|
{
|
|
"provider": "ollama",
|
|
"model": "qwen3:8b",
|
|
"reasoning_effort": "none",
|
|
"max_output_tokens": 1400,
|
|
}
|
|
)
|
|
|
|
assert lane.certified_non_reasoning is True
|
|
assert lane.max_tokens == 1400
|
|
assert lane.reasoning_config == {"enabled": False, "effort": "none"}
|
|
|
|
|
|
def test_inherited_auto_or_uncertified_compression_routes_remain_uncapped():
|
|
inherited = _resolve({"provider": "auto", "model": "", "reasoning_effort": "none", "max_output_tokens": 1400})
|
|
unknown = _resolve({"provider": "ollama", "model": "qwen3:8b", "max_output_tokens": 1400})
|
|
reasoning = _resolve(
|
|
{
|
|
"provider": "ollama",
|
|
"model": "qwen3:8b",
|
|
"reasoning_effort": "low",
|
|
"max_output_tokens": 1400,
|
|
}
|
|
)
|
|
|
|
for lane in (inherited, unknown, reasoning):
|
|
assert lane.certified_non_reasoning is False
|
|
assert lane.max_tokens is None
|
|
assert lane.reasoning_config is None
|
|
|
|
|
|
def test_inherited_reasoning_control_is_preserved_without_enabling_a_cap():
|
|
from agent.auxiliary_client import _get_task_extra_body
|
|
|
|
certified = {
|
|
"provider": "ollama",
|
|
"model": "qwen3:8b",
|
|
"reasoning_effort": "none",
|
|
"max_output_tokens": 1400,
|
|
}
|
|
inherited = {
|
|
"provider": "auto",
|
|
"model": "",
|
|
"reasoning_effort": "none",
|
|
"max_output_tokens": 1400,
|
|
}
|
|
|
|
with patch("agent.auxiliary_client._get_auxiliary_task_config", return_value=certified):
|
|
assert _get_task_extra_body("compression")["reasoning"] == {
|
|
"enabled": False,
|
|
}
|
|
with patch("agent.auxiliary_client._get_auxiliary_task_config", return_value=inherited):
|
|
assert _get_task_extra_body("compression")["reasoning"] == {
|
|
"enabled": False,
|
|
}
|
|
|
|
|
|
def test_summary_model_override_is_certified_against_the_effective_model():
|
|
config = {
|
|
"provider": "ollama",
|
|
"model": "qwen3:8b",
|
|
"reasoning_effort": "none",
|
|
"max_output_tokens": 1400,
|
|
}
|
|
|
|
override = _resolve(
|
|
config,
|
|
provider="ollama",
|
|
model="qwen3:14b",
|
|
requested_model="qwen3:14b",
|
|
)
|
|
drifted = _resolve(
|
|
config,
|
|
provider="ollama",
|
|
model="server-selected-model",
|
|
requested_model="qwen3:14b",
|
|
)
|
|
|
|
assert override.max_tokens == 1400
|
|
assert drifted.max_tokens is None
|
|
|
|
|
|
def test_compression_latency_records_delayed_first_provider_chunk():
|
|
from agent.auxiliary_client import _notify_aux_progress, call_llm
|
|
|
|
class _DelayedSemaphore:
|
|
def acquire(self):
|
|
time.sleep(0.01)
|
|
|
|
def release(self):
|
|
pass
|
|
|
|
timings = {}
|
|
|
|
client = MagicMock()
|
|
client.base_url = "http://127.0.0.1:11434/v1"
|
|
|
|
def _chunks():
|
|
time.sleep(0.02)
|
|
yield SimpleNamespace(
|
|
id="chunk-1",
|
|
model="qwen3:8b",
|
|
usage=None,
|
|
choices=[
|
|
SimpleNamespace(
|
|
finish_reason="stop",
|
|
delta=SimpleNamespace(content="summary", tool_calls=None),
|
|
)
|
|
],
|
|
)
|
|
|
|
def _resolve_client(*_args, **_kwargs):
|
|
# Pre-dispatch liveness must not count as provider response progress.
|
|
_notify_aux_progress()
|
|
return client, "qwen3:8b"
|
|
|
|
client.chat.completions.create.side_effect = lambda **_kwargs: _chunks()
|
|
|
|
with (
|
|
patch("agent.auxiliary_client._acquire_sync_aux_semaphore", return_value=_DelayedSemaphore()),
|
|
patch("agent.auxiliary_client._get_cached_client", side_effect=_resolve_client),
|
|
):
|
|
response = call_llm(
|
|
task="compression",
|
|
messages=[{"role": "user", "content": "summary request"}],
|
|
latency_info=timings,
|
|
)
|
|
|
|
assert response.choices[0].message.content == "summary"
|
|
assert timings["queue_wait_ms"] >= 5
|
|
assert timings["provider_dispatch_ms"] >= 0
|
|
assert timings["time_to_first_progress_ms"] >= 15
|
|
assert timings["time_to_first_progress_ms"] >= timings["provider_dispatch_ms"]
|
|
assert timings["summary_generation_ms"] >= timings["time_to_first_progress_ms"]
|
|
|
|
|
|
def test_certified_fast_lane_sends_the_configured_cap_to_its_provider():
|
|
from agent.auxiliary_client import call_llm
|
|
|
|
config = {
|
|
"provider": "ollama",
|
|
"model": "qwen3:8b",
|
|
"reasoning_effort": "none",
|
|
"max_output_tokens": 1400,
|
|
}
|
|
client = MagicMock()
|
|
client.base_url = "http://127.0.0.1:11434/v1"
|
|
response = object()
|
|
client.chat.completions.create.return_value = response
|
|
|
|
with (
|
|
patch("agent.auxiliary_client._get_auxiliary_task_config", return_value=config),
|
|
patch("agent.auxiliary_client._get_cached_client", return_value=(client, "qwen3:8b")),
|
|
patch("agent.auxiliary_client._validate_llm_response", return_value=response),
|
|
):
|
|
assert call_llm(
|
|
task="compression",
|
|
messages=[{"role": "user", "content": "summary request"}],
|
|
) is response
|
|
|
|
request = client.chat.completions.create.call_args.kwargs
|
|
assert request["max_tokens"] == 1400
|
|
assert request["extra_body"]["reasoning"] == {"enabled": False}
|
|
|
|
|
|
def test_uncertified_effective_primary_route_does_not_receive_fast_cap():
|
|
from agent.auxiliary_client import call_llm
|
|
|
|
config = {
|
|
"provider": "ollama",
|
|
"model": "qwen3:8b",
|
|
"reasoning_effort": "none",
|
|
"max_output_tokens": 1400,
|
|
}
|
|
client = MagicMock()
|
|
client.base_url = "http://127.0.0.1:11434/v1"
|
|
response = object()
|
|
client.chat.completions.create.return_value = response
|
|
|
|
with (
|
|
patch("agent.auxiliary_client._get_auxiliary_task_config", return_value=config),
|
|
patch(
|
|
"agent.auxiliary_client._get_cached_client",
|
|
return_value=(client, "server-selected-model"),
|
|
),
|
|
patch("agent.auxiliary_client._validate_llm_response", return_value=response),
|
|
):
|
|
assert call_llm(
|
|
task="compression",
|
|
messages=[{"role": "user", "content": "summary request"}],
|
|
) is response
|
|
|
|
request = client.chat.completions.create.call_args.kwargs
|
|
assert "max_tokens" not in request
|
|
assert "max_completion_tokens" not in request
|
|
assert "reasoning" not in request.get("extra_body", {})
|
|
|
|
|
|
def test_boolean_cap_drift_stays_uncapped_and_preserves_existing_reasoning():
|
|
from agent.auxiliary_client import call_llm
|
|
|
|
config = {
|
|
"provider": "ollama",
|
|
"model": "qwen3:8b",
|
|
"reasoning_effort": "none",
|
|
"max_output_tokens": True,
|
|
}
|
|
client = MagicMock()
|
|
client.base_url = "http://127.0.0.1:11434/v1"
|
|
response = object()
|
|
client.chat.completions.create.return_value = response
|
|
|
|
with (
|
|
patch("agent.auxiliary_client._get_auxiliary_task_config", return_value=config),
|
|
patch(
|
|
"agent.auxiliary_client._get_cached_client",
|
|
return_value=(client, "server-selected-model"),
|
|
),
|
|
patch("agent.auxiliary_client._validate_llm_response", return_value=response),
|
|
):
|
|
assert call_llm(
|
|
task="compression",
|
|
messages=[{"role": "user", "content": "summary request"}],
|
|
) is response
|
|
|
|
request = client.chat.completions.create.call_args.kwargs
|
|
assert "max_tokens" not in request
|
|
assert "max_completion_tokens" not in request
|
|
assert request["extra_body"]["reasoning"] == {"enabled": False}
|
|
|
|
|
|
def test_bedrock_converse_ttfp_waits_for_the_nonstreaming_response():
|
|
from agent.auxiliary_client import BedrockAuxiliaryClient, call_llm
|
|
|
|
config = {
|
|
"provider": "auto",
|
|
"model": "",
|
|
"max_output_tokens": 0,
|
|
}
|
|
client = BedrockAuxiliaryClient("us-east-1", "amazon.nova-lite-v1:0")
|
|
response = SimpleNamespace(
|
|
choices=[
|
|
SimpleNamespace(
|
|
message=SimpleNamespace(content="summary"),
|
|
finish_reason="stop",
|
|
)
|
|
],
|
|
usage=None,
|
|
)
|
|
timings = {}
|
|
|
|
def _delayed_converse(**_kwargs):
|
|
time.sleep(0.02)
|
|
return response
|
|
|
|
with (
|
|
patch("agent.auxiliary_client._get_auxiliary_task_config", return_value=config),
|
|
patch(
|
|
"agent.auxiliary_client._get_cached_client",
|
|
return_value=(client, "amazon.nova-lite-v1:0"),
|
|
),
|
|
patch("agent.bedrock_adapter.call_converse", side_effect=_delayed_converse),
|
|
):
|
|
assert call_llm(
|
|
task="compression",
|
|
messages=[{"role": "user", "content": "summary request"}],
|
|
latency_info=timings,
|
|
) is response
|
|
|
|
assert timings["provider_dispatch_ms"] >= 0
|
|
assert timings["time_to_first_progress_ms"] >= 15
|
|
assert timings["time_to_first_progress_ms"] >= timings["provider_dispatch_ms"]
|
|
|
|
|
|
def test_summary_model_override_cap_uses_the_actual_primary_request():
|
|
from agent.auxiliary_client import call_llm
|
|
|
|
config = {
|
|
"provider": "ollama",
|
|
"model": "qwen3:8b",
|
|
"reasoning_effort": "none",
|
|
"max_output_tokens": 1400,
|
|
}
|
|
client = MagicMock()
|
|
client.base_url = "http://127.0.0.1:11434/v1"
|
|
response = object()
|
|
client.chat.completions.create.return_value = response
|
|
|
|
with (
|
|
patch("agent.auxiliary_client._get_auxiliary_task_config", return_value=config),
|
|
patch("agent.auxiliary_client._get_cached_client", return_value=(client, "qwen3:14b")),
|
|
patch("agent.auxiliary_client._validate_llm_response", return_value=response),
|
|
):
|
|
assert call_llm(
|
|
task="compression",
|
|
model="qwen3:14b",
|
|
messages=[{"role": "user", "content": "summary request"}],
|
|
) is response
|
|
|
|
request = client.chat.completions.create.call_args.kwargs
|
|
assert request["model"] == "qwen3:14b"
|
|
assert request["max_tokens"] == 1400
|
|
|
|
|
|
def test_fallback_cap_requires_independent_route_certification():
|
|
from agent.auxiliary_client import _call_fallback_candidate_sync
|
|
|
|
response = object()
|
|
|
|
def _request_for(entry):
|
|
config = {
|
|
"fallback_chain": [entry],
|
|
"provider": "ollama",
|
|
"model": "qwen3:8b",
|
|
"reasoning_effort": "none",
|
|
"max_output_tokens": 1400,
|
|
}
|
|
client = MagicMock()
|
|
client.base_url = "http://127.0.0.1:11434/v1"
|
|
client.chat.completions.create.return_value = response
|
|
with (
|
|
patch("agent.auxiliary_client._get_auxiliary_task_config", return_value=config),
|
|
patch("agent.auxiliary_client._validate_llm_response", return_value=response),
|
|
):
|
|
assert _call_fallback_candidate_sync(
|
|
client,
|
|
"qwen3:14b",
|
|
"fallback_chain[0](ollama)",
|
|
task="compression",
|
|
messages=[{"role": "user", "content": "summary request"}],
|
|
temperature=None,
|
|
max_tokens=None,
|
|
tools=None,
|
|
effective_timeout=300,
|
|
effective_extra_body={"reasoning": {"enabled": False, "effort": "none"}},
|
|
reasoning_config=None,
|
|
) is response
|
|
return client.chat.completions.create.call_args.kwargs
|
|
|
|
uncertified = _request_for({"provider": "ollama", "model": "qwen3:14b"})
|
|
certified = _request_for(
|
|
{
|
|
"provider": "ollama",
|
|
"model": "qwen3:14b",
|
|
"reasoning_effort": "none",
|
|
"max_output_tokens": 900,
|
|
}
|
|
)
|
|
|
|
assert "max_tokens" not in uncertified
|
|
assert "max_completion_tokens" not in uncertified
|
|
assert "reasoning" not in uncertified.get("extra_body", {})
|
|
assert certified["max_tokens"] == 900
|
|
assert certified["extra_body"]["reasoning"] == {
|
|
"enabled": False,
|
|
"effort": "none",
|
|
}
|
|
|
|
|
|
def test_reasoning_effort_aliases_certify_like_none():
|
|
"""Every spelling parse_reasoning_effort treats as disabled must certify.
|
|
|
|
_get_task_extra_body uses parse_reasoning_effort to disable reasoning for
|
|
"false"/"disabled"/YAML False exactly like "none"; the certification
|
|
predicate must agree or those users silently lose the fast lane.
|
|
"""
|
|
base = {"provider": "ollama", "model": "qwen3:8b", "max_output_tokens": 1400}
|
|
|
|
for alias in ("none", "false", "disabled", False):
|
|
lane = _resolve({**base, "reasoning_effort": alias})
|
|
assert lane.certified_non_reasoning is True, alias
|
|
assert lane.max_tokens == 1400, alias
|
|
|
|
# Empty/unset (provider default) and real efforts must NOT certify.
|
|
for not_disabled in ("", None, "low", "high", True):
|
|
lane = _resolve({**base, "reasoning_effort": not_disabled})
|
|
assert lane.certified_non_reasoning is False, not_disabled
|
|
assert lane.max_tokens is None, not_disabled
|
|
|
|
|
|
def test_timing_hooks_propagate_to_protected_call_worker_thread():
|
|
"""The protected daemon path must carry the timing hooks across threads.
|
|
|
|
_run_protected_sync_provider_call runs the provider callback on a daemon
|
|
worker. The dispatch/provider-response hooks are threading.local, so
|
|
without explicit propagation provider_dispatch_ms and
|
|
time_to_first_progress_ms silently vanish whenever compression takes the
|
|
protected path (the common case: aux_interrupt_protection + hard-cancel
|
|
source both active).
|
|
"""
|
|
from agent.auxiliary_client import (
|
|
_aux_timing_hook,
|
|
_aux_dispatch,
|
|
_aux_provider_response,
|
|
_notify_aux_dispatch,
|
|
_notify_aux_provider_response,
|
|
_run_protected_sync_provider_call,
|
|
aux_interrupt_protection,
|
|
)
|
|
|
|
seen = []
|
|
|
|
def _callback(_kwargs):
|
|
# Runs on the daemon worker thread — both notifies must reach the
|
|
# hooks installed on the owner thread.
|
|
_notify_aux_dispatch()
|
|
_notify_aux_provider_response()
|
|
return "ok"
|
|
|
|
with (
|
|
_aux_timing_hook(_aux_dispatch, lambda: seen.append("dispatch")),
|
|
_aux_timing_hook(_aux_provider_response, lambda: seen.append("response")),
|
|
aux_interrupt_protection(cancel_check=lambda: False),
|
|
):
|
|
result = _run_protected_sync_provider_call(_callback, {})
|
|
|
|
assert result == "ok"
|
|
assert "dispatch" in seen
|
|
assert "response" in seen
|
|
|
|
|
|
def test_explicit_caller_max_tokens_keeps_provider_quirk_handling():
|
|
"""An explicit caller cap must NOT be force-injected as a wire param.
|
|
|
|
_build_call_kwargs deliberately omits max_tokens for most
|
|
OpenAI-compatible providers (ZAI vision 400s on it; GPT-5/Copilot need
|
|
max_completion_tokens). Only a cap the certified lane itself produced may
|
|
bypass that handling. Before this guard, a caller-passed max_tokens on
|
|
the compression task flowed through _compression_fast_lane_controls as a
|
|
passthrough and was misread as a lane cap — forcing the param onto
|
|
providers where the omission was intentional (pre-fast-lane behavior).
|
|
"""
|
|
from agent.auxiliary_client import call_llm
|
|
|
|
config = {"provider": "auto", "model": "", "max_output_tokens": 0}
|
|
client = MagicMock()
|
|
client.base_url = "http://127.0.0.1:11434/v1"
|
|
response = object()
|
|
client.chat.completions.create.return_value = response
|
|
|
|
with (
|
|
patch("agent.auxiliary_client._get_auxiliary_task_config", return_value=config),
|
|
patch("agent.auxiliary_client._get_cached_client", return_value=(client, "qwen3:8b")),
|
|
patch("agent.auxiliary_client._validate_llm_response", return_value=response),
|
|
):
|
|
assert call_llm(
|
|
task="compression",
|
|
messages=[{"role": "user", "content": "summary request"}],
|
|
max_tokens=1500,
|
|
) is response
|
|
|
|
request = client.chat.completions.create.call_args.kwargs
|
|
assert "max_tokens" not in request
|
|
assert "max_completion_tokens" not in request
|