{"record":{"id":"4f65ae632113f097","repo":"HKUDS/nanobot","slug":"model-preset-must-be-a-non-empty-string","errorCode":null,"errorMessage":"model_preset must be a non-empty string","messagePattern":"model_preset must be a non-empty string","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"nanobot/agent/model_presets.py","lineNumber":80,"sourceCode":"        model_preset=name,\n    )\n\n\ndef build_runtime_preset_snapshot(\n    *,\n    name: str,\n    presets: dict[str, ModelPresetConfig],\n    provider: LLMProvider,\n    loader: PresetSnapshotLoader | None,\n) -> ProviderSnapshot:\n    if loader is not None:\n        return replace(loader(name), model_preset=name)\n    return build_static_preset_snapshot(provider, name, presets[name])\n\n\ndef normalize_preset_name(name: str | None, presets: dict[str, ModelPresetConfig]) -> str:\n    if not isinstance(name, str) or not name.strip():\n        raise ValueError(\"model_preset must be a non-empty string\")\n    name = name.strip()\n    if name in presets:\n        return name\n    matches = [candidate for candidate in presets if candidate.casefold() == name.casefold()]\n    if len(matches) == 1:\n        return matches[0]\n    raise KeyError(f\"model_preset {name!r} not found. Available: {', '.join(presets) or '(none)'}\")\n","sourceCodeStart":62,"sourceCodeEnd":88,"githubUrl":"https://github.com/HKUDS/nanobot/blob/42f37dc4c0e409eac7818a82d165c5f2757bc075/nanobot/agent/model_presets.py#L62-L88","documentation":"Raised by normalize_preset_name when the model_preset argument is not a string or is empty/whitespace-only before preset lookup is attempted. It is the input-sanitization gate for every preset selection; a None default, a non-string config value, or an accidental blank in config triggers it.","triggerScenarios":"Thrown at nanobot/agent/model_presets.py:80 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Pass a non-empty string preset name, e.g. \"default\" or a key from the configured model_presets dict","If the preset comes from config, check that model_preset is set and not an empty string in the config file","Omit model_preset entirely if you want the default model instead of a preset"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"42f37dc4c0e409eac7818a82d165c5f2757bc075","analyzedAt":"2026-08-26T00:18:52.276Z","contentChangedAt":"2026-08-26T00:18:52.276Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}