unique_toolkit 2026.34.0.dev9__py3-none-any.whl → 2026.34.0.dev11__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.
@@ -36,6 +36,8 @@ class HallucinationEvaluation(Evaluation):
36
36
  self.config = config
37
37
  self._company_id = event.company_id
38
38
  self._user_id = event.user_id
39
+ self._chat_id = event.payload.chat_id
40
+ self._assistant_id = event.payload.assistant_id
39
41
  self._reference_manager = reference_manager
40
42
  self._user_message = event.payload.user_message.text
41
43
  super().__init__(EvaluationMetricName.HALLUCINATION)
@@ -75,6 +77,8 @@ class HallucinationEvaluation(Evaluation):
75
77
  output_text=loop_response.message.text,
76
78
  ),
77
79
  config=self.config,
80
+ chat_id=self._chat_id,
81
+ assistant_id=self._assistant_id,
78
82
  )
79
83
 
80
84
  score_to_label = self.config.score_to_label
@@ -59,4 +59,6 @@ class HallucinationEvaluator:
59
59
  user_id=self.event.user_id,
60
60
  input=input,
61
61
  config=config,
62
+ chat_id=self.event.payload.chat_id,
63
+ assistant_id=self.event.payload.assistant_id,
62
64
  )
@@ -37,6 +37,8 @@ async def check_hallucination(
37
37
  user_id: str,
38
38
  input: EvaluationMetricInput,
39
39
  config: EvaluationMetricConfig,
40
+ chat_id: str | None = None,
41
+ assistant_id: str | None = None,
40
42
  ) -> EvaluationMetricResult:
41
43
  """
42
44
  Analyzes the level of hallucination in the generated output by comparing it with the provided input
@@ -77,7 +79,12 @@ async def check_hallucination(
77
79
  try:
78
80
  msgs = _get_msgs(input, config)
79
81
  result = await LanguageModelService.complete_async_util(
80
- company_id=company_id, user_id=user_id, messages=msgs, model_name=model_name
82
+ company_id=company_id,
83
+ user_id=user_id,
84
+ messages=msgs,
85
+ model_name=model_name,
86
+ chat_id=chat_id,
87
+ assistant_id=assistant_id,
81
88
  )
82
89
  except Exception as e:
83
90
  error_message = "Error occurred during hallucination metric analysis"
@@ -36,6 +36,8 @@ def _make_event() -> SimpleNamespace:
36
36
  company_id="company_1",
37
37
  user_id="user_1",
38
38
  payload=SimpleNamespace(
39
+ chat_id="chat_1",
40
+ assistant_id="assistant_1",
39
41
  user_message=SimpleNamespace(text="what is ACME revenue?"),
40
42
  ),
41
43
  )
@@ -61,8 +63,18 @@ def captured_context(monkeypatch: pytest.MonkeyPatch) -> dict:
61
63
  """Patch check_hallucination to capture the context_texts it receives."""
62
64
  captured: dict = {}
63
65
 
64
- async def _fake_check_hallucination(*, company_id, user_id, input, config):
66
+ async def _fake_check_hallucination(
67
+ *,
68
+ company_id,
69
+ user_id,
70
+ input,
71
+ config,
72
+ chat_id,
73
+ assistant_id,
74
+ ):
65
75
  captured["context_texts"] = list(input.context_texts or [])
76
+ captured["chat_id"] = chat_id
77
+ captured["assistant_id"] = assistant_id
66
78
  return EvaluationMetricResult(
67
79
  name=EvaluationMetricName.HALLUCINATION,
68
80
  value="LOW",
@@ -86,6 +98,8 @@ async def test_external_context_is_appended(captured_context: dict) -> None:
86
98
 
87
99
  # No chunks → context comes solely from the external (MCP) source.
88
100
  assert captured_context["context_texts"] == ["ACME revenue: 1M"]
101
+ assert captured_context["chat_id"] == "chat_1"
102
+ assert captured_context["assistant_id"] == "assistant_1"
89
103
  assert result.value == "LOW"
90
104
  assert result.is_positive is True
91
105
 
@@ -1,6 +1,7 @@
1
1
  """Tests for hallucination evaluation utils."""
2
2
 
3
3
  from typing import List, Optional
4
+ from unittest.mock import AsyncMock
4
5
 
5
6
  import pytest
6
7
 
@@ -14,6 +15,7 @@ from unique_toolkit.agentic.evaluation.hallucination.utils import (
14
15
  _from_order_source_selection_mode,
15
16
  _from_original_response_source_selection_mode,
16
17
  _get_msgs,
18
+ check_hallucination,
17
19
  context_text_from_stream_response,
18
20
  )
19
21
  from unique_toolkit.agentic.evaluation.schemas import EvaluationMetricInput
@@ -25,8 +27,11 @@ from unique_toolkit.language_model.infos import (
25
27
  ModelCapabilities,
26
28
  )
27
29
  from unique_toolkit.language_model.schemas import (
30
+ LanguageModelAssistantMessage,
31
+ LanguageModelCompletionChoice,
28
32
  LanguageModelMessageRole,
29
33
  LanguageModelMessages,
34
+ LanguageModelResponse,
30
35
  LanguageModelStreamResponse,
31
36
  )
32
37
 
@@ -101,6 +106,49 @@ def evaluation_input() -> EvaluationMetricInput:
101
106
  )
102
107
 
103
108
 
109
+ @pytest.mark.ai
110
+ @pytest.mark.asyncio
111
+ async def test_check_hallucination__forwards_attribution_ids(
112
+ monkeypatch: pytest.MonkeyPatch,
113
+ hallucination_config: HallucinationConfig,
114
+ evaluation_input: EvaluationMetricInput,
115
+ ) -> None:
116
+ """Purpose: Verify hallucination completion receives chat attribution IDs.
117
+ Why this matters: Secondary evaluator usage must link to the originating chat.
118
+ Setup summary: Mock the completion utility, run the check, and inspect its call.
119
+ """
120
+ complete_async_util = AsyncMock(
121
+ return_value=LanguageModelResponse(
122
+ choices=[
123
+ LanguageModelCompletionChoice(
124
+ index=0,
125
+ message=LanguageModelAssistantMessage(
126
+ content='{"value": "low", "reason": "grounded"}'
127
+ ),
128
+ finish_reason="stop",
129
+ )
130
+ ]
131
+ )
132
+ )
133
+ monkeypatch.setattr(
134
+ "unique_toolkit.agentic.evaluation.hallucination.utils."
135
+ "LanguageModelService.complete_async_util",
136
+ complete_async_util,
137
+ )
138
+
139
+ await check_hallucination(
140
+ company_id="company_1",
141
+ user_id="user_1",
142
+ input=evaluation_input.model_copy(update={"history_messages": []}),
143
+ config=hallucination_config,
144
+ chat_id="chat_1",
145
+ assistant_id="assistant_1",
146
+ )
147
+
148
+ assert complete_async_util.await_args.kwargs["chat_id"] == "chat_1"
149
+ assert complete_async_util.await_args.kwargs["assistant_id"] == "assistant_1"
150
+
151
+
104
152
  @pytest.mark.ai
105
153
  def test_default_source_selection_mode__selects_chunks__by_source_id_match(
106
154
  sample_references: List[ContentReference],
@@ -41,6 +41,18 @@ from .constants import (
41
41
  logger = logging.getLogger(f"toolkit.language_model.{__name__}")
42
42
 
43
43
 
44
+ def _completion_headers(
45
+ chat_id: str | None,
46
+ assistant_id: str | None,
47
+ ) -> dict[str, str] | None:
48
+ headers: dict[str, str] = {}
49
+ if chat_id:
50
+ headers["x-chat-id"] = chat_id
51
+ if assistant_id:
52
+ headers["x-assistant-id"] = assistant_id
53
+ return headers or None
54
+
55
+
44
56
  def complete(
45
57
  company_id: str,
46
58
  messages: LanguageModelMessages | list[ChatCompletionMessageParam],
@@ -52,6 +64,8 @@ def complete(
52
64
  structured_output_model: type[BaseModel] | dict[str, Any] | None = None,
53
65
  structured_output_enforce_schema: bool = False,
54
66
  user_id: str | None = None,
67
+ chat_id: str | None = None,
68
+ assistant_id: str | None = None,
55
69
  ) -> LanguageModelResponse:
56
70
  """Call the completion endpoint synchronously without streaming the response.
57
71
 
@@ -87,14 +101,26 @@ def complete(
87
101
  )
88
102
 
89
103
  try:
90
- response = unique_sdk.ChatCompletion.create(
91
- company_id=company_id,
92
- user_id=user_id,
93
- model=model, # pyright: ignore[reportArgumentType]
94
- messages=messages_dict, # pyright: ignore[reportArgumentType]
95
- timeout=timeout,
96
- options=options,
97
- )
104
+ headers = _completion_headers(chat_id, assistant_id)
105
+ if headers is None:
106
+ response = unique_sdk.ChatCompletion.create(
107
+ company_id=company_id,
108
+ user_id=user_id,
109
+ model=model, # pyright: ignore[reportArgumentType]
110
+ messages=messages_dict, # pyright: ignore[reportArgumentType]
111
+ timeout=timeout,
112
+ options=options,
113
+ )
114
+ else:
115
+ response = unique_sdk.ChatCompletion.create(
116
+ company_id=company_id,
117
+ user_id=user_id,
118
+ headers=headers,
119
+ model=model, # pyright: ignore[reportArgumentType]
120
+ messages=messages_dict, # pyright: ignore[reportArgumentType]
121
+ timeout=timeout,
122
+ options=options,
123
+ )
98
124
  return LanguageModelResponse(**response)
99
125
  except Exception as e:
100
126
  logger.error(f"Error completing: {e}")
@@ -112,6 +138,8 @@ async def complete_async(
112
138
  other_options: dict[str, Any] | None = None,
113
139
  structured_output_model: type[BaseModel] | dict[str, Any] | None = None,
114
140
  structured_output_enforce_schema: bool = False,
141
+ chat_id: str | None = None,
142
+ assistant_id: str | None = None,
115
143
  ) -> LanguageModelResponse:
116
144
  """Call the completion endpoint asynchronously without streaming the response.
117
145
 
@@ -156,14 +184,26 @@ async def complete_async(
156
184
  )
157
185
 
158
186
  try:
159
- response = await unique_sdk.ChatCompletion.create_async(
160
- company_id=company_id,
161
- user_id=user_id,
162
- model=model, # pyright: ignore[reportArgumentType]
163
- messages=messages_dict, # pyright: ignore[reportArgumentType]
164
- timeout=timeout,
165
- options=options,
166
- )
187
+ headers = _completion_headers(chat_id, assistant_id)
188
+ if headers is None:
189
+ response = await unique_sdk.ChatCompletion.create_async(
190
+ company_id=company_id,
191
+ user_id=user_id,
192
+ model=model, # pyright: ignore[reportArgumentType]
193
+ messages=messages_dict, # pyright: ignore[reportArgumentType]
194
+ timeout=timeout,
195
+ options=options,
196
+ )
197
+ else:
198
+ response = await unique_sdk.ChatCompletion.create_async(
199
+ company_id=company_id,
200
+ user_id=user_id,
201
+ headers=headers,
202
+ model=model, # pyright: ignore[reportArgumentType]
203
+ messages=messages_dict, # pyright: ignore[reportArgumentType]
204
+ timeout=timeout,
205
+ options=options,
206
+ )
167
207
  return LanguageModelResponse(**response)
168
208
  except Exception as e:
169
209
  logger.exception(f"Error completing: {e}")
@@ -434,6 +474,8 @@ def complete_with_references(
434
474
  tools: list[LanguageModelTool | LanguageModelToolDescription] | None = None,
435
475
  start_text: str | None = None,
436
476
  other_options: dict[str, Any] | None = None,
477
+ chat_id: str | None = None,
478
+ assistant_id: str | None = None,
437
479
  ) -> LanguageModelStreamResponse:
438
480
  # Use toolkit language model functions for chat completion
439
481
 
@@ -446,6 +488,8 @@ def complete_with_references(
446
488
  timeout=timeout,
447
489
  tools=tools,
448
490
  other_options=other_options,
491
+ chat_id=chat_id,
492
+ assistant_id=assistant_id,
449
493
  )
450
494
 
451
495
  return _create_language_model_stream_response_with_references(
@@ -467,6 +511,8 @@ async def complete_with_references_async(
467
511
  tools: list[LanguageModelTool | LanguageModelToolDescription] | None = None,
468
512
  start_text: str | None = None,
469
513
  other_options: dict[str, Any] | None = None,
514
+ chat_id: str | None = None,
515
+ assistant_id: str | None = None,
470
516
  ) -> LanguageModelStreamResponse:
471
517
  # Use toolkit language model functions for chat completion
472
518
  response = await complete_async(
@@ -478,6 +524,8 @@ async def complete_with_references_async(
478
524
  timeout=timeout,
479
525
  tools=tools,
480
526
  other_options=other_options,
527
+ chat_id=chat_id,
528
+ assistant_id=assistant_id,
481
529
  )
482
530
 
483
531
  return _create_language_model_stream_response_with_references(
@@ -1672,8 +1672,9 @@ class LanguageModelInfo(BaseModel):
1672
1672
  version="claude-sonnet-5",
1673
1673
  encoder_name=EncoderName.O200K_BASE, # TODO: Update encoder with litellm
1674
1674
  token_limits=LanguageModelTokenLimits(
1675
- token_limit_input=1_000_000,
1676
- token_limit_output=128_000,
1675
+ # TODO: Remove the 1.3 adjustment once a proper Claude tokenizer is implemented. UN-24123
1676
+ token_limit_input=int(1_000_000 / 1.3),
1677
+ token_limit_output=int(128_000 / 1.3),
1677
1678
  ),
1678
1679
  info_cutoff_at=date(2026, 1, 1),
1679
1680
  published_at=date(2026, 7, 1),
@@ -85,7 +85,11 @@ class LanguageModelService:
85
85
  """
86
86
  Initialize the LanguageModelService with an event.
87
87
  """
88
- return cls(company_id=event.company_id, user_id=event.user_id)
88
+ service = cls(company_id=event.company_id, user_id=event.user_id)
89
+ if isinstance(event, AssistantWebhookEvent):
90
+ service._chat_id = event.payload.chat_id
91
+ service._assistant_id = event.payload.assistant_id
92
+ return service
89
93
 
90
94
  @classmethod
91
95
  def from_settings(cls, settings: UniqueSettings | str | None = None, **kwargs: Any):
@@ -245,6 +249,8 @@ class LanguageModelService:
245
249
  other_options=other_options,
246
250
  structured_output_model=structured_output_model,
247
251
  structured_output_enforce_schema=structured_output_enforce_schema,
252
+ chat_id=self._chat_id,
253
+ assistant_id=self._assistant_id,
248
254
  )
249
255
 
250
256
  async def complete_async(
@@ -273,6 +279,8 @@ class LanguageModelService:
273
279
  other_options=other_options,
274
280
  structured_output_model=structured_output_model,
275
281
  structured_output_enforce_schema=structured_output_enforce_schema,
282
+ chat_id=self._chat_id,
283
+ assistant_id=self._assistant_id,
276
284
  )
277
285
 
278
286
  @classmethod
@@ -289,6 +297,8 @@ class LanguageModelService:
289
297
  structured_output_model: Optional[Type[BaseModel] | dict[str, Any]] = None,
290
298
  structured_output_enforce_schema: bool = False,
291
299
  other_options: Optional[dict[str, Any]] = None,
300
+ chat_id: str | None = None,
301
+ assistant_id: str | None = None,
292
302
  ) -> LanguageModelResponse:
293
303
  """
294
304
  Calls the completion endpoint asynchronously without streaming the response.
@@ -305,6 +315,8 @@ class LanguageModelService:
305
315
  other_options=other_options,
306
316
  structured_output_model=structured_output_model,
307
317
  structured_output_enforce_schema=structured_output_enforce_schema,
318
+ chat_id=chat_id,
319
+ assistant_id=assistant_id,
308
320
  )
309
321
 
310
322
  def complete_with_references(
@@ -330,6 +342,8 @@ class LanguageModelService:
330
342
  other_options=other_options,
331
343
  tools=tools,
332
344
  start_text=start_text,
345
+ chat_id=self._chat_id,
346
+ assistant_id=self._assistant_id,
333
347
  )
334
348
 
335
349
  async def complete_with_references_async(
@@ -355,4 +369,6 @@ class LanguageModelService:
355
369
  other_options=other_options,
356
370
  tools=tools,
357
371
  start_text=start_text,
372
+ chat_id=self._chat_id,
373
+ assistant_id=self._assistant_id,
358
374
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: unique-toolkit
3
- Version: 2026.34.0.dev9
3
+ Version: 2026.34.0.dev11
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>
@@ -16,7 +16,7 @@ Requires-Dist: sseclient>=0.0.27,<0.0.28
16
16
  Requires-Dist: openai>=1.105.0,<3
17
17
  Requires-Dist: platformdirs>=4.0.0,<5
18
18
  Requires-Dist: pillow>=12.1.1
19
- Requires-Dist: unique-sdk>=2026.34.0.dev4,<2026.34.0rc0
19
+ Requires-Dist: unique-sdk>=2026.34.0.dev5,<2026.34.0rc0
20
20
  Requires-Dist: jambo>=0.1.2,<0.2
21
21
  Requires-Dist: jinja2>=3.1.6,<4
22
22
  Requires-Dist: docxtpl>=0.20.1,<0.21
@@ -94,20 +94,20 @@ unique_toolkit/agentic/evaluation/context_relevancy/service.py,sha256=RAmV21RXiy
94
94
  unique_toolkit/agentic/evaluation/evaluation_manager.py,sha256=OIh1LhkKQFIpori06Ikaidc1HtIFItVxUsYp73XLCeg,8801
95
95
  unique_toolkit/agentic/evaluation/exception.py,sha256=6DtYhsOdJ7WnbpjY45pb9m7VN4ZbRACsQ-VRLeHZXgs,911
96
96
  unique_toolkit/agentic/evaluation/hallucination/constants.py,sha256=uEQR-CNKmeXizDaLOLHhwTZ0iYUmFwoKeMLHPm4M0sY,3208
97
- unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py,sha256=HvaaRJ4D4pz_77IT2ZbL-OMfVSEOcmcalecOPnBsiRI,4548
97
+ unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py,sha256=R_GKauBDj-u-taDGG1k6JULgEyFcOceaOqjTTO6fwZs,4730
98
98
  unique_toolkit/agentic/evaluation/hallucination/prompts/__init__.py,sha256=4KFYMZsB3fJUKzoiUJE1npZ0gueWgvceB32EUrN-v7A,343
99
99
  unique_toolkit/agentic/evaluation/hallucination/prompts/system_prompt.j2,sha256=sDUX6G645Ba40D_qKu4cUI8g-sJOfG8JpZreTNFgf7M,2616
100
100
  unique_toolkit/agentic/evaluation/hallucination/prompts/user_prompt.j2,sha256=mD_qE9fOkyc1XXrebFt097ddx8bTlA6lbY04hKSQmWs,273
101
- unique_toolkit/agentic/evaluation/hallucination/service.py,sha256=WJF1f45uHnYLx1S4TW31bSFobFpV-YlOS3G_zMhuBVU,2512
102
- unique_toolkit/agentic/evaluation/hallucination/utils.py,sha256=EjPdiE1x-yWZnFYS6cQKUUL3tZptdhayMbh6D5wxBVE,15357
101
+ unique_toolkit/agentic/evaluation/hallucination/service.py,sha256=QSPsRxx2H-YpSR2Jn7zJKtwZfZ7elTPAFQiYvM3gYfs,2618
102
+ unique_toolkit/agentic/evaluation/hallucination/utils.py,sha256=QVXO0hFrsGxvbgTwC40RSfrLhE_1of1oBrrfcafk10Y,15531
103
103
  unique_toolkit/agentic/evaluation/output_parser.py,sha256=0FDo8YY_Dc4qlTNeYyQkznzIFj9aX9wMrLOTbhhTl6g,1418
104
104
  unique_toolkit/agentic/evaluation/schemas.py,sha256=RT0O-AXSOf1zV3fDbUfn7V6bOIA01pkzui02Uad9E3Y,3815
105
105
  unique_toolkit/agentic/evaluation/tests/fixtures.py,sha256=Q-ughTfDiAdsMKbBVGzFiBucFdAx-FXgJ9iqp5xMyPs,2801
106
106
  unique_toolkit/agentic/evaluation/tests/test_config.py,sha256=p7xFQ7KE_yU8jGpqYA7ntAYe5Vln33wd6nwv3FM9XfI,8327
107
107
  unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py,sha256=-GRxH70vzvrZG6Hz0igH6i2CqM7Z9jjKt3396xWDh84,12011
108
108
  unique_toolkit/agentic/evaluation/tests/test_hallucination_constants.py,sha256=A77nRcniI7hUf640f1sTvCAibQbJE30ikbz1RX4fltw,20478
109
- unique_toolkit/agentic/evaluation/tests/test_hallucination_external_context.py,sha256=mIHxQDxW7oUbvOGH5bMcoV_yKr9BZvJlgE0JYicLdsM,3949
110
- unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py,sha256=ogds7jUwwGJHdabhayhEY_1JbiaVv7Fxh58TMwgbqgw,37537
109
+ unique_toolkit/agentic/evaluation/tests/test_hallucination_external_context.py,sha256=3JR9WfBWazX7a1h3uq77Q6kSKm8Mt-aAW8KUYxJUw14,4303
110
+ unique_toolkit/agentic/evaluation/tests/test_hallucination_utils.py,sha256=JzFXSH3k1qnSDbZEQy5ftKiVnVL_jS1PTpp3H3DjewI,39218
111
111
  unique_toolkit/agentic/evaluation/tests/test_output_parser.py,sha256=KfltytmvqnPWLhmZpBXqcRmnlYorw_USwM5rkLVv8so,5179
112
112
  unique_toolkit/agentic/evaluation/tests/test_prompt_loaders.py,sha256=zBREdlKf5tdDyB8XSaNgpQv3-tuZJoYteeJrp6WMWDM,11897
113
113
  unique_toolkit/agentic/evaluation/utils.py,sha256=HmyPaDV8wdW-_gOjjW-wDaMKgdrsP5-SHP7OqTmGI_A,264
@@ -391,14 +391,14 @@ unique_toolkit/language_model/_responses_api_utils.py,sha256=w2ZyleOQcWLpOWGJNNb
391
391
  unique_toolkit/language_model/builder.py,sha256=KwBzsD6-fvQnB4p2I7M-5Tk6j4tmQ973MYwU1ulXFb4,4526
392
392
  unique_toolkit/language_model/constants.py,sha256=B-topqW0r83dkC_25DeQfnPk3n53qzIHUCBS7YJ0-1U,119
393
393
  unique_toolkit/language_model/default_language_model.py,sha256=mcyuFs_V6tp52C8xJSHiEHO4kFGj6xed1gvozvCRD7k,1181
394
- unique_toolkit/language_model/functions.py,sha256=uYIsVQfF4uwW6cftlKhQElMLpXNaVe_57FFobhC7R4A,23503
395
- unique_toolkit/language_model/infos.py,sha256=oAAQYhC87X02IxQKAh9IfzNsrwqL-gWzpl17m8BrHP0,145541
394
+ unique_toolkit/language_model/functions.py,sha256=DG5xs1jvsf93wVJlIpRuw5WcVfT7ELp_7qMDZHupTb8,25254
395
+ unique_toolkit/language_model/infos.py,sha256=K8n_cGWJbfrfaPljrBUWembPPCc9SNY9tZc12JeKRJ0,145677
396
396
  unique_toolkit/language_model/invocation_stats.py,sha256=XAM_qckI-BoMBSgDpVcxFD1cFSdi1-GHZToHz_jLynM,2491
397
397
  unique_toolkit/language_model/model_costs.py,sha256=WM1u2fWAKpPB_creS-ew8YAzc1V8oiaCbvhpSJaO8B0,3789
398
398
  unique_toolkit/language_model/prompt.py,sha256=JSawaLjQg3VR-E2fK8engFyJnNdk21zaO8pPIodzN4Q,3991
399
399
  unique_toolkit/language_model/reference.py,sha256=T3wr2jP_uRg5wKVIbKqLbxJlcgxfbZQGq3XdjbQ2kSo,6984
400
400
  unique_toolkit/language_model/schemas.py,sha256=IUmp_JMHx0czadJlmsLL9nmc-nCPmVRVLp2T5DSYsqY,35402
401
- unique_toolkit/language_model/service.py,sha256=hDoJBBgG_wWs8WuC_c8tnmK8cNu8o5EhJJXRvgwhkFQ,11956
401
+ unique_toolkit/language_model/service.py,sha256=9Q1xQCGjGVHZVMjkXaAPKAc7fLY2lGY6sFgdasoRQZE,12616
402
402
  unique_toolkit/language_model/settings.py,sha256=7szohExI-qmTfUf2Zp5AB5TzrsZy1UekAGyXx_UaPMc,1524
403
403
  unique_toolkit/language_model/stream_transform.py,sha256=iNNGpLY_7G6Bpp9Y4KtbIkQm3WB4yZt75BXcqx0DVkI,2775
404
404
  unique_toolkit/language_model/utils.py,sha256=bPQ4l6_YO71w-zaIPanUUmtbXC1_hCvLK0tAFc3VCRc,1902
@@ -420,6 +420,6 @@ unique_toolkit/short_term_memory/service.py,sha256=2JMBEBn6GoyK-a0xvdcWpPft-3C74
420
420
  unique_toolkit/smart_rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
421
421
  unique_toolkit/smart_rules/compile.py,sha256=vRe0aMJWuVIK-VsqomgxQImzke7MDmwgSxxJfYCa7zw,1386
422
422
  unique_toolkit/test_utilities/events.py,sha256=FLrhMh0A_mQutAUjoD0FdMcVQ4Gq31r35OVGzRjvLro,6760
423
- unique_toolkit-2026.34.0.dev9.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
424
- unique_toolkit-2026.34.0.dev9.dist-info/METADATA,sha256=u_HrX_80XqfWG54ud1CwTxBiJF2lKD0L9Go050etA4c,7821
425
- unique_toolkit-2026.34.0.dev9.dist-info/RECORD,,
423
+ unique_toolkit-2026.34.0.dev11.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
424
+ unique_toolkit-2026.34.0.dev11.dist-info/METADATA,sha256=bosO0M7wQ5mBgcr9PtW8z6T5CH3esYPqY13pAjj7zes,7822
425
+ unique_toolkit-2026.34.0.dev11.dist-info/RECORD,,