ai-data-science-team 0.0.0.9008__py3-none-any.whl → 0.0.0.9009__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- ai_data_science_team/_version.py +1 -1
- ai_data_science_team/agents/__init__.py +0 -1
- ai_data_science_team/agents/data_cleaning_agent.py +45 -34
- ai_data_science_team/agents/data_visualization_agent.py +39 -43
- ai_data_science_team/agents/data_wrangling_agent.py +45 -44
- ai_data_science_team/agents/feature_engineering_agent.py +42 -61
- ai_data_science_team/agents/sql_database_agent.py +125 -71
- ai_data_science_team/ml_agents/__init__.py +1 -0
- ai_data_science_team/ml_agents/h2o_ml_agent.py +1032 -0
- ai_data_science_team/multiagents/sql_data_analyst.py +119 -7
- ai_data_science_team/templates/__init__.py +1 -0
- ai_data_science_team/templates/agent_templates.py +73 -2
- ai_data_science_team/tools/metadata.py +94 -62
- ai_data_science_team/tools/regex.py +59 -1
- {ai_data_science_team-0.0.0.9008.dist-info → ai_data_science_team-0.0.0.9009.dist-info}/METADATA +28 -14
- ai_data_science_team-0.0.0.9009.dist-info/RECORD +28 -0
- ai_data_science_team-0.0.0.9008.dist-info/RECORD +0 -26
- {ai_data_science_team-0.0.0.9008.dist-info → ai_data_science_team-0.0.0.9009.dist-info}/LICENSE +0 -0
- {ai_data_science_team-0.0.0.9008.dist-info → ai_data_science_team-0.0.0.9009.dist-info}/WHEEL +0 -0
- {ai_data_science_team-0.0.0.9008.dist-info → ai_data_science_team-0.0.0.9009.dist-info}/top_level.txt +0 -0
ai_data_science_team/_version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "0.0.0.
|
1
|
+
__version__ = "0.0.0.9009"
|
@@ -3,4 +3,3 @@ from ai_data_science_team.agents.feature_engineering_agent import make_feature_e
|
|
3
3
|
from ai_data_science_team.agents.data_wrangling_agent import make_data_wrangling_agent, DataWranglingAgent
|
4
4
|
from ai_data_science_team.agents.sql_database_agent import make_sql_database_agent, SQLDatabaseAgent
|
5
5
|
from ai_data_science_team.agents.data_visualization_agent import make_data_visualization_agent, DataVisualizationAgent
|
6
|
-
|
@@ -14,7 +14,7 @@ from langgraph.types import Command
|
|
14
14
|
from langgraph.checkpoint.memory import MemorySaver
|
15
15
|
|
16
16
|
import os
|
17
|
-
import
|
17
|
+
import json
|
18
18
|
import pandas as pd
|
19
19
|
|
20
20
|
from IPython.display import Markdown
|
@@ -23,12 +23,18 @@ from ai_data_science_team.templates import(
|
|
23
23
|
node_func_execute_agent_code_on_data,
|
24
24
|
node_func_human_review,
|
25
25
|
node_func_fix_agent_code,
|
26
|
-
|
26
|
+
node_func_report_agent_outputs,
|
27
27
|
create_coding_agent_graph,
|
28
28
|
BaseAgent,
|
29
29
|
)
|
30
30
|
from ai_data_science_team.tools.parsers import PythonOutputParser
|
31
|
-
from ai_data_science_team.tools.regex import
|
31
|
+
from ai_data_science_team.tools.regex import (
|
32
|
+
relocate_imports_inside_function,
|
33
|
+
add_comments_to_top,
|
34
|
+
format_agent_name,
|
35
|
+
format_recommended_steps,
|
36
|
+
get_generic_summary,
|
37
|
+
)
|
32
38
|
from ai_data_science_team.tools.metadata import get_dataframe_summary
|
33
39
|
from ai_data_science_team.tools.logging import log_ai_function
|
34
40
|
|
@@ -37,7 +43,6 @@ AGENT_NAME = "data_cleaning_agent"
|
|
37
43
|
LOG_PATH = os.path.join(os.getcwd(), "logs/")
|
38
44
|
|
39
45
|
|
40
|
-
|
41
46
|
# Class
|
42
47
|
class DataCleaningAgent(BaseAgent):
|
43
48
|
"""
|
@@ -89,8 +94,8 @@ class DataCleaningAgent(BaseAgent):
|
|
89
94
|
Cleans the provided dataset asynchronously based on user instructions.
|
90
95
|
invoke_agent(user_instructions: str, data_raw: pd.DataFrame, max_retries=3, retry_count=0)
|
91
96
|
Cleans the provided dataset synchronously based on user instructions.
|
92
|
-
|
93
|
-
|
97
|
+
get_workflow_summary()
|
98
|
+
Retrieves a summary of the agent's workflow.
|
94
99
|
get_log_summary()
|
95
100
|
Retrieves a summary of logged operations if logging is enabled.
|
96
101
|
get_state_keys()
|
@@ -178,7 +183,6 @@ class DataCleaningAgent(BaseAgent):
|
|
178
183
|
self.response=None
|
179
184
|
return make_data_cleaning_agent(**self._params)
|
180
185
|
|
181
|
-
|
182
186
|
def ainvoke_agent(self, data_raw: pd.DataFrame, user_instructions: str=None, max_retries:int=3, retry_count:int=0, **kwargs):
|
183
187
|
"""
|
184
188
|
Asynchronously invokes the agent. The response is stored in the response attribute.
|
@@ -239,15 +243,16 @@ class DataCleaningAgent(BaseAgent):
|
|
239
243
|
self.response = response
|
240
244
|
return None
|
241
245
|
|
242
|
-
def
|
246
|
+
def get_workflow_summary(self, markdown=False):
|
243
247
|
"""
|
244
|
-
|
245
|
-
|
246
|
-
Returns:
|
247
|
-
str: Explanation of the cleaning steps.
|
248
|
+
Retrieves the agent's workflow summary, if logging is enabled.
|
248
249
|
"""
|
249
|
-
|
250
|
-
|
250
|
+
if self.response and self.response.get("messages"):
|
251
|
+
summary = get_generic_summary(json.loads(self.response.get("messages")[-1].content))
|
252
|
+
if markdown:
|
253
|
+
return Markdown(summary)
|
254
|
+
else:
|
255
|
+
return summary
|
251
256
|
|
252
257
|
def get_log_summary(self, markdown=False):
|
253
258
|
"""
|
@@ -255,7 +260,13 @@ class DataCleaningAgent(BaseAgent):
|
|
255
260
|
"""
|
256
261
|
if self.response:
|
257
262
|
if self.response.get('data_cleaner_function_path'):
|
258
|
-
log_details = f"
|
263
|
+
log_details = f"""
|
264
|
+
## Data Cleaning Agent Log Summary:
|
265
|
+
|
266
|
+
Function Path: {self.response.get('data_cleaner_function_path')}
|
267
|
+
|
268
|
+
Function Name: {self.response.get('data_cleaner_function_name')}
|
269
|
+
"""
|
259
270
|
if markdown:
|
260
271
|
return Markdown(log_details)
|
261
272
|
else:
|
@@ -462,7 +473,7 @@ def make_data_cleaning_agent(
|
|
462
473
|
Below are summaries of all datasets provided:
|
463
474
|
{all_datasets_summary}
|
464
475
|
|
465
|
-
Return
|
476
|
+
Return steps as a numbered list. You can return short code snippets to demonstrate actions. But do not return a fully coded solution. The code will be generated separately by a Coding Agent.
|
466
477
|
|
467
478
|
Avoid these:
|
468
479
|
1. Do not include steps to save files.
|
@@ -633,32 +644,31 @@ def make_data_cleaning_agent(
|
|
633
644
|
function_name=state.get("data_cleaner_function_name"),
|
634
645
|
)
|
635
646
|
|
636
|
-
|
637
|
-
|
647
|
+
# Final reporting node
|
648
|
+
def report_agent_outputs(state: GraphState):
|
649
|
+
return node_func_report_agent_outputs(
|
638
650
|
state=state,
|
639
|
-
|
651
|
+
keys_to_include=[
|
652
|
+
"recommended_steps",
|
653
|
+
"data_cleaner_function",
|
654
|
+
"data_cleaner_function_path",
|
655
|
+
"data_cleaner_function_name",
|
656
|
+
"data_cleaner_error",
|
657
|
+
],
|
640
658
|
result_key="messages",
|
641
|
-
error_key="data_cleaner_error",
|
642
|
-
llm=llm,
|
643
659
|
role=AGENT_NAME,
|
644
|
-
|
645
|
-
Explain the data cleaning steps that the data cleaning agent performed in this function.
|
646
|
-
Keep the summary succinct and to the point.\n\n# Data Cleaning Agent:\n\n{code}
|
647
|
-
""",
|
648
|
-
success_prefix="# Data Cleaning Agent:\n\n ",
|
649
|
-
error_message="The Data Cleaning Agent encountered an error during data cleaning. Data could not be explained."
|
660
|
+
custom_title="Data Cleaning Agent Outputs"
|
650
661
|
)
|
651
|
-
|
652
|
-
# Define the graph
|
662
|
+
|
653
663
|
node_functions = {
|
654
664
|
"recommend_cleaning_steps": recommend_cleaning_steps,
|
655
665
|
"human_review": human_review,
|
656
666
|
"create_data_cleaner_code": create_data_cleaner_code,
|
657
667
|
"execute_data_cleaner_code": execute_data_cleaner_code,
|
658
668
|
"fix_data_cleaner_code": fix_data_cleaner_code,
|
659
|
-
"
|
669
|
+
"report_agent_outputs": report_agent_outputs,
|
660
670
|
}
|
661
|
-
|
671
|
+
|
662
672
|
app = create_coding_agent_graph(
|
663
673
|
GraphState=GraphState,
|
664
674
|
node_functions=node_functions,
|
@@ -666,16 +676,17 @@ def make_data_cleaning_agent(
|
|
666
676
|
create_code_node_name="create_data_cleaner_code",
|
667
677
|
execute_code_node_name="execute_data_cleaner_code",
|
668
678
|
fix_code_node_name="fix_data_cleaner_code",
|
669
|
-
explain_code_node_name="
|
679
|
+
explain_code_node_name="report_agent_outputs",
|
670
680
|
error_key="data_cleaner_error",
|
671
|
-
human_in_the_loop=human_in_the_loop,
|
681
|
+
human_in_the_loop=human_in_the_loop,
|
672
682
|
human_review_node_name="human_review",
|
673
683
|
checkpointer=MemorySaver() if human_in_the_loop else None,
|
674
684
|
bypass_recommended_steps=bypass_recommended_steps,
|
675
685
|
bypass_explain_code=bypass_explain_code,
|
676
686
|
)
|
677
|
-
|
687
|
+
|
678
688
|
return app
|
689
|
+
|
679
690
|
|
680
691
|
|
681
692
|
|
@@ -17,6 +17,7 @@ from langgraph.types import Command
|
|
17
17
|
from langgraph.checkpoint.memory import MemorySaver
|
18
18
|
|
19
19
|
import os
|
20
|
+
import json
|
20
21
|
import pandas as pd
|
21
22
|
|
22
23
|
from IPython.display import Markdown
|
@@ -25,7 +26,7 @@ from ai_data_science_team.templates import(
|
|
25
26
|
node_func_execute_agent_code_on_data,
|
26
27
|
node_func_human_review,
|
27
28
|
node_func_fix_agent_code,
|
28
|
-
|
29
|
+
node_func_report_agent_outputs,
|
29
30
|
create_coding_agent_graph,
|
30
31
|
BaseAgent,
|
31
32
|
)
|
@@ -34,7 +35,8 @@ from ai_data_science_team.tools.regex import (
|
|
34
35
|
relocate_imports_inside_function,
|
35
36
|
add_comments_to_top,
|
36
37
|
format_agent_name,
|
37
|
-
format_recommended_steps
|
38
|
+
format_recommended_steps,
|
39
|
+
get_generic_summary,
|
38
40
|
)
|
39
41
|
from ai_data_science_team.tools.metadata import get_dataframe_summary
|
40
42
|
from ai_data_science_team.tools.logging import log_ai_function
|
@@ -93,8 +95,8 @@ class DataVisualizationAgent(BaseAgent):
|
|
93
95
|
Asynchronously generates a visualization based on user instructions.
|
94
96
|
invoke_agent(user_instructions: str, data_raw: pd.DataFrame, max_retries=3, retry_count=0)
|
95
97
|
Synchronously generates a visualization based on user instructions.
|
96
|
-
|
97
|
-
|
98
|
+
get_workflow_summary()
|
99
|
+
Retrieves a summary of the agent's workflow.
|
98
100
|
get_log_summary()
|
99
101
|
Retrieves a summary of logged operations if logging is enabled.
|
100
102
|
get_plotly_graph()
|
@@ -257,40 +259,34 @@ class DataVisualizationAgent(BaseAgent):
|
|
257
259
|
self.response = response
|
258
260
|
return None
|
259
261
|
|
260
|
-
def
|
262
|
+
def get_workflow_summary(self, markdown=False):
|
261
263
|
"""
|
262
|
-
|
263
|
-
|
264
|
-
Returns
|
265
|
-
-------
|
266
|
-
str
|
267
|
-
Explanation of the visualization steps, if any are available.
|
264
|
+
Retrieves the agent's workflow summary, if logging is enabled.
|
268
265
|
"""
|
269
|
-
if self.response:
|
270
|
-
|
271
|
-
|
266
|
+
if self.response and self.response.get("messages"):
|
267
|
+
summary = get_generic_summary(json.loads(self.response.get("messages")[-1].content))
|
268
|
+
if markdown:
|
269
|
+
return Markdown(summary)
|
270
|
+
else:
|
271
|
+
return summary
|
272
272
|
|
273
273
|
def get_log_summary(self, markdown=False):
|
274
274
|
"""
|
275
275
|
Logs a summary of the agent's operations, if logging is enabled.
|
276
|
+
"""
|
277
|
+
if self.response:
|
278
|
+
if self.response.get('data_visualization_function_path'):
|
279
|
+
log_details = f"""
|
280
|
+
## Data Visualization Agent Log Summary:
|
276
281
|
|
277
|
-
|
278
|
-
----------
|
279
|
-
markdown : bool, optional
|
280
|
-
If True, returns Markdown-formatted output.
|
282
|
+
Function Path: {self.response.get('data_visualization_function_path')}
|
281
283
|
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
log_details = f"Log Path: {self.response.get('data_visualization_function_path')}"
|
289
|
-
if markdown:
|
290
|
-
return Markdown(log_details)
|
291
|
-
else:
|
292
|
-
return log_details
|
293
|
-
return None
|
284
|
+
Function Name: {self.response.get('data_visualization_function_name')}
|
285
|
+
"""
|
286
|
+
if markdown:
|
287
|
+
return Markdown(log_details)
|
288
|
+
else:
|
289
|
+
return log_details
|
294
290
|
|
295
291
|
def get_plotly_graph(self):
|
296
292
|
"""
|
@@ -719,20 +715,20 @@ def make_data_visualization_agent(
|
|
719
715
|
function_name=state.get("data_visualization_function_name"),
|
720
716
|
)
|
721
717
|
|
722
|
-
|
723
|
-
|
718
|
+
# Final reporting node
|
719
|
+
def report_agent_outputs(state: GraphState):
|
720
|
+
return node_func_report_agent_outputs(
|
724
721
|
state=state,
|
725
|
-
|
722
|
+
keys_to_include=[
|
723
|
+
"recommended_steps",
|
724
|
+
"data_visualization_function",
|
725
|
+
"data_visualization_function_path",
|
726
|
+
"data_visualization_function_name",
|
727
|
+
"data_visualization_error",
|
728
|
+
],
|
726
729
|
result_key="messages",
|
727
|
-
error_key="data_visualization_error",
|
728
|
-
llm=llm,
|
729
730
|
role=AGENT_NAME,
|
730
|
-
|
731
|
-
Explain the data visualization steps that the data visualization agent performed in this function.
|
732
|
-
Keep the summary succinct and to the point.\n\n# Data Visualization Agent:\n\n{code}
|
733
|
-
""",
|
734
|
-
success_prefix="# Data Visualization Agent:\n\n ",
|
735
|
-
error_message="The Data Visualization Agent encountered an error during data visualization. No explanation could be provided."
|
731
|
+
custom_title="Data Visualization Agent Outputs"
|
736
732
|
)
|
737
733
|
|
738
734
|
# Define the graph
|
@@ -742,7 +738,7 @@ def make_data_visualization_agent(
|
|
742
738
|
"chart_generator": chart_generator,
|
743
739
|
"execute_data_visualization_code": execute_data_visualization_code,
|
744
740
|
"fix_data_visualization_code": fix_data_visualization_code,
|
745
|
-
"
|
741
|
+
"report_agent_outputs": report_agent_outputs,
|
746
742
|
}
|
747
743
|
|
748
744
|
app = create_coding_agent_graph(
|
@@ -752,7 +748,7 @@ def make_data_visualization_agent(
|
|
752
748
|
create_code_node_name="chart_generator",
|
753
749
|
execute_code_node_name="execute_data_visualization_code",
|
754
750
|
fix_code_node_name="fix_data_visualization_code",
|
755
|
-
explain_code_node_name="
|
751
|
+
explain_code_node_name="report_agent_outputs",
|
756
752
|
error_key="data_visualization_error",
|
757
753
|
human_in_the_loop=human_in_the_loop, # or False
|
758
754
|
human_review_node_name="human_review",
|
@@ -7,6 +7,7 @@
|
|
7
7
|
from typing import TypedDict, Annotated, Sequence, Literal, Union, Optional
|
8
8
|
import operator
|
9
9
|
import os
|
10
|
+
import json
|
10
11
|
import pandas as pd
|
11
12
|
from IPython.display import Markdown
|
12
13
|
|
@@ -19,12 +20,18 @@ from ai_data_science_team.templates import(
|
|
19
20
|
node_func_execute_agent_code_on_data,
|
20
21
|
node_func_human_review,
|
21
22
|
node_func_fix_agent_code,
|
22
|
-
|
23
|
+
node_func_report_agent_outputs,
|
23
24
|
create_coding_agent_graph,
|
24
25
|
BaseAgent,
|
25
26
|
)
|
26
27
|
from ai_data_science_team.tools.parsers import PythonOutputParser
|
27
|
-
from ai_data_science_team.tools.regex import
|
28
|
+
from ai_data_science_team.tools.regex import (
|
29
|
+
relocate_imports_inside_function,
|
30
|
+
add_comments_to_top,
|
31
|
+
format_agent_name,
|
32
|
+
format_recommended_steps,
|
33
|
+
get_generic_summary,
|
34
|
+
)
|
28
35
|
from ai_data_science_team.tools.metadata import get_dataframe_summary
|
29
36
|
from ai_data_science_team.tools.logging import log_ai_function
|
30
37
|
|
@@ -88,8 +95,8 @@ class DataWranglingAgent(BaseAgent):
|
|
88
95
|
invoke_agent(user_instructions: str, data_raw: Union[dict, list], max_retries=3, retry_count=0)
|
89
96
|
Synchronously wrangles the provided dataset(s) based on user instructions.
|
90
97
|
|
91
|
-
|
92
|
-
|
98
|
+
get_workflow_summary()
|
99
|
+
Retrieves a summary of the agent's workflow.
|
93
100
|
|
94
101
|
get_log_summary()
|
95
102
|
Retrieves a summary of logged operations if logging is enabled.
|
@@ -287,40 +294,34 @@ class DataWranglingAgent(BaseAgent):
|
|
287
294
|
self.response = response
|
288
295
|
return None
|
289
296
|
|
290
|
-
def
|
297
|
+
def get_workflow_summary(self, markdown=False):
|
291
298
|
"""
|
292
|
-
|
293
|
-
|
294
|
-
Returns
|
295
|
-
-------
|
296
|
-
str or list
|
297
|
-
Explanation of the data wrangling steps.
|
299
|
+
Retrieves the agent's workflow summary, if logging is enabled.
|
298
300
|
"""
|
299
|
-
if self.response:
|
300
|
-
|
301
|
-
|
301
|
+
if self.response and self.response.get("messages"):
|
302
|
+
summary = get_generic_summary(json.loads(self.response.get("messages")[-1].content))
|
303
|
+
if markdown:
|
304
|
+
return Markdown(summary)
|
305
|
+
else:
|
306
|
+
return summary
|
302
307
|
|
303
308
|
def get_log_summary(self, markdown=False):
|
304
309
|
"""
|
305
310
|
Logs a summary of the agent's operations, if logging is enabled.
|
311
|
+
"""
|
312
|
+
if self.response:
|
313
|
+
if self.response.get('data_wrangler_function_path'):
|
314
|
+
log_details = f"""
|
315
|
+
## Data Wrangling Agent Log Summary:
|
306
316
|
|
307
|
-
|
308
|
-
----------
|
309
|
-
markdown : bool, optional
|
310
|
-
If True, returns the summary in Markdown.
|
317
|
+
Function Path: {self.response.get('data_wrangler_function_path')}
|
311
318
|
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
log_details = f"Log Path: {self.response.get('data_wrangler_function_path')}"
|
319
|
-
if markdown:
|
320
|
-
return Markdown(log_details)
|
321
|
-
else:
|
322
|
-
return log_details
|
323
|
-
return None
|
319
|
+
Function Name: {self.response.get('data_wrangler_function_name')}
|
320
|
+
"""
|
321
|
+
if markdown:
|
322
|
+
return Markdown(log_details)
|
323
|
+
else:
|
324
|
+
return log_details
|
324
325
|
|
325
326
|
def get_data_wrangled(self) -> Optional[pd.DataFrame]:
|
326
327
|
"""
|
@@ -597,7 +598,7 @@ def make_data_wrangling_agent(
|
|
597
598
|
Below are summaries of all datasets provided:
|
598
599
|
{all_datasets_summary}
|
599
600
|
|
600
|
-
Return
|
601
|
+
Return steps as a numbered list. You can return short code snippets to demonstrate actions. But do not return a fully coded solution. The code will be generated separately by a Coding Agent.
|
601
602
|
|
602
603
|
Avoid these:
|
603
604
|
1. Do not include steps to save files.
|
@@ -797,20 +798,20 @@ def make_data_wrangling_agent(
|
|
797
798
|
function_name=state.get("data_wrangler_function_name"),
|
798
799
|
)
|
799
800
|
|
800
|
-
|
801
|
-
|
801
|
+
# Final reporting node
|
802
|
+
def report_agent_outputs(state: GraphState):
|
803
|
+
return node_func_report_agent_outputs(
|
802
804
|
state=state,
|
803
|
-
|
805
|
+
keys_to_include=[
|
806
|
+
"recommended_steps",
|
807
|
+
"data_wrangler_function",
|
808
|
+
"data_wrangler_function_path",
|
809
|
+
"data_wrangler_function_name",
|
810
|
+
"data_wrangler_error",
|
811
|
+
],
|
804
812
|
result_key="messages",
|
805
|
-
error_key="data_wrangler_error",
|
806
|
-
llm=llm,
|
807
813
|
role=AGENT_NAME,
|
808
|
-
|
809
|
-
Explain the data wrangling steps that the data wrangling agent performed in this function.
|
810
|
-
Keep the summary succinct and to the point.\n\n# Data Wrangling Agent:\n\n{code}
|
811
|
-
""",
|
812
|
-
success_prefix="# Data Wrangling Agent:\n\n ",
|
813
|
-
error_message="The Data Wrangling Agent encountered an error during data wrangling. Data could not be explained."
|
814
|
+
custom_title="Data Wrangling Agent Outputs"
|
814
815
|
)
|
815
816
|
|
816
817
|
# Define the graph
|
@@ -820,7 +821,7 @@ def make_data_wrangling_agent(
|
|
820
821
|
"create_data_wrangler_code": create_data_wrangler_code,
|
821
822
|
"execute_data_wrangler_code": execute_data_wrangler_code,
|
822
823
|
"fix_data_wrangler_code": fix_data_wrangler_code,
|
823
|
-
"
|
824
|
+
"report_agent_outputs": report_agent_outputs,
|
824
825
|
}
|
825
826
|
|
826
827
|
app = create_coding_agent_graph(
|
@@ -830,7 +831,7 @@ def make_data_wrangling_agent(
|
|
830
831
|
create_code_node_name="create_data_wrangler_code",
|
831
832
|
execute_code_node_name="execute_data_wrangler_code",
|
832
833
|
fix_code_node_name="fix_data_wrangler_code",
|
833
|
-
explain_code_node_name="
|
834
|
+
explain_code_node_name="report_agent_outputs",
|
834
835
|
error_key="data_wrangler_error",
|
835
836
|
human_in_the_loop=human_in_the_loop,
|
836
837
|
human_review_node_name="human_review",
|