YouriLalain commited on
Commit
0d93669
1 Parent(s): dc8d221

Initial commit

Browse files
Files changed (3) hide show
  1. Chatbot-Albatros.py +149 -0
  2. Procfile +1 -0
  3. requirements.txt +9 -0
Chatbot-Albatros.py ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ import json
3
+ import gradio as gr
4
+ import fitz
5
+ import logging
6
+ import base64
7
+ from flask import Flask, request, jsonify
8
+ import io
9
+ import os
10
+ import base64
11
+ import io
12
+ from PyPDF2 import PdfReader
13
+
14
+ # Configuration du logger
15
+ logging.basicConfig(level=logging.ERROR)
16
+ logger = logging.getLogger(__name__)
17
+
18
+ app = Flask(__name__)
19
+
20
+ # Remplacez par votre clé API
21
+ OPENROUTER_API_KEY = "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"
22
+ YOUR_SITE_URL = "votre-site.com" # Remplacez par votre URL
23
+ YOUR_APP_NAME = "MonChatbot"
24
+
25
+ def extract_text_from_pdf(pdf_file):
26
+ doc = fitz.open(pdf_file)
27
+ text = ""
28
+ for page in doc:
29
+ text += page.get_text()
30
+ return text
31
+
32
+ def chatbot_response(message, history, pdf_text=None, image_path=None):
33
+ messages = [{"role": "system", "content": "Vous êtes un assistant IA utile et amical, capable d'analyser des images et du texte."}]
34
+
35
+ if pdf_text:
36
+ messages.append({"role": "system", "content": f"Le contenu du PDF est : {pdf_text}"})
37
+
38
+ for human, assistant in history:
39
+ messages.append({"role": "user", "content": human})
40
+ if assistant is not None:
41
+ messages.append({"role": "assistant", "content": assistant})
42
+
43
+ message_content = message
44
+ if image_path:
45
+ encoded_image = encode_image(image_path)
46
+ message_content = [
47
+ {"type": "text", "text": message},
48
+ {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{encoded_image}"}}
49
+ ]
50
+
51
+ messages.append({"role": "user", "content": message_content})
52
+
53
+ try:
54
+ response = requests.post(
55
+ url="https://openrouter.ai/api/v1/chat/completions",
56
+ headers={
57
+ "Authorization": f"Bearer {OPENROUTER_API_KEY}",
58
+ "HTTP-Referer": f"{YOUR_SITE_URL}",
59
+ "X-Title": f"{YOUR_APP_NAME}",
60
+ "Content-Type": "application/json"
61
+ },
62
+ data=json.dumps({
63
+ "model": "mistralai/pixtral-12b:free",
64
+ "messages": messages
65
+ })
66
+ )
67
+ if response.status_code == 200:
68
+ data = response.json()
69
+ return data['choices'][0]['message']['content']
70
+ else:
71
+ return f"Erreur {response.status_code}: {response.text}"
72
+ except Exception as e:
73
+ logger.error(f"Erreur lors de l'appel API: {str(e)}")
74
+ return f"Erreur: {str(e)}"
75
+
76
+ @app.route('/api/chatbot', methods=['POST'])
77
+ def api_chatbot():
78
+ try:
79
+ # Récupérer le message et le contenu encodé en base64 du PDF
80
+ message = request.json.get('message')
81
+ pdf_base64 = request.json.get('pdf_content') # PDF encodé en base64
82
+
83
+ if not pdf_base64:
84
+ return jsonify({'error': 'Aucun contenu PDF reçu.'}), 400
85
+
86
+ # Décoder le contenu base64 en fichier PDF
87
+ pdf_data = base64.b64decode(pdf_base64)
88
+ pdf_file = io.BytesIO(pdf_data)
89
+
90
+ # Extraire le texte du PDF
91
+ pdf_reader = PdfReader(pdf_file)
92
+ pdf_text = ""
93
+ for page in pdf_reader.pages:
94
+ pdf_text += page.extract_text()
95
+
96
+ if not pdf_text:
97
+ return jsonify({'error': 'Impossible d\'extraire le texte du PDF.'}), 500
98
+
99
+ # Utiliser le texte extrait du PDF dans la réponse du chatbot
100
+ response = chatbot_response(message, history=[], pdf_text=pdf_text)
101
+
102
+ return jsonify({'response': response})
103
+ except Exception as e:
104
+ return jsonify({'error': str(e)}), 500
105
+
106
+ # Créer l'interface Gradio pour une utilisation normale
107
+ # Définir la fonction user
108
+ def user(user_message, history, pdf_text, image):
109
+ # Retourne un message vide et met à jour l'historique de la conversation
110
+ return "", history + [[user_message, None]], pdf_text, image
111
+
112
+ def bot(history, pdf_text, image):
113
+ if history:
114
+ # Le dernier message utilisateur est passé à la fonction chatbot_response
115
+ bot_message = chatbot_response(history[-1][0], history[:-1], pdf_text, image)
116
+ history[-1][1] = bot_message # Mettre à jour l'historique avec la réponse du bot
117
+ return history
118
+ return []
119
+
120
+ def clear_chat():
121
+ return [], None, None
122
+
123
+ # Interface Gradio
124
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
125
+ chatbot = gr.Chatbot(label="Historique de la conversation")
126
+ msg = gr.Textbox(label="Votre message", placeholder="Tapez votre message ici...")
127
+ pdf_upload = gr.File(label="Téléchargez un fichier PDF", file_types=[".pdf"])
128
+ image_upload = gr.Image(type="filepath", label="Téléchargez une image")
129
+ clear = gr.Button("Effacer la conversation")
130
+ pdf_text = gr.State()
131
+
132
+ # Lorsqu'un fichier PDF est uploadé, extrait le texte du PDF
133
+ pdf_upload.change(lambda file: extract_text_from_pdf(file), pdf_upload, pdf_text)
134
+
135
+ # Lorsqu'un message est envoyé, met à jour le chatbot
136
+ msg.submit(user, [msg, chatbot, pdf_text, image_upload], [msg, chatbot, pdf_text, image_upload], queue=False).then(
137
+ bot, [chatbot, pdf_text, image_upload], chatbot
138
+ )
139
+
140
+ # Efface la conversation
141
+ clear.click(clear_chat, None, [chatbot, pdf_text, image_upload], queue=False)
142
+
143
+ demo.launch(server_name="0.0.0.0", server_port=int(os.environ.get("PORT", 5000)))
144
+
145
+ # Lancer l'application Flask pour la gestion des API
146
+
147
+ if __name__ == "__main__":
148
+ port = int(os.environ.get("PORT", 5000)) # Utilise le port fourni par Heroku
149
+ app.run(host="0.0.0.0", port=port) # Assure-toi que Flask/Gradio écoute sur 0.0.0.0
Procfile ADDED
@@ -0,0 +1 @@
 
 
1
+ web: python Chatbot-Albatros.py
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ requests==2.31.0
2
+ gradio==4.44.1
3
+ PyMuPDF==1.24.10
4
+ Flask==3.0.3
5
+ gunicorn
6
+ PyPDF2==3.0.1
7
+ logging
8
+ base64
9
+