from fastapi import APIRouter, Depends from pydantic import BaseModel from sqlalchemy.orm import Session from app.admin.services import AdminService from app.config import get_settings as get_app_settings from app.db import SecretORM, get_session from app.llm.ollama_client import OllamaClient from app.models import AutomationRecord, MemoryRecord, OllamaStatus, RuntimeSettings, TelegramStatus, UserProfileRecord, UserRecord router = APIRouter(prefix="/admin", tags=["admin"]) class SecretPayload(BaseModel): key: str value: str def get_admin_service(session: Session = Depends(get_session)) -> AdminService: return AdminService(session) @router.get("/dashboard") def get_dashboard(service: AdminService = Depends(get_admin_service)): return service.dashboard() @router.get("/settings", response_model=RuntimeSettings) def get_runtime_settings(service: AdminService = Depends(get_admin_service)): return service.get_runtime_settings() @router.put("/settings", response_model=RuntimeSettings) def put_settings(payload: RuntimeSettings, service: AdminService = Depends(get_admin_service)): return service.update_runtime_settings(payload) @router.get("/users", response_model=list[UserRecord]) def get_users(service: AdminService = Depends(get_admin_service)): return service.list_users() @router.post("/users", response_model=UserRecord) def post_user(payload: UserRecord, service: AdminService = Depends(get_admin_service)): return service.save_user(payload) @router.get("/profiles", response_model=list[UserProfileRecord]) def get_profiles(service: AdminService = Depends(get_admin_service)): return service.list_user_profiles() @router.get("/automations", response_model=list[AutomationRecord]) def get_automations(service: AdminService = Depends(get_admin_service)): return service.list_automations() @router.get("/memory", response_model=list[MemoryRecord]) def get_memory(service: AdminService = Depends(get_admin_service)): return service.list_memory() @router.delete("/memory") def delete_memory(service: AdminService = Depends(get_admin_service)): service.clear_memory() return {"status": "ok"} @router.get("/secrets/{key}") def get_secret(key: str, service: AdminService = Depends(get_admin_service)): return {"key": key, "masked": service.get_secret_mask(key)} @router.post("/secrets") def post_secret(payload: SecretPayload, service: AdminService = Depends(get_admin_service)): service.save_secret(payload.key, payload.value) return {"status": "ok"} @router.get("/integrations/llm", response_model=OllamaStatus) @router.get("/integrations/ollama", response_model=OllamaStatus) async def get_llm_status(service: AdminService = Depends(get_admin_service)): runtime = service.get_runtime_settings() settings = get_app_settings() secret = service.session.get(SecretORM, "zai_api_key") if runtime.model_provider == "zai" else None client = OllamaClient( base_url=runtime.local_base_url if runtime.model_provider == "local" else settings.zai_base_url, provider=runtime.model_provider, api_key=secret.value if secret else settings.zai_api_key, ) return await client.status(runtime.local_model if runtime.model_provider == "local" else runtime.zai_model) @router.get("/integrations/telegram", response_model=TelegramStatus) def get_telegram_status(service: AdminService = Depends(get_admin_service)): return service.telegram_status()