lm-deluge 0.0.79__tar.gz → 0.0.80__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 (93) hide show
  1. {lm_deluge-0.0.79/src/lm_deluge.egg-info → lm_deluge-0.0.80}/PKG-INFO +1 -1
  2. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/pyproject.toml +1 -1
  3. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/anthropic.py +43 -16
  4. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/gemini.py +53 -40
  5. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/client.py +5 -5
  6. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/config.py +3 -1
  7. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/anthropic.py +15 -0
  8. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/warnings.py +2 -0
  9. {lm_deluge-0.0.79 → lm_deluge-0.0.80/src/lm_deluge.egg-info}/PKG-INFO +1 -1
  10. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/LICENSE +0 -0
  11. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/README.md +0 -0
  12. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/setup.cfg +0 -0
  13. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/__init__.py +0 -0
  14. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/__init__.py +0 -0
  15. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/base.py +0 -0
  16. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/bedrock.py +0 -0
  17. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/chat_reasoning.py +0 -0
  18. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/common.py +0 -0
  19. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/deprecated/bedrock.py +0 -0
  20. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/deprecated/cohere.py +0 -0
  21. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/deprecated/deepseek.py +0 -0
  22. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/deprecated/mistral.py +0 -0
  23. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/deprecated/vertex.py +0 -0
  24. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/mistral.py +0 -0
  25. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/openai.py +0 -0
  26. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/api_requests/response.py +0 -0
  27. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/batches.py +0 -0
  28. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/built_in_tools/anthropic/__init__.py +0 -0
  29. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/built_in_tools/anthropic/bash.py +0 -0
  30. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/built_in_tools/anthropic/computer_use.py +0 -0
  31. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/built_in_tools/anthropic/editor.py +0 -0
  32. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/built_in_tools/base.py +0 -0
  33. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/built_in_tools/openai.py +0 -0
  34. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/cache.py +0 -0
  35. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/cli.py +0 -0
  36. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/embed.py +0 -0
  37. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/errors.py +0 -0
  38. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/file.py +0 -0
  39. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/image.py +0 -0
  40. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/llm_tools/__init__.py +0 -0
  41. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/llm_tools/classify.py +0 -0
  42. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/llm_tools/extract.py +0 -0
  43. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/llm_tools/filesystem.py +0 -0
  44. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/llm_tools/locate.py +0 -0
  45. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/llm_tools/ocr.py +0 -0
  46. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/llm_tools/sandbox.py +0 -0
  47. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/llm_tools/score.py +0 -0
  48. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/llm_tools/subagents.py +0 -0
  49. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/llm_tools/todos.py +0 -0
  50. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/llm_tools/translate.py +0 -0
  51. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/mock_openai.py +0 -0
  52. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/__init__.py +0 -0
  53. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/bedrock.py +0 -0
  54. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/cerebras.py +0 -0
  55. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/cohere.py +0 -0
  56. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/deepseek.py +0 -0
  57. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/fireworks.py +0 -0
  58. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/google.py +0 -0
  59. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/grok.py +0 -0
  60. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/groq.py +0 -0
  61. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/kimi.py +0 -0
  62. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/meta.py +0 -0
  63. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/minimax.py +0 -0
  64. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/mistral.py +0 -0
  65. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/openai.py +0 -0
  66. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/openrouter.py +0 -0
  67. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/models/together.py +0 -0
  68. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/presets/cerebras.py +0 -0
  69. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/presets/meta.py +0 -0
  70. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/prompt.py +0 -0
  71. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/request_context.py +0 -0
  72. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/rerank.py +0 -0
  73. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/tool.py +0 -0
  74. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/tracker.py +0 -0
  75. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/usage.py +0 -0
  76. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/util/harmony.py +0 -0
  77. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/util/json.py +0 -0
  78. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/util/logprobs.py +0 -0
  79. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/util/schema.py +0 -0
  80. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/util/spatial.py +0 -0
  81. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/util/validation.py +0 -0
  82. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge/util/xml.py +0 -0
  83. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge.egg-info/SOURCES.txt +0 -0
  84. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge.egg-info/dependency_links.txt +0 -0
  85. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge.egg-info/requires.txt +0 -0
  86. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/src/lm_deluge.egg-info/top_level.txt +0 -0
  87. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/tests/test_builtin_tools.py +0 -0
  88. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/tests/test_file_upload.py +0 -0
  89. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/tests/test_filesystem.py +0 -0
  90. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/tests/test_filesystem_live.py +0 -0
  91. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/tests/test_mock_openai.py +0 -0
  92. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/tests/test_native_mcp_server.py +0 -0
  93. {lm_deluge-0.0.79 → lm_deluge-0.0.80}/tests/test_openrouter_generic.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lm_deluge
3
- Version: 0.0.79
3
+ Version: 0.0.80
4
4
  Summary: Python utility for using LLM API models.
5
5
  Author-email: Benjamin Anderson <ben@trytaylor.ai>
6
6
  Requires-Python: >=3.10
@@ -3,7 +3,7 @@ requires = ["setuptools", "wheel"]
3
3
 
4
4
  [project]
5
5
  name = "lm_deluge"
6
- version = "0.0.79"
6
+ version = "0.0.80"
7
7
  authors = [{ name = "Benjamin Anderson", email = "ben@trytaylor.ai" }]
8
8
  description = "Python utility for using LLM API models."
9
9
  readme = "README.md"
@@ -16,6 +16,7 @@ from lm_deluge.util.schema import (
16
16
  prepare_output_schema,
17
17
  transform_schema_for_anthropic,
18
18
  )
19
+ from lm_deluge.warnings import maybe_warn
19
20
 
20
21
  from ..models import APIModel
21
22
  from .base import APIRequestBase, APIResponse
@@ -62,20 +63,45 @@ def _build_anthropic_request(
62
63
  "max_tokens": sampling_params.max_new_tokens,
63
64
  }
64
65
 
66
+ if model.id == "claude-4.5-opus" and sampling_params.global_effort:
67
+ request_json["effort"] = sampling_params.global_effort
68
+ _add_beta(base_headers, "effort-2025-11-24")
69
+
65
70
  # handle thinking
66
- if model.reasoning_model and sampling_params.reasoning_effort:
67
- # translate reasoning effort of low, medium, high to budget tokens
68
- budget = {"minimal": 256, "low": 1024, "medium": 4096, "high": 16384}.get(
69
- sampling_params.reasoning_effort
70
- )
71
- request_json["thinking"] = {
72
- "type": "enabled",
73
- "budget_tokens": budget,
74
- }
75
- if "top_p" in request_json:
76
- request_json["top_p"] = max(request_json["top_p"], 0.95)
77
- request_json["temperature"] = 1.0
78
- request_json["max_tokens"] += budget
71
+ if model.reasoning_model:
72
+ if (
73
+ sampling_params.thinking_budget is not None
74
+ and sampling_params.reasoning_effort is not None
75
+ ):
76
+ maybe_warn("WARN_THINKING_BUDGET_AND_REASONING_EFFORT")
77
+
78
+ if sampling_params.thinking_budget is not None:
79
+ budget = sampling_params.thinking_budget
80
+ elif sampling_params.reasoning_effort is not None:
81
+ # translate reasoning effort of low, medium, high to budget tokens
82
+ budget = {
83
+ "none": 0,
84
+ "minimal": 256,
85
+ "low": 1024,
86
+ "medium": 4096,
87
+ "high": 16384,
88
+ }.get(sampling_params.reasoning_effort)
89
+ assert isinstance(budget, int)
90
+ else:
91
+ budget = 0
92
+
93
+ if budget > 0:
94
+ request_json["thinking"] = {
95
+ "type": "enabled",
96
+ "budget_tokens": budget,
97
+ }
98
+ if "top_p" in request_json:
99
+ request_json["top_p"] = max(request_json["top_p"], 0.95)
100
+ request_json["temperature"] = 1.0
101
+ request_json["max_tokens"] += budget
102
+ else:
103
+ request_json["thinking"] = {"type": "disabled"}
104
+
79
105
  else:
80
106
  request_json["thinking"] = {"type": "disabled"}
81
107
  if sampling_params.reasoning_effort:
@@ -83,10 +109,11 @@ def _build_anthropic_request(
83
109
  if system_message is not None:
84
110
  request_json["system"] = system_message
85
111
 
86
- # handle temp + top_p for opus 4.1/sonnet 4.5
112
+ # handle temp + top_p for opus 4.1/sonnet 4.5.
113
+ # TODO: make clearer / more user-friendly so there can be NotGiven
114
+ # and user can control which one they want to use
87
115
  if "4-1" in model.name or "4-5" in model.name:
88
- if "temperature" in request_json and "top_p" in request_json:
89
- request_json.pop("top_p")
116
+ request_json.pop("top_p")
90
117
 
91
118
  # Handle structured outputs (output_format)
92
119
  if context.output_schema:
@@ -1,6 +1,5 @@
1
1
  import json
2
2
  import os
3
- from typing import Any
4
3
 
5
4
  from aiohttp import ClientResponse
6
5
 
@@ -52,47 +51,61 @@ async def _build_gemini_request(
52
51
  request_json["systemInstruction"] = {"parts": [{"text": system_message}]}
53
52
 
54
53
  # Handle reasoning models (thinking)
55
- if model.reasoning_model:
56
- thinking_config: dict[str, Any] | None = None
57
- effort = sampling_params.reasoning_effort
58
- is_gemini_3 = "gemini-3" in model.name.lower()
54
+ is_gemini_3 = "gemini-3" in model.name.lower()
55
+ if is_gemini_3:
56
+ # gemini3 MUST think
57
+ if not sampling_params.reasoning_effort:
58
+ maybe_warn("WARN_GEMINI3_NO_REASONING")
59
+ effort = "low"
60
+ else:
61
+ level_map = {
62
+ "none": "low",
63
+ "minimal": "low",
64
+ "low": "low",
65
+ "medium": "high", # change when supported
66
+ "high": "high",
67
+ }
68
+ effort = level_map[sampling_params.reasoning_effort]
69
+ thinking_config = {"thinkingLevel": effort}
70
+ request_json["generationConfig"]["thinkingConfig"] = thinking_config
59
71
 
60
- if is_gemini_3:
61
- # Gemini 3 uses thinkingLevel instead of thinkingBudget
62
- if effort in {"none", "minimal"}:
63
- thinking_config = {"thinkingLevel": "low"}
64
- elif effort is None:
65
- # Default to high when reasoning is enabled but no preference was provided
66
- thinking_config = {"thinkingLevel": "high"}
67
- else:
68
- # Map reasoning_effort to thinkingLevel
69
- level_map = {
70
- "minimal": "low",
71
- "low": "low",
72
- "medium": "medium", # Will work when supported
73
- "high": "high",
74
- }
75
- thinking_level = level_map.get(effort, "high")
76
- thinking_config = {"thinkingLevel": thinking_level}
72
+ elif model.reasoning_model:
73
+ if (
74
+ sampling_params.thinking_budget is not None
75
+ and sampling_params.reasoning_effort is not None
76
+ ):
77
+ maybe_warn("WARN_THINKING_BUDGET_AND_REASONING_EFFORT")
78
+
79
+ if (
80
+ sampling_params.thinking_budget is not None
81
+ and sampling_params.thinking_budget > 0
82
+ ):
83
+ thinking_config = {
84
+ "includeThoughts": True,
85
+ "thinkingBudget": sampling_params.thinking_budget,
86
+ }
87
+ elif sampling_params.thinking_budget == -1:
88
+ # dynamic thinking
89
+ thinking_config = {"includeThoughts": True, "thinkingBudget": -1}
90
+ elif sampling_params.reasoning_effort not in [None, "none"]:
91
+ level_map = {
92
+ "minimal": 256,
93
+ "low": 1024,
94
+ "medium": 4096,
95
+ "high": 16384,
96
+ }
97
+ assert sampling_params.reasoning_effort in level_map
98
+ budget = level_map[sampling_params.reasoning_effort]
99
+ if "flash-lite" in model.id:
100
+ budget = max(budget, 512)
101
+ thinking_config = {"includeThoughts": True, "thinkingBudget": budget}
102
+ elif "2.5-pro" in model.id:
103
+ # 2.5 pro must think.
104
+ thinking_config = {"includeThoughts": True, "thinkingBudget": 128}
77
105
  else:
78
- # Gemini 2.5 uses thinkingBudget (legacy)
79
- if effort is None or effort == "none":
80
- budget = 128 if "2.5-pro" in model.id else 0
81
- # Explicitly disable thoughts when no effort is requested
82
- thinking_config = {"includeThoughts": False, "thinkingBudget": budget}
83
- else:
84
- thinking_config = {"includeThoughts": True}
85
- if (
86
- effort in {"minimal", "low", "medium", "high"}
87
- and "flash" in model.id
88
- ):
89
- budget = {
90
- "minimal": 256,
91
- "low": 1024,
92
- "medium": 4096,
93
- "high": 16384,
94
- }[effort]
95
- thinking_config["thinkingBudget"] = budget
106
+ # no thoughts head empty
107
+ thinking_config = {"includeThoughts": False, "thinkingBudget": 0}
108
+
96
109
  request_json["generationConfig"]["thinkingConfig"] = thinking_config
97
110
 
98
111
  else:
@@ -79,7 +79,7 @@ class _LLMClient(BaseModel):
79
79
  background: bool = False
80
80
  # sampling params - if provided, and sampling_params is not,
81
81
  # these override the defaults
82
- temperature: float = 0.75
82
+ temperature: float = 1.0
83
83
  top_p: float = 1.0
84
84
  json_mode: bool = False
85
85
  max_new_tokens: int = 512
@@ -337,7 +337,7 @@ class _LLMClient(BaseModel):
337
337
  if "sampling_params" not in data or len(data.get("sampling_params", [])) == 0:
338
338
  data["sampling_params"] = [
339
339
  SamplingParams(
340
- temperature=data.get("temperature", 0.75),
340
+ temperature=data.get("temperature", 1.0),
341
341
  top_p=data.get("top_p", 1.0),
342
342
  json_mode=data.get("json_mode", False),
343
343
  max_new_tokens=data.get("max_new_tokens", 512),
@@ -1067,7 +1067,7 @@ def LLMClient(
1067
1067
  extra_headers: dict[str, str] | None = None,
1068
1068
  use_responses_api: bool = False,
1069
1069
  background: bool = False,
1070
- temperature: float = 0.75,
1070
+ temperature: float = 1.0,
1071
1071
  top_p: float = 1.0,
1072
1072
  json_mode: bool = False,
1073
1073
  max_new_tokens: int = 512,
@@ -1096,7 +1096,7 @@ def LLMClient(
1096
1096
  extra_headers: dict[str, str] | None = None,
1097
1097
  use_responses_api: bool = False,
1098
1098
  background: bool = False,
1099
- temperature: float = 0.75,
1099
+ temperature: float = 1.0,
1100
1100
  top_p: float = 1.0,
1101
1101
  json_mode: bool = False,
1102
1102
  max_new_tokens: int = 512,
@@ -1124,7 +1124,7 @@ def LLMClient(
1124
1124
  extra_headers: dict[str, str] | None = None,
1125
1125
  use_responses_api: bool = False,
1126
1126
  background: bool = False,
1127
- temperature: float = 0.75,
1127
+ temperature: float = 1.0,
1128
1128
  top_p: float = 1.0,
1129
1129
  json_mode: bool = False,
1130
1130
  max_new_tokens: int = 512,
@@ -4,11 +4,13 @@ from pydantic import BaseModel
4
4
 
5
5
 
6
6
  class SamplingParams(BaseModel):
7
- temperature: float = 0.0
7
+ temperature: float = 1.0 # more typical for new models
8
8
  top_p: float = 1.0
9
9
  json_mode: bool = False
10
10
  max_new_tokens: int = 2_048
11
+ global_effort: Literal["low", "medium", "high"] = "high" # for opus-4.5
11
12
  reasoning_effort: Literal["low", "medium", "high", "minimal", "none", None] = None
13
+ thinking_budget: int | None = None
12
14
  logprobs: bool = False
13
15
  top_logprobs: int | None = None
14
16
  strict_tools: bool = True
@@ -10,6 +10,19 @@ ANTHROPIC_MODELS = {
10
10
  # ░███
11
11
  # █████
12
12
  #
13
+ "claude-4.5-opus": {
14
+ "id": "claude-4.5-opus",
15
+ "name": "claude-opus-4-5-20251101",
16
+ "api_base": "https://api.anthropic.com/v1",
17
+ "api_key_env_var": "ANTHROPIC_API_KEY",
18
+ "supports_json": False,
19
+ "api_spec": "anthropic",
20
+ "input_cost": 5.0,
21
+ "cached_input_cost": 0.50,
22
+ "cache_write_cost": 6.25,
23
+ "output_cost": 25.0,
24
+ "reasoning_model": True,
25
+ },
13
26
  "claude-4.5-haiku": {
14
27
  "id": "claude-4.5-haiku",
15
28
  "name": "claude-haiku-4-5-20251001",
@@ -21,6 +34,7 @@ ANTHROPIC_MODELS = {
21
34
  "cached_input_cost": 0.10,
22
35
  "cache_write_cost": 1.25,
23
36
  "output_cost": 3.0,
37
+ "reasoning_model": True,
24
38
  },
25
39
  "claude-4.5-sonnet": {
26
40
  "id": "claude-4.5-sonnet",
@@ -33,6 +47,7 @@ ANTHROPIC_MODELS = {
33
47
  "cached_input_cost": 0.30,
34
48
  "cache_write_cost": 3.75,
35
49
  "output_cost": 15.0,
50
+ "reasoning_model": True,
36
51
  },
37
52
  "claude-4.1-opus": {
38
53
  "id": "claude-4.1-opus",
@@ -11,6 +11,8 @@ WARNINGS: dict[str, str] = {
11
11
  "WARN_MINIMAL_TO_NONE": "GPT-5.1 models don't support 'minimal' reasoning effort. Converting to 'none' for {model_name}.",
12
12
  "WARN_MEDIA_RESOLUTION_UNSUPPORTED": "media_resolution parameter is only supported for Gemini 3 models, ignoring for {model_name}.",
13
13
  "WARN_GEMINI3_MISSING_SIGNATURE": "Gemini 3 thought signature missing in {part_type}, injecting dummy signature 'context_engineering_is_the_way_to_go' to avoid API error.",
14
+ "WARN_GEMINI3_NO_REASONING": "Gemini 3 requires reasoning (thinkingConfig). Setting thinkingConfig to low.",
15
+ "WARN_THINKING_BUDGET_AND_REASONING_EFFORT": "`reasoning_effort` and `thinking_budget` both provided. `thinking_budget` will take priority.",
14
16
  }
15
17
 
16
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lm_deluge
3
- Version: 0.0.79
3
+ Version: 0.0.80
4
4
  Summary: Python utility for using LLM API models.
5
5
  Author-email: Benjamin Anderson <ben@trytaylor.ai>
6
6
  Requires-Python: >=3.10
File without changes
File without changes
File without changes