LLM-Bridge 2.0.2__tar.gz → 2.0.3__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 (94) hide show
  1. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/PKG-INFO +2 -2
  2. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/claude/non_stream_claude_client.py +1 -1
  3. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/claude/stream_claude_client.py +1 -1
  4. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/model_client/claude_client.py +6 -6
  5. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/model_client_factory/claude_client_factory.py +18 -14
  6. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/pyproject.toml +2 -2
  7. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/uv.lock +5 -5
  8. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/.gitattributes +0 -0
  9. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/.github/workflows/pypi-publish.yaml +0 -0
  10. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/.github/workflows/python-test.yaml +0 -0
  11. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/.gitignore +0 -0
  12. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/.run/batch.run.xml +0 -0
  13. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/.run/pytest.run.xml +0 -0
  14. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/.run/single.run.xml +0 -0
  15. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/LICENSE +0 -0
  16. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/MANIFEST.in +0 -0
  17. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/README.md +0 -0
  18. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/__init__.py +0 -0
  19. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/__init__.py +0 -0
  20. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/chat_client.py +0 -0
  21. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/__init__.py +0 -0
  22. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/claude/__init__.py +0 -0
  23. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/claude/claude_response_handler.py +0 -0
  24. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/claude/claude_token_counter.py +0 -0
  25. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/gemini/__init__.py +0 -0
  26. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/gemini/gemini_response_handler.py +0 -0
  27. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/gemini/gemini_token_counter.py +0 -0
  28. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/gemini/non_stream_gemini_client.py +0 -0
  29. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/gemini/stream_gemini_client.py +0 -0
  30. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/openai_completion/__init__.py +0 -0
  31. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/openai_completion/non_stream_openai_completion_client.py +0 -0
  32. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/openai_completion/stream_openai_completion_client.py +0 -0
  33. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/openai_responses/__init__.py +0 -0
  34. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/openai_responses/non_stream_openai_responses_client.py +0 -0
  35. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/openai_responses/openai_responses_response_handler.py +0 -0
  36. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/openai_responses/stream_openai_responses_client.py +0 -0
  37. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/xai/__init__.py +0 -0
  38. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/xai/non_stream_xai_client.py +0 -0
  39. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/xai/stream_xai_client.py +0 -0
  40. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/implementations/xai/xai_response_handler.py +0 -0
  41. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/model_client/__init__.py +0 -0
  42. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/model_client/gemini_client.py +0 -0
  43. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/model_client/openai_completion_client.py +0 -0
  44. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/model_client/openai_responses_client.py +0 -0
  45. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/client/model_client/xai_client.py +0 -0
  46. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/__init__.py +0 -0
  47. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/__init__.py +0 -0
  48. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/chat_client_factory.py +0 -0
  49. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/chat_message_converter.py +0 -0
  50. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/media_processor.py +0 -0
  51. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/model_client_factory/__init__.py +0 -0
  52. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/model_client_factory/gemini_client_factory.py +0 -0
  53. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/model_client_factory/openai_completion_client_factory.py +0 -0
  54. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/model_client_factory/openai_responses_client_factory.py +0 -0
  55. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/model_client_factory/xai_client_factory.py +0 -0
  56. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/model_message_converter/__init__.py +0 -0
  57. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/model_message_converter/claude_message_converter.py +0 -0
  58. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/model_message_converter/gemini_message_converter.py +0 -0
  59. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/model_message_converter/openai_completion_message_converter.py +0 -0
  60. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/model_message_converter/openai_responses_message_converter.py +0 -0
  61. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/chat_generate/model_message_converter/xai_message_converter.py +0 -0
  62. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/file_fetch.py +0 -0
  63. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/message_process/__init__.py +0 -0
  64. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/message_process/code_file_extensions.py +0 -0
  65. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/message_process/document_processor.py +0 -0
  66. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/message_process/file_type_checker.py +0 -0
  67. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/message_process/message_processor.py +0 -0
  68. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/logic/model_prices.py +0 -0
  69. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/resources/__init__.py +0 -0
  70. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/resources/model_prices.json +0 -0
  71. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/type/__init__.py +0 -0
  72. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/type/chat_response.py +0 -0
  73. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/type/message.py +0 -0
  74. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/type/model_message/__init__.py +0 -0
  75. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/type/model_message/claude_message.py +0 -0
  76. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/type/model_message/gemini_message.py +0 -0
  77. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/type/model_message/openai_completion_message.py +0 -0
  78. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/type/model_message/openai_responses_message.py +0 -0
  79. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/type/model_message/xai_message.py +0 -0
  80. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/llm_bridge/type/serializer.py +0 -0
  81. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/tests/__init__.py +0 -0
  82. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/tests/file_type_checker_test.py +0 -0
  83. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/tests/model_prices_test.py +0 -0
  84. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/usage/.env.example +0 -0
  85. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/usage/__init__.py +0 -0
  86. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/usage/batch/__init__.py +0 -0
  87. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/usage/batch/batch.py +0 -0
  88. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/usage/batch/config.py +0 -0
  89. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/usage/keys.py +0 -0
  90. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/usage/messages.py +0 -0
  91. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/usage/single/__init__.py +0 -0
  92. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/usage/single/config.py +0 -0
  93. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/usage/single/single.py +0 -0
  94. {llm_bridge-2.0.2 → llm_bridge-2.0.3}/usage/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: LLM-Bridge
3
- Version: 2.0.2
3
+ Version: 2.0.3
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
@@ -9,7 +9,7 @@ Keywords: ai,llm
9
9
  Classifier: Framework :: FastAPI
10
10
  Classifier: Programming Language :: Python :: 3
11
11
  Requires-Python: >=3.12
12
- Requires-Dist: anthropic==0.75.0
12
+ Requires-Dist: anthropic==0.96.0
13
13
  Requires-Dist: docxlatex>=1.1.1
14
14
  Requires-Dist: fastapi
15
15
  Requires-Dist: google-genai==1.46.0
@@ -24,7 +24,7 @@ class NonStreamClaudeClient(ClaudeClient):
24
24
  betas=self.betas,
25
25
  tools=self.tools,
26
26
  thinking=self.thinking,
27
- extra_body=self.extra_body,
27
+ output_config=self.output_config,
28
28
  )
29
29
 
30
30
  return await process_claude_non_stream_response(
@@ -26,7 +26,7 @@ class StreamClaudeClient(ClaudeClient):
26
26
  betas=self.betas,
27
27
  tools=self.tools,
28
28
  thinking=self.thinking,
29
- extra_body=self.extra_body,
29
+ output_config=self.output_config,
30
30
  ) as stream:
31
31
  async for event in stream:
32
32
  yield await response_handler.process_claude_stream_response(
@@ -1,9 +1,9 @@
1
- from typing import Any, AsyncGenerator
1
+ from typing import AsyncGenerator
2
2
 
3
3
  import anthropic
4
4
  from anthropic import Omit
5
- from anthropic.types import ThinkingConfigEnabledParam, AnthropicBetaParam
6
- from anthropic.types.beta import BetaToolUnionParam
5
+ from anthropic.types import AnthropicBetaParam
6
+ from anthropic.types.beta import BetaToolUnionParam, BetaOutputConfigParam, BetaThinkingConfigParam
7
7
 
8
8
  from llm_bridge.client.chat_client import ChatClient
9
9
  from llm_bridge.type.chat_response import ChatResponse
@@ -21,8 +21,8 @@ class ClaudeClient(ChatClient):
21
21
  max_tokens: int,
22
22
  betas: list[AnthropicBetaParam],
23
23
  tools: list[BetaToolUnionParam],
24
- thinking: ThinkingConfigEnabledParam | Omit,
25
- extra_body: dict[str, Any] | None,
24
+ thinking: BetaThinkingConfigParam | Omit,
25
+ output_config: BetaOutputConfigParam | Omit,
26
26
  ):
27
27
  self.model = model
28
28
  self.messages = messages
@@ -33,7 +33,7 @@ class ClaudeClient(ChatClient):
33
33
  self.betas = betas
34
34
  self.tools = tools
35
35
  self.thinking = thinking
36
- self.extra_body = extra_body
36
+ self.output_config = output_config
37
37
 
38
38
  async def generate_non_stream_response(self) -> ChatResponse:
39
39
  raise NotImplementedError
@@ -2,9 +2,10 @@ from typing import Any
2
2
 
3
3
  import anthropic
4
4
  from anthropic import Omit, transform_schema
5
- from anthropic.types import ThinkingConfigEnabledParam, AnthropicBetaParam
5
+ from anthropic.types import AnthropicBetaParam
6
6
  from anthropic.types.beta import BetaWebSearchTool20250305Param, BetaToolUnionParam, BetaCodeExecutionTool20250825Param, \
7
- BetaJSONOutputFormatParam
7
+ BetaJSONOutputFormatParam, BetaOutputConfigParam, BetaThinkingConfigParam, BetaThinkingConfigEnabledParam, \
8
+ BetaThinkingConfigAdaptiveParam
8
9
 
9
10
  from llm_bridge.client.implementations.claude.claude_token_counter import count_claude_input_tokens
10
11
  from llm_bridge.client.implementations.claude.non_stream_claude_client import NonStreamClaudeClient
@@ -45,7 +46,7 @@ async def create_claude_client(
45
46
  )
46
47
 
47
48
  context_window = 200_000
48
- if model in ["claude-opus-4-6", "claude-sonnet-4-6", "claude-sonnet-4-5"]:
49
+ if model in ["claude-opus-4-7", "claude-opus-4-6", "claude-sonnet-4-6", "claude-sonnet-4-5"]:
49
50
  context_window = 1_000_000
50
51
  max_output = 64_000
51
52
  max_tokens = min(
@@ -53,12 +54,15 @@ async def create_claude_client(
53
54
  context_window - input_tokens,
54
55
  )
55
56
 
56
- thinking: ThinkingConfigEnabledParam | Omit = omit
57
+ thinking: BetaThinkingConfigParam | Omit = omit
57
58
  if thought:
58
- thinking = ThinkingConfigEnabledParam(
59
- type="enabled",
60
- budget_tokens=max(1024, max_tokens // 2), # Minimum budget tokens: 1024
61
- )
59
+ if model in ["claude-opus-4-7", "claude-opus-4-6", "claude-sonnet-4-6"]:
60
+ thinking = BetaThinkingConfigAdaptiveParam(type="adaptive", display="summarized")
61
+ else:
62
+ thinking = BetaThinkingConfigEnabledParam(
63
+ type="enabled",
64
+ budget_tokens=max(1024, max_tokens // 2), # Minimum budget tokens: 1024
65
+ )
62
66
  temperature = 1
63
67
 
64
68
  betas: list[AnthropicBetaParam] = [
@@ -85,14 +89,14 @@ async def create_claude_client(
85
89
  )
86
90
  )
87
91
 
88
- extra_body = None
92
+ output_config: BetaOutputConfigParam | Omit = omit
89
93
  if structured_output_schema:
90
- extra_body = {
91
- "output_format": BetaJSONOutputFormatParam(
94
+ output_config = BetaOutputConfigParam(
95
+ format=BetaJSONOutputFormatParam(
92
96
  type="json_schema",
93
97
  schema=transform_schema(structured_output_schema),
94
98
  )
95
- }
99
+ )
96
100
 
97
101
  if stream:
98
102
  return StreamClaudeClient(
@@ -105,7 +109,7 @@ async def create_claude_client(
105
109
  betas=betas,
106
110
  tools=tools,
107
111
  thinking=thinking,
108
- extra_body=extra_body,
112
+ output_config=output_config,
109
113
  )
110
114
  else:
111
115
  return NonStreamClaudeClient(
@@ -118,5 +122,5 @@ async def create_claude_client(
118
122
  betas=betas,
119
123
  tools=tools,
120
124
  thinking=thinking,
121
- extra_body=extra_body,
125
+ output_config=output_config,
122
126
  )
@@ -4,14 +4,14 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "LLM-Bridge"
7
- version = "2.0.2"
7
+ version = "2.0.3"
8
8
  dependencies = [
9
9
  "fastapi",
10
10
  "httpx",
11
11
  "tenacity",
12
12
  "openai==2.30.0",
13
13
  "google-genai==1.46.0", # google.genai
14
- "anthropic==0.75.0",
14
+ "anthropic==0.96.0",
15
15
  "xai-sdk==1.11.0",
16
16
  "docxlatex>=1.1.1",
17
17
  "openpyxl",
@@ -129,7 +129,7 @@ wheels = [
129
129
 
130
130
  [[package]]
131
131
  name = "anthropic"
132
- version = "0.75.0"
132
+ version = "0.96.0"
133
133
  source = { registry = "https://pypi.org/simple" }
134
134
  dependencies = [
135
135
  { name = "anyio" },
@@ -141,9 +141,9 @@ dependencies = [
141
141
  { name = "sniffio" },
142
142
  { name = "typing-extensions" },
143
143
  ]
144
- sdist = { url = "https://files.pythonhosted.org/packages/04/1f/08e95f4b7e2d35205ae5dcbb4ae97e7d477fc521c275c02609e2931ece2d/anthropic-0.75.0.tar.gz", hash = "sha256:e8607422f4ab616db2ea5baacc215dd5f028da99ce2f022e33c7c535b29f3dfb", size = 439565, upload-time = "2025-11-24T20:41:45.28Z" }
144
+ sdist = { url = "https://files.pythonhosted.org/packages/b9/7e/672f533dee813028d2c699bfd2a7f52c9118d7353680d9aa44b9e23f717f/anthropic-0.96.0.tar.gz", hash = "sha256:9de947b737f39452f68aa520f1c2239d44119c9b73b0fb6d4e6ca80f00279ee6", size = 658210, upload-time = "2026-04-16T14:28:02.846Z" }
145
145
  wheels = [
146
- { url = "https://files.pythonhosted.org/packages/60/1c/1cd02b7ae64302a6e06724bf80a96401d5313708651d277b1458504a1730/anthropic-0.75.0-py3-none-any.whl", hash = "sha256:ea8317271b6c15d80225a9f3c670152746e88805a7a61e14d4a374577164965b", size = 388164, upload-time = "2025-11-24T20:41:43.587Z" },
146
+ { url = "https://files.pythonhosted.org/packages/48/5a/72f33204064b6e87601a71a6baf8d855769f8a0c1eaae8d06a1094872371/anthropic-0.96.0-py3-none-any.whl", hash = "sha256:9a6e335a354602a521cd9e777e92bfd46ba6e115bf9bbfe6135311e8fb2015b2", size = 635930, upload-time = "2026-04-16T14:28:01.436Z" },
147
147
  ]
148
148
 
149
149
  [[package]]
@@ -748,7 +748,7 @@ wheels = [
748
748
 
749
749
  [[package]]
750
750
  name = "llm-bridge"
751
- version = "2.0.2"
751
+ version = "2.0.3"
752
752
  source = { editable = "." }
753
753
  dependencies = [
754
754
  { name = "anthropic" },
@@ -772,7 +772,7 @@ dev = [
772
772
 
773
773
  [package.metadata]
774
774
  requires-dist = [
775
- { name = "anthropic", specifier = "==0.75.0" },
775
+ { name = "anthropic", specifier = "==0.96.0" },
776
776
  { name = "docxlatex", specifier = ">=1.1.1" },
777
777
  { name = "fastapi" },
778
778
  { name = "google-genai", specifier = "==1.46.0" },
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