import json from fastapi import APIRouter, HTTPException from ..services.llm_extract import extract_event from ..services.store import ensure_schema, get_store, insert_event_result, insert_raw_item router = APIRouter() @router.post("/event") def analyze_event(payload: dict): """Analyze one ad-hoc item and persist it. This powers the UI while we build full ingesters. """ title = (payload.get("title") or "").strip() content = (payload.get("content") or "").strip() if not title and not content: raise HTTPException(status_code=400, detail="missing title/content") st = get_store() conn = st.connect() ensure_schema(conn) raw_item_id = insert_raw_item( conn, source=str(payload.get("source") or "manual"), item_date=str(payload.get("date") or "") or "manual", title=title[:500], content=content[:20_000], url=payload.get("url"), published_at=payload.get("published_at"), lang=payload.get("lang"), ) res = extract_event(title=title, content=content, lang_hint=payload.get("lang")) if res.get("ok") is True: insert_event_result( conn, raw_item_id=raw_item_id, model=str(res.get("model") or ""), ok=True, event_json=json.dumps(res.get("event"), ensure_ascii=True), error=None, ) else: insert_event_result( conn, raw_item_id=raw_item_id, model=str(res.get("model") or ""), ok=False, event_json=None, error=str(res.get("error") or "unknown"), ) return {"raw_item_id": raw_item_id, **res}