data-primals-engine 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,145 @@
1
+ import OpenAI from "openai";
2
+
3
+
4
+ let engine = null;
5
+ const openai = () => {
6
+ if( !engine)
7
+ engine = new OpenAI();
8
+ return engine;
9
+ }
10
+
11
+ // La fonction devient asynchrone pour utiliser await
12
+ export const openaiJobModel = async (lang, txt, history, existingModels = []) => {
13
+ const conditionBuilderExample = JSON.stringify({ "$and": [ { "fieldNameOfTypeRelation": { "$find": { "$eq": [ "$$this.code", "fr" ] } }}, {"$eq":["$fieldOtherTypes","valueToSearch"]}, { "$ne": { "$user": null } } ] }, null, 2);
14
+
15
+ try {
16
+ const completion = await openai().chat.completions.create({
17
+ model: "gpt-3.5-turbo-0125",
18
+ // IMPORTANT: Demander explicitement une réponse JSON
19
+ response_format: { "type": "json_object" },
20
+ messages: [
21
+ {
22
+ role: "system",
23
+ content:
24
+ `
25
+ Tu dois me retourner un objet JSON valide contenant les suggestions de modèles, basés sur la demande de l'utilisateur.
26
+ La spécification JSON d'UN modèle de données est la suivante :
27
+ Par exemple, pour "un modèle pour gérer une bibliothèque et ses livres", la réponse pourrait être:
28
+ {
29
+ "models": [{
30
+ "name": "book",
31
+ "description": "*description détaillée en plusieurs phrases de l'utilité du modèle, et ses cas d'usage, ici : Modèle de référencement de livres multi-support. Peut être utilisé pour des bibliothèques personnelles, virtuelles ou municipales.*",
32
+ "fields": [
33
+ {"name": "title", "type": "string", "required": true, "asMain": true, "hint": "Titre du livre", color: '#FF89CC'},
34
+ {"name": "isbn", "type": "string", "unique": true, "hint": "Numéro ISBN"},
35
+ {"name": "author", "type": "relation", "relation": "author", "hint": "Auteur du livre", color: '#CCCCCC'},
36
+ {"name": "publicationDate", "type": "date", "default": "now", "hint": "Date de publication du livre"}
37
+ {"name": "bankCardNumber", "type": "text", "anonymized": true, "hint": "Numéro de carte bancaire anonymisé"}
38
+ ]
39
+ }
40
+ {
41
+ name: "library",
42
+ "description": "",
43
+ fields: [
44
+ {
45
+ "name": "name",
46
+ "type": "string",
47
+ asMain: true,
48
+ },
49
+ {
50
+ "name": "address",
51
+ "type": "string",
52
+ asMain: true,
53
+ },
54
+ {
55
+ "name": "city",
56
+ "type": "string",
57
+ asMain: true,
58
+ color: '#E63345'
59
+ },
60
+ {
61
+ "name": "postalCode",
62
+ "type": "string",
63
+ asMain: true,
64
+ },
65
+ {
66
+ "name": "country",
67
+ "type": "string",
68
+ color: "#4F80BF",
69
+ }
70
+ ]
71
+ }]
72
+ }
73
+
74
+ les types de champ autorisés sont :
75
+ string, string_t (translation key)
76
+ avec les propriétés { maxlength: number, multiline: boolean }
77
+
78
+ , password, url, phone, email,, richtext (html),
79
+ avec les propriétés { maxlength: number }
80
+ boolean
81
+ code
82
+ avec les propriétés { language: 'json', conditionBuilder: boolean }, avec conditionBuilder la prop pour construire des conditions sur les données
83
+ number
84
+ avec les propriétés { step: 0.1, unit: string, min: number, max: number }
85
+
86
+ date, datetime,
87
+ avec les propriétés { min: dateIso, max: dateIso }
88
+ enum,
89
+ avec les propriétés { items: ["label 1", "..."] }
90
+
91
+ array
92
+ avec les propriétés { itemsType: "string_t", ...et les autres propriétés du type itemsType }
93
+ relation
94
+ avec les propriétés { relationFilter: <condition>, multiple: boolean, relation: 'autreModeleNom'}, multiple permettant une relation 1-n pour chaque donnée du modèle.
95
+ Préfères l'utilisation du multiple et d'un modèle séparé plutôt qu'un type array avec itemsType=string.
96
+ Pour le type \`relation\`, utilise l'un des noms de modèles existants suivants : ${existingModels.join(', ')} ou le nom du modèle relationnel généré.\`
97
+ color
98
+ avec une valeur en héxadecimal, ex: '#FF0000'
99
+ file
100
+ pour gérer les documents
101
+ calculated
102
+ pour gérer les champs calculés (utile pour l'utilisateur)
103
+ model (nom du modele choisi),
104
+
105
+ cronSchedule
106
+ avec les propriétés { default: '* * * * * *', cronMask: [false, true, true, true, true, true])
107
+
108
+ <condition> ou la propriété 'condition' d'affichage sur les champs du modèle se définissent de cette manière :
109
+ ${conditionBuilderExample} avec les opérateurs mongodb $eq,$ne,$gt,$gte,$lt,$lte,$in,$nin,$dateAdd disponibles
110
+
111
+ Les modèles doivent être absolument nommés autrement que ceux déjà existants (donc pas ceux là : {${existingModels.join(', ')})
112
+ Si ils sont nommés pareil, renomme les tiens avec un suffixe '_2', ou '_3'...
113
+ Et assures-toi de générer les modèles que tu as introduits dans tes relations.
114
+
115
+ 'default' est la valeur par défaut que prendra le champ (string, number, boolean, or array of type supported)
116
+ Traduits le texte des hint et les données qui ne sont pas des variables ou des clés d'objet dans la langue iso2 ${lang}.
117
+
118
+ Mets obligatoirement des couleurs harmonieuses sur les champs asMain, ou ceux que tu considères comme importants, car ils doivent être mis en avant (selon le thème).
119
+
120
+ Ne renvoie bien QUE le tableau de modèles JSON, sans texte explicatif ni formatage markdown.`
121
+ },
122
+ {
123
+ role: "user",
124
+ content: typeof(txt) === 'string' ? txt.substring(0, 4096) : '',
125
+ },
126
+ ...history
127
+ ],
128
+ });
129
+
130
+ const aiResponse = completion.choices[0].message.content;
131
+
132
+ try {
133
+ // JSON.parse fonctionnera que le contenu soit un objet ou un tableau
134
+ return JSON.parse(aiResponse); // On retourne directement le résultat parsé
135
+ } catch (e) {
136
+ console.error("Erreur de parsing du JSON de l'IA:", e);
137
+ throw new Error("Réponse invalide de l'IA.");
138
+ }
139
+
140
+ } catch (error) {
141
+ console.error("Error calling OpenAI or parsing response:", error);
142
+ // Renvoyer l'erreur pour que l'endpoint API puisse la gérer
143
+ throw error;
144
+ }
145
+ };