File size: 4,295 Bytes
1b0a70f
6ec905a
ee7e713
1b0a70f
6ec905a
ee7e713
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b0a70f
ee7e713
 
 
 
 
1b0a70f
ee7e713
 
6ec905a
ee7e713
 
 
 
 
 
 
 
6ec905a
ee7e713
 
 
6ec905a
 
ee7e713
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6ec905a
 
ee7e713
1b0a70f
ee7e713
1b0a70f
 
ee7e713
 
1b0a70f
ee7e713
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b0a70f
 
 
 
 
ee7e713
1b0a70f
 
ee7e713
1b0a70f
 
ee7e713
1b0a70f
ee7e713
 
 
 
 
 
 
 
 
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import gradio as gr
import requests
import json

def respond(message, history, system_message, max_tokens, temperature, top_p):
    """
    Fonction pour générer une réponse en utilisant Ollama
    
    Args:
    - message: Le dernier message de l'utilisateur
    - history: Historique des conversations
    - system_message: Message système pour guider le comportement du modèle
    - max_tokens: Nombre maximal de tokens à générer
    - temperature: Contrôle la créativité de la réponse
    - top_p: Échantillonnage nucléaire
    
    Returns:
    - Réponse générée par le modèle
    """
    # Préparer les messages pour le contexte
    messages = [{"role": "system", "content": system_message}]
    for user_msg, assistant_msg in history:
        if user_msg:
            messages.append({"role": "user", "content": user_msg})
        if assistant_msg:
            messages.append({"role": "assistant", "content": assistant_msg})
    messages.append({"role": "user", "content": message})
    
    # Préparer les données pour la requête Ollama
    data = {
        "model": "hf.co/ibrahimBlyc/LA_Llama:latest",  # Assurez-vous que ce modèle est disponible localement
        "messages": messages,
        "stream": True,
        "options": {
            "num_predict": max_tokens,
            "temperature": temperature,
            "top_p": top_p
        }
    }
    
    # URL du serveur Ollama local
    url = "http://localhost:11434/api/chat"
    
    try:
        # Envoyer la requête en streaming
        response = ""
        with requests.post(url, json=data, stream=True) as stream_response:
            stream_response.raise_for_status()
            for chunk in stream_response.iter_lines():
                if chunk:
                    try:
                        # Décoder correctement le chunk JSON
                        chunk_decoded = chunk.decode('utf-8')
                        chunk_json = json.loads(chunk_decoded)
                        
                        # Extraire le token de la réponse
                        if 'message' in chunk_json and 'content' in chunk_json['message']:
                            token = chunk_json['message']['content']
                            response += token
                            yield response
                        
                    except json.JSONDecodeError as e:
                        print(f"Erreur de décodage JSON : {e}")
                        yield f"Erreur : Impossible de décoder la réponse du serveur."
                        return
                    except Exception as e:
                        print(f"Erreur inattendue : {e}")
                        yield f"Erreur : Une erreur inattendue s'est produite."
                        return
    
    except requests.exceptions.RequestException as e:
        print(f"Erreur de requête : {e}")
        yield f"Erreur : Impossible de communiquer avec le serveur Ollama."

# Créer l'interface Gradio
demo = gr.ChatInterface(
    respond,
    title="Ollama Chatbot",
    description="Discutez avec un modèle Ollama local",
    additional_inputs=[
        gr.Textbox(
            value="Tu es un assistant IA amical et utile qui répond de manière concise et informative.", 
            label="Message système",
            lines=3
        ),
        gr.Slider(
            minimum=1, 
            maximum=2048, 
            value=512, 
            step=1, 
            label="Nombre max de tokens"
        ),
        gr.Slider(
            minimum=0.1, 
            maximum=2.0, 
            value=0.7, 
            step=0.1, 
            label="Température"
        ),
        gr.Slider(
            minimum=0.1,
            maximum=1.0,
            value=0.95,
            step=0.05,
            label="Top-p (échantillonnage nucléaire)"
        ),
    ],
    theme="default"
)

# Lancement de l'application
if __name__ == "__main__":
    # Vérifier que le serveur Ollama est bien installé
    try:
        import ollama
        print("Serveur Ollama détecté. Lancement de l'interface...")
        demo.launch(share=True)
    except ImportError:
        print("Le serveur Ollama n'est pas installé. Veuillez l'installer.")
    except Exception as e:
        print(f"Erreur lors du lancement : {e}")