SysOps: voice-agy-webbuilder-backup — 2026-06-23 10:04 UTC
This commit is contained in:
@@ -381,3 +381,118 @@ def update_permission(module_key: str, body: PermissionBody) -> dict[str, Any]:
|
||||
def grant_all_permissions() -> dict[str, Any]:
|
||||
n = agent_souls.grant_all_permissions()
|
||||
return {"ok": True, "granted_count": n, "message": f"Herman heeft nu {n} module-rechten"}
|
||||
|
||||
|
||||
# ── LLM providers ──────────────────────────────────────────────────────────
|
||||
|
||||
from app.services import llm_router
|
||||
|
||||
|
||||
class LlmProviderBody(BaseModel):
|
||||
label: str = Field(..., max_length=128)
|
||||
provider_type: str = Field(default="deepseek", max_length=48)
|
||||
api_base_url: Optional[str] = None
|
||||
api_key: Optional[str] = None
|
||||
model: str = Field(default="deepseek-chat", max_length=128)
|
||||
is_active: bool = True
|
||||
is_default: bool = False
|
||||
extra_config: dict[str, Any] = Field(default_factory=dict)
|
||||
|
||||
|
||||
@settings_router.get("/llm/presets")
|
||||
def llm_presets() -> dict[str, Any]:
|
||||
return {"presets": llm_router.list_presets()}
|
||||
|
||||
|
||||
@settings_router.get("/llm")
|
||||
def llm_list() -> dict[str, Any]:
|
||||
items = llm_router.list_providers()
|
||||
default = next((i for i in items if i.get("is_default")), items[0] if items else None)
|
||||
return {"providers": items, "default": default, "presets": llm_router.list_presets()}
|
||||
|
||||
|
||||
@settings_router.post("/llm")
|
||||
def llm_create(body: LlmProviderBody) -> dict[str, Any]:
|
||||
preset = llm_router.LLM_PRESETS.get(body.provider_type, {})
|
||||
base_url = (body.api_base_url or preset.get("api_base_url") or "").strip() or None
|
||||
model = body.model or (preset.get("models") or ["deepseek-chat"])[0]
|
||||
if body.is_default:
|
||||
execute("UPDATE llm_providers SET is_default = FALSE, updated_at = NOW()")
|
||||
row = fetch_one(
|
||||
"""INSERT INTO llm_providers (
|
||||
label, provider_type, api_base_url, api_key, model,
|
||||
is_active, is_default, extra_config, updated_at
|
||||
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s::jsonb, NOW())
|
||||
RETURNING *""",
|
||||
(
|
||||
body.label,
|
||||
body.provider_type,
|
||||
base_url,
|
||||
body.api_key or "",
|
||||
model,
|
||||
body.is_active,
|
||||
body.is_default,
|
||||
json.dumps(body.extra_config or {}),
|
||||
),
|
||||
)
|
||||
return {"provider": llm_router._mask_provider(row)}
|
||||
|
||||
|
||||
@settings_router.put("/llm/{provider_id}")
|
||||
def llm_update(provider_id: int, body: LlmProviderBody) -> dict[str, Any]:
|
||||
existing = fetch_one("SELECT * FROM llm_providers WHERE id = %s", (provider_id,))
|
||||
if not existing:
|
||||
raise HTTPException(404, "Provider niet gevonden")
|
||||
preset = llm_router.LLM_PRESETS.get(body.provider_type, {})
|
||||
base_url = (body.api_base_url or preset.get("api_base_url") or existing.get("api_base_url") or "").strip() or None
|
||||
api_key = body.api_key if body.api_key else existing.get("api_key") or ""
|
||||
if body.is_default:
|
||||
execute("UPDATE llm_providers SET is_default = FALSE, updated_at = NOW()")
|
||||
row = fetch_one(
|
||||
"""UPDATE llm_providers SET
|
||||
label = %s, provider_type = %s, api_base_url = %s, api_key = %s, model = %s,
|
||||
is_active = %s, is_default = %s, extra_config = %s::jsonb, updated_at = NOW()
|
||||
WHERE id = %s RETURNING *""",
|
||||
(
|
||||
body.label,
|
||||
body.provider_type,
|
||||
base_url,
|
||||
api_key,
|
||||
body.model,
|
||||
body.is_active,
|
||||
body.is_default,
|
||||
json.dumps(body.extra_config or {}),
|
||||
provider_id,
|
||||
),
|
||||
)
|
||||
return {"provider": llm_router._mask_provider(row)}
|
||||
|
||||
|
||||
@settings_router.delete("/llm/{provider_id}")
|
||||
def llm_delete(provider_id: int) -> dict[str, Any]:
|
||||
row = fetch_one("SELECT is_default FROM llm_providers WHERE id = %s", (provider_id,))
|
||||
if not row:
|
||||
raise HTTPException(404, "Provider niet gevonden")
|
||||
execute("DELETE FROM llm_providers WHERE id = %s", (provider_id,))
|
||||
if row.get("is_default"):
|
||||
execute(
|
||||
"""UPDATE llm_providers SET is_default = TRUE, updated_at = NOW()
|
||||
WHERE id = (SELECT id FROM llm_providers ORDER BY id LIMIT 1)"""
|
||||
)
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
@settings_router.post("/llm/{provider_id}/activate")
|
||||
def llm_activate(provider_id: int) -> dict[str, Any]:
|
||||
llm_router.set_default(provider_id)
|
||||
row = fetch_one("SELECT * FROM llm_providers WHERE id = %s", (provider_id,))
|
||||
return {"ok": True, "provider": llm_router._mask_provider(row)}
|
||||
|
||||
|
||||
@settings_router.post("/llm/{provider_id}/test")
|
||||
async def llm_test(provider_id: int) -> dict[str, Any]:
|
||||
ok, msg = await llm_router.test_provider(provider_id)
|
||||
if not ok:
|
||||
raise HTTPException(502, msg)
|
||||
return {"ok": True, "message": msg}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user