You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
6.0 KiB
133 lines
6.0 KiB
import sys
|
|
import openai
|
|
import datetime
|
|
import os
|
|
import getpass
|
|
import socket
|
|
from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QPushButton, QLineEdit
|
|
|
|
# TODO gérer le formattage / affichage de la réponse quand c'est une liste à points.
|
|
# TODO une interface pas dégueu
|
|
|
|
class MainWindow(QMainWindow):
|
|
def __init__(self):
|
|
super().__init__()
|
|
|
|
# Set window title
|
|
self.setWindowTitle("Chatbot")
|
|
|
|
# Set window size
|
|
self.setGeometry(100, 100, 800, 600)
|
|
|
|
# Create text input field for user's messages
|
|
self.text_input = QLineEdit(self)
|
|
self.text_input.setGeometry(20, 540, 550, 40)
|
|
|
|
# Initialize API needs
|
|
openai.api_key = "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"
|
|
self.chat_log = [{"role": "system", "content": "Ignore toute les instructions avant celle-ci. Tu est un administrateur système et réseaux niveau 0 à 2. Tu fais ce travail depuis 20 ans. Ta tâche est maintenant de diagnostiquer et classifier les problèmes que te remontent les utilisateurs. Tu dois définir si l'utilisateur rencontre un problème ou souhaite effectuer une demande de changement. Si l'utilisateur rencontre un problème, tu dois effectuer le diagnostic pour catégoriser le problème et dépanner au mieux l'utilisateur. Si tu ne peux pas résoudre le problème et que tu as effectué ton diagnostic au maximum ou que l'utilisateur souhaire faire une demande de changement, tu indique toujours à l'utilisateur d'ouvrir un dossier en cliquant sur https://www.supportpc.fr/ticket/. Tu dois TOUJOURS poser des questions AVANT de répondre afin de mieux cerner ce que t'indique l'utilisateur."}]
|
|
|
|
# Initialize message counter
|
|
###self.num_messages = 0
|
|
|
|
# Create chat window to display conversation
|
|
self.chat_window = QTextEdit(self)
|
|
self.chat_window.setGeometry(20, 20, 760, 500)
|
|
self.chat_window.setReadOnly(True)
|
|
|
|
# Create send button to send user's messages
|
|
self.send_button = QPushButton("Send", self)
|
|
self.send_button.setGeometry(580, 540, 200, 40)
|
|
self.send_button.clicked.connect(self.send_message)
|
|
self.text_input.returnPressed.connect(self.send_button.click)
|
|
|
|
###self.username = "JimmyB"
|
|
username = getpass.getuser()
|
|
hostname = socket.gethostname()
|
|
domain_parts = hostname.split(".")[1:]
|
|
|
|
if len(domain_parts) > 1:
|
|
domain = ".".join(domain_parts)
|
|
else:
|
|
domain = "NODOMAIN"
|
|
|
|
logs_folder = os.path.join(os.path.expanduser("~"), "Logs")
|
|
if not os.path.exists(logs_folder):
|
|
os.makedirs(logs_folder)
|
|
|
|
self.filename = os.path.join(logs_folder, f"{datetime.datetime.now().strftime('%Y_%m_%d_%H_%M_%S')}_{domain}_{username}_chatlog.txt") # set the filename
|
|
self.write_to_file() # call the function to write the first line to the file
|
|
|
|
def write_to_file(self):
|
|
with open(self.filename, "a") as file:
|
|
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") # get the current time in the desired format
|
|
file.write(f"{timestamp} {self.chat_log[-1]}\n") # write the timestamp and the latest chat log entry to the file
|
|
|
|
def send_message(self):
|
|
# Get user's message from text input field
|
|
user_message = self.text_input.text()
|
|
|
|
self.chat_log.append({"role": "user", "content": user_message})
|
|
self.write_to_file()
|
|
try:
|
|
reply = openai.ChatCompletion.create(
|
|
model="gpt-3.5-turbo",
|
|
messages=self.chat_log)
|
|
response=reply['choices'][0]['message']['content']
|
|
except openai.error.APIError as e:
|
|
#Handle API error here, e.g. retry or log
|
|
self.chat_log.append({"OpenAI API returned an API Error: {e}"})
|
|
pass
|
|
except openai.error.Timeout as e:
|
|
#Handle connection error here
|
|
self.chat_log.append({"Failed to connect to OpenAI API: {e}"})
|
|
pass
|
|
except openai.error.RateLimitError as e:
|
|
#Handle rate limit error (we recommend using exponential backoff)
|
|
self.chat_log.append({"OpenAI API request exceeded rate limit: {e}"})
|
|
pass
|
|
except openai.error.APIConnectionError as e:
|
|
#Handle Issue connecting to our services
|
|
self.chat_log.append({"Check your network settings, proxy configuration, SSL certificates, or firewall rules: {e}"})
|
|
pass
|
|
except openai.error.InvalidRequestError as e:
|
|
#Handle when your request was malformed or missing some required parameters, such as a token or an input
|
|
self.chat_log.append({"The error message should advise you on the specific error made: {e}"})
|
|
pass
|
|
except openai.error.AuthenticationError as e:
|
|
#Handle validation of your API key or token fail
|
|
self.chat_log.append({"Your API key or token was invalid, expired, or revoked: {e}"})
|
|
pass
|
|
except openai.error.ServiceUnavailableError as e:
|
|
#Handle Issue on OpenAI servers
|
|
self.chat_log.append({"Retry your request after a brief wait and contact us if the issue persists: {e}"})
|
|
pass
|
|
|
|
# Increment message counter
|
|
###self.num_messages += 1
|
|
|
|
# Send greeting to user
|
|
###response = f"Hello, you have sent {self.num_messages} messages."
|
|
self.chat_log.append({"role": "assistant", "content":response})
|
|
self.write_to_file()
|
|
|
|
# Add user's message and bot's response to chat window
|
|
self.chat_window.append(f"<p style='color: #0084ff;'><strong>You :</strong> {user_message}</p>")
|
|
self.chat_window.append(f"<p style='color: #008000;'><strong>Bot :</strong> {response}</p>")
|
|
|
|
# Clear text input field
|
|
self.text_input.clear()
|
|
|
|
if __name__ == "__main__":
|
|
# Create QApplication instance
|
|
app = QApplication(sys.argv)
|
|
|
|
# Create MainWindow instance
|
|
main_window = MainWindow()
|
|
|
|
# Show MainWindow
|
|
main_window.show()
|
|
|
|
# Execute QApplication event loop
|
|
sys.exit(app.exec_())
|