feat(agent): make model presets session-scoped (#4866)

This commit is contained in:
chengyongru
2026-07-23 00:38:49 +08:00
committed by GitHub
parent 66690fdb0c
commit c22efb5f7a
41 changed files with 1140 additions and 155 deletions
+28
View File
@@ -4,6 +4,7 @@ from __future__ import annotations
import time
from pathlib import Path
from types import MappingProxyType
from unittest.mock import MagicMock, patch
import pytest
@@ -11,6 +12,7 @@ from pydantic import BaseModel
from nanobot.agent.tools.context import RequestContext, request_context
from nanobot.agent.tools.self import MyTool
from nanobot.config.schema import ModelPresetConfig
# ---------------------------------------------------------------------------
# Helpers
@@ -1078,6 +1080,32 @@ class TestSecurityAttributeProtection:
result = await tool.execute(action="set", key="web_config.enable", value=False)
assert "read-only" in result
@pytest.mark.asyncio
async def test_modify_model_presets_dotpath_blocked(self):
"""The config-derived model preset catalog is inspectable but not mutable."""
presets = {"fast": {"model": "fast-model"}}
tool = _make_tool(runtime_state=_make_mock_loop(model_presets=presets))
result = await tool.execute(
action="set",
key="model_presets.other",
value={"model": "other-model"},
)
assert "read-only" in result
assert presets == {"fast": {"model": "fast-model"}}
@pytest.mark.asyncio
async def test_inspect_read_only_model_preset_dotpath(self):
presets = MappingProxyType({
"fast": ModelPresetConfig(model="fast-model"),
})
tool = _make_tool(runtime_state=_make_mock_loop(model_presets=presets))
result = await tool.execute(action="check", key="model_presets.fast.model")
assert result == "model_presets.fast.model: 'fast-model'"
# ---------------------------------------------------------------------------
# current iteration count (Fix #2)