This commit is contained in:
2026-07-07 15:28:28 +02:00
parent 499f91e16a
commit 32c8bbe0a9
52 changed files with 3420 additions and 328 deletions
+27 -10
View File
@@ -206,31 +206,42 @@ async def deepsearch_status(request: Request, uid: str):
DeepsearchJobOut.model_validate(_job_payload(job)).model_dump(mode="json")
)
def _report_for(job: dict) -> dict:
if job.get("status") != queue.DONE:
def _report_from_disk(uid: str) -> dict:
path = DEEPSEARCH_DIR / uid / "report.json"
try:
return json.loads(path.read_text(encoding="utf-8"))
except (ValueError, OSError):
return {}
return job.get("result", {}).get("report", {})
def _report_for(uid: str, job: dict) -> dict:
if job.get("status") == queue.DONE:
report = job.get("result", {}).get("report", {})
if report:
return report
if job.get("status") == queue.FAILED:
return {}
return _report_from_disk(uid)
def _session_context(request: Request, uid: str, job: dict, session: dict) -> dict:
report = _report_for(job)
report = _report_for(uid, job)
user = get_current_user(request)
viewer_is_admin = is_admin(user)
done = job.get("status") == queue.DONE
done = bool(report) or job.get("status") == queue.DONE
return {
"uid": uid,
"status": job.get("status", ""),
"status": queue.DONE if done else job.get("status", ""),
"query": report.get("query") or session.get("query"),
"depth": int(session.get("depth") or 0),
"max_pages": int(session.get("max_pages") or 0),
"score": report.get("score"),
"confidence": report.get("confidence"),
"source_diversity": report.get("source_diversity"),
"synthesis": report.get("synthesis", ""),
"page_count": report.get("page_count", 0),
"chunk_count": report.get("chunk_count", 0),
"summary": report.get("summary", ""),
"sources": report.get("sources", []),
"findings": report.get("findings", []),
"gaps": report.get("gaps", []),
"timeline": report.get("timeline", []),
"chat_ws_url": f"/tools/deepsearch/{uid}/chat" if done else None,
"export_md_url": f"/tools/deepsearch/{uid}/export.md" if done else None,
@@ -282,10 +293,13 @@ def _control(request: Request, uid: str, state: str):
def _export_report(uid: str) -> dict | None:
job = queue.get_job(uid)
if not job or job.get("kind") != "deepsearch" or job.get("status") != queue.DONE:
if not job or job.get("kind") != "deepsearch" or job.get("status") == queue.FAILED:
return None
report = _report_for(uid, job)
if not report:
return None
queue.touch_job(uid, TOUCH_EXTEND_SECONDS)
return job.get("result", {}).get("report", {})
return report
@router.get("/{uid}/export.md")
async def deepsearch_export_md(request: Request, uid: str):
@@ -354,7 +368,10 @@ async def deepsearch_chat_ws(websocket: WebSocket, uid: str):
return
job = queue.get_job(uid)
session = database.get_deepsearch_session(uid)
if not job or job.get("kind") != "deepsearch" or job.get("status") != queue.DONE or not session:
ready = job and (
job.get("status") == queue.DONE or (session or {}).get("status") == "done"
)
if not job or job.get("kind") != "deepsearch" or not ready or not session:
await websocket.close(code=1008)
return
user = get_current_user(websocket)