beswarm 0.2.95__py3-none-any.whl → 0.2.97__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.
@@ -457,6 +457,15 @@ class Message(ABC):
457
457
  return len(self._items)
458
458
 
459
459
  def __repr__(self): return f"Message(role='{self.role}', items={[i.name for i in self._items]})"
460
+
461
+ def __contains__(self, item: Any) -> bool:
462
+ """Checks if a ContextProvider is in the message."""
463
+ if not isinstance(item, ContextProvider):
464
+ return False
465
+ # The `in` operator on a list checks for equality,
466
+ # and our custom __eq__ on ContextProvider handles the comparison logic.
467
+ return item in self._items
468
+
460
469
  def __bool__(self) -> bool:
461
470
  return bool(self._items)
462
471
  def get(self, key: str, default: Any = None) -> Any:
@@ -717,3 +726,13 @@ class Messages:
717
726
 
718
727
  def __len__(self) -> int: return len(self._messages)
719
728
  def __iter__(self): return iter(self._messages)
729
+
730
+ def __contains__(self, item: Any) -> bool:
731
+ """Checks if a Message or ContextProvider is in the collection."""
732
+ if isinstance(item, Message):
733
+ # Check for object identity
734
+ return any(item is msg for msg in self._messages)
735
+ if isinstance(item, ContextProvider):
736
+ # Check if any message contains the provider
737
+ return any(item in msg for msg in self._messages)
738
+ return False
@@ -1409,6 +1409,31 @@ Files: {Files(visible=True, name="files")}
1409
1409
  # 5. 验证 provider 索引
1410
1410
  self.assertIsNotNone(messages.provider(text_provider.name))
1411
1411
 
1412
+ async def test_zi_provider_in_message_and_messages(self):
1413
+ """测试 `in` 操作符是否能检查 provider 是否存在于 Message 或 Messages 中"""
1414
+ # 1. 准备 providers 和 messages
1415
+ text_hi = Texts("hi")
1416
+ text_hello = Texts("hello")
1417
+ text_world = Texts("world")
1418
+
1419
+ message = UserMessage(text_hello, text_hi)
1420
+ messages_collection = Messages(SystemMessage("System"), message)
1421
+
1422
+ # 2. 测试 `in` Message
1423
+ self.assertTrue(Texts("hi") in UserMessage(Texts("hello"), Texts("hi")))
1424
+ self.assertTrue(text_hi in message)
1425
+ self.assertTrue(text_hello in message)
1426
+ self.assertFalse(text_world in message)
1427
+
1428
+ # 3. 测试 `in` Messages
1429
+ self.assertTrue(text_hi in messages_collection)
1430
+ self.assertTrue(text_hello in messages_collection)
1431
+ self.assertFalse(text_world in messages_collection)
1432
+
1433
+ # 4. 测试一个 Message 对象是否在 Messages 中
1434
+ self.assertTrue(message in messages_collection)
1435
+ self.assertFalse(UserMessage("not in collection") in messages_collection)
1436
+
1412
1437
 
1413
1438
  # ==============================================================================
1414
1439
  # 6. 演示
@@ -7,7 +7,7 @@ from .registry import register_tool
7
7
 
8
8
  # 读取文件内容
9
9
  @register_tool()
10
- def read_file(file_path):
10
+ def read_file(file_path, head: int = None):
11
11
  """
12
12
  Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string.
13
13
 
@@ -16,6 +16,7 @@ Description: Request to read the contents of a file at the specified path. Use t
16
16
 
17
17
  参数:
18
18
  file_path: 要读取的文件路径,(required) The path of the file to read (relative to the current working directory)
19
+ head: (可选) 读取文件的前N行,默认为None,读取整个文件
19
20
 
20
21
  返回:
21
22
  文件内容的字符串
@@ -161,13 +162,23 @@ Examples:
161
162
  # 捕获在此块中可能发生的其他错误,例如未被早期检查捕获的文件读取问题
162
163
  return f"<tool_error>处理通用文件 '{file_path}' 时发生错误: {e}</tool_error>"
163
164
 
164
- if file_path.lower().endswith('.csv'):
165
- lines = text_content.splitlines(True)
166
- if len(lines) > 500:
167
- top_lines = lines[:250]
168
- bottom_lines = lines[-250:]
169
- omitted_count = len(lines) - 500
170
- text_content = "".join(top_lines) + f"\n... (中间省略了 {omitted_count} 行) ...\n" + "".join(bottom_lines)
165
+ if head is not None:
166
+ try:
167
+ num_lines = int(head)
168
+ if num_lines > 0:
169
+ lines = text_content.splitlines(True)
170
+ return "".join(lines[:num_lines])
171
+ except (ValueError, TypeError):
172
+ # Invalid head value, ignore and proceed with normal logic.
173
+ pass
174
+
175
+ # if file_path.lower().endswith('.csv'):
176
+ # lines = text_content.splitlines(True)
177
+ # if len(lines) > 500:
178
+ # top_lines = lines[:250]
179
+ # bottom_lines = lines[-250:]
180
+ # omitted_count = len(lines) - 500
181
+ # text_content = "".join(top_lines) + f"\n... (中间省略了 {omitted_count} 行) ...\n" + "".join(bottom_lines)
171
182
 
172
183
  # 返回文件内容
173
184
  return text_content
@@ -182,6 +193,6 @@ Examples:
182
193
 
183
194
  if __name__ == "__main__":
184
195
  # python -m beswarm.aient.aient.plugins.read_file
185
- result = read_file("./work/cax/Lenia Notebook.ipynb")
196
+ result = read_file("./work/cax/Lenia Notebook.ipynb", head=10)
186
197
  print(result)
187
198
  print(len(result))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.2.95
3
+ Version: 0.2.97
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -9,9 +9,9 @@ beswarm/agents/chatgroup.py,sha256=PzrmRcDKAbB7cxL16nMod_CzPosDV6bfTmXxQVuv-AQ,1
9
9
  beswarm/agents/planact.py,sha256=m78GIbgv8VGMcSPAU_Jk3YAT-1mHykEo5xuF6kNoxx8,18279
10
10
  beswarm/aient/aient/__init__.py,sha256=SRfF7oDVlOOAi6nGKiJIUK6B_arqYLO9iSMp-2IZZps,21
11
11
  beswarm/aient/aient/architext/architext/__init__.py,sha256=79Ih1151rfcqZdr7F8HSZSTs_iT2SKd1xCkehMsXeXs,19
12
- beswarm/aient/aient/architext/architext/core.py,sha256=IHN1d8Pe1oqaFSS1EQ3OpxCJydiLB3goL5n2uohr5Q8,29737
12
+ beswarm/aient/aient/architext/architext/core.py,sha256=_o5gI5XF6e4kQo4L4x8Q1Tb7C1U0GANm24gJmvAgoXE,30546
13
13
  beswarm/aient/aient/architext/test/openai_client.py,sha256=Dqtbmubv6vwF8uBqcayG0kbsiO65of7sgU2-DRBi-UM,4590
14
- beswarm/aient/aient/architext/test/test.py,sha256=o_lxUYqGnt3gAlIKBqxNe9OrqT5v7sjlPXKMVO6e5uw,65629
14
+ beswarm/aient/aient/architext/test/test.py,sha256=G64knZR1rSo0hr8lZPaWWJizEq1A8RGCzcN0e9uhZEM,66729
15
15
  beswarm/aient/aient/architext/test/test_save_load.py,sha256=o8DqH6gDYZkFkQy-a7blqLtJTRj5e4a-Lil48pJ0V3g,3260
16
16
  beswarm/aient/aient/core/__init__.py,sha256=NxjebTlku35S4Dzr16rdSqSTWUvvwEeACe8KvHJnjPg,34
17
17
  beswarm/aient/aient/core/log_config.py,sha256=kz2_yJv1p-o3lUQOwA3qh-LSc3wMHv13iCQclw44W9c,274
@@ -34,7 +34,7 @@ beswarm/aient/aient/plugins/excute_command.py,sha256=b-rxsyFN6_HnZJAhUi9Qsp8iJ6X
34
34
  beswarm/aient/aient/plugins/get_time.py,sha256=Ih5XIW5SDAIhrZ9W4Qe5Hs1k4ieKPUc_LAd6ySNyqZk,654
35
35
  beswarm/aient/aient/plugins/image.py,sha256=ZElCIaZznE06TN9xW3DrSukS7U3A5_cjk1Jge4NzPxw,2072
36
36
  beswarm/aient/aient/plugins/list_directory.py,sha256=V_uKkLx_fQDL5z__bSDC-PqAP-o32KmQW6Pdhx0Fx0s,1433
37
- beswarm/aient/aient/plugins/read_file.py,sha256=AOGGzSzkALG1R_ncpDmegX_zKFZBZr8ZhTBQCiwhZfU,8691
37
+ beswarm/aient/aient/plugins/read_file.py,sha256=qHAhdesOr1VMOCDkeHNvI8UV2ZI98HmJl6GhN4Aq9dU,9183
38
38
  beswarm/aient/aient/plugins/read_image.py,sha256=4FbIiMNVFUQpNyiH5ApGSRvOD9ujcXGyuqlGTJMd7ac,4017
39
39
  beswarm/aient/aient/plugins/readonly.py,sha256=qK5-kBM3NDH1b-otFxFHpAjV5BXEY_e7cTWBcpP7G5k,710
40
40
  beswarm/aient/aient/plugins/registry.py,sha256=YknzhieU_8nQ3oKlUSSWDB4X7t2Jx0JnqT2Jd9Xsvfk,3574
@@ -122,7 +122,7 @@ beswarm/tools/search_web.py,sha256=0fTeczXiOX_LJQGaLEGbuJtIPzofeuquGWEt3yDMtVw,1
122
122
  beswarm/tools/subtasks.py,sha256=NHDnmUhUPgDQKBACnpgErpFJRcsH0w_Q9VsyQjNvNHA,12658
123
123
  beswarm/tools/worker.py,sha256=mQ1qdrQ8MgL99byAbTvxfEByFFGN9mty3UHqHjARMQ8,2331
124
124
  beswarm/tools/write_csv.py,sha256=u0Hq18Ksfheb52MVtyLNCnSDHibITpsYBPs2ub7USYA,1466
125
- beswarm-0.2.95.dist-info/METADATA,sha256=DICmBt1fSQnjROkMa17nt951VwUOoUHfxvBVoWSqTuQ,3878
126
- beswarm-0.2.95.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
127
- beswarm-0.2.95.dist-info/top_level.txt,sha256=pJw4O87wvt5882smuSO6DfByJz7FJ8SxxT8h9fHCmpo,8
128
- beswarm-0.2.95.dist-info/RECORD,,
125
+ beswarm-0.2.97.dist-info/METADATA,sha256=DkJNgq-l2GKOpgFRJP2UZ0oFvdJjxyFSyAiQrIE2gew,3878
126
+ beswarm-0.2.97.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
127
+ beswarm-0.2.97.dist-info/top_level.txt,sha256=pJw4O87wvt5882smuSO6DfByJz7FJ8SxxT8h9fHCmpo,8
128
+ beswarm-0.2.97.dist-info/RECORD,,