agent-zero/tests/test_settings_cache.py
Alessandro cc098d3e98
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
Speed up chat restoration and bound embedding warm-up
Reuse Git version metadata within each chat-load operation and pass saved
message token counts into reconstruction. Preserve per-agent settings and
credential reads, initialization hooks, profiles and legacy token behavior.

Give the existing deferred embedding preload up to 10 extra seconds after
chat restoration, within extensible init_a0. Continue startup on timeout or
task failure while allowing unfinished model loading to complete.

Across five trials per version with the same chat workload and a cached
embedding model, median HTTP readiness after the restart command returned
fell from 38.1 to 27.8 seconds: 10.3 seconds saved, or 27% less waiting.
Boot-to-first-token fell from 42.7 to 33.4 seconds. Post-send first-token
latency did not improve in this sample (4.709 to 5.108 seconds).

Validation: 146 focused framework tests passed, followed by 20 preload tests
including seven new edge cases. Real ten-second stalled-loading/inference
checks and offline missing/cached-model checks passed. Five DeferredTask
lifecycle tests passed separately; an existing test-order failure when
combined with preload imports also reproduces without the new cases.

Fresh-install performance was not measured; the full repository suite was
not run.
2026-10-11 19:27:39 +02:00

166 lines
5.9 KiB
Python

import copy
from contextvars import Context, copy_context
import pytest
from helpers import extension, settings
def test_version_cache_scope_nests_and_expires_in_inherited_contexts(monkeypatch):
reads = []
def get_version():
reads.append("fresh")
return "fresh"
monkeypatch.setattr(settings.git, "get_version", get_version)
with settings.version_cache_scope("outer"):
outer_context = copy_context()
with pytest.raises(RuntimeError, match="scope failed"):
with settings.version_cache_scope():
assert settings._get_version() == "outer"
with settings.version_cache_scope("inner"):
assert settings._get_version() == "inner"
inner_context = copy_context()
assert settings._get_version() == "outer"
raise RuntimeError("scope failed")
assert settings._get_version() == "outer"
assert Context().run(settings._get_version) == "fresh"
assert settings._get_version() == "fresh"
assert outer_context.run(settings._get_version) == "fresh"
assert inner_context.run(settings._get_version) == "fresh"
assert inner_context.run(settings._get_version) == "fresh"
assert reads == ["fresh"] * 5
@pytest.mark.parametrize("fail_apply", [False, True])
def test_settings_apply_reuses_only_version_and_restores_scope(monkeypatch, fail_apply):
configured = settings.get_default_settings()
version = "v1"
version_reads = []
sensitive_reads = []
inherited = []
def get_version():
version_reads.append(version)
return version
def load_sensitive(current):
sensitive_reads.append(current)
current["auth_password"] = str(len(sensitive_reads))
def apply(previous, browser_timezone):
nonlocal version
assert previous is configured
assert browser_timezone == "Europe/Rome"
for index in range(3):
current = settings.get_settings()
assert current["version"] == "v1"
assert current["auth_password"] == str(index + 1)
assert version_reads == ["v1"]
version = "v2"
assert Context().run(settings._get_version) == "v2"
assert settings._get_version() == "v1"
inherited.append(copy_context())
if fail_apply:
raise RuntimeError("apply failed")
monkeypatch.setattr(settings.git, "get_version", get_version)
monkeypatch.setattr(settings, "_settings", configured)
monkeypatch.setattr(settings, "_read_settings_file", lambda: configured)
monkeypatch.setattr(settings, "_write_settings_file", lambda current: None)
monkeypatch.setattr(settings, "_load_sensitive_settings", load_sensitive)
monkeypatch.setattr(settings, "_apply_settings", apply)
if fail_apply:
with pytest.raises(RuntimeError, match="apply failed"):
settings.set_settings(configured, browser_timezone="Europe/Rome")
else:
saved = settings.set_settings(configured, browser_timezone="Europe/Rome")
assert saved["version"] == "v2"
assert saved["auth_password"] == "4"
assert settings._get_version() == "v2"
assert inherited[0].run(settings._get_version) == "v2"
version = "v3"
assert settings.set_settings(configured, apply=False)["version"] == "v3"
def test_settings_snapshot_is_limited_to_one_prompt(monkeypatch):
configured = settings.get_default_settings()
configured["api_keys"] = {"provider": "secret"}
versions = iter(["first", "second", "third", "fourth"])
calls = 0
def defaults():
nonlocal calls
calls += 1
result = copy.deepcopy(configured)
result["version"] = next(versions)
return result
monkeypatch.setattr(settings, "_settings", configured)
monkeypatch.setattr(settings, "_read_settings_file", lambda: configured)
monkeypatch.setattr(settings, "get_default_settings", defaults)
monkeypatch.setattr(settings, "_load_sensitive_settings", lambda _value: None)
token = settings.begin_prompt_settings_snapshot()
try:
configured["workdir_show"] = False
first = settings.get_settings_for_prompt()
second = settings.get_settings_for_prompt()
assert calls == 1
assert first == second
assert first["workdir_show"] is True
assert first is not second
assert first["api_keys"] is not second["api_keys"]
first["api_keys"]["provider"] = "masked"
assert settings.get_settings_for_prompt()["api_keys"]["provider"] == "secret"
current = settings.get_settings()
assert current["version"] == "second"
assert current["workdir_show"] is False
assert settings.get_settings_for_prompt()["workdir_show"] is True
reloaded = settings.reload_settings()
assert reloaded["version"] == "third"
assert reloaded["workdir_show"] is False
assert settings.get_settings_for_prompt() == reloaded
finally:
settings.end_prompt_settings_snapshot(token)
refreshed = settings.get_settings()
assert refreshed["workdir_show"] is False
assert refreshed["version"] == "fourth"
assert calls == 4
def test_prompt_snapshot_hooks_are_registered_and_paired():
start = next(
cls
for cls in extension._get_extension_classes( # type: ignore[attr-defined]
"_functions/agent/Agent/prepare_prompt/start"
)
if cls.__name__ == "SnapshotPromptSettings"
)
end = next(
cls
for cls in extension._get_extension_classes( # type: ignore[attr-defined]
"_functions/agent/Agent/prepare_prompt/end"
)
if cls.__name__ == "RestorePromptSettings"
)
previous = settings._prompt_settings_snapshot.get()
data = {}
start(agent=None).execute(data=data)
try:
assert settings._prompt_settings_snapshot.get() is not None
finally:
end(agent=None).execute(data=data)
assert settings._prompt_settings_snapshot.get() is previous