Compare commits
3 Commits
ccc730f8c8
...
647ffa7a84
| Author | SHA1 | Date | |
|---|---|---|---|
|
647ffa7a84
|
|||
|
abe9e38628
|
|||
|
195b3c05c8
|
25
data/source/bilan_comptable_2024.csv
Normal file
25
data/source/bilan_comptable_2024.csv
Normal file
@ -0,0 +1,25 @@
|
||||
"Category","Item","Value"
|
||||
"ACTIF","Matériel sérigraphie","18 000"
|
||||
"ACTIF","Mobilier & informatique","10 500"
|
||||
"ACTIF","Stocks (marchandises)","42 300"
|
||||
"ACTIF","Créances clients","18 720"
|
||||
"ACTIF","Banque","35 600"
|
||||
"ACTIF","Caisse","1 200"
|
||||
"ACTIF","TOTAL ACTIF","126 320"
|
||||
"PASSIF","Capital social","50 000"
|
||||
"PASSIF","Réserves","15 000"
|
||||
"PASSIF","Résultat 2024 (bénéfice)","22 400"
|
||||
"PASSIF","Dettes fournisseurs","28 920"
|
||||
"PASSIF","Dettes sociales & fiscales","8 000"
|
||||
"PASSIF","Emprunt bancaire (reste à payer)","2 000"
|
||||
"PASSIF","TOTAL PASSIF","126 320"
|
||||
"COMPTE DE RÉSULTAT","Chiffre d'affaires HT","185 400"
|
||||
"COMPTE DE RÉSULTAT","Achats de marchandises","-98 200"
|
||||
"COMPTE DE RÉSULTAT","Variation de stock","+5 100"
|
||||
"COMPTE DE RÉSULTAT","Marge brute","92 300"
|
||||
"COMPTE DE RÉSULTAT","Charges externes","-28 500"
|
||||
"COMPTE DE RÉSULTAT","Salaires & charges sociales","-38 000"
|
||||
"COMPTE DE RÉSULTAT","Dotations aux amortissements","-3 400"
|
||||
"COMPTE DE RÉSULTAT","Résultat d'exploitation","22 400"
|
||||
"COMPTE DE RÉSULTAT","Impôt sur les sociétés (15%)","-3 360"
|
||||
"COMPTE DE RÉSULTAT","RÉSULTAT NET","19 040"
|
||||
|
9
data/source/employes.csv
Normal file
9
data/source/employes.csv
Normal file
@ -0,0 +1,9 @@
|
||||
"Matricule","Nom Prénom","Poste","Date embauche","Contrat","Salaire brut mensuel (€)","Temps plein","N° Sécurité Sociale"
|
||||
"EMP001","John Doe","Dirigeant","01/01/2020","CDI","5500","Oui","1 85 01 75 123 456 78"
|
||||
"EMP002","Claire Moreau","Responsable production","15/02/2020","CDI","3200","Oui","2 92 03 75 987 654 32"
|
||||
"EMP003","Ahmed Benali","Opérateur sérigraphie","10/06/2021","CDI","2100","Oui","1 97 06 13 456 789 01"
|
||||
"EMP004","Léa Garnier","Graphiste","03/09/2022","CDI","2800","Oui","2 98 09 75 321 098 76"
|
||||
"EMP005","Marc Duval","Logisticien","01/04/2023","CDI","2400","Oui","1 85 04 75 654 321 09"
|
||||
"EMP006","Sarah Klein","Commerciale","12/11/2023","CDI","2600 + primes","Oui","2 93 11 75 123 456 78"
|
||||
"EMP007","Tom Lemoine","Stagiaire graphisme","01/09/2024","Stage","800","Non","1 04 09 75 987 654 32"
|
||||
"EMP008","Inès Ferreira","Apprentie logistique","01/09/2024","Apprent.","1200","Non","2 04 09 75 456 789 01"
|
||||
|
4
data/source/fournisseurs.csv
Normal file
4
data/source/fournisseurs.csv
Normal file
@ -0,0 +1,4 @@
|
||||
"Nom","SIRET","Contact","Produits fournis","Délai paiement","Note"
|
||||
"TShirtFactory","987 654 321 00056","M. Dupont","T-shirts blancs & colorés","30 jours","5/5"
|
||||
"CotonBio Europe","456 789 123 00045","Mme Rossi","Coton bio (Pologne, Hongrie)","45 jours","4/5"
|
||||
"Encres ÉcoPrint","321 098 765 00034","M. Klein","Encres sérigraphie écologiques","30 jours","5/5"
|
||||
|
19
data/source/historique_commandes.csv
Normal file
19
data/source/historique_commandes.csv
Normal file
@ -0,0 +1,19 @@
|
||||
"Numéro de Commande","Date","Client","Email","Couleur","Motif","Taille","Quantité","Montant HT (€)","TVA (20%)","Montant TTC (€)","Statut"
|
||||
"CMD-2024-001","15/03/2024","Marie Dupont","marie.dupont@gmail.com","Rouge","Motif1","M","2","58.50","11.70","70.20","Livrée"
|
||||
"CMD-2024-001","15/03/2024","Marie Dupont","marie.dupont@gmail.com","Bleu","Motif5","L","1","58.50","11.70","70.20","Livrée"
|
||||
"CMD-2024-002","22/04/2024","Lucas Martin","lucas.martin@orange.fr","Vert","Motif2","XL","3","80.10","16.02","96.12","Livrée"
|
||||
"CMD-2024-002","22/04/2024","Lucas Martin","lucas.martin@orange.fr","Blanc","Motif7","S","2","80.10","16.02","96.12","Livrée"
|
||||
"CMD-2024-003","10/05/2024","Emma Bernard","emma.b@free.fr","Noir","Motif10","L","1","79.20","15.84","95.04","En cours"
|
||||
"CMD-2024-003","10/05/2024","Emma Bernard","emma.b@free.fr","Rose","Motif9","M","2","79.20","15.84","95.04","En cours"
|
||||
"CMD-2024-004","03/06/2024","Association EcoPrint","contact@ecoprint.org","Jaune","Motif3","M","50 (personnalisé)","955.00","191.00","1146.00","Livrée"
|
||||
"CMD-2024-005","18/07/2024","Paul Richard","paul.richard@yahoo.com","Orange","Motif5","XL","1","39.60","7.92","47.52","Livrée"
|
||||
"CMD-2024-005","18/07/2024","Paul Richard","paul.richard@yahoo.com","Violet","Motif4","S","1","39.60","7.92","47.52","Livrée"
|
||||
"CMD-2025-001","12/01/2025","Sophie Leroy","sophie.leroy@outlook.com","Gris","Motif1","L","2","58.10","11.62","69.72","Payée"
|
||||
"CMD-2025-001","12/01/2025","Sophie Leroy","sophie.leroy@outlook.com","Blanc","Motif3","M","1","58.10","11.62","69.72","Payée"
|
||||
"CMD-2025-002","25/02/2025","Entreprise TechWear","rh@techwear.fr","Bleu","Motif8","XL","100 (logo entreprise)","2090.00","418.00","2508.00","En préparation"
|
||||
"CMD-2025-003","05/03/2025","Tom Durand","tom.durand@gmail.com","Rouge","Motif4","S","1","39.40","7.88","47.28","Annulée"
|
||||
"CMD-2025-003","05/03/2025","Tom Durand","tom.durand@gmail.com","Vert","Motif10","M","1","39.40","7.88","47.28","Annulée"
|
||||
"CMD-2025-004","14/03/2025","Léa Moreau","lea.moreau@wanadoo.fr","Rose","Motif6","L","2","59.60","11.92","71.52","Livrée"
|
||||
"CMD-2025-004","14/03/2025","Léa Moreau","lea.moreau@wanadoo.fr","Jaune","Motif8","M","1","59.60","11.92","71.52","Livrée"
|
||||
"CMD-2025-005","28/03/2025","Collectif ArtVif","artvif@asso.fr","Violet","Motif7","M","30","780.00","156.00","936.00","Planifiée"
|
||||
"CMD-2025-005","28/03/2025","Collectif ArtVif","artvif@asso.fr","Orange","Motif1","L","20","780.00","156.00","936.00","Planifiée"
|
||||
|
BIN
data/source/informations_entreprise.pdf
Normal file
BIN
data/source/informations_entreprise.pdf
Normal file
Binary file not shown.
7
data/source/planning_production_mars_2025.csv
Normal file
7
data/source/planning_production_mars_2025.csv
Normal file
@ -0,0 +1,7 @@
|
||||
"Date","Opérateur","Commande","Article","Motif personnalisé","Qté","Statut"
|
||||
"24/03","Ahmed Benali","CMD-2025-002","Bleu","Motif8","100","En cours"
|
||||
"25/03","Ahmed + Marc","CMD-2025-005","Violet","Motif7","30","Planifié"
|
||||
"26/03","Ahmed Benali","CMD-2025-005","Orange","Motif1","20","Planifié"
|
||||
"27/03","Claire Moreau","Stock","Rouge","Motif1","50","Validé"
|
||||
"28/03","Ahmed + Léa","CMD-2025-001","Gris","Motif1","2","Terminé"
|
||||
"29/03","Marc Duval","Expédition","CMD-2025-004","2 colis (Léa + Sophie)","-","Expédié"
|
||||
|
101
data/source/stock_tshirt.csv
Normal file
101
data/source/stock_tshirt.csv
Normal file
@ -0,0 +1,101 @@
|
||||
Couleur;Motif;Fabrique;Prix (€);Grammage (g/m²);Stock;Endroit de fabrication;Provenance des matériaux;Taille disponible
|
||||
Rouge;Motif1;TShirtFactory;18.5;148;182;France;Coton de Pologne;S, M, L, XL
|
||||
Rouge;Motif2;TShirtFactory;21.5;155;178;France;Coton de Hongrie;S, M, L, XL
|
||||
Rouge;Motif3;TShirtFactory;21.6;74;190;France;Coton de Suisse;S, M, L, XL
|
||||
Rouge;Motif4;TShirtFactory;21.4;161;176;France;Coton de Hongrie;S, M, L, XL
|
||||
Rouge;Motif5;TShirtFactory;18.5;120;183;France;Coton de Suisse;S, M, L, XL
|
||||
Rouge;Motif6;TShirtFactory;21.5;166;176;France;Coton de Autriche;S, M, L, XL
|
||||
Rouge;Motif7;TShirtFactory;19.8;172;102;France;Coton de République tchèque;S, M, L, XL
|
||||
Rouge;Motif8;TShirtFactory;20.1;91;179;France;Coton de Norvège;S, M, L, XL
|
||||
Rouge;Motif9;TShirtFactory;20.1;191;172;France;Coton de Pologne;S, M, L, XL
|
||||
Rouge;Motif10;TShirtFactory;19.5;103;185;France;Coton de Hongrie;S, M, L, XL
|
||||
Bleu;Motif1;TShirtFactory;21.4;149;186;France;Coton de Autriche;S, M, L, XL
|
||||
Bleu;Motif2;TShirtFactory;21.0;169;181;France;Coton de Belgique;S, M, L, XL
|
||||
Bleu;Motif3;TShirtFactory;19.6;156;180;France;Coton de Espagne;S, M, L, XL
|
||||
Bleu;Motif4;TShirtFactory;20.3;100;170;France;Coton de Portugal;S, M, L, XL
|
||||
Bleu;Motif5;TShirtFactory;18.7;71;173;France;Coton de Hongrie;S, M, L, XL
|
||||
Bleu;Motif6;TShirtFactory;20.0;72;179;France;Coton de Grèce;S, M, L, XL
|
||||
Bleu;Motif7;TShirtFactory;18.2;66;177;France;Coton de Danemark;S, M, L, XL
|
||||
Bleu;Motif8;TShirtFactory;20.9;160;186;France;Coton de Espagne;S, M, L, XL
|
||||
Bleu;Motif9;TShirtFactory;20.7;177;145;France;Coton de République tchèque;S, M, L, XL
|
||||
Bleu;Motif10;TShirtFactory;20.7;70;171;France;Coton de Suède;S, M, L, XL
|
||||
Vert;Motif1;TShirtFactory;18.8;62;175;France;Coton de Pays-Bas;S, M, L, XL
|
||||
Vert;Motif2;TShirtFactory;19.8;190;172;France;Coton de Suède;S, M, L, XL
|
||||
Vert;Motif3;TShirtFactory;21.8;160;182;France;Coton de Autriche;S, M, L, XL
|
||||
Vert;Motif4;TShirtFactory;20.6;181;181;France;Coton de France;S, M, L, XL
|
||||
Vert;Motif5;TShirtFactory;20.6;162;175;France;Coton de Finlande;S, M, L, XL
|
||||
Vert;Motif6;TShirtFactory;21.0;179;174;France;Coton de Italie;S, M, L, XL
|
||||
Vert;Motif7;TShirtFactory;21.1;90;171;France;Coton de Hongrie;S, M, L, XL
|
||||
Vert;Motif8;TShirtFactory;21.5;194;172;France;Coton de Pologne;S, M, L, XL
|
||||
Vert;Motif9;TShirtFactory;18.8;166;173;France;Coton de Belgique;S, M, L, XL
|
||||
Vert;Motif10;TShirtFactory;18.0;154;173;France;Coton de Hongrie;S, M, L, XL
|
||||
Jaune;Motif1;TShirtFactory;20.9;106;187;France;Coton de Suède;S, M, L, XL
|
||||
Jaune;Motif2;TShirtFactory;20.7;97;182;France;Coton de Grèce;S, M, L, XL
|
||||
Jaune;Motif3;TShirtFactory;19.1;194;189;France;Coton de Allemagne;S, M, L, XL
|
||||
Jaune;Motif4;TShirtFactory;20.2;136;173;France;Coton de Norvège;S, M, L, XL
|
||||
Jaune;Motif5;TShirtFactory;19.2;169;171;France;Coton de Pays-Bas;S, M, L, XL
|
||||
Jaune;Motif6;TShirtFactory;19.1;99;182;France;Coton de Pays-Bas;S, M, L, XL
|
||||
Jaune;Motif7;TShirtFactory;19.6;98;181;France;Coton de Grèce;S, M, L, XL
|
||||
Jaune;Motif8;TShirtFactory;20.0;146;188;France;Coton de Italie;S, M, L, XL
|
||||
Jaune;Motif9;TShirtFactory;20.0;61;171;France;Coton de Allemagne;S, M, L, XL
|
||||
Jaune;Motif10;TShirtFactory;21.6;76;172;France;Coton de Suisse;S, M, L, XL
|
||||
Noir;Motif1;TShirtFactory;21.7;185;141;France;Coton de République tchèque;S, M, L, XL
|
||||
Noir;Motif2;TShirtFactory;18.3;94;173;France;Coton de Suède;S, M, L, XL
|
||||
Noir;Motif3;TShirtFactory;21.2;109;173;France;Coton de France;S, M, L, XL
|
||||
Noir;Motif4;TShirtFactory;20.3;56;184;France;Coton de Suisse;S, M, L, XL
|
||||
Noir;Motif5;TShirtFactory;19.6;196;187;France;Coton de Hongrie;S, M, L, XL
|
||||
Noir;Motif6;TShirtFactory;19.3;62;184;France;Coton de Espagne;S, M, L, XL
|
||||
Noir;Motif7;TShirtFactory;19.3;65;177;France;Coton de Pays-Bas;S, M, L, XL
|
||||
Noir;Motif8;TShirtFactory;19.0;110;187;France;Coton de Pologne;S, M, L, XL
|
||||
Noir;Motif9;TShirtFactory;18.5;80;177;France;Coton de Danemark;S, M, L, XL
|
||||
Noir;Motif10;TShirtFactory;21.9;152;184;France;Coton de Suède;S, M, L, XL
|
||||
Blanc;Motif1;TShirtFactory;18.4;99;183;France;Coton de Hongrie;S, M, L, XL
|
||||
Blanc;Motif2;TShirtFactory;19.8;120;185;France;Coton de Finlande;S, M, L, XL
|
||||
Blanc;Motif3;TShirtFactory;19.3;95;181;France;Coton de Espagne;S, M, L, XL
|
||||
Blanc;Motif4;TShirtFactory;18.7;187;189;France;Coton de Portugal;S, M, L, XL
|
||||
Blanc;Motif5;TShirtFactory;20.7;178;157;France;Coton de République tchèque;S, M, L, XL
|
||||
Blanc;Motif6;TShirtFactory;21.4;119;185;France;Coton de Italie;S, M, L, XL
|
||||
Blanc;Motif7;TShirtFactory;21.1;59;187;France;Coton de Autriche;S, M, L, XL
|
||||
Blanc;Motif8;TShirtFactory;18.7;165;186;France;Coton de Suisse;S, M, L, XL
|
||||
Blanc;Motif9;TShirtFactory;20.2;141;171;France;Coton de Suède;S, M, L, XL
|
||||
Blanc;Motif10;TShirtFactory;18.3;136;186;France;Coton de Suisse;S, M, L, XL
|
||||
Orange;Motif1;TShirtFactory;19.4;140;171;France;Coton de Suisse;S, M, L, XL
|
||||
Orange;Motif2;TShirtFactory;18.1;189;186;France;Coton de Finlande;S, M, L, XL
|
||||
Orange;Motif3;TShirtFactory;18.4;164;182;France;Coton de Danemark;S, M, L, XL
|
||||
Orange;Motif4;TShirtFactory;19.5;72;181;France;Coton de Hongrie;S, M, L, XL
|
||||
Orange;Motif5;TShirtFactory;21.3;105;177;France;Coton de France;S, M, L, XL
|
||||
Orange;Motif6;TShirtFactory;18.8;186;184;France;Coton de Autriche;S, M, L, XL
|
||||
Orange;Motif7;TShirtFactory;20.1;54;185;France;Coton de Suède;S, M, L, XL
|
||||
Orange;Motif8;TShirtFactory;20.8;145;190;France;Coton de Pologne;S, M, L, XL
|
||||
Orange;Motif9;TShirtFactory;19.3;141;187;France;Coton de Norvège;S, M, L, XL
|
||||
Orange;Motif10;TShirtFactory;20.3;106;174;France;Coton de Pologne;S, M, L, XL
|
||||
Violet;Motif1;TShirtFactory;18.6;138;184;France;Coton de Allemagne;S, M, L, XL
|
||||
Violet;Motif2;TShirtFactory;20.0;150;183;France;Coton de Pologne;S, M, L, XL
|
||||
Violet;Motif3;TShirtFactory;21.4;189;177;France;Coton de Pays-Bas;S, M, L, XL
|
||||
Violet;Motif4;TShirtFactory;18.1;182;183;France;Coton de Finlande;S, M, L, XL
|
||||
Violet;Motif5;TShirtFactory;18.5;134;184;France;Coton de Autriche;S, M, L, XL
|
||||
Violet;Motif6;TShirtFactory;20.6;175;174;France;Coton de Danemark;S, M, L, XL
|
||||
Violet;Motif7;TShirtFactory;18.4;183;187;France;Coton de Pologne;S, M, L, XL
|
||||
Violet;Motif8;TShirtFactory;18.5;179;179;France;Coton de Allemagne;S, M, L, XL
|
||||
Violet;Motif9;TShirtFactory;18.5;114;180;France;Coton de Belgique;S, M, L, XL
|
||||
Violet;Motif10;TShirtFactory;18.0;114;175;France;Coton de Autriche;S, M, L, XL
|
||||
Rose;Motif1;TShirtFactory;19.8;144;190;France;Coton de Autriche;S, M, L, XL
|
||||
Rose;Motif2;TShirtFactory;18.8;59;179;France;Coton de Pays-Bas;S, M, L, XL
|
||||
Rose;Motif3;TShirtFactory;21.4;110;174;France;Coton de Hongrie;S, M, L, XL
|
||||
Rose;Motif4;TShirtFactory;19.7;59;176;France;Coton de Belgique;S, M, L, XL
|
||||
Rose;Motif5;TShirtFactory;19.8;92;170;France;Coton de Autriche;S, M, L, XL
|
||||
Rose;Motif6;TShirtFactory;19.6;67;177;France;Coton de Allemagne;S, M, L, XL
|
||||
Rose;Motif7;TShirtFactory;20.6;89;173;France;Coton de Hongrie;S, M, L, XL
|
||||
Rose;Motif8;TShirtFactory;21.8;132;190;France;Coton de Pologne;S, M, L, XL
|
||||
Rose;Motif9;TShirtFactory;19.7;183;191;France;Coton de République tchèque;S, M, L, XL
|
||||
Rose;Motif10;TShirtFactory;20.5;110;175;France;Coton de Suède;S, M, L, XL
|
||||
Gris;Motif1;TShirtFactory;20.2;117;171;France;Coton de Danemark;S, M, L, XL
|
||||
Gris;Motif2;TShirtFactory;21.6;146;171;France;Coton de Danemark;S, M, L, XL
|
||||
Gris;Motif3;TShirtFactory;18.8;154;170;France;Coton de Hongrie;S, M, L, XL
|
||||
Gris;Motif4;TShirtFactory;21.1;88;172;France;Coton de Allemagne;S, M, L, XL
|
||||
Gris;Motif5;TShirtFactory;19.6;124;190;France;Coton de Hongrie;S, M, L, XL
|
||||
Gris;Motif6;TShirtFactory;21.1;179;77;France;Coton de République tchèque;S, M, L, XL
|
||||
Gris;Motif7;TShirtFactory;18.4;57;188;France;Coton de Italie;S, M, L, XL
|
||||
Gris;Motif8;TShirtFactory;20.9;179;170;France;Coton de Allemagne;S, M, L, XL
|
||||
Gris;Motif9;TShirtFactory;20.0;132;173;France;Coton de Espagne;S, M, L, XL
|
||||
Gris;Motif10;TShirtFactory;19.5;72;177;France;Coton de Allemagne;S, M, L, XL
|
||||
|
@ -13,4 +13,4 @@ pydantic>=2.0.0 # For data validation
|
||||
lancedb==0.6.13
|
||||
docling==2.31.0
|
||||
cohere==5.15.0
|
||||
|
||||
requests>=2.31.0
|
||||
|
||||
49
src/RAG_pipeline.py
Normal file
49
src/RAG_pipeline.py
Normal file
@ -0,0 +1,49 @@
|
||||
from typing import List, Optional, Dict
|
||||
from dataclasses import dataclass
|
||||
from .interface.base_datastore import BaseDatastore
|
||||
from .interface.base_evaluator import BaseEvaluator
|
||||
from .interface.base_indexer import BaseIndexer
|
||||
from .interface.base_response_generator import BaseResponseGenerator
|
||||
from .interface.base_retriever import BaseRetriever
|
||||
|
||||
@dataclass
|
||||
class RAGpipeline:
|
||||
|
||||
indexer: BaseIndexer
|
||||
datastore: BaseDatastore
|
||||
retriever: BaseRetriever
|
||||
response_generator: BaseResponseGenerator
|
||||
evaluator: Optional[BaseEvaluator] = None
|
||||
|
||||
def reset(self) -> None:
|
||||
self.datastore.reset_table()
|
||||
|
||||
def add_documents(self, documents: List[str]) -> None:
|
||||
items = self.indexer.index(documents)
|
||||
self.datastore.add_items(items= items)
|
||||
return
|
||||
|
||||
def process_query(self, query: str, top_k: int = 5, source: bool = False) -> str:
|
||||
"""Génère la réponse à la requête à partir du contexte récupéré.
|
||||
Affiche éventuellement les sources.
|
||||
Args:
|
||||
query (str): Requête
|
||||
top_k (int, optional): Nombre de documents à renvoyer. Defaults to 5.
|
||||
source (bool, optional): Afficher ou non les sources. Default to false
|
||||
Returns:
|
||||
str: Réponse générée
|
||||
"""
|
||||
context = self.retriever.search_retriever(query, top_k= top_k)
|
||||
|
||||
if( source):
|
||||
for i, doc in enumerate(context):
|
||||
print(f"Based on the document {i+1}: {doc} \n")
|
||||
|
||||
response = self.response_generator.generate_response(query= query, context= context)
|
||||
return response
|
||||
|
||||
def evaluate(self) -> None:
|
||||
"""A compléter lors de l'ajout de l'évaluateur
|
||||
"""
|
||||
print("Function not completed.")
|
||||
pass
|
||||
@ -1,7 +1,8 @@
|
||||
from typing import List
|
||||
from typing import List, Optional
|
||||
from ..interface.base_response_generator import BaseResponseGenerator
|
||||
import requests
|
||||
import json
|
||||
from groq import Groq
|
||||
import os
|
||||
|
||||
|
||||
SYSTEM_PROMPT = """Tu es un assistant intelligent qui répond aux questions en te basant sur le contexte fourni.
|
||||
|
||||
@ -15,12 +16,31 @@ Règles importantes:
|
||||
|
||||
class ResponseGenerator(BaseResponseGenerator):
|
||||
|
||||
def __init__(self, model_name: str = "llama3.2:3b", base_url: str = "http://localhost:11434"):
|
||||
self.model_name = model_name
|
||||
self.base_url = base_url
|
||||
def __init__(self, api_key: Optional[str] = None):
|
||||
try :
|
||||
self.api_key = api_key or os.getenv("GROQ_API_KEY")
|
||||
except Exception as e:
|
||||
raise ValueError(f"erreur avec la clé API: {e}")
|
||||
|
||||
def generate_response(self, query: str, context: List[str]) -> str:
|
||||
"""Génère une réponse basée sur la requête et le contexte."""
|
||||
try:
|
||||
self.client = Groq(api_key=self.api_key)
|
||||
self.model = "llama-3.1-8b-instant" # Rapide et gratuit
|
||||
print("✅ Générateur Groq initialisé avec succès")
|
||||
except Exception as e:
|
||||
raise ValueError(f"❌ Erreur lors de l'initialisation de Groq: {e}")
|
||||
|
||||
def generate_response(self, query: str, context: List[str], max_tokens: int = 512) -> str:
|
||||
"""
|
||||
Génère une réponse basée sur la requête et le contexte.
|
||||
|
||||
Args:
|
||||
query: Question de l'utilisateur
|
||||
context: Liste de documents pertinents
|
||||
max_tokens: Longueur maximale de la réponse
|
||||
|
||||
Returns:
|
||||
Réponse générée
|
||||
"""
|
||||
|
||||
# Formater le contexte
|
||||
formatted_context = "\n\n".join([f"Document {i+1}:\n{doc}" for i, doc in enumerate(context)])
|
||||
@ -36,48 +56,31 @@ class ResponseGenerator(BaseResponseGenerator):
|
||||
|
||||
# Appeler Ollama via l'API
|
||||
try:
|
||||
response = requests.post(
|
||||
f"{self.base_url}/api/generate",
|
||||
json={
|
||||
"model": self.model_name,
|
||||
"prompt": prompt,
|
||||
"stream": False,
|
||||
"options": {
|
||||
"temperature": 0.7,
|
||||
"top_p": 0.9,
|
||||
}
|
||||
}
|
||||
response = self.client.chat.completions.create(
|
||||
model=self.model,
|
||||
messages=[
|
||||
{"role": "system", "content": SYSTEM_PROMPT},
|
||||
{"role": "user", "content": prompt}
|
||||
],
|
||||
temperature=0.7,
|
||||
max_tokens=max_tokens,
|
||||
)
|
||||
|
||||
# Vérifier le statut de la réponse
|
||||
response.raise_for_status()
|
||||
answer = response.choices[0].message.content.strip()
|
||||
|
||||
# Parser le JSON
|
||||
result = response.json()
|
||||
if not answer:
|
||||
return "⚠️ Le modèle n'a pas pu générer de réponse."
|
||||
|
||||
# DEBUG: Afficher la structure de la réponse
|
||||
print(f"DEBUG - Structure de la réponse: {result.keys()}")
|
||||
|
||||
# Vérifier les différentes clés possibles
|
||||
if "response" in result:
|
||||
return result["response"]
|
||||
elif "message" in result:
|
||||
return result["message"]
|
||||
elif "content" in result:
|
||||
return result["content"]
|
||||
else:
|
||||
# Si aucune clé attendue n'est trouvée
|
||||
print(f"DEBUG - Réponse complète: {result}")
|
||||
return f"Erreur: Format de réponse inattendu. Clés disponibles: {list(result.keys())}"
|
||||
|
||||
except requests.exceptions.ConnectionError:
|
||||
return "❌ Impossible de se connecter au serveur Ollama. Vérifiez qu'Ollama est en cours d'exécution avec: ollama serve"
|
||||
|
||||
except requests.exceptions.Timeout:
|
||||
return "⚠️ La génération a pris trop de temps. Essayez avec un modèle plus petit."
|
||||
|
||||
except requests.exceptions.HTTPError as e:
|
||||
return f"❌ Erreur HTTP {response.status_code}: {e}"
|
||||
return answer
|
||||
|
||||
except Exception as e:
|
||||
error_msg = str(e).lower()
|
||||
|
||||
# Erreurs spécifiques
|
||||
if "rate" in error_msg or "limit" in error_msg:
|
||||
return "⚠️ Limite de requêtes atteinte. Attendez 1 minute et réessayez."
|
||||
elif "authentication" in error_msg or "api" in error_msg:
|
||||
return "❌ Erreur d'authentification. Vérifiez votre clé API dans le fichier .env"
|
||||
else:
|
||||
return f"❌ Erreur lors de la génération: {str(e)}"
|
||||
|
||||
Reference in New Issue
Block a user