unique_toolkit 2026.42.0.dev0__py3-none-any.whl → 2026.42.0.dev2__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.
@@ -68,6 +68,7 @@ class LanguageModelName(StrEnum):
68
68
  AZURE_GPT_6_ASTRA_2026_0903 = "AZURE_GPT_6_ASTRA_2026_0903"
69
69
  AZURE_GPT_6_LUNA_2026_0922 = "AZURE_GPT_6_LUNA_2026_0922"
70
70
  AZURE_GPT_6_SOL_2026_0922 = "AZURE_GPT_6_SOL_2026_0922"
71
+ AZURE_GPT_61_SOL_2026_0929 = "AZURE_GPT_61_SOL_2026_0929"
71
72
  AZURE_GPT_4o_2024_0513 = "AZURE_GPT_4o_2024_0513"
72
73
  AZURE_GPT_4o_2024_0806 = "AZURE_GPT_4o_2024_0806"
73
74
  AZURE_GPT_4o_2024_1120 = "AZURE_GPT_4o_2024_1120"
@@ -91,6 +92,7 @@ class LanguageModelName(StrEnum):
91
92
  ANTHROPIC_CLAUDE_SONNET_4_5 = "litellm:anthropic-claude-sonnet-4-5"
92
93
  ANTHROPIC_CLAUDE_SONNET_4_6 = "litellm:anthropic-claude-sonnet-4-6"
93
94
  ANTHROPIC_CLAUDE_SONNET_5 = "litellm:anthropic-claude-sonnet-5"
95
+ ANTHROPIC_CLAUDE_SONNET_5_5 = "litellm:anthropic-claude-sonnet-5-5"
94
96
  ANTHROPIC_CLAUDE_OPUS_4 = "litellm:anthropic-claude-opus-4"
95
97
  ANTHROPIC_CLAUDE_OPUS_4_1 = "litellm:anthropic-claude-opus-4-1"
96
98
  ANTHROPIC_CLAUDE_OPUS_4_5 = "litellm:anthropic-claude-opus-4-5"
@@ -137,6 +139,7 @@ class LanguageModelName(StrEnum):
137
139
  LITELLM_OPENAI_GPT_6_ASTRA = "litellm:openai-gpt-6-astra"
138
140
  LITELLM_OPENAI_GPT_6_LUNA = "litellm:openai-gpt-6-luna"
139
141
  LITELLM_OPENAI_GPT_6_SOL = "litellm:openai-gpt-6-sol"
142
+ LITELLM_OPENAI_GPT_61_SOL = "litellm:openai-gpt-6.1-sol"
140
143
  LITELLM_OPENAI_O1 = "litellm:openai-o1"
141
144
  LITELLM_OPENAI_O3 = "litellm:openai-o3"
142
145
  LITELLM_OPENAI_O3_DEEP_RESEARCH = "litellm:openai-o3-deep-research"
@@ -160,6 +163,7 @@ class LanguageModelName(StrEnum):
160
163
  LITELLM_QWEN_3_THINKING = "litellm:qwen-3-235B-A22B-thinking"
161
164
  VERTEX_CLAUDE_SONNET_4_6 = "litellm:vertex-claude-sonnet-4-6"
162
165
  VERTEX_CLAUDE_SONNET_5 = "litellm:vertex-claude-sonnet-5"
166
+ VERTEX_CLAUDE_SONNET_5_5 = "litellm:vertex-claude-sonnet-5-5"
163
167
  VERTEX_CLAUDE_OPUS_4_6 = "litellm:vertex-claude-opus-4-6"
164
168
  VERTEX_CLAUDE_OPUS_4_7 = "litellm:vertex-claude-opus-4-7"
165
169
  VERTEX_CLAUDE_OPUS_4_8 = "litellm:vertex-claude-opus-4-8"
@@ -235,6 +239,7 @@ def get_encoder_name(model_name: LanguageModelName) -> EncoderName:
235
239
  | LMN.AZURE_GPT_6_ASTRA_2026_0903
236
240
  | LMN.AZURE_GPT_6_LUNA_2026_0922
237
241
  | LMN.AZURE_GPT_6_SOL_2026_0922
242
+ | LMN.AZURE_GPT_61_SOL_2026_0929
238
243
  | LMN.AZURE_MODEL_ROUTER_2025_1118
239
244
  | LMN.LITELLM_OPENAI_GPT_5
240
245
  | LMN.LITELLM_OPENAI_GPT_5_MINI
@@ -255,6 +260,7 @@ def get_encoder_name(model_name: LanguageModelName) -> EncoderName:
255
260
  | LMN.LITELLM_OPENAI_GPT_6_ASTRA
256
261
  | LMN.LITELLM_OPENAI_GPT_6_LUNA
257
262
  | LMN.LITELLM_OPENAI_GPT_6_SOL
263
+ | LMN.LITELLM_OPENAI_GPT_61_SOL
258
264
  | LMN.LITELLM_OPENAI_O1
259
265
  | LMN.LITELLM_OPENAI_O3
260
266
  | LMN.LITELLM_OPENAI_O3_DEEP_RESEARCH
@@ -1846,6 +1852,33 @@ class LanguageModelInfo(BaseModel):
1846
1852
  ),
1847
1853
  supported_reasoning_efforts=[],
1848
1854
  )
1855
+ case (
1856
+ LanguageModelName.ANTHROPIC_CLAUDE_SONNET_5_5
1857
+ | LanguageModelName.VERTEX_CLAUDE_SONNET_5_5
1858
+ ):
1859
+ return cls(
1860
+ name=model_name,
1861
+ capabilities=[
1862
+ ModelCapabilities.FUNCTION_CALLING,
1863
+ ModelCapabilities.STREAMING,
1864
+ ModelCapabilities.VISION,
1865
+ ModelCapabilities.REASONING,
1866
+ ],
1867
+ provider=LanguageModelProvider.LITELLM,
1868
+ family=ModelFamily.ANTHROPIC,
1869
+ version="claude-sonnet-5-5",
1870
+ encoder_name=EncoderName.O200K_BASE, # TODO: Update encoder with litellm
1871
+ token_limits=LanguageModelTokenLimits(
1872
+ # TODO: Remove the 1.3 adjustment once a proper Claude tokenizer is implemented. UN-24123
1873
+ # 1M context / 128K max output. https://platform.claude.com/docs/en/models/sonnet-5-5/overview
1874
+ token_limit_input=int(1_000_000 / 1.3),
1875
+ token_limit_output=int(128_000 / 1.3),
1876
+ ),
1877
+ info_cutoff_at=date(2026, 6, 1),
1878
+ published_at=date(2026, 9, 28),
1879
+ supported_reasoning_efforts=[],
1880
+ supports_forced_tool_choice=False,
1881
+ )
1849
1882
  case LanguageModelName.ANTHROPIC_CLAUDE_OPUS_4:
1850
1883
  return cls(
1851
1884
  name=model_name,
@@ -2984,6 +3017,55 @@ class LanguageModelInfo(BaseModel):
2984
3017
  "xhigh",
2985
3018
  ],
2986
3019
  )
3020
+ case (
3021
+ LanguageModelName.AZURE_GPT_61_SOL_2026_0929
3022
+ | LanguageModelName.LITELLM_OPENAI_GPT_61_SOL
3023
+ ):
3024
+ # https://developers.openai.com/api/docs/models/gpt-6.1-sol
3025
+ # Foundry GA 2026-09-29:
3026
+ # https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/introducing-gpt-6-1-sol-in-microsoft-foundry-advanced-intelligence-optimized-for/4560811
3027
+ # Context 1,050,000 with 128,000 max output → 922,000 max input.
3028
+ # `none` is not a reasoning effort. `max` is documented.
3029
+ provider = (
3030
+ LanguageModelProvider.AZURE
3031
+ if model_name is LanguageModelName.AZURE_GPT_61_SOL_2026_0929
3032
+ else LanguageModelProvider.LITELLM
3033
+ )
3034
+ return cls(
3035
+ name=model_name,
3036
+ provider=provider,
3037
+ family=ModelFamily.OPENAI,
3038
+ version="2026-09-29",
3039
+ encoder_name=EncoderName.O200K_BASE,
3040
+ capabilities=[
3041
+ ModelCapabilities.CHAT_COMPLETIONS_API,
3042
+ ModelCapabilities.FUNCTION_CALLING,
3043
+ ModelCapabilities.PARALLEL_FUNCTION_CALLING,
3044
+ ModelCapabilities.REASONING,
3045
+ ModelCapabilities.RESPONSES_API,
3046
+ ModelCapabilities.STREAMING,
3047
+ ModelCapabilities.STRUCTURED_OUTPUT,
3048
+ ModelCapabilities.VISION,
3049
+ ],
3050
+ token_limits=LanguageModelTokenLimits(
3051
+ token_limit_input=922_000, token_limit_output=128_000
3052
+ ),
3053
+ info_cutoff_at=date(2026, 4, 30),
3054
+ published_at=date(2026, 9, 29),
3055
+ temperature_bounds=TemperatureBounds(
3056
+ min_temperature=0.0, max_temperature=1.0
3057
+ ),
3058
+ default_options={
3059
+ "reasoning_effort": "medium",
3060
+ },
3061
+ supported_reasoning_efforts=[
3062
+ "low",
3063
+ "medium",
3064
+ "high",
3065
+ "xhigh",
3066
+ "max",
3067
+ ],
3068
+ )
2987
3069
  case LanguageModelName.LITELLM_OPENAI_O1:
2988
3070
  return cls(
2989
3071
  name=model_name,
@@ -793,9 +793,9 @@ class LanguageModelResponse(BaseModel):
793
793
 
794
794
 
795
795
  # The OpenAI SDK's ReasoningEffort type alias is generated from an older OpenAPI spec and is
796
- # missing values that the API actually supports (e.g. "xhigh", "none"). We define our own
796
+ # missing values that the API actually supports (e.g. "xhigh", "none", "max"). We define our own
797
797
  # complete type here as the source of truth.
798
- ReasoningEffort = Literal["none", "minimal", "low", "medium", "high", "xhigh"]
798
+ ReasoningEffort = Literal["none", "minimal", "low", "medium", "high", "xhigh", "max"]
799
799
 
800
800
  # Ordered from lowest to highest reasoning effort. Used wherever effort levels must be
801
801
  # compared or ranked (e.g. picking the maximum across multiple skill hints).
@@ -806,18 +806,19 @@ REASONING_EFFORT_ORDER: tuple[ReasoningEffort, ...] = (
806
806
  "medium",
807
807
  "high",
808
808
  "xhigh",
809
+ "max",
809
810
  )
810
811
 
811
812
 
812
813
  def to_reasoning_effort(value: str) -> ReasoningEffort:
813
814
  """Narrow a raw string to ReasoningEffort, raising ValueError for unrecognised values."""
814
815
  match value:
815
- case "none" | "minimal" | "low" | "medium" | "high" | "xhigh":
816
+ case "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max":
816
817
  return value
817
818
  case _:
818
819
  raise ValueError(
819
820
  f"Unknown reasoning_effort {value!r}. "
820
- f"Supported values: none, minimal, low, medium, high, xhigh."
821
+ f"Supported values: none, minimal, low, medium, high, xhigh, max."
821
822
  )
822
823
 
823
824
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: unique-toolkit
3
- Version: 2026.42.0.dev0
3
+ Version: 2026.42.0.dev2
4
4
  Summary:
5
5
  Author: Cedric Klinkert, Martin Fadler, Sadique Sheik, Fabian Schläpfer, Pascal Hauri, Ejiroghene Oki-Peter, Rami Azouz, Ricardo Visini, Sanzio Monti
6
6
  Author-email: Cedric Klinkert <cedric.klinkert@unique.ch>, Martin Fadler <martin.fadler@unique.ch>, Sadique Sheik <sadique@unique.ch>, Fabian Schläpfer <fabian@unique.ch>, Pascal Hauri <pascal@unique.ch>, Ejiroghene Oki-Peter <oki-peter.ejiroghene@unique.ai>, Rami Azouz <rami.ext@unique.ch>, Ricardo Visini <ricardo.visini@unique.ch>, Sanzio Monti <sanzio.monti@unique.ai>
@@ -16,7 +16,7 @@ Requires-Dist: sseclient>=0.0.27,<0.0.28
16
16
  Requires-Dist: openai>=1.105.0,<3
17
17
  Requires-Dist: platformdirs>=4.0.0,<5
18
18
  Requires-Dist: pillow>=12.1.1
19
- Requires-Dist: unique-sdk>=2026.42.0.dev0,<2026.42.0rc0
19
+ Requires-Dist: unique-sdk>=2026.42.0.dev1,<2026.42.0rc0
20
20
  Requires-Dist: jambo>=0.1.2,<0.2
21
21
  Requires-Dist: jinja2>=3.1.6,<4
22
22
  Requires-Dist: docxtpl>=0.20.1,<0.21
@@ -397,12 +397,12 @@ unique_toolkit/language_model/builder.py,sha256=KwBzsD6-fvQnB4p2I7M-5Tk6j4tmQ973
397
397
  unique_toolkit/language_model/constants.py,sha256=B-topqW0r83dkC_25DeQfnPk3n53qzIHUCBS7YJ0-1U,119
398
398
  unique_toolkit/language_model/default_language_model.py,sha256=mcyuFs_V6tp52C8xJSHiEHO4kFGj6xed1gvozvCRD7k,1181
399
399
  unique_toolkit/language_model/functions.py,sha256=W6JC4LUh-LZ9waDgph--xVmKeQ7Ls6NRAqDx9DwQdeY,26691
400
- unique_toolkit/language_model/infos.py,sha256=48W8d9FDPIGhRHLBLUTdDZvsV2DKMr3-bNy5LgwE0kw,167859
400
+ unique_toolkit/language_model/infos.py,sha256=FTujFoCWPYtrPTVPTZ7HxJ-s2IsN25_DSdMCWzSRbvE,172016
401
401
  unique_toolkit/language_model/invocation_stats.py,sha256=CQbpUz394IsVd8eNTB1gPSMt5f0UXmkN1amNsqtAW6U,5857
402
402
  unique_toolkit/language_model/model_costs.py,sha256=ShuDAzMew1fUkJ3tzPgU5Zqjp6ivUZaG97BFh93tEn4,6358
403
403
  unique_toolkit/language_model/prompt.py,sha256=JSawaLjQg3VR-E2fK8engFyJnNdk21zaO8pPIodzN4Q,3991
404
404
  unique_toolkit/language_model/reference.py,sha256=T3wr2jP_uRg5wKVIbKqLbxJlcgxfbZQGq3XdjbQ2kSo,6984
405
- unique_toolkit/language_model/schemas.py,sha256=IUmp_JMHx0czadJlmsLL9nmc-nCPmVRVLp2T5DSYsqY,35402
405
+ unique_toolkit/language_model/schemas.py,sha256=o8zGkfoYayO1gL85G-ulV3Akp_BwjgEWGGUb89j1OgU,35440
406
406
  unique_toolkit/language_model/service.py,sha256=lgpzWhqxLBOeFacCafQi4e7BqAxJbOlr8GnCYcKeTdM,13274
407
407
  unique_toolkit/language_model/settings.py,sha256=7szohExI-qmTfUf2Zp5AB5TzrsZy1UekAGyXx_UaPMc,1524
408
408
  unique_toolkit/language_model/stream_transform.py,sha256=iNNGpLY_7G6Bpp9Y4KtbIkQm3WB4yZt75BXcqx0DVkI,2775
@@ -426,6 +426,6 @@ unique_toolkit/short_term_memory/service.py,sha256=2JMBEBn6GoyK-a0xvdcWpPft-3C74
426
426
  unique_toolkit/smart_rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
427
427
  unique_toolkit/smart_rules/compile.py,sha256=vRe0aMJWuVIK-VsqomgxQImzke7MDmwgSxxJfYCa7zw,1386
428
428
  unique_toolkit/test_utilities/events.py,sha256=FLrhMh0A_mQutAUjoD0FdMcVQ4Gq31r35OVGzRjvLro,6760
429
- unique_toolkit-2026.42.0.dev0.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
430
- unique_toolkit-2026.42.0.dev0.dist-info/METADATA,sha256=tWxIEnOcANQ7T2h1t2j7NKvi8IkYqHHih43xoLduplw,7821
431
- unique_toolkit-2026.42.0.dev0.dist-info/RECORD,,
429
+ unique_toolkit-2026.42.0.dev2.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
430
+ unique_toolkit-2026.42.0.dev2.dist-info/METADATA,sha256=o97G8KEz2luZiKwnoVb60E3u8BQ2w1otkKTNv5awd7o,7821
431
+ unique_toolkit-2026.42.0.dev2.dist-info/RECORD,,