feat: add scoped model runtime configuration
Build / build (push) Has been cancelled
Docker / build (push) Has been cancelled
Lint / ruff (push) Has been cancelled
Test / pytest (ubuntu-latest, 3.11) (push) Has been cancelled
Test / pytest (ubuntu-latest, 3.12) (push) Has been cancelled
Test / pytest (windows-latest, 3.11) (push) Has been cancelled
Test / pytest (windows-latest, 3.12) (push) Has been cancelled

Introduce provider, model, and invocation contracts with encrypted configuration persistence. Add web runtime fencing, route fallback, recovery middleware, workspace scoping, and comprehensive tests.
This commit is contained in:
m4
2026-08-14 22:03:04 +08:00
parent 3ce5614254
commit 5a581c78a2
97 changed files with 26670 additions and 454 deletions
+103
View File
@@ -0,0 +1,103 @@
from __future__ import annotations
import pytest
from EvoScientist.llm.contracts import EvoRuntimeError
from EvoScientist.llm.user_options import (
model_options_schema_hash,
project_user_options_for_purpose,
validate_user_model_options,
)
def _validate(options):
return validate_user_model_options(
supplied=options,
user_options={
"temperature": {
"type": "number",
"minimum": 0,
"maximum": 2,
"applies_to": ["main_agent"],
},
"top_p": {
"type": "number",
"minimum_exclusive": 0,
"maximum": 1,
"applies_to": ["main_agent"],
},
},
supports_reasoning=True,
reasoning_mode="effort",
allowed_reasoning_efforts=("low", "high"),
default_reasoning_effort="high",
parameter_constraints=({"at_most_one_of": ("temperature", "top_p")},),
)
def test_user_options_validate_canonical_values():
assert _validate({"temperature": 0.4, "reasoning": "high"}) == {
"temperature": 0.4,
"reasoning": "high",
}
def test_purpose_projection_filters_user_options_but_preserves_runtime_parameters():
projected = project_user_options_for_purpose(
values={"temperature": 1, "structured_output": True},
user_options={
"temperature": {
"type": "number",
"applies_to": ["main_agent"],
}
},
purpose="tool_selector",
)
assert projected == {"structured_output": True}
@pytest.mark.parametrize(
"options",
[
{"temperature": 3},
{"top_p": 0},
{"unknown": True},
{"temperature": 0.4, "top_p": 0.8},
],
)
def test_user_options_reject_invalid_or_conflicting_values(options):
with pytest.raises(EvoRuntimeError):
_validate(options)
def test_options_schema_hash_tracks_semantics_not_defaults():
common = {
"model_profile_id": "profile-1",
"supports_reasoning": False,
"reasoning_mode": "none",
"allowed_reasoning_efforts": (),
"parameter_constraints": (),
"adapter_id": "openai-compatible",
"adapter_revision": "3",
}
first = model_options_schema_hash(
**common,
user_options={"temperature": {"type": "number", "maximum": 2, "default": 1}},
)
default_changed = model_options_schema_hash(
**common,
user_options={"temperature": {"type": "number", "maximum": 2, "default": 0}},
)
constraint_changed = model_options_schema_hash(
**common,
user_options={"temperature": {"type": "number", "maximum": 1, "default": 0}},
)
adapter_changed = model_options_schema_hash(
**{**common, "adapter_revision": "4"},
user_options={"temperature": {"type": "number", "maximum": 2, "default": 0}},
)
assert first == default_changed
assert first != constraint_changed
assert first != adapter_changed