Rivalcoder commited on
Commit
6d1f275
·
verified ·
1 Parent(s): 6ce5004

Update app/main.py

Browse files
Files changed (1) hide show
  1. app/main.py +31 -60
app/main.py CHANGED
@@ -2,11 +2,9 @@ from fastapi import FastAPI, File, UploadFile, HTTPException
2
  from fastapi.responses import JSONResponse
3
  import tempfile
4
  import os
5
- from typing import List
6
 
7
  # Import our services
8
  from app.services.text_extractor import extract_text_from_pdf
9
- from app.services.preprocessor import segment_into_clauses
10
  from app.services.risk_analyzer import analyze_clause_with_gemini
11
  from app.services.risk_scorer import calculate_scores, get_risk_definition
12
 
@@ -24,23 +22,18 @@ app = FastAPI(
24
  async def analyze_contract(file: UploadFile = File(...)):
25
  """
26
  Analyze a legal contract PDF and return detailed risk analysis.
27
-
28
  Args:
29
  file: PDF file to analyze
30
-
31
  Returns:
32
  AnalysisReport with risk analysis and suggestions
33
  """
34
 
35
- # Validate file type
36
  if not file.filename.lower().endswith('.pdf'):
37
  raise HTTPException(
38
  status_code=400, detail="Only PDF files are supported")
39
 
40
- # Create temporary file to store uploaded PDF
41
  with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as temp_file:
42
  try:
43
- # Write uploaded file to temporary file
44
  content = await file.read()
45
  temp_file.write(content)
46
  temp_file.flush()
@@ -55,58 +48,39 @@ async def analyze_contract(file: UploadFile = File(...)):
55
  detail="Unable to extract meaningful text from PDF. Please ensure the PDF is readable."
56
  )
57
 
58
- # Step 2: Segment text into clauses
59
- print("Segmenting text into clauses...")
60
- clauses = segment_into_clauses(full_text)
61
-
62
- if not clauses:
63
- raise HTTPException(
64
- status_code=400,
65
- detail="Unable to identify contract clauses. Please ensure the document is a valid contract."
66
- )
67
-
68
- # Step 3: Analyze each clause with Gemini AI
69
- print(f"Analyzing {len(clauses)} clauses with AI...")
70
- analyzed_clauses = []
71
-
72
- for i, clause_text in enumerate(clauses, 1):
73
- print(f"Analyzing clause {i}/{len(clauses)}...")
74
-
75
- # Get AI analysis
76
- ai_result = analyze_clause_with_gemini(clause_text)
77
-
78
- # Convert AI results to RiskFinding objects
79
- risks = []
80
- for risk_data in ai_result.get("risks", []):
81
- risk_id = risk_data.get("risk_id")
82
- if risk_id:
83
- risk_def = get_risk_definition(risk_id)
84
- risk_finding = RiskFinding(
85
- risk_id=risk_id,
86
- description=risk_data.get(
87
- "explanation", risk_def["description"]),
88
- score=risk_def["score"]
89
- )
90
- risks.append(risk_finding)
91
-
92
- # Create AnalyzedClause object
93
- analyzed_clause = AnalyzedClause(
94
- clause_number=i,
95
- # Truncate for response
96
- text=clause_text[:500] +
97
- "..." if len(clause_text) > 500 else clause_text,
98
- risks=risks,
99
- suggestion=ai_result.get("suggestion")
100
- )
101
- analyzed_clauses.append(analyzed_clause)
102
 
103
- # Step 4: Calculate final risk score
104
  print("Calculating final risk score...")
105
- final_score, all_findings = calculate_scores(analyzed_clauses)
106
 
107
- # Step 5: Determine contract type and language (basic detection)
108
- contract_type = "General Contract" # Could be enhanced with AI detection
109
- language = "English" # Could be enhanced with language detection
110
 
111
  # Create final analysis report
112
  analysis_report = AnalysisReport(
@@ -114,7 +88,7 @@ async def analyze_contract(file: UploadFile = File(...)):
114
  language=language,
115
  contract_type=contract_type,
116
  final_risk_score=final_score,
117
- clauses=analyzed_clauses
118
  )
119
 
120
  print(f"Analysis complete. Final risk score: {final_score}")
@@ -129,7 +103,6 @@ async def analyze_contract(file: UploadFile = File(...)):
129
  detail=f"Analysis failed: {str(e)}"
130
  )
131
  finally:
132
- # Clean up temporary file
133
  try:
134
  os.unlink(temp_file.name)
135
  except:
@@ -138,13 +111,11 @@ async def analyze_contract(file: UploadFile = File(...)):
138
 
139
  @app.get("/")
140
  async def root():
141
- """Health check endpoint"""
142
  return {"message": "Multilingual Legal Contract Analyzer API is running"}
143
 
144
 
145
  @app.get("/health")
146
  async def health_check():
147
- """Health check endpoint"""
148
  return {"status": "healthy", "service": "contract-analyzer"}
149
 
150
 
 
2
  from fastapi.responses import JSONResponse
3
  import tempfile
4
  import os
 
5
 
6
  # Import our services
7
  from app.services.text_extractor import extract_text_from_pdf
 
8
  from app.services.risk_analyzer import analyze_clause_with_gemini
9
  from app.services.risk_scorer import calculate_scores, get_risk_definition
10
 
 
22
  async def analyze_contract(file: UploadFile = File(...)):
23
  """
24
  Analyze a legal contract PDF and return detailed risk analysis.
 
25
  Args:
26
  file: PDF file to analyze
 
27
  Returns:
28
  AnalysisReport with risk analysis and suggestions
29
  """
30
 
 
31
  if not file.filename.lower().endswith('.pdf'):
32
  raise HTTPException(
33
  status_code=400, detail="Only PDF files are supported")
34
 
 
35
  with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as temp_file:
36
  try:
 
37
  content = await file.read()
38
  temp_file.write(content)
39
  temp_file.flush()
 
48
  detail="Unable to extract meaningful text from PDF. Please ensure the PDF is readable."
49
  )
50
 
51
+ # Step 2 removed directly analyze full contract
52
+ print("Analyzing full contract with AI...")
53
+ ai_result = analyze_clause_with_gemini(full_text)
54
+
55
+ # Build findings list
56
+ risks = []
57
+ for risk_data in ai_result.get("risks", []):
58
+ risk_id = risk_data.get("risk_id")
59
+ if risk_id:
60
+ risk_def = get_risk_definition(risk_id)
61
+ risk_finding = RiskFinding(
62
+ risk_id=risk_id,
63
+ description=risk_data.get(
64
+ "explanation", risk_def["description"]),
65
+ score=risk_def["score"]
66
+ )
67
+ risks.append(risk_finding)
68
+
69
+ # Wrap into single "clause" (actually full contract text)
70
+ analyzed_clause = AnalyzedClause(
71
+ clause_number=1,
72
+ text=full_text[:500] + "..." if len(full_text) > 500 else full_text,
73
+ risks=risks,
74
+ suggestion=ai_result.get("suggestion")
75
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
 
77
+ # Step 3: Calculate final risk score
78
  print("Calculating final risk score...")
79
+ final_score, all_findings = calculate_scores([analyzed_clause])
80
 
81
+ # Step 4: Contract metadata (basic detection)
82
+ contract_type = "General Contract"
83
+ language = "English"
84
 
85
  # Create final analysis report
86
  analysis_report = AnalysisReport(
 
88
  language=language,
89
  contract_type=contract_type,
90
  final_risk_score=final_score,
91
+ clauses=[analyzed_clause]
92
  )
93
 
94
  print(f"Analysis complete. Final risk score: {final_score}")
 
103
  detail=f"Analysis failed: {str(e)}"
104
  )
105
  finally:
 
106
  try:
107
  os.unlink(temp_file.name)
108
  except:
 
111
 
112
  @app.get("/")
113
  async def root():
 
114
  return {"message": "Multilingual Legal Contract Analyzer API is running"}
115
 
116
 
117
  @app.get("/health")
118
  async def health_check():
 
119
  return {"status": "healthy", "service": "contract-analyzer"}
120
 
121