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
@@ -1,11 +1,13 @@
1
1
  import logging
2
- from typing import Optional, Type
2
+ from typing import Any, Optional, Type, overload
3
3
 
4
4
  from pydantic import BaseModel
5
5
  from typing_extensions import deprecated
6
6
 
7
7
  from unique_toolkit._common.validate_required_values import validate_required_values
8
8
  from unique_toolkit.app.schemas import BaseEvent, ChatEvent, Event
9
+ from unique_toolkit.app.unique_settings import UniqueSettings
10
+ from unique_toolkit.content.schemas import ContentChunk
9
11
  from unique_toolkit.language_model.constants import (
10
12
  DEFAULT_COMPLETE_TEMPERATURE,
11
13
  DEFAULT_COMPLETE_TIMEOUT,
@@ -14,12 +16,16 @@ from unique_toolkit.language_model.constants import (
14
16
  from unique_toolkit.language_model.functions import (
15
17
  complete,
16
18
  complete_async,
19
+ complete_with_references,
20
+ complete_with_references_async,
17
21
  )
18
22
  from unique_toolkit.language_model.infos import LanguageModelName
19
23
  from unique_toolkit.language_model.schemas import (
20
24
  LanguageModelMessages,
21
25
  LanguageModelResponse,
26
+ LanguageModelStreamResponse,
22
27
  LanguageModelTool,
28
+ LanguageModelToolDescription,
23
29
  )
24
30
 
25
31
  logger = logging.getLogger(f"toolkit.{DOMAIN_NAME}.{__name__}")
@@ -28,34 +34,76 @@ logger = logging.getLogger(f"toolkit.{DOMAIN_NAME}.{__name__}")
28
34
  class LanguageModelService:
29
35
  """
30
36
  Provides methods to interact with the Language Model by generating responses.
37
+ """
38
+
39
+ @deprecated(
40
+ "Use __init__ with company_id and user_id instead or use the classmethod `from_event`"
41
+ )
42
+ @overload
43
+ def __init__(self, event: Event | ChatEvent | BaseEvent): ...
31
44
 
32
- Args:
33
- company_id (str | None, optional): The company identifier. Defaults to None.
34
- user_id (str | None, optional): The user identifier. Defaults to None.
35
- chat_id (str | None, optional): The chat identifier. Defaults to None.
36
- assistant_id (str | None, optional): The assistant identifier. Defaults to None.
45
+ """
46
+ Initialize the LanguageModelService with an event (deprecated)
47
+ """
48
+
49
+ @overload
50
+ def __init__(self, *, company_id: str, user_id: str): ...
51
+
52
+ """
53
+ Initialize the LanguageModelService with a company_id and user_id.
37
54
  """
38
55
 
39
56
  def __init__(
40
57
  self,
41
- event: Event | BaseEvent | None = None,
58
+ event: Event | ChatEvent | BaseEvent | None = None,
42
59
  company_id: str | None = None,
43
60
  user_id: str | None = None,
44
- chat_id: str | None = None,
45
- assistant_id: str | None = None,
61
+ **kwargs: dict[str, Any], # only here for backward compatibility
46
62
  ):
47
- self._event = event
48
- self.company_id = company_id
49
- self.user_id = user_id
50
- self.chat_id = chat_id
51
- self.assistant_id = assistant_id
52
-
53
- if event:
54
- self.company_id = event.company_id
55
- self.user_id = event.user_id
63
+ if isinstance(event, (ChatEvent, Event)):
64
+ self._event = event
65
+ self._chat_id: str | None = event.payload.chat_id
66
+ self._assistant_id: str | None = event.payload.assistant_id
67
+ self._company_id = event.company_id
68
+ self._user_id = event.user_id
56
69
  if isinstance(event, (ChatEvent, Event)):
57
- self.chat_id = event.payload.chat_id
58
- self.assistant_id = event.payload.assistant_id
70
+ self._chat_id = event.payload.chat_id
71
+ self._assistant_id = event.payload.assistant_id
72
+ elif isinstance(event, BaseEvent):
73
+ self._event = event
74
+ self._company_id = event.company_id
75
+ self._user_id = event.user_id
76
+ self._chat_id: str | None = None
77
+ self._assistant_id: str | None = None
78
+ else:
79
+ [company_id, user_id] = validate_required_values([company_id, user_id])
80
+ self._event = None
81
+ self._company_id: str = company_id
82
+ self._user_id: str = user_id
83
+ self._chat_id: str | None = None
84
+ self._assistant_id: str | None = None
85
+
86
+ @classmethod
87
+ def from_event(cls, event: BaseEvent):
88
+ """
89
+ Initialize the LanguageModelService with an event.
90
+ """
91
+ return cls(company_id=event.company_id, user_id=event.user_id)
92
+
93
+ @classmethod
94
+ def from_settings(cls, settings: UniqueSettings | str | None = None):
95
+ """
96
+ Initialize the LanguageModelService with a settings object.
97
+ """
98
+ if settings is None:
99
+ settings = UniqueSettings.from_env_auto_with_sdk_init()
100
+ elif isinstance(settings, str):
101
+ settings = UniqueSettings.from_env_auto_with_sdk_init(filename=settings)
102
+
103
+ return cls(
104
+ company_id=settings.auth.company_id.get_secret_value(),
105
+ user_id=settings.auth.user_id.get_secret_value(),
106
+ )
59
107
 
60
108
  @property
61
109
  @deprecated(
@@ -70,13 +118,117 @@ class LanguageModelService:
70
118
  """
71
119
  return self._event
72
120
 
121
+ @property
122
+ @deprecated(
123
+ "The company_id property is deprecated and will be removed in a future version."
124
+ )
125
+ def company_id(self) -> str | None:
126
+ """
127
+ Get the company identifier (deprecated).
128
+
129
+ Returns:
130
+ str | None: The company identifier.
131
+ """
132
+ return self._company_id
133
+
134
+ @company_id.setter
135
+ @deprecated(
136
+ "The company_id setter is deprecated and will be removed in a future version."
137
+ )
138
+ def company_id(self, value: str) -> None:
139
+ """
140
+ Set the company identifier (deprecated).
141
+
142
+ Args:
143
+ value (str | None): The company identifier.
144
+ """
145
+ self._company_id = value
146
+
147
+ @property
148
+ @deprecated(
149
+ "The user_id property is deprecated and will be removed in a future version."
150
+ )
151
+ def user_id(self) -> str | None:
152
+ """
153
+ Get the user identifier (deprecated).
154
+
155
+ Returns:
156
+ str | None: The user identifier.
157
+ """
158
+ return self._user_id
159
+
160
+ @user_id.setter
161
+ @deprecated(
162
+ "The user_id setter is deprecated and will be removed in a future version."
163
+ )
164
+ def user_id(self, value: str) -> None:
165
+ """
166
+ Set the user identifier (deprecated).
167
+
168
+ Args:
169
+ value (str | None): The user identifier.
170
+ """
171
+ self._user_id = value
172
+
173
+ @property
174
+ @deprecated(
175
+ "The chat_id property is deprecated and will be removed in a future version."
176
+ )
177
+ def chat_id(self) -> str | None:
178
+ """
179
+ Get the chat identifier (deprecated).
180
+
181
+ Returns:
182
+ str | None: The chat identifier.
183
+ """
184
+ return self._chat_id
185
+
186
+ @chat_id.setter
187
+ @deprecated(
188
+ "The chat_id setter is deprecated and will be removed in a future version."
189
+ )
190
+ def chat_id(self, value: str | None) -> None:
191
+ """
192
+ Set the chat identifier (deprecated).
193
+
194
+ Args:
195
+ value (str | None): The chat identifier.
196
+ """
197
+ self._chat_id = value
198
+
199
+ @property
200
+ @deprecated(
201
+ "The assistant_id property is deprecated and will be removed in a future version."
202
+ )
203
+ def assistant_id(self) -> str | None:
204
+ """
205
+ Get the assistant identifier (deprecated).
206
+
207
+ Returns:
208
+ str | None: The assistant identifier.
209
+ """
210
+ return self._assistant_id
211
+
212
+ @assistant_id.setter
213
+ @deprecated(
214
+ "The assistant_id setter is deprecated and will be removed in a future version."
215
+ )
216
+ def assistant_id(self, value: str | None) -> None:
217
+ """
218
+ Set the assistant identifier (deprecated).
219
+
220
+ Args:
221
+ value (str | None): The assistant identifier.
222
+ """
223
+ self._assistant_id = value
224
+
73
225
  def complete(
74
226
  self,
75
227
  messages: LanguageModelMessages,
76
228
  model_name: LanguageModelName | str,
77
229
  temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
78
230
  timeout: int = DEFAULT_COMPLETE_TIMEOUT,
79
- tools: Optional[list[LanguageModelTool]] = None,
231
+ tools: Optional[list[LanguageModelTool | LanguageModelToolDescription]] = None,
80
232
  structured_output_model: Optional[Type[BaseModel]] = None,
81
233
  structured_output_enforce_schema: bool = False,
82
234
  other_options: Optional[dict] = None,
@@ -84,10 +236,9 @@ class LanguageModelService:
84
236
  """
85
237
  Calls the completion endpoint synchronously without streaming the response.
86
238
  """
87
- [company_id] = validate_required_values([self.company_id])
88
239
 
89
240
  return complete(
90
- company_id=company_id,
241
+ company_id=self._company_id,
91
242
  messages=messages,
92
243
  model_name=model_name,
93
244
  temperature=temperature,
@@ -104,7 +255,7 @@ class LanguageModelService:
104
255
  model_name: LanguageModelName | str,
105
256
  temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
106
257
  timeout: int = DEFAULT_COMPLETE_TIMEOUT,
107
- tools: Optional[list[LanguageModelTool]] = None,
258
+ tools: Optional[list[LanguageModelTool | LanguageModelToolDescription]] = None,
108
259
  structured_output_model: Optional[Type[BaseModel]] = None,
109
260
  structured_output_enforce_schema: bool = False,
110
261
  other_options: Optional[dict] = None,
@@ -112,10 +263,10 @@ class LanguageModelService:
112
263
  """
113
264
  Calls the completion endpoint asynchronously without streaming the response.
114
265
  """
115
- [company_id] = validate_required_values([self.company_id])
116
266
 
117
267
  return await complete_async(
118
- company_id=company_id,
268
+ company_id=self._company_id,
269
+ user_id=self._user_id,
119
270
  messages=messages,
120
271
  model_name=model_name,
121
272
  temperature=temperature,
@@ -133,9 +284,10 @@ class LanguageModelService:
133
284
  company_id: str,
134
285
  messages: LanguageModelMessages,
135
286
  model_name: LanguageModelName | str,
287
+ user_id: str | None = None,
136
288
  temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
137
289
  timeout: int = DEFAULT_COMPLETE_TIMEOUT,
138
- tools: Optional[list[LanguageModelTool]] = None,
290
+ tools: Optional[list[LanguageModelTool | LanguageModelToolDescription]] = None,
139
291
  structured_output_model: Optional[Type[BaseModel]] = None,
140
292
  structured_output_enforce_schema: bool = False,
141
293
  other_options: Optional[dict] = None,
@@ -146,6 +298,7 @@ class LanguageModelService:
146
298
 
147
299
  return await complete_async(
148
300
  company_id=company_id,
301
+ user_id=user_id,
149
302
  messages=messages,
150
303
  model_name=model_name,
151
304
  temperature=temperature,
@@ -155,3 +308,51 @@ class LanguageModelService:
155
308
  structured_output_model=structured_output_model,
156
309
  structured_output_enforce_schema=structured_output_enforce_schema,
157
310
  )
311
+
312
+ def complete_with_references(
313
+ self,
314
+ messages: LanguageModelMessages,
315
+ model_name: LanguageModelName | str,
316
+ content_chunks: list[ContentChunk] | None = None,
317
+ debug_info: dict = {},
318
+ temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
319
+ timeout: int = DEFAULT_COMPLETE_TIMEOUT,
320
+ tools: list[LanguageModelTool | LanguageModelToolDescription] | None = None,
321
+ start_text: str | None = None,
322
+ other_options: dict[str, Any] | None = None,
323
+ ) -> LanguageModelStreamResponse:
324
+ return complete_with_references(
325
+ company_id=self._company_id,
326
+ messages=messages,
327
+ model_name=model_name,
328
+ content_chunks=content_chunks,
329
+ temperature=temperature,
330
+ timeout=timeout,
331
+ other_options=other_options,
332
+ tools=tools,
333
+ start_text=start_text,
334
+ )
335
+
336
+ async def complete_with_references_async(
337
+ self,
338
+ messages: LanguageModelMessages,
339
+ model_name: LanguageModelName | str,
340
+ content_chunks: list[ContentChunk] | None = None,
341
+ debug_info: dict = {},
342
+ temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
343
+ timeout: int = DEFAULT_COMPLETE_TIMEOUT,
344
+ tools: list[LanguageModelTool | LanguageModelToolDescription] | None = None,
345
+ start_text: str | None = None,
346
+ other_options: dict[str, Any] | None = None,
347
+ ) -> LanguageModelStreamResponse:
348
+ return await complete_with_references_async(
349
+ company_id=self._company_id,
350
+ messages=messages,
351
+ model_name=model_name,
352
+ content_chunks=content_chunks,
353
+ temperature=temperature,
354
+ timeout=timeout,
355
+ other_options=other_options,
356
+ tools=tools,
357
+ start_text=start_text,
358
+ )
@@ -0,0 +1,145 @@
1
+ from typing import Awaitable, Protocol, Sequence
2
+
3
+ from openai.types.chat import (
4
+ ChatCompletionMessageParam,
5
+ ChatCompletionToolChoiceOptionParam,
6
+ )
7
+ from openai.types.responses import (
8
+ ResponseIncludable,
9
+ ResponseInputItemParam,
10
+ ResponseOutputItem,
11
+ ResponseTextConfigParam,
12
+ ToolParam,
13
+ response_create_params,
14
+ )
15
+ from openai.types.shared_params import Metadata, Reasoning
16
+
17
+ from unique_toolkit.content import ContentChunk
18
+ from unique_toolkit.language_model import (
19
+ LanguageModelMessages,
20
+ LanguageModelName,
21
+ LanguageModelResponse,
22
+ LanguageModelStreamResponse,
23
+ LanguageModelTool,
24
+ LanguageModelToolDescription,
25
+ )
26
+ from unique_toolkit.language_model.constants import (
27
+ DEFAULT_COMPLETE_TEMPERATURE,
28
+ DEFAULT_COMPLETE_TIMEOUT,
29
+ )
30
+ from unique_toolkit.language_model.schemas import (
31
+ LanguageModelMessageOptions,
32
+ ResponsesLanguageModelStreamResponse,
33
+ )
34
+
35
+ # As soon as we have multiple, remember
36
+ # https://pypi.org/project/typing-protocol-intersection/
37
+ # to generate combinations of protocols without inheritance
38
+
39
+
40
+ class SupportsComplete(Protocol):
41
+ def complete(
42
+ self,
43
+ messages: LanguageModelMessages,
44
+ model_name: LanguageModelName | str,
45
+ temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
46
+ timeout: int = DEFAULT_COMPLETE_TIMEOUT,
47
+ tools: list[LanguageModelTool | LanguageModelToolDescription] | None = None,
48
+ ) -> LanguageModelResponse: ...
49
+
50
+ async def complete_async(
51
+ self,
52
+ messages: LanguageModelMessages,
53
+ model_name: LanguageModelName | str,
54
+ temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
55
+ timeout: int = DEFAULT_COMPLETE_TIMEOUT,
56
+ tools: Sequence[LanguageModelTool | LanguageModelToolDescription] | None = None,
57
+ ) -> Awaitable[LanguageModelResponse]: ...
58
+
59
+
60
+ class SupportCompleteWithReferences(Protocol):
61
+ def complete_with_references(
62
+ self,
63
+ messages: LanguageModelMessages,
64
+ model_name: LanguageModelName | str,
65
+ content_chunks: list[ContentChunk] | None = None,
66
+ debug_info: dict | None = None,
67
+ temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
68
+ timeout: int = DEFAULT_COMPLETE_TIMEOUT,
69
+ tools: Sequence[LanguageModelTool | LanguageModelToolDescription] | None = None,
70
+ start_text: str | None = None,
71
+ tool_choice: ChatCompletionToolChoiceOptionParam | None = None,
72
+ other_options: dict | None = None,
73
+ ) -> LanguageModelStreamResponse: ...
74
+
75
+ async def complete_with_references_async(
76
+ self,
77
+ messages: LanguageModelMessages | list[ChatCompletionMessageParam],
78
+ model_name: LanguageModelName | str,
79
+ content_chunks: list[ContentChunk] | None = None,
80
+ debug_info: dict | None = None,
81
+ temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
82
+ timeout: int = DEFAULT_COMPLETE_TIMEOUT,
83
+ tools: Sequence[LanguageModelTool | LanguageModelToolDescription] | None = None,
84
+ tool_choice: ChatCompletionToolChoiceOptionParam | None = None,
85
+ start_text: str | None = None,
86
+ other_options: dict | None = None,
87
+ ) -> LanguageModelStreamResponse: ...
88
+
89
+
90
+ class ResponsesSupportCompleteWithReferences(Protocol):
91
+ def complete_with_references(
92
+ self,
93
+ *,
94
+ model_name: LanguageModelName | str,
95
+ messages: str
96
+ | LanguageModelMessages
97
+ | Sequence[
98
+ ResponseInputItemParam
99
+ | LanguageModelMessageOptions
100
+ | ResponseOutputItem # History is automatically convertible
101
+ ],
102
+ content_chunks: list[ContentChunk] | None = None,
103
+ tools: Sequence[LanguageModelToolDescription | ToolParam] | None = None,
104
+ temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
105
+ debug_info: dict | None = None,
106
+ start_text: str | None = None,
107
+ include: list[ResponseIncludable] | None = None,
108
+ instructions: str | None = None,
109
+ max_output_tokens: int | None = None,
110
+ metadata: Metadata | None = None,
111
+ parallel_tool_calls: bool | None = None,
112
+ text: ResponseTextConfigParam | None = None,
113
+ tool_choice: response_create_params.ToolChoice | None = None,
114
+ top_p: float | None = None,
115
+ reasoning: Reasoning | None = None,
116
+ other_options: dict | None = None,
117
+ ) -> ResponsesLanguageModelStreamResponse: ...
118
+
119
+ async def complete_with_references_async(
120
+ self,
121
+ *,
122
+ model_name: LanguageModelName | str,
123
+ messages: str
124
+ | LanguageModelMessages
125
+ | Sequence[
126
+ ResponseInputItemParam
127
+ | LanguageModelMessageOptions
128
+ | ResponseOutputItem # History is automatically convertible
129
+ ],
130
+ content_chunks: list[ContentChunk] | None = None,
131
+ tools: Sequence[LanguageModelToolDescription | ToolParam] | None = None,
132
+ temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
133
+ debug_info: dict | None = None,
134
+ start_text: str | None = None,
135
+ include: list[ResponseIncludable] | None = None,
136
+ instructions: str | None = None,
137
+ max_output_tokens: int | None = None,
138
+ metadata: Metadata | None = None,
139
+ parallel_tool_calls: bool | None = None,
140
+ text: ResponseTextConfigParam | None = None,
141
+ tool_choice: response_create_params.ToolChoice | None = None,
142
+ top_p: float | None = None,
143
+ reasoning: Reasoning | None = None,
144
+ other_options: dict | None = None,
145
+ ) -> ResponsesLanguageModelStreamResponse: ...
@@ -0,0 +1,7 @@
1
+ from unique_toolkit.services.chat_service import ChatService
2
+ from unique_toolkit.services.knowledge_base import KnowledgeBaseService
3
+
4
+ __all__ = [
5
+ "ChatService",
6
+ "KnowledgeBaseService",
7
+ ]