Spaces:
Paused
Paused
| #coding: utf-8 | |
| import re | |
| from os import getenv | |
| from typing import Any | |
| from typing import Dict | |
| from typing import IO | |
| from typing import List | |
| from typing import Optional | |
| from typing import Tuple | |
| from typing import Union | |
| from var_app import GlobalSystemPrompts | |
| import streamlit as st | |
| from openai import OpenAI | |
| from dotenv import load_dotenv | |
| # Charger les variables d'environnement depuis le fichier .env | |
| class DemorrhaAssistant(object): | |
| def __init__(self): | |
| load_dotenv() | |
| self.client = self.initialize_client() | |
| self.vector_store = None | |
| self.list_vector_store_ids = [] | |
| def initialize_client(self): | |
| # Initialiser le client OpenAI avec la clé API | |
| api_key = getenv("OPENAI_API_KEY") | |
| return OpenAI(api_key=api_key) | |
| def search_assistant(self, assistant_name="Demorrha"): | |
| last_id = None | |
| while True: | |
| # Lister tous les assistants | |
| assistants_list = self.client.beta.assistants.list( | |
| order="desc", | |
| limit="20", | |
| after=last_id | |
| ) | |
| if len(assistants_list.data) < 1: | |
| break | |
| last_id = assistants_list.data[-1].id | |
| for assistant in assistants_list.data: | |
| if assistant.name == assistant_name: | |
| return assistant.id | |
| return None | |
| def search_vector_store(self, vector_store_name="Demorrha_Style"): | |
| last_id=None | |
| while True: | |
| # Lister tous les assistants | |
| vector_store_list = self.client.beta.vector_stores.list( | |
| order="desc", | |
| limit="20", | |
| after=last_id | |
| ) | |
| if len(vector_store_list.data) < 1: | |
| break | |
| last_id = vector_store_list.data[-1].id | |
| for vector_store in vector_store_list.data: | |
| if vector_store.name == f"{vector_store_name}": | |
| return vector_store.id | |
| return None | |
| def load_vector_store(self, vector_store_name="Demorrha_Style"): | |
| vector_store_id = self.search_vector_store(vector_store_name) | |
| if vector_store_id is None: | |
| vector_store = self.client.beta.vector_stores.create(name=f"{vector_store_name}") | |
| self.vector_store = vector_store | |
| else: | |
| self.vector_store = self.client.beta.vector_stores.retrieve(vector_store_id) | |
| return self | |
| def get_vector_store(self): | |
| return self.vector_store | |
| def upload_file(self, | |
| file_path, | |
| purpose="assistants"): | |
| return self.client.files.create( | |
| file=open(file_path, "rb"), | |
| purpose=purpose | |
| ) | |
| def list_files_in_vector_store(self, vector_store_id): | |
| files_list = [] | |
| last_id=None | |
| while True: | |
| files_list = self.client.beta.vector_stores.files.list( | |
| vector_store_id=vector_store_id, | |
| limit="20", | |
| after=last_id | |
| ) | |
| if len(files_list.data) < 1: | |
| break | |
| last_id = files_list.data[-1].id | |
| for file in files_list.data: | |
| files_list.append(file) | |
| return files_list | |
| def attach_file_to_vectore_store(self, | |
| vector_store_id, | |
| file_id): | |
| return self.client.beta.vector_stores.files.create( | |
| vector_store_id=vector_store_id, | |
| file_id=file_id | |
| ) | |
| def load_assistant(self, assistant_name="Demorrha"): | |
| self.set_system_prompt(GlobalSystemPrompts.linguascribe()) | |
| # system_prompt = GlobalSystemPrompts.linguascribe() | |
| assistant_id = self.search_assistant(assistant_name) | |
| if assistant_id is None: | |
| self.assistant = self.client.beta.assistants.create( | |
| model="gpt-4o-mini", | |
| name="Demorrha", | |
| description="Traite les messages des utilisateurs et génère une traduction.", | |
| instructions=f"{self.system_prompt}", | |
| temperature=0.1, | |
| tools=[{"type": "file_search"}] | |
| ) | |
| else: | |
| self.assistant = self.client.beta.assistants.retrieve(assistant_id) | |
| return self | |
| def get_assistant(self): | |
| return self.assistant if not isinstance(self.assistant, None) else None | |
| def get_assistant_id(self): | |
| return self.assistant.id if not isinstance(self.assistant, None) else None | |
| def add_file_to_vector_store(self, file_paths): | |
| file_streams = [open(path, "rb") for path in file_paths] | |
| file_batch = self.client.beta.vector_stores.file_batches.upload_and_poll( | |
| vector_store_id=self.vector_store.id, files=file_streams | |
| ) | |
| return file_batch | |
| def set_payload(self, | |
| content_message:str, | |
| operation_prompt: Optional[str] = ""): | |
| self.payload_content = f'{operation_prompt} :\n"""\n{content_message}\n"""' | |
| return self | |
| def set_system_prompt(self, | |
| system_prompt: Optional[str] = ""): | |
| self.system_prompt = system_prompt | |
| return self | |
| def add_vector_store_to_ressource(self, vector_store_id): | |
| self.list_vector_store_ids.append(vector_store_id) | |
| return self | |
| def get_vector_store_ids(self): | |
| return self.list_vector_store_ids | |
| def empty_vector_store_ids(self): | |
| self.list_vector_store_ids = [] | |
| return self | |
| def update_vector_store_ids(self): | |
| self.assistant = self.client.beta.assistants.update( | |
| assistant_id=self.assistant.id, | |
| tool_resources={"file_search": {"vector_store_ids": self.list_vector_store_ids}}, | |
| ) | |
| def use_assistant(self): | |
| # Utiliser l'assistant ici | |
| full_response = "" | |
| with self.client.beta.threads.create_and_run( | |
| assistant_id=self.assistant.id, | |
| thread={ | |
| "messages": [ | |
| {"role": "user", "content": self.payload_content} | |
| ] | |
| }, | |
| stream=True | |
| ) as stream: | |
| for event in stream: | |
| if event.event == "thread.message.delta": | |
| full_response += event.data.delta.content[0].text.value | |
| yield full_response + "▌" | |
| elif event.event == "thread.message.completed": | |
| yield event.data.content[0].text.value | |
| return | |
| if __name__ == "__main__": | |
| demorrha = DemorrhaAssistant() | |
| vector_store = demorrha.load_vector_store().get_vector_store() | |
| demorrha.empty_vector_store_ids() | |
| print(vector_store) | |
| if vector_store.status == "completed": | |
| if vector_store.file_counts.total > 0: | |
| if vector_store.file_counts.completed == vector_store.file_counts.total: | |
| print("Le chargement du vecteur est terminé.") | |
| demorrha.add_vector_store_to_ressource(vector_store.id) | |
| else: | |
| file_paths = ["style.txt"] | |
| file_batch = demorrha.add_file_to_vector_store(file_paths) | |
| print("Fichier ajouté au vector_store:", file_batch) | |
| # Exemple d'utilsation de l'assistant | |
| demorrha.load_assistant("Demorrha") | |
| demorrha.update_vector_store_ids() | |
| demorrha.set_payload("Tu dois faire preuve de courage pour trouver la force.", "Traduit le texte en Anglais. Et applique les instructions du fichier \'style.txt\'") | |
| response_generator = demorrha.use_assistant() | |
| final_response = "" | |
| for response in response_generator: | |
| print(response, end="\r") | |
| final_response = response | |
| print(f"\nRéponse finale de l'assistant: {final_response}") | |