flowcept 0.9.16__py3-none-any.whl → 0.9.18__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. flowcept/agents/agents_utils.py +42 -0
  2. flowcept/agents/flowcept_agent.py +4 -1
  3. flowcept/agents/flowcept_ctx_manager.py +99 -36
  4. flowcept/agents/gui/gui_utils.py +21 -3
  5. flowcept/agents/prompts/general_prompts.py +1 -1
  6. flowcept/agents/prompts/in_memory_query_prompts.py +158 -45
  7. flowcept/agents/tools/general_tools.py +20 -3
  8. flowcept/agents/tools/in_memory_queries/in_memory_queries_tools.py +14 -31
  9. flowcept/commons/daos/docdb_dao/lmdb_dao.py +48 -0
  10. flowcept/commons/daos/mq_dao/mq_dao_kafka.py +2 -2
  11. flowcept/commons/daos/mq_dao/mq_dao_redis.py +33 -2
  12. flowcept/commons/flowcept_dataclasses/task_object.py +4 -1
  13. flowcept/configs.py +4 -1
  14. flowcept/flowcept_api/flowcept_controller.py +5 -1
  15. flowcept/flowceptor/adapters/mlflow/interception_event_handler.py +36 -2
  16. flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py +22 -7
  17. flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py +7 -1
  18. flowcept/flowceptor/consumers/agent/base_agent_context_manager.py +7 -8
  19. flowcept/instrumentation/flowcept_task.py +147 -51
  20. flowcept/instrumentation/task_capture.py +10 -1
  21. flowcept/version.py +1 -1
  22. {flowcept-0.9.16.dist-info → flowcept-0.9.18.dist-info}/METADATA +10 -2
  23. {flowcept-0.9.16.dist-info → flowcept-0.9.18.dist-info}/RECORD +27 -27
  24. {flowcept-0.9.16.dist-info → flowcept-0.9.18.dist-info}/WHEEL +1 -1
  25. resources/sample_settings.yaml +2 -1
  26. {flowcept-0.9.16.dist-info → flowcept-0.9.18.dist-info}/entry_points.txt +0 -0
  27. {flowcept-0.9.16.dist-info → flowcept-0.9.18.dist-info}/licenses/LICENSE +0 -0
@@ -5,16 +5,22 @@ from time import time
5
5
  import inspect
6
6
  from functools import wraps
7
7
  import argparse
8
- from flowcept.commons.flowcept_dataclasses.task_object import (
9
- TaskObject,
10
- )
8
+
9
+ from flowcept.commons.flowcept_dataclasses.task_object import TaskObject
11
10
  from flowcept.commons.vocabulary import Status
12
11
  from flowcept.commons.flowcept_logger import FlowceptLogger
13
12
 
14
13
  from flowcept.commons.utils import replace_non_serializable
15
- from flowcept.configs import REPLACE_NON_JSON_SERIALIZABLE, INSTRUMENTATION_ENABLED, HOSTNAME, TELEMETRY_ENABLED
14
+ from flowcept.configs import (
15
+ REPLACE_NON_JSON_SERIALIZABLE,
16
+ INSTRUMENTATION_ENABLED,
17
+ HOSTNAME,
18
+ TELEMETRY_ENABLED,
19
+ )
16
20
  from flowcept.flowcept_api.flowcept_controller import Flowcept
17
- from flowcept.flowceptor.adapters.instrumentation_interceptor import InstrumentationInterceptor
21
+ from flowcept.flowceptor.adapters.instrumentation_interceptor import (
22
+ InstrumentationInterceptor,
23
+ )
18
24
 
19
25
  _thread_local = threading.local()
20
26
 
@@ -106,10 +112,19 @@ def lightweight_flowcept_task(func=None):
106
112
 
107
113
 
108
114
  def flowcept_task(func=None, **decorator_kwargs):
109
- """Flowcept task decorator."""
115
+ """
116
+ Flowcept task decorator.
117
+
118
+ Now supports BOTH sync and async functions. For async functions, we await
119
+ the function before capturing outputs in `task_obj.generated`, so we no
120
+ longer store just the coroutine object.
121
+ """
110
122
  if INSTRUMENTATION_ENABLED:
111
123
  interceptor = InstrumentationInterceptor.get_instance()
112
124
  logger = FlowceptLogger()
125
+ else:
126
+ # still define logger so it's always available for exception logging in branches
127
+ logger = FlowceptLogger()
113
128
 
114
129
  def decorator(func):
115
130
  # Precompute once (perf)
@@ -120,21 +135,25 @@ def flowcept_task(func=None, **decorator_kwargs):
120
135
  subtype = decorator_kwargs.get("subtype", None)
121
136
  output_names = decorator_kwargs.get("output_names", None)
122
137
 
123
- @wraps(func)
124
- def wrapper(*args, **kwargs):
125
- if not INSTRUMENTATION_ENABLED:
126
- return func(*args, **kwargs)
138
+ # --- shared helpers for sync+async wrappers -------------------------
127
139
 
140
+ def _common_prep(*f_args, **f_kwargs):
141
+ """
142
+ Build and populate the TaskObject before running the task.
143
+ Returns (task_obj, handled_args).
144
+ """
128
145
  # Bind inputs to parameter names
129
146
  try:
130
- bound_args = sig.bind(*args, **kwargs)
147
+ bound_args = sig.bind(*f_args, **f_kwargs)
131
148
  bound_args.apply_defaults()
132
149
  handled_args = args_handler(**dict(bound_args.arguments))
133
150
  except Exception as e:
134
151
  if isinstance(e, TypeError):
152
+ # signature mismatch is a real error -> raise
135
153
  raise e
136
154
  else:
137
- handled_args = args_handler(*args, **kwargs)
155
+ # fallback to positional capture
156
+ handled_args = args_handler(*f_args, **f_kwargs)
138
157
 
139
158
  task_obj = TaskObject()
140
159
  task_obj.subtype = subtype
@@ -148,61 +167,138 @@ def flowcept_task(func=None, **decorator_kwargs):
148
167
  task_obj.hostname = HOSTNAME
149
168
  task_obj.task_id = str(task_obj.started_at)
150
169
  _thread_local._flowcept_current_context_task_id = task_obj.task_id
170
+
151
171
  if TELEMETRY_ENABLED:
172
+ # capture telemetry at start
152
173
  task_obj.telemetry_at_start = interceptor.telemetry_capture.capture()
153
174
 
154
- try:
155
- result = func(*args, **kwargs)
156
- task_obj.status = Status.FINISHED
157
- except Exception as e:
158
- task_obj.status = Status.ERROR
159
- result = None
160
- logger.exception(e)
161
- task_obj.stderr = str(e)
175
+ return task_obj
162
176
 
163
- task_obj.ended_at = time()
164
- if TELEMETRY_ENABLED:
165
- task_obj.telemetry_at_end = interceptor.telemetry_capture.capture()
177
+ def _attach_outputs(task_obj, result):
178
+ """
179
+ Populate task_obj.generated following the same logic you had before,
180
+ including output_names mapping and args_handler(), but only if we
181
+ actually got a result and we didn't error.
182
+ """
183
+ if result is None:
184
+ return
166
185
 
167
- # Output handling: only use output_names if provided
168
186
  try:
169
- if result is not None:
170
- named = None
187
+ named = None
171
188
 
172
- if isinstance(result, dict):
173
- # User already returned a mapping; pass through
189
+ if isinstance(result, dict):
190
+ # User already returned a mapping; pass it through sanitized
191
+ try:
192
+ task_obj.generated = args_handler(**result)
193
+ except Exception:
194
+ task_obj.generated = result
195
+ return
196
+
197
+ if output_names:
198
+ # map tuple/list/scalar to provided output_names
199
+ if isinstance(result, (tuple, list)):
200
+ if len(output_names) == len(result):
201
+ named = {k: v for k, v in zip(output_names, result)}
202
+ elif isinstance(output_names, str):
203
+ named = {output_names: result}
204
+ elif isinstance(output_names, (tuple, list)) and len(output_names) == 1:
205
+ named = {output_names[0]: result}
206
+
207
+ if isinstance(named, dict):
174
208
  try:
175
- task_obj.generated = args_handler(**result)
209
+ task_obj.generated = args_handler(**named)
176
210
  except Exception:
177
- task_obj.generated = result
178
- elif output_names:
179
- # If output_names provided, map scalar or tuple/list to names
180
- if isinstance(result, (tuple, list)):
181
- if len(output_names) == len(result):
182
- named = {k: v for k, v in zip(output_names, result)}
183
- elif isinstance(output_names, str):
184
- named = {output_names: result}
185
- elif isinstance(output_names, (tuple, list)) and len(output_names) == 1:
186
- named = {output_names[0]: result}
187
-
188
- if isinstance(named, dict):
189
- try:
190
- task_obj.generated = args_handler(**named)
191
- except Exception:
192
- task_obj.generated = named
193
- else:
194
- # Mismatch or no mapping possible -> original behavior
195
- task_obj.generated = args_handler(result)
211
+ task_obj.generated = named
196
212
  else:
197
- # No output_names: original behavior
213
+ # fallback: positional capture
198
214
  task_obj.generated = args_handler(result)
215
+ else:
216
+ # No output_names provided, fallback to positional capture
217
+ task_obj.generated = args_handler(result)
218
+
199
219
  except Exception as e:
220
+ # Don't kill the flow if serialization fails
200
221
  logger.exception(e)
201
222
 
223
+ def _common_post(task_obj, result, raised_exc):
224
+ """
225
+ Finalize task_obj (status, telemetry_at_end, generated, stderr, etc.)
226
+ and ship it.
227
+ """
228
+ if raised_exc is None:
229
+ task_obj.status = Status.FINISHED
230
+ else:
231
+ task_obj.status = Status.ERROR
232
+ task_obj.stderr = str(raised_exc)
233
+
234
+ task_obj.ended_at = time()
235
+
236
+ if TELEMETRY_ENABLED:
237
+ # capture telemetry at end
238
+ task_obj.telemetry_at_end = interceptor.telemetry_capture.capture()
239
+
240
+ # Only attach outputs if we actually finished successfully
241
+ if raised_exc is None:
242
+ _attach_outputs(task_obj, result)
243
+
244
+ # Send to interceptor
202
245
  interceptor.intercept(task_obj.to_dict())
203
- return result
204
246
 
205
- return wrapper
247
+ # --- build either sync or async wrapper -----------------------------
248
+
249
+ if inspect.iscoroutinefunction(func):
250
+
251
+ @wraps(func)
252
+ async def async_wrapper(*args, **kwargs):
253
+ # Fast path: instrumentation disabled
254
+ if not INSTRUMENTATION_ENABLED:
255
+ return await func(*args, **kwargs)
256
+
257
+ task_obj = _common_prep(*args, **kwargs)
258
+
259
+ result = None
260
+ raised_exc = None
261
+ try:
262
+ result = await func(*args, **kwargs)
263
+ except Exception as exc:
264
+ raised_exc = exc
265
+ logger.exception(exc)
266
+
267
+ _common_post(task_obj, result, raised_exc)
268
+
269
+ if raised_exc is not None:
270
+ # propagate error to caller
271
+ raise raised_exc
272
+ return result
273
+
274
+ return async_wrapper
275
+
276
+ else:
277
+
278
+ @wraps(func)
279
+ def sync_wrapper(*args, **kwargs):
280
+ # Fast path: instrumentation disabled
281
+ if not INSTRUMENTATION_ENABLED:
282
+ return func(*args, **kwargs)
283
+
284
+ task_obj = _common_prep(*args, **kwargs)
285
+
286
+ result = None
287
+ raised_exc = None
288
+ try:
289
+ result = func(*args, **kwargs)
290
+ except Exception as exc:
291
+ raised_exc = exc
292
+ logger.exception(exc)
293
+
294
+ _common_post(task_obj, result, raised_exc)
295
+
296
+ if raised_exc is not None:
297
+ # propagate error to caller
298
+ raise raised_exc
299
+ return result
300
+
301
+ return sync_wrapper
206
302
 
207
303
  if func is None:
208
304
  return decorator
@@ -1,5 +1,5 @@
1
1
  from time import time
2
- from typing import Dict, Any
2
+ from typing import Dict, Any, List
3
3
  import os
4
4
  import threading
5
5
  import random
@@ -44,10 +44,13 @@ class FlowceptTask(object):
44
44
  campaign_id: str = None,
45
45
  activity_id: str = None,
46
46
  agent_id: str = None,
47
+ source_agent_id: str = None,
47
48
  parent_task_id: str = None,
48
49
  used: Dict = None,
49
50
  data: Any = None,
50
51
  subtype: str = None,
52
+ tags: List[str] = None,
53
+ adapter_id: str = None,
51
54
  custom_metadata: Dict = None,
52
55
  generated: Dict = None,
53
56
  started_at: float = None,
@@ -114,8 +117,11 @@ class FlowceptTask(object):
114
117
  self._task.parent_task_id = parent_task_id
115
118
  self._task.used = used
116
119
  self._task.data = data
120
+ self._task.tags = tags
117
121
  self._task.subtype = subtype
122
+ self._task.adapter_id = adapter_id
118
123
  self._task.agent_id = agent_id
124
+ self._task.source_agent_id = source_agent_id
119
125
  self._task.custom_metadata = custom_metadata
120
126
 
121
127
  self._ended = False
@@ -215,3 +221,6 @@ class FlowceptTask(object):
215
221
  self._task.ended_at = self._task.started_at # message sents are not going to be analyzed for task duration
216
222
  self._interceptor.intercept(self._task.to_dict())
217
223
  self._ended = True
224
+
225
+ def __str__(self):
226
+ return str(self._task)
flowcept/version.py CHANGED
@@ -4,4 +4,4 @@
4
4
  # The expected format is: <Major>.<Minor>.<Patch>
5
5
  # This file is supposed to be automatically modified by the CI Bot.
6
6
  # See .github/workflows/version_bumper.py
7
- __version__ = "0.9.16"
7
+ __version__ = "0.9.18"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowcept
3
- Version: 0.9.16
3
+ Version: 0.9.18
4
4
  Summary: Capture and query workflow provenance data using data observability
5
5
  Author: Oak Ridge National Laboratory
6
6
  License-Expression: MIT
@@ -9,7 +9,7 @@ Keywords: agentic-ai,agentic-workflows,ai,big-data,dask,data-analytics,data-inte
9
9
  Classifier: License :: OSI Approved :: MIT License
10
10
  Classifier: Operating System :: OS Independent
11
11
  Classifier: Programming Language :: Python :: 3
12
- Requires-Python: >=3.10
12
+ Requires-Python: >=3.11
13
13
  Requires-Dist: msgpack
14
14
  Requires-Dist: numpy
15
15
  Requires-Dist: omegaconf
@@ -41,6 +41,7 @@ Requires-Dist: pyarrow; extra == 'all'
41
41
  Requires-Dist: pymongo; extra == 'all'
42
42
  Requires-Dist: pymupdf; extra == 'all'
43
43
  Requires-Dist: pytest; extra == 'all'
44
+ Requires-Dist: pytest-timeout; extra == 'all'
44
45
  Requires-Dist: pyyaml; extra == 'all'
45
46
  Requires-Dist: redis; extra == 'all'
46
47
  Requires-Dist: requests; extra == 'all'
@@ -50,6 +51,7 @@ Requires-Dist: seaborn; extra == 'all'
50
51
  Requires-Dist: sphinx; extra == 'all'
51
52
  Requires-Dist: sqlalchemy; extra == 'all'
52
53
  Requires-Dist: streamlit; extra == 'all'
54
+ Requires-Dist: tabulate; extra == 'all'
53
55
  Requires-Dist: tbparse; extra == 'all'
54
56
  Requires-Dist: tensorboard; extra == 'all'
55
57
  Requires-Dist: tensorflow; extra == 'all'
@@ -69,6 +71,7 @@ Requires-Dist: jupyterlab; extra == 'dev'
69
71
  Requires-Dist: nbmake; extra == 'dev'
70
72
  Requires-Dist: pika; extra == 'dev'
71
73
  Requires-Dist: pytest; extra == 'dev'
74
+ Requires-Dist: pytest-timeout; extra == 'dev'
72
75
  Requires-Dist: pyyaml; extra == 'dev'
73
76
  Requires-Dist: ruff; extra == 'dev'
74
77
  Requires-Dist: sphinx; extra == 'dev'
@@ -94,6 +97,7 @@ Requires-Dist: matplotlib; extra == 'llm-agent'
94
97
  Requires-Dist: mcp[cli]; extra == 'llm-agent'
95
98
  Requires-Dist: pymupdf; extra == 'llm-agent'
96
99
  Requires-Dist: streamlit; extra == 'llm-agent'
100
+ Requires-Dist: tabulate; extra == 'llm-agent'
97
101
  Provides-Extra: llm-agent-audio
98
102
  Requires-Dist: gtts; extra == 'llm-agent-audio'
99
103
  Requires-Dist: langchain-community; extra == 'llm-agent-audio'
@@ -105,6 +109,7 @@ Requires-Dist: pymupdf; extra == 'llm-agent-audio'
105
109
  Requires-Dist: speechrecognition; extra == 'llm-agent-audio'
106
110
  Requires-Dist: streamlit; extra == 'llm-agent-audio'
107
111
  Requires-Dist: streamlit-mic-recorder; extra == 'llm-agent-audio'
112
+ Requires-Dist: tabulate; extra == 'llm-agent-audio'
108
113
  Provides-Extra: llm-google
109
114
  Requires-Dist: google-genai; extra == 'llm-google'
110
115
  Requires-Dist: langchain-community; extra == 'llm-google'
@@ -113,6 +118,7 @@ Requires-Dist: matplotlib; extra == 'llm-google'
113
118
  Requires-Dist: mcp[cli]; extra == 'llm-google'
114
119
  Requires-Dist: pymupdf; extra == 'llm-google'
115
120
  Requires-Dist: streamlit; extra == 'llm-google'
121
+ Requires-Dist: tabulate; extra == 'llm-google'
116
122
  Provides-Extra: lmdb
117
123
  Requires-Dist: lmdb; extra == 'lmdb'
118
124
  Provides-Extra: ml-dev
@@ -169,6 +175,7 @@ Flowcept captures and queries workflow provenance at runtime with minimal code c
169
175
 
170
176
 
171
177
  [![Documentation](https://img.shields.io/badge/docs-readthedocs.io-green.svg)](https://flowcept.readthedocs.io/)
178
+ [![Slack](https://img.shields.io/badge/Slack-%23flowcept%40Workflows%20Community-4A154B?logo=slack)](https://workflowscommunity.slack.com/archives/C06L5GYJKQS)
172
179
  [![Build](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml/badge.svg)](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml)
173
180
  [![PyPI](https://badge.fury.io/py/flowcept.svg)](https://pypi.org/project/flowcept)
174
181
  [![Tests](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml/badge.svg)](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml)
@@ -179,6 +186,7 @@ Flowcept captures and queries workflow provenance at runtime with minimal code c
179
186
 
180
187
 
181
188
  <h4 align="center">
189
+ <a href="https://flowcept.org">Website</a> &#8226;
182
190
  <a href="https://flowcept.readthedocs.io/">Documentation</a> &#8226;
183
191
  <a href="./docs/publications">Publications</a>
184
192
  </h4>
@@ -1,27 +1,27 @@
1
1
  flowcept/__init__.py,sha256=tvVZKyymdqv3qOsgpAyDppBlUiBc0ag4QF21IcS-mVk,2449
2
2
  flowcept/cli.py,sha256=d3hogRpuMwQFIqw_fsYD4y074o3AFslBjlkRvTthOVM,25702
3
- flowcept/configs.py,sha256=DBkYx0CAaDSl8x2EJY1665PFY80eCp9PEriYH-BNwL4,8781
4
- flowcept/version.py,sha256=X_noM4WnOGvGvCrAd_pXE-NBhOzr3f_98p4cBho_IKA,307
3
+ flowcept/configs.py,sha256=JN_YFuNFeFyYe1ieiPhSlEc8PVnU8OXoMcKgf7c46ko,9011
4
+ flowcept/version.py,sha256=FVbVkAZsGLJF4VKbw0v8G0N_UTTbGRqm1dWVoX3mjfk,307
5
5
  flowcept/agents/__init__.py,sha256=8eeD2CiKBtHiDsWdrHK_UreIkKlTq4dUbhHDyzw372o,175
6
6
  flowcept/agents/agent_client.py,sha256=UiBQkC9WE2weLZR2OTkEOEQt9-zqQOkPwRA17HfI-jk,2027
7
- flowcept/agents/agents_utils.py,sha256=MXrzAFwCnBQF7s28QLN3OzWEIryOl-a0zeVQIbzNxD4,7330
7
+ flowcept/agents/agents_utils.py,sha256=aFJ_RVqE4XlXTG7e6SH6WPqfr7hjT4J3SjSgM6sgY60,8630
8
8
  flowcept/agents/dynamic_schema_tracker.py,sha256=TsmXRRkyUkqB-0bEgmeqSms8xj1tMMJeYvjoaO2mtwI,6829
9
- flowcept/agents/flowcept_agent.py,sha256=1sidjnNMdG0S6lUKBvml7ZfIb6o3u7zc6HNogsJbl9g,871
10
- flowcept/agents/flowcept_ctx_manager.py,sha256=-WmkddzzFY2dnU9LbZaoY4-5RcSAQH4FziEJgcC5LEI,7083
9
+ flowcept/agents/flowcept_agent.py,sha256=-PM7sGalZnUk-NVCekfHIY0I7oEZD9mnYGXMxFpo0EM,945
10
+ flowcept/agents/flowcept_ctx_manager.py,sha256=OiDzie1qp2ZlSphA-4b5kjUHlzP0yjJ4XcFSiNEGgiU,9717
11
11
  flowcept/agents/gui/__init__.py,sha256=Qw9YKbAzgZqBjMQGnF7XWmfUo0fivtkDISQRK3LA3gU,113
12
12
  flowcept/agents/gui/agent_gui.py,sha256=VpwhQamzFKBfrmibxOIc-8wXtZnd2Cq7tbKahZZOp7c,2995
13
13
  flowcept/agents/gui/audio_utils.py,sha256=piA_dc36io1sYqLF6QArS4AMl-cfDa001jGhYz5LkB4,4279
14
- flowcept/agents/gui/gui_utils.py,sha256=cQVhOgnfxJNUVZyXyO8f40nB1yaKAKVtBrwQmJjL0B0,14933
14
+ flowcept/agents/gui/gui_utils.py,sha256=Z8_risHlf6Xde0wPXXEKuLZ8BXQDsWJvg1POvNJepVg,15678
15
15
  flowcept/agents/llms/__init__.py,sha256=kzOaJic5VhMBnGvy_Fr5C6sRKVrRntH1ZnYz7f5_4-s,23
16
16
  flowcept/agents/llms/claude_gcp.py,sha256=fzz7235DgzVueuFj5odsr93jWtYHpYlXkSGW1kmmJwU,4915
17
17
  flowcept/agents/llms/gemini25.py,sha256=VARrjb3tITIh3_Wppmocp_ocSKVZNon0o0GeFEwTnTI,4229
18
18
  flowcept/agents/prompts/__init__.py,sha256=7ICsNhLYzvPS1esG3Vg519s51b1c4yN0WegJUb6Qvww,26
19
- flowcept/agents/prompts/general_prompts.py,sha256=b0QhnF-ytIE1_WWrgpamC4VybjS8KuS051DgVVt8r2U,3961
20
- flowcept/agents/prompts/in_memory_query_prompts.py,sha256=iRaGySybNxZf5vuQ3n9cb14VNk6bMQ0z3tn2mVVke0E,19817
19
+ flowcept/agents/prompts/general_prompts.py,sha256=Mjv8yz8GtOZSbBKtKmvl157Op6Aq-VYEM69X9UaNbQU,3970
20
+ flowcept/agents/prompts/in_memory_query_prompts.py,sha256=UH3fVUf8D8bvblBmRfC5jb4-jm4Sh8BlCqoPm1c0fbs,24171
21
21
  flowcept/agents/tools/__init__.py,sha256=Xqz2E4-LL_7DDcm1XYJFx2f5RdAsjeTpOJb_DPC7xyc,27
22
- flowcept/agents/tools/general_tools.py,sha256=JSMG_UGdRKcQfC4_ixzDXDHW92UX5i0UsLTzFq0fmZg,4402
22
+ flowcept/agents/tools/general_tools.py,sha256=hALMIETOPJGGobA5s22d3Mssa44RerygRySK-KUht4w,4853
23
23
  flowcept/agents/tools/in_memory_queries/__init__.py,sha256=K8-JI_lXUgquKkgga8Nef8AntGg_logQtjjQjaEE7yI,39
24
- flowcept/agents/tools/in_memory_queries/in_memory_queries_tools.py,sha256=GcfAiUBhQ1DU3QKk0kAy9TSq8XmZw691Xs0beZoO76A,25984
24
+ flowcept/agents/tools/in_memory_queries/in_memory_queries_tools.py,sha256=VWp409ZC1wDmb_OLjz0jgMJdYR7nk-zfMCANSbOeAWQ,25876
25
25
  flowcept/agents/tools/in_memory_queries/pandas_agent_utils.py,sha256=xyrZupR86qoUptnnQ7PeF0LTzSOquEK2cjc0ghT1KBs,9018
26
26
  flowcept/analytics/__init__.py,sha256=46q-7vsHq_ddPNrzNnDgEOiRgvlx-5Ggu2ocyROMV0w,641
27
27
  flowcept/analytics/analytics_utils.py,sha256=FRJdBtQa7Hrk2oR_FFhmhmMf3X6YyZ4nbH5RIYh7KL4,8753
@@ -40,21 +40,21 @@ flowcept/commons/daos/keyvalue_dao.py,sha256=g7zgC9hVC1NTllwUAqGt44YqdqYUgAKgPlX
40
40
  flowcept/commons/daos/redis_conn.py,sha256=gFyW-5yf6B8ExEYopCmbap8ki-iEwuIw-KH9f6o7UGQ,1495
41
41
  flowcept/commons/daos/docdb_dao/__init__.py,sha256=qRvXREeUJ4mkhxdC9bzpOsVX6M2FB5hDyLFxhMxTGhs,30
42
42
  flowcept/commons/daos/docdb_dao/docdb_dao_base.py,sha256=YbfSVJPwZGK2GBYkeapRC83HkmP0c6Msv5TriD88RcI,11812
43
- flowcept/commons/daos/docdb_dao/lmdb_dao.py,sha256=ZuCsdEhI2wGAmjAf82j-1t3tbR6YMmDeaJ_C3HcsLYo,10461
43
+ flowcept/commons/daos/docdb_dao/lmdb_dao.py,sha256=5FV11hjIpFUZTP4HJwPTswd4TT27EJ3it82TpY5Z2RI,12187
44
44
  flowcept/commons/daos/docdb_dao/mongodb_dao.py,sha256=5x0un15uCDTcnuITOyOhvF9mKj_bUmF2du0AHQfjN9k,40055
45
45
  flowcept/commons/daos/mq_dao/__init__.py,sha256=Xxm4FmbBUZDQ7XIAmSFbeKE_AdHsbgFmSuftvMWSykQ,21
46
46
  flowcept/commons/daos/mq_dao/mq_dao_base.py,sha256=VXqXzesU01dCHE5i0urnYQppixUNGZbJMRmm4jSAcgM,9424
47
- flowcept/commons/daos/mq_dao/mq_dao_kafka.py,sha256=kjZqPLIu5PaNeM4IDvOxkDRVGTd5UWwq3zhDvVirqW8,5067
47
+ flowcept/commons/daos/mq_dao/mq_dao_kafka.py,sha256=mWoY9RvViHegzXXynuegU_jg-S55YSV5lfgNqaPuMlg,5085
48
48
  flowcept/commons/daos/mq_dao/mq_dao_mofka.py,sha256=tRdMGYDzdeIJxad-B4-DE6u8Wzs61eTzOW4ojZrnTxs,4057
49
- flowcept/commons/daos/mq_dao/mq_dao_redis.py,sha256=ejBMxImA-h2KuMEAk3l7aU0chCcObCbUXEOXM6L4Zhc,5571
49
+ flowcept/commons/daos/mq_dao/mq_dao_redis.py,sha256=be1ejbQofeJhf2qw7AWT9JF8z-a3kk-DbSCMU9wAwuI,6773
50
50
  flowcept/commons/flowcept_dataclasses/__init__.py,sha256=8KkiJh0WSRAB50waVluxCSI8Tb9X1L9nup4c8RN3ulc,30
51
51
  flowcept/commons/flowcept_dataclasses/base_settings_dataclasses.py,sha256=Cjw2PGYtZDfnwecz6G3S42Ncmxj7AIZVEBx05bsxRUo,399
52
- flowcept/commons/flowcept_dataclasses/task_object.py,sha256=XLFD8YTWsyDLSRcgZc5qK2a9yk97XnqZoUAL4T6HNPE,8110
52
+ flowcept/commons/flowcept_dataclasses/task_object.py,sha256=E2w6sZNAUIE4TjI2w4DFo2CaC4sBsNE9z45jvQAHbxw,8226
53
53
  flowcept/commons/flowcept_dataclasses/telemetry.py,sha256=9_5ONCo-06r5nKHXmi5HfIhiZSuPgmTECiq_u9MlxXM,2822
54
54
  flowcept/commons/flowcept_dataclasses/workflow_object.py,sha256=cauWtXHhBv9lHS-q6cb7yUsNiwQ6PkZPuSinR1TKcqU,6161
55
55
  flowcept/flowcept_api/__init__.py,sha256=T1ty86YlocQ5Z18l5fUqHj_CC6Unq_iBv0lFyiI7Ao8,22
56
56
  flowcept/flowcept_api/db_api.py,sha256=hKXep-n50rp9cAzV0ljk2QVEF8O64yxi3ujXv5_Ibac,9723
57
- flowcept/flowcept_api/flowcept_controller.py,sha256=az1bktiL8_xs4pc97Zqgd1ezsg-cD0whf3XWA1ZN08Q,20652
57
+ flowcept/flowcept_api/flowcept_controller.py,sha256=fF9DuQ0A3hm9NIx_9xgt0IaD30PbCZIwEESNS1arQOY,20825
58
58
  flowcept/flowcept_api/task_query_api.py,sha256=SrwB0OCVtbpvCPECkE2ySM10G_g8Wlk5PJ8h-0xEaNc,23821
59
59
  flowcept/flowcept_webserver/__init__.py,sha256=8411GIXGddKTKoHUvbo_Rq6svosNG7tG8VzvUEBd7WI,28
60
60
  flowcept/flowcept_webserver/app.py,sha256=VUV8_JZbIbx9u_1O7m7XtRdhZb_7uifUa-iNlPhmZws,658
@@ -74,29 +74,29 @@ flowcept/flowceptor/adapters/dask/dask_dataclasses.py,sha256=6LTG-kdcc6AUuVINvkq
74
74
  flowcept/flowceptor/adapters/dask/dask_interceptor.py,sha256=uBQpLluYXzlT1gBDfTe4_WueC_fWBEs5Xr8ntpOmljE,5869
75
75
  flowcept/flowceptor/adapters/dask/dask_plugins.py,sha256=s1ENAi9N61PC_6RiFvOYhJsgWzSm_lFWm3w87V-R1YY,2473
76
76
  flowcept/flowceptor/adapters/mlflow/__init__.py,sha256=3mzHrvh1XQOy68qx1A3so9Nq27tIb0i2mSXfv3F6gZg,25
77
- flowcept/flowceptor/adapters/mlflow/interception_event_handler.py,sha256=-SsIRdOcZjQUTzWgsZ41ouqpla4Qd32jIWXIAGU1pPw,494
77
+ flowcept/flowceptor/adapters/mlflow/interception_event_handler.py,sha256=ajm62XfZNTsbEXI4ON_tfwyK1ujoCm9G573BfuXgHN0,1716
78
78
  flowcept/flowceptor/adapters/mlflow/mlflow_dao.py,sha256=dPEgCduiw14_pzT5WCjuokwaN7p5Tu7UvWS2rtGh4qk,4589
79
79
  flowcept/flowceptor/adapters/mlflow/mlflow_dataclasses.py,sha256=vbijpDW6npHdsA9-28otXw94O4a9R-PWtq3xlJapsyY,690
80
- flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py,sha256=OLmVBdOCMS3GPcdxSdCD794RDbW6p4f8eBh1PXWcvHE,3799
80
+ flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py,sha256=4geLRHpGXo9PAGzDY8mxaQzb8aDCv30YEUlx816mOlU,4433
81
81
  flowcept/flowceptor/adapters/tensorboard/__init__.py,sha256=LrcR4WCIlBwwHIUSteQ8k8JBdCJTFqLvvgAfnoLeREw,30
82
82
  flowcept/flowceptor/adapters/tensorboard/tensorboard_dataclasses.py,sha256=lSfDd6TucVNzGxbm69BYyCVgMr2p9iUEQjnsS4jIfeI,554
83
- flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py,sha256=PUKGlCsYcybsk1HK573Brs6FiXQRoaj6MKgZ3Oyeec4,4881
83
+ flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py,sha256=GcRiY93MjuEmdhh37PAyj4ZtwBovA7FPiEM2TjVxsPw,5123
84
84
  flowcept/flowceptor/consumers/__init__.py,sha256=foxtVEb2ZEe9g1slfYIKM4tIFv-He1l7XS--SYs7nlQ,28
85
85
  flowcept/flowceptor/consumers/base_consumer.py,sha256=hrZ3VFV7pJBMXZsvh7Q2Y36b_ifcnbJkgwe2MiuZL70,3324
86
86
  flowcept/flowceptor/consumers/consumer_utils.py,sha256=E6R07zIKNXJTCxvL-OCrCKNYRpqtwRiXiZx0D2BKidk,5893
87
87
  flowcept/flowceptor/consumers/document_inserter.py,sha256=IeVl6Y4Q1KlpYGvE7uDI0vKQf-MGf2pgnIpxCYtyzKE,13392
88
88
  flowcept/flowceptor/consumers/agent/__init__.py,sha256=R1uvjBPeTLw9SpYgyUc6Qmo16pE84PFHcELTTFvyTWU,56
89
- flowcept/flowceptor/consumers/agent/base_agent_context_manager.py,sha256=5fBPYs-k4bsKDcIXyUbps9KoiQkfAWLHJB52lypYKas,4161
89
+ flowcept/flowceptor/consumers/agent/base_agent_context_manager.py,sha256=sAoMtbfB63Ys7AxUiARlTm9z1QX9HcVNYE-mpjyYo58,4116
90
90
  flowcept/instrumentation/__init__.py,sha256=M5bTmg80E4QyN91gUX3qfw_nbtJSXwGWcKxdZP3vJz0,34
91
91
  flowcept/instrumentation/flowcept_agent_task.py,sha256=XN9JU4LODca0SgojUm4F5iU_V8tuWkOt1fAKcoOAG34,10757
92
92
  flowcept/instrumentation/flowcept_decorator.py,sha256=X4Lp_FSsoL08K8ZhRM4mC0OjKupbQtbMQR8zxy3ezDY,1350
93
93
  flowcept/instrumentation/flowcept_loop.py,sha256=nF7Sov-DCDapyYvS8zx-1ZFrnjc3CPg2VsjDaxFs0Cc,15667
94
- flowcept/instrumentation/flowcept_task.py,sha256=EmKODpjl8usNklKSVmsKYyCa6gC_QMqKhAr3DKaw44s,8199
94
+ flowcept/instrumentation/flowcept_task.py,sha256=_G1e5SOMQ1y8RhO_rVexe7icQbgFF4TpaHlpW_MxERc,11135
95
95
  flowcept/instrumentation/flowcept_torch.py,sha256=kkZQRYq6cDBpdBU6J39_4oKRVkhyF3ODlz8ydV5WGKw,23455
96
- flowcept/instrumentation/task_capture.py,sha256=1g9EtLdqsTB0RHsF-eRmA2Xh9l_YqTd953d4v89IC24,8287
97
- resources/sample_settings.yaml,sha256=M994vAtdMeEzjfJ0v56ibYEtEIXciNSy9iZqXuWAJcA,6881
98
- flowcept-0.9.16.dist-info/METADATA,sha256=PM5oaTzN7PT46XwOFs480asKZeq76Y_km1mc72zdCEs,32896
99
- flowcept-0.9.16.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
100
- flowcept-0.9.16.dist-info/entry_points.txt,sha256=i8q67WE0201rVxYI2lyBtS52shvgl93x2Szp4q8zMlw,47
101
- flowcept-0.9.16.dist-info/licenses/LICENSE,sha256=r5-2P6tFTuRGWT5TiX32s1y0tnp4cIqBEC1QjTaXe2k,1086
102
- flowcept-0.9.16.dist-info/RECORD,,
96
+ flowcept/instrumentation/task_capture.py,sha256=p_Cj9_cHVMhgzqDXhKqdpk01-88VAAVhbgk5IDa-7sk,8576
97
+ resources/sample_settings.yaml,sha256=AYFqPC0im0ia5TiR2Ri_d5C11gLSDaqXX5j5fa79D6Q,6895
98
+ flowcept-0.9.18.dist-info/METADATA,sha256=jBMMehf112ABa6qRQhSBU3q-2Aho9KvD02tx5aPEYRU,33386
99
+ flowcept-0.9.18.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
100
+ flowcept-0.9.18.dist-info/entry_points.txt,sha256=i8q67WE0201rVxYI2lyBtS52shvgl93x2Szp4q8zMlw,47
101
+ flowcept-0.9.18.dist-info/licenses/LICENSE,sha256=r5-2P6tFTuRGWT5TiX32s1y0tnp4cIqBEC1QjTaXe2k,1086
102
+ flowcept-0.9.18.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.27.0
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,4 +1,4 @@
1
- flowcept_version: 0.9.16 # Version of the Flowcept package. This setting file is compatible with this version.
1
+ flowcept_version: 0.9.18 # Version of the Flowcept package. This setting file is compatible with this version.
2
2
 
3
3
  project:
4
4
  debug: true # Toggle debug mode. This will add a property `debug: true` to all saved data, making it easier to retrieve/delete them later.
@@ -94,6 +94,7 @@ agent:
94
94
  service_provider: '?'
95
95
  model_kwargs: {}
96
96
  audio_enabled: false
97
+ debug: true
97
98
 
98
99
  databases:
99
100