Spaces:
Sleeping
Sleeping
File size: 5,433 Bytes
3ee0652 11a14d3 3ee0652 66042b6 564f8f0 11a14d3 3ee0652 564f8f0 11a14d3 42b1740 3ee0652 564f8f0 3ee0652 42b1740 3ee0652 564f8f0 3ee0652 42b1740 3ee0652 42b1740 564f8f0 11a14d3 3ee0652 42b1740 3ee0652 42b1740 3ee0652 8f46b95 42b1740 8f46b95 42b1740 8f46b95 42b1740 8f46b95 42b1740 8f46b95 42b1740 8f46b95 42b1740 564f8f0 8f46b95 564f8f0 3ee0652 42b1740 3ee0652 42b1740 8f46b95 3ee0652 564f8f0 42b1740 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
import os
import streamlit as st
from dotenv import load_dotenv
from langchain.schema import HumanMessage
from langchain_groq import ChatGroq
from langgraph.graph import StateGraph, START, END
from pydantic import BaseModel
from langsmith import traceable
import traceback
# β
Load API keys securely
load_dotenv()
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
LANGSMITH_API_KEY = os.getenv("LANGSMITH_API_KEY")
os.environ["GROQ_API_KEY"] = GROQ_API_KEY
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = LANGSMITH_API_KEY
# β
Initialize LLM (Using Groq Llama3-8B)
llm = ChatGroq(groq_api_key=GROQ_API_KEY, model_name="llama3-8b-8192")
# β
Define the LegalState Model
class LegalState(BaseModel):
original_text: str
tone: str
complexity: int = 1
rewritten_text: str = None
summary: str = None
key_clauses: str = None
risk_analysis: str = None
compliance_report: str = None
contract_suggestions: str = None
legal_arguments: str = None
formatted_text: str = None
comparison_result: str = None
final_report: str = None
# β
Function to invoke LLM with error handling
def generate_response(prompt):
try:
response = llm.invoke([HumanMessage(content=prompt)])
return response.content
except Exception as e:
return f"β Error: {str(e)}"
# β
Define Worker Functions
@traceable(name="Rewrite Legal Text")
def rewrite_text(state: LegalState):
prompt = f"""Rewrite this legal text in '{state.tone}' tone with complexity level {state.complexity}:
{state.original_text}"""
return {"rewritten_text": generate_response(prompt)}
@traceable(name="Summarize Legal Text")
def summarize_text(state: LegalState):
return {"summary": generate_response(f"Summarize this legal text:\n\n{state.rewritten_text}")}
@traceable(name="Extract Key Clauses")
def extract_clauses(state: LegalState):
return {"key_clauses": generate_response(f"Extract key legal clauses:\n\n{state.rewritten_text}")}
@traceable(name="Detect Risks in Document")
def detect_risks(state: LegalState):
return {"risk_analysis": generate_response(f"Analyze for risks:\n\n{state.rewritten_text}")}
@traceable(name="Check Compliance")
def check_compliance(state: LegalState):
return {"compliance_report": generate_response(f"Check legal compliance:\n\n{state.rewritten_text}")}
@traceable(name="Suggest Contract Improvements")
def suggest_improvements(state: LegalState):
return {"contract_suggestions": generate_response(f"Suggest improvements:\n\n{state.rewritten_text}")}
@traceable(name="Generate Legal Arguments")
def generate_arguments(state: LegalState):
return {"legal_arguments": generate_response(f"Generate legal arguments:\n\n{state.rewritten_text}")}
@traceable(name="Format Legal Document")
def format_document(state: LegalState):
return {"formatted_text": generate_response(f"Format this legal document:\n\n{state.rewritten_text}")}
@traceable(name="Compare Original vs Rewritten")
def compare_texts(state: LegalState):
prompt = f"Compare original vs rewritten:\n\nOriginal: {state.original_text}\nRewritten: {state.rewritten_text}"
return {"comparison_result": generate_response(prompt)}
# β
Build LangGraph Workflow
builder = StateGraph(LegalState)
builder.add_node("rewrite_text", rewrite_text)
builder.add_node("summarize_text", summarize_text)
builder.add_node("extract_clauses", extract_clauses)
builder.add_node("detect_risks", detect_risks)
builder.add_node("check_compliance", check_compliance)
builder.add_node("suggest_improvements", suggest_improvements)
builder.add_node("generate_arguments", generate_arguments)
builder.add_node("format_document", format_document)
builder.add_node("compare_texts", compare_texts)
builder.add_edge(START, "rewrite_text")
for node in ["summarize_text", "extract_clauses", "detect_risks", "check_compliance", "suggest_improvements", "generate_arguments", "format_document", "compare_texts"]:
builder.add_edge("rewrite_text", node)
graph = builder.compile()
# β
Streamlit UI
def main():
st.title("π AI-Powered Legal Text Processor")
st.write("A smart legal document assistant powered by LLMs.")
original_text = st.text_area("Enter Legal Text:")
tone = st.radio("Select Tone:", ["Formal", "Empathetic", "Neutral", "Strength-Based"])
if st.button("Process Text"):
input_data = {"original_text": original_text, "tone": tone, "complexity": 1}
result = graph.invoke(input_data)
st.subheader("πΉ Rewritten Text")
st.markdown(f"**{result['rewritten_text']}**")
st.subheader("π Summary")
st.write(result['summary'])
st.subheader("π Key Clauses")
st.write(result['key_clauses'])
st.subheader("β οΈ Risk Analysis")
st.write(result['risk_analysis'])
st.subheader("β
Compliance Report")
st.write(result['compliance_report'])
st.subheader("π‘ Contract Suggestions")
st.write(result['contract_suggestions'])
st.subheader("βοΈ Legal Arguments")
st.write(result['legal_arguments'])
st.subheader("π Formatted Legal Document")
st.write(result['formatted_text'])
st.subheader("π Comparison Result")
st.write(result['comparison_result'])
if __name__ == "__main__":
main()
|