beswarm 0.1.70__py3-none-any.whl → 0.1.72__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.21",
7
+ version="1.1.23",
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",
@@ -352,7 +352,15 @@ async def get_vertex_gemini_payload(request, engine, provider, api_key=None):
352
352
  stream=gemini_stream
353
353
  )
354
354
  elif api_key is not None and api_key[2] == ".":
355
- url = f"https://aiplatform.googleapis.com/v1/publishers/google/models/{original_model}:{gemini_stream}?key={api_key}"
355
+ if provider.get("project_id") and "gemini-2.5-pro-preview-06-05" == original_model:
356
+ if isinstance(provider.get("project_id"), list):
357
+ api_key_index = provider.get("api").index(api_key)
358
+ project_id = provider.get("project_id")[api_key_index]
359
+ else:
360
+ project_id = provider.get("project_id")
361
+ url = f"https://aiplatform.googleapis.com/v1/projects/{project_id}/locations/global/publishers/google/models/{original_model}:{gemini_stream}?key={api_key}"
362
+ else:
363
+ url = f"https://aiplatform.googleapis.com/v1/publishers/google/models/{original_model}:{gemini_stream}?key={api_key}"
356
364
  headers.pop("Authorization", None)
357
365
  elif "gemini-2.5-pro-exp-03-25" == original_model:
358
366
  url = "https://aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/{LOCATION}/publishers/google/models/{MODEL_ID}:{stream}".format(
@@ -426,7 +434,8 @@ async def get_vertex_gemini_payload(request, engine, provider, api_key=None):
426
434
  messages.append({"role": msg.role, "parts": content})
427
435
  elif msg.role == "system":
428
436
  system_prompt = system_prompt + "\n\n" + content[0]["text"]
429
- systemInstruction = {"parts": [{"text": system_prompt}]}
437
+ if system_prompt.strip():
438
+ systemInstruction = {"parts": [{"text": system_prompt}]}
430
439
 
431
440
  if any(off_model in original_model for off_model in gemini_max_token_65k_models):
432
441
  safety_settings = "OFF"
@@ -2,6 +2,8 @@ import os
2
2
  import base64
3
3
  import mimetypes
4
4
  from .registry import register_tool
5
+ import io
6
+ from PIL import Image, UnidentifiedImageError
5
7
 
6
8
  @register_tool()
7
9
  def read_image(image_path: str):
@@ -16,7 +18,12 @@ def read_image(image_path: str):
16
18
  str: 成功时返回包含图片MIME类型和Base64编码数据的格式化字符串。
17
19
  失败时返回错误信息字符串。
18
20
  """
21
+ original_max_pixels = Image.MAX_IMAGE_PIXELS
19
22
  try:
23
+ # 暂时禁用解压炸弹检查,以允许打开非常大的图像进行缩放。
24
+ # 这是安全的,因为我们控制代码,并且会立即对图像进行缩减。
25
+ Image.MAX_IMAGE_PIXELS = None
26
+
20
27
  # 检查路径是否存在
21
28
  if not os.path.exists(image_path):
22
29
  return f"<tool_error>图片路径 '{image_path}' 不存在。</tool_error>"
@@ -31,17 +38,40 @@ def read_image(image_path: str):
31
38
  # 如果mimetypes无法识别,或者不是图片类型
32
39
  return f"<tool_error>文件 '{image_path}' 的MIME类型无法识别为图片 (检测到: {mime_type})。请确保文件是常见的图片格式 (e.g., PNG, JPG, GIF, WEBP)。</tool_error>"
33
40
 
34
- with open(image_path, "rb") as image_file:
35
- image_data = image_file.read()
41
+ max_dim = 3072
42
+ with Image.open(image_path) as img:
43
+ width, height = img.size
44
+
45
+ target_img = img
46
+ if width > max_dim or height > max_dim:
47
+ if width > height:
48
+ new_width = max_dim
49
+ new_height = int(height * (max_dim / width))
50
+ else:
51
+ new_height = max_dim
52
+ new_width = int(width * (max_dim / height))
53
+
54
+ try:
55
+ resampling_filter = Image.Resampling.LANCZOS
56
+ except AttributeError:
57
+ # 兼容旧版 Pillow
58
+ resampling_filter = Image.LANCZOS
59
+
60
+ target_img = img.resize((new_width, new_height), resampling_filter)
61
+
62
+ # 将处理后的图片保存到内存中的字节流
63
+ img_byte_arr = io.BytesIO()
64
+ # 保留原始图片格式以获得最佳兼容性,如果无法确定格式,默认为PNG
65
+ img_format = img.format or 'PNG'
66
+ target_img.save(img_byte_arr, format=img_format)
67
+ image_data = img_byte_arr.getvalue()
36
68
 
37
69
  base64_encoded_data = base64.b64encode(image_data).decode('utf-8')
38
70
 
39
- # 返回一个描述性字符串,模仿 list_directory.py 的风格
40
- # 包含完整的 Base64 数据
41
- # 注意:对于非常大的图片,这可能会产生非常长的输出字符串。
42
- # return f"成功读取图片 '{image_path}':\n MIME 类型: {mime_type}\n Base64 数据: {base64_encoded_data}"
43
71
  return f"data:{mime_type};base64," + base64_encoded_data
44
72
 
73
+ except UnidentifiedImageError:
74
+ return f"<tool_error>无法识别的图片格式 '{image_path}',文件可能已损坏或格式不受支持。</tool_error>"
45
75
  except FileNotFoundError:
46
76
  # 这个异常通常由 open() 抛出,如果 os.path.exists 通过但文件在读取前被删除
47
77
  # 或者路径检查逻辑未能完全覆盖所有情况 (理论上不应发生)
@@ -51,4 +81,7 @@ def read_image(image_path: str):
51
81
  except IOError as e: # 例如文件损坏无法读取,或磁盘问题
52
82
  return f"<tool_error>读取图片 '{image_path}' 时发生 I/O 错误: {e}</tool_error>"
53
83
  except Exception as e:
54
- return f"<tool_error>读取图片 '{image_path}' 时发生未知错误: {e}</tool_error>"
84
+ return f"<tool_error>读取图片 '{image_path}' 时发生未知错误: {e}</tool_error>"
85
+ finally:
86
+ # 恢复原始限制以避免副作用。
87
+ Image.MAX_IMAGE_PIXELS = original_max_pixels
@@ -52,6 +52,8 @@ def edit_file(file_path, diff_content, match_precision=0.8):
52
52
 
53
53
  if not diff_blocks:
54
54
  return f"错误: 无效的diff格式,未找到搜索和替换块"
55
+ if len(diff_blocks) > 1:
56
+ return f"错误: 只支持单次修改,`diff_content`参数中**必须只包含一个** `<<<<<<< SEARCH ... >>>>>>> REPLACE` 块,但找到了 {len(diff_blocks)} 个修改块"
55
57
 
56
58
  # 记录修改次数和行数变化
57
59
  edits_count = 0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.1.70
3
+ Version: 0.1.72
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=Z2Kuus2BLp9EHUC2ZNL9iUsb6NWnPj-MTA7SYzGyg24,1755
3
3
  beswarm/aient/main.py,sha256=SiYAIgQlLJqYusnTVEJOx1WNkSJKMImhgn5aWjfroxg,3814
4
- beswarm/aient/setup.py,sha256=qAA0xNh-3PrTMh8w92_J3i6ezKq9SQjNdo-9zPVcxJk,487
4
+ beswarm/aient/setup.py,sha256=wnXMF4G1ahOYecYyUGpqw-NLutZSfEveB8IEcxF0nrY,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=g6rUcNwSTHwmBzt1epsu_2Re8YRFKVCSXRUIFJZpAb4,7432
9
- beswarm/aient/src/aient/core/request.py,sha256=qKj_w9UpXZePCGhhMuE-rX7rCPUdCx8GJ-HUXiurBho,66589
9
+ beswarm/aient/src/aient/core/request.py,sha256=1t11Ep_MxVtmdkFm-vGNSFWFHgbM2DDemVZSrujT8Pc,67175
10
10
  beswarm/aient/src/aient/core/response.py,sha256=YphzhA9jtQKzWb3L4XGTp9xJZ2FOzHr1aAMTsi896FQ,33201
11
11
  beswarm/aient/src/aient/core/utils.py,sha256=zidsBUBd3KskzcxQcPB1y5x1RhtWcbZeWvmgb4LAadA,27318
12
12
  beswarm/aient/src/aient/core/test/test_base_api.py,sha256=pWnycRJbuPSXKKU9AQjWrMAX1wiLC_014Qc9hh5C2Pw,524
@@ -30,7 +30,7 @@ beswarm/aient/src/aient/plugins/get_time.py,sha256=Ih5XIW5SDAIhrZ9W4Qe5Hs1k4ieKP
30
30
  beswarm/aient/src/aient/plugins/image.py,sha256=ZElCIaZznE06TN9xW3DrSukS7U3A5_cjk1Jge4NzPxw,2072
31
31
  beswarm/aient/src/aient/plugins/list_directory.py,sha256=JZVuImecMSfEv6jLqii-0uQJ1UCsrpMNmYlwW3PEDg4,1374
32
32
  beswarm/aient/src/aient/plugins/read_file.py,sha256=Lv03AW-gWGzM2esos2vLTXHcceczdTqEO7_vqFT4yoY,8302
33
- beswarm/aient/src/aient/plugins/read_image.py,sha256=jFu8MGCPWg19YOG-STWH3pqacf94F17i_4JaJu1XWLs,2704
33
+ beswarm/aient/src/aient/plugins/read_image.py,sha256=4FbIiMNVFUQpNyiH5ApGSRvOD9ujcXGyuqlGTJMd7ac,4017
34
34
  beswarm/aient/src/aient/plugins/registry.py,sha256=YknzhieU_8nQ3oKlUSSWDB4X7t2Jx0JnqT2Jd9Xsvfk,3574
35
35
  beswarm/aient/src/aient/plugins/run_python.py,sha256=dgcUwBunMuDkaSKR5bToudVzSdrXVewktDDFUz_iIOQ,4589
36
36
  beswarm/aient/src/aient/plugins/websearch.py,sha256=llxy1U0vJiNMiKvamMr4p7IruLb3nnDR4YErz8TYimc,15215
@@ -121,7 +121,7 @@ beswarm/queries/tree-sitter-languages/scala-tags.scm,sha256=UxQjz80JIrrJ7Pm56uUn
121
121
  beswarm/queries/tree-sitter-languages/typescript-tags.scm,sha256=OMdCeedPiA24ky82DpgTMKXK_l2ySTuF2zrQ2fJAi9E,1253
122
122
  beswarm/tools/__init__.py,sha256=IJExt6D58d2yxBOjHVC6wYGhV7Pb7okmX61RvyqSCSY,1150
123
123
  beswarm/tools/click.py,sha256=TygaekCXTmU3fIu6Uom7ZcyzEgYMlCC_GX-5SmWHuLI,20762
124
- beswarm/tools/edit_file.py,sha256=hxyVLiyndInX6hUeXwvX5u1mC3sq3cp8E-Q8UYy5Ffo,8145
124
+ beswarm/tools/edit_file.py,sha256=npe_j0FHOtZu8q3cG4oFtaReVC02HY01NjPlSi3pJrE,8369
125
125
  beswarm/tools/planner.py,sha256=lguBCS6kpwNPoXQvqH-WySabVubT82iyWOkJnjt6dXw,1265
126
126
  beswarm/tools/repomap.py,sha256=N09K0UgwjCN7Zjg_5TYlVsulp3n2fztYlS8twalChU8,45003
127
127
  beswarm/tools/screenshot.py,sha256=u6t8FCgW5YHJ_Oc4coo8e0F3wTusWE_-H8dFh1rBq9Q,1011
@@ -129,7 +129,7 @@ beswarm/tools/search_arxiv.py,sha256=9slwBemXjEqrd7-YgVmyMijPXlkhZCybEDRVhWVQ9B0
129
129
  beswarm/tools/search_web.py,sha256=B24amOnGHnmdV_6S8bw8O2PdhZRRIDtJjg-wXcfP7dQ,11859
130
130
  beswarm/tools/think.py,sha256=WLw-7jNIsnS6n8MMSYUin_f-BGLENFmnKM2LISEp0co,1760
131
131
  beswarm/tools/worker.py,sha256=DLYzMgKzpf4UYGNKKJix__DHw6LHtX_T9CLVaexDQMg,12909
132
- beswarm-0.1.70.dist-info/METADATA,sha256=bP0bacAMHQsIyrQd73s3e-ldVJhZIO9Oxu6-5B_9L5w,3553
133
- beswarm-0.1.70.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
134
- beswarm-0.1.70.dist-info/top_level.txt,sha256=pJw4O87wvt5882smuSO6DfByJz7FJ8SxxT8h9fHCmpo,8
135
- beswarm-0.1.70.dist-info/RECORD,,
132
+ beswarm-0.1.72.dist-info/METADATA,sha256=t_siOOATwK0Fw9cSjzLjUCe0ZkOFrCMOUL2RsMf33bg,3553
133
+ beswarm-0.1.72.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
134
+ beswarm-0.1.72.dist-info/top_level.txt,sha256=pJw4O87wvt5882smuSO6DfByJz7FJ8SxxT8h9fHCmpo,8
135
+ beswarm-0.1.72.dist-info/RECORD,,