File size: 3,030 Bytes
d6eda58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c0ccd9f
 
d6eda58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# Gemini Functions

import gradio as gr
import os
import google.generativeai as genai
import json

def initialize_gemini():
    try:
        genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
        generation_config = {
            "temperature": 1,
            "top_p": 0.95,
            "top_k": 40,
            "max_output_tokens": 8192,
            "response_mime_type": "text/plain",
        }
        model = genai.GenerativeModel(
            # model_name="gemini-1.5-pro",
            model_name="gemini-2.0-flash-exp",
            generation_config=generation_config,
        )
        return model
    except Exception as e:
        raise gr.Error(f"Error initializing Gemini: {str(e)}")

def create_prompt(extracted_text: str, path_to_data_to_extract: str) -> str:

    # load data to extract
    with open(path_to_data_to_extract, 'r', encoding='utf-8') as file:
        data_to_extract = json.load(file)

    prompt = f"""Tu es un assistant juridique expert en analyse de documents judiciaires français.
    Je vais te fournir le contenu d'un document judiciaire extrait d'un PDF.
    Ta tâche est d'analyser ce texte et d'en extraire les informations suivantes de manière précise :

    {json.dumps(data_to_extract, indent=2, ensure_ascii=False)}

    Voici quelques règles à suivre :
    - Si une information n'est pas présente dans le texte, indique "Non spécifié" pour cette catégorie.
    - Pour les noms des parties (demandeurs et défendeurs, et leurs avocats), liste tous ceux que tu trouves
    - Assure-toi de différencier correctement les demandeurs des défendeurs.
    - Si tu n'es pas sûr d'une information, indique-le clairement.

    Présente tes résultats sous forme de JSON, en utilisant les catégories mentionnées ci-dessus.

    Voici le contenu du document :

    {extracted_text.strip()}

    Analyse ce texte et fournis-moi les informations demandées au format JSON uniquement.""".strip()

    return prompt

def extract_data_with_gemini(text_file_path: str, path_to_data_to_extract: str) -> dict:
    try:
        # Initialize Gemini
        model = initialize_gemini()

        # Read the extracted text
        with open(text_file_path, 'r', encoding='utf-8') as f:
            extracted_text = f.read()

        # Create prompt and get response
        prompt = create_prompt(extracted_text, path_to_data_to_extract)
        response = model.generate_content(prompt)

        # Parse the JSON response
        try:
            # Extract JSON from the response text
            json_str = response.text
            if "json" in json_str.lower():
                json_str = json_str.split("json")[1].split("```")[0]
            elif "```" in json_str:
                json_str = json_str.split("```")[1]
            result = json.loads(json_str)
        except:
            result = {"error": "Failed to parse JSON response", "raw_response": response.text}

        return result
    except Exception as e:
        raise gr.Error(f"Error in Gemini processing: {str(e)}")