#load package from fastapi import FastAPI from pydantic import BaseModel import torch from transformers import ( AutoModelForCausalLM, AutoTokenizer ) from typing import List, Tuple from threading import Thread import os from pydantic import BaseModel import logging import uvicorn # Configurer les répertoires de cache os.environ['TRANSFORMERS_CACHE'] = '/app/.cache' os.environ['HF_HOME'] = '/app/.cache' # Charger le modèle et le tokenizer model = AutoModelForCausalLM.from_pretrained("THUDM/longwriter-glm4-9b", trust_remote_code=True, device_map='auto') tokenizer = AutoTokenizer.from_pretrained("THUDM/longwriter-glm4-9b", trust_remote_code=True) #Additional information Informations = """ -text : Texte à resumé output: - Text summary : texte resumé """ app =FastAPI( title='Text Summary', description =Informations ) default_prompt = """Bonjour, En tant qu’expert en gestion des plaintes réseaux, rédige un descriptif clair de la plainte ci-dessous. Résume la situation en 4 ou 5 phrases concises, en mettant l'accent sur : 1. **Informations Client** : Indique des détails pertinents sur le client. 2. **Dates et Délais** : Mentionne les dates clés et les délais (prise en charge, résolution, etc.). 3. **Contexte et Détails** : Inclut les éléments essentiels de la plainte (titre, détails, états d’avancement, qualification, fichiers joints). Ajoute une recommandation importante pour éviter le mécontentement du client, par exemple, en cas de service non fourni malgré le paiement. Adapte le ton pour qu'il soit humain et engageant. Merci ! """ #class to define the input text logging.basicConfig(level=logging.INFO) logger =logging.getLogger(__name__) # Définir le modèle de requête class PredictionRequest(BaseModel): text: str = None # Texte personnalisé ajouté par l'utilisateur # max_length: int = 2000 # Limite la longueur maximale du texte généré @app.post("/predict/") async def predict(request: PredictionRequest): # Construire le prompt final if request.text: prompt = default_prompt + "\n\n" + request.text else: prompt = default_prompt # Assurez-vous que le pad_token est défini if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token # Définir une longueur maximale arbitraire pour la tokenization max_length = 1024 # Vous pouvez ajuster cette valeur selon vos besoins # Tokenize l'entrée sans troncation automatique inputs = tokenizer( prompt, return_tensors="pt", padding=True, truncation=False, max_length=None # Pas de longueur maximale pour la tokenization ) # Tronquer manuellement si nécessaire if inputs.input_ids.shape[1] > max_length: inputs.input_ids = inputs.input_ids[:, :max_length] inputs.attention_mask = inputs.attention_mask[:, :max_length] input_ids = inputs.input_ids.to(model.device) attention_mask = inputs.attention_mask.to(model.device) # Générez le texte en passant l'attention mask outputs = model.generate( input_ids, attention_mask=attention_mask, max_length=3000, # Longueur maximale pour la génération do_sample=True ) generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) return {"generated_text": generated_text} if __name__ == "__main__": uvicorn.run("app:app",reload=True)