Ilyas KHIAT commited on
Commit
0222cea
·
1 Parent(s): 18b9dfc

enhance graph

Browse files
audit_page/audit.py CHANGED
@@ -2,7 +2,7 @@ import streamlit as st
2
  import pymupdf as fitz
3
  import pyperclip
4
  import clipboard
5
- from utils.audit.audit_doc import audit_descriptif_pdf,audit_text
6
  from utils.audit.rag import setup_rag
7
  import dotenv
8
  from utils.audit.audit_audio import evaluate_audio_quality
@@ -107,6 +107,15 @@ def handle_display_content(col:st):
107
  elif type == "text":
108
  with col.expander("Contenu"):
109
  display_content_text(audit["content"],col)
 
 
 
 
 
 
 
 
 
110
 
111
 
112
 
@@ -119,8 +128,8 @@ def handle_audit(uploaded_file,type:str):
119
 
120
  st.session_state.audit = audit_descriptif_pdf(uploaded_file,100)
121
  with st.spinner("Préparation de la DB..."):
122
- vectorstore = setup_rag(type,st.session_state.audit["content"])
123
- st.session_state.vectorstore = vectorstore
124
  st.session_state.graph = None
125
  st.session_state.cr = ""
126
 
@@ -145,8 +154,8 @@ def handle_audit(uploaded_file,type:str):
145
  st.session_state.audit = {}
146
  st.session_state.audit = evaluate_audio_quality(uploaded_file)
147
  with st.spinner("Préparation de la DB..."):
148
- vectorstore = setup_rag(type,st.session_state.audit["content"])
149
- st.session_state.vectorstore = vectorstore
150
  st.session_state.graph = None
151
  st.session_state.cr = ""
152
 
@@ -233,6 +242,8 @@ def audit_main():
233
  st.session_state.audit_simplified = {}
234
  if "vectorstore" not in st.session_state:
235
  st.session_state.vectorstore = None
 
 
236
  if "cr" not in st.session_state:
237
  st.session_state.cr = ""
238
  if "graph" not in st.session_state:
 
2
  import pymupdf as fitz
3
  import pyperclip
4
  import clipboard
5
+ from utils.audit.audit_doc import audit_descriptif_pdf,audit_text,count_tokens
6
  from utils.audit.rag import setup_rag
7
  import dotenv
8
  from utils.audit.audit_audio import evaluate_audio_quality
 
107
  elif type == "text":
108
  with col.expander("Contenu"):
109
  display_content_text(audit["content"],col)
110
+
111
+ with col.expander("Représentation des contenus"):
112
+ if st.session_state.chunks is not None:
113
+ st.write("### Représentation des chunks")
114
+ st.write("- Nombre de chunks: ",len(st.session_state.chunks))
115
+ for i,chunk in enumerate(st.session_state.chunks):
116
+ st.write(f"#### Chunk {i+1} : ({count_tokens(chunk)} tokens) , ({len(chunk.split())} mots)")
117
+ st.text_area(f"Chunk {i+1}",chunk,height=200)
118
+
119
 
120
 
121
 
 
128
 
129
  st.session_state.audit = audit_descriptif_pdf(uploaded_file,100)
130
  with st.spinner("Préparation de la DB..."):
131
+ vectorstore,chunks = setup_rag(type,st.session_state.audit["content"])
132
+ st.session_state.vectorstore,st.session_state.chunks = vectorstore,chunks
133
  st.session_state.graph = None
134
  st.session_state.cr = ""
135
 
 
154
  st.session_state.audit = {}
155
  st.session_state.audit = evaluate_audio_quality(uploaded_file)
156
  with st.spinner("Préparation de la DB..."):
157
+ vectorstore,chunks = setup_rag(type,st.session_state.audit["content"])
158
+ st.session_state.vectorstore,st.session_state.chunks = vectorstore
159
  st.session_state.graph = None
160
  st.session_state.cr = ""
161
 
 
242
  st.session_state.audit_simplified = {}
243
  if "vectorstore" not in st.session_state:
244
  st.session_state.vectorstore = None
245
+ if "chunks" not in st.session_state:
246
+ st.session_state.chunks = None
247
  if "cr" not in st.session_state:
248
  st.session_state.cr = ""
249
  if "graph" not in st.session_state:
audit_page/dialogue_doc.py CHANGED
@@ -1,10 +1,10 @@
1
  import streamlit as st
2
  from textwrap import dedent
3
  from utils.audit.rag import get_text_from_content_for_doc,get_text_from_content_for_audio
4
- from utils.audit.response_llm import generate_response_via_langchain
5
  from langchain_core.messages import AIMessage, HumanMessage
6
  from st_copy_to_clipboard import st_copy_to_clipboard
7
- from utils.kg.construct_kg import get_graph
8
  from audit_page.knowledge_graph import *
9
  import json
10
  import clipboard
@@ -27,6 +27,23 @@ def graph_doc_to_json(graph):
27
  edges.append({"source": source_id, "label": label, "cible": target_id})
28
  return {"noeuds": nodes, "relations": edges}
29
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  def chat_history_formatter(chat_history):
31
  formatted_chat = ""
32
  for message in chat_history:
@@ -55,6 +72,10 @@ def radio_choice():
55
  st.session_state.radio_choice = options.index(choice)
56
  return choice
57
 
 
 
 
 
58
 
59
  def doc_dialog_main():
60
  st.title("Dialogue avec le document")
@@ -73,6 +94,9 @@ def doc_dialog_main():
73
  #init graph and filter views
74
  if "graph" not in st.session_state:
75
  st.session_state.graph = None
 
 
 
76
 
77
  if "filter_views" not in st.session_state:
78
  st.session_state.filter_views = {}
@@ -151,13 +175,34 @@ def doc_dialog_main():
151
 
152
  ---
153
  ''')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
 
155
 
156
  if choice == "compte_rendu":
157
  if "cr" not in st.session_state or st.session_state.cr == "":
158
  with st.spinner("Génération du compte rendu..."):
159
- cr = generate_response_via_langchain(prompt_cr,stream=False,model="gpt-4o")
 
160
  st.session_state.cr = cr
 
161
  st.session_state.cr_chat_history = []
162
  else:
163
  cr = st.session_state.cr
@@ -170,11 +215,12 @@ def doc_dialog_main():
170
  keywords_paragraph = f"### Mots clés extraits:\n- {audit['Mots clés'].strip()}"
171
  with st.container(height=650,border=False):
172
  st.markdown(keywords_paragraph)
173
- st.write(cr)
 
174
  # col_copy , col_success = st.columns([1,11])
175
  # if col_copy.button("📋",key="copy_cr"):
176
  with st.container(height=50,border=False):
177
- st_copy_to_clipboard(keywords_paragraph+"\n\n"+cr,key="cp_but_cr")
178
  # col_success.success("Compte rendu copié dans le presse-papier")
179
 
180
  with col2.container(border=True,height=850):
@@ -211,25 +257,33 @@ def doc_dialog_main():
211
  # col_success_c.success("Historique copié !")
212
 
213
  elif choice == "graphe de connaissance":
 
214
  if "graph" not in st.session_state or st.session_state.graph == None:
215
- with st.spinner("Génération du graphe..."):
216
- keywords_list = [keyword.strip() for keyword in audit["Mots clés"].strip().split(",")]
217
- allowed_nodes_types =keywords_list+ ["Person","Organization","Location","Event","Date","Time","Ressource","Concept"]
218
-
219
- number_tokens = audit["Nombre de tokens"]
220
- if number_tokens > 10000:
221
  if st.session_state.cr == "":
222
- st.session_state.cr = generate_response_via_langchain(prompt_cr,stream=False,model="gpt-4o")
223
- text = st.session_state.cr
 
 
 
224
 
225
- graph = get_graph(text,allowed_nodes=allowed_nodes_types)
 
 
 
226
  st.session_state.graph = graph
 
227
  st.session_state.filter_views = {}
228
  st.session_state.current_view = None
229
  st.session_state.node_types = None
230
  st.session_state.chat_graph_history = []
 
231
 
232
- node_types = get_node_types(graph[0])
 
233
  list_node_types = list(node_types)
234
  sorted_node_types = sorted(list_node_types,key=lambda x: x.lower())
235
  print(sorted_node_types)
@@ -242,12 +296,15 @@ def doc_dialog_main():
242
 
243
  if graph is not None:
244
  #st.write(graph)
 
245
 
246
- edges,nodes,config = convert_neo4j_to_agraph(graph[0],st.session_state.node_types)
247
-
 
 
248
  col1, col2 = st.columns([2.5, 1.5])
249
 
250
- with col1.container(border=True,height=850):
251
  st.write("##### Visualisation du graphe (**"+st.session_state.current_view+"**)")
252
  filter_col,add_view_col,change_view_col,color_col = st.columns([9,1,1,1])
253
 
@@ -280,12 +337,39 @@ def doc_dialog_main():
280
 
281
  # col_copy , col_success = st.columns([1,11])
282
  # if col_copy.button("📋",key="copy_graph"):
283
- with st.container(height=50,border=False):
284
- graph_json = graph_doc_to_json(graph[0])
285
- st_copy_to_clipboard(json.dumps(graph_json),key="cp_but_graph")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
286
  # col_success.success("Graphe copié dans le presse-papier")
287
 
288
- with col2.container(border=True,height=850):
289
  st.markdown("##### Dialoguer avec le graphe")
290
 
291
  user_query = st.chat_input("Par ici ...")
 
1
  import streamlit as st
2
  from textwrap import dedent
3
  from utils.audit.rag import get_text_from_content_for_doc,get_text_from_content_for_audio
4
+ from utils.audit.response_llm import *
5
  from langchain_core.messages import AIMessage, HumanMessage
6
  from st_copy_to_clipboard import st_copy_to_clipboard
7
+ from utils.kg.construct_kg import get_graph,get_advanced_graph
8
  from audit_page.knowledge_graph import *
9
  import json
10
  import clipboard
 
27
  edges.append({"source": source_id, "label": label, "cible": target_id})
28
  return {"noeuds": nodes, "relations": edges}
29
 
30
+ def advanced_graph_to_json(graph:KnowledgeGraph):
31
+ nodes = []
32
+ edges = []
33
+ for node in graph.entities:
34
+ node_id = node.name.replace(" ", "_")
35
+ label = node.name
36
+ type = node.label
37
+ nodes.append({"id": node_id, "label": label, "type": type})
38
+ for relationship in graph.relationships:
39
+ source = relationship.startEntity
40
+ source_id = source.name.replace(" ", "_")
41
+ target = relationship.endEntity
42
+ target_id = target.name.replace(" ", "_")
43
+ label = relationship.name
44
+ edges.append({"source": source_id, "label": label, "cible": target_id})
45
+ return {"noeuds": nodes, "relations": edges}
46
+
47
  def chat_history_formatter(chat_history):
48
  formatted_chat = ""
49
  for message in chat_history:
 
72
  st.session_state.radio_choice = options.index(choice)
73
  return choice
74
 
75
+ def format_cr(cr:report):
76
+ formatted_cr = f"### Résumé :\n{cr.summary}\n\n### Notes :\n{cr.Notes}\n\n### Actions :\n{cr.Actions}"
77
+ return formatted_cr
78
+
79
 
80
  def doc_dialog_main():
81
  st.title("Dialogue avec le document")
 
94
  #init graph and filter views
95
  if "graph" not in st.session_state:
96
  st.session_state.graph = None
97
+ st.session_state.current_chunk_index = 0
98
+ st.session_state.number_of_entities = 0
99
+ st.session_state.number_of_relationships = 0
100
 
101
  if "filter_views" not in st.session_state:
102
  st.session_state.filter_views = {}
 
175
 
176
  ---
177
  ''')
178
+ prompt_cr2 = dedent(F'''
179
+ À partir du document ci-dessous, identifiez le type d'ecrit puis, générez un compte rendu détaillé contenant les sections suivantes :
180
+
181
+ 2. **Résumé** : Fournissez une synthèse complète du document, en mettant en avant les points principaux, les relations essentielles, les concepts , les dates et les lieux, les conclusions et les détails importants.
182
+
183
+ 3. **Notes** :
184
+ - Présentez les points clés sous forme de liste à puces avec des émojis pertinents pour souligner la nature de chaque point.
185
+ - N'oubliez pas de relever tout les entités et les relations.
186
+ - Incluez des sous-points (sans émojis) sous les points principaux pour offrir des détails ou explications supplémentaires.
187
+
188
+ 4. **Actions** : Identifiez et listez les actions spécifiques, tâches ou étapes recommandées ou nécessaires selon le contenu du document.
189
+
190
+ **Document :**
191
+
192
+ {text}
193
+
194
+ *Sortie :**
195
+ Soit exhaustive dans votre réponse, en incluant toutes les informations pertinentes et en les structurant de manière claire et précise, voici des mots clés extraits du document: {audit['Mots clés'].strip()}.
196
+ ''')
197
 
198
 
199
  if choice == "compte_rendu":
200
  if "cr" not in st.session_state or st.session_state.cr == "":
201
  with st.spinner("Génération du compte rendu..."):
202
+ #cr = generate_response_via_langchain(prompt_cr,stream=False,model="gpt-4o")
203
+ cr = generate_structured_response(prompt_cr2)
204
  st.session_state.cr = cr
205
+
206
  st.session_state.cr_chat_history = []
207
  else:
208
  cr = st.session_state.cr
 
215
  keywords_paragraph = f"### Mots clés extraits:\n- {audit['Mots clés'].strip()}"
216
  with st.container(height=650,border=False):
217
  st.markdown(keywords_paragraph)
218
+ st.write(format_cr(cr))
219
+
220
  # col_copy , col_success = st.columns([1,11])
221
  # if col_copy.button("📋",key="copy_cr"):
222
  with st.container(height=50,border=False):
223
+ st_copy_to_clipboard(f"{keywords_paragraph}\n\n{cr}",key="cp_but_cr")
224
  # col_success.success("Compte rendu copié dans le presse-papier")
225
 
226
  with col2.container(border=True,height=850):
 
257
  # col_success_c.success("Historique copié !")
258
 
259
  elif choice == "graphe de connaissance":
260
+ # st.write(st.session_state.graph)
261
  if "graph" not in st.session_state or st.session_state.graph == None:
262
+ keywords_list = [keyword.strip() for keyword in audit["Mots clés"].strip().split(",")]
263
+ allowed_nodes_types =keywords_list+ ["Person","Organization","Location","Event","Date","Time","Ressource","Concept"]
264
+ number_tokens = audit["Nombre de tokens"]
265
+ with st.spinner("Synthétisation des informations..."):
 
 
266
  if st.session_state.cr == "":
267
+ st.session_state.cr = generate_structured_response(prompt_cr2)
268
+ entete = st.session_state.cr.summary
269
+
270
+
271
+ with st.spinner("Construction du graphe de connaissance..."):
272
 
273
+ #graph = get_graph(text,allowed_nodes=allowed_nodes_types)
274
+ # chunk = st.session_state.chunks[st.session_state.current_chunk_index]
275
+ # print(chunk)
276
+ graph = get_advanced_graph(format_cr(st.session_state.cr),knowledge_graph=None)
277
  st.session_state.graph = graph
278
+ st.session_state.current_chunk_index = 0
279
  st.session_state.filter_views = {}
280
  st.session_state.current_view = None
281
  st.session_state.node_types = None
282
  st.session_state.chat_graph_history = []
283
+
284
 
285
+
286
+ node_types = get_node_types_advanced(graph)
287
  list_node_types = list(node_types)
288
  sorted_node_types = sorted(list_node_types,key=lambda x: x.lower())
289
  print(sorted_node_types)
 
296
 
297
  if graph is not None:
298
  #st.write(graph)
299
+
300
 
301
+ edges,nodes,config = convert_advanced_neo4j_to_agraph(graph,st.session_state.node_types)
302
+ if "number_of_entities" not in st.session_state or "number_of_relationships" not in st.session_state or st.session_state.number_of_entities == 0 or st.session_state.number_of_relationships == 0:
303
+ st.session_state.number_of_entities = len(nodes)
304
+ st.session_state.number_of_relationships = len(edges)
305
  col1, col2 = st.columns([2.5, 1.5])
306
 
307
+ with col1.container(border=True,height=900):
308
  st.write("##### Visualisation du graphe (**"+st.session_state.current_view+"**)")
309
  filter_col,add_view_col,change_view_col,color_col = st.columns([9,1,1,1])
310
 
 
337
 
338
  # col_copy , col_success = st.columns([1,11])
339
  # if col_copy.button("📋",key="copy_graph"):
340
+ with st.container(height=100,border=False):
341
+ graph_json = advanced_graph_to_json(graph)
342
+ subcol1,subcol2,subcol3 = st.columns([1,2,7])
343
+ with subcol1:
344
+ st_copy_to_clipboard(json.dumps(graph_json),key="cp_but_graph")
345
+ generate_button = subcol2.button("génerer plus",key="generate_more")
346
+ with subcol3:
347
+ if generate_button:
348
+ if st.session_state.current_chunk_index >= len(st.session_state.chunks):
349
+ st.info("Tous les chunks ont été traités")
350
+ else:
351
+ with st.spinner(f"Regénération du graphe en incluant le chunk {st.session_state.current_chunk_index} ..."):
352
+ new_graph = get_advanced_graph(st.session_state.chunks[st.session_state.current_chunk_index],st.session_state.graph)
353
+ st.session_state.graph = new_graph
354
+ st.session_state.current_chunk_index += 1
355
+ st.session_state.number_of_entities = len(new_graph.entities)
356
+ st.session_state.number_of_relationships = len(new_graph.relationships)
357
+ st.session_state.filter_views = {}
358
+ st.session_state.current_view = None
359
+ st.session_state.node_types = None
360
+ st.session_state.node_types = get_node_types_advanced(new_graph)
361
+ list_node_types = list(st.session_state.node_types)
362
+ sorted_node_types = sorted(list_node_types,key=lambda x: x.lower())
363
+ nodes_type_dict = list_to_dict_colors(sorted_node_types)
364
+ st.session_state.node_types = nodes_type_dict
365
+ st.session_state.filter_views["Vue par défaut"] = list(st.session_state.node_types)
366
+ st.session_state.current_view = "Vue par défaut"
367
+ st.rerun()
368
+ else:
369
+ st.write(f"{st.session_state.current_chunk_index}/ {len(st.session_state.chunks)} chunks traités ({st.session_state.number_of_entities} entités, {st.session_state.number_of_relationships} relations)")
370
  # col_success.success("Graphe copié dans le presse-papier")
371
 
372
+ with col2.container(border=True,height=900):
373
  st.markdown("##### Dialoguer avec le graphe")
374
 
375
  user_query = st.chat_input("Par ici ...")
audit_page/knowledge_graph.py CHANGED
@@ -7,6 +7,7 @@ import math
7
  from utils.audit.response_llm import generate_response_via_langchain
8
  from langchain_core.messages import AIMessage, HumanMessage
9
  from langchain_core.prompts import PromptTemplate
 
10
 
11
  def if_node_exists(nodes, node_id):
12
  """
@@ -44,6 +45,18 @@ def get_node_types(graph):
44
  node_types.add(target.type)
45
  return node_types
46
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  def color_distance(color1, color2):
48
  # Calculate Euclidean distance between two RGB colors
49
  return math.sqrt((color1[0] - color2[0]) ** 2 + (color1[1] - color2[1]) ** 2 + (color1[2] - color2[2]) ** 2)
@@ -130,6 +143,70 @@ def convert_neo4j_to_agraph(neo4j_graph, node_colors):
130
 
131
  return edges, nodes, config
132
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  def display_graph(edges, nodes, config):
134
  # Display the Agraph visualization
135
  return agraph(edges=edges, nodes=nodes, config=config)
 
7
  from utils.audit.response_llm import generate_response_via_langchain
8
  from langchain_core.messages import AIMessage, HumanMessage
9
  from langchain_core.prompts import PromptTemplate
10
+ from itext2kg.models import KnowledgeGraph
11
 
12
  def if_node_exists(nodes, node_id):
13
  """
 
45
  node_types.add(target.type)
46
  return node_types
47
 
48
+ def get_node_types_advanced(graph:KnowledgeGraph):
49
+ node_types = set()
50
+ for node in graph.entities:
51
+ node_types.add(node.label)
52
+ for relationship in graph.relationships:
53
+ source = relationship.startEntity
54
+ target = relationship.endEntity
55
+ node_types.add(source.label)
56
+ node_types.add(target.label)
57
+ return node_types
58
+
59
+
60
  def color_distance(color1, color2):
61
  # Calculate Euclidean distance between two RGB colors
62
  return math.sqrt((color1[0] - color2[0]) ** 2 + (color1[1] - color2[1]) ** 2 + (color1[2] - color2[2]) ** 2)
 
143
 
144
  return edges, nodes, config
145
 
146
+ def convert_advanced_neo4j_to_agraph(neo4j_graph:KnowledgeGraph, node_colors):
147
+ """
148
+ Converts a Neo4j graph into an Agraph format.
149
+
150
+ Args:
151
+ neo4j_graph (dict): A dictionary representing the Neo4j graph with keys 'nodes' and 'relationships'.
152
+ 'nodes' is a list of dicts with each dict having 'id' and 'type' keys.
153
+ 'relationships' is a list of dicts with 'source', 'target', and 'type' keys.
154
+
155
+ Returns:
156
+ return_value: The Agraph visualization object.
157
+ """
158
+ nodes = []
159
+ edges = []
160
+
161
+ # Creating Agraph nodes
162
+ for node in neo4j_graph.entities:
163
+ # Use the node id as the Agraph node id
164
+ node_id = node.name.replace(" ", "_") # Replace spaces with underscores for ids
165
+ label = node.name
166
+ type = node.label
167
+ size = 25 # Default size, can be customized
168
+ shape = "circle" # Default shape, can be customized
169
+
170
+ # For example purposes, no images are added, but you can set 'image' if needed.
171
+ new_node = Node(id=node_id,title=type, label=label, size=size, shape=shape,color=node_colors[type])
172
+ # if not if_node_exists(nodes, new_node.id):
173
+ # nodes.append(new_node)
174
+ nodes.append(new_node)
175
+
176
+ # Creating Agraph edges
177
+ for relationship in neo4j_graph.relationships:
178
+ size = 25 # Default size, can be customized
179
+ shape = "circle" # Default shape, can be customized
180
+
181
+ source = relationship.startEntity
182
+ source_type = source.label
183
+ source_id = source.name.replace(" ", "_")
184
+ label_source = source.name
185
+
186
+ source_node = Node(id=source_id,title=source_type, label=label_source, size=size, shape=shape,color=node_colors[source_type])
187
+ # if not if_node_exists(nodes, source_node.id):
188
+ # nodes.append(source_node)
189
+
190
+ target = relationship.endEntity
191
+ target_type = target.label
192
+ target_id = target.name.replace(" ", "_")
193
+ label_target = target.name
194
+
195
+ target_node = Node(id=target_id,title=target_type, label=label_target, size=size, shape=shape,color=node_colors[target_type])
196
+ # if not if_node_exists(nodes, target_node.id):
197
+ # nodes.append(target_node)
198
+
199
+ label = relationship.name
200
+
201
+ edges.append(Edge(source=source_id, label=label, target=target_id))
202
+
203
+
204
+ # Define the configuration
205
+ config = Config(width=1200, height=800, directed=True, physics=True, hierarchical=True,from_json="config.json")
206
+ # Create the Agraph visualization
207
+
208
+ return edges, nodes, config
209
+
210
  def display_graph(edges, nodes, config):
211
  # Display the Agraph visualization
212
  return agraph(edges=edges, nodes=nodes, config=config)
config.json CHANGED
@@ -3,6 +3,14 @@
3
  "width": "1200px",
4
  "autoResize": true,
5
 
 
 
 
 
 
 
 
 
6
  "physics":{
7
  "enabled": true,
8
 
@@ -23,4 +31,6 @@
23
  "fit": true
24
  }
25
  }
 
 
26
  }
 
3
  "width": "1200px",
4
  "autoResize": true,
5
 
6
+ "edges":{
7
+ "smooth": {
8
+ "enabled": true,
9
+ "type": "dynamic",
10
+ "roundness": 0.5
11
+ }
12
+ },
13
+
14
  "physics":{
15
  "enabled": true,
16
 
 
31
  "fit": true
32
  }
33
  }
34
+
35
+
36
  }
data/transcript.pdf ADDED
Binary file (216 kB). View file
 
test.ipynb ADDED
@@ -0,0 +1,1352 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 47,
6
+ "metadata": {},
7
+ "outputs": [
8
+ {
9
+ "data": {
10
+ "text/plain": [
11
+ "True"
12
+ ]
13
+ },
14
+ "execution_count": 47,
15
+ "metadata": {},
16
+ "output_type": "execute_result"
17
+ }
18
+ ],
19
+ "source": [
20
+ "from utils.audit.audit_doc import *\n",
21
+ "from utils.kg.construct_kg import *\n",
22
+ "from dotenv import load_dotenv\n",
23
+ "\n",
24
+ "load_dotenv(dotenv_path='.streamlit/.env')"
25
+ ]
26
+ },
27
+ {
28
+ "cell_type": "code",
29
+ "execution_count": 48,
30
+ "metadata": {},
31
+ "outputs": [],
32
+ "source": [
33
+ "#load pdf\n",
34
+ "import pymupdf\n",
35
+ "\n",
36
+ "pdf = pymupdf.open(\"data/transcript.pdf\")"
37
+ ]
38
+ },
39
+ {
40
+ "cell_type": "code",
41
+ "execution_count": 49,
42
+ "metadata": {},
43
+ "outputs": [],
44
+ "source": [
45
+ "pages = []\n",
46
+ "for page in pdf:\n",
47
+ " pages.append(page.get_text())\n"
48
+ ]
49
+ },
50
+ {
51
+ "cell_type": "code",
52
+ "execution_count": 50,
53
+ "metadata": {},
54
+ "outputs": [
55
+ {
56
+ "data": {
57
+ "text/plain": [
58
+ "54"
59
+ ]
60
+ },
61
+ "execution_count": 50,
62
+ "metadata": {},
63
+ "output_type": "execute_result"
64
+ }
65
+ ],
66
+ "source": [
67
+ "len(pages)"
68
+ ]
69
+ },
70
+ {
71
+ "cell_type": "code",
72
+ "execution_count": 51,
73
+ "metadata": {},
74
+ "outputs": [],
75
+ "source": [
76
+ "from langchain_community.graphs import Neo4jGraph\n",
77
+ "from langchain_experimental.graph_transformers import LLMGraphTransformer\n",
78
+ "from langchain_openai import ChatOpenAI\n",
79
+ "from langchain_core.documents import Document\n",
80
+ "\n",
81
+ "def get_graph(text,allowed_nodes=None,prompt=None,multiple_docs=False):\n",
82
+ " \n",
83
+ " llm = ChatOpenAI(temperature=0, model_name=\"gpt-4o-2024-08-06\")\n",
84
+ "\n",
85
+ " if allowed_nodes:\n",
86
+ " llm_transformer = LLMGraphTransformer(llm=llm,allowed_nodes=allowed_nodes)\n",
87
+ " else:\n",
88
+ " llm_transformer = LLMGraphTransformer(llm=llm)\n",
89
+ " documents = [Document(page_content=text)]\n",
90
+ " print(text)\n",
91
+ "\n",
92
+ " graph_documents = llm_transformer.convert_to_graph_documents(documents)\n",
93
+ " \n",
94
+ " return graph_documents\n"
95
+ ]
96
+ },
97
+ {
98
+ "cell_type": "code",
99
+ "execution_count": 52,
100
+ "metadata": {},
101
+ "outputs": [
102
+ {
103
+ "name": "stdout",
104
+ "output_type": "stream",
105
+ "text": [
106
+ "Speaker 1 - 00:00\n",
107
+ "Est-ce que t'as mis voix 1, voix 2, voix 3, tout ça?\n",
108
+ "Speaker 2 - 00:04\n",
109
+ "Quoi? Non, après. Après, avec la voix, je vais reconnaître les gens et\n",
110
+ "dire voix 1 c'est.\n",
111
+ "Speaker 1 - 00:11\n",
112
+ "Andréa, voix 2 c'est... Non, voilà, super.\n",
113
+ "Speaker 2 - 00:15\n",
114
+ "Et... Moi je dis merci parce que j'ai pas enregistré.\n",
115
+ "Speaker 1 - 00:17\n",
116
+ "Hein?\n",
117
+ "Speaker 2 - 00:18\n",
118
+ "Je dis merci Isabelle. Encore? Mais j'ai pas enregistré. J'ai commencé là.\n",
119
+ "Speaker 1 - 00:22\n",
120
+ "Merci Isabelle pour tout ce travail fait pour l'association depuis 2014.\n",
121
+ "\n",
122
+ "Speaker 2 - 00:30\n",
123
+ "OK. Bon. On va essayer de travailler un peu et d'animer l'association.\n",
124
+ "J'ai établi une petite liste qui peut nous occuper, je pense, pendant une\n",
125
+ "année. J'ai essayé de trouver des thèmes où ça peut intéresser tout le\n",
126
+ "monde, donc c'est des subventions, c'est comment donner plus de... De\n",
127
+ "possibilités aux sociétés pour aller chercher plus d'argent. Donc j'ai\n",
128
+ "sélectionné cinq axes. Je pense qu'aucune d'entre nous sait ce qu'on a\n",
129
+ "comme droits pour les formations. Et si on sait, on ne sait pas tout.\n",
130
+ "Donc on va essayer de faire intervenir quelqu'un.\n",
131
+ "Speaker 1 - 01:24\n",
132
+ "Le dispositif que vous payez tous.\n",
133
+ "Speaker 2 - 01:30\n",
134
+ "Il n'y a pas que ça. Il y a vraiment des subventions qu'on peut aller\n",
135
+ "chercher sur certains sujets. Des subventions européennes, voire\n",
136
+ "régionales, etc. Donc on va essayer de faire intervenir quelqu'un qui\n",
137
+ "nous expliquera qu'est-ce qu'il y a et à quoi on a le droit. Deuxième axe,\n",
138
+ "on va essayer de travailler sur tout ce qui est intelligence artificielle.\n",
139
+ "Qui va à une vitesse incroyable dans tous les domaines et il y a des\n",
140
+ "outils aujourd'hui qui existent pour nous aider au quotidien, voire\n",
141
+ "améliorer, aller chercher plein de choses en s'appuyant sur l'IA.\n",
142
+ "Speaker 1 - 02:11\n",
143
+ "Par rapport à l'axe formation, c'est la formation du dirigeant ou c'est la\n",
144
+ "formation des collaborateurs?\n",
145
+ "\n",
146
+ "Speaker 2 - 02:17\n",
147
+ "Non, bien sûr. Et surtout, les employés avant tout. Ok. Donc moi je suis\n",
148
+ "accompagné par un consultant qui est super pro dans ce domaine donc\n",
149
+ "on va essayer de le faire intervenir peut-être sur plusieurs séances. En\n",
150
+ "fait c'est important si tu as un bon advocateur, tu peux agir facilement\n",
151
+ "et avoir plein de subventions. Moi c'était le cas, au début j'essayais,\n",
152
+ "j'avais jamais de retour et après j'ai eu vraiment la bonne personne et\n",
153
+ "ils m'ont remboursé à des hauteurs absolument. Il y a des formations\n",
154
+ "que j'ai eues, ils m'ont pris à 40-50% de la formation. C'est la même\n",
155
+ "personne qui va t'accompagner.\n",
156
+ "Speaker 1 - 03:09\n",
157
+ "Pour la formation?\n",
158
+ "Speaker 2 - 03:10\n",
159
+ "Et si lui ne maîtrise pas un sujet, c'est son métier. Il peut nous guider\n",
160
+ "vers quelqu'un et si toi t'as quelqu'un...\n",
161
+ "Speaker 1 - 03:17\n",
162
+ "Mais l'idée, je te laisse finir après.\n",
163
+ "Speaker 2 - 03:21\n",
164
+ "Non mais l'idée, on va la développer au fur et à mesure des réunions.\n",
165
+ "On va essayer de travailler sur la partie transition écologique qui est\n",
166
+ "très à la mode. Eco-Vadis, ISO pourquoi pas.\n",
167
+ "\n",
168
+ "Speaker 1 - 03:41\n",
169
+ "En fait, il y a plusieurs sujets. Il y a la RSE qui est la responsabilité\n",
170
+ "sociétale de l'entreprise. Il y a plusieurs d'entre vous qui pourraient\n",
171
+ "être sollicités par vos clients pour que vous ayez mis en place cette\n",
172
+ "démarche. Je ne sais pas si toi, tu es sollicité, Guillaume? Non, pas plus\n",
173
+ "que ça.\n",
174
+ "Speaker 2 - 04:01\n",
175
+ "Les banques aujourd'hui, si tu n'es pas RSE, dans le futur proche, elles\n",
176
+ "ne vont plus travailler avec toi. La responsabilité sociétale de\n",
177
+ "l'entreprise, on va t'expliquer tout à l'heure.\n",
178
+ "Speaker 1 - 04:20\n",
179
+ "Par rapport à la transition écologique, la CCI est opérateur d'une aide\n",
180
+ "financière que l'ADEME donne aux entreprises. Aujourd'hui, par\n",
181
+ "exemple, pour que l'entreprise fasse un exemple de diagnostic des\n",
182
+ "bâtiments d'énergie pour identifier tous les travaux qu'il faut faire. Mais\n",
183
+ "pas qu'isolation, c'est aussi tout ce qui est éclairage, tout ça, il y a une\n",
184
+ "aide financière. Aujourd'hui, un diagnostic ne coûte que 3000 euros\n",
185
+ "parce que le reste est pris en charge par l'ADEME. Et la CCI est\n",
186
+ "opérateur, c'est-à-dire que nous, on ne fait pas les diagnostics parce\n",
187
+ "qu'on n'est pas expert, on appelle un bureau d'études expert qui le fait,\n",
188
+ "mais nous, tout passe par la chambre de commerce. Donc dans ce\n",
189
+ "même modèle, il y a ce qu'on appelle le diagnostic énergie.\n",
190
+ "\n",
191
+ "Speaker 1 - 05:15\n",
192
+ "Il y a un accompagnement qui s'appelle accompagnement à la maîtrise\n",
193
+ "du ouvrage, c'est quand tu as déjà identifié ton chantier, un chantier\n",
194
+ "important, c'est-à-dire 100 000 euros, et tu vas lancer les travaux. Ce\n",
195
+ "bureau d'études va t'accompagner à rédiger le cahier des charges, à\n",
196
+ "choisir, à analyser les dévis, les réponses des entreprises qui vont te\n",
197
+ "faire les travaux, à suivre les travaux, à analyser les dévis, les\n",
198
+ "matériaux, etc.\n",
199
+ "Speaker 2 - 05:44\n",
200
+ "On prend le carbone aussi, c'est un sujet qui est très important.\n",
201
+ "Speaker 1 - 05:47\n",
202
+ "Alors il y a le bilan carbone. Le bilan carbone c'est quand on dit, bon,\n",
203
+ "ton activité génère combien de CO2?\n",
204
+ "Speaker 2 - 05:56\n",
205
+ "Ils vont calculer, aller voir tes fournisseurs, les salariés, comment ils\n",
206
+ "viennent, vélo, voiture...\n",
207
+ "Speaker 1 - 06:04\n",
208
+ "Le bilan carbone a trois niveaux, ça s'appelle le scope. Le premier\n",
209
+ "niveau c'est l'activité. Le deuxième niveau, c'est avec les déplacements\n",
210
+ "des collaborateurs. Et le troisième niveau, c'est avec tes livraisons. Et\n",
211
+ "donc, si tu fais venir de la matière première de Chine, t'as un bilan\n",
212
+ "carbone qui est quand même plus élevé que si tu...\n",
213
+ "\n",
214
+ "Speaker 2 - 06:25\n",
215
+ "Voilà.\n",
216
+ "Speaker 1 - 06:26\n",
217
+ "Donc le bilan carbone aussi, voilà, pour tous ces sujets, pour la RSE,\n",
218
+ "pour accompagner les entreprises à faire la démarche, mais en\n",
219
+ "répondre à ECOVADIS, parce que ECOVADIS, c'est un label.\n",
220
+ "Speaker 2 - 06:38\n",
221
+ "Oui.\n",
222
+ "Speaker 1 - 06:40\n",
223
+ "C'est un level de plus et nous on accompagne les entreprises à répondre\n",
224
+ "à ce questionnaire. Aussi la ISO 1400 c'est pour les industriels, c'est\n",
225
+ "pour tout ce qui est le respect environnemental. On a une gamme très\n",
226
+ "grande et tout ça c'est avec les aides financières de l'ADEME et de\n",
227
+ "l'Union Européenne, nous avons des accompagnements gratuits. Pour\n",
228
+ "les entreprises PME toujours, mais par.\n",
229
+ "Speaker 2 - 07:11\n",
230
+ "Exemple au niveau de... Andréa, le but aujourd'hui c'est de dire voilà les\n",
231
+ "axes, après on va les détailler, faire des séances de travail, etc. Donc on\n",
232
+ "peut.\n",
233
+ "Speaker 1 - 07:21\n",
234
+ "Trouver un sujet, faire venir un expert ou faire un petit atelier et\n",
235
+ "ensuite informer les entreprises pour qu'elles puissent bénéficier de ces\n",
236
+ "accompagnements.\n",
237
+ "\n",
238
+ "Speaker 2 - 07:32\n",
239
+ "Voilà, on va parler tout le temps orienter nos réunions vers l'argent.\n",
240
+ "Speaker 1 - 07:37\n",
241
+ "Bien sûr, où est-ce qu'ils peuvent trouver les aides. Parce\n",
242
+ "qu'effectivement, nous aussi, l'État nous a mandatés. On a des\n",
243
+ "accompagnements qui sont faits au niveau global de l'entreprise, qui\n",
244
+ "sont faits par le Conseil et la Chambre de commerce. Mais nous, on doit\n",
245
+ "rendre un livrable à l'entreprise et à l'État avec la liste des aides\n",
246
+ "financières qui existe. Là, par exemple, je dois faire un pour EES\n",
247
+ "Rénovation, ceux qui sont maintenant chez Facility. Je fais ce rendez-\n",
248
+ "vous avec lui, je lui liste les aides et maintenant il faut que je mette tout\n",
249
+ "ça dans le plan, donc sur la rénovation des bâtiments. Pour tout ça, il y\n",
250
+ "a effectivement beaucoup de sujets sur lesquels on peut aller et orienter\n",
251
+ "les entreprises vers les aides qui existent.\n",
252
+ "Speaker 2 - 08:25\n",
253
+ "Les aider surtout à... Tu as parlé d'EcoVadis. C'est un label, mais c'est\n",
254
+ "un label qui est obligatoire. Moi, j'ai fait une levée de fonds cette année.\n",
255
+ "La banque m'a dit qu'il faut une notation EcoVadis, sinon on ne discute\n",
256
+ "pas avec toi.\n",
257
+ "Speaker 1 - 08:43\n",
258
+ "Il y a des entreprises qui sont déjà peut-être obligées, parce que les\n",
259
+ "clients les demandent comme toi, les grands comptes demandent\n",
260
+ "souvent ça, des labels, des notifications, des qualifications par des\n",
261
+ "systèmes comme tu dis Ecobaris. Il y a d'autres qui ne sont pas encore\n",
262
+ "sur ça, mais quand ça va venir...\n",
263
+ "\n",
264
+ "Speaker 2 - 09:05\n",
265
+ "Je pense que ça dépend de la taille de l'entreprise aussi, peut-être. Non.\n",
266
+ "Non, non.\n",
267
+ "Speaker 1 - 09:08\n",
268
+ "Ça dépend des clients.\n",
269
+ "Speaker 2 - 09:09\n",
270
+ "Moi je suis en train d'en faire un prêt sur une SI, ils ne me demandent\n",
271
+ "pas ça. Non, ça n'a rien à voir. C'est pour le business. C'est pour\n",
272
+ "l'investissement que tu parles? Juste pour l'investissement? Non, si tu\n",
273
+ "veux faire un emprunt, je ne sais pas, pour ta société. Ils te demandent\n",
274
+ "ça aujourd'hui. C'est vrai que les profs, ils demandent des ferries après\n",
275
+ "six ou huit ans, vous savez, pour rien. Ça dépend du montant. Oui, ça\n",
276
+ "dépend du montant.\n",
277
+ "Speaker 1 - 09:29\n",
278
+ "Ça dépend de banque.\n",
279
+ "Speaker 2 - 09:30\n",
280
+ "De toute façon, ça va venir. J'ai demandé 2 millions il y a 3 mois. Tu les\n",
281
+ "as eus? Bah oui. J'en prendrai deux aussi.\n",
282
+ "Speaker 1 - 09:39\n",
283
+ "Ils m'ont pas fait chier. Mais c'est pas que les...\n",
284
+ "\n",
285
+ "Speaker 2 - 09:41\n",
286
+ "Après, c'est toujours par rapport au relationnel qu'on a... Non, non. Ça\n",
287
+ "joue quand même. Non, mais par contre, je rebondis sur toi, SCI.\n",
288
+ "Attention, parce qu'ils ont voulu me bloquer sur un bâtiment qui était\n",
289
+ "classé G. Ils me voulaient plus prêter. Ils voulaient plus me prêter quand\n",
290
+ "c'est des bâtiments maintenant qui sont en normes basses. Genre de\n",
291
+ "toute façon, j'achète, mais c'est pour tout raser. Donc j'aurais fait une\n",
292
+ "détestation comme quoi j'allais tout raser. Normalement, ça ne doit pas\n",
293
+ "bloquer. Tu t'engages en disant je vais faire des travaux. J'ai fait un\n",
294
+ "papier, ils sont contents. Normalement, le notaire même bloque.\n",
295
+ "Speaker 1 - 10:19\n",
296
+ "Mais il dit... Même pour le particulier, moi je viens de faire un prêt et ils\n",
297
+ "ont demandé le diagnostic NGT.\n",
298
+ "Speaker 2 - 10:27\n",
299
+ "Oui, c'est obligatoire.\n",
300
+ "Speaker 1 - 10:30\n",
301
+ "Non, mais pas la banque.\n",
302
+ "Speaker 2 - 10:33\n",
303
+ "Pour les particuliers, ça va se corser dans trois ans le prêt. Les\n",
304
+ "bâtiments de fer, de eau, d'énergie. Ok. Quatrième acte, c'est\n",
305
+ "développer son activité, ce qu'ils appellent marque employeur.\n",
306
+ "Comment rendre sa société attractive? Donc on va essayer de travailler\n",
307
+ "sur ce sujet-là. Je parle à visite des sociétés qu'on ne connaît pas dans\n",
308
+ "la zone. Genre, comment elle s'appelle? Pas Patricia?\n",
309
+ "\n",
310
+ "Speaker 1 - 11:08\n",
311
+ "Sandra qui a proposé en septembre.\n",
312
+ "Speaker 2 - 11:11\n",
313
+ "Oui. Ou il y a d'autres... Moi j'aimerais bien faire moi, mais j'ai... Et le\n",
314
+ "cinquième axe, c'est faciliter l'insertion. On va travailler peut-être avec\n",
315
+ "la mairie pour prendre des stagiaires de la zone, etc. Voir comment on\n",
316
+ "peut organiser ça avec les écoles. Il y a l'association même, je t'ai\n",
317
+ "envoyé. Donc il y a de quoi faire. Donc voilà. Est-ce qu'on peut obtenir\n",
318
+ "des fiches entreprises? Parce que la formation, il faut qu'on sache à\n",
319
+ "l'avance combien de salariés, etc.\n",
320
+ "Speaker 1 - 11:51\n",
321
+ "Le problème c'est qu'aujourd'hui avec la GPD, je suis très coincée. Par\n",
322
+ "exemple, si on a un fichier d'entreprise intéressé, je peux aller voir et\n",
323
+ "copier, des choses comme ça.\n",
324
+ "Speaker 2 - 12:12\n",
325
+ "On peut aller sur Papers aujourd'hui, on a tout.\n",
326
+ "Speaker 1 - 12:15\n",
327
+ "Après, l'association peut acheter un fichier aussi, ça ne coûte pas\n",
328
+ "énormément cher.\n",
329
+ "Speaker 2 - 12:19\n",
330
+ "Je vais le faire.\n",
331
+ "\n",
332
+ "Speaker 1 - 12:20\n",
333
+ "Mais attends, il faut que tu saches ce que tu veux.\n",
334
+ "Speaker 2 - 12:25\n",
335
+ "Je t'ai listé les choses qui peuvent nous intéresser et qu'est-ce qu'on\n",
336
+ "peut avoir. Parce que... Après, c'est une fiche qu'on peut mettre parce\n",
337
+ "que ça tu les as quasiment toutes ces informations après t'en as qui.\n",
338
+ "Speaker 1 - 12:47\n",
339
+ "Remplissent ces dossiers parce que oui voilà tu complètes la fiche on a\n",
340
+ "déjà.\n",
341
+ "Speaker 2 - 12:53\n",
342
+ "Et plus par exemple le chiffre d'affaires sur certaines aides je pense ça\n",
343
+ "joue ça c'est lui qui va donner le dossier après il y en a qui remplissent\n",
344
+ "tout et d'autres non Ouais, on va prendre ce qu'on a, de toute façon...\n",
345
+ "C'est pour l'adhésion, ça? Oui. C'est surtout... Attends, il y a un truc...\n",
346
+ "Petite question, étant le... Je suis secrétaire, moi. Justement on va\n",
347
+ "essayer de le dépenser. L'adhésion pourrait être déjà l'affaire gratuite\n",
348
+ "non? Faut pas déjà commencer par ça. Non parce que si tu... On n'a pas\n",
349
+ "beaucoup d'argent, on va à 21.000 ou 21.000. Ouais c'est pas mal et\n",
350
+ "puis dépensez pas. Non mais on va les dépenser. Il suffit d'un projet et\n",
351
+ "tout part à la poubelle. Ça dépend du projet. Si tu fais gratuit, tu ne\n",
352
+ "concernes pas les gens en fait. La somme n'est pas grosse.\n",
353
+ "\n",
354
+ "Speaker 2 - 13:48\n",
355
+ "Non, non, c'est pas la même chose, mais bon. Le but, ce n'était pas de\n",
356
+ "remplir les caisses, c'est que quand on faisait des choses, on dépensait,\n",
357
+ "sauf que là, on a été un an vide sans rien faire. Le but, c'est de faire des\n",
358
+ "choses. On avait essayé de mettre en place des caméras, c'est\n",
359
+ "l'Amérique qui a probablement fait le truc, mais on devait faire des\n",
360
+ "aides avec l'Amérique. Convivialité.\n",
361
+ "Speaker 1 - 14:12\n",
362
+ "Oui en fait là tout ça c'est très bien mais il faut un planning.\n",
363
+ "Speaker 2 - 14:16\n",
364
+ "Justement j'ai donné des axes, on est là pour établir un planning.\n",
365
+ "Speaker 1 - 14:20\n",
366
+ "Donc par rapport aux données des entreprises qu'est-ce qu'on va\n",
367
+ "établir?\n",
368
+ "Speaker 2 - 14:26\n",
369
+ "Non mais on va prendre ce qu'on a et moi je peux compléter sur\n",
370
+ "internet. Moi je peux rajouter, parce que moi.\n",
371
+ "Speaker 1 - 14:32\n",
372
+ "Je vais essayer de refaire comme je.\n",
373
+ "\n",
374
+ "Speaker 2 - 14:34\n",
375
+ "L'Ai fait tout au début, le tour de tous les entreprises Il faut venir avec\n",
376
+ "un projet. On va essayer de mettre ça, faire joli. C'est pour ça que si je\n",
377
+ "peux y aller avec la décision de cette année parce que du coup on est\n",
378
+ "déjà... Septembre. Juillet. Juillet c'est mort. Donc septembre il faudrait\n",
379
+ "qu'on aille tout en place et puis faire le tour. Oui, je vais faire un flyer\n",
380
+ "pour vraiment qu'on vienne avec quelque chose pour le navire. On\n",
381
+ "travaille pour vous, on va aller chercher des subventions, de l'argent.\n",
382
+ "Sinon, il n'y a personne qui va venir. Je ne sais même pas si j'ai le flyer.\n",
383
+ "Je ne l'ai pas là. Si, si, on a fait un flyer. Il m'en reste encore. C'est toi\n",
384
+ "qui avais fait les couleurs.\n",
385
+ "Speaker 1 - 15:21\n",
386
+ "On va faire avec les données qu'on a. Après, si on a besoin d'aller plus\n",
387
+ "loin, On verra. J'ai un fichier que j'ai beaucoup travaillé l'année dernière\n",
388
+ "avec Pierre Gaillard. On a fait le tour. Lui, il faut toujours effectivement\n",
389
+ "lui demander parce qu'il a toujours les noms des nouvelles entreprises.\n",
390
+ "Oui, c'est vrai qu'il est là-dedans. On avait fait ça. J'ai un fichier que j'ai\n",
391
+ "partagé avec lui, que je peux vous partager. Mais il y a beaucoup\n",
392
+ "d'infos, mais pas le chiffre d'affaires par exemple.\n",
393
+ "Speaker 2 - 15:53\n",
394
+ "Le but, Andréa, de ça, pour aller chercher des subventions, au lieu\n",
395
+ "d'aller faire des demandes entreprise par entreprise, on peut les\n",
396
+ "grouper et l'impact peut être beaucoup mieux.\n",
397
+ "Speaker 1 - 16:04\n",
398
+ "Oui, mais ceux qui donnent les subventions n'analysent pas les dossiers\n",
399
+ "collectivement.\n",
400
+ "\n",
401
+ "Speaker 2 - 16:09\n",
402
+ "Je comprends, mais on arrive avec un dossier de plusieurs sociétés.\n",
403
+ "Moi, mon consultant, il m'a dit, précis sur des dossiers, on peut faire\n",
404
+ "grouper et présenter pour les subventions. C'est pas un dossier, c'est\n",
405
+ "plusieurs dossiers mais en même temps.\n",
406
+ "Speaker 1 - 16:32\n",
407
+ "Par exemple en ce moment, Pierre qui s'occupe du photovoltaïque a 2\n",
408
+ "dossiers, je crois 3 dossiers, il attend la réponse.\n",
409
+ "Speaker 2 - 16:40\n",
410
+ "Non, moi je l'ai eu la réponse. Non, c'est bon? C'est bloqué, je ne sais\n",
411
+ "pas où c'est bloqué mais c'est bloqué. C'est pas bloqué en fait, ils\n",
412
+ "traitent les dossiers. Comme moi c'était le premier dossier, on a eu la\n",
413
+ "réponse il y a une semaine. Ce qu'il a fait Gilda, lui c'est déjà fait, c'est\n",
414
+ "installé. Clabo lui l'a arrêté pour l'instant, parce qu'il fait son\n",
415
+ "acquisition.\n",
416
+ "Speaker 1 - 17:03\n",
417
+ "Et il y a Manuel.\n",
418
+ "Speaker 2 - 17:04\n",
419
+ "Manuel et toi. Et moi, Gilda, il a fait le chiffrage de la mise en état du\n",
420
+ "toit et des implantages parce que c'était mon problème. Mais\n",
421
+ "photovoltaïque j'ai rien pour l'instant.\n",
422
+ "\n",
423
+ "Speaker 1 - 17:16\n",
424
+ "Non mais là, t'as une aide spécifique. Pour les travaux de tatouage, pour\n",
425
+ "la préparer à recevoir les paniers.\n",
426
+ "Speaker 2 - 17:25\n",
427
+ "Le but c'était de faire un packaging complet et c'était possible de tout\n",
428
+ "mettre en même temps. Oui, mais est-ce que tu as fait la demande? Moi\n",
429
+ "ça a été fait, Gildan a fait les devis, etc. Non, réparation de toit, plus\n",
430
+ "photovoltaïque dans le même dossier.\n",
431
+ "Speaker 1 - 17:38\n",
432
+ "Mais Gildan a rien fait auprès de la région, parce que c'est un dossier\n",
433
+ "quand même un petit peu complexe, qu'il.\n",
434
+ "Speaker 2 - 17:42\n",
435
+ "Faut présenter à la région. Ben moi je suis.\n",
436
+ "Speaker 1 - 17:46\n",
437
+ "Inférieur des devis. Oui mais c'est... Laisse-moi, il faut que tu aies les\n",
438
+ "dévis. Tu as les dévis?\n",
439
+ "Speaker 2 - 17:53\n",
440
+ "J'ai pas les dévis en fait.\n",
441
+ "\n",
442
+ "Speaker 1 - 17:54\n",
443
+ "Demande les dévis. Au moment où tu as les dévis, on peut voir pour\n",
444
+ "faire la démarche de l'aide. Mais là c'est trop tard. Non, c'est pas trop\n",
445
+ "tard.\n",
446
+ "Speaker 2 - 18:04\n",
447
+ "Elle a déjà présenté un dossier juste pour le photovoltaïque.\n",
448
+ "Speaker 1 - 18:07\n",
449
+ "Qui?\n",
450
+ "Speaker 2 - 18:08\n",
451
+ "Lui. C'est ça, hein? Non, non. En fait, si c'est passé par Gilda et que tu\n",
452
+ "fais photovoltaïque, il n'y a pas de suite pour l'instant.\n",
453
+ "Speaker 1 - 18:15\n",
454
+ "Bon, je vole avec Pierre, parce que je pense que Pierre n'a pas... Parce.\n",
455
+ "Speaker 2 - 18:20\n",
456
+ "Que ça, tu gagnes combien à faire un truc comme ça? Ben, les\n",
457
+ "subventions, c'était beaucoup, hein, je crois. Nous, on a 120 000 euros,\n",
458
+ "hein, sur un dossier qui fait 370 000. T'as la moitié, c'est presque 50 %,\n",
459
+ "je vois. T'as combien, t'as? C'est pas négligeable.\n",
460
+ "\n",
461
+ "Speaker 1 - 18:35\n",
462
+ "OK, donc, pour les entreprises, on fera... Je vais noter que l'association\n",
463
+ "va utiliser... Le fichier existant et selon le mésoin.\n",
464
+ "Speaker 2 - 18:55\n",
465
+ "T'as déjà payé la pression ou pas? C'est Pierre qui s'occupe du volto?\n",
466
+ "Oui.\n",
467
+ "Speaker 1 - 19:02\n",
468
+ "Non, pas Pierre Gaillard. C'est Pierre le consultant. C'est un consultant\n",
469
+ "que j'ai invité.\n",
470
+ "Speaker 2 - 19:08\n",
471
+ "Oui, Green il s'appelle.\n",
472
+ "Speaker 1 - 19:09\n",
473
+ "Je vois le mec Pierre et on se parle un peu. Parce que je pense pas\n",
474
+ "qu'Egida a fait le nécessaire pour son dossier. Non, le devis était fait,\n",
475
+ "mais il.\n",
476
+ "Speaker 2 - 19:18\n",
477
+ "M'A dit que je lui ai le transmis.\n",
478
+ "Speaker 1 - 19:21\n",
479
+ "Du coup, je sais pas où ça en est. Moi, ce que je voulais faire, c'est.\n",
480
+ "\n",
481
+ "Speaker 2 - 19:24\n",
482
+ "Ce que je leur ai dit. Moi, je veux savoir quelle aide je dois donner. Et\n",
483
+ "quelle aide j'ai. Et en fonction de l'aide, je le fais ou je le fais pas, tu\n",
484
+ "vois. Moi, j'ai pas les rangs pour faire tout seul. C'était un truc énorme.\n",
485
+ "Donc, si j'ai la moitié des aides, c'est bon.\n",
486
+ "Speaker 1 - 19:42\n",
487
+ "Donc le devis que tu attends, c'est pour le désamientage.\n",
488
+ "Speaker 2 - 19:49\n",
489
+ "Désamientage, il faut tout faire en même temps. C'était tout simple.\n",
490
+ "Mais Gilda, les gars sont durs.\n",
491
+ "Speaker 1 - 19:57\n",
492
+ "Mais tu attends le devis du désamientage de Gilda.\n",
493
+ "Speaker 2 - 20:00\n",
494
+ "Et le toit neuf. Ça, j'attends. Ils sont venus, ils ont fait des relevés tout à\n",
495
+ "de suite.\n",
496
+ "Speaker 1 - 20:08\n",
497
+ "Et ça fait presque un an. Je pense que Pierre... Donc là, il.\n",
498
+ "Speaker 2 - 20:16\n",
499
+ "Faut contacter le monsieur qui a écrit.\n",
500
+ "\n",
501
+ "Speaker 1 - 20:18\n",
502
+ "Je m'en occupe.\n",
503
+ "Speaker 2 - 20:20\n",
504
+ "Et après, il vient chez toi, il fait un constat. Tu fais un projet?\n",
505
+ "Speaker 1 - 20:25\n",
506
+ "Non, attends. Parce que tu veux te lancer dans ça?\n",
507
+ "Speaker 2 - 20:28\n",
508
+ "Tu le vois? Il est vieux, ton bâtiment. C'est quoi le problème? En fait,\n",
509
+ "c'est de savoir si la structure supporte... Moi, le problème, si je suis\n",
510
+ "comme Christian, c'est qu'il n'y a pas le papier qui dit combien le toit...\n",
511
+ "Elle supporte pas.\n",
512
+ "Speaker 1 - 20:45\n",
513
+ "En fait, la problématique, c'est pour installer les panneaux, il intègre\n",
514
+ "dans la prestation l'étude architecturale de la capacité du toit à recevoir\n",
515
+ "les panneaux.\n",
516
+ "Speaker 2 - 20:58\n",
517
+ "Qui a un certain poids au mètre carrière. Après, t'as la possibilité de\n",
518
+ "faire un parking avec un toit couvert.\n",
519
+ "Speaker 1 - 21:06\n",
520
+ "Des ombrières, c'est ce qu'on appelle des ombrières.\n",
521
+ "\n",
522
+ "Speaker 2 - 21:09\n",
523
+ "Là, ça chiffre. J'ai essayé moi. Ça chiffre aussi? Bon, quand tu veux\n",
524
+ "t'ouvrir. Mais là-bas, mon nouveau bâtiment, il se porte pas. C'est tout\n",
525
+ "neuf, ils ne l'ont pas fait pour supporter. Même le mien, il n'est pas\n",
526
+ "dégueulasse son bâtiment. Et c'est fait par des ingénieurs. Là\n",
527
+ "aujourd'hui c'est obligatoire, mais comme il date deux ans le projet, ils\n",
528
+ "ont évité ce problème là. Tu sais la différence ça fait combien? Mais là\n",
529
+ "pour refaire c'est 200. Bah oui mais oui je me doute.\n",
530
+ "Speaker 1 - 21:44\n",
531
+ "C'est n'importe quoi. Pierre je l'avais invité l'année dernière et si c'est\n",
532
+ "quelque chose que ça t'intéresse je peux lui dire mais lui il te fait payer\n",
533
+ "son étude.\n",
534
+ "Speaker 2 - 22:00\n",
535
+ "Après.\n",
536
+ "Speaker 1 - 22:04\n",
537
+ "Le dessus de la toiture qui est important, mais après il fait aussi\n",
538
+ "l'estimation de ta consommation, de combien tu vas utiliser, combien tu\n",
539
+ "vas générer, combien mètre carré de panneaux photovoltaïques que tu\n",
540
+ "vas mettre.\n",
541
+ "Speaker 2 - 22:17\n",
542
+ "Tu peux vendre.\n",
543
+ "Speaker 1 - 22:19\n",
544
+ "Voilà. Mais après s'il y a trop de gens qui vont... 160 kg, je vais.\n",
545
+ "\n",
546
+ "Speaker 2 - 22:22\n",
547
+ "Mettre sur le toit, j'ai pas besoin. Comme Guillaume il va pas le faire, il\n",
548
+ "va... Voilà, c'est moi qui vais acheter.\n",
549
+ "Speaker 1 - 22:33\n",
550
+ "Parce que les futurs acheteurs peuvent être par exemple Philippe qui\n",
551
+ "consomme, Clavo qui consomme, toutes les entreprises de mécanique.\n",
552
+ "Speaker 2 - 22:46\n",
553
+ "Même s'ils ne sont pas à côté, tu peux vraiment vendre mon bâtiment à\n",
554
+ "côté là-bas. Mais je ne suis pas en lien direct.\n",
555
+ "Speaker 1 - 22:52\n",
556
+ "C'est jusqu'à deux kilomètres encore près du périmètre. C'est ce qu'il\n",
557
+ "nous a dit. Donc je m'occupe de toi Philippe, parce que je pense qu'il y a\n",
558
+ "un embrouille là, c'est pas clair. Il défend les évis pour pouvoir... Moi.\n",
559
+ "Speaker 2 - 23:09\n",
560
+ "En fait ce que je veux savoir c'est l'ensemble ce que ça va me coûter et\n",
561
+ "ce que j'ai comme aide. Et si je vois que je peux le faire, je le fais. Si\n",
562
+ "c'est aberrant, moi je pourrais pas.\n",
563
+ "Speaker 1 - 23:27\n",
564
+ "Tu penses aussi qu'en 3 ans, tu seras à la retraite. Est-ce qu'il y a un\n",
565
+ "intérêt pour toi?\n",
566
+ "\n",
567
+ "Speaker 2 - 23:34\n",
568
+ "Moi, c'est pour valoriser le bâtiment, surtout. T'inquiète-toi, la semaine\n",
569
+ "prochaine, ça ne vaudra plus rien. Comme ça, on est tranquille. C'est\n",
570
+ "ma femme. On va dire que ça aurait été le front de gauche. Alors là,\n",
571
+ "open bar. Les portes ouvertes, tout le monde a tout. C'est ce que tu\n",
572
+ "aimes. C'est tout à fait ça parce que dans les pays où les...\n",
573
+ "Speaker 1 - 24:22\n",
574
+ "On partage, on partage.\n",
575
+ "Speaker 2 - 24:24\n",
576
+ "Oui, oui, ça m'arrive.\n",
577
+ "Speaker 1 - 24:27\n",
578
+ "Par contre... Oui.\n",
579
+ "Speaker 2 - 24:29\n",
580
+ "Je te disais, Christian, t'as déjà payé ou t'as pas payé encore? J'ai pas\n",
581
+ "payé encore. Eh ben, tu me donnes la facture, je te fais le chèque, t'iras\n",
582
+ "donner le chèque. Ou je vais l'amener. Non, non, moi je... Tu les vois\n",
583
+ "souvent? Oui. Bon ben, tu me donnes la facture et je te paye. Mais il me\n",
584
+ "faut une facture, moi. Parce que je suis un bon trésorier et je paye que\n",
585
+ "si j'ai une facture. OK. Pas de problème. Parce qu'après, ma... OK. Ma\n",
586
+ "chère compta, elle va me dire... Mais qu'est-ce que j'ai fait, alors? Deux\n",
587
+ "fois par mois? C'est bon?\n",
588
+ "\n",
589
+ "Speaker 1 - 25:15\n",
590
+ "Donc, du coup, c'est plané. Alors, après, non, attends, tu voulais que je\n",
591
+ "choisisse un nom pour ton programme?\n",
592
+ "Speaker 2 - 25:21\n",
593
+ "Hum-hum. Moi j'aime bien le premier après. Charme. Moi j'aurais\n",
594
+ "préféré en marque. Charme parce qu'on peut faire un logo ou un truc\n",
595
+ "sympa avec ça. Chante l'eau, horizon, attractivité, renouveau,\n",
596
+ "modernité, entreprise. Le premier est très bien parce que les deux\n",
597
+ "autres c'est Chanteloup.\n",
598
+ "Speaker 1 - 25:58\n",
599
+ "Oui. Je dirais plutôt Sétan vers l'avenir. Plus que Chanteloup parce\n",
600
+ "qu'on est dans le parc d'activité de Sétan. Chanteloup ça fait trop la\n",
601
+ "ville. C'est mon point de vue.\n",
602
+ "Speaker 2 - 26:13\n",
603
+ "On va voter. Donc toi tu prends quoi? Je ne vote pas.\n",
604
+ "Speaker 1 - 26:18\n",
605
+ "Je ne vote pas. En fait je ne comprends pas.\n",
606
+ "\n",
607
+ "Speaker 2 - 26:22\n",
608
+ "Excuse-moi. On va juste donner un nom à ces axes. Quand on fait des\n",
609
+ "flyers, on va mettre ça en avant. On va faire un flyer. Dans Charme, il y\n",
610
+ "a chantelot, horizon, attractivité, renouveau, modernité. Tu n'as pas fait\n",
611
+ "d'autres exemples, en fait. Mais si, j'ai donné trois... Vers l'avenir et\n",
612
+ "future innovation. C'est pour faire genre... C'est ton futur. C'est ton\n",
613
+ "avenir.\n",
614
+ "Speaker 1 - 27:19\n",
615
+ "Vers l'avenir ou avenir.\n",
616
+ "Speaker 2 - 27:21\n",
617
+ "C'est temps à venir, vers l'avenir. Bon, on verra.\n",
618
+ "Speaker 1 - 27:28\n",
619
+ "C'est pas ça qui va faire... Non.\n",
620
+ "Speaker 2 - 27:29\n",
621
+ "Non, non, c'est pas ça. Bon, c'est lui. Oula. Vers l'avenir, c'est mieux que\n",
622
+ "chambre, on sait pas où on va. On sait pas ce que c'est comme\n",
623
+ "association. Ben, oui, ça fait... Oh ben alors, moi je croyais que t'allais te\n",
624
+ "faire tomber dedans. Justement, c'est pour cela qu'on va détailler ce\n",
625
+ "que c'est charme. On les met en couleurs, c'est pas charme. Faut mieux,\n",
626
+ "ouais, parce qu'on parle pas... On parle pas... Ça fait un peu maison...\n",
627
+ "Maison, vous êtes obligés de faire un téléphone rose, mais...\n",
628
+ "Speaker 1 - 28:02\n",
629
+ "Une hotline.\n",
630
+ "\n",
631
+ "Speaker 2 - 28:04\n",
632
+ "Ma marque, elle marchera pas beaucoup avec la hotline. Oh, la\n",
633
+ "catastrophe. Pourquoi ça marche, moi, ça? Je sais pas, mais... Moi aussi,\n",
634
+ "j'en avais essayé, je m'en fous. J'ai pas de problème. J'ai une ligne\n",
635
+ "dédiée, moi. Moi je suis en ADSL. Me repérer la dernière fois, t'es basée\n",
636
+ "où? Là-bas, rue des... Juste derrière moi, là. Ouais, juste derrière, là.\n",
637
+ "Oui? Non! Bodo! Côté d'AD déconstruction. AD déconstruction, pas\n",
638
+ "facile. Mais par exemple, je sais pas s'ils ont l'électronique et puis s'ils...\n",
639
+ "Avant le virage. Avant le virage. D'accord, avant le virage. À droite.\n",
640
+ "Juste avant Liba. S-T-I-M, Liba. Oui. Juste avant le virage. Après. Juste\n",
641
+ "devant le terrain vaguement. La deuxième à droite. La deuxième\n",
642
+ "décharge. Voilà.\n",
643
+ "Speaker 1 - 29:01\n",
644
+ "Moi, je pense qu'on connaît que c'est 7 ans. Donc, je propose que ce soit\n",
645
+ "7 ans vers l'avenir ou 7 ans vers l'avenir.\n",
646
+ "Speaker 2 - 29:11\n",
647
+ "C'est bien.\n",
648
+ "Speaker 1 - 29:11\n",
649
+ "Parce qu'on garde...\n",
650
+ "Speaker 2 - 29:13\n",
651
+ "On opte pour le deuxième. J'ai gardé 7 ans. T'as piqué mon stylo, c'est\n",
652
+ "pas grave. Je te le laisse après.\n",
653
+ "\n",
654
+ "Speaker 1 - 29:17\n",
655
+ "Non, non. J'ai noté.\n",
656
+ "Speaker 2 - 29:19\n",
657
+ "Donc, c'est ton.\n",
658
+ "Speaker 1 - 29:20\n",
659
+ "C'est bon pour toi aussi, Laurent?\n",
660
+ "Speaker 2 - 29:21\n",
661
+ "C'est ton avenir. C'est ton destin. Vert. C'est ton destin. C'est ton avenir.\n",
662
+ "Speaker 1 - 29:24\n",
663
+ "C'est ton avenir.\n",
664
+ "Speaker 2 - 29:25\n",
665
+ "Oui, oui. Non, mais... C'est pas mal! Non, non. Ça peut être très inconnu\n",
666
+ "quand même. C'est pas mal. C'est pas mal. Non, non, mais ben y'a pas.\n",
667
+ "J'aime beaucoup.\n",
668
+ "Speaker 1 - 29:38\n",
669
+ "C'est le temps à venir.\n",
670
+ "\n",
671
+ "Speaker 2 - 29:40\n",
672
+ "J'aime beaucoup. C'est temps à venir, on va jouer sur l'humour. Essayer\n",
673
+ "de faire un truc... Ok.\n",
674
+ "Speaker 1 - 29:52\n",
675
+ "Après tu peux, en fait, tu peux faire... Tu peux modifier le logo, la\n",
676
+ "baseline du logo de Cétendéveloppement parce qu'on avait deux logos,\n",
677
+ "on avait le logo tout court Cétendéveloppement et on avait un logo\n",
678
+ "Cétendéveloppement avec la baseline. Ça c'est le logo. Et la baseline,\n",
679
+ "c'est ce qui est écrit en bas. On avait fait un atelier pour ça, vous\n",
680
+ "souvenez au tout départ. Et la baseline, c'était conjuguons nos talents\n",
681
+ "pour réussir ensemble. C'était la baseline de cet an. Donc maintenant,\n",
682
+ "tu peux refaire un logo. C'est ton développement. Et après en bas, tu\n",
683
+ "peux mettre… C'est ton avenir. C'est ton avenir. Et tu peux prendre\n",
684
+ "quelques mots de ce que tu avais choisi, renouveau, attractivité, voilà.\n",
685
+ "Faire une baseline comme ça. Je vous propose d'acter un planning c'est\n",
686
+ "bon?\n",
687
+ "Speaker 1 - 31:04\n",
688
+ "Donc déjà, on avait dit que Sandra pouvait nous faire une visite à la\n",
689
+ "rentrée, et il y a aussi les 30 ans du relais. Je pense que c'est important\n",
690
+ "que les entreprises participent. C'est un membre fondateur, ils sont là\n",
691
+ "depuis le temps. OK. Donc, je crois que c'est le 27 septembre. Bon, je\n",
692
+ "note en septembre donc il y a les comptants du ralais. Je crois que c'est\n",
693
+ "le 27, c'est un vendredi elle a dit. C'est le vendredi.\n",
694
+ "Speaker 2 - 31:54\n",
695
+ "Après il y aura une visite chez Magic Model.\n",
696
+ "\n",
697
+ "Speaker 1 - 31:56\n",
698
+ "La visite, on peut la faire en octobre comme ça on fait un trou par mois.\n",
699
+ "Mais bon, déjà, attendons que les gens s'inscrivent. Si on a trop de\n",
700
+ "monde, on fait d'autres dates. On ne va pas commencer en disant un an,\n",
701
+ "mais on limite. On attend, en connaissant les gens. Après, il y avait...\n",
702
+ "Est-ce qu'on peut.\n",
703
+ "Speaker 2 - 32:29\n",
704
+ "Intervenir sur le premier axe? En septembre.\n",
705
+ "Speaker 1 - 32:37\n",
706
+ "Sur la formation? Bah si en novembre, si on fait un truc en novembre,\n",
707
+ "une intervention sur la formation et les opcos, tout ça, cela non.\n",
708
+ "Speaker 2 - 32:52\n",
709
+ "Pourquoi tu fais pas ça à la prochaine?\n",
710
+ "Speaker 1 - 32:56\n",
711
+ "La prochaine, c'est quoi?\n",
712
+ "Speaker 2 - 32:58\n",
713
+ "Septembre.\n",
714
+ "Speaker 1 - 32:59\n",
715
+ "Oui mais en septembre, il y a le fronton de relais. Tu envies ça? On peut\n",
716
+ "faire... Dispatcher, pas tout faire dans le même mois.\n",
717
+ "\n",
718
+ "Speaker 2 - 33:08\n",
719
+ "De toute façon, on n'arrivera pas à tout faire dans le même mois. Par\n",
720
+ "l'expérience. Par l'expérience, on va pas vraiment en réfléchir. Parce\n",
721
+ "que les gens, ils soufflent pas.\n",
722
+ "Speaker 1 - 33:22\n",
723
+ "C'est pour ça qu'on s'essouffle. C'est pour ça qu'on s'essouffle.\n",
724
+ "Speaker 2 - 33:27\n",
725
+ "Les visites, c'est de la convivialité, c'est...\n",
726
+ "Speaker 1 - 33:32\n",
727
+ "Oui, mais c'est du temps pour les gens aussi. Après, il faut savoir que la\n",
728
+ "moyenne de participants que tu as au niveau de l'association, pour les\n",
729
+ "ateliers, t'as entre 5 et 8 personnes à peu près, pour les ateliers\n",
730
+ "thématiques. Après, pour les troupes conviviaux, la galette, le barbecue,\n",
731
+ "la gée, tu peux aller jusqu'à 15, mais ça c'est la moyenne du nombre de\n",
732
+ "participants. Il faut que tu gardes ça en tête. Si tu vas solliciter un\n",
733
+ "intervenant, tu lui dis. Moi, quand j'ai les intervenants, je dis c'est un\n",
734
+ "petit comité, c'est plutôt atelier. Il faut leur dire pour qu'ils s'adaptent\n",
735
+ "aussi et qu'ils n'attendent pas à avoir un auditorium. Donc...\n",
736
+ "Speaker 2 - 34:21\n",
737
+ "Sauf si on arrive à amener le message aux gens en disant, venez, c'est\n",
738
+ "dans votre intérêt. On va parler argent pour vous.\n",
739
+ "\n",
740
+ "Speaker 1 - 34:29\n",
741
+ "Bien sûr. Mais bon, des fois, même si on leur dit ça, les gens ne\n",
742
+ "viennent pas. Souviens-toi de la réunion qu'on a faite sur la retraite qui\n",
743
+ "était très intéressante avec ton consultant. On était autour de la table,\n",
744
+ "moins de dix. C'est toujours comme ça.\n",
745
+ "Speaker 2 - 34:47\n",
746
+ "Il y a combien d'adhérents, une société à l'Association? Je crois. Autour\n",
747
+ "de 25, 30. C'est toujours les mêmes qui viennent, je pense. Oui.\n",
748
+ "Speaker 1 - 34:56\n",
749
+ "Voilà, c'est toujours les mêmes qui se déplacent. Il y a ceux qui\n",
750
+ "adhèrent et ne viennent jamais.\n",
751
+ "Speaker 2 - 35:01\n",
752
+ "Après, il y a des nouveaux qu'on peut récupérer encore. Voilà, et puis il\n",
753
+ "y a des groupes. Donc il y a des pyramides où il n'y a pas de\n",
754
+ "responsable. Il a été remplacé? Je ne sais pas. Il devait me donner le\n",
755
+ "nom, je n'ai jamais eu le nom. Moi non plus. Mais il l'a mis dans la boîte\n",
756
+ "de mes parents. Je sais, il me l'a dit la dernière fois. Il devait me passer\n",
757
+ "les infos, mais il ne les a pas eues. Après, il m'a dit que je ne.\n",
758
+ "Speaker 1 - 35:37\n",
759
+ "Fais plus partie du truc.\n",
760
+ "\n",
761
+ "Speaker 2 - 35:40\n",
762
+ "Il s'est fait virer, c'est ça? Non mais il faut s'agir à l'époque. En commun\n",
763
+ "accord, il m'a dit. Ça veut dire un merci gentiment. Gentiment. Mais\n",
764
+ "comme l'idée le fait tout le temps. Parce que le premier... Le premier\n",
765
+ "éjecté sauf en pertes et fautes. Le premier, il est arrivé, il était le jour\n",
766
+ "du soir, il a allumé son ordinateur, et là il y avait un message. Monsieur,\n",
767
+ "à minuit, vous n'aurez plus accès au bâtiment, veuillez remettre vos clés\n",
768
+ "et sortez tout de suite.\n",
769
+ "Speaker 1 - 36:08\n",
770
+ "Pourquoi ça?\n",
771
+ "Speaker 2 - 36:09\n",
772
+ "Parce qu'en fait, Quand ils signent leur contrat, ils ont la somme à côté.\n",
773
+ "Donc le jour qu'on vous dit au revoir, vous aurez cette somme là.\n",
774
+ "Speaker 1 - 36:19\n",
775
+ "Mais c'est pas légal ça?\n",
776
+ "Speaker 2 - 36:21\n",
777
+ "C'est le système allemand. Si tu signes. En France, tu peux pas le faire,\n",
778
+ "mais eux, c'est des groupes étrangers, donc... C'est des Allemands, en\n",
779
+ "France.\n",
780
+ "Speaker 1 - 36:30\n",
781
+ "La végétarienne.\n",
782
+ "\n",
783
+ "Speaker 2 - 36:31\n",
784
+ "Oui, mais ils s'en foutent. Parce que tu signes... Mais au départ, tu\n",
785
+ "signes. C'est d'accord, déjà. Le Code du Travail, ça n'applique avant\n",
786
+ "tout. Oui, mais je suis d'accord. Mais ils sont malins. C'est comme les\n",
787
+ "étudiants chez Leclerc. Ils embauchent les étudiants chez Leclerc, ça\n",
788
+ "fait un scandale. Ils font des CDD. Et ils leur disent, t'es étudiant, tu vas\n",
789
+ "bosser 6 mois ou 8 mois chez nous. Au départ, ils leur font signer une\n",
790
+ "lettre de démission. C'est une lettre de démission à eux propres, qu'ils\n",
791
+ "signent, et le jour qu'ils n'ont plus besoin d'eux, ils sortent leur lettre à\n",
792
+ "eux. On a fait la demande de démissionner, mais eux, ils n'ont rien\n",
793
+ "demandé. C'est qu'on les force à dégager. C'est un système qui est\n",
794
+ "comme ça, qui est dégueulasse. Oui, c'est pas normal. Oui, mais dans ce\n",
795
+ "cas-là, les gens.\n",
796
+ "Speaker 1 - 37:15\n",
797
+ "Disent « je signe pas », et.\n",
798
+ "Speaker 2 - 37:16\n",
799
+ "On ne t'en bouge pas.\n",
800
+ "Speaker 1 - 37:19\n",
801
+ "C'est pas légal.\n",
802
+ "Speaker 2 - 37:20\n",
803
+ "Je suis d'accord avec toi. Mais ils font le système. Comme la plupart des\n",
804
+ "jeunes ont envie de bosser pendant la période d'études, ils signent.\n",
805
+ "Mais c'est énorme, c'est plus de 50%! C'est une marque à l'État! Par\n",
806
+ "contre là, ils ont... Ils ont l'option de plein air à la gueule. Et là, moi, j'en\n",
807
+ "ai demandé une formation pour changer de logiciel de gestion. Mais\n",
808
+ "c'est compliqué!\n",
809
+ "\n",
810
+ "Speaker 1 - 38:29\n",
811
+ "Oh là là, mais vous avez déjà.\n",
812
+ "Speaker 2 - 38:30\n",
813
+ "Dépassé le budget de 900. Après, le bon interlocuteur, c'est quand tu\n",
814
+ "l'as. Moi, je te dis… Oui, quel est ton interlocuteur? Pour les formations.\n",
815
+ "Moi, depuis que j'ai un RH… Tu es obligé de passer par un… Parce que\n",
816
+ "moi, pour te dire, une fois, je fais une intervention pour une formation,\n",
817
+ "j'avais 4 000 euros de formation. J'avais le droit à 2 000. Et puis, le\n",
818
+ "gars, il arrive, il me dit non, mais attends, aujourd'hui, on a des infos\n",
819
+ "supplémentaires, etc. Je peux te ralloyer 1 000 euros en plus. Donc de 4\n",
820
+ "000, je suis passé à 1 000 de dépenses. Et t'es obligé de passer par la\n",
821
+ "défi, mais... C'est un défi pour le... T'as pas compris l'idée. L'axe, là,\n",
822
+ "c'est bien sûr européen.\n",
823
+ "Speaker 1 - 39:17\n",
824
+ "Je croyais que le 7000, c'était pas un petit...\n",
825
+ "Speaker 2 - 39:20\n",
826
+ "C'est au-delà de ce qu'on connaît. Le gars, il va dire... Voilà, il y a ça, ça,\n",
827
+ "ça, ça. Vous avez le droit à ça, ça, ça, ça. Et moi, j'ai un contact, donc je\n",
828
+ "gagne. C'est-à-dire qu'avant, je faisais le dossier, Et puis, j'étais\n",
829
+ "remboursé, mais les dossiers sont mal préparés. Que là, maintenant, lui\n",
830
+ "vient, il me fait le dossier, et là, il me dit, bah tiens, cette année-là, on\n",
831
+ "va pouvoir rajouter 10%, 20%.\n",
832
+ "Speaker 1 - 39:42\n",
833
+ "Oui, CETIM, c'est une organisation, un peu, de la filière.\n",
834
+ "\n",
835
+ "Speaker 2 - 39:47\n",
836
+ "Je fais ça depuis 13 ans, moi. Moi, je l'ai fait quand j'ai découvert ça.\n",
837
+ "Speaker 1 - 39:51\n",
838
+ "C'est quelle filière? CETIM, c'est les industriels, de la mécanique.\n",
839
+ "Speaker 2 - 39:56\n",
840
+ "Je ne suis pas concerné, l'intergo, non.\n",
841
+ "Speaker 1 - 39:58\n",
842
+ "Mais tu dois avoir un opco, un truc comme ça, un organisme auquel tu\n",
843
+ "contribues financièrement.\n",
844
+ "Speaker 2 - 40:03\n",
845
+ "L'avantage de la métallurgie, il y a plein de contraintes au niveau\n",
846
+ "salarié, c'est catastrophique, mais tu as des aides aussi. Mais justement,\n",
847
+ "moi je ne suis pas à la convention de la métallurgie.\n",
848
+ "Speaker 1 - 40:13\n",
849
+ "Alors, ce que je te propose, si tu veux, comme en septembre il y a les 30\n",
850
+ "ans du relais, mais nous on n'organise rien, je vous invite vitement à y\n",
851
+ "aller, On peut organiser quelque chose en septembre si t'es très pressé\n",
852
+ "pour organiser un atelier en septembre.\n",
853
+ "Speaker 2 - 40:31\n",
854
+ "C'est pas l'histoire d'être pressé.\n",
855
+ "\n",
856
+ "Speaker 1 - 40:32\n",
857
+ "Non mais c'est important d'avoir un rythme, ça c'est clair.\n",
858
+ "Speaker 2 - 40:35\n",
859
+ "Parce que si on va en novembre, s'il y a des choses qu'on doit faire,\n",
860
+ "l'année elle est ratée.\n",
861
+ "Speaker 1 - 40:41\n",
862
+ "Oui, mais ton année, cette année, c'est... Commence en juillet, donc...\n",
863
+ "Oui, mais plus.\n",
864
+ "Speaker 2 - 40:47\n",
865
+ "On anticipe les choses, parce que là.\n",
866
+ "Speaker 1 - 40:49\n",
867
+ "Le premier sujet, c'est de l'argent. Donc, on va dire qu'en septembre, tu\n",
868
+ "voudrais faire un atelier sur... Un atelier sur le sujet de la formation.\n",
869
+ "Donc, il faut demander à ton... Ton conjuntant de te trouver un\n",
870
+ "interlocuteur. Je peux voir avec mes collègues qui s'occupent de tout ce\n",
871
+ "qui est RH, comment ça se passe, Si il y a des contacts dans les\n",
872
+ "soccos...\n",
873
+ "Speaker 2 - 41:13\n",
874
+ "Lui c'est son métier. Moi il m'accompagne dans plusieurs sujets. Il m'a\n",
875
+ "dit qu'il peut faire ce thème-là même si c'est pas dans son... Il peut...\n",
876
+ "C'est un grand cabinet à Bordeaux.\n",
877
+ "\n",
878
+ "Speaker 1 - 41:26\n",
879
+ "Après tu peux le faire à distance.\n",
880
+ "Speaker 2 - 41:30\n",
881
+ "Non, non, il vient. Moi j'ai un contrat avec lui. Il vient deux jours par\n",
882
+ "mois. Ok.\n",
883
+ "Speaker 1 - 41:38\n",
884
+ "Donc après il y avait la visite des magiques modèles qu'on peut faire en\n",
885
+ "octobre. Donc après il faut définir qui fait quoi. Après je vous propose,\n",
886
+ "qui a été évoqué, l'intérêt de faire cette collecte mutualisée comme ce\n",
887
+ "qu'on avait fait chez L'Oralet. Philippe, la collecte mutualisée. On m'a\n",
888
+ "dit, si vous voulez qu'on.\n",
889
+ "Speaker 2 - 42:03\n",
890
+ "La fasse... Pourquoi tu ne la fais pas chez Nicolas?\n",
891
+ "Speaker 1 - 42:08\n",
892
+ "Si, je peux demander à Nicolas de nous prêter le site. Je n'ai pas dit\n",
893
+ "qu'on va le faire, je le relais. Mais il faut valider déjà l'idée que le\n",
894
+ "bureau valide l'idée de faire une collecte.\n",
895
+ "Speaker 2 - 42:20\n",
896
+ "Oui. Ce n'est pas un concurrent pour lui?\n",
897
+ "\n",
898
+ "Speaker 1 - 42:27\n",
899
+ "Non. Non, parce qu'Aptima ne fait pas des collectes porte-à-porte des\n",
900
+ "déchets. Aptima, c'est un gestionnaire de déchetterie Donc si vous\n",
901
+ "voulez on peut faire une collecte, mutualiser des déchets, je peux m'en\n",
902
+ "occuper, je peux voir avec Aptima, mais aussi avec Nicolas, leur\n",
903
+ "proposer l'idée, mais peut-être que je ne sais pas si ça l'intéresse.\n",
904
+ "Speaker 2 - 42:58\n",
905
+ "Il faut qu'on trouve des sujets aussi dans ton domaine à toi. Sinon, tu\n",
906
+ "vas te faire taper sur les doigts bientôt.\n",
907
+ "Speaker 1 - 43:05\n",
908
+ "Non, je ne me fais pas taper sur les doigts, mais je dois justifier. Ton\n",
909
+ "déplacement à Chanteloup? Non, je suis seule. Par exemple, jusqu'à\n",
910
+ "maintenant, je dis non, mais c'est le dossier photovoltaïque. Il faut que\n",
911
+ "je garde le lien. J'ai un chef qui est intelligent, mais demain j'aurai un\n",
912
+ "autre chef.\n",
913
+ "Speaker 2 - 43:20\n",
914
+ "Mais la transition écologique, c'est un domaine à toi.\n",
915
+ "Speaker 1 - 43:22\n",
916
+ "Oui, on peut faire un atelier après.\n",
917
+ "Speaker 2 - 43:26\n",
918
+ "Préparation pour laver les covadices, des trucs comme ça.\n",
919
+ "\n",
920
+ "Speaker 1 - 43:30\n",
921
+ "Oui, ou on peut faire...\n",
922
+ "Speaker 2 - 43:31\n",
923
+ "C'est trop lourd.\n",
924
+ "Speaker 1 - 43:32\n",
925
+ "Non, on va pas faire la préparation.\n",
926
+ "Speaker 2 - 43:35\n",
927
+ "Pour laver les covadices.\n",
928
+ "Speaker 1 - 43:36\n",
929
+ "En général, la RSE, on peut voir un sujet comme ça. Peut-être qu'on\n",
930
+ "peut faire l'atelier en novembre ou décembre et la collecte au\n",
931
+ "printemps. Je vois avec le collecteur qu'est-ce qu'il peut nous proposer\n",
932
+ "comme matériaux à collecter en dehors de déchets électriques,\n",
933
+ "électroniques, parce que c'est ce qu'on a fait l'année dernière. Peut-être\n",
934
+ "qu'on peut faire aussi mobilier, des bureaux. L'idée c'est que ça soit\n",
935
+ "utile pour les entreprises.\n",
936
+ "Speaker 2 - 44:23\n",
937
+ "C'est Noël. C'est le temps. Parce que j'ai changé d'application et là je\n",
938
+ "suis resté sur Noël.\n",
939
+ "\n",
940
+ "Speaker 1 - 44:42\n",
941
+ "Donc, la réunion de l'atelier de septembre sur la formation, c'est\n",
942
+ "Christian qui s'en occupe. Pour la visite de Magic Model, je peux m'en\n",
943
+ "occuper, c'est facile avec Sandra nous donne un jour, on vient, et après\n",
944
+ "toi tu t'occupes d'amener un apéritif, un truc comme ça. Pour la collecte\n",
945
+ "mutualisée de déchets, je m'en occupe pour le type de déchets et la\n",
946
+ "date. Pour l'autre collecte, on était à l'extérieur tout le temps, quand il\n",
947
+ "s'est fait très froid, c'est pas marrant.\n",
948
+ "Speaker 2 - 45:14\n",
949
+ "C'est vrai qu'il s'est tristé longtemps.\n",
950
+ "Speaker 1 - 45:16\n",
951
+ "Et après, il y a un atelier sur un sujet développement durable, on peut\n",
952
+ "le faire.\n",
953
+ "Speaker 2 - 45:24\n",
954
+ "Pour la collecte, ce truc qui m'avait un peu embêté, c'était ceux qui\n",
955
+ "étaient nus, qui n'étaient pas partis de l'association.\n",
956
+ "Speaker 1 - 45:31\n",
957
+ "Oui, mais c'est un moyen aussi... Oui, mais ils n'ont pas adhéré. Je leur\n",
958
+ "envoyais par la suite.\n",
959
+ "Speaker 2 - 45:36\n",
960
+ "Et c'est ceux qui ont ramené le plus. C'est ceux qui ont rempli le\n",
961
+ "camion. Le pire, ça a été... Serop, je crois. C'est eux qui ont ramené le\n",
962
+ "plus.\n",
963
+ "\n",
964
+ "Speaker 1 - 45:47\n",
965
+ "Il y a Serop, il y a eu Eiffage aussi.\n",
966
+ "Speaker 2 - 45:55\n",
967
+ "Et Serop, lui, il pourrait s'inscrire, il ne faut pas déconner. Et Eiffage,\n",
968
+ "c'est plus compliqué si c'est un groupe. C'est S.E.H. ? Oui. Mais bon, le\n",
969
+ "directeur, c'est pareil, j'avais été les voir. Je les connais tous, j'avais été\n",
970
+ "les voir, mais les mecs, ils disent oui et puis ils font rien. Bon, on va aller\n",
971
+ "les violer, t'inquiète pas. Mais voilà, moi, est-ce qu'on fait les cotisations\n",
972
+ "de 2023? Est-ce qu'on leur demande ou on fait 2025? J'ai déjà été au\n",
973
+ "mois de novembre récupérer une année. Et la plupart ont payé.\n",
974
+ "Speaker 1 - 46:34\n",
975
+ "J'ai même Nicolas qui m'a dit qu'il.\n",
976
+ "Speaker 2 - 46:36\n",
977
+ "N'Avait pas payé l'autre année. Il m'a dit que je t'en dois une. Il y en a\n",
978
+ "qui sont bien. Est-ce qu'on fait un barbecue à la rentrée?\n",
979
+ "Speaker 1 - 46:47\n",
980
+ "Alors voilà c'est ça, après il y a les moments conviviaux, donc on a le\n",
981
+ "barbecue, on a la galette.\n",
982
+ "Speaker 2 - 46:52\n",
983
+ "Là le barbecue c'est mort au septembre, mais on peut le faire en\n",
984
+ "septembre, pour la reprise. Et ça, est-ce qu'on voit avec Gilda ou\n",
985
+ "ailleurs?\n",
986
+ "\n",
987
+ "Speaker 1 - 47:04\n",
988
+ "Parce que si par exemple on le fait ici, l'atelier sous la formation, on\n",
989
+ "peut enchaîner avec le barbecue. Est-il 17h l'atelier sur la formation et\n",
990
+ "à 18h on descend?\n",
991
+ "Speaker 2 - 47:21\n",
992
+ "Il faut mieux faire 19h. Bon?\n",
993
+ "Speaker 1 - 47:26\n",
994
+ "Mais les gens vont pas rester jusqu'à 18h.\n",
995
+ "Speaker 2 - 47:29\n",
996
+ "A 18h, personne n'a envie de manger à 18h. On ne peut pas le faire le\n",
997
+ "midi. C'est très compliqué. On a essayé plein de trucs. On a essayé le\n",
998
+ "soir, le vendredi. Non, ça ne marchait pas. Le soir, ça marchait bien.\n",
999
+ "C'était un jeudi ou un vendredi, je crois. Jeudi, parce que vendredi, il n'y\n",
1000
+ "en a pas justement. Le vendredi, oui, parce qu'il y en a qui partent, qui\n",
1001
+ "ne sont pas d'ici. Le mercredi, c'est pas bon, c'est la journée des\n",
1002
+ "enfants. Le vendredi, c'est la veille du week-end. Le lundi, ils sont pas\n",
1003
+ "encore rentrés. C'est plus que le mardi ou le jeudi. Le jeudi, ça passe\n",
1004
+ "bien. C'est du soin.\n",
1005
+ "Speaker 1 - 48:14\n",
1006
+ "Après, je pense qu'il faut alterner, il faut faire des choses. Après, le\n",
1007
+ "matin, il faut boire. Le soir... Moi, je pense que comme personne à\n",
1008
+ "huit...\n",
1009
+ "\n",
1010
+ "Speaker 2 - 48:23\n",
1011
+ "Le seul truc qui fonctionne, qu'on a réussi, c'est WhatsApp. Tu fais une\n",
1012
+ "délégation, ou tu mets en administration? Par contre, ce qui serait bien\n",
1013
+ "de savoir, c'est la liste complète des gens qui sont dans le jeu. Certains\n",
1014
+ "c'est des numéros, mais tu ne sais pas qui c'est derrière.\n",
1015
+ "Speaker 1 - 48:53\n",
1016
+ "Parce qu'il y a la police... Moi.\n",
1017
+ "Speaker 2 - 48:54\n",
1018
+ "J'Ai regardé, il y en a certains que t'as... Je pense que c'est lié à ce que\n",
1019
+ "t'as d'enregistré.\n",
1020
+ "Speaker 1 - 49:03\n",
1021
+ "Donc Christian, septembre l'atelier sur le sujet de la formation avec le\n",
1022
+ "barbecue.\n",
1023
+ "Speaker 2 - 49:09\n",
1024
+ "Toi tu t'en occupes?\n",
1025
+ "Speaker 1 - 49:11\n",
1026
+ "Si on le fait ici?\n",
1027
+ "Speaker 2 - 49:12\n",
1028
+ "Oui, il faut juste me confirmer pour qu'on puisse s'organiser.\n",
1029
+ "\n",
1030
+ "Speaker 1 - 49:16\n",
1031
+ "Mais sinon on peut voir déjà la date. Est-ce que t'as des complaintes?\n",
1032
+ "Speaker 2 - 49:21\n",
1033
+ "Est-ce que...\n",
1034
+ "Speaker 1 - 49:25\n",
1035
+ "Pour que tu puisses proposer à ton intervenant.\n",
1036
+ "Speaker 2 - 49:27\n",
1037
+ "Déjà. Non, il va s'adapter. On peut l'appeler tout à l'heure, si tu veux.\n",
1038
+ "Speaker 1 - 49:32\n",
1039
+ "Donc, si on dit un mardi ou un jeudi... Si on dit un mardi ou un jeudi de\n",
1040
+ "septembre... Sachant que la dernière semaine, je crois que c'est l'heure\n",
1041
+ "allée... Il y a le 18, le 20... Le 10, le 13...\n",
1042
+ "Speaker 2 - 49:52\n",
1043
+ "C'est un vendredi, le 10 et le 12. Non pas cette semaine, sur\n",
1044
+ "l'Allemagne. Il va nous parler de la formation parce que c'est... Il y a de\n",
1045
+ "l'argent dans l'échec. Et du coup, l'autre aussi... Oui, c'est deux\n",
1046
+ "numéros. Je pense que ça doit être ces deux numéros. C'est elle qui doit\n",
1047
+ "se cacher. C'est elle qui doit se cacher. Oui, après, c'est... Oui, ça,\n",
1048
+ "c'est... C'est notre...\n",
1049
+ "\n",
1050
+ "Speaker 1 - 50:46\n",
1051
+ "Et donc, avant la fin de l'année, un atelier. Un atelier de transition\n",
1052
+ "écologique, tu m'avais dit.\n",
1053
+ "Speaker 2 - 50:54\n",
1054
+ "Oui. Tu mets en deux. Le 17 ou le 19? Non, le 19. C'est très bien. C'est\n",
1055
+ "le soir, donc ça tombe très bien, Laurent il est là, pas besoin qu'il\n",
1056
+ "remonte. C'est très bien. C'est le soir là. C'est très bien, le 19 ça me va\n",
1057
+ "très bien. Laurent est là. Consultant.\n",
1058
+ "Speaker 1 - 51:33\n",
1059
+ "Le 19?\n",
1060
+ "Speaker 2 - 51:34\n",
1061
+ "Il est parti du Caudillère chez nous, donc il vient chaque mois.\n",
1062
+ "Speaker 1 - 51:38\n",
1063
+ "Est-ce que vous avez une contrainte le 19 septembre? C'est un H?\n",
1064
+ "Speaker 2 - 51:42\n",
1065
+ "Non, c'est un H.\n",
1066
+ "Speaker 1 - 51:44\n",
1067
+ "Et toi, t'as une contrainte le 19?\n",
1068
+ "\n",
1069
+ "Speaker 2 - 51:47\n",
1070
+ "Non, c'est qui? Espérance. Oui, c'est la nouvelle.\n",
1071
+ "Speaker 1 - 51:56\n",
1072
+ "Après, il y a en janvier la galette. On peut faire galette et atelier, et il y\n",
1073
+ "a. Ça te va?\n",
1074
+ "Speaker 2 - 52:06\n",
1075
+ "Oui.\n",
1076
+ "Speaker 1 - 52:13\n",
1077
+ "Intelligence artificielle et après, je te laisse voir.\n",
1078
+ "Speaker 2 - 52:20\n",
1079
+ "C'est une machin, c'est ça? Ou l'ADAPT.\n",
1080
+ "Speaker 1 - 52:25\n",
1081
+ "Après, il faut qu'ils te disent combien de temps ils envisagent. En fait, il\n",
1082
+ "ne faut pas que ça soit plus long d'une heure, style une demi-heure ou\n",
1083
+ "trois quarts d'heure d'intervention avec les questions, etc. Parce que\n",
1084
+ "sinon, c'est trop long pour les gens et on ne pourra pas les garder\n",
1085
+ "autant de temps.\n",
1086
+ "\n",
1087
+ "Speaker 2 - 52:45\n",
1088
+ "L'IA, on peut faire plusieurs ateliers parce qu'il y a plein de sujets là-\n",
1089
+ "dedans. Là, il y a une société française qui a eu beaucoup de\n",
1090
+ "subventions de l'État. Ils ont mis en place un super ordinateur. Ils\n",
1091
+ "veulent l'exploiter. Ils donnent l'accès gratos aux gens. Donc, il faut\n",
1092
+ "trouver des sociétés qui s'intéressent à ça. Genre lui, il fait beaucoup de\n",
1093
+ "calculs. Il y a plein de sujets là-dedans.\n",
1094
+ "Speaker 1 - 53:23\n",
1095
+ "Tu le laisses, voilà. Et donc en janvier, évitez la première semaine parce\n",
1096
+ "que c'est quand tout le monde arrive.\n",
1097
+ "Speaker 2 - 53:30\n",
1098
+ "Mais après...\n",
1099
+ "Speaker 1 - 53:39\n",
1100
+ "Oui madame, il y a des locaux. CPI Salina, il a une salle, à peu près de\n",
1101
+ "cette capacité.\n",
1102
+ "Speaker 2 - 53:47\n",
1103
+ "On peut faire ici, pas de problème.\n",
1104
+ "Speaker 1 - 53:50\n",
1105
+ "Oui, je sais, mais il faut essayer de changer, parce que quand tu\n",
1106
+ "changes de lieu, tu...\n",
1107
+ "\n",
1108
+ "Speaker 2 - 53:55\n",
1109
+ "Tu vas dire aux gens, ils sont curieux d'aller à...\n",
1110
+ "Speaker 1 - 53:58\n",
1111
+ "Déjà, il y a ça, mais c'est lui qui t'accueille, qui s'investit. Aussi, un petit\n",
1112
+ "peu, au moins, t'as fait de la salle.\n",
1113
+ "Speaker 2 - 54:04\n",
1114
+ "T'as pas de salle d'arrangement? Si vous voulez, oui.\n",
1115
+ "Speaker 1 - 54:11\n",
1116
+ "Par exemple, il y a...\n",
1117
+ "Speaker 2 - 54:13\n",
1118
+ "On peut aller de l'autre côté chez moi aussi.\n",
1119
+ "Speaker 1 - 54:14\n",
1120
+ "Il y a Alpha Diab, je crois.\n",
1121
+ "Speaker 2 - 54:17\n",
1122
+ "Alpha Diab, il peut. On avait Lidl, mais là, il faut qu'on arrive à\n",
1123
+ "retrouver le contact. Lidl pour la galette, oui.\n",
1124
+ "\n",
1125
+ "Speaker 1 - 54:28\n",
1126
+ "On verra, mais je ne pense pas qu'on ait besoin d'une salle aussi\n",
1127
+ "grande.\n",
1128
+ "Speaker 2 - 54:31\n",
1129
+ "Si, au moins une vingtaine à chaque fois, plus même. Au début, ça\n",
1130
+ "marchait bien, il y avait du monde. Si... Est-ce que t'as la police qui\n",
1131
+ "vient? Ouais, parce que la galette, c'est vrai qu'on arrive à faire venir...\n",
1132
+ "Quand il a bouffé... Non, mais eux, ils viennent... Parce que... Eux, ceux\n",
1133
+ "qui ont la réunion, ils s'en foutent un peu, mais quand on fait la galette,\n",
1134
+ "ils viennent, et puis c'est le moment... C'est le moment de les voir. Les\n",
1135
+ "pompiers aussi, t'es venu? Pompiers, pompiers aussi. L'adjoint préfet...\n",
1136
+ "Il y a beaucoup de gens. On a invité le maire de Carrière, une fois. On\n",
1137
+ "est bon. J'ai un gars qui voulait faire une réunion, mais bon, je sais pas\n",
1138
+ "si c'est... C'est un gars qui aide à faire des placements pour rentabiliser,\n",
1139
+ "pour faire baisser les impôts, etc.\n",
1140
+ "Speaker 2 - 55:25\n",
1141
+ "Et il a plein de solutions, donc je sais pas si ça intéresse. C'est comme...\n",
1142
+ "C'est comme des banques aussi qui proposent ce genre de produits.\n",
1143
+ "Tout le monde propose. La G2R, le mec qu'on a eu pour l'aérotrail. Oui,\n",
1144
+ "c'est ça. Lui, il fait partie d'un groupe, je sais plus si c'était un groupe.\n",
1145
+ "On est bon?\n",
1146
+ "Speaker 1 - 55:50\n",
1147
+ "Ok, donc on joue bien la galette et ensuite?\n",
1148
+ "Speaker 2 - 55:56\n",
1149
+ "Ensuite on peut refaire un tour d'IA si tu veux, on peut parler... Les 2-3\n",
1150
+ "là, l'IA et la transition écologique c'est pas une réunion, ça suffit pas.\n",
1151
+ "\n",
1152
+ "Speaker 1 - 56:12\n",
1153
+ "Oui bien sûr, après j'ai mis que je proposerais un sujet parce que Le\n",
1154
+ "sujet est trop vaste, est-ce qu'on va parler d'énergie, est-ce qu'on va\n",
1155
+ "parler de...\n",
1156
+ "Speaker 2 - 56:20\n",
1157
+ "Est-ce que tu pourrais ressortir sur une feuille à carte les quelques\n",
1158
+ "dates qu'on est sûr qu'on calque? Parce que du coup, moi, je pourrais le\n",
1159
+ "joindre avec le bulletin d'adhésion. Et comme ça, les gens, ils verront\n",
1160
+ "qu'il y a déjà des dates de prévues.\n",
1161
+ "Speaker 1 - 56:36\n",
1162
+ "Il y a le 19 septembre.\n",
1163
+ "Speaker 2 - 56:38\n",
1164
+ "C'est une date. Et le 30, tout ça? Genre barbecue, galette, tout ça, on\n",
1165
+ "peut déjà le mettre. Comme ça, quand ils font l'adhésion, ils ont déjà\n",
1166
+ "des dates en vue.\n",
1167
+ "Speaker 1 - 56:48\n",
1168
+ "Le 19 septembre, c'est le barbecue. La galette, on peut choisir une date.\n",
1169
+ "Après, si on veut faire dans des zones coquises, il faut quand même\n",
1170
+ "qu'ils disent s'ils peuvent nous accueillir. Mais si vous voulez pas être...\n",
1171
+ "Non.\n",
1172
+ "\n",
1173
+ "Speaker 2 - 56:58\n",
1174
+ "Parce que si on met tout ça en place, moi... Moi, du coup, je dirais\n",
1175
+ "qu'en... Et les 30 ans de...\n",
1176
+ "Speaker 1 - 57:04\n",
1177
+ "Du renard, c'est quand? C'est le 27, je crois.\n",
1178
+ "Speaker 2 - 57:08\n",
1179
+ "C'est septembre, ouais. C'est une date à mettre aussi. Oui, je le mets ici.\n",
1180
+ "Moi, dans ce cas-là, je le fais en septembre, début septembre. Je fais du\n",
1181
+ "porte-à-porte.\n",
1182
+ "Speaker 1 - 57:25\n",
1183
+ "Ça a été la réunion à l'Amérique?\n",
1184
+ "Speaker 2 - 57:29\n",
1185
+ "Oui.\n",
1186
+ "Speaker 1 - 57:30\n",
1187
+ "Il y a eu des infos...\n",
1188
+ "\n",
1189
+ "Speaker 2 - 57:38\n",
1190
+ "Ils ont parlé des cités, tout ça. À mon avis, c'est quelque chose\n",
1191
+ "d'habituel chez eux. Mais surtout, ils ont parlé des jours un peu\n",
1192
+ "sensibles, genre le 7, les élections. Faut que je fasse passer un message\n",
1193
+ "sur WhatsApp pour dire aux gens de ranger vos poubelles. Il y a eu le\n",
1194
+ "30 aussi, la marche blanche de Naël à Nanterre. A part nous, ça s'est\n",
1195
+ "bien passé. Après le reste, c'est... Vous avez déjà tout pété l'année\n",
1196
+ "dernière, vous n'avez pas pété tout cette année quand même. Il y avait\n",
1197
+ "un risque, le commissaire était là et il a dit, si ça pète à Nanterre, il\n",
1198
+ "risque d'avoir une répercussion Non mais ça va être très chaud. Déjà ils\n",
1199
+ "commencent à en parler au niveau des préfectures et tout. Ils disent\n",
1200
+ "que ça va être un truc très dangereux.\n",
1201
+ "Speaker 1 - 58:45\n",
1202
+ "C'est le week-end.\n",
1203
+ "Speaker 2 - 58:47\n",
1204
+ "C'est le 14 non? C'est ce week-end les élections.\n",
1205
+ "Speaker 1 - 58:50\n",
1206
+ "C'est le week-end le deuxième tour.\n",
1207
+ "Speaker 2 - 58:51\n",
1208
+ "Ce sera dimanche soir si ça doit péter. Donc ouais. Donc ça risque\n",
1209
+ "d'être chaud là cette période là. Enfin là il y a 33% de... Ils ont plus de\n",
1210
+ "33% quand même, ça fait une sacrée partie de la France. Ça représente\n",
1211
+ "10 millions de Français. Mais c'est pas les fouteurs de merde. Plus 13,\n",
1212
+ "10 millions de Français. Mais ça va peut-être... T'es français, habillé?\n",
1213
+ "J'ai déjà aimé être habillé, mais je vais retourner au pays.\n",
1214
+ "\n",
1215
+ "Speaker 1 - 59:26\n",
1216
+ "Tu pourras pas être ministre. C'est pourquoi ils ont dit que les ministres\n",
1217
+ "pourraient pas être bien nationaux.\n",
1218
+ "Speaker 2 - 59:32\n",
1219
+ "Je suis trinational, donc je parle trinational. C'est très rigolo parce que,\n",
1220
+ "tu vois, ils parlent pour les politiques et en même temps pour les\n",
1221
+ "entreprises. Sur le truc éco, la BFM éco, pas BFM machin, mais BFM\n",
1222
+ "éco, lendemain où il y a eu toute cette polémique, il y a eu un patron\n",
1223
+ "des patrons, je sais plus qui parlait justement qu'en fait, les entreprises,\n",
1224
+ "qui sont un petit peu... Sensibles. Non, sensibles. On met pas les gens\n",
1225
+ "avec des doubles nationalités non plus. Donc je veux dire, c'est pas\n",
1226
+ "qu'une question de politique ou de choses comme ça. — Je sais pas.\n",
1227
+ "Mais c'est des petits détails, ça, je trouve. C'est franchement... — Oui et\n",
1228
+ "non. Oui et non. Il ferait bien de s'occuper de savoir où tout notre\n",
1229
+ "pognon part dans les impôts, parce que qu'est-ce qu'on en paye? Bah tu\n",
1230
+ "sais où il part?\n",
1231
+ "Speaker 2 - 01:00:32\n",
1232
+ "Bah il y a un problème quand même... Bah tu sais où il part? Après c'est\n",
1233
+ "un autre débat! Tu sais où il part? Où? Où? Où? Où? Où? Où? Où? Où?\n",
1234
+ "Où? Où? Où? Où? Où? Où? Où? Où? Où?\n",
1235
+ "Speaker 1 - 01:00:41\n",
1236
+ "Où?\n",
1237
+ "Speaker 2 - 01:00:41\n",
1238
+ "Où? Où? Où? Où? Où? Où? Où? Où?\n",
1239
+ "\n",
1240
+ "Speaker 1 - 01:00:43\n",
1241
+ "Où?\n",
1242
+ "Speaker 2 - 01:00:43\n",
1243
+ "Où? Où? Où?\n",
1244
+ "Speaker 1 - 01:00:43\n",
1245
+ "Où?\n",
1246
+ "Speaker 2 - 01:00:44\n",
1247
+ "Où? Où?\n",
1248
+ "Speaker 1 - 01:00:44\n",
1249
+ "Où?\n",
1250
+ "Speaker 2 - 01:00:44\n",
1251
+ "Où? Où? Où? Où? Où? Où? Où? Où?\n",
1252
+ "Speaker 1 - 01:00:45\n",
1253
+ "Où?\n",
1254
+ "\n",
1255
+ "Speaker 2 - 01:00:45\n",
1256
+ "Où? Où? Où? Où? Où? Où? C'est pour ça qu'il faut... Christian nous aide\n",
1257
+ "à voir les scopes. Il y a un petit impôt qui est caché et qui fonctionne\n",
1258
+ "bien, c'est sur la fiche de paye, c'est GRDS. Celle-là, elle bouge sans\n",
1259
+ "arrêt. C'est la plus... Il baisse les impôts d'un côté, celle-là, elle n'arrête\n",
1260
+ "pas de bouger. C'est l'une des meilleures... C'est 0,4. Bon, je vais\n",
1261
+ "arrêter ça parce que ça ne sert à rien de l'avoir dans le compte en\n",
1262
+ "deute.\n",
1263
+ "Speaker 1 - 01:01:16\n",
1264
+ "On va voir, on fait un concours.\n",
1265
+ "\n"
1266
+ ]
1267
+ }
1268
+ ],
1269
+ "source": [
1270
+ "for page in pages:\n",
1271
+ " print(page)"
1272
+ ]
1273
+ },
1274
+ {
1275
+ "cell_type": "code",
1276
+ "execution_count": 54,
1277
+ "metadata": {},
1278
+ "outputs": [
1279
+ {
1280
+ "name": "stdout",
1281
+ "output_type": "stream",
1282
+ "text": [
1283
+ "Speaker 1 - 00:00\n",
1284
+ "Est-ce que t'as mis voix 1, voix 2, voix 3, tout ça?\n",
1285
+ "Speaker 2 - 00:04\n",
1286
+ "Quoi? Non, après. Après, avec la voix, je vais reconnaître les gens et\n",
1287
+ "dire voix 1 c'est.\n",
1288
+ "Speaker 1 - 00:11\n",
1289
+ "Andréa, voix 2 c'est... Non, voilà, super.\n",
1290
+ "Speaker 2 - 00:15\n",
1291
+ "Et... Moi je dis merci parce que j'ai pas enregistré.\n",
1292
+ "Speaker 1 - 00:17\n",
1293
+ "Hein?\n",
1294
+ "Speaker 2 - 00:18\n",
1295
+ "Je dis merci Isabelle. Encore? Mais j'ai pas enregistré. J'ai commencé là.\n",
1296
+ "Speaker 1 - 00:22\n",
1297
+ "Merci Isabelle pour tout ce travail fait pour l'association depuis 2014.\n",
1298
+ "\n"
1299
+ ]
1300
+ },
1301
+ {
1302
+ "ename": "ValidationError",
1303
+ "evalue": "1 validation error for Node\nproperties\n Input should be a valid dictionary [type=dict_type, input_value=FieldInfo(default=Pydanti...class 'dict'>, extra={}), input_type=FieldInfo]\n For further information visit https://errors.pydantic.dev/2.8/v/dict_type",
1304
+ "output_type": "error",
1305
+ "traceback": [
1306
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
1307
+ "\u001b[1;31mValidationError\u001b[0m Traceback (most recent call last)",
1308
+ "Cell \u001b[1;32mIn[54], line 4\u001b[0m\n\u001b[0;32m 2\u001b[0m load_dotenv(dotenv_path\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m.streamlit\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m page \u001b[38;5;129;01min\u001b[39;00m pages:\n\u001b[1;32m----> 4\u001b[0m graph \u001b[38;5;241m=\u001b[39m \u001b[43mget_graph\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpage\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28mprint\u001b[39m(graph)\n\u001b[0;32m 6\u001b[0m graphs\u001b[38;5;241m.\u001b[39mappend(graph)\n",
1309
+ "Cell \u001b[1;32mIn[51], line 17\u001b[0m, in \u001b[0;36mget_graph\u001b[1;34m(text, allowed_nodes, prompt, multiple_docs)\u001b[0m\n\u001b[0;32m 14\u001b[0m documents \u001b[38;5;241m=\u001b[39m [Document(page_content\u001b[38;5;241m=\u001b[39mtext)]\n\u001b[0;32m 15\u001b[0m \u001b[38;5;28mprint\u001b[39m(text)\n\u001b[1;32m---> 17\u001b[0m graph_documents \u001b[38;5;241m=\u001b[39m \u001b[43mllm_transformer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconvert_to_graph_documents\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdocuments\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m graph_documents\n",
1310
+ "File \u001b[1;32mc:\\Users\\kilia\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\langchain_experimental\\graph_transformers\\llm.py:646\u001b[0m, in \u001b[0;36mLLMGraphTransformer.convert_to_graph_documents\u001b[1;34m(self, documents)\u001b[0m\n\u001b[0;32m 634\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mconvert_to_graph_documents\u001b[39m(\n\u001b[0;32m 635\u001b[0m \u001b[38;5;28mself\u001b[39m, documents: Sequence[Document]\n\u001b[0;32m 636\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m List[GraphDocument]:\n\u001b[0;32m 637\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Convert a sequence of documents into graph documents.\u001b[39;00m\n\u001b[0;32m 638\u001b[0m \n\u001b[0;32m 639\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 644\u001b[0m \u001b[38;5;124;03m Sequence[GraphDocument]: The transformed documents as graphs.\u001b[39;00m\n\u001b[0;32m 645\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 646\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprocess_response\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdocument\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m document \u001b[38;5;129;01min\u001b[39;00m documents]\n",
1311
+ "File \u001b[1;32mc:\\Users\\kilia\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\langchain_experimental\\graph_transformers\\llm.py:591\u001b[0m, in \u001b[0;36mLLMGraphTransformer.process_response\u001b[1;34m(self, document)\u001b[0m\n\u001b[0;32m 589\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_function_call:\n\u001b[0;32m 590\u001b[0m raw_schema \u001b[38;5;241m=\u001b[39m cast(Dict[Any, Any], raw_schema)\n\u001b[1;32m--> 591\u001b[0m nodes, relationships \u001b[38;5;241m=\u001b[39m \u001b[43m_convert_to_graph_document\u001b[49m\u001b[43m(\u001b[49m\u001b[43mraw_schema\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 592\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 593\u001b[0m nodes_set \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m()\n",
1312
+ "File \u001b[1;32mc:\\Users\\kilia\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\langchain_experimental\\graph_transformers\\llm.py:496\u001b[0m, in \u001b[0;36m_convert_to_graph_document\u001b[1;34m(raw_schema)\u001b[0m\n\u001b[0;32m 490\u001b[0m relationships \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 491\u001b[0m [map_to_base_relationship(rel) \u001b[38;5;28;01mfor\u001b[39;00m rel \u001b[38;5;129;01min\u001b[39;00m parsed_schema\u001b[38;5;241m.\u001b[39mrelationships]\n\u001b[0;32m 492\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m parsed_schema\u001b[38;5;241m.\u001b[39mrelationships\n\u001b[0;32m 493\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m []\n\u001b[0;32m 494\u001b[0m )\n\u001b[0;32m 495\u001b[0m \u001b[38;5;66;03m# Title / Capitalize\u001b[39;00m\n\u001b[1;32m--> 496\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _format_nodes(nodes), \u001b[43m_format_relationships\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrelationships\u001b[49m\u001b[43m)\u001b[49m\n",
1313
+ "File \u001b[1;32mc:\\Users\\kilia\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\langchain_experimental\\graph_transformers\\llm.py:445\u001b[0m, in \u001b[0;36m_format_relationships\u001b[1;34m(rels)\u001b[0m\n\u001b[0;32m 442\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_format_relationships\u001b[39m(rels: List[Relationship]) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m List[Relationship]:\n\u001b[0;32m 443\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [\n\u001b[0;32m 444\u001b[0m Relationship(\n\u001b[1;32m--> 445\u001b[0m source\u001b[38;5;241m=\u001b[39m\u001b[43m_format_nodes\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[43mel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msource\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m[\u001b[38;5;241m0\u001b[39m],\n\u001b[0;32m 446\u001b[0m target\u001b[38;5;241m=\u001b[39m_format_nodes([el\u001b[38;5;241m.\u001b[39mtarget])[\u001b[38;5;241m0\u001b[39m],\n\u001b[0;32m 447\u001b[0m \u001b[38;5;28mtype\u001b[39m\u001b[38;5;241m=\u001b[39mel\u001b[38;5;241m.\u001b[39mtype\u001b[38;5;241m.\u001b[39mreplace(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m\"\u001b[39m)\u001b[38;5;241m.\u001b[39mupper(),\n\u001b[0;32m 448\u001b[0m )\n\u001b[0;32m 449\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m el \u001b[38;5;129;01min\u001b[39;00m rels\n\u001b[0;32m 450\u001b[0m ]\n",
1314
+ "File \u001b[1;32mc:\\Users\\kilia\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\langchain_experimental\\graph_transformers\\llm.py:433\u001b[0m, in \u001b[0;36m_format_nodes\u001b[1;34m(nodes)\u001b[0m\n\u001b[0;32m 431\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_format_nodes\u001b[39m(nodes: List[Node]) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m List[Node]:\n\u001b[0;32m 432\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [\n\u001b[1;32m--> 433\u001b[0m \u001b[43mNode\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 434\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mid\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mid\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtitle\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43misinstance\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mid\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mstr\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mid\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 435\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mtype\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtype\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcapitalize\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 436\u001b[0m \u001b[43m \u001b[49m\u001b[43mproperties\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mproperties\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 437\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 438\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m el \u001b[38;5;129;01min\u001b[39;00m nodes\n\u001b[0;32m 439\u001b[0m ]\n",
1315
+ "File \u001b[1;32mc:\\Users\\kilia\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\langchain_core\\load\\serializable.py:112\u001b[0m, in \u001b[0;36mSerializable.__init__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 110\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs: Any, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 111\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\"\"\"\u001b[39;00m\n\u001b[1;32m--> 112\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__init__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
1316
+ "File \u001b[1;32mc:\\Users\\kilia\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pydantic\\main.py:193\u001b[0m, in \u001b[0;36mBaseModel.__init__\u001b[1;34m(self, **data)\u001b[0m\n\u001b[0;32m 191\u001b[0m \u001b[38;5;66;03m# `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks\u001b[39;00m\n\u001b[0;32m 192\u001b[0m __tracebackhide__ \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m--> 193\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__pydantic_validator__\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate_python\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mself_instance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n",
1317
+ "\u001b[1;31mValidationError\u001b[0m: 1 validation error for Node\nproperties\n Input should be a valid dictionary [type=dict_type, input_value=FieldInfo(default=Pydanti...class 'dict'>, extra={}), input_type=FieldInfo]\n For further information visit https://errors.pydantic.dev/2.8/v/dict_type"
1318
+ ]
1319
+ }
1320
+ ],
1321
+ "source": [
1322
+ "graphs = []\n",
1323
+ "load_dotenv(dotenv_path=\".streamlit\")\n",
1324
+ "for page in pages:\n",
1325
+ " graph = get_graph(page)\n",
1326
+ " print(graph)\n",
1327
+ " graphs.append(graph)"
1328
+ ]
1329
+ }
1330
+ ],
1331
+ "metadata": {
1332
+ "kernelspec": {
1333
+ "display_name": "Python 3",
1334
+ "language": "python",
1335
+ "name": "python3"
1336
+ },
1337
+ "language_info": {
1338
+ "codemirror_mode": {
1339
+ "name": "ipython",
1340
+ "version": 3
1341
+ },
1342
+ "file_extension": ".py",
1343
+ "mimetype": "text/x-python",
1344
+ "name": "python",
1345
+ "nbconvert_exporter": "python",
1346
+ "pygments_lexer": "ipython3",
1347
+ "version": "3.12.3"
1348
+ }
1349
+ },
1350
+ "nbformat": 4,
1351
+ "nbformat_minor": 2
1352
+ }
utils/audit/rag.py CHANGED
@@ -1,14 +1,19 @@
1
  from langchain.text_splitter import RecursiveCharacterTextSplitter
2
  from langchain_openai import OpenAIEmbeddings
3
  from langchain_community.vectorstores import FAISS
 
4
 
5
 
6
 
7
  def get_text_from_content_for_doc(content):
8
- text = ""
9
- for page in content:
10
- text += content[page]["texte"]
11
- return text
 
 
 
 
12
 
13
  def get_text_from_content_for_audio(content):
14
  return content["transcription"]
@@ -23,6 +28,12 @@ def get_text_chunks(text):
23
  chunks = text_splitter.split_text(text)
24
  return chunks
25
 
 
 
 
 
 
 
26
  def get_vectorstore(text_chunks):
27
  embedding = OpenAIEmbeddings(model="text-embedding-3-small")
28
  vectorstore = FAISS.from_texts(texts=text_chunks, embedding=embedding)
@@ -33,12 +44,11 @@ def setup_rag(file_type,content):
33
  text = get_text_from_content_for_doc(content)
34
  elif file_type == "audio":
35
  text = get_text_from_content_for_audio(content)
36
-
37
 
38
- chunks = get_text_chunks(text)
39
 
40
  vectorstore = get_vectorstore(chunks)
41
 
42
- return vectorstore
43
 
44
 
 
1
  from langchain.text_splitter import RecursiveCharacterTextSplitter
2
  from langchain_openai import OpenAIEmbeddings
3
  from langchain_community.vectorstores import FAISS
4
+ from langchain_experimental.text_splitter import SemanticChunker
5
 
6
 
7
 
8
  def get_text_from_content_for_doc(content):
9
+ # text = ""
10
+ # for page in content:
11
+ # text += content[page]["texte"]
12
+
13
+ text_filtered = "\n".join([content[page]["texte"].replace("\n","").replace(" "," ").replace("\t"," ") for page in content])
14
+ return text_filtered
15
+
16
+
17
 
18
  def get_text_from_content_for_audio(content):
19
  return content["transcription"]
 
28
  chunks = text_splitter.split_text(text)
29
  return chunks
30
 
31
+ def get_semantic_chunks(text):
32
+ text_splitter = SemanticChunker(OpenAIEmbeddings(),breakpoint_threshold_type="standard_deviation",breakpoint_threshold_amount=2.718)
33
+ chunks = text_splitter.create_documents([text])
34
+ semantic_chunks = [chunk.page_content for chunk in chunks]
35
+ return semantic_chunks
36
+
37
  def get_vectorstore(text_chunks):
38
  embedding = OpenAIEmbeddings(model="text-embedding-3-small")
39
  vectorstore = FAISS.from_texts(texts=text_chunks, embedding=embedding)
 
44
  text = get_text_from_content_for_doc(content)
45
  elif file_type == "audio":
46
  text = get_text_from_content_for_audio(content)
 
47
 
48
+ chunks = get_semantic_chunks(text)
49
 
50
  vectorstore = get_vectorstore(chunks)
51
 
52
+ return vectorstore, chunks
53
 
54
 
utils/audit/response_llm.py CHANGED
@@ -2,6 +2,21 @@ from openai import OpenAI
2
  from langchain_openai import ChatOpenAI
3
  from langchain_core.output_parsers import StrOutputParser
4
  from langchain_core.prompts import PromptTemplate
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
  def generate_response_openai(prompt: str,stream:bool = False,model = "gpt-4o-mini") -> str:
7
  client = OpenAI()
@@ -16,7 +31,7 @@ def generate_response_openai(prompt: str,stream:bool = False,model = "gpt-4o-min
16
  return response.choices[0].message.content
17
 
18
 
19
- def generate_response_via_langchain(query: str, stream: bool = False, model: str = "gpt-4o-mini") :
20
  # Define the prompt template
21
  template = "{query}"
22
  prompt = PromptTemplate.from_template(template)
@@ -33,3 +48,21 @@ def generate_response_via_langchain(query: str, stream: bool = False, model: str
33
 
34
  # Invoke the LLM chain and return the result
35
  return llm_chain.invoke({"query": query})
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  from langchain_openai import ChatOpenAI
3
  from langchain_core.output_parsers import StrOutputParser
4
  from langchain_core.prompts import PromptTemplate
5
+ from textwrap import dedent
6
+
7
+ from langchain_core.pydantic_v1 import BaseModel, Field
8
+
9
+ class report(BaseModel):
10
+ summary: str = Field(description="Resumé du document ou récit, une synthèse complète du document")
11
+ Notes: str = Field(description=dedent('''Notes sur le document ou le récit, les points clés sous forme de liste à puces avec des émojis pertinents pour souligner la nature de chaque point comme suit: - 📌 **Point Principal 1**
12
+ - Sous-point A
13
+ - Sous-point B
14
+ - 📈 **Point Principal 2**
15
+ - Sous-point C
16
+ - Sous-point D'''))
17
+ Actions: str = Field(description="listes des actions spécifiques, tâches ou étapes recommandées ou nécessaires selon le contenu du document.")
18
+
19
+
20
 
21
  def generate_response_openai(prompt: str,stream:bool = False,model = "gpt-4o-mini") -> str:
22
  client = OpenAI()
 
31
  return response.choices[0].message.content
32
 
33
 
34
+ def generate_response_via_langchain(query: str, stream: bool = False, model: str = "gpt-4o-mini"):
35
  # Define the prompt template
36
  template = "{query}"
37
  prompt = PromptTemplate.from_template(template)
 
48
 
49
  # Invoke the LLM chain and return the result
50
  return llm_chain.invoke({"query": query})
51
+
52
+ def generate_structured_response(query: str, stream: bool = False, model: str = "gpt-4o-2024-08-06",structured_response = report):
53
+ # Define the prompt template
54
+ template = "{query}"
55
+ prompt = PromptTemplate.from_template(template)
56
+
57
+ # Initialize the OpenAI LLM with the specified model
58
+ llm = ChatOpenAI(model=model)
59
+ structured_llm = llm.with_structured_output(structured_response)
60
+ # Create an LLM chain with the prompt and the LLM
61
+ llm_chain = prompt | structured_llm
62
+
63
+ if stream:
64
+ # Return a generator that yields streamed responses
65
+ return llm_chain.stream({"query": query})
66
+
67
+ # Invoke the LLM chain and return the result
68
+ return llm_chain.invoke({"query": query})
utils/kg/construct_kg.py CHANGED
@@ -1,9 +1,11 @@
1
  from langchain_community.graphs import Neo4jGraph
2
  from langchain_experimental.graph_transformers import LLMGraphTransformer
3
- from langchain_openai import ChatOpenAI
4
  from langchain_core.documents import Document
 
5
 
6
- def get_graph(text,allowed_nodes=None,prompt=None):
 
7
 
8
  llm = ChatOpenAI(temperature=0, model_name="gpt-4o-2024-08-06")
9
 
@@ -17,4 +19,24 @@ def get_graph(text,allowed_nodes=None,prompt=None):
17
 
18
  return graph_documents
19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
 
1
  from langchain_community.graphs import Neo4jGraph
2
  from langchain_experimental.graph_transformers import LLMGraphTransformer
3
+ from langchain_openai import ChatOpenAI , OpenAIEmbeddings
4
  from langchain_core.documents import Document
5
+ from itext2kg import iText2KG
6
 
7
+
8
+ def get_graph(text,allowed_nodes=None,prompt=None,multiple_docs=False):
9
 
10
  llm = ChatOpenAI(temperature=0, model_name="gpt-4o-2024-08-06")
11
 
 
19
 
20
  return graph_documents
21
 
22
+ def get_advanced_graph(semantic_chunk,knowledge_graph = None):
23
+ openai_llm_model = ChatOpenAI(
24
+ model="gpt-4o",
25
+ temperature=0,
26
+ max_tokens=None,
27
+ timeout=None,
28
+ max_retries=2,
29
+ )
30
+
31
+ openai_embeddings_model = OpenAIEmbeddings(
32
+ model="text-embedding-3-large",
33
+ )
34
+ itext2kg = iText2KG(llm_model = openai_llm_model, embeddings_model = openai_embeddings_model)
35
+ if knowledge_graph:
36
+ current_kg = itext2kg.build_graph(sections=[semantic_chunk],existing_knowledge_graph=knowledge_graph, ent_threshold=0.6, rel_threshold=0.6)
37
+ else:
38
+ current_kg = itext2kg.build_graph(sections=[semantic_chunk], ent_threshold=0.6, rel_threshold=0.6)
39
+
40
+ return current_kg
41
+
42