beswarm 0.1.53__py3-none-any.whl → 0.1.55__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.9",
7
+ version="1.1.11",
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",
@@ -306,7 +306,7 @@ async def get_vertex_gemini_payload(request, engine, provider, api_key=None):
306
306
  search_tool = None
307
307
 
308
308
  # https://cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/2-0-flash?hl=zh-cn
309
- pro_models = ["gemini-2.5"]
309
+ pro_models = ["gemini-2.5", "gemini-2.0"]
310
310
  if any(pro_model in original_model for pro_model in pro_models):
311
311
  location = gemini2
312
312
  search_tool = {"googleSearch": {}}
@@ -152,8 +152,25 @@ class chatgpt(BaseLLM):
152
152
  else:
153
153
  last_user_message = self.conversation[convo_id][-1]["content"]
154
154
  if last_user_message != message:
155
+ image_message_list = []
156
+ if isinstance(function_arguments, str):
157
+ functions_list = json.loads(function_arguments)
158
+ else:
159
+ functions_list = function_arguments
160
+ for tool_info in functions_list:
161
+ if tool_info.get("base64_image"):
162
+ image_message_list.append({"type": "text", "text": safe_get(tool_info, "parameter", "image_path", default="") + " image:"})
163
+ image_message_list.append({
164
+ "type": "image_url",
165
+ "image_url": {
166
+ "url": tool_info["base64_image"],
167
+ }
168
+ })
155
169
  self.conversation[convo_id].append({"role": "assistant", "content": convert_functions_to_xml(function_arguments)})
156
- self.conversation[convo_id].append({"role": "user", "content": message})
170
+ if image_message_list:
171
+ self.conversation[convo_id].append({"role": "user", "content": [{"type": "text", "text": message}] + image_message_list})
172
+ else:
173
+ self.conversation[convo_id].append({"role": "user", "content": message})
157
174
  else:
158
175
  self.conversation[convo_id].append({"role": "assistant", "content": "我已经执行过这个工具了,接下来我需要做什么?"})
159
176
 
@@ -545,10 +562,10 @@ class chatgpt(BaseLLM):
545
562
  self.latest_file_content[tool_info['parameter']["file_path"]] = tool_response
546
563
  all_responses.append(f"[{tool_name}({tool_args}) Result]:\n\nRead file successfully! The file content has been updated in the tag <latest_file_content>.")
547
564
  elif tool_name == "write_to_file":
548
- # change_tools_args = copy.deepcopy(tool_info['parameter'])
549
- # change_tools_args["content"] = "...文件已写入,内容已省略以节省上下文..."
550
- # tool_args = json.dumps(change_tools_args, ensure_ascii=False) if not isinstance(change_tools_args, str) else change_tools_args
551
565
  all_responses.append(f"[{tool_name} Result]:\n\n{tool_response}")
566
+ elif tool_name == "read_image":
567
+ tool_info["base64_image"] = tool_response
568
+ all_responses.append(f"[{tool_name}({tool_args}) Result]:\n\nRead image successfully!")
552
569
  else:
553
570
  all_responses.append(f"[{tool_name}({tool_args}) Result]:\n\n{tool_response}")
554
571
 
@@ -5,13 +5,13 @@ from .registry import register_tool
5
5
  @register_tool()
6
6
  def list_directory(path="."):
7
7
  """
8
- 列出指定目录中的所有文件和子目录
8
+ 列出指定目录中的所有文件和子目录
9
9
 
10
- 参数:
11
- path: 要列出内容的目录路径,默认为当前目录
10
+ 参数:
11
+ path: 要列出内容的目录路径,默认为当前目录
12
12
 
13
- 返回:
14
- 目录内容的列表字符串
13
+ 返回:
14
+ 目录内容的列表字符串
15
15
  """
16
16
  try:
17
17
  # 获取目录内容
@@ -0,0 +1,54 @@
1
+ import os
2
+ import base64
3
+ import mimetypes
4
+ from .registry import register_tool
5
+
6
+ @register_tool()
7
+ def read_image(image_path: str):
8
+ """
9
+ 读取本地图片文件,将其转换为 Base64 编码,并返回包含 MIME 类型和完整数据的字符串。
10
+ 此工具用于将图片内容加载到上下文中。
11
+
12
+ 参数:
13
+ image_path (str): 本地图片文件的路径。
14
+
15
+ 返回:
16
+ str: 成功时返回包含图片MIME类型和Base64编码数据的格式化字符串。
17
+ 失败时返回错误信息字符串。
18
+ """
19
+ try:
20
+ # 检查路径是否存在
21
+ if not os.path.exists(image_path):
22
+ return f"错误: 图片路径 '{image_path}' 不存在。"
23
+ # 检查是否为文件
24
+ if not os.path.isfile(image_path):
25
+ return f"错误: 路径 '{image_path}' 不是一个有效的文件 (可能是一个目录)。"
26
+
27
+ # 尝试猜测MIME类型
28
+ mime_type, _ = mimetypes.guess_type(image_path) # encoding 变量通常不需要
29
+
30
+ if not mime_type or not mime_type.startswith('image/'):
31
+ # 如果mimetypes无法识别,或者不是图片类型
32
+ return f"错误: 文件 '{image_path}' 的MIME类型无法识别为图片 (检测到: {mime_type})。请确保文件是常见的图片格式 (e.g., PNG, JPG, GIF, WEBP)。"
33
+
34
+ with open(image_path, "rb") as image_file:
35
+ image_data = image_file.read()
36
+
37
+ base64_encoded_data = base64.b64encode(image_data).decode('utf-8')
38
+
39
+ # 返回一个描述性字符串,模仿 list_directory.py 的风格
40
+ # 包含完整的 Base64 数据
41
+ # 注意:对于非常大的图片,这可能会产生非常长的输出字符串。
42
+ # return f"成功读取图片 '{image_path}':\n MIME 类型: {mime_type}\n Base64 数据: {base64_encoded_data}"
43
+ return f"data:{mime_type};base64," + base64_encoded_data
44
+
45
+ except FileNotFoundError:
46
+ # 这个异常通常由 open() 抛出,如果 os.path.exists 通过但文件在读取前被删除
47
+ # 或者路径检查逻辑未能完全覆盖所有情况 (理论上不应发生)
48
+ return f"错误: 图片路径 '{image_path}' 未找到 (可能在检查后被删除或移动)。"
49
+ except PermissionError:
50
+ return f"错误: 没有权限访问图片路径 '{image_path}'。"
51
+ except IOError as e: # 例如文件损坏无法读取,或磁盘问题
52
+ return f"错误: 读取图片 '{image_path}' 时发生 I/O 错误: {e}"
53
+ except Exception as e:
54
+ return f"读取图片 '{image_path}' 时发生未知错误: {e}"
@@ -220,6 +220,8 @@ git clone https://github.com/username/project-name.git
220
220
  <tools>
221
221
  {tools_list}
222
222
  </tools>
223
+
224
+ <work_agent_conversation_start>
223
225
  """
224
226
 
225
227
  cursor_prompt = """
@@ -440,7 +440,18 @@ def parse_function_xml(xml_content: str, check_line_start: bool = True) -> List[
440
440
  # 如果 '<' 不在行首 (即 tag_start > 0 且其前一个字符不是换行符),
441
441
  # 则将其视为普通文本的一部分,移动 position 并继续搜索
442
442
  if check_line_start:
443
- if tag_start > 0 and xml_content[tag_start - 1] != '\n':
443
+ # 检查标签是否在行首,或者行首到标签之间只有空格
444
+ is_start_of_line_or_only_spaces_before = True
445
+ if tag_start > 0:
446
+ # 从 tag_start - 1 向前检查,直到行首或遇到非空格字符
447
+ check_pos = tag_start - 1
448
+ while check_pos >= 0 and xml_content[check_pos] != '\n':
449
+ if not xml_content[check_pos].isspace():
450
+ is_start_of_line_or_only_spaces_before = False
451
+ break
452
+ check_pos -= 1
453
+
454
+ if not is_start_of_line_or_only_spaces_before:
444
455
  position = tag_start + 1 # 从 '<' 之后继续搜索
445
456
  continue
446
457
 
@@ -666,15 +677,15 @@ if __name__ == "__main__":
666
677
  </read_file>
667
678
  </tool_call>好的,我现在读取 `README.md` 文件。
668
679
  """
669
- test_xml = """首先使用read_file工具读取论文内容,然后使用excute_command工具克隆代码仓库到本地。\n```xml\n<read_file>\n<file_path>/Users/yanyuming/Downloads/GitHub/OceanSynthesis/papers/2412.06410v1.pdf</file_path>\n</read_file>\n\n<excute_command>\n<command>git clone https://github.com/bartbussmann/BatchTopK.git</command>\n</excute_command>\n```"""
680
+ # test_xml = """首先使用read_file工具读取论文内容,然后使用excute_command工具克隆代码仓库到本地。\n```xml\n<read_file>\n<file_path>/Users/yanyuming/Downloads/GitHub/OceanSynthesis/papers/2412.06410v1.pdf</file_path>\n</read_file>\n\n<excute_command>\n<command>git clone https://github.com/bartbussmann/BatchTopK.git</command>\n</excute_command>\n```"""
670
681
  test_xml = """
671
682
  ✅ 好的,我现在读取 `README.md` 文件。
672
- <read_file>
673
- <file_path>README.md</file_path>
674
- </read_file>
675
- <read_file>
676
- <file_path>README.md</file_path>
677
- </read_file>
683
+ <read_file>
684
+ <file_path>README.md</file_path>
685
+ </read_file>
686
+ <read_file>
687
+ <file_path>README.md</file_path>
688
+ </read_file>
678
689
 
679
690
  <tool_call>
680
691
  <read_file>
beswarm/tools/UIworker.py CHANGED
@@ -107,7 +107,9 @@ async def UIworker(goal, tools, work_dir, cache_messages=None):
107
107
  """
108
108
  # 让指令agent分析对话历史并生成新指令
109
109
  instruction_agent = chatgpt(**instruction_agent_config)
110
- instruction_agent.conversation["default"] = copy.deepcopy(work_agent.conversation["default"])
110
+ conversation_history = copy.deepcopy(work_agent.conversation["default"])
111
+ conversation_history.pop(0)
112
+ instruction_agent.conversation["default"][1:] = conversation_history
111
113
  new_prompt = await get_current_screen_image_message(instruction_prompt)
112
114
  next_instruction = await instruction_agent.ask_async(new_prompt)
113
115
  print("\n🤖 指令智能体生成的下一步指令:", next_instruction)
beswarm/tools/__init__.py CHANGED
@@ -19,6 +19,7 @@ from ..aient.src.aient.plugins import (
19
19
  write_to_file,
20
20
  download_read_arxiv_pdf,
21
21
  get_url_content,
22
+ read_image,
22
23
  register_tool,
23
24
  )
24
25
 
@@ -30,6 +31,7 @@ __all__ = [
30
31
  "get_code_repo_map",
31
32
  # aient.plugins
32
33
  "excute_command",
34
+ "read_image",
33
35
  "get_time",
34
36
  "generate_image",
35
37
  "list_directory",
beswarm/tools/worker.py CHANGED
@@ -64,31 +64,38 @@ async def worker(goal, tools, work_dir, cache_messages=None):
64
64
  work_agent = chatgpt(**work_agent_config)
65
65
  async def instruction_agent_task():
66
66
  while True:
67
- # 指令agent初始化
68
- instruction_agent = chatgpt(**instruction_agent_config)
69
-
70
67
  # 获取工作agent的对话历史
71
- conversation_history = copy.deepcopy(work_agent.conversation["default"])
72
- conversation_history.pop(0)
73
-
74
- conversation_len = len(conversation_history) - 1
75
- message_index = 0
76
- while message_index < conversation_len:
77
- if conversation_history[message_index]["content"].strip() == "":
78
- conversation_history.pop(message_index)
79
- conversation_len = conversation_len - 1
80
- else:
81
- message_index = message_index + 1
68
+ # conversation_history = copy.deepcopy(work_agent.conversation["default"])
69
+ # conversation_history.pop(0)
70
+
71
+ # conversation_len = len(conversation_history) - 1
72
+ # message_index = 0
73
+ # while message_index < conversation_len:
74
+ # if isinstance(conversation_history[message_index]["content"], str) and conversation_history[message_index]["content"].strip() == "":
75
+ # conversation_history.pop(message_index)
76
+ # conversation_len = conversation_len - 1
77
+ # elif isinstance(conversation_history[message_index]["content"], list) and \
78
+ # len(conversation_history[message_index]["content"]) > 0 and \
79
+ # conversation_history[message_index]["content"][0].get("type") == "text" and \
80
+ # conversation_history[message_index]["content"][0].get("text").strip() == "":
81
+ # conversation_history.pop(message_index)
82
+ # conversation_len = conversation_len - 1
83
+ # else:
84
+ # message_index = message_index + 1
82
85
 
83
86
  instruction_prompt = f"""
87
+ </work_agent_conversation_end>
84
88
  任务目标: {goal}
85
89
 
86
- 工作智能体的对话历史:
87
- {conversation_history}
90
+ 在 tag <work_agent_conversation_start>...</work_agent_conversation_end> 之前的对话历史都是工作智能体的对话历史。
88
91
 
89
92
  根据以上对话历史和目标,请生成下一步指令。如果任务已完成,请回复"任务已完成"。
90
93
  """
91
94
  # 让指令agent分析对话历史并生成新指令
95
+ instruction_agent = chatgpt(**instruction_agent_config)
96
+ conversation_history = copy.deepcopy(work_agent.conversation["default"])
97
+ conversation_history.pop(0)
98
+ instruction_agent.conversation["default"][1:] = conversation_history
92
99
  next_instruction = await instruction_agent.ask_async(instruction_prompt)
93
100
  print("\n🤖 指令智能体生成的下一步指令:", next_instruction)
94
101
  if "fetch_gpt_response_stream HTTP Error', 'status_code': 404" in next_instruction:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.1.53
3
+ Version: 0.1.55
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,12 +1,12 @@
1
1
  beswarm/__init__.py,sha256=HZjUOJtZR5QhMuDbq-wukQQn1VrBusNWai_ysGo-VVI,20
2
2
  beswarm/utils.py,sha256=AdDCcqAIIKQEMl7PfryVgeT9G5sHe7QNsZnrvmTGA8E,283
3
3
  beswarm/aient/main.py,sha256=SiYAIgQlLJqYusnTVEJOx1WNkSJKMImhgn5aWjfroxg,3814
4
- beswarm/aient/setup.py,sha256=7hYwy55_Ncx42ns6TQjOyhMBMIFkFdbSWupWV7K00vQ,486
4
+ beswarm/aient/setup.py,sha256=ulEgZGvqjNW3md1BsZe2Yzx4lkJymyIfc3tSA11u2AQ,487
5
5
  beswarm/aient/src/aient/__init__.py,sha256=SRfF7oDVlOOAi6nGKiJIUK6B_arqYLO9iSMp-2IZZps,21
6
6
  beswarm/aient/src/aient/core/__init__.py,sha256=NxjebTlku35S4Dzr16rdSqSTWUvvwEeACe8KvHJnjPg,34
7
7
  beswarm/aient/src/aient/core/log_config.py,sha256=kz2_yJv1p-o3lUQOwA3qh-LSc3wMHv13iCQclw44W9c,274
8
8
  beswarm/aient/src/aient/core/models.py,sha256=kF-HLi1I2k_G5r153ZHuiGH8_NmpTlFMfK0_myB28YQ,7366
9
- beswarm/aient/src/aient/core/request.py,sha256=Sa2muc4buCkSNPQITOvXwQt0CGA_A39TpIoeVqdqwFQ,61929
9
+ beswarm/aient/src/aient/core/request.py,sha256=VItemXnWzqzS10W-RuLVrARki1w7MZMBZdyqyA5axw8,61943
10
10
  beswarm/aient/src/aient/core/response.py,sha256=BNHLazjfQT8mVg7LnPLzlX429aQM3S03pumPbOpczCI,31518
11
11
  beswarm/aient/src/aient/core/utils.py,sha256=n3dyaApN4rrSduI8cjZbeD0mv8_O5LPTTbwRkj1_v4w,26540
12
12
  beswarm/aient/src/aient/core/test/test_base_api.py,sha256=pWnycRJbuPSXKKU9AQjWrMAX1wiLC_014Qc9hh5C2Pw,524
@@ -16,7 +16,7 @@ beswarm/aient/src/aient/core/test/test_payload.py,sha256=8jBiJY1uidm1jzL-EiK0s6U
16
16
  beswarm/aient/src/aient/models/__init__.py,sha256=ouNDNvoBBpIFrLsk09Q_sq23HR0GbLAKfGLIFmfEuXE,219
17
17
  beswarm/aient/src/aient/models/audio.py,sha256=kRd-8-WXzv4vwvsTGwnstK-WR8--vr9CdfCZzu8y9LA,1934
18
18
  beswarm/aient/src/aient/models/base.py,sha256=z-Z0pJfTN2x0cuwfvu0BdMRY9O-RmLwHEnBIJN1x4Fg,6719
19
- beswarm/aient/src/aient/models/chatgpt.py,sha256=vjmMELVO96NWsptrwoqcvyDS_YQfvE_piA-4G_hQR0I,45258
19
+ beswarm/aient/src/aient/models/chatgpt.py,sha256=6SuMfV8n0pBOaKN3WGqhPc53_LHBdyOECQgVsHscso8,46169
20
20
  beswarm/aient/src/aient/models/claude.py,sha256=JezghW7y0brl4Y5qiSHvnYR5prQCFywX4RViHt39pGI,26037
21
21
  beswarm/aient/src/aient/models/duckduckgo.py,sha256=1l7vYCs9SG5SWPCbcl7q6pCcB5AUF_r-a4l9frz3Ogo,8115
22
22
  beswarm/aient/src/aient/models/gemini.py,sha256=chGLc-8G_DAOxr10HPoOhvVFW1RvMgHd6mt--VyAW98,14730
@@ -28,17 +28,18 @@ beswarm/aient/src/aient/plugins/config.py,sha256=Vp6CG9ocdC_FAlCMEGtKj45xamir76D
28
28
  beswarm/aient/src/aient/plugins/excute_command.py,sha256=A3WmfZboEikU1EHvtMWhBv-xHxCyMxbDddQ982I_8wE,10482
29
29
  beswarm/aient/src/aient/plugins/get_time.py,sha256=Ih5XIW5SDAIhrZ9W4Qe5Hs1k4ieKPUc_LAd6ySNyqZk,654
30
30
  beswarm/aient/src/aient/plugins/image.py,sha256=ZElCIaZznE06TN9xW3DrSukS7U3A5_cjk1Jge4NzPxw,2072
31
- beswarm/aient/src/aient/plugins/list_directory.py,sha256=5ubm-mfrj-tanGSDp4M_Tmb6vQb3dx2-XVfQ2yL2G8A,1394
31
+ beswarm/aient/src/aient/plugins/list_directory.py,sha256=JZVuImecMSfEv6jLqii-0uQJ1UCsrpMNmYlwW3PEDg4,1374
32
32
  beswarm/aient/src/aient/plugins/read_file.py,sha256=-RRmaj-rSl8y--5VKnxCsZ1YQHe75OhnqvsDRLJyujM,8412
33
+ beswarm/aient/src/aient/plugins/read_image.py,sha256=goBnpmnmu753pQBkEROTo1ZaGE23fx5WJVr8T8z4598,2577
33
34
  beswarm/aient/src/aient/plugins/registry.py,sha256=YknzhieU_8nQ3oKlUSSWDB4X7t2Jx0JnqT2Jd9Xsvfk,3574
34
35
  beswarm/aient/src/aient/plugins/run_python.py,sha256=dgcUwBunMuDkaSKR5bToudVzSdrXVewktDDFUz_iIOQ,4589
35
36
  beswarm/aient/src/aient/plugins/websearch.py,sha256=llxy1U0vJiNMiKvamMr4p7IruLb3nnDR4YErz8TYimc,15215
36
37
  beswarm/aient/src/aient/plugins/write_file.py,sha256=YRvQKMvV-5lwohxlvwt9hjfxz2dRJP85AJWAMUIqbBY,3804
37
38
  beswarm/aient/src/aient/prompt/__init__.py,sha256=GBtn6-JDT8KHFCcuPpfSNE_aGddg5p4FEyMCy4BfwGs,20
38
- beswarm/aient/src/aient/prompt/agent.py,sha256=6f5ZB66Rb8y0iQScHMRhvXZ1qMM3YsKpCBPCTAAw2rg,24917
39
+ beswarm/aient/src/aient/prompt/agent.py,sha256=y2GETN6ScC5yQVs75VFfzm4YUWzblbqLYz0Sy6JnPRw,24950
39
40
  beswarm/aient/src/aient/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
41
  beswarm/aient/src/aient/utils/prompt.py,sha256=UcSzKkFE4-h_1b6NofI6xgk3GoleqALRKY8VBaXLjmI,11311
41
- beswarm/aient/src/aient/utils/scripts.py,sha256=NXmTxcZqHoRv3S13isLsv7kvqktXnA5ej7uMsxCJUe0,26656
42
+ beswarm/aient/src/aient/utils/scripts.py,sha256=ATxP7VZvIngYiRB6XgjP1lQHovKzXhpWL3QpsJtZYi8,27245
42
43
  beswarm/aient/test/chatgpt.py,sha256=Hvl7FuDt1c74N5TVBmhErOPvJbJJzA7FNp5VoZM4u30,4957
43
44
  beswarm/aient/test/claude.py,sha256=IyB4qI1eJLwlSfDNSnt2FhbQWYyBighHUjJxEXc3osQ,1095
44
45
  beswarm/aient/test/test.py,sha256=rldnoLQdtRR8IKFSIzTti7eIK2MpPMoi9gL5qD8_K44,29
@@ -118,8 +119,8 @@ beswarm/queries/tree-sitter-languages/ruby-tags.scm,sha256=vIidsCeE2A0vdFN18yXKq
118
119
  beswarm/queries/tree-sitter-languages/rust-tags.scm,sha256=9ljM1nzhfPs_ZTRw7cr2P9ToOyhGcKkCoN4_HPXSWi4,1451
119
120
  beswarm/queries/tree-sitter-languages/scala-tags.scm,sha256=UxQjz80JIrrJ7Pm56uUnQyThfmQNvwk7aQzPNypB-Ao,1761
120
121
  beswarm/queries/tree-sitter-languages/typescript-tags.scm,sha256=OMdCeedPiA24ky82DpgTMKXK_l2ySTuF2zrQ2fJAi9E,1253
121
- beswarm/tools/UIworker.py,sha256=YRrzW5GxWqA-tcmmm2c6mMbkVI0kHIqosIUz-GcoQOQ,6339
122
- beswarm/tools/__init__.py,sha256=EKOiLDGDrJ5GPM31SYtsYzDGSri_EINnO8M9ud0BifU,1054
122
+ beswarm/tools/UIworker.py,sha256=1sEC76VGFwo48lSx6KOvhJwhgBj7UWAHAAH9BG_lp-M,6439
123
+ beswarm/tools/__init__.py,sha256=jOfYY4EYkwmz-FTJGrI1CyaIYkGWsmGzZBGsoupeX9M,1088
123
124
  beswarm/tools/click.py,sha256=TygaekCXTmU3fIu6Uom7ZcyzEgYMlCC_GX-5SmWHuLI,20762
124
125
  beswarm/tools/edit_file.py,sha256=hfpLaE4ekDiAya0Le0fJuYa-xUefWHLTxc3F6zGZd7M,6912
125
126
  beswarm/tools/planner.py,sha256=lguBCS6kpwNPoXQvqH-WySabVubT82iyWOkJnjt6dXw,1265
@@ -127,8 +128,8 @@ beswarm/tools/repomap.py,sha256=CwvwoN5Swr42EzrORTTeV8MMb7mPviy4a4b0fxBu50k,4082
127
128
  beswarm/tools/search_arxiv.py,sha256=9slwBemXjEqrd7-YgVmyMijPXlkhZCybEDRVhWVQ9B0,7937
128
129
  beswarm/tools/search_web.py,sha256=B24amOnGHnmdV_6S8bw8O2PdhZRRIDtJjg-wXcfP7dQ,11859
129
130
  beswarm/tools/think.py,sha256=WLw-7jNIsnS6n8MMSYUin_f-BGLENFmnKM2LISEp0co,1760
130
- beswarm/tools/worker.py,sha256=FfKCx7KFNbMRoAXtjU1_nJQjx9WHny7KBq8OXSYICJs,5334
131
- beswarm-0.1.53.dist-info/METADATA,sha256=N0kOlCXH6zGdg6F7a44dI1Ao9hUmi5Gt6fDJ6Kz699Q,3537
132
- beswarm-0.1.53.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
133
- beswarm-0.1.53.dist-info/top_level.txt,sha256=pJw4O87wvt5882smuSO6DfByJz7FJ8SxxT8h9fHCmpo,8
134
- beswarm-0.1.53.dist-info/RECORD,,
131
+ beswarm/tools/worker.py,sha256=b-FvSEP27-zMYNcqaQeVBoWxaSf2cX_7_1p1GAF6h04,6191
132
+ beswarm-0.1.55.dist-info/METADATA,sha256=zYcsCjxq2DQCq_sax7vYE0k1Axqj7vDFH0Q2Ylw3KxY,3537
133
+ beswarm-0.1.55.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
134
+ beswarm-0.1.55.dist-info/top_level.txt,sha256=pJw4O87wvt5882smuSO6DfByJz7FJ8SxxT8h9fHCmpo,8
135
+ beswarm-0.1.55.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.7.1)
2
+ Generator: setuptools (80.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5