openrouter 0.0.16__py3-none-any.whl → 0.0.18__py3-none-any.whl

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 (85) hide show
  1. openrouter/_version.py +3 -3
  2. openrouter/analytics.py +2 -0
  3. openrouter/api_keys.py +24 -4
  4. openrouter/basesdk.py +6 -0
  5. openrouter/chat.py +212 -14
  6. openrouter/completions.py +2 -0
  7. openrouter/components/__init__.py +470 -106
  8. openrouter/components/_schema0.py +94 -0
  9. openrouter/components/_schema3.py +229 -0
  10. openrouter/components/chatgenerationparams.py +559 -16
  11. openrouter/components/chatgenerationtokenusage.py +3 -0
  12. openrouter/components/chatmessagecontentitem.py +2 -1
  13. openrouter/components/chatmessagecontentitemaudio.py +6 -25
  14. openrouter/components/chatmessagecontentitemcachecontrol.py +32 -0
  15. openrouter/components/chatmessagecontentitemtext.py +9 -2
  16. openrouter/components/chatmessagecontentitemvideo.py +50 -9
  17. openrouter/components/chatmessagetokenlogprob.py +4 -4
  18. openrouter/components/chatresponsechoice.py +6 -1
  19. openrouter/components/chatstreamingmessagechunk.py +12 -1
  20. openrouter/components/completionchoice.py +18 -5
  21. openrouter/components/completioncreateparams.py +10 -10
  22. openrouter/components/completionresponse.py +3 -0
  23. openrouter/components/datacollection.py +19 -0
  24. openrouter/components/message.py +10 -9
  25. openrouter/components/openairesponsesannotation.py +11 -4
  26. openrouter/components/openairesponsesreasoningeffort.py +2 -0
  27. openrouter/components/openresponseseasyinputmessage.py +93 -20
  28. openrouter/components/openresponsesinput.py +2 -2
  29. openrouter/components/openresponsesinputmessageitem.py +87 -14
  30. openrouter/components/openresponsesnonstreamingresponse.py +33 -19
  31. openrouter/components/openresponsesreasoning.py +2 -0
  32. openrouter/components/openresponsesrequest.py +246 -142
  33. openrouter/components/openresponsesstreamevent.py +110 -39
  34. openrouter/components/outputmessage.py +10 -4
  35. openrouter/components/parameter.py +1 -0
  36. openrouter/components/pdfparserengine.py +16 -0
  37. openrouter/components/pdfparseroptions.py +25 -0
  38. openrouter/components/percentilelatencycutoffs.py +71 -0
  39. openrouter/components/percentilestats.py +34 -0
  40. openrouter/components/percentilethroughputcutoffs.py +71 -0
  41. openrouter/components/preferredmaxlatency.py +21 -0
  42. openrouter/components/preferredminthroughput.py +22 -0
  43. openrouter/components/providername.py +11 -27
  44. openrouter/components/providerpreferences.py +355 -0
  45. openrouter/components/providersort.py +15 -0
  46. openrouter/components/providersortconfig.py +71 -0
  47. openrouter/components/providersortunion.py +23 -0
  48. openrouter/components/publicendpoint.py +61 -45
  49. openrouter/components/publicpricing.py +50 -45
  50. openrouter/components/responseformattextconfig.py +9 -7
  51. openrouter/components/responseinputvideo.py +26 -0
  52. openrouter/components/responseoutputtext.py +36 -1
  53. openrouter/components/responsesoutputitem.py +13 -11
  54. openrouter/components/responsesoutputitemreasoning.py +43 -3
  55. openrouter/components/responsesoutputmessage.py +10 -5
  56. openrouter/components/responsesoutputmodality.py +14 -0
  57. openrouter/components/websearchengine.py +15 -0
  58. openrouter/credits.py +4 -0
  59. openrouter/embeddings.py +34 -24
  60. openrouter/endpoints.py +4 -0
  61. openrouter/generations.py +2 -0
  62. openrouter/models/__init__.py +3 -0
  63. openrouter/models/internal/__init__.py +54 -0
  64. openrouter/models/internal/globals.py +41 -0
  65. openrouter/models_.py +6 -0
  66. openrouter/oauth.py +4 -0
  67. openrouter/operations/__init__.py +46 -49
  68. openrouter/operations/createembeddings.py +68 -264
  69. openrouter/operations/getcredits.py +19 -0
  70. openrouter/operations/getgeneration.py +6 -0
  71. openrouter/operations/getparameters.py +5 -77
  72. openrouter/operations/updatekeys.py +2 -2
  73. openrouter/parameters.py +4 -2
  74. openrouter/providers.py +2 -0
  75. openrouter/responses.py +188 -36
  76. openrouter/sdk.py +13 -0
  77. openrouter/sdkconfiguration.py +2 -0
  78. openrouter/utils/forms.py +21 -10
  79. openrouter/utils/queryparams.py +14 -2
  80. openrouter/utils/retries.py +69 -5
  81. {openrouter-0.0.16.dist-info → openrouter-0.0.18.dist-info}/METADATA +2 -1
  82. {openrouter-0.0.16.dist-info → openrouter-0.0.18.dist-info}/RECORD +85 -64
  83. {openrouter-0.0.16.dist-info → openrouter-0.0.18.dist-info}/WHEEL +0 -0
  84. {openrouter-0.0.16.dist-info → openrouter-0.0.18.dist-info}/licenses/LICENSE +0 -0
  85. {openrouter-0.0.16.dist-info → openrouter-0.0.18.dist-info}/top_level.txt +0 -0
@@ -60,9 +60,9 @@ OpenResponsesInput1TypedDict = TypeAliasType(
60
60
  OpenResponsesFunctionCallOutputTypedDict,
61
61
  ResponsesOutputMessageTypedDict,
62
62
  OpenResponsesFunctionToolCallTypedDict,
63
- ResponsesOutputItemReasoningTypedDict,
64
63
  ResponsesOutputItemFunctionCallTypedDict,
65
64
  OpenResponsesReasoningTypedDict,
65
+ ResponsesOutputItemReasoningTypedDict,
66
66
  ],
67
67
  )
68
68
 
@@ -78,9 +78,9 @@ OpenResponsesInput1 = TypeAliasType(
78
78
  OpenResponsesFunctionCallOutput,
79
79
  ResponsesOutputMessage,
80
80
  OpenResponsesFunctionToolCall,
81
- ResponsesOutputItemReasoning,
82
81
  ResponsesOutputItemFunctionCall,
83
82
  OpenResponsesReasoning,
83
+ ResponsesOutputItemReasoning,
84
84
  ],
85
85
  )
86
86
 
@@ -3,16 +3,24 @@
3
3
  from __future__ import annotations
4
4
  from .responseinputaudio import ResponseInputAudio, ResponseInputAudioTypedDict
5
5
  from .responseinputfile import ResponseInputFile, ResponseInputFileTypedDict
6
- from .responseinputimage import ResponseInputImage, ResponseInputImageTypedDict
7
6
  from .responseinputtext import ResponseInputText, ResponseInputTextTypedDict
8
- from openrouter.types import BaseModel
9
- from openrouter.utils import get_discriminator
10
- from pydantic import Discriminator, Tag
7
+ from .responseinputvideo import ResponseInputVideo, ResponseInputVideoTypedDict
8
+ from openrouter.types import (
9
+ BaseModel,
10
+ Nullable,
11
+ OptionalNullable,
12
+ UNSET,
13
+ UNSET_SENTINEL,
14
+ UnrecognizedStr,
15
+ )
16
+ from openrouter.utils import get_discriminator, validate_open_enum
17
+ from pydantic import Discriminator, Tag, model_serializer
18
+ from pydantic.functional_validators import PlainValidator
11
19
  from typing import List, Literal, Optional, Union
12
20
  from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict
13
21
 
14
22
 
15
- OpenResponsesInputMessageItemType = Literal["message",]
23
+ OpenResponsesInputMessageItemTypeMessage = Literal["message",]
16
24
 
17
25
 
18
26
  OpenResponsesInputMessageItemRoleDeveloper = Literal["developer",]
@@ -44,23 +52,88 @@ OpenResponsesInputMessageItemRoleUnion = TypeAliasType(
44
52
  )
45
53
 
46
54
 
47
- OpenResponsesInputMessageItemContentTypedDict = TypeAliasType(
48
- "OpenResponsesInputMessageItemContentTypedDict",
55
+ OpenResponsesInputMessageItemContentType = Literal["input_image",]
56
+
57
+
58
+ OpenResponsesInputMessageItemDetail = Union[
59
+ Literal[
60
+ "auto",
61
+ "high",
62
+ "low",
63
+ ],
64
+ UnrecognizedStr,
65
+ ]
66
+
67
+
68
+ class OpenResponsesInputMessageItemContentInputImageTypedDict(TypedDict):
69
+ r"""Image input content item"""
70
+
71
+ type: OpenResponsesInputMessageItemContentType
72
+ detail: OpenResponsesInputMessageItemDetail
73
+ image_url: NotRequired[Nullable[str]]
74
+
75
+
76
+ class OpenResponsesInputMessageItemContentInputImage(BaseModel):
77
+ r"""Image input content item"""
78
+
79
+ type: OpenResponsesInputMessageItemContentType
80
+
81
+ detail: Annotated[
82
+ OpenResponsesInputMessageItemDetail, PlainValidator(validate_open_enum(False))
83
+ ]
84
+
85
+ image_url: OptionalNullable[str] = UNSET
86
+
87
+ @model_serializer(mode="wrap")
88
+ def serialize_model(self, handler):
89
+ optional_fields = ["image_url"]
90
+ nullable_fields = ["image_url"]
91
+ null_default_fields = []
92
+
93
+ serialized = handler(self)
94
+
95
+ m = {}
96
+
97
+ for n, f in type(self).model_fields.items():
98
+ k = f.alias or n
99
+ val = serialized.get(k)
100
+ serialized.pop(k, None)
101
+
102
+ optional_nullable = k in optional_fields and k in nullable_fields
103
+ is_set = (
104
+ self.__pydantic_fields_set__.intersection({n})
105
+ or k in null_default_fields
106
+ ) # pylint: disable=no-member
107
+
108
+ if val is not None and val != UNSET_SENTINEL:
109
+ m[k] = val
110
+ elif val != UNSET_SENTINEL and (
111
+ not k in optional_fields or (optional_nullable and is_set)
112
+ ):
113
+ m[k] = val
114
+
115
+ return m
116
+
117
+
118
+ OpenResponsesInputMessageItemContentUnionTypedDict = TypeAliasType(
119
+ "OpenResponsesInputMessageItemContentUnionTypedDict",
49
120
  Union[
50
121
  ResponseInputTextTypedDict,
51
122
  ResponseInputAudioTypedDict,
52
- ResponseInputImageTypedDict,
123
+ ResponseInputVideoTypedDict,
124
+ OpenResponsesInputMessageItemContentInputImageTypedDict,
53
125
  ResponseInputFileTypedDict,
54
126
  ],
55
127
  )
56
128
 
57
129
 
58
- OpenResponsesInputMessageItemContent = Annotated[
130
+ OpenResponsesInputMessageItemContentUnion = Annotated[
59
131
  Union[
60
132
  Annotated[ResponseInputText, Tag("input_text")],
61
- Annotated[ResponseInputImage, Tag("input_image")],
133
+ Annotated[OpenResponsesInputMessageItemContentInputImage, Tag("input_image")],
62
134
  Annotated[ResponseInputFile, Tag("input_file")],
63
135
  Annotated[ResponseInputAudio, Tag("input_audio")],
136
+ Annotated[ResponseInputVideo, Tag("input_video")],
64
137
  ],
65
138
  Discriminator(lambda m: get_discriminator(m, "type", "type")),
66
139
  ]
@@ -68,16 +141,16 @@ OpenResponsesInputMessageItemContent = Annotated[
68
141
 
69
142
  class OpenResponsesInputMessageItemTypedDict(TypedDict):
70
143
  role: OpenResponsesInputMessageItemRoleUnionTypedDict
71
- content: List[OpenResponsesInputMessageItemContentTypedDict]
144
+ content: List[OpenResponsesInputMessageItemContentUnionTypedDict]
72
145
  id: NotRequired[str]
73
- type: NotRequired[OpenResponsesInputMessageItemType]
146
+ type: NotRequired[OpenResponsesInputMessageItemTypeMessage]
74
147
 
75
148
 
76
149
  class OpenResponsesInputMessageItem(BaseModel):
77
150
  role: OpenResponsesInputMessageItemRoleUnion
78
151
 
79
- content: List[OpenResponsesInputMessageItemContent]
152
+ content: List[OpenResponsesInputMessageItemContentUnion]
80
153
 
81
154
  id: Optional[str] = None
82
155
 
83
- type: Optional[OpenResponsesInputMessageItemType] = None
156
+ type: Optional[OpenResponsesInputMessageItemTypeMessage] = None
@@ -48,8 +48,8 @@ from openrouter.types import (
48
48
  UNSET,
49
49
  UNSET_SENTINEL,
50
50
  )
51
- from openrouter.utils import validate_open_enum
52
- from pydantic import model_serializer
51
+ from openrouter.utils import get_discriminator, validate_open_enum
52
+ from pydantic import Discriminator, Tag, model_serializer
53
53
  from pydantic.functional_validators import PlainValidator
54
54
  from typing import Any, Dict, List, Literal, Optional, Union
55
55
  from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict
@@ -127,16 +127,19 @@ OpenResponsesNonStreamingResponseToolUnionTypedDict = TypeAliasType(
127
127
  )
128
128
 
129
129
 
130
- OpenResponsesNonStreamingResponseToolUnion = TypeAliasType(
131
- "OpenResponsesNonStreamingResponseToolUnion",
130
+ OpenResponsesNonStreamingResponseToolUnion = Annotated[
132
131
  Union[
133
- OpenResponsesWebSearchPreviewTool,
134
- OpenResponsesWebSearchPreview20250311Tool,
135
- OpenResponsesWebSearchTool,
136
- OpenResponsesWebSearch20250826Tool,
137
- OpenResponsesNonStreamingResponseToolFunction,
132
+ Annotated[OpenResponsesNonStreamingResponseToolFunction, Tag("function")],
133
+ Annotated[OpenResponsesWebSearchPreviewTool, Tag("web_search_preview")],
134
+ Annotated[
135
+ OpenResponsesWebSearchPreview20250311Tool,
136
+ Tag("web_search_preview_2025_03_11"),
137
+ ],
138
+ Annotated[OpenResponsesWebSearchTool, Tag("web_search")],
139
+ Annotated[OpenResponsesWebSearch20250826Tool, Tag("web_search_2025_08_26")],
138
140
  ],
139
- )
141
+ Discriminator(lambda m: get_discriminator(m, "type", "type")),
142
+ ]
140
143
 
141
144
 
142
145
  class OpenResponsesNonStreamingResponseTypedDict(TypedDict):
@@ -146,24 +149,27 @@ class OpenResponsesNonStreamingResponseTypedDict(TypedDict):
146
149
  object: Object
147
150
  created_at: float
148
151
  model: str
152
+ status: OpenAIResponsesResponseStatus
153
+ completed_at: Nullable[float]
149
154
  output: List[ResponsesOutputItemTypedDict]
150
155
  error: Nullable[ResponsesErrorFieldTypedDict]
151
156
  r"""Error information returned from the API"""
152
157
  incomplete_details: Nullable[OpenAIResponsesIncompleteDetailsTypedDict]
153
158
  temperature: Nullable[float]
154
159
  top_p: Nullable[float]
160
+ presence_penalty: Nullable[float]
161
+ frequency_penalty: Nullable[float]
155
162
  instructions: Nullable[OpenAIResponsesInputUnionTypedDict]
156
163
  metadata: Nullable[Dict[str, str]]
157
164
  r"""Metadata key-value pairs for the request. Keys must be ≤64 characters and cannot contain brackets. Values must be ≤512 characters. Maximum 16 pairs allowed."""
158
165
  tools: List[OpenResponsesNonStreamingResponseToolUnionTypedDict]
159
166
  tool_choice: OpenAIResponsesToolChoiceUnionTypedDict
160
167
  parallel_tool_calls: bool
161
- status: NotRequired[OpenAIResponsesResponseStatus]
162
168
  user: NotRequired[Nullable[str]]
163
169
  output_text: NotRequired[str]
164
170
  prompt_cache_key: NotRequired[Nullable[str]]
165
171
  safety_identifier: NotRequired[Nullable[str]]
166
- usage: NotRequired[OpenResponsesUsageTypedDict]
172
+ usage: NotRequired[Nullable[OpenResponsesUsageTypedDict]]
167
173
  r"""Token usage information for the response"""
168
174
  max_tool_calls: NotRequired[Nullable[float]]
169
175
  top_logprobs: NotRequired[float]
@@ -190,6 +196,12 @@ class OpenResponsesNonStreamingResponse(BaseModel):
190
196
 
191
197
  model: str
192
198
 
199
+ status: Annotated[
200
+ OpenAIResponsesResponseStatus, PlainValidator(validate_open_enum(False))
201
+ ]
202
+
203
+ completed_at: Nullable[float]
204
+
193
205
  output: List[ResponsesOutputItem]
194
206
 
195
207
  error: Nullable[ResponsesErrorField]
@@ -201,6 +213,10 @@ class OpenResponsesNonStreamingResponse(BaseModel):
201
213
 
202
214
  top_p: Nullable[float]
203
215
 
216
+ presence_penalty: Nullable[float]
217
+
218
+ frequency_penalty: Nullable[float]
219
+
204
220
  instructions: Nullable[OpenAIResponsesInputUnion]
205
221
 
206
222
  metadata: Nullable[Dict[str, str]]
@@ -212,11 +228,6 @@ class OpenResponsesNonStreamingResponse(BaseModel):
212
228
 
213
229
  parallel_tool_calls: bool
214
230
 
215
- status: Annotated[
216
- Optional[OpenAIResponsesResponseStatus],
217
- PlainValidator(validate_open_enum(False)),
218
- ] = None
219
-
220
231
  user: OptionalNullable[str] = UNSET
221
232
 
222
233
  output_text: Optional[str] = None
@@ -225,7 +236,7 @@ class OpenResponsesNonStreamingResponse(BaseModel):
225
236
 
226
237
  safety_identifier: OptionalNullable[str] = UNSET
227
238
 
228
- usage: Optional[OpenResponsesUsage] = None
239
+ usage: OptionalNullable[OpenResponsesUsage] = UNSET
229
240
  r"""Token usage information for the response"""
230
241
 
231
242
  max_tool_calls: OptionalNullable[float] = UNSET
@@ -260,7 +271,6 @@ class OpenResponsesNonStreamingResponse(BaseModel):
260
271
  @model_serializer(mode="wrap")
261
272
  def serialize_model(self, handler):
262
273
  optional_fields = [
263
- "status",
264
274
  "user",
265
275
  "output_text",
266
276
  "prompt_cache_key",
@@ -279,15 +289,19 @@ class OpenResponsesNonStreamingResponse(BaseModel):
279
289
  "text",
280
290
  ]
281
291
  nullable_fields = [
292
+ "completed_at",
282
293
  "user",
283
294
  "prompt_cache_key",
284
295
  "safety_identifier",
285
296
  "error",
286
297
  "incomplete_details",
298
+ "usage",
287
299
  "max_tool_calls",
288
300
  "max_output_tokens",
289
301
  "temperature",
290
302
  "top_p",
303
+ "presence_penalty",
304
+ "frequency_penalty",
291
305
  "instructions",
292
306
  "metadata",
293
307
  "prompt",
@@ -55,8 +55,10 @@ OpenResponsesReasoningFormat = Union[
55
55
  Literal[
56
56
  "unknown",
57
57
  "openai-responses-v1",
58
+ "azure-openai-responses-v1",
58
59
  "xai-responses-v1",
59
60
  "anthropic-claude-v1",
61
+ "google-gemini-v1",
60
62
  ],
61
63
  UnrecognizedStr,
62
64
  ]