LLM-Bridge 2.1.17__tar.gz → 2.2.1__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 (103) hide show
  1. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/PKG-INFO +4 -4
  2. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_responses/non_stream_openai_responses_client.py +1 -0
  3. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_responses/stream_openai_responses_client.py +1 -0
  4. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/xai/non_stream_xai_client.py +2 -1
  5. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/xai/stream_xai_client.py +2 -1
  6. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/openai_responses_client.py +3 -0
  7. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/xai_client.py +3 -1
  8. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/chat_client_factory.py +0 -11
  9. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_client_factory/claude_client_factory.py +4 -2
  10. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_client_factory/gemini_client_factory.py +13 -2
  11. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_client_factory/openai_completion_client_factory.py +0 -5
  12. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_client_factory/openai_responses_client_factory.py +11 -2
  13. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_client_factory/xai_client_factory.py +6 -2
  14. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/resources/model_prices.json +95 -89
  15. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/pyproject.toml +4 -4
  16. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/.env.example +0 -1
  17. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/keys.py +0 -1
  18. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/single/config.py +6 -6
  19. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/uv.lock +73 -18
  20. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.gitattributes +0 -0
  21. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.github/workflows/pypi-publish.yaml +0 -0
  22. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.github/workflows/python-test.yaml +0 -0
  23. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.gitignore +0 -0
  24. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.run/batch.run.xml +0 -0
  25. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.run/pytest.run.xml +0 -0
  26. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.run/single.run.xml +0 -0
  27. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/LICENSE +0 -0
  28. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/README.md +0 -0
  29. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/__init__.py +0 -0
  30. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/__init__.py +0 -0
  31. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/chat_client.py +0 -0
  32. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/__init__.py +0 -0
  33. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/claude/__init__.py +0 -0
  34. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/claude/claude_response_handler.py +0 -0
  35. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/claude/claude_token_counter.py +0 -0
  36. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/claude/non_stream_claude_client.py +0 -0
  37. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/claude/stream_claude_client.py +0 -0
  38. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/gemini/__init__.py +0 -0
  39. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/gemini/gemini_response_handler.py +0 -0
  40. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/gemini/gemini_token_counter.py +0 -0
  41. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/gemini/non_stream_gemini_client.py +0 -0
  42. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/gemini/stream_gemini_client.py +0 -0
  43. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/http_error.py +0 -0
  44. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_completion/__init__.py +0 -0
  45. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_completion/non_stream_openai_completion_client.py +0 -0
  46. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_completion/stream_openai_completion_client.py +0 -0
  47. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_responses/__init__.py +0 -0
  48. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_responses/openai_responses_response_handler.py +0 -0
  49. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/xai/__init__.py +0 -0
  50. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/__init__.py +0 -0
  51. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/claude_client.py +0 -0
  52. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/gemini_client.py +0 -0
  53. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/openai_completion_client.py +0 -0
  54. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/__init__.py +0 -0
  55. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/__init__.py +0 -0
  56. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/chat_message_converter.py +0 -0
  57. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/media_processor.py +0 -0
  58. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_client_factory/__init__.py +0 -0
  59. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_message_converter/__init__.py +0 -0
  60. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_message_converter/claude_message_converter.py +0 -0
  61. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_message_converter/gemini_message_converter.py +0 -0
  62. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_message_converter/openai_completion_message_converter.py +0 -0
  63. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_message_converter/openai_responses_message_converter.py +0 -0
  64. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_message_converter/xai_message_converter.py +0 -0
  65. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/file_fetch.py +0 -0
  66. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/__init__.py +0 -0
  67. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/code_file_extensions.py +0 -0
  68. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/document_processor.py +0 -0
  69. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/file_type_checker.py +0 -0
  70. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/message_processor.py +0 -0
  71. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/model_prices.py +0 -0
  72. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/resources/__init__.py +0 -0
  73. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/__init__.py +0 -0
  74. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/chat_response.py +0 -0
  75. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/message.py +0 -0
  76. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/__init__.py +0 -0
  77. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/claude_message.py +0 -0
  78. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/gemini_message.py +0 -0
  79. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/openai_completion_message.py +0 -0
  80. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/openai_responses_message.py +0 -0
  81. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/xai_message.py +0 -0
  82. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/serializer.py +0 -0
  83. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/__init__.py +0 -0
  84. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/__init__.py +0 -0
  85. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/__init__.py +0 -0
  86. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/__init__.py +0 -0
  87. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/claude_message_converter_test.py +0 -0
  88. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/gemini_message_converter_test.py +0 -0
  89. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/message_factory.py +0 -0
  90. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/openai_completion_message_converter_test.py +0 -0
  91. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/openai_responses_message_converter_test.py +0 -0
  92. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/xai_message_converter_test.py +0 -0
  93. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/message_process/__init__.py +0 -0
  94. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/message_process/file_type_checker_test.py +0 -0
  95. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/model_prices_test.py +0 -0
  96. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/__init__.py +0 -0
  97. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/batch/__init__.py +0 -0
  98. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/batch/batch.py +0 -0
  99. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/batch/config.py +0 -0
  100. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/messages.py +0 -0
  101. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/single/__init__.py +0 -0
  102. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/single/single.py +0 -0
  103. {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: LLM-Bridge
3
- Version: 2.1.17
3
+ Version: 2.2.1
4
4
  Summary: A library that wraps multiple LLM providers into a consistent API while using each provider's native SDK internally, supporting multimodal I/O, file processing, and stream output.
5
5
  Author-email: windsnow1025 <windsnow1025@gmail.com>
6
6
  License-Expression: MIT
@@ -12,13 +12,13 @@ Requires-Python: >=3.12
12
12
  Requires-Dist: anthropic==0.96.0
13
13
  Requires-Dist: docxlatex>=1.1.1
14
14
  Requires-Dist: fastapi
15
- Requires-Dist: google-genai==1.46.0
15
+ Requires-Dist: google-genai==1.70.0
16
16
  Requires-Dist: httpx
17
- Requires-Dist: openai==2.30.0
17
+ Requires-Dist: openai==3.1.0
18
18
  Requires-Dist: openpyxl
19
19
  Requires-Dist: python-pptx
20
20
  Requires-Dist: tenacity
21
- Requires-Dist: xai-sdk==1.11.0
21
+ Requires-Dist: xai-sdk==1.18.0
22
22
  Description-Content-Type: text/markdown
23
23
 
24
24
  # LLM Bridge
@@ -22,6 +22,7 @@ class NonStreamOpenAIResponsesClient(OpenAIResponsesClient):
22
22
  stream=False,
23
23
  tools=self.tools,
24
24
  reasoning=self.reasoning,
25
+ service_tier=self.service_tier,
25
26
  include=self.include,
26
27
  text=self.text,
27
28
  )
@@ -35,6 +35,7 @@ class StreamOpenAIResponsesClient(OpenAIResponsesClient):
35
35
  stream=True,
36
36
  tools=self.tools,
37
37
  reasoning=self.reasoning,
38
+ service_tier=self.service_tier,
38
39
  include=self.include,
39
40
  text=self.text,
40
41
  )
@@ -20,6 +20,7 @@ class NonStreamXAIClient(XAIClient):
20
20
  store_messages=False,
21
21
  tools=self.tools,
22
22
  reasoning_effort=self.reasoning_effort,
23
+ service_tier=self.service_tier,
23
24
  response_format=self.response_format,
24
25
  )
25
26
 
@@ -28,7 +29,7 @@ class NonStreamXAIClient(XAIClient):
28
29
  text = response.content
29
30
  thought = response.reasoning_content
30
31
  input_tokens = response.usage.prompt_tokens
31
- output_tokens = response.usage.completion_tokens
32
+ output_tokens = response.usage.reasoning_tokens + response.usage.completion_tokens
32
33
 
33
34
  return ChatResponse(
34
35
  text=text,
@@ -20,6 +20,7 @@ class StreamXAIClient(XAIClient):
20
20
  store_messages=False,
21
21
  tools=self.tools,
22
22
  reasoning_effort=self.reasoning_effort,
23
+ service_tier=self.service_tier,
23
24
  response_format=self.response_format,
24
25
  )
25
26
  except Exception as e:
@@ -28,7 +29,7 @@ class StreamXAIClient(XAIClient):
28
29
  try:
29
30
  prev_cumulative_output_tokens: int = 0
30
31
  async for response, chunk in chat.stream():
31
- cumulative_output_tokens = chunk.proto.usage.completion_tokens
32
+ cumulative_output_tokens = chunk.proto.usage.reasoning_tokens + chunk.proto.usage.completion_tokens
32
33
  output_tokens = cumulative_output_tokens - prev_cumulative_output_tokens
33
34
  prev_cumulative_output_tokens = cumulative_output_tokens
34
35
 
@@ -1,4 +1,5 @@
1
1
  from collections.abc import AsyncGenerator, Iterable
2
+ from typing import Literal
2
3
 
3
4
  import openai.lib.azure
4
5
  import openai
@@ -21,6 +22,7 @@ class OpenAIResponsesClient(ChatClient):
21
22
  client: openai.AsyncOpenAI | openai.lib.azure.AsyncAzureOpenAI,
22
23
  tools: Iterable[ToolParam] | Omit,
23
24
  reasoning: Reasoning | Omit,
25
+ service_tier: Literal["fast", "ultrafast"] | Omit,
24
26
  include: list[ResponseIncludable] | Omit,
25
27
  text: ResponseTextConfigParam | Omit,
26
28
  ):
@@ -31,6 +33,7 @@ class OpenAIResponsesClient(ChatClient):
31
33
  self.client = client
32
34
  self.tools = tools
33
35
  self.reasoning = reasoning
36
+ self.service_tier = service_tier
34
37
  self.include = include
35
38
  self.text = text
36
39
 
@@ -2,7 +2,7 @@ from collections.abc import AsyncGenerator
2
2
 
3
3
  import xai_sdk
4
4
  from xai_sdk.proto import chat_pb2
5
- from xai_sdk.types import ReasoningEffort
5
+ from xai_sdk.types import ReasoningEffort, ServiceTier
6
6
 
7
7
  from llm_bridge.client.chat_client import ChatClient
8
8
  from llm_bridge.type.chat_response import ChatResponse
@@ -18,6 +18,7 @@ class XAIClient(ChatClient):
18
18
  client: xai_sdk.AsyncClient,
19
19
  tools: list[chat_pb2.Tool],
20
20
  reasoning_effort: ReasoningEffort | None,
21
+ service_tier: ServiceTier,
21
22
  response_format: chat_pb2.ResponseFormat | None,
22
23
  ):
23
24
  self.model = model
@@ -26,6 +27,7 @@ class XAIClient(ChatClient):
26
27
  self.client = client
27
28
  self.tools = tools
28
29
  self.reasoning_effort = reasoning_effort
30
+ self.service_tier = service_tier
29
31
  self.response_format = response_format
30
32
 
31
33
  async def generate_non_stream_response(self) -> ChatResponse:
@@ -67,17 +67,6 @@ async def create_chat_client(
67
67
  code_execution=code_execution,
68
68
  structured_output_schema=structured_output_schema,
69
69
  )
70
- elif api_type == 'OpenAI-GitHub':
71
- return await create_openai_completion_client(
72
- api_keys={"GITHUB_API_KEY": api_keys["GITHUB_API_KEY"]},
73
- messages=messages,
74
- model=model,
75
- api_type=api_type,
76
- temperature=temperature,
77
- stream=stream,
78
- thought=thought,
79
- structured_output_schema=structured_output_schema,
80
- )
81
70
  elif api_type == 'Grok':
82
71
  return await create_xai_client(
83
72
  api_key=api_keys["XAI_API_KEY"],
@@ -47,7 +47,9 @@ async def create_claude_client(
47
47
  )
48
48
 
49
49
  context_window = 1_000_000
50
- max_output = 64_000
50
+ max_output = 128_000
51
+ if not stream:
52
+ max_output = 21_333 # SDK non-streaming limit
51
53
  max_tokens = min(
52
54
  max_output,
53
55
  context_window - input_tokens,
@@ -83,7 +85,7 @@ async def create_claude_client(
83
85
  if thought or structured_output_schema:
84
86
  output_config: BetaOutputConfigParam = BetaOutputConfigParam()
85
87
  if thought:
86
- output_config["effort"] = "high"
88
+ output_config["effort"] = "max"
87
89
  if structured_output_schema:
88
90
  output_config["format"] = BetaJSONOutputFormatParam(
89
91
  type="json_schema",
@@ -103,8 +103,19 @@ async def create_gemini_client(
103
103
  response_modalities=response_modalities,
104
104
  )
105
105
 
106
- if vertexai:
107
- config.media_resolution=MediaResolution.MEDIA_RESOLUTION_HIGH
106
+ if "pro-image" not in model:
107
+ config.media_resolution = MediaResolution.MEDIA_RESOLUTION_HIGH
108
+
109
+ if model in ["gemini-3.1-pro-preview", "gemini-3.8-flash", "gemini-3.6-flash", "gemini-3-flash-preview", "gemini-3-pro-image", "gemini-3.1-flash-image"]:
110
+ if vertexai:
111
+ config.http_options = types.HttpOptions(
112
+ headers={
113
+ "X-Vertex-AI-LLM-Request-Type": "shared",
114
+ "X-Vertex-AI-LLM-Shared-Request-Type": "priority",
115
+ }
116
+ )
117
+ elif not free_tier:
118
+ config.service_tier = types.ServiceTier.PRIORITY
108
119
 
109
120
  if structured_output_schema:
110
121
  config.response_mime_type = "application/json"
@@ -33,11 +33,6 @@ async def create_openai_completion_client(
33
33
  client = openai.AsyncOpenAI(
34
34
  api_key=api_keys["OPENAI_API_KEY"],
35
35
  )
36
- elif api_type == "OpenAI-GitHub":
37
- client = openai.AsyncOpenAI(
38
- base_url="https://models.inference.ai.azure.com",
39
- api_key=api_keys["GITHUB_API_KEY"],
40
- )
41
36
  else:
42
37
  raise HTTPException(status_code=500, detail="API Type not matched")
43
38
 
@@ -1,5 +1,5 @@
1
1
  import re
2
- from typing import Any
2
+ from typing import Any, Literal
3
3
 
4
4
  import openai
5
5
  from fastapi import HTTPException
@@ -70,7 +70,7 @@ async def create_openai_responses_client(
70
70
  temperature = 1
71
71
  if thought:
72
72
  reasoning = Reasoning(
73
- effort="high",
73
+ effort="xhigh" if model in ["gpt-5.5"] else "max",
74
74
  summary="auto",
75
75
  )
76
76
  tools.append(
@@ -90,6 +90,13 @@ async def create_openai_responses_client(
90
90
  )
91
91
  )
92
92
 
93
+ service_tier: Literal["fast", "ultrafast"] | Omit = omit
94
+ if api_type == "OpenAI":
95
+ if model in ["gpt-6-astra", "gpt-6.1-sol"]:
96
+ service_tier = "ultrafast"
97
+ elif model in ["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.5", "gpt-4.1"]:
98
+ service_tier = "fast"
99
+
93
100
  if stream:
94
101
  return StreamOpenAIResponsesClient(
95
102
  model=model,
@@ -99,6 +106,7 @@ async def create_openai_responses_client(
99
106
  client=client,
100
107
  tools=tools,
101
108
  reasoning=reasoning,
109
+ service_tier=service_tier,
102
110
  include=include,
103
111
  text=text,
104
112
  )
@@ -111,6 +119,7 @@ async def create_openai_responses_client(
111
119
  client=client,
112
120
  tools=tools,
113
121
  reasoning=reasoning,
122
+ service_tier=service_tier,
114
123
  include=include,
115
124
  text=text,
116
125
  )
@@ -5,7 +5,7 @@ import xai_sdk
5
5
  from xai_sdk.proto import chat_pb2
6
6
  from xai_sdk.tools import web_search as web_search_tool, x_search as x_search_tool, \
7
7
  code_execution as code_execution_tool
8
- from xai_sdk.types import ReasoningEffort
8
+ from xai_sdk.types import ReasoningEffort, ServiceTier
9
9
 
10
10
  from llm_bridge.client.implementations.xai.non_stream_xai_client import NonStreamXAIClient
11
11
  from llm_bridge.client.implementations.xai.stream_xai_client import StreamXAIClient
@@ -31,7 +31,9 @@ async def create_xai_client(
31
31
  xai_messages = await convert_messages_to_xai(messages)
32
32
 
33
33
  # Reasoning cannot be disabled in xAI
34
- reasoning_effort: ReasoningEffort = "high"
34
+ reasoning_effort: ReasoningEffort = "xhigh"
35
+
36
+ service_tier: ServiceTier = "priority"
35
37
 
36
38
  tools: list[chat_pb2.Tool] = []
37
39
  if web_search:
@@ -60,6 +62,7 @@ async def create_xai_client(
60
62
  client=client,
61
63
  tools=tools,
62
64
  reasoning_effort=reasoning_effort,
65
+ service_tier=service_tier,
63
66
  response_format=response_format,
64
67
  )
65
68
  else:
@@ -70,5 +73,6 @@ async def create_xai_client(
70
73
  client=client,
71
74
  tools=tools,
72
75
  reasoning_effort=reasoning_effort,
76
+ service_tier=service_tier,
73
77
  response_format=response_format,
74
78
  )
@@ -1,45 +1,99 @@
1
1
  [
2
+ {
3
+ "apiType": "Google AI Studio",
4
+ "model": "gemini-4-argon",
5
+ "input": 7.2,
6
+ "output": 36
7
+ },
8
+ {
9
+ "apiType": "Google AI Studio",
10
+ "model": "gemini-3.1-pro-preview",
11
+ "input": 7.2,
12
+ "output": 32.4
13
+ },
14
+ {
15
+ "apiType": "Google AI Studio",
16
+ "model": "gemini-omni-flash-preview",
17
+ "input": 1.5,
18
+ "output": 17.5
19
+ },
20
+ {
21
+ "apiType": "Google AI Studio",
22
+ "model": "gemini-3.8-flash",
23
+ "input": 2.7,
24
+ "output": 13.5
25
+ },
26
+ {
27
+ "apiType": "Google AI Studio",
28
+ "model": "gemini-3.6-flash",
29
+ "input": 2.7,
30
+ "output": 13.5
31
+ },
32
+ {
33
+ "apiType": "Google AI Studio",
34
+ "model": "gemini-3-flash-preview",
35
+ "input": 1.8,
36
+ "output": 5.4
37
+ },
38
+ {
39
+ "apiType": "Google AI Studio",
40
+ "model": "gemini-3-pro-image",
41
+ "input": 3.6,
42
+ "output": 216
43
+ },
44
+ {
45
+ "apiType": "Google AI Studio",
46
+ "model": "gemini-3.1-flash-image",
47
+ "input": 0.9,
48
+ "output": 108
49
+ },
50
+ {
51
+ "apiType": "Google AI Studio",
52
+ "model": "gemini-flash-latest",
53
+ "input": 1,
54
+ "output": 2.5
55
+ },
2
56
  {
3
57
  "apiType": "Grok",
4
- "model": "grok-4.6",
5
- "input": 2,
6
- "output": 6
58
+ "model": "grok-4.7",
59
+ "input": 8,
60
+ "output": 24
7
61
  },
8
62
  {
9
63
  "apiType": "OpenAI",
10
64
  "model": "gpt-6-astra",
11
- "input": 20,
12
- "output": 75
65
+ "input": 120,
66
+ "output": 450
13
67
  },
14
68
  {
15
69
  "apiType": "OpenAI",
16
70
  "model": "gpt-6.1-sol",
17
- "input": 4,
18
- "output": 15
71
+ "input": 24,
72
+ "output": 90
19
73
  },
20
74
  {
21
75
  "apiType": "OpenAI",
22
76
  "model": "gpt-5.6-sol",
23
- "input": 10,
24
- "output": 45
77
+ "input": 20,
78
+ "output": 90
25
79
  },
26
80
  {
27
81
  "apiType": "OpenAI",
28
82
  "model": "gpt-5.6-terra",
29
- "input": 4,
30
- "output": 18
83
+ "input": 8,
84
+ "output": 36
31
85
  },
32
86
  {
33
87
  "apiType": "OpenAI",
34
88
  "model": "gpt-5.6-luna",
35
- "input": 0.4,
36
- "output": 1.8
89
+ "input": 0.8,
90
+ "output": 3.6
37
91
  },
38
92
  {
39
93
  "apiType": "OpenAI",
40
94
  "model": "gpt-5.5",
41
- "input": 10,
42
- "output": 45
95
+ "input": 12.5,
96
+ "output": 75
43
97
  },
44
98
  {
45
99
  "apiType": "OpenAI",
@@ -50,8 +104,8 @@
50
104
  {
51
105
  "apiType": "OpenAI",
52
106
  "model": "gpt-4.1",
53
- "input": 2,
54
- "output": 8
107
+ "input": 3.5,
108
+ "output": 14
55
109
  },
56
110
  {
57
111
  "apiType": "Claude",
@@ -89,11 +143,17 @@
89
143
  "input": 0.5,
90
144
  "output": 2.5
91
145
  },
146
+ {
147
+ "apiType": "Vertex AI",
148
+ "model": "gemini-4-argon",
149
+ "input": 7.2,
150
+ "output": 36
151
+ },
92
152
  {
93
153
  "apiType": "Vertex AI",
94
154
  "model": "gemini-3.1-pro-preview",
95
- "input": 4,
96
- "output": 18
155
+ "input": 7.2,
156
+ "output": 32.4
97
157
  },
98
158
  {
99
159
  "apiType": "Vertex AI",
@@ -103,91 +163,43 @@
103
163
  },
104
164
  {
105
165
  "apiType": "Vertex AI",
106
- "model": "gemini-3.7-flash",
107
- "input": 1.5,
108
- "output": 7.5
166
+ "model": "gemini-3.8-flash",
167
+ "input": 2.7,
168
+ "output": 13.5
109
169
  },
110
170
  {
111
171
  "apiType": "Vertex AI",
112
- "model": "gemini-3.5-flash",
113
- "input": 1,
114
- "output": 9
172
+ "model": "gemini-3.6-flash",
173
+ "input": 2.7,
174
+ "output": 13.5
115
175
  },
116
176
  {
117
177
  "apiType": "Vertex AI",
118
178
  "model": "gemini-3-flash-preview",
119
- "input": 1,
120
- "output": 3
179
+ "input": 1.8,
180
+ "output": 5.4
121
181
  },
122
182
  {
123
183
  "apiType": "Vertex AI",
124
- "model": "gemini-3-pro-image-preview",
125
- "input": 2,
126
- "output": 120
184
+ "model": "gemini-3-pro-image",
185
+ "input": 3.6,
186
+ "output": 216
127
187
  },
128
188
  {
129
189
  "apiType": "Vertex AI",
130
- "model": "gemini-3.1-flash-image-preview",
131
- "input": 0.5,
132
- "output": 60
133
- },
134
- {
135
- "apiType": "Google AI Studio",
136
- "model": "gemini-3.1-pro-preview",
137
- "input": 4,
138
- "output": 18
139
- },
140
- {
141
- "apiType": "Google AI Studio",
142
- "model": "gemini-omni-flash-preview",
143
- "input": 1.5,
144
- "output": 17.5
145
- },
146
- {
147
- "apiType": "Google AI Studio",
148
- "model": "gemini-3.7-flash",
149
- "input": 1.5,
150
- "output": 7.5
151
- },
152
- {
153
- "apiType": "Google AI Studio",
154
- "model": "gemini-3.5-flash",
155
- "input": 1,
156
- "output": 9
157
- },
158
- {
159
- "apiType": "Google AI Studio",
160
- "model": "gemini-3-flash-preview",
161
- "input": 1,
162
- "output": 3
163
- },
164
- {
165
- "apiType": "Google AI Studio",
166
- "model": "gemini-3-pro-image-preview",
167
- "input": 2,
168
- "output": 120
169
- },
170
- {
171
- "apiType": "Google AI Studio",
172
- "model": "gemini-3.1-flash-image-preview",
173
- "input": 0.5,
174
- "output": 60
175
- },
176
- {
177
- "apiType": "Google AI Studio",
178
- "model": "gemini-flash-latest",
179
- "input": 1,
180
- "output": 2.5
190
+ "model": "gemini-3.1-flash-image",
191
+ "input": 0.9,
192
+ "output": 108
181
193
  },
182
194
  {
183
195
  "apiType": "Google AI Studio Free Tier",
184
- "model": "gemini-3.7-flash",
196
+ "model": "gemini-3.8-flash",
185
197
  "input": 0,
186
198
  "output": 0
187
199
  },
188
200
  {
189
201
  "apiType": "Google AI Studio Free Tier",
190
- "model": "gemini-3.5-flash",
202
+ "model": "gemini-3.6-flash",
191
203
  "input": 0,
192
204
  "output": 0
193
205
  },
@@ -202,11 +214,5 @@
202
214
  "model": "gpt-4.1",
203
215
  "input": 2,
204
216
  "output": 8
205
- },
206
- {
207
- "apiType": "OpenAI-GitHub",
208
- "model": "gpt-4.1",
209
- "input": 0,
210
- "output": 0
211
217
  }
212
218
  ]
@@ -4,15 +4,15 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "LLM-Bridge"
7
- version = "2.1.17"
7
+ version = "2.2.1"
8
8
  dependencies = [
9
9
  "fastapi",
10
10
  "httpx",
11
11
  "tenacity",
12
- "openai==2.30.0",
13
- "google-genai==1.46.0", # google.genai
12
+ "openai==3.1.0",
13
+ "google-genai==1.70.0", # google.genai
14
14
  "anthropic==0.96.0",
15
- "xai-sdk==1.11.0",
15
+ "xai-sdk==1.18.0",
16
16
  "docxlatex>=1.1.1",
17
17
  "openpyxl",
18
18
  "python-pptx", # pptx
@@ -5,5 +5,4 @@ VERTEX_AI_API_KEY=
5
5
  ANTHROPIC_API_KEY=
6
6
  AZURE_API_KEY=
7
7
  AZURE_API_BASE=
8
- GITHUB_API_KEY=
9
8
  XAI_API_KEY=
@@ -9,7 +9,6 @@ api_keys = {
9
9
  "OPENAI_API_KEY": os.environ.get("OPENAI_API_KEY"),
10
10
  "AZURE_API_KEY": os.environ.get("AZURE_API_KEY"),
11
11
  "AZURE_API_BASE": os.environ.get("AZURE_API_BASE"),
12
- "GITHUB_API_KEY": os.environ.get("GITHUB_API_KEY"),
13
12
  "GOOGLE_AI_STUDIO_FREE_TIER_API_KEY": os.environ.get("GOOGLE_AI_STUDIO_FREE_TIER_API_KEY"),
14
13
  "GOOGLE_AI_STUDIO_API_KEY": os.environ.get("GOOGLE_AI_STUDIO_API_KEY"),
15
14
  "VERTEX_AI_API_KEY": os.environ.get("VERTEX_AI_API_KEY"),
@@ -161,13 +161,14 @@ messages = [
161
161
  ]
162
162
 
163
163
  # See /llm_bridge/resources/model_prices.json for available models
164
- model = "gpt-6-astra"
164
+ # model = "gpt-6-astra"
165
165
  # model = "gpt-5.6-luna"
166
166
  # model = "gpt-4.1"
167
167
  # model = "gpt-audio-1.5"
168
+ model = "gemini-4-argon"
168
169
  # model = "gemini-3.1-pro-preview"
169
- # model = "gemini-3-pro-image-preview"
170
- # model = "gemini-3.1-flash-image-preview"
170
+ # model = "gemini-3-pro-image"
171
+ # model = "gemini-3.1-flash-image"
171
172
  # model = "gemini-3.5-flash"
172
173
  # model = "claude-fable-5"
173
174
  # model = "claude-opus-4-6"
@@ -175,10 +176,9 @@ model = "gpt-6-astra"
175
176
 
176
177
  # api_type = "Vertex AI"
177
178
  # api_type = "Google AI Studio Free Tier"
178
- # api_type = "Google AI Studio"
179
- api_type = "OpenAI"
179
+ api_type = "Google AI Studio"
180
+ # api_type = "OpenAI"
180
181
  # api_type = "OpenAI-Azure"
181
- # api_type = "OpenAI-GitHub"
182
182
  # api_type = "Claude"
183
183
  # api_type = "Grok"
184
184
 
@@ -535,23 +535,30 @@ wheels = [
535
535
  { url = "https://files.pythonhosted.org/packages/73/76/d241a5c927433420507215df6cac1b1fa4ac0ba7a794df42a84326c68da8/google_auth-2.49.2-py3-none-any.whl", hash = "sha256:c2720924dfc82dedb962c9f52cabb2ab16714fd0a6a707e40561d217574ed6d5", size = 240638, upload-time = "2026-04-10T00:41:14.501Z" },
536
536
  ]
537
537
 
538
+ [package.optional-dependencies]
539
+ requests = [
540
+ { name = "requests" },
541
+ ]
542
+
538
543
  [[package]]
539
544
  name = "google-genai"
540
- version = "1.46.0"
545
+ version = "1.70.0"
541
546
  source = { registry = "https://pypi.org/simple" }
542
547
  dependencies = [
543
548
  { name = "anyio" },
544
- { name = "google-auth" },
549
+ { name = "distro" },
550
+ { name = "google-auth", extra = ["requests"] },
545
551
  { name = "httpx" },
546
552
  { name = "pydantic" },
547
553
  { name = "requests" },
554
+ { name = "sniffio" },
548
555
  { name = "tenacity" },
549
556
  { name = "typing-extensions" },
550
557
  { name = "websockets" },
551
558
  ]
552
- sdist = { url = "https://files.pythonhosted.org/packages/c7/2d/d5907af6a46fb0b660291a09bb62f9cbc1365899f7d64a74e7d8d2e056c2/google_genai-1.46.0.tar.gz", hash = "sha256:6824c31149fe3b1c7285b25f79b924c5f89fd52466f62e30f76954f8104fe3a7", size = 239561, upload-time = "2025-10-21T22:55:04.241Z" }
559
+ sdist = { url = "https://files.pythonhosted.org/packages/74/dd/28e4682904b183acbfad3fe6409f13a42f69bb8eab6e882d3bcbea1dde01/google_genai-1.70.0.tar.gz", hash = "sha256:36b67b0fc6f319e08d1f1efd808b790107b1809c8743a05d55dfcf9d9fad7719", size = 519550, upload-time = "2026-04-01T10:52:46.487Z" }
553
560
  wheels = [
554
- { url = "https://files.pythonhosted.org/packages/db/79/8993ec6cbf56e5c8f88c165380e55de34ec74f7b928bc302ff5c370f9c4e/google_genai-1.46.0-py3-none-any.whl", hash = "sha256:879c4a260d630db0dcedb5cc84a9d7b47acd29e43e9dc63541b511b757ea7296", size = 239445, upload-time = "2025-10-21T22:55:03.072Z" },
561
+ { url = "https://files.pythonhosted.org/packages/36/a3/d4564c8a9beaf6a3cef8d70fa6354318572cebfee65db4f01af0d41f45ba/google_genai-1.70.0-py3-none-any.whl", hash = "sha256:b74c24549d8b4208f4c736fd11857374788e1ffffc725de45d706e35c97fceee", size = 760584, upload-time = "2026-04-01T10:52:44.349Z" },
555
562
  ]
556
563
 
557
564
  [[package]]
@@ -629,6 +636,19 @@ wheels = [
629
636
  { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
630
637
  ]
631
638
 
639
+ [[package]]
640
+ name = "httpcore2"
641
+ version = "2.13.1"
642
+ source = { registry = "https://pypi.org/simple" }
643
+ dependencies = [
644
+ { name = "h11" },
645
+ { name = "truststore" },
646
+ ]
647
+ sdist = { url = "https://files.pythonhosted.org/packages/cb/f3/1db7aa2bc2524062192bb0e0323969492d1883152a232fe36eea65f4e35c/httpcore2-2.13.1.tar.gz", hash = "sha256:e0aa977abe17e69a3b820a24542a6fa88702676d83880b8d194dcd18408e5103", size = 68071, upload-time = "2026-09-23T07:47:22.372Z" }
648
+ wheels = [
649
+ { url = "https://files.pythonhosted.org/packages/09/ba/a4568248771ce81957bfb7cc600264a40fbcda092391ee1c415c50be4bea/httpcore2-2.13.1-py3-none-any.whl", hash = "sha256:e1e05d4f25f7d7d496bfb96748f6f4b67657b03da069b3a68c36069f3db73d0a", size = 83423, upload-time = "2026-09-23T07:47:19.365Z" },
650
+ ]
651
+
632
652
  [[package]]
633
653
  name = "httpx"
634
654
  version = "0.28.1"
@@ -644,13 +664,39 @@ wheels = [
644
664
  { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
645
665
  ]
646
666
 
667
+ [[package]]
668
+ name = "httpx2"
669
+ version = "2.13.1"
670
+ source = { registry = "https://pypi.org/simple" }
671
+ dependencies = [
672
+ { name = "anyio", marker = "sys_platform != 'emscripten'" },
673
+ { name = "httpcore2", marker = "sys_platform != 'emscripten'" },
674
+ { name = "httpx2-jsfetch", marker = "sys_platform == 'emscripten'" },
675
+ { name = "idna" },
676
+ { name = "truststore", marker = "sys_platform != 'emscripten'" },
677
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
678
+ ]
679
+ sdist = { url = "https://files.pythonhosted.org/packages/d5/44/474bef2a0e9d90f1715d32cb98b0738695ca17ba324095fb2497ed7fbd59/httpx2-2.13.1.tar.gz", hash = "sha256:e48744a19e3af5ee48313d0ce5fe941d5422fae5705ea922a4aabf94d7800dfa", size = 100405, upload-time = "2026-09-23T07:47:23.052Z" }
680
+ wheels = [
681
+ { url = "https://files.pythonhosted.org/packages/d8/9c/6fe8931fd9f381042a9e4c7d5a7b4cbf7016b252bec0c99a49fce42c3326/httpx2-2.13.1-py3-none-any.whl", hash = "sha256:6dff50fabc270ee5fd25d845d0b078ed20564579744d6d962850975996d2f9a4", size = 95597, upload-time = "2026-09-23T07:47:20.995Z" },
682
+ ]
683
+
684
+ [[package]]
685
+ name = "httpx2-jsfetch"
686
+ version = "1.0"
687
+ source = { registry = "https://pypi.org/simple" }
688
+ sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/0e5636363151a2a1795e0a77617168b9ca438e1748ec05fc9b5687f93d64/httpx2_jsfetch-1.0.tar.gz", hash = "sha256:70a0e3eabfef7cce5ad9c629f7d01ca05e418f586646f4ddf14782e4c1454c60", size = 6872, upload-time = "2026-08-07T00:13:07.492Z" }
689
+ wheels = [
690
+ { url = "https://files.pythonhosted.org/packages/9b/43/832f631d32e4f1211caa2ba368317739fe71f0b8530e4c9d15dc454bac2a/httpx2_jsfetch-1.0-py3-none-any.whl", hash = "sha256:cb916b707601e69a07721aabc8f3f6659be3a6893bc1ff5c6f9e02241df2da32", size = 6382, upload-time = "2026-08-07T00:13:06.567Z" },
691
+ ]
692
+
647
693
  [[package]]
648
694
  name = "idna"
649
- version = "3.11"
695
+ version = "3.20"
650
696
  source = { registry = "https://pypi.org/simple" }
651
- sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
697
+ sdist = { url = "https://files.pythonhosted.org/packages/f5/08/8eea9d4b8302028f3abb2c0813953f7aec26d33b7a8960ed760e65ff29fa/idna-3.20.tar.gz", hash = "sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44", size = 216463, upload-time = "2026-09-17T14:11:04.752Z" }
652
698
  wheels = [
653
- { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
699
+ { url = "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", hash = "sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", size = 69583, upload-time = "2026-09-17T14:11:03.168Z" },
654
700
  ]
655
701
 
656
702
  [[package]]
@@ -748,7 +794,7 @@ wheels = [
748
794
 
749
795
  [[package]]
750
796
  name = "llm-bridge"
751
- version = "2.1.17"
797
+ version = "2.2.1"
752
798
  source = { editable = "." }
753
799
  dependencies = [
754
800
  { name = "anthropic" },
@@ -775,13 +821,13 @@ requires-dist = [
775
821
  { name = "anthropic", specifier = "==0.96.0" },
776
822
  { name = "docxlatex", specifier = ">=1.1.1" },
777
823
  { name = "fastapi" },
778
- { name = "google-genai", specifier = "==1.46.0" },
824
+ { name = "google-genai", specifier = "==1.70.0" },
779
825
  { name = "httpx" },
780
- { name = "openai", specifier = "==2.30.0" },
826
+ { name = "openai", specifier = "==3.1.0" },
781
827
  { name = "openpyxl" },
782
828
  { name = "python-pptx" },
783
829
  { name = "tenacity" },
784
- { name = "xai-sdk", specifier = "==1.11.0" },
830
+ { name = "xai-sdk", specifier = "==1.18.0" },
785
831
  ]
786
832
 
787
833
  [package.metadata.requires-dev]
@@ -972,21 +1018,21 @@ wheels = [
972
1018
 
973
1019
  [[package]]
974
1020
  name = "openai"
975
- version = "2.30.0"
1021
+ version = "3.1.0"
976
1022
  source = { registry = "https://pypi.org/simple" }
977
1023
  dependencies = [
978
1024
  { name = "anyio" },
979
1025
  { name = "distro" },
980
- { name = "httpx" },
1026
+ { name = "httpx2" },
981
1027
  { name = "jiter" },
982
1028
  { name = "pydantic" },
983
1029
  { name = "sniffio" },
984
1030
  { name = "tqdm" },
985
1031
  { name = "typing-extensions" },
986
1032
  ]
987
- sdist = { url = "https://files.pythonhosted.org/packages/88/15/52580c8fbc16d0675d516e8749806eda679b16de1e4434ea06fb6feaa610/openai-2.30.0.tar.gz", hash = "sha256:92f7661c990bda4b22a941806c83eabe4896c3094465030dd882a71abe80c885", size = 676084, upload-time = "2026-03-25T22:08:59.96Z" }
1033
+ sdist = { url = "https://files.pythonhosted.org/packages/58/9b/d45911bf9abfc5a754d800d79fe56e4dcf6e7b679d6ff4b7e9689b56bc02/openai-3.1.0.tar.gz", hash = "sha256:3ae7190da63f718727f9c525740d3f713e85553d2bf1d0cc9247346bd9063a4d", size = 1131016, upload-time = "2026-08-14T23:49:46.325Z" }
988
1034
  wheels = [
989
- { url = "https://files.pythonhosted.org/packages/2a/9e/5bfa2270f902d5b92ab7d41ce0475b8630572e71e349b2a4996d14bdda93/openai-2.30.0-py3-none-any.whl", hash = "sha256:9a5ae616888eb2748ec5e0c5b955a51592e0b201a11f4262db920f2a78c5231d", size = 1146656, upload-time = "2026-03-25T22:08:58.2Z" },
1035
+ { url = "https://files.pythonhosted.org/packages/d3/45/84b9e909968c0f4c3112a828bba9aa8be6a5ee322fcb3d781145ee53d88e/openai-3.1.0-py3-none-any.whl", hash = "sha256:f06d5a5c8d06a0aead3a67d33fe5a3c3c31540a0f7a8017b02ba8cd99bc5c736", size = 1670762, upload-time = "2026-08-14T23:49:43.998Z" },
990
1036
  ]
991
1037
 
992
1038
  [[package]]
@@ -1463,6 +1509,15 @@ wheels = [
1463
1509
  { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" },
1464
1510
  ]
1465
1511
 
1512
+ [[package]]
1513
+ name = "truststore"
1514
+ version = "0.10.5"
1515
+ source = { registry = "https://pypi.org/simple" }
1516
+ sdist = { url = "https://files.pythonhosted.org/packages/ee/9f/c5201d42a484c061e528825fc8e2d565f5abd50a4ced6fb7d29c4ec99b2b/truststore-0.10.5.tar.gz", hash = "sha256:30d36967ccaded5cbb38d602c433f53600036c79d502f4533a49b60a03bbefcd", size = 28091, upload-time = "2026-10-12T22:27:31.808Z" }
1517
+ wheels = [
1518
+ { url = "https://files.pythonhosted.org/packages/51/e9/3a7820be2bb0fe53b6bc9c3be26d3d1158004e4c3ab953aa6840b955b1e9/truststore-0.10.5-py3-none-any.whl", hash = "sha256:9aaaedaefaf06d8b206278cf8b5012bc897f485a874503501e12d776df78951c", size = 19017, upload-time = "2026-10-12T22:27:30.377Z" },
1519
+ ]
1520
+
1466
1521
  [[package]]
1467
1522
  name = "typing-extensions"
1468
1523
  version = "4.15.0"
@@ -1526,7 +1581,7 @@ wheels = [
1526
1581
 
1527
1582
  [[package]]
1528
1583
  name = "xai-sdk"
1529
- version = "1.11.0"
1584
+ version = "1.18.0"
1530
1585
  source = { registry = "https://pypi.org/simple" }
1531
1586
  dependencies = [
1532
1587
  { name = "aiohttp" },
@@ -1538,9 +1593,9 @@ dependencies = [
1538
1593
  { name = "pydantic" },
1539
1594
  { name = "requests" },
1540
1595
  ]
1541
- sdist = { url = "https://files.pythonhosted.org/packages/49/32/bb8385f7a3b05ce406b689aa000c9a34289caa1526f1c093a1cefc0d9695/xai_sdk-1.11.0.tar.gz", hash = "sha256:ca87a830d310fb8e06fba44fb2a8c5cdf0d9f716b61126eddd51b7f416a63932", size = 404313, upload-time = "2026-03-27T18:23:10.091Z" }
1596
+ sdist = { url = "https://files.pythonhosted.org/packages/3f/33/e09aacf91323617a7e9717a3ae9893b15dd73c469a8d57eb083794555d61/xai_sdk-1.18.0.tar.gz", hash = "sha256:e3a8f58f37675cc154906fd78be7d26dd9215e5602ee3c40c1d2a03fb589bbaf", size = 453105, upload-time = "2026-08-13T01:26:39.86Z" }
1542
1597
  wheels = [
1543
- { url = "https://files.pythonhosted.org/packages/04/76/86d9a3589c725ce825d2ed3e7cb3ecf7f956d3fd015353d52197bb341bcd/xai_sdk-1.11.0-py3-none-any.whl", hash = "sha256:fe58ce6d8f8115ae8bd57ded57bcd847d0bb7cb28bb7b236abefd4626df1ed8d", size = 251388, upload-time = "2026-03-27T18:23:08.573Z" },
1598
+ { url = "https://files.pythonhosted.org/packages/85/5e/4bd6ed8d44783d9938e6db2b890dc58b26da75f15962e35e8d676365e406/xai_sdk-1.18.0-py3-none-any.whl", hash = "sha256:9e8bcc9e7ec9c92209801056e6ba9740ebde4f7e6a0b2ec111e9d78233f85ef9", size = 274111, upload-time = "2026-08-13T01:26:38.255Z" },
1544
1599
  ]
1545
1600
 
1546
1601
  [[package]]
File without changes
File without changes
File without changes
File without changes