unique_toolkit 0.7.7__py3-none-any.whl → 1.23.0__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.

Potentially problematic release.


This version of unique_toolkit might be problematic. Click here for more details.

Files changed (166) hide show
  1. unique_toolkit/__init__.py +28 -1
  2. unique_toolkit/_common/api_calling/human_verification_manager.py +343 -0
  3. unique_toolkit/_common/base_model_type_attribute.py +303 -0
  4. unique_toolkit/_common/chunk_relevancy_sorter/config.py +49 -0
  5. unique_toolkit/_common/chunk_relevancy_sorter/exception.py +5 -0
  6. unique_toolkit/_common/chunk_relevancy_sorter/schemas.py +46 -0
  7. unique_toolkit/_common/chunk_relevancy_sorter/service.py +374 -0
  8. unique_toolkit/_common/chunk_relevancy_sorter/tests/test_service.py +275 -0
  9. unique_toolkit/_common/default_language_model.py +12 -0
  10. unique_toolkit/_common/docx_generator/__init__.py +7 -0
  11. unique_toolkit/_common/docx_generator/config.py +12 -0
  12. unique_toolkit/_common/docx_generator/schemas.py +80 -0
  13. unique_toolkit/_common/docx_generator/service.py +252 -0
  14. unique_toolkit/_common/docx_generator/template/Doc Template.docx +0 -0
  15. unique_toolkit/_common/endpoint_builder.py +305 -0
  16. unique_toolkit/_common/endpoint_requestor.py +430 -0
  17. unique_toolkit/_common/exception.py +24 -0
  18. unique_toolkit/_common/feature_flags/schema.py +9 -0
  19. unique_toolkit/_common/pydantic/rjsf_tags.py +936 -0
  20. unique_toolkit/_common/pydantic_helpers.py +154 -0
  21. unique_toolkit/_common/referencing.py +53 -0
  22. unique_toolkit/_common/string_utilities.py +140 -0
  23. unique_toolkit/_common/tests/test_referencing.py +521 -0
  24. unique_toolkit/_common/tests/test_string_utilities.py +506 -0
  25. unique_toolkit/_common/token/image_token_counting.py +67 -0
  26. unique_toolkit/_common/token/token_counting.py +204 -0
  27. unique_toolkit/_common/utils/__init__.py +1 -0
  28. unique_toolkit/_common/utils/files.py +43 -0
  29. unique_toolkit/_common/utils/structured_output/__init__.py +1 -0
  30. unique_toolkit/_common/utils/structured_output/schema.py +5 -0
  31. unique_toolkit/_common/utils/write_configuration.py +51 -0
  32. unique_toolkit/_common/validators.py +101 -4
  33. unique_toolkit/agentic/__init__.py +1 -0
  34. unique_toolkit/agentic/debug_info_manager/debug_info_manager.py +28 -0
  35. unique_toolkit/agentic/debug_info_manager/test/test_debug_info_manager.py +278 -0
  36. unique_toolkit/agentic/evaluation/config.py +36 -0
  37. unique_toolkit/{evaluators → agentic/evaluation}/context_relevancy/prompts.py +25 -0
  38. unique_toolkit/agentic/evaluation/context_relevancy/schema.py +80 -0
  39. unique_toolkit/agentic/evaluation/context_relevancy/service.py +273 -0
  40. unique_toolkit/agentic/evaluation/evaluation_manager.py +218 -0
  41. unique_toolkit/agentic/evaluation/hallucination/constants.py +61 -0
  42. unique_toolkit/agentic/evaluation/hallucination/hallucination_evaluation.py +111 -0
  43. unique_toolkit/{evaluators → agentic/evaluation}/hallucination/prompts.py +1 -1
  44. unique_toolkit/{evaluators → agentic/evaluation}/hallucination/service.py +16 -15
  45. unique_toolkit/{evaluators → agentic/evaluation}/hallucination/utils.py +30 -20
  46. unique_toolkit/{evaluators → agentic/evaluation}/output_parser.py +20 -2
  47. unique_toolkit/{evaluators → agentic/evaluation}/schemas.py +27 -7
  48. unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py +253 -0
  49. unique_toolkit/agentic/evaluation/tests/test_output_parser.py +87 -0
  50. unique_toolkit/agentic/history_manager/history_construction_with_contents.py +297 -0
  51. unique_toolkit/agentic/history_manager/history_manager.py +242 -0
  52. unique_toolkit/agentic/history_manager/loop_token_reducer.py +484 -0
  53. unique_toolkit/agentic/history_manager/utils.py +96 -0
  54. unique_toolkit/agentic/postprocessor/postprocessor_manager.py +212 -0
  55. unique_toolkit/agentic/reference_manager/reference_manager.py +103 -0
  56. unique_toolkit/agentic/responses_api/__init__.py +19 -0
  57. unique_toolkit/agentic/responses_api/postprocessors/code_display.py +63 -0
  58. unique_toolkit/agentic/responses_api/postprocessors/generated_files.py +145 -0
  59. unique_toolkit/agentic/responses_api/stream_handler.py +15 -0
  60. unique_toolkit/agentic/short_term_memory_manager/persistent_short_term_memory_manager.py +141 -0
  61. unique_toolkit/agentic/thinking_manager/thinking_manager.py +103 -0
  62. unique_toolkit/agentic/tools/__init__.py +1 -0
  63. unique_toolkit/agentic/tools/a2a/__init__.py +36 -0
  64. unique_toolkit/agentic/tools/a2a/config.py +17 -0
  65. unique_toolkit/agentic/tools/a2a/evaluation/__init__.py +15 -0
  66. unique_toolkit/agentic/tools/a2a/evaluation/_utils.py +66 -0
  67. unique_toolkit/agentic/tools/a2a/evaluation/config.py +55 -0
  68. unique_toolkit/agentic/tools/a2a/evaluation/evaluator.py +260 -0
  69. unique_toolkit/agentic/tools/a2a/evaluation/summarization_user_message.j2 +9 -0
  70. unique_toolkit/agentic/tools/a2a/manager.py +55 -0
  71. unique_toolkit/agentic/tools/a2a/postprocessing/__init__.py +21 -0
  72. unique_toolkit/agentic/tools/a2a/postprocessing/_display_utils.py +185 -0
  73. unique_toolkit/agentic/tools/a2a/postprocessing/_ref_utils.py +73 -0
  74. unique_toolkit/agentic/tools/a2a/postprocessing/config.py +45 -0
  75. unique_toolkit/agentic/tools/a2a/postprocessing/display.py +180 -0
  76. unique_toolkit/agentic/tools/a2a/postprocessing/references.py +101 -0
  77. unique_toolkit/agentic/tools/a2a/postprocessing/test/test_display_utils.py +1335 -0
  78. unique_toolkit/agentic/tools/a2a/postprocessing/test/test_ref_utils.py +603 -0
  79. unique_toolkit/agentic/tools/a2a/prompts.py +46 -0
  80. unique_toolkit/agentic/tools/a2a/response_watcher/__init__.py +6 -0
  81. unique_toolkit/agentic/tools/a2a/response_watcher/service.py +91 -0
  82. unique_toolkit/agentic/tools/a2a/tool/__init__.py +4 -0
  83. unique_toolkit/agentic/tools/a2a/tool/_memory.py +26 -0
  84. unique_toolkit/agentic/tools/a2a/tool/_schema.py +9 -0
  85. unique_toolkit/agentic/tools/a2a/tool/config.py +73 -0
  86. unique_toolkit/agentic/tools/a2a/tool/service.py +306 -0
  87. unique_toolkit/agentic/tools/agent_chunks_hanlder.py +65 -0
  88. unique_toolkit/agentic/tools/config.py +167 -0
  89. unique_toolkit/agentic/tools/factory.py +44 -0
  90. unique_toolkit/agentic/tools/mcp/__init__.py +4 -0
  91. unique_toolkit/agentic/tools/mcp/manager.py +71 -0
  92. unique_toolkit/agentic/tools/mcp/models.py +28 -0
  93. unique_toolkit/agentic/tools/mcp/tool_wrapper.py +234 -0
  94. unique_toolkit/agentic/tools/openai_builtin/__init__.py +11 -0
  95. unique_toolkit/agentic/tools/openai_builtin/base.py +30 -0
  96. unique_toolkit/agentic/tools/openai_builtin/code_interpreter/__init__.py +8 -0
  97. unique_toolkit/agentic/tools/openai_builtin/code_interpreter/config.py +57 -0
  98. unique_toolkit/agentic/tools/openai_builtin/code_interpreter/service.py +230 -0
  99. unique_toolkit/agentic/tools/openai_builtin/manager.py +62 -0
  100. unique_toolkit/agentic/tools/schemas.py +141 -0
  101. unique_toolkit/agentic/tools/test/test_mcp_manager.py +536 -0
  102. unique_toolkit/agentic/tools/test/test_tool_progress_reporter.py +445 -0
  103. unique_toolkit/agentic/tools/tool.py +183 -0
  104. unique_toolkit/agentic/tools/tool_manager.py +523 -0
  105. unique_toolkit/agentic/tools/tool_progress_reporter.py +285 -0
  106. unique_toolkit/agentic/tools/utils/__init__.py +19 -0
  107. unique_toolkit/agentic/tools/utils/execution/__init__.py +1 -0
  108. unique_toolkit/agentic/tools/utils/execution/execution.py +286 -0
  109. unique_toolkit/agentic/tools/utils/source_handling/__init__.py +0 -0
  110. unique_toolkit/agentic/tools/utils/source_handling/schema.py +21 -0
  111. unique_toolkit/agentic/tools/utils/source_handling/source_formatting.py +207 -0
  112. unique_toolkit/agentic/tools/utils/source_handling/tests/test_source_formatting.py +216 -0
  113. unique_toolkit/app/__init__.py +6 -0
  114. unique_toolkit/app/dev_util.py +180 -0
  115. unique_toolkit/app/init_sdk.py +32 -1
  116. unique_toolkit/app/schemas.py +198 -31
  117. unique_toolkit/app/unique_settings.py +367 -0
  118. unique_toolkit/chat/__init__.py +8 -1
  119. unique_toolkit/chat/deprecated/service.py +232 -0
  120. unique_toolkit/chat/functions.py +642 -77
  121. unique_toolkit/chat/rendering.py +34 -0
  122. unique_toolkit/chat/responses_api.py +461 -0
  123. unique_toolkit/chat/schemas.py +133 -2
  124. unique_toolkit/chat/service.py +115 -767
  125. unique_toolkit/content/functions.py +153 -4
  126. unique_toolkit/content/schemas.py +122 -15
  127. unique_toolkit/content/service.py +278 -44
  128. unique_toolkit/content/smart_rules.py +301 -0
  129. unique_toolkit/content/utils.py +8 -3
  130. unique_toolkit/embedding/service.py +102 -11
  131. unique_toolkit/framework_utilities/__init__.py +1 -0
  132. unique_toolkit/framework_utilities/langchain/client.py +71 -0
  133. unique_toolkit/framework_utilities/langchain/history.py +19 -0
  134. unique_toolkit/framework_utilities/openai/__init__.py +6 -0
  135. unique_toolkit/framework_utilities/openai/client.py +83 -0
  136. unique_toolkit/framework_utilities/openai/message_builder.py +229 -0
  137. unique_toolkit/framework_utilities/utils.py +23 -0
  138. unique_toolkit/language_model/__init__.py +3 -0
  139. unique_toolkit/language_model/builder.py +27 -11
  140. unique_toolkit/language_model/default_language_model.py +3 -0
  141. unique_toolkit/language_model/functions.py +327 -43
  142. unique_toolkit/language_model/infos.py +992 -50
  143. unique_toolkit/language_model/reference.py +242 -0
  144. unique_toolkit/language_model/schemas.py +475 -48
  145. unique_toolkit/language_model/service.py +228 -27
  146. unique_toolkit/protocols/support.py +145 -0
  147. unique_toolkit/services/__init__.py +7 -0
  148. unique_toolkit/services/chat_service.py +1630 -0
  149. unique_toolkit/services/knowledge_base.py +861 -0
  150. unique_toolkit/short_term_memory/service.py +178 -41
  151. unique_toolkit/smart_rules/__init__.py +0 -0
  152. unique_toolkit/smart_rules/compile.py +56 -0
  153. unique_toolkit/test_utilities/events.py +197 -0
  154. {unique_toolkit-0.7.7.dist-info → unique_toolkit-1.23.0.dist-info}/METADATA +606 -7
  155. unique_toolkit-1.23.0.dist-info/RECORD +182 -0
  156. unique_toolkit/evaluators/__init__.py +0 -1
  157. unique_toolkit/evaluators/config.py +0 -35
  158. unique_toolkit/evaluators/constants.py +0 -1
  159. unique_toolkit/evaluators/context_relevancy/constants.py +0 -32
  160. unique_toolkit/evaluators/context_relevancy/service.py +0 -53
  161. unique_toolkit/evaluators/context_relevancy/utils.py +0 -142
  162. unique_toolkit/evaluators/hallucination/constants.py +0 -41
  163. unique_toolkit-0.7.7.dist-info/RECORD +0 -64
  164. /unique_toolkit/{evaluators → agentic/evaluation}/exception.py +0 -0
  165. {unique_toolkit-0.7.7.dist-info → unique_toolkit-1.23.0.dist-info}/LICENSE +0 -0
  166. {unique_toolkit-0.7.7.dist-info → unique_toolkit-1.23.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,305 @@
1
+ """
2
+ This module provides a minimal framework for building endpoint classes such that a client can use
3
+ the endpoints without having to know the details of the endpoints.
4
+ """
5
+
6
+ import warnings
7
+ from enum import StrEnum
8
+ from string import Template
9
+ from typing import (
10
+ Any,
11
+ Callable,
12
+ Generic,
13
+ ParamSpec,
14
+ Protocol,
15
+ TypeVar,
16
+ cast,
17
+ )
18
+
19
+ from pydantic import BaseModel, ValidationError
20
+
21
+ # Paramspecs
22
+ PayloadParamSpec = ParamSpec("PayloadParamSpec")
23
+ PathParamsSpec = ParamSpec("PathParamsSpec")
24
+
25
+ # Type variables
26
+ ResponseType = TypeVar("ResponseType", bound=BaseModel, covariant=True)
27
+ PathParamsType = TypeVar("PathParamsType", bound=BaseModel)
28
+ PayloadType = TypeVar("PayloadType", bound=BaseModel)
29
+
30
+ # Helper type to extract constructor parameters
31
+
32
+ # Type for the constructor of a Pydantic model
33
+ ModelConstructor = Callable[..., BaseModel]
34
+
35
+
36
+ class HttpMethods(StrEnum):
37
+ GET = "GET"
38
+ POST = "POST"
39
+ PUT = "PUT"
40
+ DELETE = "DELETE"
41
+ PATCH = "PATCH"
42
+ OPTIONS = "OPTIONS"
43
+ HEAD = "HEAD"
44
+
45
+
46
+ # Backward compatibility TODO: Remove in 2.0.0.
47
+ EndpointMethods = HttpMethods
48
+
49
+
50
+ class ResponseValidationException(Exception):
51
+ """
52
+ This exception is raised when the response validation fails.
53
+ """
54
+
55
+ def __init__(
56
+ self, operation_name: str, response: dict[str, Any], pydantic_error: str
57
+ ):
58
+ super().__init__(
59
+ f"Response validation failed for operation {operation_name}\n"
60
+ f"Response: {response}\n"
61
+ f"Pydantic error: {pydantic_error}"
62
+ )
63
+ self._operation_name = operation_name
64
+ self._response = response
65
+ self._pydantic_error = pydantic_error
66
+
67
+ @property
68
+ def operation_name(self) -> str:
69
+ return self._operation_name
70
+
71
+ @property
72
+ def response(self) -> dict[str, Any]:
73
+ return self._response
74
+
75
+ @property
76
+ def pydantic_error(self) -> str:
77
+ return self._pydantic_error
78
+
79
+ def __str__(self):
80
+ return (
81
+ f"Response validation failed for {self._operation_name}\n"
82
+ + f"Response: {self._response}"
83
+ )
84
+
85
+
86
+ class ApiOperationProtocol(
87
+ Protocol,
88
+ Generic[
89
+ PathParamsSpec,
90
+ PathParamsType,
91
+ PayloadParamSpec,
92
+ PayloadType,
93
+ ResponseType,
94
+ ],
95
+ ):
96
+ @staticmethod
97
+ def path_dump_options() -> dict[str, Any]: ...
98
+
99
+ @staticmethod
100
+ def path_params_model() -> type[PathParamsType]: ...
101
+
102
+ @staticmethod
103
+ def payload_dump_options() -> dict[str, Any]: ...
104
+
105
+ @staticmethod
106
+ def payload_model() -> type[PayloadType]: ...
107
+
108
+ @staticmethod
109
+ def response_validate_options() -> dict[str, Any]: ...
110
+
111
+ @staticmethod
112
+ def response_model() -> type[ResponseType]: ...
113
+
114
+ @staticmethod
115
+ def create_path(
116
+ *args: PathParamsSpec.args, **kwargs: PathParamsSpec.kwargs
117
+ ) -> str: ...
118
+
119
+ @staticmethod
120
+ def create_path_from_model(
121
+ path_params: PathParamsType, *, model_dump_options: dict | None = None
122
+ ) -> str: ...
123
+
124
+ @staticmethod
125
+ def create_payload(
126
+ *args: PayloadParamSpec.args, **kwargs: PayloadParamSpec.kwargs
127
+ ) -> dict[str, Any]: ...
128
+
129
+ @staticmethod
130
+ def create_payload_from_model(
131
+ payload: PayloadType, *, model_dump_options: dict | None = None
132
+ ) -> dict[str, Any]: ...
133
+
134
+ @staticmethod
135
+ def handle_response(
136
+ response: dict[str, Any], *, model_validate_options: dict | None = None
137
+ ) -> ResponseType: ...
138
+
139
+ @staticmethod
140
+ def request_method() -> EndpointMethods: ...
141
+
142
+ @staticmethod
143
+ def models_from_combined(
144
+ combined: dict[str, Any],
145
+ ) -> tuple[PathParamsType, PayloadType]: ...
146
+
147
+
148
+ # Model for any client to implement
149
+ def build_api_operation(
150
+ *,
151
+ method: HttpMethods,
152
+ path_template: Template,
153
+ path_params_constructor: Callable[PathParamsSpec, PathParamsType],
154
+ payload_constructor: Callable[PayloadParamSpec, PayloadType],
155
+ response_model_type: type[ResponseType],
156
+ payload_dump_options: dict | None = None,
157
+ path_dump_options: dict | None = None,
158
+ response_validate_options: dict | None = None,
159
+ dump_options: dict | None = None, # Deprecated
160
+ ) -> type[
161
+ ApiOperationProtocol[
162
+ PathParamsSpec,
163
+ PathParamsType,
164
+ PayloadParamSpec,
165
+ PayloadType,
166
+ ResponseType,
167
+ ]
168
+ ]:
169
+ """Generate a class with static methods for endpoint handling.
170
+
171
+ Uses separate models for path parameters and request body for clean API design.
172
+
173
+ Returns a class with static methods:
174
+ - create_url: Creates URL from path parameters
175
+ - create_payload: Creates request body payload
176
+ """
177
+
178
+ # Verify that the path_params_constructor and payload_constructor are valid pydantic models
179
+ if not dump_options:
180
+ dump_options = {
181
+ "exclude_unset": True,
182
+ "by_alias": True,
183
+ "exclude_defaults": True,
184
+ }
185
+ else:
186
+ warnings.warn(
187
+ "dump_options is deprecated. Use payload_dump_options instead.",
188
+ DeprecationWarning,
189
+ )
190
+
191
+ class Operation(ApiOperationProtocol):
192
+ @staticmethod
193
+ def path_dump_options() -> dict[str, Any]:
194
+ return path_dump_options or {}
195
+
196
+ @staticmethod
197
+ def path_params_model() -> type[PathParamsType]:
198
+ return cast(type[PathParamsType], path_params_constructor)
199
+
200
+ @staticmethod
201
+ def payload_dump_options() -> dict[str, Any]:
202
+ return payload_dump_options or {}
203
+
204
+ @staticmethod
205
+ def payload_model() -> type[PayloadType]:
206
+ return cast(type[PayloadType], payload_constructor)
207
+
208
+ @staticmethod
209
+ def response_validate_options() -> dict[str, Any]:
210
+ return response_validate_options or {}
211
+
212
+ @staticmethod
213
+ def response_model() -> type[ResponseType]:
214
+ return response_model_type
215
+
216
+ @staticmethod
217
+ def path_template() -> Template:
218
+ return path_template
219
+
220
+ @staticmethod
221
+ def create_path_from_model(
222
+ path_params: PathParamsType, *, model_dump_options: dict | None = None
223
+ ) -> str:
224
+ if model_dump_options is None:
225
+ if path_dump_options is None:
226
+ model_dump_options = dump_options
227
+ else:
228
+ model_dump_options = path_dump_options
229
+
230
+ return path_template.substitute(
231
+ **path_params.model_dump(**model_dump_options)
232
+ )
233
+
234
+ @staticmethod
235
+ def create_path(
236
+ *args: PathParamsSpec.args, **kwargs: PathParamsSpec.kwargs
237
+ ) -> str:
238
+ model = Operation.path_params_model()(*args, **kwargs)
239
+ return Operation.create_path_from_model(model)
240
+
241
+ @staticmethod
242
+ def create_payload(
243
+ *args: PayloadParamSpec.args,
244
+ **kwargs: PayloadParamSpec.kwargs,
245
+ ) -> dict[str, Any]:
246
+ """Create request body payload."""
247
+ if payload_dump_options is None:
248
+ model_dump_options = dump_options
249
+ else:
250
+ model_dump_options = payload_dump_options
251
+
252
+ request_model = Operation.payload_model()(*args, **kwargs)
253
+ return request_model.model_dump(**model_dump_options)
254
+
255
+ @staticmethod
256
+ def create_payload_from_model(
257
+ payload: PayloadType, *, model_dump_options: dict | None = None
258
+ ) -> dict[str, Any]:
259
+ if model_dump_options is None:
260
+ if payload_dump_options is None:
261
+ model_dump_options = dump_options
262
+ else:
263
+ model_dump_options = payload_dump_options
264
+
265
+ return payload.model_dump(**model_dump_options)
266
+
267
+ @staticmethod
268
+ def handle_response(
269
+ response: dict[str, Any],
270
+ *,
271
+ model_validate_options: dict[str, Any] | None = None,
272
+ ) -> ResponseType:
273
+ if model_validate_options is None:
274
+ if response_validate_options is None:
275
+ model_validate_options = {}
276
+ else:
277
+ model_validate_options = response_validate_options
278
+ try:
279
+ return Operation.response_model().model_validate(
280
+ response, **model_validate_options
281
+ )
282
+ except ValidationError as e:
283
+ raise ResponseValidationException(
284
+ operation_name=Operation.__name__,
285
+ response=response,
286
+ pydantic_error=str(e),
287
+ ) from e
288
+
289
+ @staticmethod
290
+ def request_method() -> HttpMethods:
291
+ return method
292
+
293
+ @staticmethod
294
+ def models_from_combined(
295
+ combined: dict[str, Any],
296
+ ) -> tuple[PathParamsType, PayloadType]:
297
+ path_params = Operation.path_params_model().model_validate(
298
+ combined, by_alias=True, by_name=True
299
+ )
300
+ payload = Operation.payload_model().model_validate(
301
+ combined, by_alias=True, by_name=True
302
+ )
303
+ return path_params, payload
304
+
305
+ return Operation