beswarm 0.2.25__py3-none-any.whl → 0.2.27__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.
beswarm/aient/setup.py CHANGED
@@ -4,7 +4,7 @@ from setuptools import setup, find_packages
4
4
 
5
5
  setup(
6
6
  name="aient",
7
- version="1.1.46",
7
+ version="1.1.47",
8
8
  description="Aient: The Awakening of Agent.",
9
9
  long_description=Path.open(Path("README.md"), encoding="utf-8").read(),
10
10
  long_description_content_type="text/markdown",
@@ -256,8 +256,6 @@ async def get_gemini_payload(request, engine, provider, api_key=None):
256
256
  elif val > 24576:
257
257
  val = 24576
258
258
  payload["generationConfig"]["thinkingConfig"]["thinkingBudget"] = val
259
- if val == 0:
260
- payload["generationConfig"].pop("thinkingConfig", None)
261
259
  except ValueError:
262
260
  # 如果转换为整数失败,忽略思考预算设置
263
261
  pass
@@ -554,8 +552,6 @@ async def get_vertex_gemini_payload(request, engine, provider, api_key=None):
554
552
  elif val > 24576:
555
553
  val = 24576
556
554
  payload["generationConfig"]["thinkingConfig"]["thinkingBudget"] = val
557
- if val == 0:
558
- payload["generationConfig"].pop("thinkingConfig", None)
559
555
  except ValueError:
560
556
  # 如果转换为整数失败,忽略思考预算设置
561
557
  pass
@@ -141,7 +141,13 @@ async def fetch_gemini_response_stream(client, url, headers, payload, model):
141
141
  sse_string = await generate_sse_response(timestamp, model, content=None, tools_id="chatcmpl-9inWv0yEtgn873CxMBzHeCeiHctTV", function_call_name=None, function_call_content=function_full_response)
142
142
  yield sse_string
143
143
 
144
- if cache_buffer == "[]":
144
+ cache_buffer_json = {}
145
+ try:
146
+ cache_buffer_json = json.loads(cache_buffer)
147
+ except json.JSONDecodeError:
148
+ cache_buffer_json = {}
149
+
150
+ if cache_buffer == "[]" or safe_get(cache_buffer_json, 0, "promptFeedback", "blockReason") == "PROHIBITED_CONTENT":
145
151
  sse_string = await generate_sse_response(timestamp, model, stop="PROHIBITED_CONTENT")
146
152
  yield sse_string
147
153
  else:
@@ -83,7 +83,7 @@ def jina_ai_Web_crawler(url: str, isSearch=False) -> str:
83
83
  from bs4 import BeautifulSoup
84
84
  requests.packages.urllib3.disable_warnings()
85
85
  url = "https://r.jina.ai/" + url
86
- response = requests.get(url, headers=headers, verify=False, timeout=5, stream=True)
86
+ response = requests.get(url, headers=headers, verify=False, timeout=20, stream=True)
87
87
  if response.status_code == 404:
88
88
  print("Page not found:", url)
89
89
  return "抱歉,网页不存在,目前无法访问该网页。@Trash@"
@@ -133,6 +133,7 @@ def get_url_content(url: str) -> str:
133
133
  # print(markdown_content)
134
134
  # print('-----------------------------')
135
135
  jina_content = jina_ai_Web_crawler(url)
136
+ # print(jina_content)
136
137
  # print('-----------------------------')
137
138
 
138
139
  # 定义评分函数
beswarm/tools/__init__.py CHANGED
@@ -1,5 +1,5 @@
1
1
  from .edit_file import edit_file
2
- from .worker import worker, worker_gen, create_task, get_task_result
2
+ from .worker import worker, worker_gen
3
3
  from .screenshot import save_screenshot_to_file
4
4
  from .request_input import request_admin_input
5
5
 
@@ -7,6 +7,8 @@ from .search_arxiv import search_arxiv
7
7
  from .repomap import get_code_repo_map
8
8
  from .click import find_and_click_element, scroll_screen
9
9
  from .search_web import search_web
10
+ from .taskmanager import create_task, resume_task, get_all_tasks_status, get_task_result
11
+
10
12
  #显式导入 aient.plugins 中的所需内容
11
13
  from ..aient.src.aient.plugins import (
12
14
  excute_command,
@@ -50,5 +52,7 @@ __all__ = [
50
52
  "set_readonly_path",
51
53
  "request_admin_input",
52
54
  "create_task",
55
+ "resume_task",
56
+ "get_all_tasks_status",
53
57
  "get_task_result",
54
58
  ]
@@ -368,5 +368,6 @@ if __name__ == '__main__':
368
368
  print(results)
369
369
 
370
370
  asyncio.run(main())
371
+ # print(get_url_content("https://www.ces.org.cn/res/ces/2308/69c936072d86b5161d7cca95c30ea832.pdf"))
371
372
 
372
373
  # python -m beswarm.tools.search_web
@@ -1,9 +1,12 @@
1
- import os
1
+ import ast
2
+ import json
2
3
  import uuid
3
4
  import asyncio
4
5
  from enum import Enum
5
6
  from pathlib import Path
6
7
 
8
+ from ..aient.src.aient.plugins import register_tool, registry
9
+
7
10
  class TaskStatus(Enum):
8
11
  """任务状态枚举"""
9
12
  PENDING = "PENDING"
@@ -19,7 +22,49 @@ class TaskManager:
19
22
  def __init__(self):
20
23
  self.tasks = {} # 使用字典来存储任务,key是task_id, value是task对象
21
24
  self.results_queue = asyncio.Queue()
22
- self.root_path = Path(os.getcwd())
25
+ self.root_path = None
26
+ self.tasks_cache = {}
27
+
28
+ def set_root_path(self, root_path):
29
+ if self.root_path:
30
+ return
31
+ self.root_path = Path(root_path)
32
+ self.cache_dir = self.root_path / ".beswarm"
33
+ self.task_cache_file = self.cache_dir / "tasks.json"
34
+ self.task_cache_file.touch(exist_ok=True)
35
+ self.read_tasks_cache()
36
+ self.set_task_cache("root_path", str(self.root_path))
37
+
38
+ def set_task_cache(self, *keys_and_value):
39
+ """
40
+ 设置可嵌套的任务缓存。
41
+ 接受无限个键和一个值,例如 set_task_cache('a', 'b', 'c', value)
42
+ 会转换为 tasks_cache['a']['b']['c'] = value
43
+ """
44
+ if len(keys_and_value) < 2:
45
+ return # 至少需要一个键和一个值
46
+
47
+ keys = keys_and_value[:-1]
48
+ value = keys_and_value[-1]
49
+
50
+ d = self.tasks_cache
51
+ # 遍历到倒数第二个键,确保路径存在
52
+ for key in keys[:-1]:
53
+ d = d.setdefault(key, {})
54
+
55
+ # 在最后一个键上设置值
56
+ d[keys[-1]] = value
57
+ self.save_tasks_cache()
58
+
59
+ def save_tasks_cache(self):
60
+ self.task_cache_file.write_text(json.dumps(self.tasks_cache, ensure_ascii=False, indent=4), encoding="utf-8")
61
+
62
+ def read_tasks_cache(self):
63
+ content = self.task_cache_file.read_text(encoding="utf-8")
64
+ try:
65
+ self.tasks_cache = json.loads(content) if content else {}
66
+ except json.JSONDecodeError:
67
+ raise ValueError("任务缓存文件格式错误")
23
68
 
24
69
  def create_tasks(self, task_coro, tasks_params):
25
70
  """
@@ -37,8 +82,27 @@ class TaskManager:
37
82
  coro = task_coro(**args)
38
83
  task_id = self.create_task(coro)
39
84
  task_ids.append(task_id)
85
+ self.set_task_cache(task_id, "args", args)
86
+ self.set_task_cache(task_id, "status", TaskStatus.RUNNING.value)
40
87
  return task_ids
41
88
 
89
+ def resume_task(self, task_id, task_coro, args):
90
+ """
91
+ 恢复一个任务。
92
+ """
93
+ task = self.tasks_cache.get(task_id)
94
+ if not task:
95
+ return TaskStatus.NOT_FOUND
96
+
97
+ coro = task_coro(**args)
98
+ task_id = self.create_task(coro)
99
+ self.set_task_cache(task_id, "args", args)
100
+ self.set_task_cache(task_id, "status", TaskStatus.RUNNING.value)
101
+ print(f"任务已恢复: ID={task_id}, Name={task_id}")
102
+ print(f"args: {args}")
103
+ print(f"self.tasks_cache: {json.dumps(self.tasks_cache, ensure_ascii=False, indent=4)}")
104
+ return task_id
105
+
42
106
  def create_task(self, coro):
43
107
  """
44
108
  创建并注册一个新任务。
@@ -108,14 +172,19 @@ class TaskManager:
108
172
  self.results_queue.put_nowait(
109
173
  (task_id, TaskStatus.DONE, task.result())
110
174
  )
175
+ self.set_task_cache(task_id, "status", TaskStatus.DONE.value)
176
+ self.set_task_cache(task_id, "result", task.result())
111
177
  except asyncio.CancelledError:
112
178
  self.results_queue.put_nowait(
113
179
  (task_id, TaskStatus.CANCELLED, None)
114
180
  )
181
+ self.set_task_cache(task_id, "status", TaskStatus.CANCELLED.value)
115
182
  except Exception as e:
116
183
  self.results_queue.put_nowait(
117
184
  (task_id, TaskStatus.ERROR, e)
118
185
  )
186
+ self.set_task_cache(task_id, "status", TaskStatus.ERROR.value)
187
+ self.set_task_cache(task_id, "result", str(e))
119
188
 
120
189
  async def get_next_result(self):
121
190
  """
@@ -146,8 +215,78 @@ class TaskManager:
146
215
  # 如果任务ID不存在,则返回-1
147
216
  return -1
148
217
 
149
- def set_root_path(self, root_path):
150
- self.root_path = Path(root_path)
218
+
219
+ task_manager = TaskManager()
220
+
221
+ worker_fun = registry.tools["worker"]
222
+
223
+ @register_tool()
224
+ def create_task(goal, tools, work_dir):
225
+ """
226
+ 启动一个子任务来自动完成指定的任务目标 (`goal`)。
227
+
228
+ 这个子任务接收一个清晰的任务描述、一组可供调用的工具 (`tools`),以及一个工作目录 (`work_dir`)。
229
+ 它会结合可用的工具,自主规划并逐步执行必要的操作,直到最终完成指定的任务目标。
230
+ 核心功能是根据输入的目标,驱动整个任务执行流程。
231
+ 子任务下上文为空,因此需要细致的背景信息。
232
+
233
+ Args:
234
+ goal (str): 需要完成的具体任务目标描述。子任务将围绕此目标进行工作。必须清晰、具体。必须包含背景信息,完成指标等。写清楚什么时候算任务完成,同时交代清楚任务的背景信息,这个背景信息可以是需要读取的文件等一切有助于完成任务的信息。
235
+ tools (list[str]): 一个包含可用工具函数对象的列表。子任务在执行任务时可能会调用这些工具来与环境交互(例如读写文件、执行命令等)。
236
+ work_dir (str): 工作目录的绝对路径。子任务将在此目录上下文中执行操作。子任务的工作目录位置在主任务的工作目录的子目录。
237
+
238
+ Returns:
239
+ str: 当任务成功完成时,返回字符串 "任务已完成"。
240
+ """
241
+ tasks_params = [
242
+ {"goal": goal, "tools": ast.literal_eval(tools), "work_dir": work_dir, "cache_messages": True}
243
+ ]
244
+ task_ids = task_manager.create_tasks(worker_fun, tasks_params)
245
+ return task_ids
246
+
247
+ @register_tool()
248
+ def resume_task(task_id, goal):
249
+ """
250
+ 恢复一个子任务。
251
+ """
252
+ if task_id not in task_manager.tasks_cache:
253
+ return f"任务 {task_id} 不存在"
254
+ tasks_params = task_manager.tasks_cache[task_id]["args"]
255
+ tasks_params["goal"] = goal
256
+ tasks_params["cache_messages"] = True
257
+ task_id = task_manager.resume_task(task_id, worker_fun, tasks_params)
258
+ return f"任务 {task_id} 已恢复"
259
+
260
+ @register_tool()
261
+ def get_all_tasks_status():
262
+ """
263
+ 获取所有任务的状态。
264
+ 子任务状态会持久化到磁盘,因此即使历史记录为空,之前的子任务仍然存在。
265
+
266
+ Returns:
267
+ str: 所有任务的状态。每个任务的id,状态,结果。
268
+ """
269
+ return task_manager.tasks_cache
270
+
271
+ @register_tool()
272
+ async def get_task_result():
273
+ """
274
+ 等待并获取子任务的执行结果。如果需要等待子任务完成,请使用这个工具。一旦有任务完成,会自动获取结果。如果调用时没有任务完成,会等待直到有任务完成。
275
+
276
+ Returns:
277
+ str: 子任务的执行结果。
278
+ """
279
+ task_id, status, result = await task_manager.get_next_result()
280
+
281
+ unfinished_tasks = [task_id for task_id, task in task_manager.tasks_cache.items() if task_id != "root_path" and task.get("status") != "DONE"]
282
+ text = "".join([
283
+ f"Task ID: {task_id}\n",
284
+ f"Status: {status.value}\n",
285
+ f"Result: {result}\n\n",
286
+ f"There are {len(unfinished_tasks)} unfinished tasks, unfinished task ids: {unfinished_tasks}" if unfinished_tasks else "All tasks are finished.",
287
+ ])
288
+
289
+ return text
151
290
 
152
291
  async def main():
153
292
  manager = TaskManager()
beswarm/tools/worker.py CHANGED
@@ -1,7 +1,6 @@
1
1
  import os
2
2
  import re
3
3
  import sys
4
- import ast
5
4
  import copy
6
5
  import json
7
6
  import difflib
@@ -27,50 +26,14 @@ from ..aient.src.aient.plugins import register_tool, get_function_call_list, reg
27
26
  from ..prompt import worker_system_prompt, instruction_system_prompt
28
27
  from ..utils import extract_xml_content, get_current_screen_image_message, replace_xml_content, register_mcp_tools
29
28
  from ..bemcp.bemcp import MCPClient, convert_tool_format, MCPManager
30
- from .taskmanager import TaskManager
31
29
 
32
30
  manager = MCPManager()
33
- task_manager = TaskManager()
34
-
35
- @register_tool()
36
- def create_task(goal, tools, work_dir):
37
- """
38
- 启动一个子任务来自动完成指定的任务目标 (`goal`)。
39
-
40
- 这个子任务接收一个清晰的任务描述、一组可供调用的工具 (`tools`),以及一个工作目录 (`work_dir`)。
41
- 它会结合可用的工具,自主规划并逐步执行必要的操作,直到最终完成指定的任务目标。
42
- 核心功能是根据输入的目标,驱动整个任务执行流程。
43
- 子任务下上文为空,因此需要细致的背景信息。
44
-
45
- Args:
46
- goal (str): 需要完成的具体任务目标描述。子任务将围绕此目标进行工作。必须清晰、具体。必须包含背景信息,完成指标等。写清楚什么时候算任务完成,同时交代清楚任务的背景信息,这个背景信息可以是需要读取的文件等一切有助于完成任务的信息。
47
- tools (list[str]): 一个包含可用工具函数对象的列表。子任务在执行任务时可能会调用这些工具来与环境交互(例如读写文件、执行命令等)。
48
- work_dir (str): 工作目录的绝对路径。子任务将在此目录上下文中执行操作。子任务的工作目录位置在主任务的工作目录的子目录。
49
-
50
- Returns:
51
- str: 当任务成功完成时,返回字符串 "任务已完成"。
52
- """
53
- tasks_params = [
54
- {"goal": goal, "tools": ast.literal_eval(tools), "work_dir": work_dir, "cache_messages": True}
55
- ]
56
- task_ids = task_manager.create_tasks(worker, tasks_params)
57
- return task_ids
58
-
59
- @register_tool()
60
- async def get_task_result():
61
- """
62
- 等待并获取子任务的执行结果。
63
-
64
- Returns:
65
- str: 子任务的执行结果。
66
- """
67
- task_id, status, result = await task_manager.get_next_result()
68
- return result
69
31
 
70
32
  @register_tool()
71
33
  async def worker(goal, tools, work_dir, cache_messages=None):
72
34
  cache_dir = Path(work_dir) / ".beswarm"
73
35
  cache_dir.mkdir(parents=True, exist_ok=True)
36
+ task_manager.set_root_path(work_dir)
74
37
  cache_file = cache_dir / "work_agent_conversation_history.json"
75
38
  if not cache_file.exists():
76
39
  cache_file.write_text("[]", encoding="utf-8")
@@ -271,6 +234,7 @@ async def worker(goal, tools, work_dir, cache_messages=None):
271
234
  async def worker_gen(goal, tools, work_dir, cache_messages=None):
272
235
  cache_dir = Path(work_dir) / ".beswarm"
273
236
  cache_dir.mkdir(parents=True, exist_ok=True)
237
+ task_manager.set_root_path(work_dir)
274
238
  cache_file = cache_dir / "work_agent_conversation_history.json"
275
239
  if not cache_file.exists():
276
240
  cache_file.write_text("[]", encoding="utf-8")
@@ -468,4 +432,6 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
468
432
  print(f"\n任务开始时间: {start_time.strftime('%Y-%m-%d %H:%M:%S')}")
469
433
  print(f"任务结束时间: {end_time.strftime('%Y-%m-%d %H:%M:%S')}")
470
434
  print(f"总用时: {total_time}")
471
- await manager.cleanup()
435
+ await manager.cleanup()
436
+
437
+ from .taskmanager import task_manager
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.2.25
3
+ Version: 0.2.27
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -2,13 +2,13 @@ beswarm/__init__.py,sha256=HZjUOJtZR5QhMuDbq-wukQQn1VrBusNWai_ysGo-VVI,20
2
2
  beswarm/prompt.py,sha256=5JMfOuXWHscsaeDzwBn223mj9N85eAQdOHXQZk7zeWE,32238
3
3
  beswarm/utils.py,sha256=xxbNifOPlfcVkKmF_qFzuEnZgF3MQg3mnOfz1EF0Qss,6697
4
4
  beswarm/aient/main.py,sha256=SiYAIgQlLJqYusnTVEJOx1WNkSJKMImhgn5aWjfroxg,3814
5
- beswarm/aient/setup.py,sha256=TTd2yaKXQpCf2v-b35OeJhLMXEJ-QRkhO48wTq7edKk,487
5
+ beswarm/aient/setup.py,sha256=mDFzdO4betWxiHRtK2bR9z4ahWthoYip79BFKMMGvFo,487
6
6
  beswarm/aient/src/aient/__init__.py,sha256=SRfF7oDVlOOAi6nGKiJIUK6B_arqYLO9iSMp-2IZZps,21
7
7
  beswarm/aient/src/aient/core/__init__.py,sha256=NxjebTlku35S4Dzr16rdSqSTWUvvwEeACe8KvHJnjPg,34
8
8
  beswarm/aient/src/aient/core/log_config.py,sha256=kz2_yJv1p-o3lUQOwA3qh-LSc3wMHv13iCQclw44W9c,274
9
9
  beswarm/aient/src/aient/core/models.py,sha256=d4MISNezTSe0ls0-fjuToI2SoT-sk5fWqAJuKVinIlo,7502
10
- beswarm/aient/src/aient/core/request.py,sha256=r8IvC62GZ6NuBXx82Fd0hiPjYrtqhW3hKz2jdqVY8L0,72473
11
- beswarm/aient/src/aient/core/response.py,sha256=_FVvvakplKAvBMljXy8jm9hMGJ8xgHGrsU8Aio9Xk1o,35408
10
+ beswarm/aient/src/aient/core/request.py,sha256=8HlSFaBhWMs5thhL4C5qj-hvuDZWUXCYWwVShFR99QU,72263
11
+ beswarm/aient/src/aient/core/response.py,sha256=xSOmc4aBFeoT-Cx42B6GrRvsxalx-dOiGdjN1WByyXs,35673
12
12
  beswarm/aient/src/aient/core/utils.py,sha256=NcXdb8zBN0GE01OGaUzg8U34RaraoFf2MaLDDGFvvC4,27492
13
13
  beswarm/aient/src/aient/core/test/test_base_api.py,sha256=pWnycRJbuPSXKKU9AQjWrMAX1wiLC_014Qc9hh5C2Pw,524
14
14
  beswarm/aient/src/aient/core/test/test_geminimask.py,sha256=HFX8jDbNg_FjjgPNxfYaR-0-roUrOO-ND-FVsuxSoiw,13254
@@ -35,7 +35,7 @@ beswarm/aient/src/aient/plugins/read_image.py,sha256=4FbIiMNVFUQpNyiH5ApGSRvOD9u
35
35
  beswarm/aient/src/aient/plugins/readonly.py,sha256=qK5-kBM3NDH1b-otFxFHpAjV5BXEY_e7cTWBcpP7G5k,710
36
36
  beswarm/aient/src/aient/plugins/registry.py,sha256=YknzhieU_8nQ3oKlUSSWDB4X7t2Jx0JnqT2Jd9Xsvfk,3574
37
37
  beswarm/aient/src/aient/plugins/run_python.py,sha256=MohvdtZUTDLrHBDtJ9L2_Qu1pWAGrkbzsGmmn5tMN20,4614
38
- beswarm/aient/src/aient/plugins/websearch.py,sha256=51tNjEe3pAElXY3SIxaXFYjRrHdGiY6nkmVPU1lTWoY,15258
38
+ beswarm/aient/src/aient/plugins/websearch.py,sha256=LPS5NmHrY-Rc0FCPlhHrUWE90XJmXF_AvShLHTV_Zqc,15285
39
39
  beswarm/aient/src/aient/plugins/write_file.py,sha256=hExFLuoNPtjYxJI3pVbofZRpokvUabpXdEkd3mZJPPc,3778
40
40
  beswarm/aient/src/aient/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  beswarm/aient/src/aient/utils/prompt.py,sha256=UcSzKkFE4-h_1b6NofI6xgk3GoleqALRKY8VBaXLjmI,11311
@@ -125,7 +125,7 @@ beswarm/queries/tree-sitter-languages/ruby-tags.scm,sha256=vIidsCeE2A0vdFN18yXKq
125
125
  beswarm/queries/tree-sitter-languages/rust-tags.scm,sha256=9ljM1nzhfPs_ZTRw7cr2P9ToOyhGcKkCoN4_HPXSWi4,1451
126
126
  beswarm/queries/tree-sitter-languages/scala-tags.scm,sha256=UxQjz80JIrrJ7Pm56uUnQyThfmQNvwk7aQzPNypB-Ao,1761
127
127
  beswarm/queries/tree-sitter-languages/typescript-tags.scm,sha256=OMdCeedPiA24ky82DpgTMKXK_l2ySTuF2zrQ2fJAi9E,1253
128
- beswarm/tools/__init__.py,sha256=egPX4B021Pf8dIaOodJ2yxQ_YCG-giI4cHiXsbX70BA,1306
128
+ beswarm/tools/__init__.py,sha256=HCONX8-OBX-FdBEkcSGSolUIHE7UAlhkH8HA1_inBFQ,1413
129
129
  beswarm/tools/click.py,sha256=I62GF-bzcoNzhfu3DeWdiA88Sd_6gMFihrQSwFj4nks,20795
130
130
  beswarm/tools/edit_file.py,sha256=iwWl7a8sTVq4vj0e1ny3H6UGcHfYnxALRGcLuk5hZS8,9155
131
131
  beswarm/tools/planner.py,sha256=lguBCS6kpwNPoXQvqH-WySabVubT82iyWOkJnjt6dXw,1265
@@ -133,10 +133,10 @@ beswarm/tools/repomap.py,sha256=YsTPq5MXfn_Ds5begcvHDnY_Xp2d4jH-xmWqNMHnNHY,4523
133
133
  beswarm/tools/request_input.py,sha256=gXNAJPOJektMqxJVyzNTFOeMQ7xUkO-wWMYH-r2Rdwk,942
134
134
  beswarm/tools/screenshot.py,sha256=u6t8FCgW5YHJ_Oc4coo8e0F3wTusWE_-H8dFh1rBq9Q,1011
135
135
  beswarm/tools/search_arxiv.py,sha256=caVIUOzMhFu-r_gVgJZrH2EO9xI5iV_qLAg0b3Ie9Xg,8095
136
- beswarm/tools/search_web.py,sha256=eEE_aRcocttAwWfkcQdElI_BZw73xiRIEfbHDWAoQqU,15996
137
- beswarm/tools/taskmanager.py,sha256=oB_768qy6Lb58JNIcSLVgbPrgNB3duIq9DawbVHRbrg,6270
138
- beswarm/tools/worker.py,sha256=Vwn1XuTZ2dIStd5dQ6DhJ4f7LmwDc-Sx9PwLG0Xw-MQ,24062
139
- beswarm-0.2.25.dist-info/METADATA,sha256=Wwq8gqLH0xv1KMUkNsbfZEw6XRGKNORHzNTMXyPLjxs,3847
140
- beswarm-0.2.25.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
141
- beswarm-0.2.25.dist-info/top_level.txt,sha256=pJw4O87wvt5882smuSO6DfByJz7FJ8SxxT8h9fHCmpo,8
142
- beswarm-0.2.25.dist-info/RECORD,,
136
+ beswarm/tools/search_web.py,sha256=XkKb2_Snm4-bIOrkMhsyxao0-VPsYmfM2CKQbJ5TGFI,16101
137
+ beswarm/tools/taskmanager.py,sha256=rVLB0xwteT-5y9svmJ68K65U3JuX9BJGvqNzyxPvjaI,12178
138
+ beswarm/tools/worker.py,sha256=2Qf8pQn2FQCLW5hd0mBaJ9zMU1Ft-hWXGdkNj4nX1yI,22274
139
+ beswarm-0.2.27.dist-info/METADATA,sha256=7UHHfWdWSWPT--MEIxRsjTXizA_xlQxg_e3mthXuGb0,3847
140
+ beswarm-0.2.27.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
141
+ beswarm-0.2.27.dist-info/top_level.txt,sha256=pJw4O87wvt5882smuSO6DfByJz7FJ8SxxT8h9fHCmpo,8
142
+ beswarm-0.2.27.dist-info/RECORD,,