devalender commited on
Commit
a8584b7
·
verified ·
1 Parent(s): 07ff1e6

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +91 -0
app.py ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import requests
3
+ import base64
4
+ import io
5
+ from PIL import Image
6
+
7
+ # METTEZ VOTRE CLÉ API MISTRAL ICI (créée sur console.mistral.ai)
8
+ MISTRAL_API_KEY = "b9rg7dcD7IBHyNiUFVI5wa57zBSjsPKx" # ← Remplacez par votre clé
9
+ API_URL = "https://api.mistral.ai/v1/chat/completions"
10
+
11
+ def encode_image(image):
12
+ """Convertit l'image en base64"""
13
+ buffer = io.BytesIO()
14
+ image.save(buffer, format="JPEG")
15
+ return base64.b64encode(buffer.getvalue()).decode()
16
+
17
+ def generate_filename(image, custom_prompt):
18
+ """Génère un nom de fichier structuré"""
19
+
20
+ if image is None:
21
+ return "❌ Veuillez uploader une image."
22
+
23
+ if not MISTRAL_API_KEY or MISTRAL_API_KEY == "VOTRE_CLE_API_MISTRAL":
24
+ return "❌ Clé API manquante. Obtenez une clé gratuite sur console.mistral.ai"
25
+
26
+ try:
27
+ image_base64 = encode_image(image)
28
+
29
+ if custom_prompt and custom_prompt.strip():
30
+ prompt = custom_prompt.strip()
31
+ else:
32
+ prompt = """Analyse ce document. Extrait le nom des parties et la date.
33
+ Génère un nom de fichier au format: Affaire_[X]_contre_[Y]_[JJ_MM_AAAA]
34
+ Exemple: Affaire_Dupont_contre_Martin_12_12_2026
35
+ Réponds uniquement par le nom de fichier, rien d'autre."""
36
+
37
+ response = requests.post(
38
+ API_URL,
39
+ headers={
40
+ "Authorization": f"Bearer {MISTRAL_API_KEY}",
41
+ "Content-Type": "application/json"
42
+ },
43
+ json={
44
+ "model": "pixtral-12b-2409",
45
+ "messages": [{
46
+ "role": "user",
47
+ "content": [
48
+ {"type": "text", "text": prompt},
49
+ {"type": "image_url", "image_url": f"data:image/jpeg;base64,{image_base64}"}
50
+ ]
51
+ }],
52
+ "max_tokens": 100,
53
+ "temperature": 0.1
54
+ },
55
+ timeout=60
56
+ )
57
+
58
+ if response.status_code == 200:
59
+ result = response.json()
60
+ return result["choices"][0]["message"]["content"].strip()
61
+ else:
62
+ return f"❌ Erreur: {response.status_code}"
63
+
64
+ except Exception as e:
65
+ return f"❌ Erreur: {str(e)}"
66
+
67
+ # Interface
68
+ with gr.Blocks(title="Nommage de documents juridiques") as demo:
69
+ gr.Markdown("""
70
+ # ⚖️ Générateur de noms pour documents juridiques
71
+ **Basé sur Mistral Pixtral** - Gratuit
72
+
73
+ Upload un document (photo, scan) → obtient `Affaire_X_contre_Y_DATE`
74
+ """)
75
+
76
+ with gr.Row():
77
+ with gr.Column():
78
+ image = gr.Image(type="pil", label="Document", height=400)
79
+ prompt = gr.Textbox(
80
+ label="Format personnalisé (optionnel)",
81
+ placeholder='Ex: "Format: DOS_[X]_VS_[Y]_[DDMMYYYY]"',
82
+ lines=2
83
+ )
84
+ btn = gr.Button("Générer le nom", variant="primary")
85
+
86
+ with gr.Column():
87
+ output = gr.Textbox(label="Nom généré", lines=5)
88
+
89
+ btn.click(fn=generate_filename, inputs=[image, prompt], outputs=output)
90
+
91
+ demo.launch()