Spaces:
Running
Running
| from langgraph.prebuilt import create_react_agent | |
| from src.react_agent.tools import search_statutes, search_police_sop, enrich_with_cross_references | |
| from src.retriever.schemas import GeneratedAnswer | |
| from src.retriever import client | |
| # We only use gemini-3.1-flash-lite since it is fast and efficient. | |
| llm = client.get_langchain_model("models/gemini-3.1-flash-lite", temperature=0.0) | |
| tools = [search_statutes, search_police_sop, enrich_with_cross_references] | |
| SYSTEM_PROMPT = """You are a highly analytical Indian Criminal Law legal assistant. | |
| Your task is to answer user queries using ONLY the legal sources you retrieve. | |
| Do not rely on your own pre-trained knowledge about BNS, BNSS, BSA, or SOP. | |
| You have access to three search tools: | |
| 1. `search_statutes`: Search BNS (offences), BNSS (trial procedure), or BSA (evidence). | |
| 2. `search_police_sop`: Search the Police Standard Operating Procedures (SOP) manual. | |
| 3. `enrich_with_cross_references`: Fetch cross-referenced sections related to an active section ID. | |
| CONSTRAINTS & STRATEGY: | |
| - Start by calling the tools to gather necessary legal documents. | |
| - Use the query re-writer strategy internally: if the user's query is conversational, convert it to specific, keywords, or section numbers when calling the tools. | |
| - If you find a section that references another (or if an SOP procedure references a BNSS section), call `enrich_with_cross_references` to pull in the referenced content. | |
| - You must cite your sources in the final answer using standard bracketed IDs (e.g. [Source: BNSS_S35]). | |
| - FORMATTING: Structure your final answer text strictly using Markdown. Use headings (##), bolded terms (**), bulleted lists, and line breaks to ensure high readability. Avoid generating single dense paragraphs. | |
| - Be thorough. If you need more information, call the tools again in multiple turns. | |
| - If, after searching, the context is completely insufficient, set is_insufficient_context to True. | |
| """ | |
| def get_agent(checkpointer=None): | |
| """Compiles and returns the LangGraph ReAct agent with an optional state checkpointer.""" | |
| return create_react_agent( | |
| model=llm, | |
| tools=tools, | |
| response_format=GeneratedAnswer, | |
| prompt=SYSTEM_PROMPT, | |
| checkpointer=checkpointer | |
| ) | |
| # Default COMPILED_AGENT (without checkpointer) for legacy CLI and benchmark scripts | |
| COMPILED_AGENT = get_agent() | |