Skip to content

feat(config): add ModelPresetConfig and runtime preset switching#3714

Draft
chengyongru wants to merge 1 commit into
mainfrom
feat/model-presets-core
Draft

feat(config): add ModelPresetConfig and runtime preset switching#3714
chengyongru wants to merge 1 commit into
mainfrom
feat/model-presets-core

Conversation

@chengyongru
Copy link
Copy Markdown
Collaborator

Summary

This PR introduces named model presets and atomic runtime switching, building on the AgentLoop.from_config() refactor from PR #3708.

Changes

  • Schema (nanobot/config/schema.py):

    • Add ModelPresetConfig — a named bundle of model, provider, max_tokens, context_window_tokens, temperature, and reasoning_effort.
    • Add model_presets dict to root Config.
    • Add model_preset field to AgentDefaults.
    • Add resolve_preset() to return effective params from either the active preset or individual defaults.
    • Add @model_validator to reject unknown preset names at load time.
    • Update _match_provider() to use resolved preset model / provider.
  • Provider factory (nanobot/providers/factory.py):

    • Update make_provider() and provider_signature() to use config.resolve_preset().
  • Agent loop (nanobot/agent/loop.py):

    • Add model_presets and model_preset parameters to AgentLoop.
    • Add model_preset property with getter / setter for atomic switching.
    • Update from_config() to inject a runtime default preset (built from config defaults) so users can always switch back.
  • Self tool (nanobot/agent/tools/self.py):

    • Show model_preset in check output.
    • Clear _active_preset when model is set directly.
    • Catch ValueError / KeyError from property setters.
  • CLI (nanobot/cli/commands.py):

    • Display active preset tag alongside model name in serve, agent, and status.

Tests

  • tests/config/test_model_presets.py — schema validation, preset resolution, provider matching
  • tests/agent/test_self_model_preset.py — runtime switching, self-tool integration, default preset injection

Rollback

Revert this commit to remove preset schema fields and restore direct defaults.model usage in from_config().

- Add `ModelPresetConfig` schema for named model presets
- Add `model_presets` dict to `Config` and `model_preset` field to `AgentDefaults`
- Add `resolve_preset()` to return effective model params from preset or defaults
- Add `@model_validator` to reject unknown preset names
- Update `_match_provider()` to use resolved preset model/provider
- Update `make_provider()` and `provider_signature()` to use `resolve_preset()`
- Add `model_preset` property to `AgentLoop` for atomic runtime switching
- Update `AgentLoop.from_config()` to inject a runtime `default` preset
- Wire self-tool to inspect/clear preset state
- Update CLI display strings to show active preset
@chengyongru chengyongru force-pushed the feat/model-presets-core branch from bd7723c to 2e84a9c Compare May 12, 2026 03:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant