HKUDS/nanobot · error · ValueError
model_preset name 'default' is reserved for agents.defaults
Error message
model_preset name 'default' is reserved for agents.defaults
What it means
In Config._validate_model_preset, a model_preset is literally named 'default', which is reserved because agents.defaults implicitly defines the default preset — a user preset with that key would create a name collision. The input at fault is the model_preset key "default" in model_presets.
Solutions
- Rename the preset to something else, e.g. 'my-default'
- Delete the 'default' preset and set its parameters in agents.defaults
- Reference the implicit default via model_preset: "default" or by omitting it
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at nanobot/config/schema.py:469 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of HKUDS/nanobot@42f37dc4c0 (2026-08-26).
Data as JSON: /api/errors/16331ba876a69906.
Report an issue: GitHub.
Appendix: source
Thrown at nanobot/config/schema.py:469
_resolve_tool_config_refs()
super().__init__(**values)
def bind_source_path(self, path: Path) -> None:
"""Record the config file that owns instance-level runtime data."""
self._source_path = path.expanduser().resolve(strict=False)
@property
def runtime_data_dir(self) -> Path | None:
"""Return the active instance data directory when loaded from a config path."""
return self._source_path.parent if self._source_path is not None else None
@model_validator(mode="after")
def _validate_model_preset(self) -> "Config":
# Keep persisted names accepted by previous releases loadable. New
# names are normalized and checked case-insensitively at mutation
# boundaries, where conflicts can be reported without breaking startup.
if "default" in self.model_presets:
raise ValueError("model_preset name 'default' is reserved for agents.defaults")
name = self.agents.defaults.model_preset
if name and name != "default" and name not in self.model_presets:
raise ValueError(f"model_preset {name!r} not found in model_presets")
dream_name = self.agents.defaults.dream.model_override
if dream_name and dream_name != "default" and dream_name not in self.model_presets:
raise ValueError(f"Dream model preset {dream_name!r} not found in model_presets")
for fallback in self.agents.defaults.fallback_models:
if isinstance(fallback, str) and fallback not in self.model_presets:
raise ValueError(f"fallback_models entry {fallback!r} not found in model_presets")
return self
def resolve_default_preset(self) -> ModelPresetConfig:
"""Return the implicit `default` preset from agents.defaults fields."""
d = self.agents.defaults
return ModelPresetConfig(
model=d.model, provider=d.provider, max_tokens=d.max_tokens,
context_window_tokens=d.context_window_tokens,
temperature=d.temperature, reasoning_effort=d.reasoning_effort,View on GitHub (pinned to 42f37dc4c0)