|
import gradio as gr |
|
import asyncio |
|
from datetime import datetime |
|
from specter_legal_assistant.rag_manager import rag_manager |
|
from specter_legal_assistant.config import settings |
|
from specter_legal_assistant.utils import format_response_for_gradio |
|
from pathlib import Path |
|
import json |
|
|
|
async def legal_query(query: str, language: str = "english") -> str: |
|
"""Handle legal queries through RAG system""" |
|
try: |
|
if not query.strip(): |
|
return "Please enter a legal question." |
|
|
|
|
|
context = rag_manager.get_relevant_context(query, k=3) |
|
|
|
|
|
prompt = f"""You are a helpful legal assistant providing clear, practical advice about Indian law. Provide a natural, empathetic response that directly addresses their specific situation.\n\nUser's Question: {query}\n\nLegal Information:\n{context}\n\nProvide a clear, practical response that explains their legal options and applicable laws in natural language.""" |
|
|
|
|
|
from specter_legal_assistant import groq_client |
|
response = groq_client.chat.completions.create( |
|
model="llama-3.3-70b-versatile", |
|
messages=[ |
|
{"role": "system", "content": "You are a helpful legal assistant that provides clear, accurate information about Indian law."}, |
|
{"role": "user", "content": prompt} |
|
], |
|
max_tokens=500, |
|
temperature=0.7, |
|
) |
|
|
|
result = response.choices[0].message.content |
|
return format_response_for_gradio(result) |
|
except Exception as e: |
|
return f"I apologize, but I encountered an error while processing your request. Please try again or rephrase your question." |
|
|
|
def generate_fir(name: str, location: str, details: str) -> str: |
|
"""Generate FIR document""" |
|
try: |
|
from specter_legal_assistant import generate_fir_pdf |
|
filename = generate_fir_pdf(name, location, details) |
|
file_path = Path("static") / filename |
|
return str(file_path.absolute()) |
|
except Exception as e: |
|
return f"Error generating FIR: {str(e)}" |
|
|
|
def generate_rental_agreement(landlord_name: str, tenant_name: str, property_address: str, |
|
rent_amount: float, security_deposit: float, |
|
lease_start_date: str, lease_end_date: str, |
|
terms_and_conditions: str) -> str: |
|
"""Generate Rental Agreement document""" |
|
try: |
|
from specter_legal_assistant import RentalAgreementData, generate_rental_agreement |
|
data = RentalAgreementData( |
|
landlord_name=landlord_name, |
|
tenant_name=tenant_name, |
|
property_address=property_address, |
|
rent_amount=rent_amount, |
|
security_deposit=security_deposit, |
|
lease_start_date=lease_start_date, |
|
lease_end_date=lease_end_date, |
|
terms_and_conditions=terms_and_conditions |
|
) |
|
filename = generate_rental_agreement(data) |
|
file_path = Path("static") / filename |
|
return str(file_path.absolute()) |
|
except Exception as e: |
|
return f"Error generating Rental Agreement: {str(e)}" |
|
|
|
def generate_consumer_complaint(complainant_name: str, complainant_address: str, |
|
complainant_contact: str, company_name: str, |
|
company_address: str, product_service_details: str, |
|
complaint_details: str, desired_resolution: str) -> str: |
|
"""Generate Consumer Complaint document""" |
|
try: |
|
from specter_legal_assistant import ConsumerComplaintData, generate_consumer_complaint |
|
data = ConsumerComplaintData( |
|
complainant_name=complainant_name, |
|
complainant_address=complainant_address, |
|
complainant_contact=complainant_contact, |
|
company_name=company_name, |
|
company_address=company_address, |
|
product_service_details=product_service_details, |
|
complaint_details=complaint_details, |
|
desired_resolution=desired_resolution |
|
) |
|
filename = generate_consumer_complaint(data) |
|
file_path = Path("static") / filename |
|
return str(file_path.absolute()) |
|
except Exception as e: |
|
return f"Error generating Consumer Complaint: {str(e)}" |
|
|
|
def create_gradio_interface(): |
|
|
|
with gr.Blocks( |
|
title="Legal Assistant AI", |
|
theme=gr.themes.Soft(), |
|
css=""" |
|
.gradio-container { |
|
max-width: 1200px !important; |
|
margin: auto !important; |
|
} |
|
.main-header { |
|
text-align: center; |
|
padding: 20px; |
|
background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); |
|
color: white; |
|
border-radius: 10px; |
|
margin-bottom: 20px; |
|
} |
|
""" |
|
) as interface: |
|
|
|
|
|
gr.HTML(""" |
|
<div class="main-header"> |
|
<h1>ποΈ Legal Assistant AI</h1> |
|
<p>Get instant legal advice and generate legal documents for Indian law</p> |
|
</div> |
|
""") |
|
|
|
with gr.Tabs(): |
|
|
|
with gr.Tab("π€ Ask Legal Questions"): |
|
with gr.Row(): |
|
with gr.Column(scale=2): |
|
query_input = gr.Textbox( |
|
label="Enter your legal question", |
|
lines=4, |
|
placeholder="Example: What are my rights if I'm arrested by the police?" |
|
) |
|
language_dropdown = gr.Dropdown( |
|
choices=["english", "hindi"], |
|
value="english", |
|
label="Language" |
|
) |
|
query_button = gr.Button("Get Legal Advice", variant="primary", size="lg") |
|
with gr.Column(scale=1): |
|
gr.Markdown(""" |
|
### π‘ Tips for better responses: |
|
- Be specific about your situation |
|
- Mention relevant details (location, circumstances) |
|
- Ask about specific laws or procedures |
|
- Include any relevant dates or events |
|
""") |
|
|
|
query_output = gr.Textbox( |
|
label="Legal Advice", |
|
lines=8, |
|
interactive=False, |
|
show_copy_button=True |
|
) |
|
|
|
query_button.click( |
|
fn=lambda q, l: asyncio.run(legal_query(q, l)), |
|
inputs=[query_input, language_dropdown], |
|
outputs=query_output |
|
) |
|
|
|
|
|
with gr.Tab("π Generate FIR"): |
|
with gr.Row(): |
|
with gr.Column(scale=2): |
|
gr.Markdown("### First Information Report (FIR) Generator") |
|
fir_name = gr.Textbox( |
|
label="Your Full Name", |
|
placeholder="Enter your complete name" |
|
) |
|
fir_location = gr.Textbox( |
|
label="Location of Incident", |
|
placeholder="Where did the incident occur?" |
|
) |
|
fir_details = gr.Textbox( |
|
label="Incident Details", |
|
lines=4, |
|
placeholder="Describe what happened in detail..." |
|
) |
|
fir_button = gr.Button("Generate FIR Document", variant="primary") |
|
with gr.Column(scale=1): |
|
gr.Markdown(""" |
|
### π FIR Information: |
|
- Used to report criminal offenses |
|
- Filed at the nearest police station |
|
- Required for legal proceedings |
|
- Contains complainant and incident details |
|
""") |
|
|
|
fir_output = gr.File(label="Download Generated FIR", file_count="single") |
|
fir_button.click( |
|
fn=generate_fir, |
|
inputs=[fir_name, fir_location, fir_details], |
|
outputs=fir_output |
|
) |
|
|
|
|
|
with gr.Tab("π Rental Agreement"): |
|
with gr.Row(): |
|
with gr.Column(scale=2): |
|
gr.Markdown("### Rental Agreement Generator") |
|
landlord_name = gr.Textbox(label="Landlord Name", placeholder="Enter landlord's full name") |
|
tenant_name = gr.Textbox(label="Tenant Name", placeholder="Enter tenant's full name") |
|
property_address = gr.Textbox( |
|
label="Property Address", |
|
lines=2, |
|
placeholder="Complete address of the rental property" |
|
) |
|
rent_amount = gr.Number(label="Monthly Rent Amount (βΉ)", precision=2) |
|
security_deposit = gr.Number(label="Security Deposit Amount (βΉ)", precision=2) |
|
lease_start = gr.Textbox(label="Lease Start Date (DD-MM-YYYY)", placeholder="01-01-2024") |
|
lease_end = gr.Textbox(label="Lease End Date (DD-MM-YYYY)", placeholder="31-12-2024") |
|
terms = gr.Textbox( |
|
label="Terms and Conditions", |
|
lines=3, |
|
placeholder="Additional terms and conditions..." |
|
) |
|
rental_button = gr.Button("Generate Rental Agreement", variant="primary") |
|
with gr.Column(scale=1): |
|
gr.Markdown(""" |
|
### π Rental Agreement Info: |
|
- Legal contract between landlord and tenant |
|
- Defines rent, deposit, and lease terms |
|
- Protects both parties' rights |
|
- Required for rental disputes |
|
""") |
|
|
|
rental_output = gr.File(label="Download Rental Agreement", file_count="single") |
|
rental_button.click( |
|
fn=generate_rental_agreement, |
|
inputs=[landlord_name, tenant_name, property_address, |
|
rent_amount, security_deposit, lease_start, |
|
lease_end, terms], |
|
outputs=rental_output |
|
) |
|
|
|
|
|
with gr.Tab("π Consumer Complaint"): |
|
with gr.Row(): |
|
with gr.Column(scale=2): |
|
gr.Markdown("### Consumer Complaint Generator") |
|
comp_name = gr.Textbox(label="Your Name", placeholder="Enter your full name") |
|
comp_address = gr.Textbox( |
|
label="Your Address", |
|
lines=2, |
|
placeholder="Your complete address" |
|
) |
|
comp_contact = gr.Textbox(label="Your Contact Number", placeholder="+91-XXXXXXXXXX") |
|
company_name = gr.Textbox(label="Company Name", placeholder="Name of the company you're complaining against") |
|
company_addr = gr.Textbox( |
|
label="Company Address", |
|
lines=2, |
|
placeholder="Company's address" |
|
) |
|
product_details = gr.Textbox(label="Product/Service Details", placeholder="What product or service are you complaining about?") |
|
complaint_details = gr.Textbox( |
|
label="Complaint Details", |
|
lines=3, |
|
placeholder="Describe your complaint in detail..." |
|
) |
|
resolution = gr.Textbox( |
|
label="Desired Resolution", |
|
lines=2, |
|
placeholder="What resolution do you want?" |
|
) |
|
complaint_button = gr.Button("Generate Consumer Complaint", variant="primary") |
|
with gr.Column(scale=1): |
|
gr.Markdown(""" |
|
### π‘οΈ Consumer Rights: |
|
- Right to safety and quality |
|
- Right to information |
|
- Right to choose |
|
- Right to redressal |
|
- Right to be heard |
|
""") |
|
|
|
complaint_output = gr.File(label="Download Consumer Complaint", file_count="single") |
|
complaint_button.click( |
|
fn=generate_consumer_complaint, |
|
inputs=[comp_name, comp_address, comp_contact, |
|
company_name, company_addr, product_details, |
|
complaint_details, resolution], |
|
outputs=complaint_output |
|
) |
|
|
|
return interface |
|
|
|
if __name__ == "__main__": |
|
interface = create_gradio_interface() |
|
interface.launch( |
|
server_name=settings.GRADIO_SERVER_NAME, |
|
server_port=settings.GRADIO_SERVER_PORT, |
|
share=settings.GRADIO_SHARE |
|
) |
|
|