Spaces:
Running
Running
Upload folder using huggingface_hub
Browse files- api/main.py +28 -16
- src/court/orchestrator.py +16 -11
api/main.py
CHANGED
|
@@ -414,12 +414,18 @@ def court_argue(request: ArgueRequest):
|
|
| 414 |
if not request.session_id or not request.argument.strip():
|
| 415 |
raise HTTPException(status_code=400, detail="Session ID and argument required")
|
| 416 |
|
| 417 |
-
|
| 418 |
-
|
| 419 |
-
|
| 420 |
-
|
| 421 |
-
|
| 422 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 423 |
|
| 424 |
|
| 425 |
@app.post("/court/object")
|
|
@@ -444,16 +450,22 @@ def court_document(request: DocumentRequest):
|
|
| 444 |
"""Generate and produce a legal document."""
|
| 445 |
from src.court.orchestrator import process_document_request
|
| 446 |
|
| 447 |
-
|
| 448 |
-
|
| 449 |
-
|
| 450 |
-
|
| 451 |
-
|
| 452 |
-
|
| 453 |
-
|
| 454 |
-
|
| 455 |
-
|
| 456 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 457 |
|
| 458 |
|
| 459 |
@app.post("/court/end")
|
|
|
|
| 414 |
if not request.session_id or not request.argument.strip():
|
| 415 |
raise HTTPException(status_code=400, detail="Session ID and argument required")
|
| 416 |
|
| 417 |
+
try:
|
| 418 |
+
result = process_user_argument(request.session_id, request.argument)
|
| 419 |
+
|
| 420 |
+
if "error" in result:
|
| 421 |
+
raise HTTPException(status_code=400, detail=result["error"])
|
| 422 |
+
|
| 423 |
+
return result
|
| 424 |
+
except HTTPException:
|
| 425 |
+
raise
|
| 426 |
+
except Exception as e:
|
| 427 |
+
logger.error(f"Court argue endpoint error: {e}", exc_info=True)
|
| 428 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 429 |
|
| 430 |
|
| 431 |
@app.post("/court/object")
|
|
|
|
| 450 |
"""Generate and produce a legal document."""
|
| 451 |
from src.court.orchestrator import process_document_request
|
| 452 |
|
| 453 |
+
try:
|
| 454 |
+
result = process_document_request(
|
| 455 |
+
request.session_id,
|
| 456 |
+
request.doc_type,
|
| 457 |
+
request.for_side,
|
| 458 |
+
)
|
| 459 |
+
|
| 460 |
+
if "error" in result:
|
| 461 |
+
raise HTTPException(status_code=400, detail=result["error"])
|
| 462 |
+
|
| 463 |
+
return result
|
| 464 |
+
except HTTPException:
|
| 465 |
+
raise
|
| 466 |
+
except Exception as e:
|
| 467 |
+
logger.error(f"Court document endpoint error: {e}", exc_info=True)
|
| 468 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 469 |
|
| 470 |
|
| 471 |
@app.post("/court/end")
|
src/court/orchestrator.py
CHANGED
|
@@ -19,6 +19,7 @@ This module owns the 3-LLM-calls-per-round budget.
|
|
| 19 |
|
| 20 |
import logging
|
| 21 |
import json
|
|
|
|
| 22 |
from typing import Dict, List, Optional, Tuple
|
| 23 |
|
| 24 |
from src.court.session import (
|
|
@@ -117,16 +118,20 @@ def process_user_argument(
|
|
| 117 |
phase = session["phase"]
|
| 118 |
|
| 119 |
# Route to appropriate handler
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 130 |
|
| 131 |
|
| 132 |
def _handle_briefing(session_id: str, user_argument: str, session: Dict) -> Dict:
|
|
@@ -680,7 +685,7 @@ Generate the complete document."""
|
|
| 680 |
"type": doc_type,
|
| 681 |
"for_side": for_side,
|
| 682 |
"content": document_text,
|
| 683 |
-
"generated_at":
|
| 684 |
"round": session.get("current_round", 0),
|
| 685 |
}
|
| 686 |
|
|
|
|
| 19 |
|
| 20 |
import logging
|
| 21 |
import json
|
| 22 |
+
from datetime import datetime, timezone
|
| 23 |
from typing import Dict, List, Optional, Tuple
|
| 24 |
|
| 25 |
from src.court.session import (
|
|
|
|
| 118 |
phase = session["phase"]
|
| 119 |
|
| 120 |
# Route to appropriate handler
|
| 121 |
+
try:
|
| 122 |
+
if phase == "briefing":
|
| 123 |
+
return _handle_briefing(session_id, user_argument, session)
|
| 124 |
+
elif phase == "rounds":
|
| 125 |
+
return _handle_round(session_id, user_argument, session)
|
| 126 |
+
elif phase == "cross_examination":
|
| 127 |
+
return _handle_cross_exam_answer(session_id, user_argument, session)
|
| 128 |
+
elif phase == "closing":
|
| 129 |
+
return _handle_closing(session_id, user_argument, session)
|
| 130 |
+
else:
|
| 131 |
+
return {"error": f"Cannot process argument in phase: {phase}"}
|
| 132 |
+
except Exception as e:
|
| 133 |
+
logger.error(f"process_user_argument failed in phase {phase}: {e}", exc_info=True)
|
| 134 |
+
return {"error": str(e)}
|
| 135 |
|
| 136 |
|
| 137 |
def _handle_briefing(session_id: str, user_argument: str, session: Dict) -> Dict:
|
|
|
|
| 685 |
"type": doc_type,
|
| 686 |
"for_side": for_side,
|
| 687 |
"content": document_text,
|
| 688 |
+
"generated_at": datetime.now(timezone.utc).isoformat(),
|
| 689 |
"round": session.get("current_round", 0),
|
| 690 |
}
|
| 691 |
|