"""shira-hermes — FastAPI application.""" from __future__ import annotations import os import logging from pathlib import Path from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from api import __version__ from api.routes.admin_kb import router as admin_kb_router from api.routes.health import router as health_router from api.routes.kb_public import router as kb_public_router from api.routes.smart_assistant import router as smart_assistant_router from api.services.skills import seed_skills_from_image logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(name)s] %(levelname)s: %(message)s", ) logger = logging.getLogger("shira.app") app = FastAPI( title="shira-hermes", description="Shira AI Assistant — Hermes Agent backend for EspoCRM SmartAssistant", version=__version__, ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["GET", "POST", "OPTIONS"], allow_headers=["Content-Type", "X-Api-Key"], ) app.include_router(health_router) app.include_router(smart_assistant_router) app.include_router(admin_kb_router) app.include_router(kb_public_router) @app.on_event("startup") async def ensure_data_dirs(): """Create persistent data directories and seed any new baked-in skills.""" data_dir = os.environ.get("SHIRA_DATA_DIR", "/opt/data") dirs = [ f"{data_dir}/skills", f"{data_dir}/profiles", f"{data_dir}/cases", ] for d in dirs: Path(d).mkdir(parents=True, exist_ok=True) logger.info("Data directories ready at %s", data_dir) added, skipped = seed_skills_from_image() logger.info("Skills seed: %d new baked skill(s) added, %d already present", added, skipped)