125 lines
4.5 KiB
Python
125 lines
4.5 KiB
Python
from __future__ import annotations
|
|
|
|
from opensquilla.context_budget import (
|
|
ContextBudgetClass,
|
|
ContextBudgetGovernor,
|
|
)
|
|
from opensquilla.engine import AgentConfig, ThinkingLevel
|
|
|
|
|
|
def test_context_budget_governor_derives_large_window_caps() -> None:
|
|
budget = ContextBudgetGovernor.from_values(
|
|
context_window_tokens=200_000,
|
|
max_output_tokens=8_192,
|
|
thinking_budget_tokens=0,
|
|
context_overflow_threshold=0.85,
|
|
).snapshot()
|
|
|
|
assert budget.provider_request_max_chars > 500_000
|
|
assert budget.default_tool_argument_max_chars > 8_000
|
|
assert budget.default_tool_result_provider_max_chars > 96_000
|
|
assert budget.external_tool_result_provider_max_chars < (
|
|
budget.default_tool_result_provider_max_chars
|
|
)
|
|
|
|
|
|
def test_context_budget_governor_keeps_small_windows_guarded() -> None:
|
|
budget = ContextBudgetGovernor.from_values(
|
|
context_window_tokens=8_000,
|
|
max_output_tokens=8_192,
|
|
thinking_budget_tokens=0,
|
|
context_overflow_threshold=0.85,
|
|
).snapshot()
|
|
|
|
assert 4_000 <= budget.provider_request_max_chars <= 32_000
|
|
assert 2_000 <= budget.default_tool_argument_max_chars <= 16_000
|
|
assert budget.default_tool_result_provider_max_chars <= 32_000
|
|
|
|
|
|
def test_context_budget_governor_honors_explicit_overrides() -> None:
|
|
governor = ContextBudgetGovernor.from_values(
|
|
context_window_tokens=200_000,
|
|
max_output_tokens=8_192,
|
|
thinking_budget_tokens=0,
|
|
context_overflow_threshold=0.85,
|
|
provider_request_proof_max_chars=123_456,
|
|
tool_use_argument_provider_request_max_chars=12_345,
|
|
tool_result_provider_request_max_chars=54_321,
|
|
)
|
|
|
|
budget = governor.snapshot()
|
|
|
|
assert budget.provider_request_max_chars == 123_456
|
|
assert governor.tool_argument_chars_for(ContextBudgetClass.LOCAL) == 12_345
|
|
assert governor.tool_result_provider_chars_for(ContextBudgetClass.LOCAL) == 54_321
|
|
|
|
|
|
def test_context_budget_governor_glm_derived_proof_budget_anchor() -> None:
|
|
"""Anchor: the GLM window with the xhigh output reserve derives 339,945."""
|
|
budget = ContextBudgetGovernor.from_values(
|
|
context_window_tokens=202_752,
|
|
max_output_tokens=32_768,
|
|
thinking_budget_tokens=50_000,
|
|
context_overflow_threshold=0.85,
|
|
).snapshot()
|
|
|
|
assert budget.provider_request_max_chars == 339_945
|
|
|
|
|
|
def test_context_budget_governor_explicit_proof_budget_bypasses_glm_ladder() -> None:
|
|
"""An explicit 650k proof budget beats the derived GLM-window ladder."""
|
|
budget = ContextBudgetGovernor.from_values(
|
|
context_window_tokens=202_752,
|
|
max_output_tokens=32_768,
|
|
thinking_budget_tokens=20_000,
|
|
context_overflow_threshold=0.85,
|
|
provider_request_proof_max_chars=650_000,
|
|
).snapshot()
|
|
|
|
assert budget.provider_request_max_chars == 650_000
|
|
# Derived side-effect caps scale from the explicit proof budget.
|
|
assert budget.default_tool_argument_max_chars == 104_000 # 650k * 0.16
|
|
assert budget.external_tool_argument_max_chars == 32_000 # 32k clamp
|
|
assert budget.default_tool_result_provider_max_chars == 160_000 # clamp
|
|
assert budget.external_tool_result_provider_max_chars == 160_000
|
|
|
|
|
|
def test_context_budget_governor_from_agent_config_reads_explicit_proof_budget() -> None:
|
|
"""AgentConfig.provider_request_proof_max_chars reaches the governor bypass."""
|
|
config = AgentConfig(
|
|
context_window_tokens=202_752,
|
|
max_tokens=32_768,
|
|
thinking=ThinkingLevel.HIGH,
|
|
provider_request_proof_max_chars=650_000,
|
|
)
|
|
|
|
assert (
|
|
ContextBudgetGovernor.from_config(config).snapshot().provider_request_max_chars == 650_000
|
|
)
|
|
|
|
derived = AgentConfig(
|
|
context_window_tokens=202_752,
|
|
max_tokens=32_768,
|
|
thinking=ThinkingLevel.HIGH,
|
|
)
|
|
|
|
assert (
|
|
ContextBudgetGovernor.from_config(derived).snapshot().provider_request_max_chars == 441_945
|
|
)
|
|
|
|
|
|
def test_context_budget_governor_external_caps_stay_stricter_than_local() -> None:
|
|
governor = ContextBudgetGovernor.from_values(
|
|
context_window_tokens=200_000,
|
|
max_output_tokens=8_192,
|
|
thinking_budget_tokens=0,
|
|
context_overflow_threshold=0.85,
|
|
)
|
|
|
|
assert governor.tool_argument_chars_for(ContextBudgetClass.EXTERNAL) < (
|
|
governor.tool_argument_chars_for(ContextBudgetClass.LOCAL)
|
|
)
|
|
assert governor.tool_result_provider_chars_for(ContextBudgetClass.EXTERNAL) < (
|
|
governor.tool_result_provider_chars_for(ContextBudgetClass.LOCAL)
|
|
)
|