59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
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}
|