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,229 @@
1
+ import base64
2
+ import mimetypes
3
+ from collections.abc import Iterable
4
+ from pathlib import Path
5
+ from typing import Self, overload
6
+
7
+ from openai.types.chat.chat_completion_assistant_message_param import (
8
+ Audio,
9
+ ChatCompletionAssistantMessageParam,
10
+ ContentArrayOfContentPart,
11
+ FunctionCall,
12
+ )
13
+ from openai.types.chat.chat_completion_content_part_image_param import (
14
+ ChatCompletionContentPartImageParam,
15
+ ImageURL,
16
+ )
17
+ from openai.types.chat.chat_completion_content_part_param import (
18
+ ChatCompletionContentPartParam,
19
+ )
20
+ from openai.types.chat.chat_completion_content_part_text_param import (
21
+ ChatCompletionContentPartTextParam,
22
+ )
23
+ from openai.types.chat.chat_completion_developer_message_param import (
24
+ ChatCompletionDeveloperMessageParam,
25
+ )
26
+ from openai.types.chat.chat_completion_function_message_param import (
27
+ ChatCompletionFunctionMessageParam,
28
+ )
29
+ from openai.types.chat.chat_completion_message_param import ChatCompletionMessageParam
30
+ from openai.types.chat.chat_completion_message_tool_call_param import (
31
+ ChatCompletionMessageToolCallParam,
32
+ )
33
+ from openai.types.chat.chat_completion_system_message_param import (
34
+ ChatCompletionSystemMessageParam,
35
+ )
36
+ from openai.types.chat.chat_completion_tool_message_param import (
37
+ ChatCompletionToolMessageParam,
38
+ )
39
+ from openai.types.chat.chat_completion_user_message_param import (
40
+ ChatCompletionUserMessageParam,
41
+ )
42
+ from typing_extensions import Literal
43
+
44
+
45
+ class OpenAIUserMessageBuilder:
46
+ def __init__(
47
+ self,
48
+ ) -> None:
49
+ self._messages: list[ChatCompletionContentPartParam] = []
50
+
51
+ def append_text(self, content: str) -> Self:
52
+ part = ChatCompletionContentPartTextParam(
53
+ type="text",
54
+ text=content,
55
+ )
56
+ self._messages.append(part)
57
+ return self
58
+
59
+ @overload
60
+ def append_image(
61
+ self, *, url: str, detail: Literal["auto", "low", "high"] = "auto"
62
+ ) -> Self: ...
63
+
64
+ @overload
65
+ def append_image(
66
+ self, *, path: Path, detail: Literal["auto", "low", "high"] = "auto"
67
+ ) -> Self: ...
68
+
69
+ @overload
70
+ def append_image(
71
+ self,
72
+ *,
73
+ content: bytes,
74
+ mime_type: str,
75
+ detail: Literal["auto", "low", "high"] = "auto",
76
+ ) -> Self: ...
77
+
78
+ def append_image(
79
+ self,
80
+ *,
81
+ url: str | None = None,
82
+ path: Path | None = None,
83
+ content: bytes | None = None,
84
+ mime_type: str | None = None,
85
+ detail: Literal["auto", "low", "high"] = "auto",
86
+ ) -> Self:
87
+ if url is None and path is None and (content is None or mime_type is None):
88
+ raise ValueError("Either url or path must be provided")
89
+
90
+ if path is not None:
91
+ # Read image file and encode as base64 data URI
92
+ image_data = path.read_bytes()
93
+ base64_image = base64.b64encode(image_data).decode("utf-8")
94
+ mime_type = mimetypes.guess_type(str(path))[0] or "image/jpeg"
95
+ url = f"data:{mime_type};base64,{base64_image}"
96
+
97
+ if content is not None and mime_type is not None:
98
+ base64_image = base64.b64encode(content).decode("utf-8")
99
+ url = f"data:{mime_type};base64,{base64_image}"
100
+
101
+ image_url = ImageURL(url=url or "", detail=detail)
102
+ part = ChatCompletionContentPartImageParam(
103
+ type="image_url",
104
+ image_url=image_url,
105
+ )
106
+ self._messages.append(part)
107
+ return self
108
+
109
+ @property
110
+ def user_message(self) -> ChatCompletionUserMessageParam:
111
+ return ChatCompletionUserMessageParam(
112
+ content=self._messages,
113
+ role="user",
114
+ )
115
+
116
+ @property
117
+ def iterable_content(self) -> Iterable[ChatCompletionContentPartParam]:
118
+ return self._messages
119
+
120
+
121
+ class OpenAIMessageBuilder:
122
+ def __init__(
123
+ self,
124
+ messages: list[ChatCompletionMessageParam] | None = None,
125
+ ) -> None:
126
+ self._messages: list[ChatCompletionMessageParam] = []
127
+ if messages:
128
+ self._messages = messages
129
+
130
+ @classmethod
131
+ def from_messages(cls, messages: list[ChatCompletionMessageParam]) -> Self:
132
+ builder = cls()
133
+ builder._messages = messages.copy()
134
+ return builder
135
+
136
+ def append(self, message: ChatCompletionMessageParam):
137
+ self._messages.append(message)
138
+
139
+ def system_message_append(
140
+ self,
141
+ content: str | Iterable[ChatCompletionContentPartTextParam],
142
+ name: str = "system",
143
+ ) -> Self:
144
+ self._messages.append(
145
+ ChatCompletionSystemMessageParam(
146
+ content=content,
147
+ role="system",
148
+ ),
149
+ )
150
+ return self
151
+
152
+ def user_message_append(
153
+ self,
154
+ content: str | Iterable[ChatCompletionContentPartParam],
155
+ name: str = "user",
156
+ ) -> Self:
157
+ self._messages.append(
158
+ ChatCompletionUserMessageParam(
159
+ content=content,
160
+ role="user",
161
+ ),
162
+ )
163
+ return self
164
+
165
+ def assistant_message_append(
166
+ self,
167
+ content: str | Iterable[ContentArrayOfContentPart] | None = None,
168
+ name: str = "assistant",
169
+ audio: Audio | None = None,
170
+ function_call: FunctionCall | None = None,
171
+ refusal: str | None = None,
172
+ tool_calls: Iterable[ChatCompletionMessageToolCallParam] | None = None,
173
+ ) -> Self:
174
+ self._messages.append(
175
+ ChatCompletionAssistantMessageParam(
176
+ content=content,
177
+ role="assistant",
178
+ audio=audio,
179
+ function_call=function_call,
180
+ refusal=refusal,
181
+ tool_calls=tool_calls or [],
182
+ ),
183
+ )
184
+ return self
185
+
186
+ def developper_message_append(
187
+ self,
188
+ content: str | Iterable[ChatCompletionContentPartTextParam],
189
+ name: str = "developer",
190
+ ) -> Self:
191
+ self._messages.append(
192
+ ChatCompletionDeveloperMessageParam(
193
+ content=content,
194
+ role="developer",
195
+ ),
196
+ )
197
+ return self
198
+
199
+ def function_message_append(
200
+ self,
201
+ content: str | None,
202
+ name: str = "function",
203
+ ) -> Self:
204
+ self._messages.append(
205
+ ChatCompletionFunctionMessageParam(
206
+ content=content,
207
+ role="function",
208
+ name=name,
209
+ ),
210
+ )
211
+ return self
212
+
213
+ def tool_message_append(
214
+ self,
215
+ content: str | Iterable[ChatCompletionContentPartTextParam],
216
+ tool_call_id: str,
217
+ ) -> Self:
218
+ self._messages.append(
219
+ ChatCompletionToolMessageParam(
220
+ content=content,
221
+ role="tool",
222
+ tool_call_id=tool_call_id,
223
+ ),
224
+ )
225
+ return self
226
+
227
+ @property
228
+ def messages(self) -> list[ChatCompletionMessageParam]:
229
+ return self._messages
@@ -0,0 +1,23 @@
1
+ from unique_toolkit.app.unique_settings import UniqueApp, UniqueAuth
2
+
3
+
4
+ def auth_headers(auth_settings: UniqueAuth) -> dict[str, str]:
5
+ return {
6
+ "x-user-id": auth_settings.user_id.get_secret_value(),
7
+ "x-company-id": auth_settings.company_id.get_secret_value(),
8
+ }
9
+
10
+
11
+ def app_headers(app_settings: UniqueApp) -> dict[str, str]:
12
+ return {
13
+ "x-app-id": app_settings.id.get_secret_value(),
14
+ "Authorization": f"Bearer {app_settings.key.get_secret_value()}",
15
+ }
16
+
17
+
18
+ def get_default_headers(app_settings: UniqueApp, auth_settings: UniqueAuth):
19
+ default_headers = {}
20
+ default_headers.update(app_headers(app_settings))
21
+ default_headers.update(auth_headers(auth_settings))
22
+ default_headers["x-api-version"] = "2023-12-06"
23
+ return default_headers
@@ -43,6 +43,9 @@ from .schemas import (
43
43
  from .schemas import (
44
44
  LanguageModelTool as LanguageModelTool,
45
45
  )
46
+ from .schemas import (
47
+ LanguageModelToolDescription as LanguageModelToolDescription,
48
+ )
46
49
  from .schemas import (
47
50
  LanguageModelToolMessage as LanguageModelToolMessage,
48
51
  )
@@ -1,4 +1,4 @@
1
- from typing_extensions import Self
1
+ from typing import Any, Self
2
2
 
3
3
  from unique_toolkit.language_model import (
4
4
  LanguageModelAssistantMessage,
@@ -17,6 +17,10 @@ class MessagesBuilder:
17
17
  def __init__(self):
18
18
  self.messages: list[LanguageModelMessage] = []
19
19
 
20
+ def append(self, message: LanguageModelMessage) -> Self:
21
+ self.messages.append(message)
22
+ return self
23
+
20
24
  def message_append(self, role: LanguageModelMessageRole, content: str):
21
25
  message = LanguageModelMessage(role=role, content=content)
22
26
  self.messages.append(message)
@@ -35,23 +39,33 @@ class MessagesBuilder:
35
39
  return self # Return self to allow method chaining
36
40
 
37
41
  def image_message_append(
38
- self, content: str, images: list[str], role=LanguageModelMessageRole.USER
42
+ self,
43
+ content: str,
44
+ images: list[str],
45
+ role: LanguageModelMessageRole = LanguageModelMessageRole.USER,
39
46
  ) -> Self:
47
+ final_content: list[dict[str, Any]] = [{"type": "text", "text": content}]
48
+ final_content.extend(
49
+ [
50
+ {
51
+ "type": "image_url",
52
+ "imageUrl": {"url": image},
53
+ }
54
+ for image in images
55
+ ],
56
+ )
57
+
40
58
  message = LanguageModelMessage(
41
59
  role=role,
42
- content=[
43
- {"type": "text", "text": content},
44
- *[
45
- {"type": "image_url", "imageUrl": {"url": image}}
46
- for image in images
47
- ],
48
- ],
60
+ content=final_content,
49
61
  )
50
62
  self.messages.append(message)
51
63
  return self
52
64
 
53
65
  def assistant_message_append(
54
- self, content: str, tool_calls: list[LanguageModelFunction] | None = None
66
+ self,
67
+ content: str,
68
+ tool_calls: list[LanguageModelFunction] | None = None,
55
69
  ) -> Self:
56
70
  """Appends an assistant message to the messages list."""
57
71
  message = LanguageModelAssistantMessage(content=content)
@@ -70,7 +84,9 @@ class MessagesBuilder:
70
84
  def tool_message_append(self, name: str, tool_call_id: str, content: str) -> Self:
71
85
  """Appends a tool message to the messages list."""
72
86
  message = LanguageModelToolMessage(
73
- name=name, tool_call_id=tool_call_id, content=content
87
+ name=name,
88
+ tool_call_id=tool_call_id,
89
+ content=content,
74
90
  )
75
91
  self.messages.append(message)
76
92
  return self
@@ -0,0 +1,3 @@
1
+ from unique_toolkit.language_model.infos import LanguageModelName
2
+
3
+ DEFAULT_GPT_4o = LanguageModelName.AZURE_GPT_4o_2024_1120