grasp_agents 0.5.5__py3-none-any.whl → 0.5.8__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.
@@ -5,7 +5,7 @@ from typing import Any, Generic, Protocol, TypeVar, cast, final
5
5
 
6
6
  from ..errors import WorkflowConstructionError
7
7
  from ..packet_pool import Packet
8
- from ..processor import Processor
8
+ from ..processors.base_processor import BaseProcessor
9
9
  from ..run_context import CtxT, RunContext
10
10
  from ..typing.events import Event, ProcPacketOutputEvent, WorkflowResultEvent
11
11
  from ..typing.io import InT, OutT, ProcName
@@ -16,7 +16,7 @@ logger = getLogger(__name__)
16
16
  _OutT_contra = TypeVar("_OutT_contra", contravariant=True)
17
17
 
18
18
 
19
- class ExitWorkflowLoopHandler(Protocol[_OutT_contra, CtxT]):
19
+ class WorkflowLoopTerminator(Protocol[_OutT_contra, CtxT]):
20
20
  def __call__(
21
21
  self,
22
22
  out_packet: Packet[_OutT_contra],
@@ -29,8 +29,8 @@ class LoopedWorkflow(WorkflowProcessor[InT, OutT, CtxT], Generic[InT, OutT, CtxT
29
29
  def __init__(
30
30
  self,
31
31
  name: ProcName,
32
- subprocs: Sequence[Processor[Any, Any, Any, CtxT]],
33
- exit_proc: Processor[Any, OutT, Any, CtxT],
32
+ subprocs: Sequence[BaseProcessor[Any, Any, Any, CtxT]],
33
+ exit_proc: BaseProcessor[Any, OutT, Any, CtxT],
34
34
  recipients: list[ProcName] | None = None,
35
35
  max_retries: int = 0,
36
36
  max_iterations: int = 10,
@@ -60,28 +60,30 @@ class LoopedWorkflow(WorkflowProcessor[InT, OutT, CtxT], Generic[InT, OutT, CtxT
60
60
 
61
61
  self._max_iterations = max_iterations
62
62
 
63
- self._exit_workflow_loop_impl: ExitWorkflowLoopHandler[OutT, CtxT] | None = None
63
+ self.workflow_loop_terminator: WorkflowLoopTerminator[OutT, CtxT] | None
64
+ if not hasattr(type(self), "workflow_loop_terminator"):
65
+ self.workflow_loop_terminator = None
64
66
 
65
67
  @property
66
68
  def max_iterations(self) -> int:
67
69
  return self._max_iterations
68
70
 
69
- def exit_workflow_loop(
70
- self, func: ExitWorkflowLoopHandler[OutT, CtxT]
71
- ) -> ExitWorkflowLoopHandler[OutT, CtxT]:
72
- self._exit_workflow_loop_impl = func
71
+ def add_workflow_loop_terminator(
72
+ self, func: WorkflowLoopTerminator[OutT, CtxT]
73
+ ) -> WorkflowLoopTerminator[OutT, CtxT]:
74
+ self.workflow_loop_terminator = func
73
75
 
74
76
  return func
75
77
 
76
- def _exit_workflow_loop(
78
+ def _terminate_workflow_loop(
77
79
  self,
78
80
  out_packet: Packet[OutT],
79
81
  *,
80
82
  ctx: RunContext[CtxT] | None = None,
81
83
  **kwargs: Any,
82
84
  ) -> bool:
83
- if self._exit_workflow_loop_impl:
84
- return self._exit_workflow_loop_impl(out_packet, ctx=ctx, **kwargs)
85
+ if self.workflow_loop_terminator:
86
+ return self.workflow_loop_terminator(out_packet, ctx=ctx, **kwargs)
85
87
 
86
88
  return False
87
89
 
@@ -96,14 +98,15 @@ class LoopedWorkflow(WorkflowProcessor[InT, OutT, CtxT], Generic[InT, OutT, CtxT
96
98
  forgetful: bool = False,
97
99
  ctx: RunContext[CtxT] | None = None,
98
100
  ) -> Packet[OutT]:
99
- call_id = self._generate_call_id(call_id)
100
-
101
101
  packet = in_packet
102
- num_iterations = 0
103
102
  exit_packet: Packet[OutT] | None = None
104
103
 
105
- while True:
104
+ for num_iterations in range(1, self._max_iterations + 1):
105
+ call_id = self._generate_call_id(call_id)
106
+
106
107
  for subproc in self.subprocs:
108
+ logger.info(f"\n[Running subprocessor {subproc.name}]\n")
109
+
107
110
  packet = await subproc.run(
108
111
  chat_inputs=chat_inputs,
109
112
  in_packet=packet,
@@ -113,12 +116,13 @@ class LoopedWorkflow(WorkflowProcessor[InT, OutT, CtxT], Generic[InT, OutT, CtxT
113
116
  ctx=ctx,
114
117
  )
115
118
 
119
+ logger.info(f"\n[Finished running subprocessor {subproc.name}]\n")
120
+
116
121
  if subproc is self._end_proc:
117
- num_iterations += 1
118
122
  exit_packet = cast("Packet[OutT]", packet)
119
- if self._exit_workflow_loop(exit_packet, ctx=ctx):
123
+ if self._terminate_workflow_loop(exit_packet, ctx=ctx):
120
124
  return exit_packet
121
- if num_iterations >= self._max_iterations:
125
+ if num_iterations == self._max_iterations:
122
126
  logger.info(
123
127
  f"Max iterations reached ({self._max_iterations}). "
124
128
  "Exiting loop."
@@ -128,8 +132,10 @@ class LoopedWorkflow(WorkflowProcessor[InT, OutT, CtxT], Generic[InT, OutT, CtxT
128
132
  chat_inputs = None
129
133
  in_args = None
130
134
 
135
+ raise RuntimeError("Looped workflow did not exit after max iterations.")
136
+
131
137
  @final
132
- async def run_stream( # type: ignore[override]
138
+ async def run_stream(
133
139
  self,
134
140
  chat_inputs: Any | None = None,
135
141
  *,
@@ -139,14 +145,15 @@ class LoopedWorkflow(WorkflowProcessor[InT, OutT, CtxT], Generic[InT, OutT, CtxT
139
145
  forgetful: bool = False,
140
146
  ctx: RunContext[CtxT] | None = None,
141
147
  ) -> AsyncIterator[Event[Any]]:
142
- call_id = self._generate_call_id(call_id)
143
-
144
148
  packet = in_packet
145
- num_iterations = 0
146
149
  exit_packet: Packet[OutT] | None = None
147
150
 
148
- while True:
151
+ for num_iterations in range(1, self._max_iterations + 1):
152
+ call_id = self._generate_call_id(call_id)
153
+
149
154
  for subproc in self.subprocs:
155
+ logger.info(f"\n[Running subprocessor {subproc.name}]\n")
156
+
150
157
  async for event in subproc.run_stream(
151
158
  chat_inputs=chat_inputs,
152
159
  in_packet=packet,
@@ -159,15 +166,16 @@ class LoopedWorkflow(WorkflowProcessor[InT, OutT, CtxT], Generic[InT, OutT, CtxT
159
166
  packet = event.data
160
167
  yield event
161
168
 
169
+ logger.info(f"\n[Finished running subprocessor {subproc.name}]\n")
170
+
162
171
  if subproc is self._end_proc:
163
- num_iterations += 1
164
172
  exit_packet = cast("Packet[OutT]", packet)
165
- if self._exit_workflow_loop(exit_packet, ctx=ctx):
173
+ if self._terminate_workflow_loop(exit_packet, ctx=ctx):
166
174
  yield WorkflowResultEvent(
167
175
  data=exit_packet, proc_name=self.name, call_id=call_id
168
176
  )
169
177
  return
170
- if num_iterations >= self._max_iterations:
178
+ if num_iterations == self._max_iterations:
171
179
  logger.info(
172
180
  f"Max iterations reached ({self._max_iterations}). "
173
181
  "Exiting loop."
@@ -1,21 +1,24 @@
1
+ import logging
1
2
  from collections.abc import AsyncIterator, Sequence
2
3
  from itertools import pairwise
3
4
  from typing import Any, Generic, cast, final
4
5
 
5
6
  from ..errors import WorkflowConstructionError
6
7
  from ..packet_pool import Packet
7
- from ..processor import Processor
8
+ from ..processors.base_processor import BaseProcessor
8
9
  from ..run_context import CtxT, RunContext
9
10
  from ..typing.events import Event, ProcPacketOutputEvent, WorkflowResultEvent
10
11
  from ..typing.io import InT, OutT, ProcName
11
12
  from .workflow_processor import WorkflowProcessor
12
13
 
14
+ logger = logging.getLogger(__name__)
15
+
13
16
 
14
17
  class SequentialWorkflow(WorkflowProcessor[InT, OutT, CtxT], Generic[InT, OutT, CtxT]):
15
18
  def __init__(
16
19
  self,
17
20
  name: ProcName,
18
- subprocs: Sequence[Processor[Any, Any, Any, CtxT]],
21
+ subprocs: Sequence[BaseProcessor[Any, Any, Any, CtxT]],
19
22
  recipients: list[ProcName] | None = None,
20
23
  max_retries: int = 0,
21
24
  ) -> None:
@@ -51,6 +54,8 @@ class SequentialWorkflow(WorkflowProcessor[InT, OutT, CtxT], Generic[InT, OutT,
51
54
 
52
55
  packet = in_packet
53
56
  for subproc in self.subprocs:
57
+ logger.info(f"\n[Running subprocessor {subproc.name}]\n")
58
+
54
59
  packet = await subproc.run(
55
60
  chat_inputs=chat_inputs,
56
61
  in_packet=packet,
@@ -62,10 +67,12 @@ class SequentialWorkflow(WorkflowProcessor[InT, OutT, CtxT], Generic[InT, OutT,
62
67
  chat_inputs = None
63
68
  in_args = None
64
69
 
70
+ logger.info(f"\n[Finished running subprocessor {subproc.name}]\n")
71
+
65
72
  return cast("Packet[OutT]", packet)
66
73
 
67
74
  @final
68
- async def run_stream( # type: ignore[override]
75
+ async def run_stream(
69
76
  self,
70
77
  chat_inputs: Any | None = None,
71
78
  *,
@@ -79,6 +86,8 @@ class SequentialWorkflow(WorkflowProcessor[InT, OutT, CtxT], Generic[InT, OutT,
79
86
 
80
87
  packet = in_packet
81
88
  for subproc in self.subprocs:
89
+ logger.info(f"\n[Running subprocessor {subproc.name}]\n")
90
+
82
91
  async for event in subproc.run_stream(
83
92
  chat_inputs=chat_inputs,
84
93
  in_packet=packet,
@@ -94,6 +103,8 @@ class SequentialWorkflow(WorkflowProcessor[InT, OutT, CtxT], Generic[InT, OutT,
94
103
  chat_inputs = None
95
104
  in_args = None
96
105
 
106
+ logger.info(f"\n[Finished running subprocessor {subproc.name}]\n")
107
+
97
108
  yield WorkflowResultEvent(
98
109
  data=cast("Packet[OutT]", packet), proc_name=self.name, call_id=call_id
99
110
  )
@@ -4,23 +4,23 @@ from typing import Any, Generic
4
4
 
5
5
  from ..errors import WorkflowConstructionError
6
6
  from ..packet import Packet
7
- from ..processor import Processor, RecipientSelector
7
+ from ..processors.base_processor import BaseProcessor, RecipientSelector
8
8
  from ..run_context import CtxT, RunContext
9
- from ..typing.events import Event
9
+ from ..typing.events import DummyEvent, Event
10
10
  from ..typing.io import InT, OutT, ProcName
11
11
 
12
12
 
13
13
  class WorkflowProcessor(
14
- Processor[InT, OutT, Any, CtxT],
14
+ BaseProcessor[InT, OutT, Any, CtxT],
15
15
  ABC,
16
16
  Generic[InT, OutT, CtxT],
17
17
  ):
18
18
  def __init__(
19
19
  self,
20
20
  name: ProcName,
21
- subprocs: Sequence[Processor[Any, Any, Any, CtxT]],
22
- start_proc: Processor[InT, Any, Any, CtxT],
23
- end_proc: Processor[Any, OutT, Any, CtxT],
21
+ subprocs: Sequence[BaseProcessor[Any, Any, Any, CtxT]],
22
+ start_proc: BaseProcessor[InT, Any, Any, CtxT],
23
+ end_proc: BaseProcessor[Any, OutT, Any, CtxT],
24
24
  recipients: list[ProcName] | None = None,
25
25
  max_retries: int = 0,
26
26
  ) -> None:
@@ -44,10 +44,7 @@ class WorkflowProcessor(
44
44
  self._start_proc = start_proc
45
45
  self._end_proc = end_proc
46
46
 
47
- self.recipients = end_proc.recipients
48
- if recipients is not None:
49
- self.recipients = recipients
50
-
47
+ self.recipients = recipients
51
48
  if hasattr(type(self), "recipient_selector"):
52
49
  self._end_proc.recipient_selector = self.recipient_selector
53
50
 
@@ -60,19 +57,28 @@ class WorkflowProcessor(
60
57
  return func
61
58
 
62
59
  @property
63
- def subprocs(self) -> Sequence[Processor[Any, Any, Any, CtxT]]:
60
+ def recipients(self) -> list[ProcName] | None:
61
+ return self._end_proc.recipients
62
+
63
+ @recipients.setter
64
+ def recipients(self, value: list[ProcName] | None) -> None:
65
+ if hasattr(self, "_end_proc"):
66
+ self._end_proc.recipients = value
67
+
68
+ @property
69
+ def subprocs(self) -> Sequence[BaseProcessor[Any, Any, Any, CtxT]]:
64
70
  return self._subprocs
65
71
 
66
72
  @property
67
- def start_proc(self) -> Processor[InT, Any, Any, CtxT]:
73
+ def start_proc(self) -> BaseProcessor[InT, Any, Any, CtxT]:
68
74
  return self._start_proc
69
75
 
70
76
  @property
71
- def end_proc(self) -> Processor[Any, OutT, Any, CtxT]:
77
+ def end_proc(self) -> BaseProcessor[Any, OutT, Any, CtxT]:
72
78
  return self._end_proc
73
79
 
74
80
  def _generate_subproc_call_id(
75
- self, call_id: str | None, subproc: Processor[Any, Any, Any, CtxT]
81
+ self, call_id: str | None, subproc: BaseProcessor[Any, Any, Any, CtxT]
76
82
  ) -> str | None:
77
83
  return f"{self._generate_call_id(call_id)}/{subproc.name}"
78
84
 
@@ -100,4 +106,4 @@ class WorkflowProcessor(
100
106
  forgetful: bool = False,
101
107
  call_id: str | None = None,
102
108
  ) -> AsyncIterator[Event[Any]]:
103
- pass
109
+ yield DummyEvent()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: grasp_agents
3
- Version: 0.5.5
3
+ Version: 0.5.8
4
4
  Summary: Grasp Agents Library
5
5
  License-File: LICENSE.md
6
6
  Requires-Python: <4,>=3.11.4
@@ -1,22 +1,21 @@
1
- grasp_agents/__init__.py,sha256=h8fAUoFK7HrAMgoZ3b4_eGLnn1kF4ofHh_9DdqoaHfU,860
2
- grasp_agents/cloud_llm.py,sha256=C6xrKYhiQb4tNXK_rFo2pNlVTXPS_gYd5uevAnpLFeE,13119
1
+ grasp_agents/__init__.py,sha256=Z3a_j2Etiap9H6lvE8-PQP_OIGMUcHNPeJAJO12B8kY,1031
2
+ grasp_agents/cloud_llm.py,sha256=gM43G4-dR-vugeKuhGty8iEuZUbloImbz2XyWO0IMjg,13254
3
3
  grasp_agents/costs_dict.yaml,sha256=2MFNWtkv5W5WSCcv1Cj13B1iQLVv5Ot9pS_KW2Gu2DA,2510
4
4
  grasp_agents/errors.py,sha256=K-22TCM1Klhsej47Rg5eTqnGiGPaXgKOpdOZZ7cPipw,4633
5
5
  grasp_agents/generics_utils.py,sha256=5Pw3I9dlnKC2VGqYKC4ZZUO3Z_vTNT-NPFovNfPkl6I,6542
6
6
  grasp_agents/grasp_logging.py,sha256=H1GYhXdQvVkmauFDZ-KDwvVmPQHZUUm9sRqX_ObK2xI,1111
7
7
  grasp_agents/http_client.py,sha256=Es8NXGDkp4Nem7g24-jW0KFGA9Hp_o2Cv3cOvjup-iU,859
8
- grasp_agents/llm.py,sha256=YCzHlb2gdWVy77DmQpcu0dyEzGp4VQa3UMRJKodCYSs,6557
9
- grasp_agents/llm_agent.py,sha256=Qh26FlhGKKw9XMOU16Nr1GOfdUD8L5SjAM-Vh3Y5jx0,13175
8
+ grasp_agents/llm.py,sha256=w3vVIYUfhr_t45sZa0Nl373Htm05r9NUS02SvCKXbVA,12151
9
+ grasp_agents/llm_agent.py,sha256=hX3T2Y5qiTt5CrsahNo5t08HFCyBWEiurzYnFykJN9Y,13513
10
10
  grasp_agents/llm_agent_memory.py,sha256=gQwH3g4Ib3ciW2jrBiW13ttwax_pcPobH5RhXRmbc0E,1842
11
- grasp_agents/llm_policy_executor.py,sha256=glusWe4wTIh_rl3bXPbAMueJ5eDfJxPYBTzoecrHPYg,16849
11
+ grasp_agents/llm_policy_executor.py,sha256=bP-O1itfaG-dr2PC9_zLCNMI862cPRqW7vsj9tRCz-I,17062
12
12
  grasp_agents/memory.py,sha256=keHuNEZNSxHT9FKpMohHOCNi7UAz_oRIc91IQEuzaWE,1162
13
13
  grasp_agents/packet.py,sha256=EmE-W4ZSMVZoqClECGFe7OGqrT4FSJ8IVGICrdjtdEY,1462
14
- grasp_agents/packet_pool.py,sha256=A5hqEvh7XwaPJVkfbItMm5FQqxujVzXDId7HnSUqluI,4919
15
- grasp_agents/printer.py,sha256=kecOs4Jfxb--ZjvvDn1q2-CnZXZeJaMwQEYOlfj2pbo,11039
16
- grasp_agents/processor.py,sha256=eCte5jvFsGxzlgjEnIcakuvTB5bNWRq-29cAYWNZBXY,17149
14
+ grasp_agents/packet_pool.py,sha256=AF7ZMYY1U6ppNLEn6o0R8QXyWmcLQGcju7_TYQpAudg,4443
15
+ grasp_agents/printer.py,sha256=wVNCaR9mbFKyzYdT8YpYD1JQqRqHdLtdfiZrwYxaM6Y,11132
17
16
  grasp_agents/prompt_builder.py,sha256=UuQNnvjrhzd3_NVnvHlCs-NRNRMo4jsMePgZeIxmzSY,5894
18
17
  grasp_agents/run_context.py,sha256=ikakNK1khm0UBEIPETB508BL0IlOKbOUPuq0FZ-iQHQ,942
19
- grasp_agents/runner.py,sha256=nZXK5OuM7QbLyzNA-rfXD0YDtdftTK5v2cCpeujhe2k,4479
18
+ grasp_agents/runner.py,sha256=Gc4xQ9EQWbIHPaoe4KQsFkHhSnJK3xNPIGxHsYLI3aY,5147
20
19
  grasp_agents/usage_tracker.py,sha256=ZQfVUUpG0C89hyPWT_JgXnjQOxoYmumcQ9t-aCfcMo8,3561
21
20
  grasp_agents/utils.py,sha256=qKmGBwrQHw1-BgqRLuGTPKGs3J_zbrpk3nxnP1iZBiQ,6152
22
21
  grasp_agents/litellm/__init__.py,sha256=wD8RZBYokFDfbS9Cs7nO_zKb3w7RIVwEGj7g2D5CJH0,4510
@@ -33,24 +32,27 @@ grasp_agents/openai/converters.py,sha256=CXHF2GehEHLEzjL45HywZ_1qaB3N29-lbac5oBD
33
32
  grasp_agents/openai/message_converters.py,sha256=fhSN81uK51EGbLyM2-f0MvPX_UBrMy7SF3JQPo-dkXg,4686
34
33
  grasp_agents/openai/openai_llm.py,sha256=uJbbCytqpv8OCncKdzpiUdkVh3mJWgo95Y9Xetk_Ptg,10556
35
34
  grasp_agents/openai/tool_converters.py,sha256=IotZvpe3xMQcBfcjUTfAsn4LtZljj3zkU9bfpcoiqPw,1177
35
+ grasp_agents/processors/base_processor.py,sha256=j2_QY6HUjckdxfsf7yAF0xRDp_V-DNDb7hIRMRKUyWw,10685
36
+ grasp_agents/processors/parallel_processor.py,sha256=4NH2gfGgUheZWQGKn3NEMp0uQ0kOeJRZ3Ja0a7qmqpg,7863
37
+ grasp_agents/processors/processor.py,sha256=v7Bf6CGVsjb43XuOtTMuev9UedMy_lBTGifzzCZwh4Q,5157
36
38
  grasp_agents/rate_limiting/__init__.py,sha256=KRgtF_E7R3YfA2cpYcFcZ7wycV0pWVJ0xRQC7YhiIEQ,158
37
39
  grasp_agents/rate_limiting/rate_limiter_chunked.py,sha256=BPgkUXvhmZhTpZs2T6uujNFuxH_kYHiISuf6_-eNhUc,5544
38
40
  grasp_agents/rate_limiting/types.py,sha256=PbnNhEAcYedQdIpPJWud8HUVcxa_xZS2RDZu4c5jr40,1003
39
41
  grasp_agents/rate_limiting/utils.py,sha256=oEDWDNHYMUdxOOG49PlAJochkZq8nnVBCo6JxPc1iSo,2007
40
42
  grasp_agents/typing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
43
  grasp_agents/typing/completion.py,sha256=PHJ01m7WI2KYQL8w7W2ti6hMsKEZnzYGaxbNcBCc_IE,2782
42
- grasp_agents/typing/completion_chunk.py,sha256=t6PvkDWQxRN5xA4efBdeou46RifMFodBmZc45Sx7qxQ,7610
44
+ grasp_agents/typing/completion_chunk.py,sha256=eiOcpyMrH4Ws2XnY3_jj2_g396MqA3zV3lHygHfXt4o,17883
43
45
  grasp_agents/typing/content.py,sha256=XFmLpNWkGhkw5JujO6UsYwhzTHkU67PfhzaXH2waLcQ,3659
44
46
  grasp_agents/typing/converters.py,sha256=kHlocHQS8QnduZOzNPbj3aRD8JpvJd53oudYqWdOxKE,2978
45
- grasp_agents/typing/events.py,sha256=1n6EVS8vU0RLlQHMHUjiV5i4PYLovT7RcOmpcx0ztlc,5256
47
+ grasp_agents/typing/events.py,sha256=vFq6qRGofY8NuxOG9ZIN2_CnhAqsAodYLD4b4KtAq2U,12620
46
48
  grasp_agents/typing/io.py,sha256=MGEoUjAwKH1AHYglFkKNpHiielw-NFf13Epg3B4Q7Iw,139
47
49
  grasp_agents/typing/message.py,sha256=o7bN84AgrC5Fm3Wx20gqL9ArAMcEtYvnHnXbb04ngCs,3224
48
50
  grasp_agents/typing/tool.py,sha256=4N-k_GvHVPAFyVyEq7z_LYKkA24iQlGoVYiWCzGTgT4,1786
49
51
  grasp_agents/workflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
- grasp_agents/workflow/looped_workflow.py,sha256=J-mdy1gxsMUC622j8W-_fDX3oAyKHg9TTzCXEksMS-Q,6311
51
- grasp_agents/workflow/sequential_workflow.py,sha256=7xBl6YtH97y6jSv6eAHtSIeKjoqiUWKu63C-gKp6Eus,3295
52
- grasp_agents/workflow/workflow_processor.py,sha256=rtW67EBXVoqZTfjLWHz2CyixIu2RdqLxLkFtyI1N49s,3277
53
- grasp_agents-0.5.5.dist-info/METADATA,sha256=uV2MT_3IKkAl-iOqB1aSa9GflFle77n7UjrinyIHQZ8,6865
54
- grasp_agents-0.5.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
55
- grasp_agents-0.5.5.dist-info/licenses/LICENSE.md,sha256=-nNNdWqGB8gJ2O-peFQ2Irshv5tW5pHKyTcYkwvH7CE,1201
56
- grasp_agents-0.5.5.dist-info/RECORD,,
52
+ grasp_agents/workflow/looped_workflow.py,sha256=WHp9O3Za2sBVfY_BLOdvPvtY20XsjZQaWSO2-oAFvOY,6806
53
+ grasp_agents/workflow/sequential_workflow.py,sha256=e3BIWzy_2novmEWNwIteyMbrzvl1-evHrTBE3r3SpU8,3648
54
+ grasp_agents/workflow/workflow_processor.py,sha256=yrxqAGfznmdkbP5zScKKJguxATfU4ObmA6BDR7YCBNU,3549
55
+ grasp_agents-0.5.8.dist-info/METADATA,sha256=0LFzAa3UIg87-9jv2oCAbh-bPSnt0fELxIDWHmgbJzg,6865
56
+ grasp_agents-0.5.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
+ grasp_agents-0.5.8.dist-info/licenses/LICENSE.md,sha256=-nNNdWqGB8gJ2O-peFQ2Irshv5tW5pHKyTcYkwvH7CE,1201
58
+ grasp_agents-0.5.8.dist-info/RECORD,,