prasannahf commited on
Commit
564f8f0
Β·
verified Β·
1 Parent(s): 8f46b95

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -69
app.py CHANGED
@@ -8,21 +8,23 @@ from pydantic import BaseModel
8
  from langsmith import traceable
9
  import traceback
10
 
11
- # Load API keys from environment
12
  load_dotenv()
13
  GROQ_API_KEY = os.getenv("GROQ_API_KEY")
14
  LANGSMITH_API_KEY = os.getenv("LANGSMITH_API_KEY")
 
 
 
15
  os.environ["LANGCHAIN_TRACING_V2"] = "true"
16
  os.environ["LANGCHAIN_API_KEY"] = LANGSMITH_API_KEY
17
 
18
- # Initialize LLM
19
  llm = ChatGroq(groq_api_key=GROQ_API_KEY, model_name="llama3-8b-8192")
20
 
21
- # Define State Model
22
  class LegalState(BaseModel):
23
  original_text: str
24
  tone: str
25
- complexity: int = 1
26
  rewritten_text: str = None
27
  summary: str = None
28
  key_clauses: str = None
@@ -34,7 +36,7 @@ class LegalState(BaseModel):
34
  comparison_result: str = None
35
  final_report: str = None
36
 
37
- # Function to call LLM
38
  def generate_response(prompt):
39
  try:
40
  response = llm.invoke([HumanMessage(content=prompt)])
@@ -42,113 +44,87 @@ def generate_response(prompt):
42
  except Exception as e:
43
  return f"❌ Error: {str(e)}"
44
 
45
- # Define Workflow Functions
46
  @traceable(name="Rewrite Legal Text")
47
  def rewrite_text(state: LegalState):
48
- prompt = f"""Rewrite this legal text in '{state.tone}' tone with complexity level {state.complexity}:
 
49
  {state.original_text}"""
50
  return {"rewritten_text": generate_response(prompt)}
51
 
52
  @traceable(name="Summarize Legal Text")
53
  def summarize_text(state: LegalState):
54
- return {"summary": generate_response(f"Summarize this legal text:\n\n{state.rewritten_text}")}
55
 
56
  @traceable(name="Extract Key Clauses")
57
  def extract_clauses(state: LegalState):
58
- return {"key_clauses": generate_response(f"Extract key legal clauses:\n\n{state.rewritten_text}")}
59
 
60
  @traceable(name="Detect Risks in Document")
61
  def detect_risks(state: LegalState):
62
- return {"risk_analysis": generate_response(f"Analyze for risks:\n\n{state.rewritten_text}")}
63
 
64
  @traceable(name="Check Compliance")
65
  def check_compliance(state: LegalState):
66
- return {"compliance_report": generate_response(f"Check legal compliance:\n\n{state.rewritten_text}")}
67
 
68
  @traceable(name="Suggest Contract Improvements")
69
  def suggest_improvements(state: LegalState):
70
- return {"contract_suggestions": generate_response(f"Suggest improvements:\n\n{state.rewritten_text}")}
71
 
72
  @traceable(name="Generate Legal Arguments")
73
  def generate_arguments(state: LegalState):
74
- return {"legal_arguments": generate_response(f"Generate legal arguments:\n\n{state.rewritten_text}")}
75
 
76
  @traceable(name="Format Legal Document")
77
  def format_document(state: LegalState):
78
- return {"formatted_text": generate_response(f"Format this legal document:\n\n{state.rewritten_text}")}
79
 
80
  @traceable(name="Compare Original vs Rewritten")
81
  def compare_texts(state: LegalState):
82
- return {"comparison_result": generate_response(f"Compare original vs rewritten:\n\nOriginal: {state.original_text}\nRewritten: {state.rewritten_text}")}
 
83
 
84
  @traceable(name="Final Synthesis")
85
  def synthesizer(state: LegalState):
86
  final_output = f"""
87
- πŸ“œ **Legal Document Processing Report** πŸ“œ
88
-
89
- **Rewritten Legal Text:**
90
- {state.rewritten_text}
91
-
92
- **Summary:**
93
- {state.summary}
94
-
95
- **Key Clauses:**
96
- {state.key_clauses}
97
-
98
- **Risk Analysis:**
99
- {state.risk_analysis}
100
-
101
- **Compliance Report:**
102
- {state.compliance_report}
103
-
104
- **Contract Suggestions:**
105
- {state.contract_suggestions}
106
-
107
- **Legal Arguments:**
108
- {state.legal_arguments}
109
-
110
- **Formatted Document:**
111
- {state.formatted_text}
112
-
113
- **Comparison:**
114
- {state.comparison_result}
115
  """
116
  return {"final_report": final_output}
117
 
118
- # Build LangGraph Workflow
119
  builder = StateGraph(LegalState)
120
- builder.add_node("rewrite_text", rewrite_text)
121
- builder.add_node("summarize_text", summarize_text)
122
- builder.add_node("extract_clauses", extract_clauses)
123
- builder.add_node("detect_risks", detect_risks)
124
- builder.add_node("check_compliance", check_compliance)
125
- builder.add_node("suggest_improvements", suggest_improvements)
126
- builder.add_node("generate_arguments", generate_arguments)
127
- builder.add_node("format_document", format_document)
128
- builder.add_node("compare_texts", compare_texts)
129
- builder.add_node("synthesizer", synthesizer)
130
 
 
 
 
 
 
 
131
  builder.add_edge(START, "rewrite_text")
132
- for node in ["summarize_text", "extract_clauses", "detect_risks", "check_compliance", "suggest_improvements", "generate_arguments", "format_document", "compare_texts"]:
133
  builder.add_edge("rewrite_text", node)
134
  builder.add_edge(node, "synthesizer")
135
  builder.add_edge("synthesizer", END)
136
 
137
  graph = builder.compile()
138
 
139
- # Streamlit UI
140
  st.title("πŸ“œ AI-Powered Legal Text Processor")
141
- text_input = st.text_area("Enter Legal Text")
142
- tone_selection = st.radio("Select Tone", ["Formal", "Empathetic", "Neutral", "Strength-Based"])
143
  if st.button("Rewrite Text"):
144
- output = graph.invoke({"original_text": text_input, "tone": tone_selection, "complexity": 1})
145
- st.session_state["output"] = output
146
- st.session_state["regenerate"] = True
147
- if "regenerate" in st.session_state and st.session_state["regenerate"]:
148
- if st.button("Regenerate Text"):
149
- output = graph.invoke({"original_text": text_input, "tone": tone_selection, "complexity": 1})
150
- st.session_state["output"] = output
151
- if "output" in st.session_state:
152
- for key, value in st.session_state["output"].items():
153
- st.markdown(f"**{key.replace('_', ' ').title()}**:")
154
- st.write(value)
 
8
  from langsmith import traceable
9
  import traceback
10
 
11
+ # βœ… Load API keys securely
12
  load_dotenv()
13
  GROQ_API_KEY = os.getenv("GROQ_API_KEY")
14
  LANGSMITH_API_KEY = os.getenv("LANGSMITH_API_KEY")
15
+
16
+ # βœ… Set API keys as environment variables
17
+ os.environ["GROQ_API_KEY"] = GROQ_API_KEY
18
  os.environ["LANGCHAIN_TRACING_V2"] = "true"
19
  os.environ["LANGCHAIN_API_KEY"] = LANGSMITH_API_KEY
20
 
21
+ # βœ… Initialize Open-Source LLM
22
  llm = ChatGroq(groq_api_key=GROQ_API_KEY, model_name="llama3-8b-8192")
23
 
24
+ # βœ… Define the LegalState Model
25
  class LegalState(BaseModel):
26
  original_text: str
27
  tone: str
 
28
  rewritten_text: str = None
29
  summary: str = None
30
  key_clauses: str = None
 
36
  comparison_result: str = None
37
  final_report: str = None
38
 
39
+ # βœ… Function to invoke LLM with error handling
40
  def generate_response(prompt):
41
  try:
42
  response = llm.invoke([HumanMessage(content=prompt)])
 
44
  except Exception as e:
45
  return f"❌ Error: {str(e)}"
46
 
47
+ # βœ… Define Worker Functions with LangSmith Debugging
48
  @traceable(name="Rewrite Legal Text")
49
  def rewrite_text(state: LegalState):
50
+ prompt = f"""**Rewrite this legal text in '{state.tone}' tone:**
51
+
52
  {state.original_text}"""
53
  return {"rewritten_text": generate_response(prompt)}
54
 
55
  @traceable(name="Summarize Legal Text")
56
  def summarize_text(state: LegalState):
57
+ return {"summary": generate_response(f"**Summary:**\n\n{state.rewritten_text}")}
58
 
59
  @traceable(name="Extract Key Clauses")
60
  def extract_clauses(state: LegalState):
61
+ return {"key_clauses": generate_response(f"**Key Clauses:**\n\n{state.rewritten_text}")}
62
 
63
  @traceable(name="Detect Risks in Document")
64
  def detect_risks(state: LegalState):
65
+ return {"risk_analysis": generate_response(f"**Risk Analysis:**\n\n{state.rewritten_text}")}
66
 
67
  @traceable(name="Check Compliance")
68
  def check_compliance(state: LegalState):
69
+ return {"compliance_report": generate_response(f"**Compliance Report:**\n\n{state.rewritten_text}")}
70
 
71
  @traceable(name="Suggest Contract Improvements")
72
  def suggest_improvements(state: LegalState):
73
+ return {"contract_suggestions": generate_response(f"**Contract Improvement Suggestions:**\n\n{state.rewritten_text}")}
74
 
75
  @traceable(name="Generate Legal Arguments")
76
  def generate_arguments(state: LegalState):
77
+ return {"legal_arguments": generate_response(f"**Legal Arguments:**\n\n{state.rewritten_text}")}
78
 
79
  @traceable(name="Format Legal Document")
80
  def format_document(state: LegalState):
81
+ return {"formatted_text": generate_response(f"**Formatted Legal Document:**\n\n{state.rewritten_text}")}
82
 
83
  @traceable(name="Compare Original vs Rewritten")
84
  def compare_texts(state: LegalState):
85
+ prompt = f"**Comparison:**\n\nOriginal: {state.original_text}\nRewritten: {state.rewritten_text}"
86
+ return {"comparison_result": generate_response(prompt)}
87
 
88
  @traceable(name="Final Synthesis")
89
  def synthesizer(state: LegalState):
90
  final_output = f"""
91
+ πŸ“œ **AI-Powered Legal Document Processing Report** πŸ“œ
92
+
93
+ **πŸ”Ή Rewritten Legal Text:**\n{state.rewritten_text}
94
+ **πŸ”Ή Summary:**\n{state.summary}
95
+ **πŸ”Ή Key Clauses Identified:**\n{state.key_clauses}
96
+ **πŸ”Ή Risk Analysis Report:**\n{state.risk_analysis}
97
+ **πŸ”Ή Compliance Check Results:**\n{state.compliance_report}
98
+ **πŸ”Ή Contract Improvement Suggestions:**\n{state.contract_suggestions}
99
+ **πŸ”Ή AI-Generated Legal Arguments:**\n{state.legal_arguments}
100
+ **πŸ”Ή Text Formatting Enhancements:**\n{state.formatted_text}
101
+ **πŸ”Ή Differences from Original Text:**\n{state.comparison_result}
102
+ **βœ… AI Final Verdict:**\nThis document has been reviewed and processed with key legal enhancements.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  """
104
  return {"final_report": final_output}
105
 
106
+ # βœ… Build LangGraph Workflow
107
  builder = StateGraph(LegalState)
 
 
 
 
 
 
 
 
 
 
108
 
109
+ # βœ… Add Nodes
110
+ nodes = ["rewrite_text", "summarize_text", "extract_clauses", "detect_risks", "check_compliance", "suggest_improvements", "generate_arguments", "format_document", "compare_texts", "synthesizer"]
111
+ for node in nodes:
112
+ builder.add_node(node, globals()[node])
113
+
114
+ # βœ… Define Execution Order
115
  builder.add_edge(START, "rewrite_text")
116
+ for node in nodes[:-1]:
117
  builder.add_edge("rewrite_text", node)
118
  builder.add_edge(node, "synthesizer")
119
  builder.add_edge("synthesizer", END)
120
 
121
  graph = builder.compile()
122
 
123
+ # βœ… Streamlit UI
124
  st.title("πŸ“œ AI-Powered Legal Text Processor")
125
+ original_text = st.text_area("Enter Legal Text")
126
+ tone = st.selectbox("Select Tone", ["Formal", "Empathetic", "Neutral", "Strength-Based"])
127
  if st.button("Rewrite Text"):
128
+ result = graph.invoke({"original_text": original_text, "tone": tone})
129
+ for key, value in result.items():
130
+ st.markdown(f"**{key.replace('_', ' ').title()}:**\n{value}")