Spaces:
Sleeping
Sleeping
Sobroinc
commited on
Commit
·
0d9a2a1
1
Parent(s):
29cc5f9
Fix Vercel deployment - remove torch dependency, use lightweight version
Browse files- api/index.py +1 -1
- main_vercel.py +107 -0
- requirements-full.txt +31 -0
- requirements-vercel.txt +0 -9
- requirements.txt +2 -24
- vercel.json +4 -4
api/index.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
from
|
2 |
|
3 |
# Vercel serverless function handler
|
4 |
def handler(request, context):
|
|
|
1 |
+
from main_vercel import app as application
|
2 |
|
3 |
# Vercel serverless function handler
|
4 |
def handler(request, context):
|
main_vercel.py
ADDED
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastapi import FastAPI, HTTPException
|
2 |
+
from fastapi.middleware.cors import CORSMiddleware
|
3 |
+
from pydantic import BaseModel
|
4 |
+
from typing import Optional, List, Dict
|
5 |
+
import json
|
6 |
+
|
7 |
+
app = FastAPI(
|
8 |
+
title="SobroJuriBert API",
|
9 |
+
description="Legal text analysis service (Vercel deployment)",
|
10 |
+
version="1.0.0"
|
11 |
+
)
|
12 |
+
|
13 |
+
# CORS middleware
|
14 |
+
app.add_middleware(
|
15 |
+
CORSMiddleware,
|
16 |
+
allow_origins=["*"],
|
17 |
+
allow_credentials=True,
|
18 |
+
allow_methods=["*"],
|
19 |
+
allow_headers=["*"],
|
20 |
+
)
|
21 |
+
|
22 |
+
class AnalysisRequest(BaseModel):
|
23 |
+
text: str
|
24 |
+
analysis_type: Optional[str] = "full"
|
25 |
+
|
26 |
+
class AnalysisResponse(BaseModel):
|
27 |
+
text: str
|
28 |
+
analysis_type: str
|
29 |
+
results: Dict
|
30 |
+
status: str = "success"
|
31 |
+
|
32 |
+
@app.get("/")
|
33 |
+
async def root():
|
34 |
+
return {
|
35 |
+
"name": "SobroJuriBert",
|
36 |
+
"version": "1.0.0",
|
37 |
+
"description": "Legal text analysis service",
|
38 |
+
"status": "operational",
|
39 |
+
"note": "Running in lightweight mode on Vercel",
|
40 |
+
"endpoints": [
|
41 |
+
"/analyze",
|
42 |
+
"/extract_entities",
|
43 |
+
"/classify",
|
44 |
+
"/health"
|
45 |
+
]
|
46 |
+
}
|
47 |
+
|
48 |
+
@app.post("/analyze", response_model=AnalysisResponse)
|
49 |
+
async def analyze_text(request: AnalysisRequest):
|
50 |
+
"""Analyze legal text (demo mode)"""
|
51 |
+
try:
|
52 |
+
# In production, this would use JuriBERT model
|
53 |
+
# For Vercel deployment, we return mock results
|
54 |
+
results = {
|
55 |
+
"entities": [
|
56 |
+
{"text": "contrat", "type": "LEGAL_CONCEPT", "confidence": 0.95},
|
57 |
+
{"text": "obligation", "type": "LEGAL_CONCEPT", "confidence": 0.92}
|
58 |
+
],
|
59 |
+
"classification": {
|
60 |
+
"category": "contract_law",
|
61 |
+
"confidence": 0.88
|
62 |
+
},
|
63 |
+
"summary": "Legal document analysis completed",
|
64 |
+
"keywords": ["contrat", "obligation", "juridique"],
|
65 |
+
"language": "fr"
|
66 |
+
}
|
67 |
+
|
68 |
+
return AnalysisResponse(
|
69 |
+
text=request.text[:100] + "...",
|
70 |
+
analysis_type=request.analysis_type,
|
71 |
+
results=results
|
72 |
+
)
|
73 |
+
except Exception as e:
|
74 |
+
raise HTTPException(status_code=500, detail=str(e))
|
75 |
+
|
76 |
+
@app.post("/extract_entities")
|
77 |
+
async def extract_entities(request: AnalysisRequest):
|
78 |
+
"""Extract legal entities from text"""
|
79 |
+
return {
|
80 |
+
"entities": [
|
81 |
+
{"text": "partie contractante", "type": "PARTY", "confidence": 0.9},
|
82 |
+
{"text": "tribunal", "type": "INSTITUTION", "confidence": 0.95}
|
83 |
+
],
|
84 |
+
"text_length": len(request.text)
|
85 |
+
}
|
86 |
+
|
87 |
+
@app.post("/classify")
|
88 |
+
async def classify_document(request: AnalysisRequest):
|
89 |
+
"""Classify legal document type"""
|
90 |
+
return {
|
91 |
+
"classification": {
|
92 |
+
"primary": "contract",
|
93 |
+
"secondary": ["commercial", "services"],
|
94 |
+
"confidence": 0.85
|
95 |
+
}
|
96 |
+
}
|
97 |
+
|
98 |
+
@app.get("/health")
|
99 |
+
async def health_check():
|
100 |
+
return {
|
101 |
+
"status": "healthy",
|
102 |
+
"service": "SobroJuriBert",
|
103 |
+
"mode": "vercel_lightweight"
|
104 |
+
}
|
105 |
+
|
106 |
+
# For Vercel
|
107 |
+
handler = app
|
requirements-full.txt
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
fastapi==0.104.1
|
2 |
+
uvicorn==0.24.0
|
3 |
+
transformers==4.35.2
|
4 |
+
torch==2.1.0
|
5 |
+
sentencepiece==0.1.99
|
6 |
+
protobuf==3.20.3
|
7 |
+
numpy==1.24.3
|
8 |
+
pandas==2.0.3
|
9 |
+
scikit-learn==1.3.0
|
10 |
+
python-multipart==0.0.6
|
11 |
+
aiofiles==23.2.1
|
12 |
+
pydantic==2.5.0
|
13 |
+
python-jose[cryptography]==3.3.0
|
14 |
+
httpx==0.25.1
|
15 |
+
beautifulsoup4==4.12.2
|
16 |
+
lxml==4.9.3
|
17 |
+
pypdf2==3.0.1
|
18 |
+
pdfplumber==0.10.3
|
19 |
+
Pillow==10.1.0
|
20 |
+
openpyxl==3.1.2
|
21 |
+
python-docx==1.1.0
|
22 |
+
nltk==3.8.1
|
23 |
+
spacy==3.7.2
|
24 |
+
sacremoses==0.1.1
|
25 |
+
fugashi==1.3.0
|
26 |
+
unidic-lite==1.0.8
|
27 |
+
elasticsearch==8.11.0
|
28 |
+
redis==5.0.1
|
29 |
+
psycopg2-binary==2.9.9
|
30 |
+
sqlalchemy==2.0.23
|
31 |
+
alembic==1.12.1
|
requirements-vercel.txt
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
fastapi==0.104.1
|
2 |
-
uvicorn==0.24.0
|
3 |
-
transformers==4.35.2
|
4 |
-
torch>=2.2.0
|
5 |
-
sentencepiece==0.1.99
|
6 |
-
numpy==1.24.3
|
7 |
-
python-multipart==0.0.6
|
8 |
-
aiofiles==23.2.1
|
9 |
-
pydantic==2.5.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
requirements.txt
CHANGED
@@ -1,31 +1,9 @@
|
|
1 |
fastapi==0.104.1
|
2 |
uvicorn==0.24.0
|
3 |
transformers==4.35.2
|
4 |
-
torch
|
5 |
sentencepiece==0.1.99
|
6 |
-
protobuf==3.20.3
|
7 |
numpy==1.24.3
|
8 |
-
pandas==2.0.3
|
9 |
-
scikit-learn==1.3.0
|
10 |
python-multipart==0.0.6
|
11 |
aiofiles==23.2.1
|
12 |
-
pydantic==2.5.0
|
13 |
-
python-jose[cryptography]==3.3.0
|
14 |
-
httpx==0.25.1
|
15 |
-
beautifulsoup4==4.12.2
|
16 |
-
lxml==4.9.3
|
17 |
-
pypdf2==3.0.1
|
18 |
-
pdfplumber==0.10.3
|
19 |
-
Pillow==10.1.0
|
20 |
-
openpyxl==3.1.2
|
21 |
-
python-docx==1.1.0
|
22 |
-
nltk==3.8.1
|
23 |
-
spacy==3.7.2
|
24 |
-
sacremoses==0.1.1
|
25 |
-
fugashi==1.3.0
|
26 |
-
unidic-lite==1.0.8
|
27 |
-
elasticsearch==8.11.0
|
28 |
-
redis==5.0.1
|
29 |
-
psycopg2-binary==2.9.9
|
30 |
-
sqlalchemy==2.0.23
|
31 |
-
alembic==1.12.1
|
|
|
1 |
fastapi==0.104.1
|
2 |
uvicorn==0.24.0
|
3 |
transformers==4.35.2
|
4 |
+
torch>=2.2.0
|
5 |
sentencepiece==0.1.99
|
|
|
6 |
numpy==1.24.3
|
|
|
|
|
7 |
python-multipart==0.0.6
|
8 |
aiofiles==23.2.1
|
9 |
+
pydantic==2.5.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vercel.json
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
"version": 2,
|
3 |
"builds": [
|
4 |
{
|
5 |
-
"src": "
|
6 |
"use": "@vercel/python",
|
7 |
"config": {
|
8 |
"maxLambdaSize": "50mb"
|
@@ -12,13 +12,13 @@
|
|
12 |
"routes": [
|
13 |
{
|
14 |
"src": "/(.*)",
|
15 |
-
"dest": "
|
16 |
}
|
17 |
],
|
18 |
"functions": {
|
19 |
-
"
|
20 |
"runtime": "python3.9"
|
21 |
}
|
22 |
},
|
23 |
-
"installCommand": "pip install -r requirements
|
24 |
}
|
|
|
2 |
"version": 2,
|
3 |
"builds": [
|
4 |
{
|
5 |
+
"src": "main_vercel.py",
|
6 |
"use": "@vercel/python",
|
7 |
"config": {
|
8 |
"maxLambdaSize": "50mb"
|
|
|
12 |
"routes": [
|
13 |
{
|
14 |
"src": "/(.*)",
|
15 |
+
"dest": "main_vercel.py"
|
16 |
}
|
17 |
],
|
18 |
"functions": {
|
19 |
+
"main_vercel.py": {
|
20 |
"runtime": "python3.9"
|
21 |
}
|
22 |
},
|
23 |
+
"installCommand": "pip install -r requirements.txt"
|
24 |
}
|