unique_toolkit 2026.30.0.dev5__py3-none-any.whl → 2026.30.0.dev7__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.
- unique_toolkit/chat/cancellation.py +10 -0
- unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/message_persister.py +13 -7
- unique_toolkit/services/chat_service.py +7 -4
- {unique_toolkit-2026.30.0.dev5.dist-info → unique_toolkit-2026.30.0.dev7.dist-info}/METADATA +1 -1
- {unique_toolkit-2026.30.0.dev5.dist-info → unique_toolkit-2026.30.0.dev7.dist-info}/RECORD +6 -6
- {unique_toolkit-2026.30.0.dev5.dist-info → unique_toolkit-2026.30.0.dev7.dist-info}/WHEEL +0 -0
|
@@ -57,6 +57,16 @@ class CancellationWatcher:
|
|
|
57
57
|
def on_cancellation(self) -> TypedEventBus[CancellationEvent]:
|
|
58
58
|
return self._bus
|
|
59
59
|
|
|
60
|
+
@property
|
|
61
|
+
def assistant_message_id(self) -> str:
|
|
62
|
+
return self._assistant_message_id
|
|
63
|
+
|
|
64
|
+
def set_assistant_message_id(self, message_id: str) -> None:
|
|
65
|
+
"""Retarget polling to the active assistant segment."""
|
|
66
|
+
if self._cancelled:
|
|
67
|
+
return
|
|
68
|
+
self._assistant_message_id = message_id
|
|
69
|
+
|
|
60
70
|
async def check_cancellation_async(self) -> bool:
|
|
61
71
|
"""Poll the DB once. Returns ``True`` if the message was cancelled.
|
|
62
72
|
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"""Subscriber that persists assistant messages in response to stream events.
|
|
2
2
|
|
|
3
|
-
Single responsibility: owns every
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Single responsibility: owns every SDK write related to a streaming
|
|
4
|
+
response. Stream boundaries go through ``unique_sdk.Message.modify_async``
|
|
5
|
+
(``startedStreamingAt`` on start, final text + ``stoppedStreamingAt`` on
|
|
6
|
+
end); incremental text deltas go through
|
|
7
|
+
``unique_sdk.Message.create_event_async`` on the hot path. It also owns
|
|
8
|
+
the ``content_chunks`` used to filter references down to what was actually
|
|
9
|
+
cited.
|
|
7
10
|
|
|
8
11
|
The same message is streamed into once per agent round, and this subscriber
|
|
9
12
|
only sees per-request boundaries (never end-of-turn). It therefore stamps
|
|
@@ -66,7 +69,10 @@ def _now_utc_iso() -> str:
|
|
|
66
69
|
|
|
67
70
|
|
|
68
71
|
class MessagePersistingSubscriber:
|
|
69
|
-
"""Translates text lifecycle events into ``unique_sdk.Message
|
|
72
|
+
"""Translates text lifecycle events into ``unique_sdk.Message`` SDK writes.
|
|
73
|
+
|
|
74
|
+
Stream start/end are persisted via ``Message.modify_async``; incremental
|
|
75
|
+
:class:`TextUpdate` deltas are persisted via ``Message.create_event_async``.
|
|
70
76
|
|
|
71
77
|
Holds the retrieved chunks for the currently active stream (keyed by
|
|
72
78
|
``message_id``) so reference filtering on :class:`TextUpdate` and
|
|
@@ -139,8 +145,8 @@ class MessagePersistingSubscriber:
|
|
|
139
145
|
# written again in :meth:`on_ended`, so a dropped delta degrades
|
|
140
146
|
# to a slightly coarser UI update rather than data loss.
|
|
141
147
|
try:
|
|
142
|
-
await unique_sdk.Message.
|
|
143
|
-
|
|
148
|
+
await unique_sdk.Message.create_event_async(
|
|
149
|
+
messageId=event.message_id,
|
|
144
150
|
chatId=event.chat_id,
|
|
145
151
|
user_id=self._settings.context.auth.user_id.get_secret_value(),
|
|
146
152
|
company_id=self._settings.context.auth.company_id.get_secret_value(),
|
|
@@ -200,6 +200,11 @@ class ChatService(ChatServiceDeprecated):
|
|
|
200
200
|
"""Cancellation watcher for this chat session."""
|
|
201
201
|
return self._cancellation_watcher
|
|
202
202
|
|
|
203
|
+
def _set_assistant_message_id(self, message_id: str) -> None:
|
|
204
|
+
"""Point active assistant operations and cancellation polling at *message_id*."""
|
|
205
|
+
self._assistant_message_id = message_id
|
|
206
|
+
self._cancellation_watcher.set_assistant_message_id(message_id)
|
|
207
|
+
|
|
203
208
|
@property
|
|
204
209
|
def elicitation(self) -> ElicitationService:
|
|
205
210
|
"""Get the ElicitationService for this chat session."""
|
|
@@ -515,8 +520,7 @@ class ChatService(ChatServiceDeprecated):
|
|
|
515
520
|
response_turn_id=response_turn_id,
|
|
516
521
|
segment_index=segment_index,
|
|
517
522
|
)
|
|
518
|
-
|
|
519
|
-
self._assistant_message_id = chat_message.id or "unknown"
|
|
523
|
+
self._set_assistant_message_id(chat_message.id or "unknown")
|
|
520
524
|
return chat_message
|
|
521
525
|
|
|
522
526
|
async def create_assistant_message_async(
|
|
@@ -564,8 +568,7 @@ class ChatService(ChatServiceDeprecated):
|
|
|
564
568
|
response_turn_id=response_turn_id,
|
|
565
569
|
segment_index=segment_index,
|
|
566
570
|
)
|
|
567
|
-
|
|
568
|
-
self._assistant_message_id = chat_message.id or "unknown"
|
|
571
|
+
self._set_assistant_message_id(chat_message.id or "unknown")
|
|
569
572
|
return chat_message
|
|
570
573
|
|
|
571
574
|
def create_user_message(
|
{unique_toolkit-2026.30.0.dev5.dist-info → unique_toolkit-2026.30.0.dev7.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: unique-toolkit
|
|
3
|
-
Version: 2026.30.0.
|
|
3
|
+
Version: 2026.30.0.dev7
|
|
4
4
|
Summary:
|
|
5
5
|
Author: Cedric Klinkert, Martin Fadler, Sadique Sheik, Fabian Schläpfer, Pascal Hauri, Ejiroghene Oki-Peter, Rami Azouz, Ricardo Visini, Sanzio Monti
|
|
6
6
|
Author-email: Cedric Klinkert <cedric.klinkert@unique.ch>, Martin Fadler <martin.fadler@unique.ch>, Sadique Sheik <sadique@unique.ch>, Fabian Schläpfer <fabian@unique.ch>, Pascal Hauri <pascal@unique.ch>, Ejiroghene Oki-Peter <oki-peter.ejiroghene@unique.ai>, Rami Azouz <rami.ext@unique.ch>, Ricardo Visini <ricardo.visini@unique.ch>, Sanzio Monti <sanzio.monti@unique.ai>
|
|
@@ -245,7 +245,7 @@ unique_toolkit/app/unique_settings.py,sha256=-bYvxwCw_DvhSViHXgc-pYoNboxhHB8VG2L
|
|
|
245
245
|
unique_toolkit/app/verification.py,sha256=GxFFwcJMy25fCA_Xe89wKW7bgqOu8PAs5y8QpHF0GSc,3861
|
|
246
246
|
unique_toolkit/app/webhook.py,sha256=evpxLDnvz7P3D7-TV1XBkl8WcoldXpjOkw3tvFRxHr0,2368
|
|
247
247
|
unique_toolkit/chat/__init__.py,sha256=N9RubtxWN7UF0DlxP7YgeNTgjjk6p7AwkbGaVvuZCv0,938
|
|
248
|
-
unique_toolkit/chat/cancellation.py,sha256=
|
|
248
|
+
unique_toolkit/chat/cancellation.py,sha256=k5HMjpeBmofIiInwq5TjOR_5k91oq1bWG00lJXZSoJ0,5970
|
|
249
249
|
unique_toolkit/chat/constants.py,sha256=05kq6zjqUVB2d6_P7s-90nbljpB3ryxwCI-CAz0r2O4,83
|
|
250
250
|
unique_toolkit/chat/deprecated/service.py,sha256=8_XoopUWHT396Z_5gwMmsI6v4NGVgQirSJCYUW4Gx8c,9339
|
|
251
251
|
unique_toolkit/chat/functions.py,sha256=h-8MEhDpBbTRZc3A9JoDGMm-so3BWDdV6gv6NpXYIOg,54678
|
|
@@ -336,7 +336,7 @@ unique_toolkit/experimental/integrations/openai/streaming/event_routing/response
|
|
|
336
336
|
unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/text_delta_event_handler.py,sha256=JB-7W89K4pT6K8A9Z_f_Pow5p-EIGwLoLUSb9BI3qW4,3634
|
|
337
337
|
unique_toolkit/experimental/integrations/openai/streaming/event_routing/responses/tool_call_event_handler.py,sha256=iELT-H3-u6eG3D3X9Qz0QfTlDj-IfHBAq7bWYR7Dd5U,3198
|
|
338
338
|
unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/__init__.py,sha256=4wpUt9kzfPzncO9tlKcvOQUzQG5e6kVp5AKZI5grxOk,276
|
|
339
|
-
unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/message_persister.py,sha256=
|
|
339
|
+
unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/message_persister.py,sha256=JVA0lcF3_WCYEUgWqX53gO5Lj7zR1iFCCuNXuWDPGbo,8930
|
|
340
340
|
unique_toolkit/experimental/integrations/openai/streaming/event_routing/subscribers/progress_log_persister.py,sha256=VCYGZY3WSpI7mvVs2gO89-M0JenakW01BGfBfFkPDrw,3499
|
|
341
341
|
unique_toolkit/experimental/resources/__init__.py,sha256=KdMPaaneY0twZ-JBfwImRjXZaWT68NVuOIeqdNXFh_Y,3377
|
|
342
342
|
unique_toolkit/experimental/resources/content_folder/__init__.py,sha256=c5MUj1xIP10L7tcM4-hG2m1_yUMVfKr_jHAncUXVNvo,2492
|
|
@@ -395,7 +395,7 @@ unique_toolkit/monitoring/middleware.py,sha256=JNh5v_INAkexuLtXhCG9n5n2t6Pnf8ZdP
|
|
|
395
395
|
unique_toolkit/monitoring/registry.py,sha256=8r9jqaQoRHZveGRZe_GQvBzvQpmUV4cpw8Ej1ssDIdE,5056
|
|
396
396
|
unique_toolkit/protocols/support.py,sha256=x5edzbBmKAUuvm3oLFh52gkgQsqR5LU7M0t8RHK0DZk,5161
|
|
397
397
|
unique_toolkit/services/__init__.py,sha256=b9Wl7Wvz1JmZDbDexIZzBoXZ0wscXuczGAH8LoL-Qak,572
|
|
398
|
-
unique_toolkit/services/chat_service.py,sha256=
|
|
398
|
+
unique_toolkit/services/chat_service.py,sha256=MAueuSfATFJH8aSeNxbnBI_Ne1UgYUIk3i5F1f2ALFQ,97692
|
|
399
399
|
unique_toolkit/services/factory.py,sha256=7gNeanyHkgX23Iz7RMCQTCkE9gI5asCI11nXxM0jjx4,9832
|
|
400
400
|
unique_toolkit/services/knowledge_base.py,sha256=a9itNRxIrGDIuXkLiTLBsA-m2ncy8F8DwCLCXtWm_GY,43446
|
|
401
401
|
unique_toolkit/short_term_memory/__init__.py,sha256=2mI3AUrffgH7Yt-xS57EGqnHf7jnn6xquoKEhJqk3Wg,185
|
|
@@ -406,6 +406,6 @@ unique_toolkit/short_term_memory/service.py,sha256=2JMBEBn6GoyK-a0xvdcWpPft-3C74
|
|
|
406
406
|
unique_toolkit/smart_rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
407
407
|
unique_toolkit/smart_rules/compile.py,sha256=vRe0aMJWuVIK-VsqomgxQImzke7MDmwgSxxJfYCa7zw,1386
|
|
408
408
|
unique_toolkit/test_utilities/events.py,sha256=FLrhMh0A_mQutAUjoD0FdMcVQ4Gq31r35OVGzRjvLro,6760
|
|
409
|
-
unique_toolkit-2026.30.0.
|
|
410
|
-
unique_toolkit-2026.30.0.
|
|
411
|
-
unique_toolkit-2026.30.0.
|
|
409
|
+
unique_toolkit-2026.30.0.dev7.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
|
|
410
|
+
unique_toolkit-2026.30.0.dev7.dist-info/METADATA,sha256=tf1qkimmD41c7yoIbUFNmKEgYkiJx-zSyOA1trTxzgQ,7426
|
|
411
|
+
unique_toolkit-2026.30.0.dev7.dist-info/RECORD,,
|
|
File without changes
|