agent-zero/plugins/_model_config/api/model_presets.py
Alessandro fe2310aa90 Add project-scoped LLM presets
Add LLM preset selection to project create/edit flows, backed by _model_config scoped project config. Support global, project, and combined preset APIs with explicit metadata while preserving plain YAML preset files. Copy selected preset chat/utility settings into project-scoped config, keep embedding settings from the effective config, and document/test the new project model config paths.
2026-04-21 18:18:59 +02:00

67 lines
2.7 KiB
Python

from helpers.api import ApiHandler, Request, Response
from plugins._model_config.helpers import model_config
class ModelPresets(ApiHandler):
async def process(self, input: dict, request: Request) -> dict | Response:
action = input.get("action", "get")
project_name = str(input.get("project_name") or "").strip()
scope = str(input.get("scope") or "").strip()
if action == "get":
if scope == "project":
presets = model_config.get_project_presets(project_name) if project_name else []
return {"ok": True, "presets": presets}
if scope == "combined" or project_name:
return {
"ok": True,
"presets": model_config.get_combined_presets(project_name or None),
"global_presets": model_config.get_presets(),
"project_presets": (
model_config.get_project_presets(project_name)
if project_name
else []
),
}
presets = model_config.get_presets()
return {"ok": True, "presets": presets}
elif action == "save":
presets = input.get("presets")
if not isinstance(presets, list):
return Response(status=400, response="presets must be an array")
model_config.save_presets(
presets,
project_name=project_name if scope == "project" or project_name else None,
)
return {"ok": True, "presets": model_config.clean_presets_for_file(presets)}
elif action == "reset":
presets = model_config.reset_presets(
project_name=project_name if scope == "project" or project_name else None
)
return {"ok": True, "presets": presets}
elif action == "resolve":
name = str(input.get("name") or "").strip()
if not name:
return Response(status=400, response="Missing preset name")
resolved = model_config.resolve_preset(
name,
scope=scope or "global",
project_name=project_name or None,
)
if not resolved:
return Response(status=404, response=f"Preset '{name}' not found")
return {
"ok": True,
"preset": {
**resolved,
"scope": scope or "global",
"project_name": project_name if scope == "project" else "",
},
}
return Response(status=400, response=f"Unknown action: {action}")