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.
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/PKG-INFO +4 -4
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_responses/non_stream_openai_responses_client.py +1 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_responses/stream_openai_responses_client.py +1 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/xai/non_stream_xai_client.py +2 -1
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/xai/stream_xai_client.py +2 -1
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/openai_responses_client.py +3 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/xai_client.py +3 -1
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/chat_client_factory.py +0 -11
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_client_factory/claude_client_factory.py +4 -2
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_client_factory/gemini_client_factory.py +13 -2
- {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
- {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
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_client_factory/xai_client_factory.py +6 -2
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/resources/model_prices.json +95 -89
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/pyproject.toml +4 -4
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/.env.example +0 -1
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/keys.py +0 -1
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/single/config.py +6 -6
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/uv.lock +73 -18
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.gitattributes +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.github/workflows/pypi-publish.yaml +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.github/workflows/python-test.yaml +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.gitignore +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.run/batch.run.xml +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.run/pytest.run.xml +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/.run/single.run.xml +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/LICENSE +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/README.md +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/chat_client.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/claude/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/claude/claude_response_handler.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/claude/claude_token_counter.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/claude/non_stream_claude_client.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/claude/stream_claude_client.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/gemini/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/gemini/gemini_response_handler.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/gemini/gemini_token_counter.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/gemini/non_stream_gemini_client.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/gemini/stream_gemini_client.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/http_error.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_completion/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_completion/non_stream_openai_completion_client.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_completion/stream_openai_completion_client.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_responses/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/openai_responses/openai_responses_response_handler.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/xai/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/claude_client.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/gemini_client.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/openai_completion_client.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/chat_message_converter.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/media_processor.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_client_factory/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_message_converter/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_message_converter/claude_message_converter.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_message_converter/gemini_message_converter.py +0 -0
- {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
- {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
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/model_message_converter/xai_message_converter.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/file_fetch.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/code_file_extensions.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/document_processor.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/file_type_checker.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/message_processor.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/model_prices.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/resources/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/chat_response.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/message.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/claude_message.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/gemini_message.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/openai_completion_message.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/openai_responses_message.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/xai_message.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/serializer.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/claude_message_converter_test.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/gemini_message_converter_test.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/message_factory.py +0 -0
- {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
- {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
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/xai_message_converter_test.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/message_process/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/message_process/file_type_checker_test.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/model_prices_test.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/batch/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/batch/batch.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/batch/config.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/messages.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/single/__init__.py +0 -0
- {llm_bridge-2.1.17 → llm_bridge-2.2.1}/usage/single/single.py +0 -0
- {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
|
|
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.
|
|
15
|
+
Requires-Dist: google-genai==1.70.0
|
|
16
16
|
Requires-Dist: httpx
|
|
17
|
-
Requires-Dist: openai==
|
|
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.
|
|
21
|
+
Requires-Dist: xai-sdk==1.18.0
|
|
22
22
|
Description-Content-Type: text/markdown
|
|
23
23
|
|
|
24
24
|
# LLM Bridge
|
|
@@ -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,
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/implementations/xai/stream_xai_client.py
RENAMED
|
@@ -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
|
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/openai_responses_client.py
RENAMED
|
@@ -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:
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/chat_client_factory.py
RENAMED
|
@@ -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 =
|
|
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"] = "
|
|
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
|
|
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="
|
|
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 = "
|
|
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.
|
|
5
|
-
"input":
|
|
6
|
-
"output":
|
|
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":
|
|
12
|
-
"output":
|
|
65
|
+
"input": 120,
|
|
66
|
+
"output": 450
|
|
13
67
|
},
|
|
14
68
|
{
|
|
15
69
|
"apiType": "OpenAI",
|
|
16
70
|
"model": "gpt-6.1-sol",
|
|
17
|
-
"input":
|
|
18
|
-
"output":
|
|
71
|
+
"input": 24,
|
|
72
|
+
"output": 90
|
|
19
73
|
},
|
|
20
74
|
{
|
|
21
75
|
"apiType": "OpenAI",
|
|
22
76
|
"model": "gpt-5.6-sol",
|
|
23
|
-
"input":
|
|
24
|
-
"output":
|
|
77
|
+
"input": 20,
|
|
78
|
+
"output": 90
|
|
25
79
|
},
|
|
26
80
|
{
|
|
27
81
|
"apiType": "OpenAI",
|
|
28
82
|
"model": "gpt-5.6-terra",
|
|
29
|
-
"input":
|
|
30
|
-
"output":
|
|
83
|
+
"input": 8,
|
|
84
|
+
"output": 36
|
|
31
85
|
},
|
|
32
86
|
{
|
|
33
87
|
"apiType": "OpenAI",
|
|
34
88
|
"model": "gpt-5.6-luna",
|
|
35
|
-
"input": 0.
|
|
36
|
-
"output":
|
|
89
|
+
"input": 0.8,
|
|
90
|
+
"output": 3.6
|
|
37
91
|
},
|
|
38
92
|
{
|
|
39
93
|
"apiType": "OpenAI",
|
|
40
94
|
"model": "gpt-5.5",
|
|
41
|
-
"input":
|
|
42
|
-
"output":
|
|
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":
|
|
54
|
-
"output":
|
|
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":
|
|
96
|
-
"output":
|
|
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.
|
|
107
|
-
"input":
|
|
108
|
-
"output":
|
|
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.
|
|
113
|
-
"input":
|
|
114
|
-
"output":
|
|
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":
|
|
179
|
+
"input": 1.8,
|
|
180
|
+
"output": 5.4
|
|
121
181
|
},
|
|
122
182
|
{
|
|
123
183
|
"apiType": "Vertex AI",
|
|
124
|
-
"model": "gemini-3-pro-image
|
|
125
|
-
"input":
|
|
126
|
-
"output":
|
|
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
|
|
131
|
-
"input": 0.
|
|
132
|
-
"output":
|
|
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.
|
|
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.
|
|
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
|
|
7
|
+
version = "2.2.1"
|
|
8
8
|
dependencies = [
|
|
9
9
|
"fastapi",
|
|
10
10
|
"httpx",
|
|
11
11
|
"tenacity",
|
|
12
|
-
"openai==
|
|
13
|
-
"google-genai==1.
|
|
12
|
+
"openai==3.1.0",
|
|
13
|
+
"google-genai==1.70.0", # google.genai
|
|
14
14
|
"anthropic==0.96.0",
|
|
15
|
-
"xai-sdk==1.
|
|
15
|
+
"xai-sdk==1.18.0",
|
|
16
16
|
"docxlatex>=1.1.1",
|
|
17
17
|
"openpyxl",
|
|
18
18
|
"python-pptx", # pptx
|
|
@@ -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
|
|
170
|
-
# model = "gemini-3.1-flash-image
|
|
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
|
-
|
|
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.
|
|
545
|
+
version = "1.70.0"
|
|
541
546
|
source = { registry = "https://pypi.org/simple" }
|
|
542
547
|
dependencies = [
|
|
543
548
|
{ name = "anyio" },
|
|
544
|
-
{ name = "
|
|
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/
|
|
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/
|
|
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.
|
|
695
|
+
version = "3.20"
|
|
650
696
|
source = { registry = "https://pypi.org/simple" }
|
|
651
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
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/
|
|
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
|
|
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.
|
|
824
|
+
{ name = "google-genai", specifier = "==1.70.0" },
|
|
779
825
|
{ name = "httpx" },
|
|
780
|
-
{ name = "openai", specifier = "==
|
|
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.
|
|
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 = "
|
|
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 = "
|
|
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/
|
|
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/
|
|
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.
|
|
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/
|
|
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/
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/client/model_client/openai_completion_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/chat_generate/chat_message_converter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/code_file_extensions.py
RENAMED
|
File without changes
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/document_processor.py
RENAMED
|
File without changes
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/file_type_checker.py
RENAMED
|
File without changes
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/logic/message_process/message_processor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/openai_completion_message.py
RENAMED
|
File without changes
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/llm_bridge/type/model_message/openai_responses_message.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/chat_generate/model_message_converter/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{llm_bridge-2.1.17 → llm_bridge-2.2.1}/tests/logic/message_process/file_type_checker_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|