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.
- aient/architext/architext/core.py +30 -1
- aient/architext/test/test.py +77 -0
- {aient-1.2.6.dist-info → aient-1.2.8.dist-info}/METADATA +1 -1
- {aient-1.2.6.dist-info → aient-1.2.8.dist-info}/RECORD +7 -7
- {aient-1.2.6.dist-info → aient-1.2.8.dist-info}/WHEEL +0 -0
- {aient-1.2.6.dist-info → aient-1.2.8.dist-info}/licenses/LICENSE +0 -0
- {aient-1.2.6.dist-info → aient-1.2.8.dist-info}/top_level.txt +0 -0
@@ -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
|
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)
|
aient/architext/test/test.py
CHANGED
@@ -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,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=
|
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=
|
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.
|
39
|
-
aient-1.2.
|
40
|
-
aient-1.2.
|
41
|
-
aient-1.2.
|
42
|
-
aient-1.2.
|
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
|
File without changes
|
File without changes
|