Spaces:
Running on Zero
Running on Zero
|
Download docs/FEATURES.md from Lvvbaaal/legalgpt-api: direct link, hf CLI and curl.
- Browser
- Download file 34.1 kB
-
https://huggingface.co/spaces/Lvvbaaal/legalgpt-api/resolve/main/docs/FEATURES.md
- Command line
-
hf download hf://spaces/Lvvbaaal/legalgpt-api/docs/FEATURES.md
-
curl -L -o FEATURES.md https://huggingface.co/spaces/Lvvbaaal/legalgpt-api/resolve/main/docs/FEATURES.md
34.1 kB
| # SaulGPT — Complete Feature Architecture | |
| ## Project Overview | |
| SaulGPT is an AI-powered Indian Legal Intelligence Assistant using a 6-layer RAG pipeline to answer legal queries, draft documents, evaluate contracts, and provide structured legal analysis. It uses a 3-phase "Virtual Counsel" flow (Discovery → Strategy → Execution) for legal grievance handling with Llama 3.1 8B via Groq. | |
| --- | |
| ## 1. Backend Systems | |
| ### 1.1 API Server & Request Routing | |
| **Source:** ackend/api_server.py (~1662 lines) | |
| FastAPI server (port 8000) with CORS, Groq LLM initialization, and Knowledge Graph startup. | |
| **Endpoints:** | |
| | Method | Route | Auth | Purpose | | |
| |--------|-------|------|---------| | |
| | POST | /api/chat | Optional | Main chat: pipeline, triage state machine, drafting loop, IRAC | | |
| | POST | /api/chat/stream | Optional | SSE-streaming variant | | |
| | POST | /api/upload | No | Contract upload and evaluation (multipart) | | |
| | GET | /api/document/{session_id} | No | Serve generated .docx as download | | |
| | DELETE | /api/history/{session_id} | No | Clear session history | | |
| | DELETE | /api/draft/state/{session_id} | No | Clear drafting state / cancel interview | | |
| | GET | /api/health | No | Health check | | |
| | GET | /api/conversations | Bearer | List conversations (paginated) | | |
| | POST | /api/conversations | Bearer | Create conversation | | |
| | GET | /api/conversations/{id} | Bearer | Load conversation with messages | | |
| | DELETE | /api/conversations/{id} | Bearer | Delete conversation | | |
| | POST | /api/conversations/migrate | Bearer | Bulk-import guest messages for session takeover | | |
| | POST | /api/auth/signup | No | Register user | | |
| | POST | /api/auth/login | No | Login user | | |
| | GET | /api/auth/me | Bearer | Current user info | | |
| **Request Pipeline** (for /api/chat): | |
| 1. Auth resolution (JWT or guest) | |
| 2. Conversation resolution (map session_id to conv_id or create new) | |
| 3. Message persistence (to SQLite if authenticated) | |
| 4. Interview state check | |
| 5. Interruption guard (clarification/hypothetical/pushback) | |
| 6. **Crisis pre-check** (regex: self-harm, active violence, confinement → helplines, stop) | |
| 7. Jurisdiction gate (non-Indian queries → rejected before processing) | |
| 8. Direct legal query patterns (15 regex → force knowledge mode) | |
| 9. Triage LLM call (classify: off-topic / direct legal / educational / document / grievance) | |
| 10. Triage state machine routing (3-phase flow or pass-through) | |
| 11. Pipeline dispatch (6-layer RAG fallthrough) | |
| 12. Response construction (widget metadata: remapped laws, urgency, jurisdiction) | |
| 13. Response persistence (conv_id injected for frontend tracking) | |
| **State Stores:** | |
| - ACTIVE_CONVERSATIONS: session_id → conv_id mapping | |
| - SESSIONS: per-session drafting interview state | |
| - SESSION_DOCUMENTS: generated .docx bytes | |
| - TRIAGE_STATES: per-session 3-phase flow state | |
| **Robust JSON Extraction:** _extract_json() with 4-layer fallback (pure JSON → markdown codeblock → markdown key-value → empty dict) used by all three core agents (triage, discovery, strategy). | |
| --- | |
| ### 1.2 Crisis Detection & Emergency Response | |
| **Source:** `backend/api_server.py` — `_detect_crisis()` + `_CRISIS_PATTERNS` | |
| Regex-based pre-check that fires **before any LLM call or pipeline processing**, positioned between the jurisdiction gate and the triage classification. | |
| **3 crisis categories:** | |
| | Category | Trigger examples | Response | | |
| |---|---|---| | |
| | **Self-harm** | "kill myself", "suicide", "hurt myself", "end my life" | Suicide prevention helplines (AASRA, iCall, Vandrevala) + emergency number | | |
| | **Active violence** | "beating me right now", "trying to kill me", "weapon" | Police (100), National Emergency (112), Women's Helpline (1091) | | |
| | **Confinement** | "locked in", "held against my will", "passport taken" | Police (100), National Emergency (112) | | |
| **Design principle:** Hard stop — no Discovery, no RAG, no pipeline. The system refuses to process further until the user confirms safety. | |
| --- | |
| ### 1.3 6-Layer RAG Pipeline | |
| **Source:** ackend/pipeline_orchestrator.py (~700 lines) | |
| Sequential pipeline for all non-drafting queries. | |
| **Layer 0: Conversation Memory (Sliding Window)** | |
| - Per-session verbatim turn memory | |
| - Sliding window: 6 turns verbatim, older turns collapsed into key facts | |
| - Thresholds: collapse at 9 turns, summarize at 12 turns | |
| - Key fact extraction: regex for dates, amounts (INR/Rs.), places, section numbers | |
| - Functions: save_turn_to_memory(), get_history_with_summary() | |
| **Layer 1: Query Understanding** (layer1_understanding.py, ~400 lines) | |
| - Language detection (langdetect, fallback "en") | |
| - Intent classification: factual / procedure / definition / comparison / analysis / document / ambiguous | |
| - Entity extraction (spaCy NER: PERSON, ORG, GPE, LAW, DATE, MONEY, TIME) | |
| - Citation extraction (regex: "Section X of Y Act", "Article Z") | |
| - Ambiguity detection (vague phrasing patterns) | |
| - Query reformulation (LLM-based abbreviation expansion) | |
| - spaCy model: en_core_web_sm | |
| **Layer 2: Hybrid Vector Retrieval** (layer2_retrieval.py, ~350 lines) | |
| - Vector DB: ChromaDB, collection "saulgpt_indian_laws" | |
| - Embedding model: all-MiniLM-L6-v2 | |
| - Chunks: 1200 chars, 150 overlap (~2409 chunks, 9 acts) | |
| - Hybrid: semantic search + BM25 keyword retrieval | |
| - Cross-encoder reranking: ms-marco-MiniLM-L-6-v2 (8 candidates → 5 results) | |
| - Noise detection: max_score < 0.5 AND spread < 0.15 → web fallback | |
| - Deduplication by content hash | |
| - Citation filtering prioritization | |
| **Layer 3: LLM Reasoning** (layer3_reasoning.py, ~700 lines) | |
| - Model: llama-3.1-8b-instant via Groq (temperature 0.1) | |
| - Mode prompts: knowledge (neutral), analysis (FACTS/ISSUES/LAW/OUTCOME), document (drafting), pathfinder (step-by-step) | |
| - Context: retrieved chunks + conversation history + mode instruction | |
| - Knowledge Graph expansions injected | |
| - Ambiguity handling → clarifying questions | |
| **Layer 4: Response Validation** (layer4_validation.py, ~700 lines) | |
| - Citation verification (regex cross-check against retrieved chunks) | |
| - NLI hallucination check (DeBERTa, fallback to pattern matching) | |
| - Repealed law interception (IPC/CrPC/IEA → BNS/BNSS/BSA; generates remapped_laws) | |
| - Struck-down section detection | |
| - Legal terminology enforcement (informal → formal) | |
| - Disclaimer enforcement | |
| - Remedy validation | |
| **Layer 5: External Data** (layer5_external.py, ~450 lines) | |
| - DuckDuckGo fallback (appends "Indian law indiankanoon indiacode") | |
| - Post-filter to Indian legal domains (.gov.in, indiankanoon.org, indiacode.nic.in) | |
| - IndianKanoon case law scraping (BeautifulSoup) | |
| - Auto-updater (APScheduler, 30-day interval) | |
| **Layer 6: Evaluator** — see Contract Evaluation System (1.6). | |
| --- | |
| ### 1.4 3-Phase Virtual Counsel Flow | |
| **Source:** ackend/api_server.py (triage state machine), riage_state.py, discovery_agent.py, strategy_agent.py, prompts/discovery.py, prompts/strategy.py | |
| Python-enforced state machine replacing old keyword-based triage for legal grievances. | |
| **State Machine** ( riage_state.py, 47 fields): | |
| - current_mode: "idle" | "discovery" | "strategy" | |
| - discovery_profile: structured Phase 1 output | |
| - discovery_turn_count: hard 3-turn cap (Python-enforced) | |
| - strategy_data: SWOT + options | |
| - selected_strategy_id: user-chosen path_a..path_d | |
| - counsel_override: LLM-detected override flag | |
| **Phase 1: Discovery** (discovery_agent.py, prompts/discovery.py) | |
| - Structured 3-turn sequence with fixed objectives per turn: | |
| - **Turn 0 (Story & Legal Anchor)**: Empathy + brief area-of-law anchor + open-ended story question | |
| - **Turn 1 (Evidence & Timeline)**: Ask about documentary proof and exact dates; skip if already populated | |
| - **Turn 2 (Outcome & Priority)**: Ask what the user wants and what matters most; always final turn | |
| - Adaptive skip: each turn checks existing profile and skips if target fields are already filled | |
| - Legal Framework Anchor: LLM names the relevant area of law before asking questions ("This falls under Indian Employment Law") | |
| - Tone Protocol: matches emotional_state (angry/frustrated/desperate/calm) | |
| - Graceful vague-answer handling (no re-asking on "I don't know") | |
| - Hard 3-turn Python cap (enforced by api_server.py line 1205: `discovery_turn >= 2`) | |
| - Discovery Profile output: emotional_state, desired_outcome, evidence_quality, timeline, user_priority, opponent_profile | |
| - 4-layer JSON extraction | |
| - Emotional-language fix: CRITICAL RULE ensures anger/frustration = legal grievance, not off-topic | |
| **Phase 2: Strategy** (strategy_agent.py, prompts/strategy.py) | |
| - SWOT: Strengths, Weaknesses, Opportunities, Threats | |
| - Exactly 4 options (path_a..path_d), each with: | |
| - route_to: "document" (drafting) or "pathfinder" (procedure) | |
| - title, description, pros, cons, estimated_timeline, difficulty, success_probability | |
| - Counsel Override for exceptional cases (government opponent, acknowledgment) | |
| - Evidence weakness flagging | |
| - Validation: strips path_e, pads with universal catch-alls, validates route_to | |
| - Unrecognized routing → pathfinder with preamble note | |
| **Phase 3: Execution** | |
| - Document → interview_state field collection | |
| - Pathfinder → 6-layer pipeline in procedural mode | |
| - IRAC Advocate Mode → keyword/button-invoked structured analysis | |
| --- | |
| ### 1.5 IRAC Advocate Mode | |
| **Source:** ackend/irac_agent.py, prompts/irac.py | |
| Structured legal analysis for law students/advocates. Never invoked as hidden fallback. | |
| **IRAC Structure:** FACTS (neutral) → ISSUES (legal questions) → RULE (RAG-grounded statutes) → APPLICATION (both-sides argumentation) → CONCLUSION (balanced assessment) | |
| **Domain Statute Mappings:** Employment, Contracts, Property, Family, Consumer, Criminal, Torts | |
| **Guardrails:** | |
| - Domain guardrails (no factory acts for white-collar disputes, no constitutional articles unless government opponent) | |
| - All citations RAG-grounded (never outside retrieved docs) | |
| - No verdict — Application argues both sides | |
| **Invocation:** Frontend "Advocate Mode" button + natural language ("advocate", "irac", "deep legal analysis"). Resets to "idle" after output. | |
| --- | |
| ### 1.6 Document Drafting System | |
| **Interview State** (interview_state.py, ~950 lines) | |
| - State machine: IDLE → INTERVIEWING → DRAFTING → COMPLETE | |
| - Document families: letter, pleading, affidavit, agreement | |
| - 5 predefined schemas: legal_notice, cheque_bounce, employment_notice, fir, rental_agreement | |
| - Each schema: 5-9 fields (sender, recipient, dates, amounts, etc.) | |
| **Dynamic Field Scoping** (dynamic_drafter.py, ~400 lines) | |
| - LLM-driven field identification (max 7 fields) | |
| - Classifies document type from query | |
| - Builds prompt injections from collected values | |
| - Session-cached field scope | |
| - Falls back to static schemas | |
| **Interview Loop:** | |
| - Progressive field-by-field questioning | |
| - Interruption handling (clarification, hypothetical, pushback) | |
| - Unrelated query detection (resets state) | |
| - Progress tracking per message | |
| **Three-Layer Document Gate:** | |
| 1. Triage identifies document intent | |
| 2. User picks document path from Strategy options | |
| 3. Explicit "Shall I draft?" confirmation | |
| **.docx Generation** (document_generator.py, ~980 lines) | |
| - Rendering: python-docx, Times New Roman 12pt, 1-inch margins, 1.5 spacing | |
| - 4-family: letter, pleading, affidavit, agreement | |
| - Primitive functions: add_header, add_title, add_recipient_block, add_subject_line, add_body, add_signature_block, add_enclosures, add_court_details, add_verification, add_pagination | |
| --- | |
| ### 1.7 Contract Evaluation System | |
| **Source:** ackend/layer6_evaluator.py (~470 lines) | |
| - Format support: PDF (PyMuPDF), DOCX (python-docx) | |
| - Chunking: 5000-character at paragraph boundaries | |
| - Evaluation dimensions: clarity, enforceability, compliance, risk, completeness | |
| - Per-chunk LLM evaluation (llama-3.1-8b-instant) | |
| - Output: overall_score, risk_level (low/medium/high/critical), clauses, summary, recommendations | |
| - Upload max: 50MB | |
| --- | |
| ### 1.8 Pre-Draft Legal Scrutiny Engine | |
| **Source:** ackend/scrutiny_agent.py (~640 lines) | |
| **ScrutinyResult:** is_valid, issues, warnings, limitation_status, remedy_feasibility, limitation_date, bns_mapping, risk_score (0-100), recommendations | |
| **Checks:** | |
| 1. Limitation (12 claim types with periods, exception detection: acknowledgment, continuous wrong, disability, government) | |
| 2. Remedy validity | |
| 3. BNS/BSA enforcement (IPC/CrPC/IEA → BNS/BNSS/BSA) | |
| 4. Field validation per doc type | |
| **Severity Levels:** "serious" (red, blocking), "warning" (gold, acknowledgeable), "info" (teal, acknowledgeable) | |
| --- | |
| ### 1.9 Legal Knowledge Graph | |
| **Source:** ackend/layer6_knowledge_graph.py (~560 lines) | |
| - NetworkX DiGraph: 89 nodes, 67 edges | |
| - Relationships: Act replacements (IPC→BNS, CrPC→BNSS, IEA→BSA), constitutional hierarchy, cross-act links, procedural chains (FIR→Investigation→Charge Sheet→Trial→Appeal) | |
| - ~30 act aliases resolved to canonical names | |
| - expand_context(): injects graph into pipeline, returns replaced_acts for frontend | |
| --- | |
| ### 1.10 Authentication & User Persistence | |
| **JWT Auth** (ackend/auth.py, 42 lines) | |
| - bcrypt hashing (passlib) | |
| - JWT: 30-day expiry, HS256 | |
| **SQLite DB** (ackend/database.py, ~170 lines) | |
| - Tables: users, conversations, messages | |
| - WAL mode, foreign keys, thread-local connections | |
| - bulk_import_messages() for guest session takeover | |
| --- | |
| ### 1.11 Legal Data Ingestion Pipeline | |
| **Scraper** (ackend/scraper/, 4 files + config) | |
| - LegalScraperEngine: IndiaCodeScraper (DSpace) + KanoonScraper (BeautifulSoup) | |
| - 25 scrapeable acts in config | |
| **Chunking & Embedding** (2_chunk_and_embed.py, ~469 lines) | |
| - Chunk: 1200 chars, 150 overlap | |
| - Embedding: all-MiniLM-L6-v2 | |
| - Universal key detector (14+ key variants per field) | |
| - 5 JSON structures supported | |
| - Lineage header: [Act: X] [Section Y: Z]. | |
| **Embedded Acts (9):** BNS 2023, Constitution of India, BNSS 2023, CPC, Negotiable Instruments Act, Hindu Marriage Act, Motor Vehicles Act, BSA 2023, Indian Divorce Act | |
| --- | |
| ### 1.12 RAG Evaluation Suite | |
| **Source:** ackend/eval_pipeline.py (~250 lines) | |
| 8 gold-standard test cases (knowledge, analysis, pathfinder). Metrics: retrieval_coverage, citation_accuracy, hallucination_score, overall_score. | |
| --- | |
| ## 2. Frontend Application | |
| ### 2.1 Core Chat Interface | |
| **Source:** saulgpt-ui/src/App.jsx (935 lines) | |
| **19 State Variables:** | |
| - Auth: token, user, authLoading | |
| - Chat: messages, input, loading, loadingLabel, forceMode, interviewActive | |
| - UI: showSuggestions, showDropZone, showGlossary, glossaryCategory, showSidebar | |
| - Session: convId, refreshTrigger | |
| **Sub-components (inline):** | |
| - TypingIndicator({ label }): animated bot-typing dots | |
| - InterviewProgress({ pct }): progress bar (0-100%) | |
| - RiskBadge({ risk }): color-coded pill (High/Medium/Low) | |
| - PipelineMeta({ data }): collapsible debug panel (citations, repealed laws, validation, confidence) | |
| - Message({ msg, onTriageChoice }): single chat message renderer with markdown, widgets, and export bar | |
| - DropZone({ onFile, disabled }): drag-and-drop contract upload | |
| **7 useEffect Hooks:** | |
| 1. convRef sync (prevents stale overwrites) | |
| 2. Persist convId to localStorage | |
| 3. Page refresh recovery (load conversation from API on mount) | |
| 4. Persist guest messages (last 6) | |
| 5. Auto-scroll on message/loading change | |
| 6. Auto-resize textarea | |
| 7. Cross-tab auth sync (storage event listener) | |
| **Key Functions:** | |
| - api(): axios instance with Bearer token + 401 interceptor (auto-logout) | |
| - sendMessage(): core send → POST /api/chat → handle interview/triage/complete states | |
| - handleFile(): contract upload → POST /api/upload | |
| - handleTriageChoice(): triage card → sendMessage | |
| - clearChat(), cancelInterview(), handleAuth(), logout() | |
| **Welcome Screen:** Animated seal, "Your Counsel Awaits", feature cards (Ask/Draft/Evaluate), 5 suggested queries. | |
| **Send Flow:** Validation → optimistic append → POST /api/chat → response processing → loading=false. | |
| **Mode Selector:** 5 buttons (Auto, Knowledge, Analysis, Document, Pathfinder). | |
| **Chat Input:** Auto-resizing textarea, contextual placeholder, disabled during loading, file upload button, send button with spinner. | |
| --- | |
| ### 2.2 Document Drafting UI | |
| - Interview badge ("Drafting Mode Active" with gold pulse) replaces mode selector during interview | |
| - Cancel button (red, clears draft state) | |
| - Input placeholder changes to "Type your answer..." during interview | |
| - InterviewProgress per message | |
| - .docx download button on completion (meta.document_ready flag) | |
| ### 2.3 Contract Evaluation UI | |
| - DropZone (drag-and-drop, accepts PDF/DOCX/TXT, 50MB max) | |
| - Upload button (paperclip icon, disabled during loading) | |
| - "Running Red Pen evaluation..." loading label | |
| - Evaluation response with risk level display | |
| ### 2.4 Response Widget System | |
| Each widget conditionally renders based on response metadata: | |
| **BNSCorrectionNotice** (BNSCorrectionNotice.jsx, 118 lines): | |
| - "LEGISLATION UPDATE 2024" card | |
| - Maps old law (IPC/CrPC/IEA, strikethrough red) → new law (BNS/BNSS/BSA, green check) | |
| - Triggered by meta.remapped_laws | |
| **VetoCard** (VetoCard.jsx, 144 lines): | |
| - Collapsible scrutiny result with severity levels | |
| - Serious: red pulsing, blocking gate (Consult Lawyer / Draft Demand Letter) | |
| - Warning/Info: gold/teal, acknowledgment checkbox | |
| - Sections: Limitation Act, Remedy Not Recognized, Law Updated BNS/BNSS | |
| - Auto-corrections display | |
| **UrgencyBanner** (UrgencyBanner.jsx, 83 lines): | |
| - Critical (<30d): red pulsing, siren icon | |
| - Warning (<90d): amber static, clock icon | |
| - Shows limitation days + deadline date | |
| - Triggered by urgency_flags or limitation_days | |
| **JurisdictionBadge** (JurisdictionBadge.jsx, 151 lines): | |
| - Court level: 8 types (Supreme Court gold, High Court teal, District Court green, etc.) | |
| - Jurisdiction type: 8 icons (Civil, Criminal, Consumer, Family, Revenue, etc.) | |
| - Territorial + pecuniary info | |
| - Court description footnote | |
| **TriageCards** (TriageCards.jsx, 121 lines): | |
| - "Strategic Options" with info banners (limitation, jurisdiction) | |
| - Clickable option cards (gold label + description + arrow) | |
| - Action row: SWOT toggle, "Explain These Options", "Advocate Mode" | |
| - Expandable SWOT analysis (4 color-coded boxes) | |
| **PipelineMeta:** Collapsible debug panel showing mode, domain, laws, graph insights, case law, elapsed time, citations, validation status, confidence, hallucination warnings. | |
| **Export Bar:** Copy (clipboard), Download PDF (jsPDF), Download .docx (backend URL). | |
| ### 2.5 Conversation Management | |
| **Source:** saulgpt-ui/src/ConversationsSidebar.jsx (87 lines) | |
| - Left panel (260px) with mobile backdrop overlay | |
| - Header: "Chats (N)" + New (+) + Close (X) | |
| - Conversation list: title (truncated 28 chars), relative time, delete on hover | |
| - Active: gold border highlight | |
| - Pagination: "Load more (N remaining)" button | |
| - useEffect: fetches on mount + refreshTrigger change, AbortController cleanup | |
| - Sidebar toggle via hamburger button | |
| **loadConversation():** Clears UI → sets convId early → fetches messages → populates → handles error with message in chat | |
| **newConversation():** Clears UI → setConvId(null) → creates on backend → triggers sidebar refresh | |
| **deleteConversation():** Deletes on backend → clears local state if active → triggers sidebar refresh | |
| ### 2.6 Authentication & Session Management | |
| **AuthPage** (AuthPage.jsx, 66 lines): | |
| - Tabbed login/signup form | |
| - Migration overlay (guest session takeover spinner) | |
| - JWT stored in localStorage | |
| **Session Features:** | |
| - Page refresh recovery (loads last conversation from API) | |
| - Guest message persistence (last 6 in localStorage) | |
| - Guest session takeover (bulk-import on login) | |
| - Cross-tab auth sync (storage event listener → auto-logout) | |
| - 401 interceptor (expired token → logout) | |
| ### 2.7 Supporting Utilities | |
| **LegalGlossary** (LegalGlossary.js, 287 lines): | |
| - 200+ Indian legal terms with plain-language definitions | |
| - 10 categories: Constitutional, Criminal Law, Criminal Procedure, Commercial Law, Civil Procedure, Consumer Law, Labour Law, Property Law, Family Law, General | |
| - Functions: scanForTerms(), getTermDefinition(), getTermsByCategory(), getCategories() | |
| - Glossary sidebar with category filter + search | |
| **PDF Generation** (usePDF.js, 405 lines): | |
| - jsPDF-based A4 PDF generator | |
| - Professional formatting: letterhead, gold rules, document type label, validation badge, citations block, auto page breaks | |
| - Color palette: gold, ink, sage, red, amber | |
| - Section starters for 13 pattern types | |
| - 25mm margins (Indian legal standard) | |
| --- | |
| ## 3. Agent Architecture | |
| ### 3.1 Central LLM Client | |
| **Source:** ackend/agents/llm_client.py | |
| 4 pre-initialized ChatGroq instances: | |
| - Researcher: mixtral-8x7b-32768 (temperature 0.1) | |
| - Drafter: llama-3.1-8b-instant (temperature 0.1) | |
| - Reviewer: llama-3.1-8b-instant (temperature 0.1) | |
| - Triage: llama-3.1-8b-instant (temperature 0.1) | |
| All load GROQ_API_KEY from .env. | |
| ### 3.2 Agent Manager & Routing | |
| **Source:** ackend/agents/manager.py | |
| AgentManager with mode detection (regex patterns) and route dispatch: | |
| - legal_query → ResearcherAgent | |
| - case_analysis → ResearcherAgent (analysis mode) | |
| - pathfinder → ResearcherAgent (pathfinder mode) | |
| - document → DrafterAgent | |
| - interviewing → DrafterAgent | |
| - evaluate → ReviewerAgent | |
| - scrutiny → ReviewerAgent | |
| ### 3.3 Sub-Agents | |
| **TriageAgent** (gents/triage.py): Query classification (LLM + keyword fallback), TOWS analysis generation. | |
| **ResearcherAgent** (gents/researcher.py): Knowledge Q&A, case analysis (FACTS/ISSUES/LAW/OUTCOME), pathfinder (step-by-step). Includes IPC/CrPC→BNS/BNSS mapping. | |
| **DrafterAgent** (gents/drafter.py): Document type detection, field collection, LLM document generation. | |
| **ReviewerAgent** (gents/reviewer.py): Contract evaluation, pre-draft scrutiny, limitation check, red flag detection, veto check. | |
| --- | |
| ## 4. Data Layer & Cloud Persistence | |
| ### 4.1 Supabase Managed PostgreSQL (Primary Cloud Database) | |
| - **Host:** `aws-0-ap-southeast-1.pooler.supabase.com` | |
| - **Port:** `5432` (Session Mode) / `6543` (Transaction Mode) | |
| - **Engine:** IPv4 Connection Pooler bypassing IPv6 container restrictions | |
| - **Tables:** `users`, `conversations`, `messages` | |
| - **Indexes:** `idx_conversations_user_id`, `idx_messages_conv_id`, `idx_messages_conversation_id` | |
| - **Concurrency:** Multi-device simultaneous read/write with zero file-locking bottlenecks | |
| ### 4.2 Local SQLite Fallback | |
| - **File:** `backend/saulgpt.db` | |
| - **Mode:** WAL (Write-Ahead Logging) for concurrent access | |
| - Automatically activated if `DATABASE_URL` is omitted in local development | |
| ### 4.3 ChromaDB (Vector Store) | |
| - **Collection:** `saulgpt_indian_laws` & `landmark_precedents` | |
| - **Embeddings:** `sentence-transformers/all-MiniLM-L6-v2` pinned to `device="cpu"` | |
| - **Total Chunks:** 2,449+ statutory and case law segments | |
| - **Path:** `data/vector_db/` | |
| ### 4.4 JSON Raw Data Sources | |
| - **Path:** `data/raw_data/` | |
| - Contains canonical acts: BNS 2023, BNSS 2023, BSA 2023, CPC 1908, NIA 1881, HMA 1955, MVA 1988, IDA 1869, Constitution of India | |
| ### 4.5 Relational GNN Knowledge Graph (In-Memory) | |
| - NetworkX DiGraph + PyTorch continuous embeddings (TransE/RotatE in $\mathbb{R}^{64}$) | |
| - 73 canonical legal relations, 268 nodes, 172 triples | |
| --- | |
| ## 5. Pre-Trial Studio & Moot Court Arena | |
| **Source:** `backend/trial_studio/`, `saulgpt-ui/src/TrialStudio.jsx` | |
| Interactive adversarial courtroom simulation providing rigorous trial preparation before an actual hearing. | |
| ### 5.1 Hostile Section 146 BSA Cross-Examiner | |
| - Implements aggressive cross-examination tactics targeting documentary gaps, oral inconsistencies, and tax filing contradictions under Section 146 of the Bharatiya Sakshya Adhiniyam, 2023. | |
| - Formulates multi-turn traps designed to impeach witness credibility. | |
| ### 5.2 Confidential Corner Coach & Tactical Counsel | |
| - Operates in real time alongside the courtroom examination. | |
| - Real-time exposure gauge (Low / Medium / High Risk). | |
| - Flags formal procedural objections (e.g. hearsay, leading questions, questions without foundation). | |
| - Provides verbatim, safe witness rejoinders that avoid fatal admissions. | |
| - Suggests tangible evidentiary plugs to introduce into the record. | |
| ### 5.3 Precedent Intelligence Engine | |
| - Indexed database of **50,000+ landmark Supreme Court and High Court judgments** across 8 frameworks: BNS, BNSS, BSA, NI Act, CPA 2019, Contract Act, Limitation Act, Arbitration Act. | |
| - Fallback keyword detection matches dispute patterns to governing precedents. | |
| ### 5.4 Split-Chamber UI | |
| - Left Column: Formal Courtroom Chamber with judge/counsel dialogue stream and witness stand. | |
| - Right Column: Confidential Corner Coach Console with live exposure meter and objection arsenal. | |
| --- | |
| ## 6. Section 63 BSA Digital Evidence Grounding | |
| **Source:** `backend/evidence_processor.py`, `saulgpt-ui/src/EvidenceUploader.jsx` | |
| End-to-end processing and certification of electronic records under Section 63 of the Bharatiya Sakshya Adhiniyam, 2023 (formerly Section 65B IEA). | |
| ### 6.1 Cryptographic Hash Verification | |
| - Dual-tier SHA-256 integrity calculation: computed client-side in the browser on file selection, and independently re-verified server-side on upload. | |
| - Detects any bitwise tampering during transit. | |
| ### 6.2 Cheque OCR & 30-Day Statutory Clock | |
| - Extracts bank return memos, dishonour codes (e.g. "Funds Insufficient", "Account Closed"), drawer/payee names, and amount. | |
| - Automatically calculates the mandatory 30-day statutory notice window under Section 138 NIA. | |
| ### 6.3 Debtor Audio Admission & Limitation Extender | |
| - Transcribes and semantically parses voice admissions and debt promises. | |
| - Applies Section 18 of the Limitation Act, 1963 to compute revised limitation expiry dates based on valid acknowledgments of liability. | |
| ### 6.4 Court-Admissible Electronic Certificate Generation | |
| - Automatically drafts a formal Section 63 BSA compliance certificate. | |
| - Details device identifiers, cryptographic hash, extraction date, custodian signature block, and truth verification. | |
| - 1-click integration transmits certified evidence directly into the Pre-Trial Studio. | |
| --- | |
| ## 7. Actor-Critic Fine-Grained Process Reward Model (FG-PRM) | |
| **Source:** `backend/actor_critic.py`, `backend/layer4_validation.py` | |
| Neuro-symbolic reinforcement validation that scrutinizes reasoning chains before emitting legal counsel. | |
| ### 7.1 Multi-Dimensional Step Evaluation | |
| - Evaluates four orthogonal dimensions: | |
| 1. **Factuality & Citation Validity:** Verifies whether cited sections actually exist and match the proposition. | |
| 2. **Statutory Applicability:** Prevents application of repealed statutes (IPC/CrPC) or struck-down provisions. | |
| 3. **Logical Soundness & Neutrality:** Checks for non-sequiturs or premature conclusions. | |
| 4. **Tone & Client Empathy:** Ensures professional, measured legal counsel matching client distress. | |
| ### 7.2 Dynamic Token Budgeting (`max_tokens=800`) | |
| - PRM feedback loop strictly constrained to `max_tokens=800`. | |
| - Eliminates Groq free-tier 1000 OTPM rate limit exceptions (`429 rate_limit_exceeded`) while preserving comprehensive critique. | |
| ### 7.3 Fast-Path Bypasses | |
| - Low-complexity queries bypass secondary critic passes, ensuring sub-second response latency. | |
| --- | |
| ## 8. High-Capacity Contract Evaluator (Layer 6) | |
| **Source:** `backend/layer6_evaluator.py`, `saulgpt-ui/src/App.jsx` | |
| Deep structural analysis of commercial and employment agreements. | |
| ### 8.1 25,000-Character Single-Pass Ingestion | |
| - Evaluates extensive multi-page contracts in a unified prompt context, eliminating fragmentation and cross-chunk context loss. | |
| ### 8.2 Indian Contract Act 1872 Auditing | |
| - **Section 27 (Restraint of Trade):** Flags void post-employment non-compete clauses. | |
| - **Section 28 (Restraint of Legal Proceedings):** Identifies illegal time limits on litigation. | |
| - **Section 74 (Liquidated Damages vs. Penalties):** Scrutinizes disproportionate penalty clauses. | |
| ### 8.3 Tri-Level Risk Scoring | |
| - 🔴 **High Risk:** Void/unlawful terms requiring immediate deletion. | |
| - 🟡 **Medium Risk:** Unbalanced commercial exposure (unilateral indemnity, unlimited liability). | |
| - 🟢 **Low Risk:** Fair, reciprocal covenants. | |
| - Outputs concrete, redlined clause replacements ready for negotiation. | |
| --- | |
| ## 9. 4-Family Court-Grade Document Factory | |
| **Source:** `backend/interview_state.py`, `backend/document_generator.py` | |
| Synthesizes print-ready, legally enforceable documents in Microsoft Word (`.docx`) and vector PDF formats. | |
| ### 9.1 Supported Document Families | |
| 1. **Letter / Notice Family (`letter`):** | |
| - Section 138 NIA Cheque Bounce Notices, Demand Notices for Unpaid Salary, Tenancy Default Notices. | |
| - Formal RPAD header, Sender `FROM:` block, Recipient `TO:` block, 15-day statutory demand clause, advocate signature block. | |
| 2. **Pleading Family (`pleading`):** | |
| - Civil Plaints under Order VII Rule 1 CPC, Section 223 BNSS Criminal Complaints. | |
| - Enforces the **Triad of Survival:** Cause of Action & Limitation, Territorial/Pecuniary Jurisdiction, and Court Valuation with Order VI Rule 15 verification split. | |
| 3. **Affidavit Family (`affidavit`):** | |
| - Sworn deponent affidavits with 5.5-inch stamp paper top margin and dual notary verification (personal knowledge vs. legal advice). | |
| 4. **Agreement Family (`agreement`):** | |
| - Commercial Leases, SLAs, NDAs with recitals, operative covenants, Section 7 Arbitration clause, and dual witness blocks. | |
| ### 9.2 Zero Prompt Leakage & Clean Formatting | |
| - **Sanitization Pipeline:** Strips all `[User Goal: document]` tags, instruction strings, and raw dictionary keys. | |
| - **Deterministic Fallback Spec Engine:** If the LLM spec generator times out, `build_fallback_spec()` automatically constructs an authentic, clause-complete legal document. | |
| - **Resilient Cloud Delivery:** Cached in memory and on disk (`./generated_docs/`), delivered via Axios blob stream with fallback browser navigation. | |
| --- | |
| ## 10. Security, Cloud Infrastructure & BYOK Architecture | |
| ### 10.1 Hugging Face Spaces ZeroGPU Backend | |
| - Configured via `app.py` unifying Gradio 5.20 and FastAPI on port 7860. | |
| - Dynamic GPU allocation (`zero-a10g`) with PyTorch embeddings strictly pinned to CPU to prevent ZeroGPU CUDA supervisor aborts. | |
| ### 10.2 Bring Your Own Key (BYOK) | |
| - Users can provide their personal Groq API keys (`gsk_...`) in `ApiKeyModal.jsx`. | |
| - Stored exclusively in the user's browser `localStorage` and passed per-request via the `X-Groq-Api-Key` HTTP header. | |
| - Zero server-side key logging or persistence. | |
| --- | |
| ## File Reference Summary | |
| **Backend (25 root + 4 trial_studio + 6 agents + 8 prompts + 4 scraper + 3 tests = 50 Python files)** | |
| - `app.py` — ZeroGPU Gradio 5.20 + FastAPI server entrypoint | |
| - `deploy_hf.py` — Automated deployment script for Hugging Face Spaces | |
| - `api_server.py` — Core FastAPI controller and route dispatcher | |
| - `pipeline_orchestrator.py` — 6-layer deterministic RAG controller | |
| - `actor_critic.py` — Actor-Critic Fine-Grained Process Reward Model | |
| - `evidence_processor.py` — Section 63 BSA electronic evidence & certification | |
| - `layer1_understanding.py` — Query understanding, Hindi HyDE, spaCy NER | |
| - `layer2_retrieval.py` — ChromaDB vector retrieval & Cross-Encoder (CPU) | |
| - `layer3_reasoning.py` — LLM response generation via Groq | |
| - `layer4_validation.py` — DeBERTa NLI & SC Struck-Down Firewall | |
| - `layer5_external.py` — IndianKanoon / DuckDuckGo live search fallback | |
| - `layer6_evaluator.py` — 25,000-character contract risk evaluation | |
| - `layer6_knowledge_graph.py` — Relational legal knowledge graph (NetworkX) | |
| - `interview_state.py` — Document drafting state machine & fallback spec engine | |
| - `document_generator.py` — 4-family .docx generation (Letter, Pleading, Affidavit, Agreement) | |
| - `dynamic_drafter.py` — Dynamic field scoping | |
| - `scrutiny_agent.py` — Pre-draft limitation and validity scrutiny | |
| - `discovery_agent.py` — Phase 1: 3-turn empathetic investigation | |
| - `strategy_agent.py` — Phase 2: SWOT matrix & 4-path generation | |
| - `irac_agent.py` — Advocate Mode IRAC structured brief generator | |
| - `triage_state.py` — 3-phase flow state machine | |
| - `database.py` — Supabase PostgreSQL + SQLite dual CRUD engine | |
| - `auth.py` — JWT authentication and bcrypt password hashing | |
| - `eval_pipeline.py` — Automated RAG benchmarking suite | |
| - `trial_studio/cross_examiner_agent.py` — Hostile Sec 146 BSA cross-examiner | |
| - `trial_studio/defense_fortifier_agent.py` — Corner Coach procedural objections | |
| - `trial_studio/precedent_engine.py` — 50,000+ landmark judgments index | |
| - `trial_studio/session_manager.py` — Moot court session persistence | |
| **Frontend (16 script + 6 CSS files)** | |
| - `App.jsx` — Core Omni-Box chat interface & session controller | |
| - `AuthPage.jsx` — JWT Login/Signup & guest session migration | |
| - `ConversationsSidebar.jsx` — Supabase cloud-synced conversation list | |
| - `TrialStudio.jsx` — Split-Chamber Pre-Trial Moot Court Arena | |
| - `EvidenceUploader.jsx` — Sec 63 BSA evidence uploader with hash verification | |
| - `TriageCards.jsx` — Strategic SWOT 4-path cards | |
| - `VetoCard.jsx` — Scrutiny blocker & limitation warning card | |
| - `BNSCorrectionNotice.jsx` — 2024 Transition notification banner | |
| - `JurisdictionBadge.jsx` — Court pecuniary & territorial indicator | |
| - `UrgencyBanner.jsx` — Statutory limitation countdown banner | |
| - `ApiKeyModal.jsx` — Bring-Your-Own-Key (BYOK) modal | |
| - `LegalGlossary.js` — 200+ Indian legal term dictionary | |
| - `usePDF.js` — Client-side jsPDF A4 vector rendering engine | |
| - `App.css`, `TrialStudio.css`, `EvidenceUploader.css` — Courtroom styling | |