Prediction / predictor.py
Rivalcoder
Use of Playright
fbf4182
raw
history blame
4.05 kB
from kanon_api import search_cases, get_case_content # now async versions
from vectorstore import create_vector_store
from google import genai
import os
import re
import json
import asyncio
client = genai.Client(api_key=os.getenv("GOOGLE_API_KEY"))
async def predict_outcome(user_case: str):
"""
Predict likely case outcome using AI based on related past cases.
"""
# 1️⃣ Generate legal search query
search_prompt = f"""
You are an expert Indian legal AI assistant.
Given these case facts, generate a precise **search query** suitable for finding relevant Indian legal cases on a legal database like Indian Kanoon.
Case facts:
{user_case}
Requirements:
- Output **only one line** in natural language.
- Include **relevant Indian laws, sections, or keywords** if applicable.
- Make it precise for legal search; do **not** use generic phrases.
- Return **only the query**, nothing else, no explanation.
- DOnt Give Output This " Some " or " .." Like That DOnt Give In response only one best Line Match the Case To Give Only One
Example output:
"Liability for defective vehicles and accident compensation."
"About compensation for deaths and injuries due to a road accident caused by a vehicle defect"
"""
search_chat = client.chats.create(model="gemini-2.5-flash-lite")
query_response = search_chat.send_message(search_prompt)
query = query_response.text.strip().replace("\n", " ").strip('"').strip("'")
print("Generated legal search query:", query)
# 2️⃣ Search related cases (async)
related_cases_data = await search_cases(query, max_results=10)
# 3️⃣ Fetch full text for each result concurrently
tasks = [get_case_content(case["url"]) for case in related_cases_data]
texts = await asyncio.gather(*tasks)
for case, text in zip(related_cases_data, texts):
case["text"] = text
related_cases_texts = [case["text"] for case in related_cases_data if case.get("text")]
if not related_cases_texts:
return {"error": "No relevant cases found to analyze."}
# 4️⃣ Create vector store
vectorstore = create_vector_store(related_cases_texts)
if not vectorstore:
return {"error": "Vector store creation failed."}
# 5️⃣ Retrieve relevant cases
retriever = vectorstore.as_retriever()
relevant_docs = retriever.invoke(user_case)
combined_text = "\n".join([d.page_content for d in relevant_docs])
if not combined_text.strip():
return {"error": "No relevant context could be found from retrieved cases."}
# 6️⃣ Generate final prediction
prompt = f"""
You are an expert Indian legal AI assistant.
User case facts:
{user_case}
Consider these previous cases:
{combined_text}
Return the output strictly as JSON with the following keys:
- "probability": estimated percentage chance of winning the case (number between 0-100)
- "timeline": approximate duration or end period of the case based on similar past cases
- "feature_points": list of key points favoring win/loss and any major influencing factors
Example JSON:
{{
"probability": 75,
"timeline": "6-12 months",
"feature_points": [
"Plaintiff has strong documentary evidence",
"Defendant has prior similar case loss",
"Possible delay due to procedural issues"
]
}}
Do **not** include any explanation outside the JSON.
"""
chat = client.chats.create(model="gemini-2.0-flash-exp")
response = chat.send_message(prompt)
raw_text = response.text.strip()
# Clean ```json``` or wrapping quotes
raw_text = re.sub(r"^```json\s*|^```|```$", "", raw_text, flags=re.IGNORECASE).strip()
if (raw_text.startswith('"') and raw_text.endswith('"')) or (raw_text.startswith("'") and raw_text.endswith("'")):
raw_text = raw_text[1:-1].strip().replace('\\"', '"').replace("\\'", "'")
# Parse JSON
try:
result_json = json.loads(raw_text)
except json.JSONDecodeError:
result_json = {"error": "AI did not return valid JSON", "raw_response": raw_text}
return result_json