LLM-Bridge 2.1.16__tar.gz → 2.2.0__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.16 → llm_bridge-2.2.0}/PKG-INFO +4 -4
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/openai_responses/non_stream_openai_responses_client.py +1 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/openai_responses/stream_openai_responses_client.py +1 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/xai/non_stream_xai_client.py +2 -1
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/xai/stream_xai_client.py +2 -1
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/model_client/openai_responses_client.py +3 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/model_client/xai_client.py +3 -1
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/chat_client_factory.py +0 -11
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/model_client_factory/claude_client_factory.py +4 -2
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/model_client_factory/gemini_client_factory.py +13 -2
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/model_client_factory/openai_completion_client_factory.py +0 -5
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/model_client_factory/openai_responses_client_factory.py +11 -2
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/model_client_factory/xai_client_factory.py +6 -2
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/resources/model_prices.json +57 -63
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/pyproject.toml +4 -4
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/usage/.env.example +0 -1
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/usage/keys.py +0 -1
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/usage/single/config.py +2 -3
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/uv.lock +73 -18
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/.gitattributes +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/.github/workflows/pypi-publish.yaml +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/.github/workflows/python-test.yaml +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/.gitignore +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/.run/batch.run.xml +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/.run/pytest.run.xml +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/.run/single.run.xml +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/LICENSE +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/README.md +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/chat_client.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/claude/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/claude/claude_response_handler.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/claude/claude_token_counter.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/claude/non_stream_claude_client.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/claude/stream_claude_client.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/gemini/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/gemini/gemini_response_handler.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/gemini/gemini_token_counter.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/gemini/non_stream_gemini_client.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/gemini/stream_gemini_client.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/http_error.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/openai_completion/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/openai_completion/non_stream_openai_completion_client.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/openai_completion/stream_openai_completion_client.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/openai_responses/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/openai_responses/openai_responses_response_handler.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/implementations/xai/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/model_client/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/model_client/claude_client.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/model_client/gemini_client.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/client/model_client/openai_completion_client.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/chat_message_converter.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/media_processor.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/model_client_factory/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/model_message_converter/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/model_message_converter/claude_message_converter.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/model_message_converter/gemini_message_converter.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/model_message_converter/openai_completion_message_converter.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/model_message_converter/openai_responses_message_converter.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/chat_generate/model_message_converter/xai_message_converter.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/file_fetch.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/message_process/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/message_process/code_file_extensions.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/message_process/document_processor.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/message_process/file_type_checker.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/message_process/message_processor.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/model_prices.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/resources/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/type/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/type/chat_response.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/type/message.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/type/model_message/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/type/model_message/claude_message.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/type/model_message/gemini_message.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/type/model_message/openai_completion_message.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/type/model_message/openai_responses_message.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/type/model_message/xai_message.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/type/serializer.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/logic/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/logic/chat_generate/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/logic/chat_generate/model_message_converter/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/logic/chat_generate/model_message_converter/claude_message_converter_test.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/logic/chat_generate/model_message_converter/gemini_message_converter_test.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/logic/chat_generate/model_message_converter/message_factory.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/logic/chat_generate/model_message_converter/openai_completion_message_converter_test.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/logic/chat_generate/model_message_converter/openai_responses_message_converter_test.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/logic/chat_generate/model_message_converter/xai_message_converter_test.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/logic/message_process/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/logic/message_process/file_type_checker_test.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/tests/logic/model_prices_test.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/usage/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/usage/batch/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/usage/batch/batch.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/usage/batch/config.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/usage/messages.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/usage/single/__init__.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/usage/single/single.py +0 -0
- {llm_bridge-2.1.16 → llm_bridge-2.2.0}/usage/workflow.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: LLM-Bridge
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
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.16 → llm_bridge-2.2.0}/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.16 → llm_bridge-2.2.0}/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.16 → llm_bridge-2.2.0}/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,45 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
3
|
"apiType": "Grok",
|
|
4
|
-
"model": "grok-4.
|
|
5
|
-
"input":
|
|
6
|
-
"output":
|
|
4
|
+
"model": "grok-4.7",
|
|
5
|
+
"input": 8,
|
|
6
|
+
"output": 24
|
|
7
7
|
},
|
|
8
8
|
{
|
|
9
9
|
"apiType": "OpenAI",
|
|
10
10
|
"model": "gpt-6-astra",
|
|
11
|
-
"input":
|
|
12
|
-
"output":
|
|
11
|
+
"input": 120,
|
|
12
|
+
"output": 450
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"apiType": "OpenAI",
|
|
16
16
|
"model": "gpt-6.1-sol",
|
|
17
|
-
"input":
|
|
18
|
-
"output":
|
|
17
|
+
"input": 24,
|
|
18
|
+
"output": 90
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
"apiType": "OpenAI",
|
|
22
22
|
"model": "gpt-5.6-sol",
|
|
23
|
-
"input":
|
|
24
|
-
"output":
|
|
23
|
+
"input": 20,
|
|
24
|
+
"output": 90
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
"apiType": "OpenAI",
|
|
28
28
|
"model": "gpt-5.6-terra",
|
|
29
|
-
"input":
|
|
30
|
-
"output":
|
|
29
|
+
"input": 8,
|
|
30
|
+
"output": 36
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
"apiType": "OpenAI",
|
|
34
34
|
"model": "gpt-5.6-luna",
|
|
35
|
-
"input": 0.
|
|
36
|
-
"output":
|
|
35
|
+
"input": 0.8,
|
|
36
|
+
"output": 3.6
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
"apiType": "OpenAI",
|
|
40
40
|
"model": "gpt-5.5",
|
|
41
|
-
"input":
|
|
42
|
-
"output":
|
|
41
|
+
"input": 12.5,
|
|
42
|
+
"output": 75
|
|
43
43
|
},
|
|
44
44
|
{
|
|
45
45
|
"apiType": "OpenAI",
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
{
|
|
51
51
|
"apiType": "OpenAI",
|
|
52
52
|
"model": "gpt-4.1",
|
|
53
|
-
"input":
|
|
54
|
-
"output":
|
|
53
|
+
"input": 3.5,
|
|
54
|
+
"output": 14
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
"apiType": "Claude",
|
|
@@ -71,12 +71,6 @@
|
|
|
71
71
|
"input": 4,
|
|
72
72
|
"output": 20
|
|
73
73
|
},
|
|
74
|
-
{
|
|
75
|
-
"apiType": "Claude",
|
|
76
|
-
"model": "claude-opus-4-8",
|
|
77
|
-
"input": 5,
|
|
78
|
-
"output": 25
|
|
79
|
-
},
|
|
80
74
|
{
|
|
81
75
|
"apiType": "Claude",
|
|
82
76
|
"model": "claude-opus-4-6",
|
|
@@ -89,11 +83,17 @@
|
|
|
89
83
|
"input": 3,
|
|
90
84
|
"output": 15
|
|
91
85
|
},
|
|
86
|
+
{
|
|
87
|
+
"apiType": "Claude",
|
|
88
|
+
"model": "claude-haiku-5-5",
|
|
89
|
+
"input": 0.5,
|
|
90
|
+
"output": 2.5
|
|
91
|
+
},
|
|
92
92
|
{
|
|
93
93
|
"apiType": "Vertex AI",
|
|
94
94
|
"model": "gemini-3.1-pro-preview",
|
|
95
|
-
"input":
|
|
96
|
-
"output":
|
|
95
|
+
"input": 7.2,
|
|
96
|
+
"output": 32.4
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
99
|
"apiType": "Vertex AI",
|
|
@@ -103,39 +103,39 @@
|
|
|
103
103
|
},
|
|
104
104
|
{
|
|
105
105
|
"apiType": "Vertex AI",
|
|
106
|
-
"model": "gemini-3.
|
|
107
|
-
"input":
|
|
108
|
-
"output":
|
|
106
|
+
"model": "gemini-3.8-flash",
|
|
107
|
+
"input": 2.7,
|
|
108
|
+
"output": 13.5
|
|
109
109
|
},
|
|
110
110
|
{
|
|
111
111
|
"apiType": "Vertex AI",
|
|
112
|
-
"model": "gemini-3.
|
|
113
|
-
"input":
|
|
114
|
-
"output":
|
|
112
|
+
"model": "gemini-3.6-flash",
|
|
113
|
+
"input": 2.7,
|
|
114
|
+
"output": 13.5
|
|
115
115
|
},
|
|
116
116
|
{
|
|
117
117
|
"apiType": "Vertex AI",
|
|
118
118
|
"model": "gemini-3-flash-preview",
|
|
119
|
-
"input": 1,
|
|
120
|
-
"output":
|
|
119
|
+
"input": 1.8,
|
|
120
|
+
"output": 5.4
|
|
121
121
|
},
|
|
122
122
|
{
|
|
123
123
|
"apiType": "Vertex AI",
|
|
124
|
-
"model": "gemini-3-pro-image
|
|
125
|
-
"input":
|
|
126
|
-
"output":
|
|
124
|
+
"model": "gemini-3-pro-image",
|
|
125
|
+
"input": 3.6,
|
|
126
|
+
"output": 216
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
129
|
"apiType": "Vertex AI",
|
|
130
|
-
"model": "gemini-3.1-flash-image
|
|
131
|
-
"input": 0.
|
|
132
|
-
"output":
|
|
130
|
+
"model": "gemini-3.1-flash-image",
|
|
131
|
+
"input": 0.9,
|
|
132
|
+
"output": 108
|
|
133
133
|
},
|
|
134
134
|
{
|
|
135
135
|
"apiType": "Google AI Studio",
|
|
136
136
|
"model": "gemini-3.1-pro-preview",
|
|
137
|
-
"input":
|
|
138
|
-
"output":
|
|
137
|
+
"input": 7.2,
|
|
138
|
+
"output": 32.4
|
|
139
139
|
},
|
|
140
140
|
{
|
|
141
141
|
"apiType": "Google AI Studio",
|
|
@@ -145,33 +145,33 @@
|
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
147
|
"apiType": "Google AI Studio",
|
|
148
|
-
"model": "gemini-3.
|
|
149
|
-
"input":
|
|
150
|
-
"output":
|
|
148
|
+
"model": "gemini-3.8-flash",
|
|
149
|
+
"input": 2.7,
|
|
150
|
+
"output": 13.5
|
|
151
151
|
},
|
|
152
152
|
{
|
|
153
153
|
"apiType": "Google AI Studio",
|
|
154
|
-
"model": "gemini-3.
|
|
155
|
-
"input":
|
|
156
|
-
"output":
|
|
154
|
+
"model": "gemini-3.6-flash",
|
|
155
|
+
"input": 2.7,
|
|
156
|
+
"output": 13.5
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
159
|
"apiType": "Google AI Studio",
|
|
160
160
|
"model": "gemini-3-flash-preview",
|
|
161
|
-
"input": 1,
|
|
162
|
-
"output":
|
|
161
|
+
"input": 1.8,
|
|
162
|
+
"output": 5.4
|
|
163
163
|
},
|
|
164
164
|
{
|
|
165
165
|
"apiType": "Google AI Studio",
|
|
166
|
-
"model": "gemini-3-pro-image
|
|
167
|
-
"input":
|
|
168
|
-
"output":
|
|
166
|
+
"model": "gemini-3-pro-image",
|
|
167
|
+
"input": 3.6,
|
|
168
|
+
"output": 216
|
|
169
169
|
},
|
|
170
170
|
{
|
|
171
171
|
"apiType": "Google AI Studio",
|
|
172
|
-
"model": "gemini-3.1-flash-image
|
|
173
|
-
"input": 0.
|
|
174
|
-
"output":
|
|
172
|
+
"model": "gemini-3.1-flash-image",
|
|
173
|
+
"input": 0.9,
|
|
174
|
+
"output": 108
|
|
175
175
|
},
|
|
176
176
|
{
|
|
177
177
|
"apiType": "Google AI Studio",
|
|
@@ -181,13 +181,13 @@
|
|
|
181
181
|
},
|
|
182
182
|
{
|
|
183
183
|
"apiType": "Google AI Studio Free Tier",
|
|
184
|
-
"model": "gemini-3.
|
|
184
|
+
"model": "gemini-3.8-flash",
|
|
185
185
|
"input": 0,
|
|
186
186
|
"output": 0
|
|
187
187
|
},
|
|
188
188
|
{
|
|
189
189
|
"apiType": "Google AI Studio Free Tier",
|
|
190
|
-
"model": "gemini-3.
|
|
190
|
+
"model": "gemini-3.6-flash",
|
|
191
191
|
"input": 0,
|
|
192
192
|
"output": 0
|
|
193
193
|
},
|
|
@@ -202,11 +202,5 @@
|
|
|
202
202
|
"model": "gpt-4.1",
|
|
203
203
|
"input": 2,
|
|
204
204
|
"output": 8
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
"apiType": "OpenAI-GitHub",
|
|
208
|
-
"model": "gpt-4.1",
|
|
209
|
-
"input": 0,
|
|
210
|
-
"output": 0
|
|
211
205
|
}
|
|
212
206
|
]
|
|
@@ -4,15 +4,15 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "LLM-Bridge"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.2.0"
|
|
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"),
|
|
@@ -166,8 +166,8 @@ model = "gpt-6-astra"
|
|
|
166
166
|
# model = "gpt-4.1"
|
|
167
167
|
# model = "gpt-audio-1.5"
|
|
168
168
|
# model = "gemini-3.1-pro-preview"
|
|
169
|
-
# model = "gemini-3-pro-image
|
|
170
|
-
# model = "gemini-3.1-flash-image
|
|
169
|
+
# model = "gemini-3-pro-image"
|
|
170
|
+
# model = "gemini-3.1-flash-image"
|
|
171
171
|
# model = "gemini-3.5-flash"
|
|
172
172
|
# model = "claude-fable-5"
|
|
173
173
|
# model = "claude-opus-4-6"
|
|
@@ -178,7 +178,6 @@ model = "gpt-6-astra"
|
|
|
178
178
|
# api_type = "Google AI Studio"
|
|
179
179
|
api_type = "OpenAI"
|
|
180
180
|
# api_type = "OpenAI-Azure"
|
|
181
|
-
# api_type = "OpenAI-GitHub"
|
|
182
181
|
# api_type = "Claude"
|
|
183
182
|
# api_type = "Grok"
|
|
184
183
|
|
|
@@ -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.
|
|
797
|
+
version = "2.2.0"
|
|
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.16 → llm_bridge-2.2.0}/llm_bridge/client/model_client/openai_completion_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{llm_bridge-2.1.16 → llm_bridge-2.2.0}/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.16 → llm_bridge-2.2.0}/llm_bridge/logic/message_process/code_file_extensions.py
RENAMED
|
File without changes
|
{llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/message_process/document_processor.py
RENAMED
|
File without changes
|
{llm_bridge-2.1.16 → llm_bridge-2.2.0}/llm_bridge/logic/message_process/file_type_checker.py
RENAMED
|
File without changes
|
{llm_bridge-2.1.16 → llm_bridge-2.2.0}/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.16 → llm_bridge-2.2.0}/llm_bridge/type/model_message/openai_completion_message.py
RENAMED
|
File without changes
|
{llm_bridge-2.1.16 → llm_bridge-2.2.0}/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.16 → llm_bridge-2.2.0}/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.16 → llm_bridge-2.2.0}/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
|