model-library 0.1.5__py3-none-any.whl → 0.1.7__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,31 +1,30 @@
1
- import asyncio
2
1
  import io
3
- from typing import Any, Literal, Sequence, cast
2
+ import logging
3
+ from typing import Any, Literal, Sequence
4
4
 
5
5
  import grpc
6
6
  from typing_extensions import override
7
- from xai_sdk import AsyncClient, Client
8
- from xai_sdk.aio.chat import Chat as AsyncChat
7
+ from xai_sdk import AsyncClient
8
+ from xai_sdk.aio.chat import Chat
9
9
  from xai_sdk.chat import Content, Response, system, tool_result, user
10
10
  from xai_sdk.chat import image as xai_image
11
11
  from xai_sdk.chat import tool as xai_tool
12
12
  from xai_sdk.proto.v6.chat_pb2 import Message, Tool
13
- from xai_sdk.sync.chat import Chat as SyncChat
14
13
 
15
14
  from model_library import model_library_settings
16
15
  from model_library.base import (
17
16
  LLM,
17
+ FileBase,
18
18
  FileInput,
19
19
  FileWithBase64,
20
20
  FileWithId,
21
- FileWithUrl,
22
21
  InputItem,
23
22
  LLMConfig,
24
- ProviderConfig,
25
23
  QueryResult,
26
24
  QueryResultCost,
27
25
  QueryResultMetadata,
28
- RawInputItem,
26
+ RawInput,
27
+ RawResponse,
29
28
  TextInput,
30
29
  ToolBody,
31
30
  ToolCall,
@@ -36,36 +35,25 @@ from model_library.exceptions import (
36
35
  BadInputError,
37
36
  MaxOutputTokensExceededError,
38
37
  ModelNoOutputError,
38
+ NoMatchingToolCallError,
39
39
  RateLimitException,
40
40
  )
41
41
  from model_library.providers.openai import OpenAIModel
42
42
  from model_library.register_models import register_provider
43
43
  from model_library.utils import create_openai_client_with_defaults
44
44
 
45
- Chat = AsyncChat | SyncChat
46
-
47
-
48
- class XAIConfig(ProviderConfig):
49
- sync_client: bool = False
50
-
51
45
 
52
46
  @register_provider("grok")
53
47
  class XAIModel(LLM):
54
- provider_config = XAIConfig()
55
-
56
- _client: AsyncClient | Client | None = None
48
+ _client: AsyncClient | None = None
57
49
 
58
50
  @override
59
- def get_client(self) -> AsyncClient | Client:
60
- if self._client:
61
- return self._client
62
-
63
- ClientClass = Client if self.provider_config.sync_client else AsyncClient
64
- self._client = ClientClass(
65
- api_key=model_library_settings.XAI_API_KEY,
66
- )
67
-
68
- return self._client
51
+ def get_client(self) -> AsyncClient:
52
+ if not XAIModel._client:
53
+ XAIModel._client = AsyncClient(
54
+ api_key=model_library_settings.XAI_API_KEY,
55
+ )
56
+ return XAIModel._client
69
57
 
70
58
  @override
71
59
  def __init__(
@@ -78,7 +66,7 @@ class XAIModel(LLM):
78
66
  super().__init__(model_name, provider, config=config)
79
67
 
80
68
  # https://docs.x.ai/docs/guides/migration
81
- self.delegate: OpenAIModel | None = (
69
+ self.delegate = (
82
70
  None
83
71
  if self.native
84
72
  else OpenAIModel(
@@ -97,54 +85,68 @@ class XAIModel(LLM):
97
85
  )
98
86
  )
99
87
 
88
+ async def get_tool_call_ids(self, input: Sequence[InputItem]) -> list[str]:
89
+ raw_responses = [x for x in input if isinstance(x, RawResponse)]
90
+ tool_call_ids: list[str] = []
91
+
92
+ calls = [
93
+ y
94
+ for x in raw_responses
95
+ if isinstance(x.response, Response) and x.response.tool_calls
96
+ for y in x.response.tool_calls
97
+ ]
98
+ tool_call_ids.extend([x.id for x in calls if x.id])
99
+ return tool_call_ids
100
+
100
101
  @override
101
102
  async def parse_input(
102
103
  self,
103
104
  input: Sequence[InputItem],
104
105
  **kwargs: Any,
105
- ) -> None:
106
- chat: Chat = kwargs["chat"]
106
+ ) -> list[Message]:
107
+ new_input: list[Message] = []
108
+
107
109
  content_user: list[Any] = []
110
+
111
+ def flush_content_user():
112
+ if content_user:
113
+ new_input.append(user(*content_user))
114
+ content_user.clear()
115
+
116
+ tool_call_ids = await self.get_tool_call_ids(input)
117
+
108
118
  for item in input:
119
+ if isinstance(item, TextInput):
120
+ content_user.append(item.text)
121
+ continue
122
+
123
+ if isinstance(item, FileBase):
124
+ match item.type:
125
+ case "image":
126
+ parsed = await self.parse_image(item)
127
+ case "file":
128
+ parsed = await self.parse_file(item)
129
+ content_user.append(parsed)
130
+ continue
131
+
132
+ # non content user item
133
+ flush_content_user()
134
+
109
135
  match item:
110
- case TextInput():
111
- content_user.append(item.text)
112
- case FileWithBase64() | FileWithUrl() | FileWithId():
113
- match item.type:
114
- case "image":
115
- content_user.append(await self.parse_image(item))
116
- case "file":
117
- content_user.append(await self.parse_file(item))
118
- case _:
119
- if content_user:
120
- chat.append(user(*content_user))
121
- content_user = []
122
- match item:
123
- case ToolResult():
124
- if not (
125
- isinstance(x, Response)
126
- and x.finish_reason == "REASON_TOOL_CALLS"
127
- and x.tool_calls
128
- and any(
129
- tool
130
- for tool in x.tool_calls
131
- if tool.id == item.tool_call.id
132
- )
133
- for x in chat.messages
134
- ):
135
- raise Exception(
136
- "Tool call result provided with no matching tool call"
137
- )
138
- chat.append(tool_result(item.result))
139
- case dict(): # RawInputItem
140
- item = cast(RawInputItem, item)
141
- chat.append(item) # pyright: ignore[reportArgumentType]
142
- case _: # RawResponse
143
- item = cast(Response, item)
144
- chat.append(item)
145
-
146
- if content_user:
147
- chat.append(user(*content_user))
136
+ case ToolResult():
137
+ if item.tool_call.id not in tool_call_ids:
138
+ raise NoMatchingToolCallError()
139
+
140
+ new_input.append(tool_result(item.result))
141
+ case RawResponse():
142
+ new_input.append(item.response)
143
+ case RawInput():
144
+ new_input.append(item.input)
145
+
146
+ # in case content user item is the last item
147
+ flush_content_user()
148
+
149
+ return new_input
148
150
 
149
151
  @override
150
152
  async def parse_image(
@@ -199,40 +201,10 @@ class XAIModel(LLM):
199
201
  ) -> FileWithId:
200
202
  raise NotImplementedError()
201
203
 
202
- def fetch_response_sync(
203
- self,
204
- chat: SyncChat,
205
- ) -> Response | None:
206
- latest_response = None
207
- for response, _ in chat.stream():
208
- latest_response = response
209
-
210
- return latest_response
211
-
212
- async def fetch_response_async(
213
- self,
214
- chat: AsyncChat,
215
- ) -> Response | None:
216
- latest_response = None
217
- async for response, _ in chat.stream():
218
- latest_response = response
219
-
220
- return latest_response
221
-
222
204
  @override
223
- async def _query_impl(
224
- self,
225
- input: Sequence[InputItem],
226
- *,
227
- tools: list[ToolDefinition],
228
- **kwargs: object,
229
- ) -> QueryResult:
230
- if self.reasoning_effort:
231
- kwargs["reasoning_effort"] = self.reasoning_effort
232
-
233
- if self.delegate:
234
- return await self.delegate_query(input, tools=tools, **kwargs)
235
-
205
+ async def build_body(
206
+ self, input: Sequence[InputItem], *, tools: list[ToolDefinition], **kwargs: Any
207
+ ) -> dict[str, Any]:
236
208
  messages: Sequence[Message] = []
237
209
  if "system_prompt" in kwargs:
238
210
  messages.append(system(str(kwargs.pop("system_prompt"))))
@@ -250,20 +222,43 @@ class XAIModel(LLM):
250
222
  if self.top_p is not None:
251
223
  body["top_p"] = self.top_p
252
224
 
225
+ if self.reasoning_effort:
226
+ body["reasoning_effort"] = self.reasoning_effort
227
+
253
228
  body.update(kwargs)
254
229
 
230
+ # use Chat object to parse raw Response and other objects into the correct formats
231
+ # see xai's chat.py `class BaseChat` -> `def append`
232
+ chat: Chat = self.get_client().chat.create("dummy")
233
+ parsed_input = await self.parse_input(input)
234
+ for message in parsed_input:
235
+ chat.append(message)
236
+ body["messages"].extend(chat.messages)
237
+
238
+ return body
239
+
240
+ @override
241
+ async def _query_impl(
242
+ self,
243
+ input: Sequence[InputItem],
244
+ *,
245
+ tools: list[ToolDefinition],
246
+ query_logger: logging.Logger,
247
+ **kwargs: object,
248
+ ) -> QueryResult:
249
+ if self.delegate:
250
+ return await self.delegate_query(
251
+ input, tools=tools, query_logger=query_logger, **kwargs
252
+ )
253
+
254
+ body = await self.build_body(input, tools=tools, **kwargs)
255
+
255
256
  try:
256
- chat: Chat = self.get_client().chat.create(**body) # pyright: ignore[reportAny]
257
- await self.parse_input(input, chat=chat)
258
-
259
- # Allows users to dynamically swap to a sync client if getting grpc errors
260
- # Run in a separate thread so we are playing fair with other async processes
261
- if self.provider_config.sync_client:
262
- latest_response = await asyncio.to_thread(
263
- self.fetch_response_sync, cast(SyncChat, chat)
264
- )
265
- else:
266
- latest_response = await self.fetch_response_async(cast(AsyncChat, chat))
257
+ chat: Chat = self.get_client().chat.create(**body)
258
+
259
+ latest_response: Response | None = None
260
+ async for response, _ in chat.stream():
261
+ latest_response = response
267
262
 
268
263
  if not latest_response:
269
264
  raise ModelNoOutputError("Model failed to produce a response")
@@ -303,8 +298,25 @@ class XAIModel(LLM):
303
298
  cache_read_tokens=latest_response.usage.cached_prompt_text_tokens,
304
299
  ),
305
300
  tool_calls=tool_calls,
306
- history=[*input, latest_response],
301
+ history=[*input, RawResponse(response=latest_response)],
302
+ )
303
+
304
+ @override
305
+ async def count_tokens(
306
+ self,
307
+ input: Sequence[InputItem],
308
+ *,
309
+ history: Sequence[InputItem] = [],
310
+ tools: list[ToolDefinition] = [],
311
+ **kwargs: object,
312
+ ) -> int:
313
+ string_input = await self.stringify_input(input, history=history, tools=tools)
314
+ self.logger.debug(string_input)
315
+
316
+ tokens = await self.get_client().tokenize.tokenize_text(
317
+ string_input, self.model_name
307
318
  )
319
+ return len(tokens)
308
320
 
309
321
  @override
310
322
  async def _calculate_cost(
@@ -7,7 +7,7 @@ from pathlib import Path
7
7
  from typing import Any, Callable, Type, TypeVar, cast, get_type_hints
8
8
 
9
9
  import yaml
10
- from pydantic import create_model, model_validator
10
+ from pydantic import ConfigDict, create_model, model_validator
11
11
  from pydantic.fields import Field
12
12
  from pydantic.main import BaseModel
13
13
 
@@ -169,10 +169,12 @@ class DefaultParameters(BaseModel):
169
169
  temperature: float | None = None
170
170
  top_p: float | None = None
171
171
  top_k: int | None = None
172
- reasoning_effort: str | None = None
172
+ reasoning_effort: str | bool | None = None
173
173
 
174
174
 
175
175
  class RawModelConfig(BaseModel):
176
+ model_config = ConfigDict(extra="forbid", strict=True)
177
+
176
178
  company: str
177
179
  label: str
178
180
  description: str | None = None
@@ -275,7 +277,7 @@ def _register_models() -> ModelRegistry:
275
277
 
276
278
  # create model config object
277
279
  raw_model_obj: RawModelConfig = RawModelConfig.model_validate(
278
- current_model_config, strict=True, extra="forbid"
280
+ current_model_config
279
281
  )
280
282
 
281
283
  provider_endpoint = (
model_library/utils.py CHANGED
@@ -1,6 +1,5 @@
1
1
  import logging
2
2
  from collections.abc import Mapping, Sequence
3
- from typing import Any
4
3
 
5
4
  import httpx
6
5
  from openai import AsyncOpenAI
@@ -90,37 +89,3 @@ def get_context_window_for_model(model_name: str, default: int = 128_000) -> int
90
89
  f"using default context length of {default}"
91
90
  )
92
91
  return default
93
-
94
-
95
- def normalize_tool_result(result: Any) -> str:
96
- """Normalize tool result to non-empty string for API compatibility.
97
-
98
- Empty results (None, empty dict/list, whitespace-only strings) are
99
- converted to a single space to satisfy API requirements.
100
-
101
- Args:
102
- result: Tool result value (any type)
103
-
104
- Returns:
105
- Non-empty string representation of the result
106
- """
107
- if result is None or (isinstance(result, (dict, list)) and not result):
108
- return " "
109
- result_str = str(result) # pyright: ignore[reportUnknownArgumentType]
110
- return result_str.strip() or " "
111
-
112
-
113
- def filter_empty_text_blocks(content: list[dict[str, Any]]) -> list[dict[str, Any]]:
114
- """Filter out empty text blocks from content list.
115
-
116
- Args:
117
- content: List of content blocks (dicts with 'type' and potentially 'text' keys)
118
-
119
- Returns:
120
- Filtered list with empty text blocks removed
121
- """
122
- return [
123
- block
124
- for block in content
125
- if block.get("type") != "text" or block.get("text", "").strip()
126
- ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: model-library
3
- Version: 0.1.5
3
+ Version: 0.1.7
4
4
  Summary: Model Library for vals.ai
5
5
  Author-email: "Vals AI, Inc." <contact@vals.ai>
6
6
  License: MIT
@@ -13,13 +13,13 @@ Requires-Dist: pyyaml>=6.0.2
13
13
  Requires-Dist: rich
14
14
  Requires-Dist: backoff<3.0,>=2.2.1
15
15
  Requires-Dist: redis<7.0,>=6.2.0
16
- Requires-Dist: tiktoken==0.11.0
16
+ Requires-Dist: tiktoken>=0.12.0
17
17
  Requires-Dist: pillow
18
18
  Requires-Dist: openai<3.0,>=2.0
19
19
  Requires-Dist: anthropic<1.0,>=0.57.1
20
20
  Requires-Dist: mistralai<2.0,>=1.9.10
21
21
  Requires-Dist: xai-sdk<2.0,>=1.0.0
22
- Requires-Dist: ai21<5.0,>=4.0.3
22
+ Requires-Dist: ai21<5.0,>=4.3.0
23
23
  Requires-Dist: boto3<2.0,>=1.38.27
24
24
  Requires-Dist: google-genai[aiohttp]>=1.51.0
25
25
  Requires-Dist: google-cloud-storage>=1.26.0
@@ -1,64 +1,64 @@
1
1
  model_library/__init__.py,sha256=AKc_15aklOf-LbcS9z1Xer_moRWNpG6Dh3kqvSQ0nOI,714
2
- model_library/exceptions.py,sha256=ZHMr6lloXZz4V4Wy1UP8zc1CdUHx6-IS9_rOi6oN45s,8680
2
+ model_library/exceptions.py,sha256=4TJ1aDkpPV-gv3gLIO7pi5ORRBG2hPXSBAvOXS6I_Wg,9027
3
3
  model_library/file_utils.py,sha256=FAZRRtDT8c4Rjfoj64Te3knEHggXAAfRRuS8WLCsSe8,3682
4
- model_library/logging.py,sha256=McyaPHUk7RkB38-LrfnudrrU1B62ta8wAbbIBwLRmj0,853
4
+ model_library/logging.py,sha256=rZrrVQlEmyZzvKx6nIOR8bKHl49wQIIW5c36Zqcigm4,888
5
5
  model_library/model_utils.py,sha256=l8oCltGeimMGtnne_3Q1EguVtzCj61UMsLsma-1czwg,753
6
6
  model_library/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- model_library/register_models.py,sha256=CY3Wd16AcWf7tYu_O2I2_kg_hdvQJFcvyQQA2OUu2SA,13646
7
+ model_library/register_models.py,sha256=-CtFggD296wqO2nd6yC5GIWBoi0YD0kDyG8bwxBa1ec,13696
8
8
  model_library/registry_utils.py,sha256=BVauHcP02Et2maLxowNBbdpGd32cnLz1_zSjDLVJjp0,8843
9
9
  model_library/settings.py,sha256=QyeUqzWBpexFi014L_mZkoXP49no3SAQNJRObATXrL8,873
10
- model_library/utils.py,sha256=T91ACGTc-KtksVyMFspt-vJtR5I-xcO3nVfH6SltmMU,3988
10
+ model_library/utils.py,sha256=dcww26Ph0PSihEzSN4gZ48XXxN3Bt5oWveVYX6UACyI,2922
11
11
  model_library/base/__init__.py,sha256=TtxCXGUtkEqWZNMMofLPuC4orN7Ja2hemtbtHitt_UA,266
12
- model_library/base/base.py,sha256=HXxImh2H-GIIiVGNqV7gRPi0HH1KJxB_4ckuKyEqAYo,14139
12
+ model_library/base/base.py,sha256=nrdPS92-vFkDVJJvNVOQ8e6U1zCyZxOtFg18ZgM4o0s,17467
13
13
  model_library/base/batch.py,sha256=-jd6L0ECc5pkj73zoX2ZYcv_9iQdqxEi1kEilwaXWSA,2895
14
- model_library/base/delegate_only.py,sha256=V2MzENtvBg0pySKncgE-mfCLBhhRZ0y4BntQwQsxbqU,2111
15
- model_library/base/input.py,sha256=Nhg8Ril1kFau1DnE8u102JC1l-vxNd-v9e3SjovR-Do,1876
16
- model_library/base/output.py,sha256=Ak6CJRYqtjYILsSWkfE70fSK3yvP7v_n5NYfysMaIL4,7464
17
- model_library/base/utils.py,sha256=YGQLPyQgCbfHNBxyTxCvpZNZ-ctEji258IdfMiXUJXs,1962
14
+ model_library/base/delegate_only.py,sha256=5v2twEuQl1jF34M8iFcaZQlk0_uBLew4B46TkHUEssw,2441
15
+ model_library/base/input.py,sha256=JrnvBZ_xLcEmaMjnOfUS6GFV0QWtCGpJq0RQQL2YBG8,1934
16
+ model_library/base/output.py,sha256=jwd3rfRFUcqm8q-O5H684ToNZPvcD_obtf6ugmhzUus,7613
17
+ model_library/base/utils.py,sha256=eiMTiFFXHTb44Nnz3fjxf9YQzJpdfNI7tprSi9COPu0,2268
18
18
  model_library/config/README.md,sha256=i8_wHnlI6uHIqWN9fYBkDCglZM2p5ZMVD3SLlxiwUVk,4274
19
19
  model_library/config/ai21labs_models.yaml,sha256=ZWHhk1cep2GQIYHqkTS_0152mF3oZg2tSzMPmvfMRSI,2478
20
20
  model_library/config/alibaba_models.yaml,sha256=-RLWOwh3ZaCQqjaZ-4Zw0BJNVE6JVHJ8Ggm9gQJZ6QI,2082
21
- model_library/config/all_models.json,sha256=suyLLiU87NbUjWsnGeUpd94aIQ6UPyEURtPh48AW4-4,530914
21
+ model_library/config/all_models.json,sha256=U-XQrbaWWhjmkawg0Bd9NTxoDN-DT0WPhmDLF6OALR4,533621
22
22
  model_library/config/amazon_models.yaml,sha256=HgLmhpfedHCQtkPEviEJCBbAb-dNQPOnVtf4UnwrDds,7654
23
23
  model_library/config/anthropic_models.yaml,sha256=bTc_3Oqn4wCdq-dcWcEfmXrPVZjcR8-V6pTao7sGa_E,10475
24
24
  model_library/config/cohere_models.yaml,sha256=ZfWrS1K45Hxd5nT_gpP5YGAovJcBIlLNIdaRyE3V-7o,5022
25
25
  model_library/config/deepseek_models.yaml,sha256=4CCrf-4UPBgFCrS6CQa3vzNiaYlD4B6dFJFK_kIYBWY,1156
26
26
  model_library/config/dummy_model.yaml,sha256=lImYJBtBVJk_jgnLbkuSyOshQphVlYCMkw-UiJIBYhY,877
27
- model_library/config/fireworks_models.yaml,sha256=BMyQqjEpayNfSVGekzOFNIx7Ng3QOfPtldw5k2msqX0,6269
27
+ model_library/config/fireworks_models.yaml,sha256=bAlXvjkdt-CnRp66WbfDv2qTrF5UHceRd2pvrsBERMk,6324
28
28
  model_library/config/google_models.yaml,sha256=Rg127nsBbHpk62X7WBq2ckdHo0bwYM0NVjF7T2h_1c0,16494
29
29
  model_library/config/inception_models.yaml,sha256=YCqfQlkH_pTdHIKee5dP_aRFXw_fTIEQCpUvX2bwO0M,560
30
30
  model_library/config/kimi_models.yaml,sha256=AAqse_BCE-lrHkJHIWJVqMtttnZQCa-5Qy5qiLUJjYs,755
31
- model_library/config/minimax_models.yaml,sha256=IttkpdBrp75J9WZQ0IRE4m4eSfd0LonfcA9OtrzJrMY,873
31
+ model_library/config/minimax_models.yaml,sha256=gWTuTcl1-zyCF6KRuU6DSre2Cw5gXC-TeKV2Qp4StnQ,1263
32
32
  model_library/config/mistral_models.yaml,sha256=mYKYSzJl24lUiA_erSkom7nCBxAoeJ57Mi3090q1ArM,5162
33
33
  model_library/config/openai_models.yaml,sha256=1lKsTQwsxMMJqXtEoYs3liy6NcaK4p8NN7b-GSFnl8k,25261
34
34
  model_library/config/perplexity_models.yaml,sha256=WUDqhLvnB0kQhCCwPv19FYLHozet3m33Spdo6bGff3Q,2336
35
35
  model_library/config/together_models.yaml,sha256=BeqRJonYzPvWwoLfkyH0RMRKBYUrCSEQhg_25Nvx97M,23867
36
36
  model_library/config/xai_models.yaml,sha256=2KRNNQy3kV-4xxSfhj7Uhp9TZF-S5qPlM8Ef-04zv8Y,7985
37
- model_library/config/zai_models.yaml,sha256=Esa4P-zc5K1pejQTylKPe-uiH9AnvB_Zn7RB_sAZ5mU,1577
37
+ model_library/config/zai_models.yaml,sha256=lcYMh2FCrLWkKqdCnarRlwDoL3SbutRBNAiMPBUYQiw,1894
38
38
  model_library/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- model_library/providers/ai21labs.py,sha256=7PnXKl-Fv8KlE95eBv2izbFg1u7utDRQPdWXYVl_-as,5832
39
+ model_library/providers/ai21labs.py,sha256=NXoEu0NFwxLVJIN751tEuKLFYk4ECSDnWMik35pL5Y4,6277
40
40
  model_library/providers/alibaba.py,sha256=k6LZErV_l9oTFTdKTwyw1SXD509Rl3AqFbN8umCryEE,2941
41
- model_library/providers/amazon.py,sha256=jRqOYCnxiONlbjT2C0UuFIrFOMU4d-hvLElPp41n5Ds,14015
42
- model_library/providers/anthropic.py,sha256=6YI04jdDDtDjLS17jThVYlNvLbqd9THrKAtaVTYL6eg,22194
41
+ model_library/providers/amazon.py,sha256=F8anL4pmeadA0P9luUZSSnEcke90WH7mCa3afJ2akgM,14156
42
+ model_library/providers/anthropic.py,sha256=xbSZx6R54UhNQij-vwFKPCIQJoTzxLblJMIxdqGcsqs,23094
43
43
  model_library/providers/azure.py,sha256=brQNCED-zHvYjL5K5hdjFBNso6hJZg0HTHNnAgJPPG0,1408
44
44
  model_library/providers/cohere.py,sha256=lCBm1PP1l_UOa1pKFMIZM3C0wCv3QWB6UP0-jvjkFa4,1066
45
45
  model_library/providers/deepseek.py,sha256=7T4lxDiV5wmWUK7TAKwr332_T6uyXNCOiirZOCCETL0,1159
46
46
  model_library/providers/fireworks.py,sha256=w-5mOF5oNzqx_0ijCoTm1lSn2ZHwhp6fURKhV3LEqIc,2309
47
47
  model_library/providers/inception.py,sha256=Nrky53iujIM9spAWoNRtoJg2inFiL0li6E75vT3b6V8,1107
48
48
  model_library/providers/kimi.py,sha256=zzvcKpZLsM1xPebpLeMxNKTt_FRiLN1rFWrIly7wfXA,1092
49
- model_library/providers/minimax.py,sha256=HkM601mxTC0tpDGtxLTGq5IwnCfFfHG4EF6l1Bg77K4,1001
50
- model_library/providers/mistral.py,sha256=9zGYLpkn436ahZ716-5R5AQzn7htwVres1IjP5x5bFw,9745
51
- model_library/providers/openai.py,sha256=1PNmS-0ERjqLzWS9Prr1_cUpctyEj_xp15XOpl9-IGE,33421
49
+ model_library/providers/minimax.py,sha256=ckVyoXdtVxGT3aU-AknBQCa7_mOckNMfOXSgwbrJNIY,1610
50
+ model_library/providers/mistral.py,sha256=kmp74jEETMnB8fQ5VNfNVkksIrPMGJwJeXJDnTVwKa8,10117
51
+ model_library/providers/openai.py,sha256=gMykcN5eHFHqCrK9y5twc18h7XSMI68mB9YGYnpt93A,34522
52
52
  model_library/providers/perplexity.py,sha256=eIzzkaZ4ZMlRKFVI9bnwyo91iJkh7aEmJ-0_4OKeAWc,1083
53
53
  model_library/providers/together.py,sha256=7Y4QLnX8c_fyXUud-W_C1gidmROQainTgODBwbvFyXQ,2033
54
- model_library/providers/vals.py,sha256=VLF1rsCR13a_kmtZfboDzJJ64Io_tBFe60vf-0BdYPc,9830
55
- model_library/providers/xai.py,sha256=oJiMICYLkybHpLv77PmMbi1Xj9IUZmKX3kANksjjFEQ,10828
54
+ model_library/providers/vals.py,sha256=dbaL8toYTssm8qVlrgqzqwCeeTV9h-xfA37uBuoWtfg,9894
55
+ model_library/providers/xai.py,sha256=eA3CsiOWIF_vKxNZC95INUKOazz54R6vpVrGM8VR1tY,10719
56
56
  model_library/providers/zai.py,sha256=O_GM6KlJ0fM2wYoxO9xrCWfnpYH7IpoKEzjiD4jB8Kc,1050
57
57
  model_library/providers/google/__init__.py,sha256=ypuLVL_QJEQ7C3S47FhC9y4wyawYOdGikAViJmACI0U,115
58
- model_library/providers/google/batch.py,sha256=4TE90Uo1adi54dVtGcGyUAxw11YExJq-Y4KmkQ-cyHA,9978
59
- model_library/providers/google/google.py,sha256=s9vky9r5SVNhBvMXcIr0_h0MlKLXwx_tQlZzs57xXYo,16507
60
- model_library-0.1.5.dist-info/licenses/LICENSE,sha256=x6mf4o7U_wHaaqcfxoU-0R6uYJLbqL_TNuoULP3asaA,1070
61
- model_library-0.1.5.dist-info/METADATA,sha256=HeLAgZOFNM7TBGJm2bfubjspsa388C0Va1hcWO-uu6I,6989
62
- model_library-0.1.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
63
- model_library-0.1.5.dist-info/top_level.txt,sha256=HtQYxA_7RP8UT35I6VcUw20L6edI0Zf2t5Ys1uDGVjs,14
64
- model_library-0.1.5.dist-info/RECORD,,
58
+ model_library/providers/google/batch.py,sha256=ycK2arf00lhZQNgyM5Yd01LAScul6rvVv--dUcRWWSA,9977
59
+ model_library/providers/google/google.py,sha256=txQaet1HobyjYd3dp9Mgonx3x5ln3LMuW10Qsyum3B4,17809
60
+ model_library-0.1.7.dist-info/licenses/LICENSE,sha256=x6mf4o7U_wHaaqcfxoU-0R6uYJLbqL_TNuoULP3asaA,1070
61
+ model_library-0.1.7.dist-info/METADATA,sha256=436seE0dN2884VkHzGHyp36aARqBxqKMKRccmKYG3_E,6989
62
+ model_library-0.1.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
63
+ model_library-0.1.7.dist-info/top_level.txt,sha256=HtQYxA_7RP8UT35I6VcUw20L6edI0Zf2t5Ys1uDGVjs,14
64
+ model_library-0.1.7.dist-info/RECORD,,