aient 1.2.6__py3-none-any.whl → 1.2.8__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.
@@ -632,6 +632,35 @@ class Messages:
632
632
  logging.error(f"Could not deserialize file {file_path}: {e}")
633
633
  return cls()
634
634
 
635
- def __getitem__(self, index: int) -> Message: return self._messages[index]
635
+ def __getitem__(self, index: Union[int, slice]) -> Union[Message, 'Messages']:
636
+ if isinstance(index, slice):
637
+ return Messages(*self._messages[index])
638
+ return self._messages[index]
639
+
640
+ def __setitem__(self, index: slice, value: 'Messages'):
641
+ if not isinstance(index, slice) or not isinstance(value, Messages):
642
+ raise TypeError("Unsupported operand type(s) for slice assignment")
643
+
644
+ # Basic slice assignment logic.
645
+ # A more robust implementation would handle step and negative indices.
646
+ start, stop, step = index.indices(len(self._messages))
647
+
648
+ if step != 1:
649
+ raise ValueError("Slice assignment with step is not supported.")
650
+
651
+ # Remove old providers from the index
652
+ for i in range(start, stop):
653
+ for provider in self._messages[i].provider():
654
+ self._notify_provider_removed(provider)
655
+
656
+ # Replace the slice in the list
657
+ self._messages[start:stop] = value._messages
658
+
659
+ # Add new providers to the index and set parent
660
+ for msg in value:
661
+ msg._parent_messages = self
662
+ for provider in msg.provider():
663
+ self._notify_provider_added(provider, msg)
664
+
636
665
  def __len__(self) -> int: return len(self._messages)
637
666
  def __iter__(self): return iter(self._messages)
@@ -1182,6 +1182,83 @@ Current time: {Texts(lambda: datetime.now().strftime("%Y-%m-%d %H:%M:%S"))}
1182
1182
  non_existent_provider = message.provider("non_existent")
1183
1183
  self.assertIsNone(non_existent_provider)
1184
1184
 
1185
+ async def test_zc_slicing_support(self):
1186
+ """测试 Messages 对象是否支持切片操作"""
1187
+ m1 = SystemMessage("1")
1188
+ m2 = UserMessage("2")
1189
+ m3 = AssistantMessage("3")
1190
+ m4 = UserMessage("4")
1191
+ messages = Messages(m1, m2, m3, m4)
1192
+
1193
+ # 1. Test basic slicing
1194
+ sliced_messages = messages[1:3]
1195
+ self.assertIsInstance(sliced_messages, Messages)
1196
+ self.assertEqual(len(sliced_messages), 2)
1197
+ self.assertIs(sliced_messages[0], m2)
1198
+ self.assertIs(sliced_messages[1], m3)
1199
+
1200
+ # 2. Test slicing with open end
1201
+ sliced_messages_open = messages[2:]
1202
+ self.assertIsInstance(sliced_messages_open, Messages)
1203
+ self.assertEqual(len(sliced_messages_open), 2)
1204
+ self.assertIs(sliced_messages_open[0], m3)
1205
+ self.assertIs(sliced_messages_open[1], m4)
1206
+
1207
+ # 3. Test slicing with open start
1208
+ sliced_messages_start = messages[:2]
1209
+ self.assertIsInstance(sliced_messages_start, Messages)
1210
+ self.assertEqual(len(sliced_messages_start), 2)
1211
+ self.assertIs(sliced_messages_start[0], m1)
1212
+ self.assertIs(sliced_messages_start[1], m2)
1213
+
1214
+ # 4. Test slicing a single element
1215
+ sliced_single = messages[2:3]
1216
+ self.assertIsInstance(sliced_single, Messages)
1217
+ self.assertEqual(len(sliced_single), 1)
1218
+ self.assertIs(sliced_single[0], m3)
1219
+
1220
+ async def test_zd_slice_assignment(self):
1221
+ """测试 Messages 对象的切片赋值功能"""
1222
+ # 1. Setup initial Messages objects
1223
+ m1 = SystemMessage("1")
1224
+ m2 = UserMessage("2")
1225
+ m3 = AssistantMessage("3")
1226
+ m4 = UserMessage("4")
1227
+ messages1 = Messages(m1, m2, m3, m4)
1228
+
1229
+ m5 = SystemMessage("5")
1230
+ m6 = UserMessage("6")
1231
+ messages2 = Messages(m5, m6)
1232
+
1233
+ # 2. Perform slice assignment
1234
+ # This should replace elements from index 1 onwards in messages1
1235
+ # with all elements from messages2
1236
+ messages1[1:] = messages2
1237
+
1238
+ # 3. Verify the result
1239
+ self.assertEqual(len(messages1), 3) # Should be m1, m5, m6
1240
+ self.assertIs(messages1[0], m1)
1241
+ self.assertIs(messages1[1], m5)
1242
+ self.assertIs(messages1[2], m6)
1243
+
1244
+ # 4. Test assigning from a slice, with different roles to prevent merging
1245
+ messages3 = Messages(UserMessage("A"), AssistantMessage("B"), UserMessage("C"))
1246
+ messages4 = Messages(SystemMessage("X"), AssistantMessage("Y"))
1247
+
1248
+ self.assertEqual(len(messages3), 3) # Verify length before assignment
1249
+
1250
+ messages3[1:2] = messages4[1:] # Replace AssistantMessage("B") with AssistantMessage("Y")
1251
+
1252
+ # We need to refresh to access .content property correctly
1253
+ await messages3.refresh()
1254
+
1255
+ self.assertEqual(len(messages3), 3)
1256
+ self.assertEqual(messages3[0].content, "A")
1257
+ self.assertEqual(messages3[1].content, "Y")
1258
+ self.assertEqual(messages3[2].content, "C")
1259
+ self.assertIsInstance(messages3[1], AssistantMessage)
1260
+
1261
+
1185
1262
  # ==============================================================================
1186
1263
  # 6. 演示
1187
1264
  # ==============================================================================
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aient
3
- Version: 1.2.6
3
+ Version: 1.2.8
4
4
  Summary: Aient: The Awakening of Agent.
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,8 +1,8 @@
1
1
  aient/__init__.py,sha256=SRfF7oDVlOOAi6nGKiJIUK6B_arqYLO9iSMp-2IZZps,21
2
2
  aient/architext/architext/__init__.py,sha256=79Ih1151rfcqZdr7F8HSZSTs_iT2SKd1xCkehMsXeXs,19
3
- aient/architext/architext/core.py,sha256=A1ZeZSJwcdl-svYA12uD2qSlU-wfNTVWvpSg8AF8_Gk,26015
3
+ aient/architext/architext/core.py,sha256=83eouPWfZt9G6TGCQguoOxOZM_-HRfXIUwjGzbxPoxw,27164
4
4
  aient/architext/test/openai_client.py,sha256=Dqtbmubv6vwF8uBqcayG0kbsiO65of7sgU2-DRBi-UM,4590
5
- aient/architext/test/test.py,sha256=trVHo2we0W8RN-0QNvP3sJ3yUpe08-34Ae_ZVNZJHdE,56378
5
+ aient/architext/test/test.py,sha256=26cQXXwCcCAVruM-ouM7ng8BQcE-glgmfkGa_EhPDU4,59388
6
6
  aient/architext/test/test_save_load.py,sha256=o8DqH6gDYZkFkQy-a7blqLtJTRj5e4a-Lil48pJ0V3g,3260
7
7
  aient/core/__init__.py,sha256=NxjebTlku35S4Dzr16rdSqSTWUvvwEeACe8KvHJnjPg,34
8
8
  aient/core/log_config.py,sha256=kz2_yJv1p-o3lUQOwA3qh-LSc3wMHv13iCQclw44W9c,274
@@ -35,8 +35,8 @@ aient/plugins/write_file.py,sha256=Jt8fOEwqhYiSWpCbwfAr1xoi_BmFnx3076GMhuL06uI,3
35
35
  aient/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  aient/utils/prompt.py,sha256=UcSzKkFE4-h_1b6NofI6xgk3GoleqALRKY8VBaXLjmI,11311
37
37
  aient/utils/scripts.py,sha256=VqtK4RFEx7KxkmcqG3lFDS1DxoNlFFGErEjopVcc8IE,40974
38
- aient-1.2.6.dist-info/licenses/LICENSE,sha256=XNdbcWldt0yaNXXWB_Bakoqnxb3OVhUft4MgMA_71ds,1051
39
- aient-1.2.6.dist-info/METADATA,sha256=aKQPqRvoFl1kd5GXFxOziGdeRhNAZDL8ksFspWdljoo,4841
40
- aient-1.2.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
41
- aient-1.2.6.dist-info/top_level.txt,sha256=3oXzrP5sAVvyyqabpeq8A2_vfMtY554r4bVE-OHBrZk,6
42
- aient-1.2.6.dist-info/RECORD,,
38
+ aient-1.2.8.dist-info/licenses/LICENSE,sha256=XNdbcWldt0yaNXXWB_Bakoqnxb3OVhUft4MgMA_71ds,1051
39
+ aient-1.2.8.dist-info/METADATA,sha256=d-gqNwZ00IPMuuqj3sKECwiC1BS1H-M9hUaKi6I74aA,4841
40
+ aient-1.2.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
41
+ aient-1.2.8.dist-info/top_level.txt,sha256=3oXzrP5sAVvyyqabpeq8A2_vfMtY554r4bVE-OHBrZk,6
42
+ aient-1.2.8.dist-info/RECORD,,
File without changes