unique_toolkit 0.6.0__py3-none-any.whl → 0.6.2__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.
@@ -1,16 +1,14 @@
1
1
  from datetime import date
2
2
  from enum import StrEnum
3
- from typing import ClassVar, Optional, Type, cast
3
+ from typing import ClassVar, Optional
4
4
 
5
5
  from pydantic import BaseModel
6
+ from typing_extensions import deprecated
6
7
 
7
8
  from unique_toolkit.language_model.schemas import LanguageModelTokenLimits
8
9
 
9
10
 
10
11
  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
12
  AZURE_GPT_35_TURBO_0125 = "AZURE_GPT_35_TURBO_0125"
15
13
  AZURE_GPT_4_0613 = "AZURE_GPT_4_0613"
16
14
  AZURE_GPT_4_TURBO_1106 = "AZURE_GPT_4_TURBO_1106"
@@ -30,12 +28,7 @@ class EncoderName(StrEnum):
30
28
  def get_encoder_name(model_name: LanguageModelName) -> Optional[EncoderName]:
31
29
  LMN = LanguageModelName
32
30
  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
- ):
31
+ case LMN.AZURE_GPT_35_TURBO_0125:
39
32
  return EncoderName.CL100K_BASE
40
33
  case (
41
34
  LMN.AZURE_GPT_4_0613
@@ -76,7 +69,147 @@ class LanguageModelInfo(BaseModel):
76
69
  deprecated_at: Optional[date] = None
77
70
  retirement_text: Optional[str] = None
78
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
+
79
207
 
208
+ @deprecated(
209
+ """
210
+ Use `LanguageModelInfo` instead of `LanguageModel`
211
+ """
212
+ )
80
213
  class LanguageModel:
81
214
  _info: ClassVar[LanguageModelInfo]
82
215
 
@@ -199,17 +332,8 @@ class LanguageModel:
199
332
 
200
333
  @classmethod
201
334
  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
335
+ if isinstance(model_name, LanguageModelName):
336
+ return LanguageModelInfo.from_name(model_name)
213
337
 
214
338
  return LanguageModelInfo(
215
339
  name=model_name,
@@ -224,190 +348,5 @@ class LanguageModel:
224
348
  """
225
349
 
226
350
  return [
227
- cast(LanguageModelInfo, subclass._info)
228
- for subclass in cls.__subclasses__()
229
- if hasattr(subclass, "_info")
351
+ LanguageModelInfo.from_name(model_name=name) for name in LanguageModelName
230
352
  ]
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
- )
@@ -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.'