cd@bziiit.com commited on
Commit
8b93442
·
1 Parent(s): b440ebf

feat: enhance dynamic form management with support for sections and improved input handling

Browse files
Files changed (4) hide show
  1. README.md +7 -2
  2. app.py +11 -0
  3. config.yaml +99 -13
  4. pages/form.py +44 -16
README.md CHANGED
@@ -15,7 +15,7 @@ pinned: false
15
 
16
  ## Introduction
17
 
18
- Cette application sert de base/template pour en déployer d'autres sur le même modèle via Huggingface. Elle est facilement duplicable en dupliquant l'espace. Elle est décomposée en plusieurs sections pour offrir une gestion complète des documents et des dialogues avec une Intelligence Artificielle (IA).
19
 
20
  ### Structure de l'application
21
 
@@ -55,7 +55,7 @@ L'application est structurée en trois parties principales :
55
 
56
  ## Base de Données Vectorielle
57
 
58
- La base de données vectorielle permet de stocker de manière permanente les différents vecteurs de documents, afin de faciliter leur recherche et leur utilisation dans les conversations avec l'IA.
59
 
60
  ### Pinecone
61
 
@@ -81,6 +81,11 @@ Les paramètres peuvent être ajustés dans la section **variables**, en mettant
81
  Pour chacune d'entre elles, un *label*, une *key* et optionnelement une valeur par défaut *value* sont nécessaires.
82
  Pour être prise en compte, ces variables doivent être implémenté dans le prompt template via leur *'key'* sous la forme **{ma_variable}**
83
 
 
 
 
 
 
84
  #### Prompt template
85
 
86
  Vous pouvez directement spécifier votre prompt template dans la section **prompt_template** du fichier de configuration
 
15
 
16
  ## Introduction
17
 
18
+ Cette application sert de base/template pour en déployer d'autres sur le même modèle via Huggingface, en la dupliquant. Elle est décomposée en plusieurs sections pour offrir une gestion complète des documents et des dialogues avec une Intelligence Artificielle (IA).
19
 
20
  ### Structure de l'application
21
 
 
55
 
56
  ## Base de Données Vectorielle
57
 
58
+ La base de données vectorielle stocke de façon permanente les informations extraites des documents sous forme de vecteurs. Cette organisation facilite leur recherche et utilisation dans les conversations avec l'IA.
59
 
60
  ### Pinecone
61
 
 
81
  Pour chacune d'entre elles, un *label*, une *key* et optionnelement une valeur par défaut *value* sont nécessaires.
82
  Pour être prise en compte, ces variables doivent être implémenté dans le prompt template via leur *'key'* sous la forme **{ma_variable}**
83
 
84
+ Une secode version, permet de séparer le formulaire en plusieurs parties pour mieux l'organiser.
85
+ Chaque section/partie ('part') regroupe plusieurs paramètres sous un nom et un numéro, pour faciliter leur tri.
86
+
87
+ Vous pouvez consultez directement le fichier **config.yaml** pour pluys de détails.
88
+
89
  #### Prompt template
90
 
91
  Vous pouvez directement spécifier votre prompt template dans la section **prompt_template** du fichier de configuration
app.py CHANGED
@@ -27,6 +27,17 @@ def init_app():
27
  st.session_state["data_dict"] = config['variables']
28
  st.session_state["prompt_system"] = config['prompt_system']
29
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
  def main():
32
 
 
27
  st.session_state["data_dict"] = config['variables']
28
  st.session_state["prompt_system"] = config['prompt_system']
29
 
30
+ if 'parts' in config['variables']:
31
+ # Flatten structure by adding part name to each field
32
+ st.session_state["data_dict"] = [
33
+ {**field, "part": part["name"]}
34
+ for part in config["variables"]["parts"]
35
+ for field in part["fields"]
36
+ ]
37
+ else:
38
+ # Initialize session state with single list of variables
39
+ st.session_state["data_dict"] = [{**field} for field in config["variables"]]
40
+
41
 
42
  def main():
43
 
config.yaml CHANGED
@@ -11,22 +11,107 @@ prompts:
11
  - "Quels sont les types de fertilisants les plus utilisés en agriculture et leurs impacts ?"
12
  - "Quelles sont les techniques de lutte biologique contre les nuisibles ?"
13
 
 
 
 
 
 
 
 
 
 
 
14
  variables:
15
- - label : Région viticole
16
  nature: 'radio'
17
- key : param1
18
- options : ["Champagne", "Vin de bordeaux", "Occitanie"]
19
- value :
20
- - label : Millésime
 
21
  nature: 'selectbox'
22
- key : param2
23
- options : ["2019", "2020", "2021"]
24
- value :
25
- - label : Indicateur
26
- nature: 'multiselect'
27
- key : param3
28
- options : ["Prix de revient par hectare (€/ha)", "Prix de revient par hectolitre (€/hl)", "Coût de la main d’oeuvre par hectare (€/ha)", "Frais d’habillage ou de mise (€/bouteille)"]
29
- value :
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
  prompt_system: "Prompt system par défaut"
32
 
@@ -34,6 +119,7 @@ prompt_template: "
34
  Paramètre 1 : {param1}
35
  Paramètre 2 : {param2}
36
  Paramètre 3 : {param3}
 
37
 
38
  Documents partagées : {commonContext}
39
  Document de référence : {documentContext}
 
11
  - "Quels sont les types de fertilisants les plus utilisés en agriculture et leurs impacts ?"
12
  - "Quelles sont les techniques de lutte biologique contre les nuisibles ?"
13
 
14
+
15
+ # ----------------------------------------------------------
16
+ # Gestion du formulaire dynamique
17
+ # ----------------------------------------------------------
18
+ # Version 1 : Liste de champs sous 'variables' (sans structure de 'parts')
19
+ # ----------------------------------------------------------
20
+ # Chaque champ est défini directement sous 'variables'.
21
+ # Vous pouvez ajouter des champs en suivant ce format.
22
+ # Pour utiliser cette version, laissez-la telle quelle et commentez la version 2 ci-dessous.
23
+
24
  variables:
25
+ - label: "Région viticole"
26
  nature: 'radio'
27
+ key: param1
28
+ options: ["Champagne", "Vin de Bordeaux", "Occitanie"]
29
+ value: # Valeur par défaut
30
+
31
+ - label: "Millésime"
32
  nature: 'selectbox'
33
+ key: param2
34
+ options: ["2019", "2020", "2021", "2022"]
35
+ value: # Valeur par défaut
36
+
37
+ - label: "Budget prévu (en €)"
38
+ nature: 'numeric'
39
+ key: param3
40
+ value: # Valeur par défaut
41
+
42
+ - label: "Date de récolte"
43
+ nature: 'date'
44
+ key: param4
45
+ value: # Valeur par défaut
46
+
47
+ - label: "Remarques sur la récolte"
48
+ nature: 'text_area'
49
+ key: param5
50
+ value: # Valeur par défaut
51
+
52
+
53
+ # Version 2 : Structure de 'parts' pour organiser les champs en sections
54
+ # ----------------------------------------------------------------------
55
+ # Chaque 'part' représente une section contenant un groupe de champs (par exemple : Panier, Livraison).
56
+ # La clé 'number' permet d’ordonner les sections.
57
+ # Pour activer cette version, commentez la Version 1 ci-dessus et décommentez cette section.
58
+
59
+ # variables:
60
+ # parts:
61
+ # - name: "Panier"
62
+ # number: 1
63
+ # fields:
64
+ # - label: "Région viticole"
65
+ # nature: 'radio'
66
+ # key: param1
67
+ # options: ["Champagne", "Vin de Bordeaux", "Occitanie"]
68
+ # value: # Valeur par défaut
69
+
70
+ # - label: "Millésime"
71
+ # nature: 'selectbox'
72
+ # key: param2
73
+ # options: ["2019", "2020", "2021", "2022"]
74
+ # value: # Valeur par défaut
75
+
76
+ # - label: "Budget prévu (en €)"
77
+ # nature: 'numeric'
78
+ # key: param3
79
+ # value: # Valeur par défaut
80
+
81
+ # - name: "Livraison"
82
+ # number: 2
83
+ # fields:
84
+ # - label: "Adresse de livraison"
85
+ # nature: ''
86
+ # key: param6
87
+ # value: # Valeur par défaut
88
+
89
+ # - label: "Date de livraison souhaitée"
90
+ # nature: 'date'
91
+ # key: param7
92
+ # value: # Valeur par défaut
93
+
94
+ # - name: "Paiement"
95
+ # number: 3
96
+ # fields:
97
+ # - label: "Mode de paiement"
98
+ # nature: 'selectbox'
99
+ # key: param8
100
+ # options: ["Carte de crédit", "Virement bancaire", "Chèque"]
101
+ # value: # Valeur par défaut
102
+
103
+ # - label: "Conditions de paiement"
104
+ # nature: 'text_area'
105
+ # key: param9
106
+ # value: # Valeur par défaut
107
+
108
+ # - name: "Remarques supplémentaires"
109
+ # number: 4
110
+ # fields:
111
+ # - label: "Remarques générales"
112
+ # nature: 'text_area'
113
+ # key: param10
114
+ # value: # Valeur par défaut
115
 
116
  prompt_system: "Prompt system par défaut"
117
 
 
119
  Paramètre 1 : {param1}
120
  Paramètre 2 : {param2}
121
  Paramètre 3 : {param3}
122
+ Paramètre 4 : {param4}
123
 
124
  Documents partagées : {commonContext}
125
  Document de référence : {documentContext}
pages/form.py CHANGED
@@ -1,24 +1,52 @@
1
  import streamlit as st
 
2
 
3
  def page():
4
  st.subheader("Définissez vos paramètres")
5
 
6
- # Boucle pour créer des inputs basés sur data_dict (qui est une liste ici)
7
- for param in st.session_state.data_dict:
 
 
 
 
 
 
8
 
9
- if param['nature'] == 'radio':
10
- value = st.radio(param['label'], param['options'], key=param['key'], args=[param['key']])
11
- param['value'] = value
12
- elif param['nature'] == 'selectbox':
13
- value = st.selectbox(param['label'], param['options'], key=param['key'], args=[param['key']])
14
- param['value'] = value
15
- elif param['nature'] == 'multiselect':
16
- value = st.multiselect(param['label'], param['options'], key=param['key'], args=[param['key']])
17
- param['value'] = value
18
- else:
19
- # Utilisation de la clé 'label' et 'value' pour afficher et récupérer les valeurs
20
- value = st.text_input(label=param['label'], value=param['value'] if param['value'] else "")
21
- # Mettre à jour la valeur dans le dictionnaire après la saisie utilisateur
22
- param['value'] = value
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
  page()
 
1
  import streamlit as st
2
+ from util import getYamlConfig
3
 
4
  def page():
5
  st.subheader("Définissez vos paramètres")
6
 
7
+ # Charge la configuration YAML
8
+ config = getYamlConfig()
9
+
10
+ # Vérifie si la structure inclut des 'parts' ou une liste de variables
11
+ if 'parts' in config['variables']:
12
+ # Cas avec 'parts' : Trie les parts et affiche les champs par onglet
13
+ parts = config["variables"]["parts"]
14
+ parts_sorted = sorted(parts, key=lambda part: part.get('number', float('inf')))
15
 
16
+ # Création de tabs pour chaque 'part' trié
17
+ tabs = st.tabs([part['name'] for part in parts_sorted])
18
+ for part, tab in zip(parts_sorted, tabs):
19
+ with tab:
20
+ for field in part['fields']:
21
+ display_field(field)
22
+ else:
23
+ # Display fields directly if no parts are defined
24
+ for field in st.session_state.data_dict:
25
+ display_field(field)
26
+
27
+
28
+ def display_field(field):
29
+ """Helper function to create the correct input based on field 'nature'."""
30
+ if field['nature'] == 'radio':
31
+ value = st.radio(field['label'], field['options'], key=field['key'])
32
+ field['value'] = value
33
+ elif field['nature'] == 'selectbox':
34
+ value = st.selectbox(field['label'], field['options'], key=field['key'])
35
+ field['value'] = value
36
+ elif field['nature'] == 'multiselect':
37
+ value = st.multiselect(field['label'], field['options'], key=field['key'])
38
+ field['value'] = value
39
+ elif field['nature'] == 'date':
40
+ value = st.date_input(field['label'], key=field['key'])
41
+ field['value'] = value
42
+ elif field['nature'] == 'numeric':
43
+ value = st.number_input(field['label'], key=field['key'])
44
+ field['value'] = value
45
+ elif field['nature'] == 'text_area':
46
+ value = st.text_area(field['label'], value=field['value'] if field['value'] else "", key=field['key'])
47
+ field['value'] = value
48
+ else:
49
+ value = st.text_input(label=field['label'], value=field['value'] if field['value'] else "")
50
+ field['value'] = value
51
 
52
  page()