sahilfarib's picture
Upload folder using huggingface_hub
db3715a verified
Raw
History Blame Contribute Delete
2.08 kB
"""
api/routes/draft.py — Draft generation and retrieval endpoints
"""
import json
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from loguru import logger
from api.dependencies import (
vectorstore, bm25_index, reranker, drafter, pattern_store,
)
from retrieval.hybrid import retrieve
from feedback.preference_injector import build_preference_string
router = APIRouter()
class DraftRequest(BaseModel):
query: str = "Provide a comprehensive analysis."
draft_type: str = "Case Fact Summary"
doc_names: str = ""
@router.post("/draft")
async def generate_draft(req: DraftRequest):
"""Generate a grounded legal draft from indexed documents."""
# Retrieve evidence
evidence = retrieve(
query=req.query,
vectorstore=vectorstore,
bm25_index=bm25_index,
reranker=reranker,
)
if not evidence:
raise HTTPException(404, "No evidence found. Ingest documents first.")
# Build preferences
preferences = build_preference_string(pattern_store)
# Generate draft
draft, report = drafter.generate(
evidence=evidence,
draft_type=req.draft_type,
doc_names=req.doc_names,
user_query=req.query,
injected_preferences=preferences,
)
# Save to history
pattern_store.save_draft(
draft_id=draft.draft_id,
draft_type=draft.draft_type,
doc_ids=", ".join(set(draft.doc_ids)),
draft_text=draft.draft_text,
validation_json=json.dumps(report.to_dict()),
)
return {
"draft_id": draft.draft_id,
"draft_text": draft.draft_text,
"draft_type": draft.draft_type,
"evidence_count": len(evidence),
"citations_count": len(draft.citations),
"validation": report.to_dict(),
}
@router.get("/draft/{draft_id}")
async def get_draft(draft_id: str):
"""Retrieve a previously generated draft."""
draft = pattern_store.get_draft(draft_id)
if not draft:
raise HTTPException(404, f"Draft {draft_id} not found.")
return draft