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- README.md +7 -2
- app.py +11 -0
- config.yaml +99 -13
- 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
|
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
|
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
|
16 |
nature: 'radio'
|
17 |
-
key
|
18 |
-
options
|
19 |
-
value
|
20 |
-
|
|
|
21 |
nature: 'selectbox'
|
22 |
-
key
|
23 |
-
options
|
24 |
-
value
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
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 |
-
#
|
7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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()
|