unique_toolkit 0.6.1__tar.gz → 0.6.2__tar.gz

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.
Files changed (66) hide show
  1. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/CHANGELOG.md +6 -0
  2. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/PKG-INFO +7 -1
  3. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/pyproject.toml +1 -1
  4. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/config.py +1 -1
  5. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/context_relevancy/constants.py +1 -1
  6. unique_toolkit-0.6.2/unique_toolkit/language_model/infos.py +352 -0
  7. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/language_model/schemas.py +46 -24
  8. unique_toolkit-0.6.1/unique_toolkit/language_model/infos.py +0 -413
  9. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/LICENSE +0 -0
  10. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/README.md +0 -0
  11. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/__init__.py +0 -0
  12. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/_common/_base_service.py +0 -0
  13. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/_common/_time_utils.py +0 -0
  14. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/_common/exception.py +0 -0
  15. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/_common/validate_required_values.py +0 -0
  16. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/_common/validators.py +0 -0
  17. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/app/__init__.py +0 -0
  18. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/app/init_logging.py +0 -0
  19. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/app/init_sdk.py +0 -0
  20. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/app/performance/async_tasks.py +0 -0
  21. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  22. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/app/schemas.py +0 -0
  23. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/app/verification.py +0 -0
  24. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/chat/__init__.py +0 -0
  25. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/chat/constants.py +0 -0
  26. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/chat/functions.py +0 -0
  27. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/chat/schemas.py +0 -0
  28. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/chat/service.py +0 -0
  29. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/chat/state.py +0 -0
  30. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/chat/utils.py +0 -0
  31. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/content/__init__.py +0 -0
  32. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/content/constants.py +0 -0
  33. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/content/functions.py +0 -0
  34. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/content/schemas.py +0 -0
  35. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/content/service.py +0 -0
  36. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/content/utils.py +0 -0
  37. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/embedding/__init__.py +0 -0
  38. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/embedding/constants.py +0 -0
  39. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/embedding/functions.py +0 -0
  40. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/embedding/schemas.py +0 -0
  41. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/embedding/service.py +0 -0
  42. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/embedding/utils.py +0 -0
  43. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/__init__.py +0 -0
  44. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/constants.py +0 -0
  45. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/context_relevancy/prompts.py +0 -0
  46. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/context_relevancy/service.py +0 -0
  47. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/context_relevancy/utils.py +0 -0
  48. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/exception.py +0 -0
  49. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/hallucination/constants.py +0 -0
  50. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/hallucination/prompts.py +0 -0
  51. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/hallucination/service.py +0 -0
  52. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/hallucination/utils.py +0 -0
  53. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/output_parser.py +0 -0
  54. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/evaluators/schemas.py +0 -0
  55. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/language_model/__init__.py +0 -0
  56. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/language_model/builder.py +0 -0
  57. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/language_model/constants.py +0 -0
  58. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/language_model/functions.py +0 -0
  59. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/language_model/prompt.py +0 -0
  60. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/language_model/service.py +0 -0
  61. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/language_model/utils.py +0 -0
  62. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/short_term_memory/__init__.py +0 -0
  63. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/short_term_memory/constants.py +0 -0
  64. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/short_term_memory/functions.py +0 -0
  65. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/short_term_memory/schemas.py +0 -0
  66. {unique_toolkit-0.6.1 → unique_toolkit-0.6.2}/unique_toolkit/short_term_memory/service.py +0 -0
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.6.2] - 2025-02-25
9
+ - Deprecate `LanguageModel` in favor of `LanguageModelInfo`
10
+ - `LanguageModelTokenLimits` properties become mandatory, initialization allows
11
+ - init with `token_limit` and `fraction_input` or `input_token_limit` and `output_token_limit`
12
+ - only `input_token_limit` and `output_token_limit` are members of model
13
+
8
14
  ## [0.6.1] - 2025-02-25
9
15
  - [BREAKING] `LanguageModelService.stream_complete` and `LanguageModelService.stream_complete_async` are now moved to `ChatService.stream_complete` and `ChatService.stream_complete_async`. Correspondingly `assistant_message_id` and `user_message_id` are removed from `LanguageModelService`.
10
16
  - Add `create_user_message` and `create_user_message_async` to `ChatService` (similar to `create_assistant_message` and `create_assistant_message_async`)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 0.6.1
3
+ Version: 0.6.2
4
4
  Summary:
5
5
  License: Proprietary
6
6
  Author: Martin Fadler
@@ -111,6 +111,12 @@ All notable changes to this project will be documented in this file.
111
111
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
112
112
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
113
113
 
114
+ ## [0.6.2] - 2025-02-25
115
+ - Deprecate `LanguageModel` in favor of `LanguageModelInfo`
116
+ - `LanguageModelTokenLimits` properties become mandatory, initialization allows
117
+ - init with `token_limit` and `fraction_input` or `input_token_limit` and `output_token_limit`
118
+ - only `input_token_limit` and `output_token_limit` are members of model
119
+
114
120
  ## [0.6.1] - 2025-02-25
115
121
  - [BREAKING] `LanguageModelService.stream_complete` and `LanguageModelService.stream_complete_async` are now moved to `ChatService.stream_complete` and `ChatService.stream_complete_async`. Correspondingly `assistant_message_id` and `user_message_id` are removed from `LanguageModelService`.
116
122
  - Add `create_user_message` and `create_user_message_async` to `ChatService` (similar to `create_assistant_message` and `create_assistant_message_async`)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_toolkit"
3
- version = "0.6.1"
3
+ version = "0.6.2"
4
4
  description = ""
5
5
  authors = [
6
6
  "Martin Fadler <martin.fadler@unique.ch>",
@@ -25,7 +25,7 @@ class EvaluationMetricConfig(BaseModel):
25
25
  enabled: bool = False
26
26
  name: EvaluationMetricName
27
27
  language_model: LanguageModel = LanguageModel(
28
- LanguageModelName.AZURE_GPT_35_TURBO_0613
28
+ LanguageModelName.AZURE_GPT_35_TURBO_0125
29
29
  )
30
30
  custom_prompts: dict[str, str] = {}
31
31
  score_to_emoji: dict[str, str] = {}
@@ -23,7 +23,7 @@ context_relevancy_required_input_fields = [
23
23
  default_config = EvaluationMetricConfig(
24
24
  enabled=False,
25
25
  name=EvaluationMetricName.CONTEXT_RELEVANCY,
26
- language_model=LanguageModel(LanguageModelName.AZURE_GPT_35_TURBO_0613),
26
+ language_model=LanguageModel(LanguageModelName.AZURE_GPT_35_TURBO_0125),
27
27
  score_to_emoji={"LOW": "🟢", "MEDIUM": "🟡", "HIGH": "🔴"},
28
28
  custom_prompts={
29
29
  SYSTEM_MSG_KEY: CONTEXT_RELEVANCY_METRIC_SYSTEM_MSG,
@@ -0,0 +1,352 @@
1
+ from datetime import date
2
+ from enum import StrEnum
3
+ from typing import ClassVar, Optional
4
+
5
+ from pydantic import BaseModel
6
+ from typing_extensions import deprecated
7
+
8
+ from unique_toolkit.language_model.schemas import LanguageModelTokenLimits
9
+
10
+
11
+ class LanguageModelName(StrEnum):
12
+ AZURE_GPT_35_TURBO_0125 = "AZURE_GPT_35_TURBO_0125"
13
+ AZURE_GPT_4_0613 = "AZURE_GPT_4_0613"
14
+ AZURE_GPT_4_TURBO_1106 = "AZURE_GPT_4_TURBO_1106"
15
+ AZURE_GPT_4_VISION_PREVIEW = "AZURE_GPT_4_VISION_PREVIEW"
16
+ AZURE_GPT_4_32K_0613 = "AZURE_GPT_4_32K_0613"
17
+ AZURE_GPT_4_TURBO_2024_0409 = "AZURE_GPT_4_TURBO_2024_0409"
18
+ AZURE_GPT_4o_2024_0513 = "AZURE_GPT_4o_2024_0513"
19
+ AZURE_GPT_4o_2024_0806 = "AZURE_GPT_4o_2024_0806"
20
+ AZURE_GPT_4o_MINI_2024_0718 = "AZURE_GPT_4o_MINI_2024_0718"
21
+
22
+
23
+ class EncoderName(StrEnum):
24
+ O200K_BASE = "o200k_base"
25
+ CL100K_BASE = "cl100k_base"
26
+
27
+
28
+ def get_encoder_name(model_name: LanguageModelName) -> Optional[EncoderName]:
29
+ LMN = LanguageModelName
30
+ match model_name:
31
+ case LMN.AZURE_GPT_35_TURBO_0125:
32
+ return EncoderName.CL100K_BASE
33
+ case (
34
+ LMN.AZURE_GPT_4_0613
35
+ | LMN.AZURE_GPT_4_TURBO_1106
36
+ | LMN.AZURE_GPT_4_VISION_PREVIEW
37
+ | LMN.AZURE_GPT_4_32K_0613
38
+ | LMN.AZURE_GPT_4_TURBO_2024_0409
39
+ ):
40
+ return EncoderName.CL100K_BASE
41
+ case (
42
+ LMN.AZURE_GPT_4o_2024_0513
43
+ | LMN.AZURE_GPT_4o_2024_0806
44
+ | LMN.AZURE_GPT_4o_MINI_2024_0718
45
+ ):
46
+ return EncoderName.O200K_BASE
47
+ case _:
48
+ print(f"{model_name} is not supported. Please add encoder information.")
49
+ return None
50
+
51
+
52
+ class LanguageModelProvider(StrEnum):
53
+ AZURE = "AZURE"
54
+ CUSTOM = "CUSTOM"
55
+
56
+
57
+ class LanguageModelInfo(BaseModel):
58
+ name: LanguageModelName | str
59
+ version: str
60
+ provider: LanguageModelProvider
61
+
62
+ encoder_name: Optional[EncoderName] = None
63
+ token_limits: Optional[LanguageModelTokenLimits] = None
64
+
65
+ info_cutoff_at: Optional[date] = None
66
+ published_at: Optional[date] = None
67
+ retirement_at: Optional[date] = None
68
+
69
+ deprecated_at: Optional[date] = None
70
+ retirement_text: Optional[str] = None
71
+
72
+ @classmethod
73
+ def from_name(cls, model_name: LanguageModelName):
74
+ match model_name:
75
+ case LanguageModelName.AZURE_GPT_35_TURBO_0125:
76
+ return cls(
77
+ name=model_name,
78
+ provider=LanguageModelProvider.AZURE,
79
+ version="0125",
80
+ encoder_name=get_encoder_name(model_name),
81
+ token_limits=LanguageModelTokenLimits(
82
+ token_limit_input=16385, token_limit_output=4096
83
+ ),
84
+ info_cutoff_at=date(2021, 9, 1),
85
+ published_at=date(2023, 1, 25),
86
+ retirement_at=date(5, 3, 31),
87
+ )
88
+ case LanguageModelName.AZURE_GPT_4_0613:
89
+ return cls(
90
+ name=model_name,
91
+ provider=LanguageModelProvider.AZURE,
92
+ version="0613",
93
+ encoder_name=get_encoder_name(model_name),
94
+ token_limits=LanguageModelTokenLimits(token_limit=8192),
95
+ info_cutoff_at=date(2021, 9, 1),
96
+ published_at=date(2023, 6, 13),
97
+ deprecated_at=date(2024, 10, 1),
98
+ retirement_at=date(2025, 6, 6),
99
+ )
100
+ case LanguageModelName.AZURE_GPT_4_TURBO_1106:
101
+ return cls(
102
+ name=model_name,
103
+ provider=LanguageModelProvider.AZURE,
104
+ version="1106-preview",
105
+ encoder_name=get_encoder_name(model_name),
106
+ token_limits=LanguageModelTokenLimits(
107
+ token_limit_input=128000, token_limit_output=4096
108
+ ),
109
+ info_cutoff_at=date(2023, 4, 1),
110
+ published_at=date(2023, 11, 6),
111
+ )
112
+ case LanguageModelName.AZURE_GPT_4_VISION_PREVIEW:
113
+ return cls(
114
+ name=model_name,
115
+ provider=LanguageModelProvider.AZURE,
116
+ version="vision-preview",
117
+ encoder_name=get_encoder_name(model_name),
118
+ token_limits=LanguageModelTokenLimits(
119
+ token_limit_input=128000, token_limit_output=4096
120
+ ),
121
+ info_cutoff_at=date(2023, 4, 1),
122
+ published_at=date(2023, 11, 6),
123
+ )
124
+ case LanguageModelName.AZURE_GPT_4_32K_0613:
125
+ return cls(
126
+ name=model_name,
127
+ provider=LanguageModelProvider.AZURE,
128
+ version="1106-preview",
129
+ encoder_name=get_encoder_name(model_name),
130
+ token_limits=LanguageModelTokenLimits(token_limit=32768),
131
+ info_cutoff_at=date(2021, 9, 1),
132
+ published_at=date(2023, 6, 13),
133
+ deprecated_at=date(2024, 10, 1),
134
+ retirement_at=date(2025, 6, 6),
135
+ )
136
+ case LanguageModelName.AZURE_GPT_4_TURBO_2024_0409:
137
+ return cls(
138
+ name=model_name,
139
+ encoder_name=get_encoder_name(model_name),
140
+ provider=LanguageModelProvider.AZURE,
141
+ version="turbo-2024-04-09",
142
+ token_limits=LanguageModelTokenLimits(
143
+ token_limit_input=128000, token_limit_output=4096
144
+ ),
145
+ info_cutoff_at=date(2023, 12, 1),
146
+ published_at=date(2024, 4, 9),
147
+ )
148
+ case LanguageModelName.AZURE_GPT_4o_2024_0513:
149
+ return cls(
150
+ name=model_name,
151
+ encoder_name=get_encoder_name(model_name),
152
+ provider=LanguageModelProvider.AZURE,
153
+ version="2024-05-13",
154
+ token_limits=LanguageModelTokenLimits(
155
+ token_limit_input=128000, token_limit_output=4096
156
+ ),
157
+ info_cutoff_at=date(2023, 10, 1),
158
+ published_at=date(2024, 5, 13),
159
+ )
160
+ case LanguageModelName.AZURE_GPT_4o_2024_0806:
161
+ return cls(
162
+ name=model_name,
163
+ encoder_name=get_encoder_name(model_name),
164
+ provider=LanguageModelProvider.AZURE,
165
+ version="2024-08-06",
166
+ token_limits=LanguageModelTokenLimits(
167
+ token_limit_input=128000, token_limit_output=16384
168
+ ),
169
+ info_cutoff_at=date(2023, 10, 1),
170
+ published_at=date(2024, 8, 6),
171
+ )
172
+ case LanguageModelName.AZURE_GPT_4o_MINI_2024_0718:
173
+ return cls(
174
+ name=model_name,
175
+ provider=LanguageModelProvider.AZURE,
176
+ version="2024-07-18",
177
+ encoder_name=get_encoder_name(model_name),
178
+ token_limits=LanguageModelTokenLimits(
179
+ token_limit_input=128000, token_limit_output=16384
180
+ ),
181
+ info_cutoff_at=date(2023, 10, 1),
182
+ published_at=date(2024, 7, 18),
183
+ )
184
+ case _:
185
+ if isinstance(model_name, LanguageModelName):
186
+ raise ValueError(
187
+ f"{model_name} is not supported. Please add model information in toolkit."
188
+ )
189
+
190
+ return cls(
191
+ name=model_name,
192
+ version="custom",
193
+ provider=LanguageModelProvider.CUSTOM,
194
+ )
195
+
196
+ @property
197
+ def display_name(self) -> str:
198
+ """
199
+ Returns the name of the model as a string.
200
+ """
201
+
202
+ if isinstance(self.name, LanguageModelName):
203
+ return self.name.value
204
+ else:
205
+ return self.name
206
+
207
+
208
+ @deprecated(
209
+ """
210
+ Use `LanguageModelInfo` instead of `LanguageModel`
211
+ """
212
+ )
213
+ class LanguageModel:
214
+ _info: ClassVar[LanguageModelInfo]
215
+
216
+ def __init__(self, model_name: LanguageModelName | str):
217
+ self._model_info = self.get_model_info(model_name)
218
+
219
+ @property
220
+ def info(self) -> LanguageModelInfo:
221
+ """
222
+ Returns all infos about the model:
223
+ - name
224
+ - version
225
+ - provider
226
+ - encoder_name
227
+ - token_limits
228
+ - info_cutoff_at
229
+ - published_at
230
+ - retirement_at
231
+ - deprecated_at
232
+ - retirement_text
233
+ """
234
+ return self._model_info
235
+
236
+ @property
237
+ def name(self) -> LanguageModelName | str:
238
+ """
239
+ Returns the LanguageModelName of the model or the name string when it is a custom / not defined model.
240
+ """
241
+ return self._model_info.name
242
+
243
+ @property
244
+ def display_name(self) -> str:
245
+ """
246
+ Returns the name of the model as a string.
247
+ """
248
+ if isinstance(self._model_info.name, LanguageModelName):
249
+ return self._model_info.name.name
250
+ else:
251
+ return self._model_info.name
252
+
253
+ @property
254
+ def version(self) -> Optional[str]:
255
+ """
256
+ Returns the version of the model.
257
+ """
258
+ return self._model_info.version
259
+
260
+ @property
261
+ def encoder_name(self) -> Optional[EncoderName]:
262
+ """
263
+ Returns the encoder_name used for the model.
264
+ """
265
+ return self._model_info.encoder_name
266
+
267
+ @property
268
+ def token_limit(self) -> Optional[int]:
269
+ """
270
+ Returns the maximum number of tokens for the model.
271
+ """
272
+ if self._model_info.token_limits:
273
+ return self._model_info.token_limits.token_limit
274
+
275
+ @property
276
+ def token_limit_input(self) -> Optional[int]:
277
+ """
278
+ Returns the maximum number of input tokens for the model.
279
+ """
280
+ if self._model_info.token_limits:
281
+ return self._model_info.token_limits.token_limit_input
282
+
283
+ @property
284
+ def token_limit_output(self) -> Optional[int]:
285
+ """
286
+ Returns the maximum number of output tokens for the model.
287
+ """
288
+ if self._model_info.token_limits:
289
+ return self._model_info.token_limits.token_limit_output
290
+
291
+ @property
292
+ def info_cutoff_at(self) -> Optional[date]:
293
+ """
294
+ Returns the date the model was last updated.
295
+ """
296
+ return self._model_info.info_cutoff_at
297
+
298
+ @property
299
+ def published_at(self) -> Optional[date]:
300
+ """
301
+ Returns the date the model was published.
302
+ """
303
+ return self._model_info.published_at
304
+
305
+ @property
306
+ def retirement_at(self) -> Optional[date]:
307
+ """
308
+ Returns the date the model will be retired.
309
+ """
310
+ return self._model_info.retirement_at
311
+
312
+ @property
313
+ def deprecated_at(self) -> Optional[date]:
314
+ """
315
+ Returns the date the model was deprecated.
316
+ """
317
+ return self._model_info.deprecated_at
318
+
319
+ @property
320
+ def retirement_text(self) -> Optional[str]:
321
+ """
322
+ Returns the text that will be displayed when the model is retired.
323
+ """
324
+ return self._model_info.retirement_text
325
+
326
+ @property
327
+ def provider(self) -> LanguageModelProvider:
328
+ """
329
+ Returns the provider of the model.
330
+ """
331
+ return self._model_info.provider
332
+
333
+ @classmethod
334
+ def get_model_info(cls, model_name: LanguageModelName | str) -> LanguageModelInfo:
335
+ if isinstance(model_name, LanguageModelName):
336
+ return LanguageModelInfo.from_name(model_name)
337
+
338
+ return LanguageModelInfo(
339
+ name=model_name,
340
+ version="custom",
341
+ provider=LanguageModelProvider.CUSTOM,
342
+ )
343
+
344
+ @classmethod
345
+ def list_models(cls) -> list[LanguageModelInfo]:
346
+ """
347
+ Returns a list of the infos of all available models.
348
+ """
349
+
350
+ return [
351
+ LanguageModelInfo.from_name(model_name=name) for name in LanguageModelName
352
+ ]
@@ -9,11 +9,13 @@ from pydantic import (
9
9
  BaseModel,
10
10
  ConfigDict,
11
11
  Field,
12
+ PrivateAttr,
12
13
  RootModel,
13
14
  field_validator,
14
15
  model_serializer,
15
16
  model_validator,
16
17
  )
18
+ from typing_extensions import deprecated
17
19
 
18
20
  from unique_toolkit.language_model.utils import format_message
19
21
 
@@ -205,30 +207,50 @@ class LanguageModelStreamResponse(BaseModel):
205
207
 
206
208
 
207
209
  class LanguageModelTokenLimits(BaseModel):
208
- token_limit: Optional[int] = None
209
- token_limit_input: Optional[int] = None
210
- token_limit_output: Optional[int] = None
211
-
212
- fraction_input: float = Field(default=0.4, le=1, ge=0)
213
-
214
- @model_validator(mode="after")
215
- def check_required_fields(self):
216
- # Best case input and output is determined
217
- if self.token_limit_input and self.token_limit_output:
218
- self.token_limit = self.token_limit_input + self.token_limit_output
219
- self.fraction_input = self.token_limit_input / self.token_limit
220
- return self
221
-
222
- # Deal with case where only token_limit and optional fraction_input is given
223
- if self.token_limit:
224
- if not self.fraction_input:
225
- self.fraction_input = 0.4
226
-
227
- self.token_limit_input = math.floor(self.fraction_input * self.token_limit)
228
- self.token_limit_output = math.floor(
229
- (1 - self.fraction_input) * self.token_limit
230
- )
231
- return self
210
+ token_limit_input: int
211
+ token_limit_output: int
212
+
213
+ _fraction_adaptable = PrivateAttr(default=False)
214
+
215
+ @property
216
+ @deprecated("""
217
+ Deprecated: Use the more specific `token_limit_input` and `token_limit_output` instead.
218
+ """)
219
+ def token_limit(self):
220
+ return self.token_limit_input + self.token_limit_output
221
+
222
+ @token_limit.setter
223
+ @deprecated("""
224
+ Deprecated: Token limit can only be reduced
225
+ """)
226
+ def token_limit(self, token_limit, fraction_input=0.4):
227
+ if self.token_limit > token_limit:
228
+ self.token_limit_input = math.floor(fraction_input * token_limit)
229
+ self.token_limit_output = math.floor((1 - fraction_input) * token_limit)
230
+ self._fraction_adaptable = True
231
+
232
+ def adapt_fraction(self, fraction_input: float):
233
+ if self._fraction_adaptable:
234
+ token_limit = self.token_limit_input + self.token_limit_output
235
+ self.token_limit_input = math.floor(fraction_input * token_limit)
236
+ self.token_limit_output = math.floor((1 - fraction_input) * token_limit)
237
+
238
+ @model_validator(mode="before")
239
+ def check_required_fields(cls, data):
240
+ if isinstance(data, dict):
241
+ if {"token_limit_input", "token_limit_output"}.issubset(data.keys()):
242
+ return data
243
+
244
+ if {"token_limit"}.issubset(data.keys()):
245
+ token_limit = data.get("token_limit")
246
+ fraction_input = data.get("fraction_input", 0.4)
247
+
248
+ data["token_limit_input"] = math.floor(fraction_input * token_limit)
249
+ data["token_limit_output"] = math.floor(
250
+ (1 - fraction_input) * token_limit
251
+ )
252
+ data["_fraction_adaptpable"] = True
253
+ return data
232
254
 
233
255
  raise ValueError(
234
256
  'Either "token_limit_input" and "token_limit_output" must be provided together, or "token_limit" must be provided.'
@@ -1,413 +0,0 @@
1
- from datetime import date
2
- from enum import StrEnum
3
- from typing import ClassVar, Optional, Type, cast
4
-
5
- from pydantic import BaseModel
6
-
7
- from unique_toolkit.language_model.schemas import LanguageModelTokenLimits
8
-
9
-
10
- class LanguageModelName(StrEnum):
11
- AZURE_GPT_35_TURBO_0613 = "AZURE_GPT_35_TURBO_0613"
12
- AZURE_GPT_35_TURBO = "AZURE_GPT_35_TURBO"
13
- AZURE_GPT_35_TURBO_16K = "AZURE_GPT_35_TURBO_16K"
14
- AZURE_GPT_35_TURBO_0125 = "AZURE_GPT_35_TURBO_0125"
15
- AZURE_GPT_4_0613 = "AZURE_GPT_4_0613"
16
- AZURE_GPT_4_TURBO_1106 = "AZURE_GPT_4_TURBO_1106"
17
- AZURE_GPT_4_VISION_PREVIEW = "AZURE_GPT_4_VISION_PREVIEW"
18
- AZURE_GPT_4_32K_0613 = "AZURE_GPT_4_32K_0613"
19
- AZURE_GPT_4_TURBO_2024_0409 = "AZURE_GPT_4_TURBO_2024_0409"
20
- AZURE_GPT_4o_2024_0513 = "AZURE_GPT_4o_2024_0513"
21
- AZURE_GPT_4o_2024_0806 = "AZURE_GPT_4o_2024_0806"
22
- AZURE_GPT_4o_MINI_2024_0718 = "AZURE_GPT_4o_MINI_2024_0718"
23
-
24
-
25
- class EncoderName(StrEnum):
26
- O200K_BASE = "o200k_base"
27
- CL100K_BASE = "cl100k_base"
28
-
29
-
30
- def get_encoder_name(model_name: LanguageModelName) -> Optional[EncoderName]:
31
- LMN = LanguageModelName
32
- match model_name:
33
- case (
34
- LMN.AZURE_GPT_35_TURBO
35
- | LMN.AZURE_GPT_35_TURBO_16K
36
- | LMN.AZURE_GPT_35_TURBO_0613
37
- | LMN.AZURE_GPT_35_TURBO_0125
38
- ):
39
- return EncoderName.CL100K_BASE
40
- case (
41
- LMN.AZURE_GPT_4_0613
42
- | LMN.AZURE_GPT_4_TURBO_1106
43
- | LMN.AZURE_GPT_4_VISION_PREVIEW
44
- | LMN.AZURE_GPT_4_32K_0613
45
- | LMN.AZURE_GPT_4_TURBO_2024_0409
46
- ):
47
- return EncoderName.CL100K_BASE
48
- case (
49
- LMN.AZURE_GPT_4o_2024_0513
50
- | LMN.AZURE_GPT_4o_2024_0806
51
- | LMN.AZURE_GPT_4o_MINI_2024_0718
52
- ):
53
- return EncoderName.O200K_BASE
54
- case _:
55
- print(f"{model_name} is not supported. Please add encoder information.")
56
- return None
57
-
58
-
59
- class LanguageModelProvider(StrEnum):
60
- AZURE = "AZURE"
61
- CUSTOM = "CUSTOM"
62
-
63
-
64
- class LanguageModelInfo(BaseModel):
65
- name: LanguageModelName | str
66
- version: str
67
- provider: LanguageModelProvider
68
-
69
- encoder_name: Optional[EncoderName] = None
70
- token_limits: Optional[LanguageModelTokenLimits] = None
71
-
72
- info_cutoff_at: Optional[date] = None
73
- published_at: Optional[date] = None
74
- retirement_at: Optional[date] = None
75
-
76
- deprecated_at: Optional[date] = None
77
- retirement_text: Optional[str] = None
78
-
79
-
80
- class LanguageModel:
81
- _info: ClassVar[LanguageModelInfo]
82
-
83
- def __init__(self, model_name: LanguageModelName | str):
84
- self._model_info = self.get_model_info(model_name)
85
-
86
- @property
87
- def info(self) -> LanguageModelInfo:
88
- """
89
- Returns all infos about the model:
90
- - name
91
- - version
92
- - provider
93
- - encoder_name
94
- - token_limits
95
- - info_cutoff_at
96
- - published_at
97
- - retirement_at
98
- - deprecated_at
99
- - retirement_text
100
- """
101
- return self._model_info
102
-
103
- @property
104
- def name(self) -> LanguageModelName | str:
105
- """
106
- Returns the LanguageModelName of the model or the name string when it is a custom / not defined model.
107
- """
108
- return self._model_info.name
109
-
110
- @property
111
- def display_name(self) -> str:
112
- """
113
- Returns the name of the model as a string.
114
- """
115
- if isinstance(self._model_info.name, LanguageModelName):
116
- return self._model_info.name.name
117
- else:
118
- return self._model_info.name
119
-
120
- @property
121
- def version(self) -> Optional[str]:
122
- """
123
- Returns the version of the model.
124
- """
125
- return self._model_info.version
126
-
127
- @property
128
- def encoder_name(self) -> Optional[EncoderName]:
129
- """
130
- Returns the encoder_name used for the model.
131
- """
132
- return self._model_info.encoder_name
133
-
134
- @property
135
- def token_limit(self) -> Optional[int]:
136
- """
137
- Returns the maximum number of tokens for the model.
138
- """
139
- if self._model_info.token_limits:
140
- return self._model_info.token_limits.token_limit
141
-
142
- @property
143
- def token_limit_input(self) -> Optional[int]:
144
- """
145
- Returns the maximum number of input tokens for the model.
146
- """
147
- if self._model_info.token_limits:
148
- return self._model_info.token_limits.token_limit_input
149
-
150
- @property
151
- def token_limit_output(self) -> Optional[int]:
152
- """
153
- Returns the maximum number of output tokens for the model.
154
- """
155
- if self._model_info.token_limits:
156
- return self._model_info.token_limits.token_limit_output
157
-
158
- @property
159
- def info_cutoff_at(self) -> Optional[date]:
160
- """
161
- Returns the date the model was last updated.
162
- """
163
- return self._model_info.info_cutoff_at
164
-
165
- @property
166
- def published_at(self) -> Optional[date]:
167
- """
168
- Returns the date the model was published.
169
- """
170
- return self._model_info.published_at
171
-
172
- @property
173
- def retirement_at(self) -> Optional[date]:
174
- """
175
- Returns the date the model will be retired.
176
- """
177
- return self._model_info.retirement_at
178
-
179
- @property
180
- def deprecated_at(self) -> Optional[date]:
181
- """
182
- Returns the date the model was deprecated.
183
- """
184
- return self._model_info.deprecated_at
185
-
186
- @property
187
- def retirement_text(self) -> Optional[str]:
188
- """
189
- Returns the text that will be displayed when the model is retired.
190
- """
191
- return self._model_info.retirement_text
192
-
193
- @property
194
- def provider(self) -> LanguageModelProvider:
195
- """
196
- Returns the provider of the model.
197
- """
198
- return self._model_info.provider
199
-
200
- @classmethod
201
- def get_model_info(cls, model_name: LanguageModelName | str) -> LanguageModelInfo:
202
- if not model_name:
203
- raise ValueError("Model name must be provided to get the model info.")
204
-
205
- for subclass in cls.__subclasses__():
206
- if hasattr(subclass, "info") and subclass._info.name == model_name:
207
- # TODO find alternative solution for warning
208
- # if subclass._info.retirement_at:
209
- # warning_text = f"WARNING: {subclass._info.name} will be retired on {subclass._info.retirement_at.isoformat()} and from then on not accessible anymore. {subclass._info.retirement_text}"
210
- # print(warning_text)
211
- # warnings.warn(warning_text, DeprecationWarning, stacklevel=2)
212
- return subclass._info
213
-
214
- return LanguageModelInfo(
215
- name=model_name,
216
- version="custom",
217
- provider=LanguageModelProvider.CUSTOM,
218
- )
219
-
220
- @classmethod
221
- def list_models(cls) -> list[LanguageModelInfo]:
222
- """
223
- Returns a list of the infos of all available models.
224
- """
225
-
226
- return [
227
- cast(LanguageModelInfo, subclass._info)
228
- for subclass in cls.__subclasses__()
229
- if hasattr(subclass, "_info")
230
- ]
231
-
232
-
233
- def create_language_model(
234
- name: LanguageModelName,
235
- version: str,
236
- provider: LanguageModelProvider,
237
- info_cutoff_at: date,
238
- published_at: date,
239
- encoder_name: Optional[EncoderName] = None,
240
- token_limit: Optional[int] = None,
241
- token_limit_input: Optional[int] = None,
242
- token_limit_output: Optional[int] = None,
243
- retirement_at: Optional[date] = None,
244
- deprecated_at: Optional[date] = None,
245
- retirement_text: Optional[str] = None,
246
- ) -> Type[LanguageModel]:
247
- info = LanguageModelInfo(
248
- name=name,
249
- version=version,
250
- provider=provider,
251
- encoder_name=encoder_name,
252
- token_limits=LanguageModelTokenLimits(
253
- token_limit=token_limit,
254
- token_limit_input=token_limit_input,
255
- token_limit_output=token_limit_output,
256
- ),
257
- info_cutoff_at=info_cutoff_at,
258
- published_at=published_at,
259
- retirement_at=retirement_at,
260
- deprecated_at=deprecated_at,
261
- retirement_text=retirement_text,
262
- )
263
-
264
- class Model(LanguageModel):
265
- _info = info
266
-
267
- return Model
268
-
269
-
270
- ############################################################################################################
271
- # Define the models here
272
- ############################################################################################################
273
-
274
-
275
- AzureGpt35Turbo0613 = create_language_model(
276
- name=LanguageModelName.AZURE_GPT_35_TURBO_0613,
277
- provider=LanguageModelProvider.AZURE,
278
- version="0613",
279
- encoder_name=get_encoder_name(LanguageModelName.AZURE_GPT_35_TURBO_0613),
280
- token_limit=8192,
281
- info_cutoff_at=date(2021, 9, 1),
282
- published_at=date(2023, 6, 13),
283
- retirement_at=date(2025, 2, 13),
284
- )
285
-
286
- AzureGpt35Turbo = create_language_model(
287
- name=LanguageModelName.AZURE_GPT_35_TURBO,
288
- provider=LanguageModelProvider.AZURE,
289
- version="0301",
290
- encoder_name=get_encoder_name(LanguageModelName.AZURE_GPT_35_TURBO),
291
- token_limit=4096,
292
- info_cutoff_at=date(2021, 9, 1),
293
- published_at=date(2023, 3, 1),
294
- retirement_at=date(2025, 2, 13),
295
- )
296
-
297
-
298
- AzureGpt35Turbo16k = create_language_model(
299
- name=LanguageModelName.AZURE_GPT_35_TURBO_16K,
300
- provider=LanguageModelProvider.AZURE,
301
- version="0613",
302
- encoder_name=get_encoder_name(LanguageModelName.AZURE_GPT_35_TURBO_16K),
303
- token_limit=16382,
304
- info_cutoff_at=date(2021, 9, 1),
305
- published_at=date(2023, 6, 13),
306
- retirement_at=date(2025, 2, 13),
307
- )
308
-
309
-
310
- AzureGpt35Turbo0125 = create_language_model(
311
- name=LanguageModelName.AZURE_GPT_35_TURBO_0125,
312
- provider=LanguageModelProvider.AZURE,
313
- version="0125",
314
- encoder_name=get_encoder_name(LanguageModelName.AZURE_GPT_35_TURBO_0125),
315
- token_limit_input=16385,
316
- token_limit_output=4096,
317
- info_cutoff_at=date(2021, 9, 1),
318
- published_at=date(2023, 1, 25),
319
- retirement_at=date(5, 3, 31),
320
- )
321
-
322
-
323
- AzureGpt40613 = create_language_model(
324
- name=LanguageModelName.AZURE_GPT_4_0613,
325
- provider=LanguageModelProvider.AZURE,
326
- version="0613",
327
- encoder_name=get_encoder_name(LanguageModelName.AZURE_GPT_4_0613),
328
- token_limit=8192,
329
- info_cutoff_at=date(2021, 9, 1),
330
- published_at=date(2023, 6, 13),
331
- deprecated_at=date(2024, 10, 1),
332
- retirement_at=date(2025, 6, 6),
333
- )
334
-
335
-
336
- AzureGpt4Turbo1106 = create_language_model(
337
- name=LanguageModelName.AZURE_GPT_4_TURBO_1106,
338
- provider=LanguageModelProvider.AZURE,
339
- version="1106-preview",
340
- encoder_name=get_encoder_name(LanguageModelName.AZURE_GPT_4_TURBO_1106),
341
- token_limit_input=128000,
342
- token_limit_output=4096,
343
- info_cutoff_at=date(2023, 4, 1),
344
- published_at=date(2023, 11, 6),
345
- )
346
-
347
-
348
- AzureGpt4VisionPreview = create_language_model(
349
- name=LanguageModelName.AZURE_GPT_4_VISION_PREVIEW,
350
- provider=LanguageModelProvider.AZURE,
351
- version="vision-preview",
352
- encoder_name=get_encoder_name(LanguageModelName.AZURE_GPT_4_VISION_PREVIEW),
353
- token_limit_input=128000,
354
- token_limit_output=4096,
355
- info_cutoff_at=date(2023, 4, 1),
356
- published_at=date(2023, 11, 6),
357
- )
358
-
359
- AzureGpt432k0613 = create_language_model(
360
- name=LanguageModelName.AZURE_GPT_4_32K_0613,
361
- provider=LanguageModelProvider.AZURE,
362
- version="1106-preview",
363
- encoder_name=get_encoder_name(LanguageModelName.AZURE_GPT_4_32K_0613),
364
- token_limit=32768,
365
- info_cutoff_at=date(2021, 9, 1),
366
- published_at=date(2023, 6, 13),
367
- deprecated_at=date(2024, 10, 1),
368
- retirement_at=date(2025, 6, 6),
369
- )
370
-
371
- AzureGpt4Turbo20240409 = create_language_model(
372
- name=LanguageModelName.AZURE_GPT_4_TURBO_2024_0409,
373
- encoder_name=get_encoder_name(LanguageModelName.AZURE_GPT_4_TURBO_2024_0409),
374
- provider=LanguageModelProvider.AZURE,
375
- version="turbo-2024-04-09",
376
- token_limit_input=128000,
377
- token_limit_output=4096,
378
- info_cutoff_at=date(2023, 12, 1),
379
- published_at=date(2024, 4, 9),
380
- )
381
-
382
- AzureGpt4o20240513 = create_language_model(
383
- name=LanguageModelName.AZURE_GPT_4o_2024_0513,
384
- encoder_name=get_encoder_name(LanguageModelName.AZURE_GPT_4o_2024_0513),
385
- provider=LanguageModelProvider.AZURE,
386
- version="2024-05-13",
387
- token_limit_input=128000,
388
- token_limit_output=4096,
389
- info_cutoff_at=date(2023, 10, 1),
390
- published_at=date(2024, 5, 13),
391
- )
392
-
393
- AzureGpt4o20240806 = create_language_model(
394
- name=LanguageModelName.AZURE_GPT_4o_2024_0806,
395
- encoder_name=get_encoder_name(LanguageModelName.AZURE_GPT_4o_2024_0806),
396
- provider=LanguageModelProvider.AZURE,
397
- version="2024-08-06",
398
- token_limit_input=128000,
399
- token_limit_output=16384,
400
- info_cutoff_at=date(2023, 10, 1),
401
- published_at=date(2024, 8, 6),
402
- )
403
-
404
- AzureGpt4oMini20240718 = create_language_model(
405
- name=LanguageModelName.AZURE_GPT_4o_MINI_2024_0718,
406
- provider=LanguageModelProvider.AZURE,
407
- version="2024-07-18",
408
- encoder_name=get_encoder_name(LanguageModelName.AZURE_GPT_4o_MINI_2024_0718),
409
- token_limit_input=128000,
410
- token_limit_output=16384,
411
- info_cutoff_at=date(2023, 10, 1),
412
- published_at=date(2024, 7, 18),
413
- )
File without changes
File without changes