camel-ai 0.2.67__py3-none-any.whl → 0.2.68__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.

Potentially problematic release.


This version of camel-ai might be problematic. Click here for more details.

@@ -13,9 +13,10 @@
13
13
  # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  from __future__ import annotations
15
15
 
16
+ import asyncio
16
17
  import logging
17
18
  from abc import ABC, abstractmethod
18
- from typing import List, Optional
19
+ from typing import List, Optional, Set
19
20
 
20
21
  from colorama import Fore
21
22
 
@@ -35,14 +36,19 @@ class Worker(BaseNode, ABC):
35
36
  description (str): Description of the node.
36
37
  node_id (Optional[str]): ID of the node. If not provided, it will
37
38
  be generated automatically. (default: :obj:`None`)
39
+ max_concurrent_tasks (int): Maximum number of tasks this worker can
40
+ process concurrently. (default: :obj:`10`)
38
41
  """
39
42
 
40
43
  def __init__(
41
44
  self,
42
45
  description: str,
43
46
  node_id: Optional[str] = None,
47
+ max_concurrent_tasks: int = 10,
44
48
  ) -> None:
45
49
  super().__init__(description, node_id=node_id)
50
+ self.max_concurrent_tasks = max_concurrent_tasks
51
+ self._active_task_ids: Set[str] = set()
46
52
 
47
53
  def __repr__(self):
48
54
  return f"Worker node {self.node_id} ({self.description})"
@@ -60,7 +66,7 @@ class Worker(BaseNode, ABC):
60
66
  pass
61
67
 
62
68
  async def _get_assigned_task(self) -> Task:
63
- r"""Get the task assigned to this node from the channel."""
69
+ r"""Get a task assigned to this node from the channel."""
64
70
  return await self._channel.get_assigned_task_by_assignee(self.node_id)
65
71
 
66
72
  @staticmethod
@@ -77,20 +83,10 @@ class Worker(BaseNode, ABC):
77
83
  def set_channel(self, channel: TaskChannel):
78
84
  self._channel = channel
79
85
 
80
- @check_if_running(False)
81
- async def _listen_to_channel(self):
82
- """Continuously listen to the channel, process the task that are
83
- assigned to this node, and update the result and status of the task.
84
-
85
- This method should be run in an event loop, as it will run
86
- indefinitely.
87
- """
88
- self._running = True
89
- logger.info(f"{self} started.")
90
-
91
- while True:
92
- # Get the earliest task assigned to this node
93
- task = await self._get_assigned_task()
86
+ async def _process_single_task(self, task: Task) -> None:
87
+ r"""Process a single task and handle its completion/failure."""
88
+ try:
89
+ self._active_task_ids.add(task.id)
94
90
  print(
95
91
  f"{Fore.YELLOW}{self} get task {task.id}: {task.content}"
96
92
  f"{Fore.RESET}"
@@ -109,6 +105,92 @@ class Worker(BaseNode, ABC):
109
105
  task.set_state(task_state)
110
106
 
111
107
  await self._channel.return_task(task.id)
108
+ except Exception as e:
109
+ logger.error(f"Error processing task {task.id}: {e}")
110
+ task.set_state(TaskState.FAILED)
111
+ await self._channel.return_task(task.id)
112
+ finally:
113
+ self._active_task_ids.discard(task.id)
114
+
115
+ @check_if_running(False)
116
+ async def _listen_to_channel(self):
117
+ r"""Continuously listen to the channel, process tasks that are
118
+ assigned to this node concurrently up to max_concurrent_tasks limit.
119
+
120
+ This method supports parallel task execution when multiple tasks
121
+ are assigned to the same worker.
122
+ """
123
+ self._running = True
124
+ logger.info(
125
+ f"{self} started with max {self.max_concurrent_tasks} "
126
+ f"concurrent tasks."
127
+ )
128
+
129
+ # Keep track of running task coroutines
130
+ running_tasks: Set[asyncio.Task] = set()
131
+
132
+ while self._running:
133
+ try:
134
+ # Clean up completed tasks
135
+ completed_tasks = [t for t in running_tasks if t.done()]
136
+ for completed_task in completed_tasks:
137
+ running_tasks.remove(completed_task)
138
+ # Check for exceptions in completed tasks
139
+ try:
140
+ await completed_task
141
+ except Exception as e:
142
+ logger.error(f"Task processing failed: {e}")
143
+
144
+ # Check if we can accept more tasks
145
+ if len(running_tasks) < self.max_concurrent_tasks:
146
+ try:
147
+ # Try to get a new task (with short timeout to avoid
148
+ # blocking)
149
+ task = await asyncio.wait_for(
150
+ self._get_assigned_task(), timeout=1.0
151
+ )
152
+
153
+ # Create and start processing task
154
+ task_coroutine = asyncio.create_task(
155
+ self._process_single_task(task)
156
+ )
157
+ running_tasks.add(task_coroutine)
158
+
159
+ except asyncio.TimeoutError:
160
+ # No tasks available, continue loop
161
+ if not running_tasks:
162
+ # No tasks running and none available, short sleep
163
+ await asyncio.sleep(0.1)
164
+ continue
165
+ else:
166
+ # At max capacity, wait for at least one task to complete
167
+ if running_tasks:
168
+ done, running_tasks = await asyncio.wait(
169
+ running_tasks, return_when=asyncio.FIRST_COMPLETED
170
+ )
171
+ # Process completed tasks
172
+ for completed_task in done:
173
+ try:
174
+ await completed_task
175
+ except Exception as e:
176
+ logger.error(f"Task processing failed: {e}")
177
+
178
+ except Exception as e:
179
+ logger.error(
180
+ f"Error in worker {self.node_id} listen loop: {e}"
181
+ )
182
+ await asyncio.sleep(0.1)
183
+ continue
184
+
185
+ # Wait for all remaining tasks to complete when stopping
186
+ if running_tasks:
187
+ logger.info(
188
+ f"{self} stopping, waiting for {len(running_tasks)} "
189
+ f"tasks to complete..."
190
+ )
191
+ await asyncio.gather(*running_tasks, return_exceptions=True)
192
+
193
+ logger.info(f"{self} stopped.")
112
194
 
113
195
  @check_if_running(False)
114
196
  async def start(self):
@@ -274,10 +274,13 @@ class Workforce(BaseNode):
274
274
  "of agents. This ensures efficient execution by minimizing "
275
275
  "context switching between agents.",
276
276
  )
277
- _kwargs = dict(task_agent_kwargs or {})
277
+ _task_agent_kwargs = dict(task_agent_kwargs or {})
278
278
  extra_tools = TaskPlanningToolkit().get_tools()
279
- _kwargs["tools"] = [*_kwargs.get("tools", []), *extra_tools]
280
- self.task_agent = ChatAgent(task_sys_msg, **_kwargs)
279
+ _task_agent_kwargs["tools"] = [
280
+ *_task_agent_kwargs.get("tools", []),
281
+ *extra_tools,
282
+ ]
283
+ self.task_agent = ChatAgent(task_sys_msg, **_task_agent_kwargs)
281
284
 
282
285
  def __repr__(self):
283
286
  return (
@@ -823,9 +826,17 @@ class Workforce(BaseNode):
823
826
 
824
827
  # Check if we're already in an event loop
825
828
  try:
826
- asyncio.get_running_loop()
829
+ current_loop = asyncio.get_running_loop()
830
+ # Store the current loop for potential reuse by async tools
831
+ self._loop = current_loop
827
832
 
828
- # If we're in an event loop, we need to run in a thread
833
+ logger.info(
834
+ "Running in active event loop context. "
835
+ "Consider using process_task_async() directly for better "
836
+ "async tool compatibility."
837
+ )
838
+
839
+ # Create a new thread with a fresh event loop
829
840
  def run_in_thread():
830
841
  # Create new event loop for this thread
831
842
  new_loop = asyncio.new_event_loop()
@@ -836,6 +847,8 @@ class Workforce(BaseNode):
836
847
  )
837
848
  finally:
838
849
  new_loop.close()
850
+ # Restore original loop reference
851
+ self._loop = current_loop
839
852
 
840
853
  with concurrent.futures.ThreadPoolExecutor() as executor:
841
854
  future = executor.submit(run_in_thread)
@@ -982,18 +995,25 @@ class Workforce(BaseNode):
982
995
 
983
996
  @check_if_running(False)
984
997
  def add_single_agent_worker(
985
- self, description: str, worker: ChatAgent
998
+ self,
999
+ description: str,
1000
+ worker: ChatAgent,
1001
+ max_concurrent_tasks: int = 10,
986
1002
  ) -> Workforce:
987
1003
  r"""Add a worker node to the workforce that uses a single agent.
988
1004
 
989
1005
  Args:
990
1006
  description (str): Description of the worker node.
991
1007
  worker (ChatAgent): The agent to be added.
1008
+ max_concurrent_tasks (int): Maximum number of tasks this worker can
1009
+ process concurrently. (default: :obj:`10`)
992
1010
 
993
1011
  Returns:
994
1012
  Workforce: The workforce node itself.
995
1013
  """
996
- worker_node = SingleAgentWorker(description, worker)
1014
+ worker_node = SingleAgentWorker(
1015
+ description, worker, max_concurrent_tasks
1016
+ )
997
1017
  self._children.append(worker_node)
998
1018
  if self.metrics_logger:
999
1019
  self.metrics_logger.log_worker_created(
@@ -1222,6 +1242,7 @@ class Workforce(BaseNode):
1222
1242
  new_node = SingleAgentWorker(
1223
1243
  description=new_node_conf.description,
1224
1244
  worker=new_agent,
1245
+ max_concurrent_tasks=10, # TODO: make this configurable
1225
1246
  )
1226
1247
  new_node.set_channel(self._channel)
1227
1248
 
@@ -1273,14 +1294,17 @@ class Workforce(BaseNode):
1273
1294
  # Add timeout to prevent indefinite waiting
1274
1295
  return await asyncio.wait_for(
1275
1296
  self._channel.get_returned_task_by_publisher(self.node_id),
1276
- timeout=300.0, # 5 minute timeout
1297
+ timeout=180.0, # 3 minute timeout
1277
1298
  )
1278
1299
  except asyncio.TimeoutError:
1279
1300
  logger.warning(
1280
1301
  f"Timeout waiting for returned task in "
1281
- f"workforce {self.node_id}"
1302
+ f"workforce {self.node_id}. "
1303
+ f"This may indicate an issue with async tool execution. "
1304
+ f"Current pending tasks: {len(self._pending_tasks)}, "
1305
+ f"In-flight tasks: {self._in_flight_tasks}"
1282
1306
  )
1283
- raise ValueError("Timeout waiting for task to be returned")
1307
+ raise
1284
1308
 
1285
1309
  async def _post_ready_tasks(self) -> None:
1286
1310
  r"""Checks for unassigned tasks, assigns them, and then posts any
@@ -1448,25 +1472,32 @@ class Workforce(BaseNode):
1448
1472
  'processing_time_seconds'
1449
1473
  ]
1450
1474
 
1451
- # Get token usage from task additional info
1475
+ # Get token usage from task additional info (preferred - actual
1476
+ # usage)
1452
1477
  if (
1453
1478
  task.additional_info is not None
1454
1479
  and 'token_usage' in task.additional_info
1455
1480
  ):
1456
1481
  token_usage = task.additional_info['token_usage']
1457
-
1458
- # Try to get token usage from SingleAgentWorker memory if available
1459
- assignee_node = next(
1460
- (
1461
- child
1462
- for child in self._children
1463
- if child.node_id == worker_id
1464
- ),
1465
- None,
1466
- )
1467
- if isinstance(assignee_node, SingleAgentWorker):
1468
- _, total_tokens = assignee_node.worker.memory.get_context()
1469
- token_usage = {'total_tokens': total_tokens}
1482
+ else:
1483
+ # Fallback: Try to get token usage from SingleAgentWorker
1484
+ # memory
1485
+ assignee_node = next(
1486
+ (
1487
+ child
1488
+ for child in self._children
1489
+ if child.node_id == worker_id
1490
+ ),
1491
+ None,
1492
+ )
1493
+ if isinstance(assignee_node, SingleAgentWorker):
1494
+ try:
1495
+ _, total_tokens = (
1496
+ assignee_node.worker.memory.get_context()
1497
+ )
1498
+ token_usage = {'total_tokens': total_tokens}
1499
+ except Exception:
1500
+ token_usage = None
1470
1501
 
1471
1502
  # Log the completed task
1472
1503
  self.metrics_logger.log_task_completed(
@@ -1764,17 +1795,20 @@ class Workforce(BaseNode):
1764
1795
  if isinstance(child, SingleAgentWorker):
1765
1796
  cloned_worker = child.worker.clone(with_memory)
1766
1797
  new_instance.add_single_agent_worker(
1767
- child.description, cloned_worker
1798
+ child.description,
1799
+ cloned_worker,
1800
+ child.max_concurrent_tasks,
1768
1801
  )
1769
1802
  elif isinstance(child, RolePlayingWorker):
1770
1803
  new_instance.add_role_playing_worker(
1771
1804
  child.description,
1772
1805
  child.assistant_role_name,
1773
1806
  child.user_role_name,
1774
- child.chat_turn_limit,
1775
1807
  child.assistant_agent_kwargs,
1776
1808
  child.user_agent_kwargs,
1777
1809
  child.summarize_agent_kwargs,
1810
+ child.chat_turn_limit,
1811
+ child.max_concurrent_tasks,
1778
1812
  )
1779
1813
  elif isinstance(child, Workforce):
1780
1814
  new_instance.add_workforce(child.clone(with_memory))
@@ -1868,7 +1902,7 @@ class Workforce(BaseNode):
1868
1902
  )
1869
1903
 
1870
1904
  try:
1871
- result_task = await workforce_instance.process_task(task)
1905
+ result_task = await workforce_instance.process_task_async(task)
1872
1906
  return {
1873
1907
  "status": "success",
1874
1908
  "task_id": result_task.id,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: camel-ai
3
- Version: 0.2.67
3
+ Version: 0.2.68
4
4
  Summary: Communicative Agents for AI Society Study
5
5
  Project-URL: Homepage, https://www.camel-ai.org/
6
6
  Project-URL: Repository, https://github.com/camel-ai/camel
@@ -109,6 +109,7 @@ Requires-Dist: rank-bm25<0.3,>=0.2.2; extra == 'all'
109
109
  Requires-Dist: redis<6,>=5.0.6; extra == 'all'
110
110
  Requires-Dist: reka-api<4,>=3.0.8; extra == 'all'
111
111
  Requires-Dist: requests-oauthlib<2,>=1.3.1; extra == 'all'
112
+ Requires-Dist: rlcard<1.3.0,>=1.0.0; extra == 'all'
112
113
  Requires-Dist: rouge<2,>=1.0.1; extra == 'all'
113
114
  Requires-Dist: scenedetect>=0.6.5.2; extra == 'all'
114
115
  Requires-Dist: scholarly[tor]==1.7.11; extra == 'all'
@@ -1,4 +1,4 @@
1
- camel/__init__.py,sha256=TCwqjg1v17Gr_PGr5HJ87K5VPxlP1O7yl8fxz4lHKeg,899
1
+ camel/__init__.py,sha256=rJXL52mQmrprC-MGOi-1lgeaR3Jr3lcBxI4TSHnu7Gw,899
2
2
  camel/generators.py,sha256=JRqj9_m1PF4qT6UtybzTQ-KBT9MJQt18OAAYvQ_fr2o,13844
3
3
  camel/human.py,sha256=Xg8x1cS5KK4bQ1SDByiHZnzsRpvRP-KZViNvmu38xo4,5475
4
4
  camel/logger.py,sha256=rZVeOVYuQ9RYJ5Tqyv0usqy0g4zaVEq4qSfZ9nd2640,5755
@@ -121,9 +121,10 @@ camel/embeddings/openai_embedding.py,sha256=zix0O8KdbiVarol4hktKi-0I060epsnj8qAE
121
121
  camel/embeddings/sentence_transformers_embeddings.py,sha256=q9jR_C5y58R-35WGaluT5q5gOwVRWz3-uo-Ivisbsj4,2732
122
122
  camel/embeddings/together_embedding.py,sha256=Nl7uyk3pxyI4-l147LEkc1zj5O-H17RbJtb8pYb2K7Q,4765
123
123
  camel/embeddings/vlm_embedding.py,sha256=ydmU1n-3ecqkqsRH5crvLfbRlfNcWnpHBuE6B_5_HuQ,5708
124
- camel/environments/__init__.py,sha256=fwk74TJO5OaOhL5Pmiz6s6h77B_-DGav5m_HbfS1oUQ,1053
124
+ camel/environments/__init__.py,sha256=VXNFb4jGImUYBVWR_G6D-_fUd4n7yZw_t_BVlZNOUxg,1276
125
125
  camel/environments/models.py,sha256=jVcCyU7xObKoWPnkshmPqyyKi3AOiMVVtUZA-tWEYUU,4194
126
126
  camel/environments/multi_step.py,sha256=HPIH2W-iWsmtDLeN1gjxo7LoAnMQQZzdmfjhmRoBAxg,8534
127
+ camel/environments/rlcards_env.py,sha256=OclnrJf7HgjuGUgYP6lISBmzTyG_gThHgPKwTUrG9y8,29861
127
128
  camel/environments/single_step.py,sha256=zrAXLOBGGKQFnGENasUnmFO_T-rjppGPK2CRBLGu7aQ,23019
128
129
  camel/environments/tic_tac_toe.py,sha256=axRDN9yUVH8PzACkD6zenWiQKFDaupGsQ7NmSvbJCIc,19080
129
130
  camel/extractors/__init__.py,sha256=lgtDl8zWvN826fJVKqRv05w556YZ-EdrHwdzKphywgA,1097
@@ -137,13 +138,13 @@ camel/interpreters/internal_python_interpreter.py,sha256=TU4ITQTsR8TXsklN11xWEcC
137
138
  camel/interpreters/interpreter_error.py,sha256=uEhcmHmmcajt5C9PLeHs21h1fE6cmyt23tCAGie1kTA,880
138
139
  camel/interpreters/ipython_interpreter.py,sha256=V-Z_nIwaKmmivv_gD6nwdzmqfBUW4IoN4vZ0IOaUTZU,6582
139
140
  camel/interpreters/subprocess_interpreter.py,sha256=DMLJIlTiHk0QA_pH5CXESHdJk-5olKo3aUh0KNECqJI,17759
140
- camel/interpreters/docker/Dockerfile,sha256=SbbuKS_Rwv9JTKRlVOlsO4QuPTFA9zbsN5CZp9KeUMk,1777
141
+ camel/interpreters/docker/Dockerfile,sha256=n3oXzcJhELuN2oYzOyEItICga6RqtwRyjPtS-Qes-F4,1625
141
142
  camel/loaders/__init__.py,sha256=NfXLr0gQUhfyMeB5KpU9EUvhhFLp3X5KNinDs2WO0Q0,1548
142
143
  camel/loaders/apify_reader.py,sha256=oaVjKyNhJhG-hTuIwrpZ2hsB4XTL0M-kUksgSL2R0ck,7952
143
144
  camel/loaders/base_io.py,sha256=zsbdBPHgSPFyQrtiUgAsHvy39QHWUObRYNaVvr-pPk0,10190
144
145
  camel/loaders/chunkr_reader.py,sha256=LC2zZvq2BiT1j2ukWPCttgo8a3RlOhFDfijYsEEQ_9I,6452
145
146
  camel/loaders/crawl4ai_reader.py,sha256=ugfGMpWhfLnKf_XEOyDGI2ekpViDnSATg9eSxHyWX7M,7653
146
- camel/loaders/firecrawl_reader.py,sha256=wCPHEWbfLv_q2x9MdTiSvJ_LDqUPO88lzPf0mmOBsME,5667
147
+ camel/loaders/firecrawl_reader.py,sha256=whHBhixQkCtJZYhhr7TgU7aMcbnfDR8LXx5If5Ci_kg,5687
147
148
  camel/loaders/jina_url_reader.py,sha256=dL9J5JlsFKEhi4gU_vYIxKvvf_RJ4LY9gG6i8P8JpcA,3601
148
149
  camel/loaders/markitdown.py,sha256=2tc9Tf2pMJFkFzJwTAge-2kdmgRBBAV3sXHjcbo9AVE,7058
149
150
  camel/loaders/mineru_extractor.py,sha256=nKa5n7f3ergv1TURcbXZJP5mQpnSCIFdlWrxWn4hBz8,9070
@@ -157,9 +158,9 @@ camel/memories/base.py,sha256=3BGuExfwwkbkVpxw1uYms8O37F-PD8ArcmYnFKYUcI4,5652
157
158
  camel/memories/records.py,sha256=NoiwDuwnKYObhrXPHSRGw8xdxAqyZDDiarOAN6-d17I,4451
158
159
  camel/memories/blocks/__init__.py,sha256=ci7_WU11222cNd1Zkv-a0z5E2ux95NMjAYm_cDzF0pE,854
159
160
  camel/memories/blocks/chat_history_block.py,sha256=ZAQZ9NqbwZ_w8XebQ3vVPSTA2sfUNooOfI4oNrGxdDo,6679
160
- camel/memories/blocks/vectordb_block.py,sha256=lf0ipY4cJMB--tQDvpInqsmHZCn7sD1pkmjC70vTtn4,3941
161
+ camel/memories/blocks/vectordb_block.py,sha256=r0mRGLV14YUr8aruLdylBjKdSm11oprsiNEWl0EJJhQ,4166
161
162
  camel/memories/context_creators/__init__.py,sha256=pqzkBM2ro5JZD7RhWg05TjinphhCq0QTIqBJlIL1sJ0,800
162
- camel/memories/context_creators/score_based.py,sha256=b35GNjioYgFueXIFr-Yk2NlJHLlaOvLj3Yh_b_qRrrA,10313
163
+ camel/memories/context_creators/score_based.py,sha256=i5nWuXe2WoX496yblq7V8bxzNLS7TOHNKRHeYiWdpy0,14536
163
164
  camel/messages/__init__.py,sha256=Px-gTFp2Kcgbeb2sZQ_f4tqjoLHE-QEOiMHIMfPrvTw,1949
164
165
  camel/messages/base.py,sha256=4tW240FyYWBoNhvfFClCjCGoiHiAdhHqMqsbg2_nX44,19760
165
166
  camel/messages/func_message.py,sha256=2fv35Ruyhhf-wmqtCPiqC-ZujnR-hJH-rEoSgPTKdA8,5959
@@ -173,7 +174,7 @@ camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py,sha256=-9
173
174
  camel/models/__init__.py,sha256=leNjmPCEeO8jZAvY8op1XeFPMuSnF349buZRGCE3aBU,3385
174
175
  camel/models/_utils.py,sha256=hob1ehnS5xZitMCdYToHVgaTB55JnaP4_DSWnTEfVsg,2045
175
176
  camel/models/aiml_model.py,sha256=tQeJcS0RlRwMK-sapFVUSIr-r5cJyCt0UNphzD8O2oI,4070
176
- camel/models/anthropic_model.py,sha256=BsMg_GQhrs0PUU5OR5IV8r3hLRoQfGty1uiIUtZEC5Y,4648
177
+ camel/models/anthropic_model.py,sha256=m5J1-RabKyYf-2ejA7A8r4qbRLpS9oRtHWapzHs0BnM,8878
177
178
  camel/models/aws_bedrock_model.py,sha256=bcQBiHVdVuJXyPEkSdymQlGx2zHIVj5d4ouFuF8CSY0,4670
178
179
  camel/models/azure_openai_model.py,sha256=FGQ6Cls-a7uzStsgPmBPffgm7TgTEzN3R2SWlAmiBeY,15164
179
180
  camel/models/base_audio_model.py,sha256=_VUWh1L3rh8mldNvM5R6jBOKtvmTeBKJyRxAdPJmPlY,3324
@@ -270,13 +271,13 @@ camel/societies/babyagi_playing.py,sha256=KbTdpHfZ2V8AripVck0bNTOyF-RSaMPCRARz3D
270
271
  camel/societies/role_playing.py,sha256=1TsQbGYmN91BeQ0DGM5PpSJ9TMbn1F3maJNuv4fQ5zI,31749
271
272
  camel/societies/workforce/__init__.py,sha256=bkTI-PE-MSK9AQ2V2gR6cR2WY-R7Jqy_NmXRtAoqo8o,920
272
273
  camel/societies/workforce/base.py,sha256=z2DmbTP5LL5-aCAAqglznQqCLfPmnyM5zD3w6jjtsb8,2175
273
- camel/societies/workforce/prompts.py,sha256=kjUkfH6JAORt_zXyO_rH-isdQDLc6bQhGvZreCSs7pA,8710
274
+ camel/societies/workforce/prompts.py,sha256=qXNF4l08LJBMUasLHAjocWQTlxpUrqC7h5_YJSneOTw,11387
274
275
  camel/societies/workforce/role_playing_worker.py,sha256=pWPCtkLx-xbc4SWyZBfMwvWr-R5ZpANhN7g6PDuH8Po,7615
275
- camel/societies/workforce/single_agent_worker.py,sha256=0p69HrMtqIkuBUL8QOJF4pYYxbxGrZGq8FuQy-qsOdI,4675
276
- camel/societies/workforce/task_channel.py,sha256=fj2Srkgzk8CKjNH8dkvbKSJZLPlV3wJupGPiWshVF-o,6998
276
+ camel/societies/workforce/single_agent_worker.py,sha256=dnO0pZlqE37pTQyp7RB8krjwdtdSe02ChsmKwhB8HLc,5924
277
+ camel/societies/workforce/task_channel.py,sha256=uqQQI67Tr4awbR4bjZXdx8_4gL6-ON5IjQk_H_ryqT4,7431
277
278
  camel/societies/workforce/utils.py,sha256=klqTSjUnIUaFo_AnFMmozNNnwclxx_RicfujDspc0l0,5861
278
- camel/societies/workforce/worker.py,sha256=xdUWBW8Qifhhrh4jdK5S_q4LiSEL4NxKuDZN1fgQESA,4135
279
- camel/societies/workforce/workforce.py,sha256=3iAsAZNOUeSuLq3JGJZbDnAEtbE2tNJFBbJneZUpgfI,86296
279
+ camel/societies/workforce/worker.py,sha256=D_q1rx0GPSBnue110E-s25GFrJZRGpYX80R7B6Da7E4,7679
280
+ camel/societies/workforce/workforce.py,sha256=Vb37zL8aPWsyJgQNNZgNK43r6gcvNvc5HFihJqQbTSc,87682
280
281
  camel/societies/workforce/workforce_logger.py,sha256=2xGMMYQPphC5WlPbgWWp9SEY2hGpP-GkhgsNC19irns,24237
281
282
  camel/storages/__init__.py,sha256=bFpvvAS2QyZoIr-tnwhMWsZRL411kIRq6IMUHcI7KHs,1989
282
283
  camel/storages/graph_storages/__init__.py,sha256=G29BNn651C0WTOpjCl4QnVM-4B9tcNh8DdmsCiONH8Y,948
@@ -423,7 +424,7 @@ camel/verifiers/math_verifier.py,sha256=tA1D4S0sm8nsWISevxSN0hvSVtIUpqmJhzqfbuMo
423
424
  camel/verifiers/models.py,sha256=GdxYPr7UxNrR1577yW4kyroRcLGfd-H1GXgv8potDWU,2471
424
425
  camel/verifiers/physics_verifier.py,sha256=c1grrRddcrVN7szkxhv2QirwY9viIRSITWeWFF5HmLs,30187
425
426
  camel/verifiers/python_verifier.py,sha256=ogTz77wODfEcDN4tMVtiSkRQyoiZbHPY2fKybn59lHw,20558
426
- camel_ai-0.2.67.dist-info/METADATA,sha256=eVXDS9Q3bIEBBfcPcumWsQyv3FLifHMYHcQo5ptYlT0,44783
427
- camel_ai-0.2.67.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
428
- camel_ai-0.2.67.dist-info/licenses/LICENSE,sha256=id0nB2my5kG0xXeimIu5zZrbHLS6EQvxvkKkzIHaT2k,11343
429
- camel_ai-0.2.67.dist-info/RECORD,,
427
+ camel_ai-0.2.68.dist-info/METADATA,sha256=Zdf5BDhWfpTnJN_pp5XkOTnfhS2uuuGEUOointBL-W0,44835
428
+ camel_ai-0.2.68.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
429
+ camel_ai-0.2.68.dist-info/licenses/LICENSE,sha256=id0nB2my5kG0xXeimIu5zZrbHLS6EQvxvkKkzIHaT2k,11343
430
+ camel_ai-0.2.68.dist-info/RECORD,,