openrouter 0.0.22__py3-none-any.whl → 0.1.2__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 (48) hide show
  1. openrouter/_version.py +2 -2
  2. openrouter/chat.py +70 -12
  3. openrouter/components/__init__.py +328 -81
  4. openrouter/components/_schema0.py +3 -2
  5. openrouter/components/_schema3.py +229 -0
  6. openrouter/components/chatgenerationparams.py +211 -53
  7. openrouter/components/chatgenerationtokenusage.py +3 -0
  8. openrouter/components/chatmessagetokenlogprob.py +4 -4
  9. openrouter/components/chatresponsechoice.py +6 -1
  10. openrouter/components/chatstreamingmessagechunk.py +12 -1
  11. openrouter/components/openresponseseasyinputmessage.py +93 -20
  12. openrouter/components/openresponsesinput.py +2 -2
  13. openrouter/components/openresponsesinputmessageitem.py +87 -14
  14. openrouter/components/openresponsesnonstreamingresponse.py +20 -9
  15. openrouter/components/openresponsesreasoning.py +1 -0
  16. openrouter/components/openresponsesrequest.py +141 -88
  17. openrouter/components/parameter.py +1 -0
  18. openrouter/components/pdfparserengine.py +16 -0
  19. openrouter/components/pdfparseroptions.py +25 -0
  20. openrouter/components/percentilelatencycutoffs.py +71 -0
  21. openrouter/components/percentilestats.py +34 -0
  22. openrouter/components/percentilethroughputcutoffs.py +71 -0
  23. openrouter/components/preferredmaxlatency.py +21 -0
  24. openrouter/components/preferredminthroughput.py +22 -0
  25. openrouter/components/providername.py +3 -2
  26. openrouter/components/providerpreferences.py +355 -0
  27. openrouter/components/providersort.py +0 -1
  28. openrouter/components/providersortconfig.py +71 -0
  29. openrouter/components/providersortunion.py +23 -0
  30. openrouter/components/publicendpoint.py +11 -0
  31. openrouter/components/responseinputvideo.py +26 -0
  32. openrouter/components/responseoutputtext.py +36 -1
  33. openrouter/components/responsesoutputitem.py +1 -1
  34. openrouter/components/responsesoutputitemreasoning.py +43 -3
  35. openrouter/components/responsesoutputmodality.py +14 -0
  36. openrouter/components/websearchengine.py +15 -0
  37. openrouter/embeddings.py +6 -8
  38. openrouter/operations/__init__.py +0 -33
  39. openrouter/operations/createembeddings.py +7 -258
  40. openrouter/operations/getgeneration.py +6 -0
  41. openrouter/operations/getparameters.py +5 -78
  42. openrouter/parameters.py +2 -2
  43. openrouter/responses.py +114 -14
  44. {openrouter-0.0.22.dist-info → openrouter-0.1.2.dist-info}/METADATA +1 -1
  45. {openrouter-0.0.22.dist-info → openrouter-0.1.2.dist-info}/RECORD +48 -34
  46. {openrouter-0.0.22.dist-info → openrouter-0.1.2.dist-info}/WHEEL +1 -1
  47. {openrouter-0.0.22.dist-info → openrouter-0.1.2.dist-info}/licenses/LICENSE +0 -0
  48. {openrouter-0.0.22.dist-info → openrouter-0.1.2.dist-info}/top_level.txt +0 -0
@@ -72,6 +72,7 @@ class CompletionTokensDetails(BaseModel):
72
72
 
73
73
  class PromptTokensDetailsTypedDict(TypedDict):
74
74
  cached_tokens: NotRequired[float]
75
+ cache_write_tokens: NotRequired[float]
75
76
  audio_tokens: NotRequired[float]
76
77
  video_tokens: NotRequired[float]
77
78
 
@@ -79,6 +80,8 @@ class PromptTokensDetailsTypedDict(TypedDict):
79
80
  class PromptTokensDetails(BaseModel):
80
81
  cached_tokens: Optional[float] = None
81
82
 
83
+ cache_write_tokens: Optional[float] = None
84
+
82
85
  audio_tokens: Optional[float] = None
83
86
 
84
87
  video_tokens: Optional[float] = None
@@ -8,13 +8,13 @@ from typing import List
8
8
  from typing_extensions import Annotated, TypedDict
9
9
 
10
10
 
11
- class TopLogprobTypedDict(TypedDict):
11
+ class ChatMessageTokenLogprobTopLogprobTypedDict(TypedDict):
12
12
  token: str
13
13
  logprob: float
14
14
  bytes_: Nullable[List[float]]
15
15
 
16
16
 
17
- class TopLogprob(BaseModel):
17
+ class ChatMessageTokenLogprobTopLogprob(BaseModel):
18
18
  token: str
19
19
 
20
20
  logprob: float
@@ -56,7 +56,7 @@ class ChatMessageTokenLogprobTypedDict(TypedDict):
56
56
  token: str
57
57
  logprob: float
58
58
  bytes_: Nullable[List[float]]
59
- top_logprobs: List[TopLogprobTypedDict]
59
+ top_logprobs: List[ChatMessageTokenLogprobTopLogprobTypedDict]
60
60
 
61
61
 
62
62
  class ChatMessageTokenLogprob(BaseModel):
@@ -66,7 +66,7 @@ class ChatMessageTokenLogprob(BaseModel):
66
66
 
67
67
  bytes_: Annotated[Nullable[List[float]], pydantic.Field(alias="bytes")]
68
68
 
69
- top_logprobs: List[TopLogprob]
69
+ top_logprobs: List[ChatMessageTokenLogprobTopLogprob]
70
70
 
71
71
  @model_serializer(mode="wrap")
72
72
  def serialize_model(self, handler):
@@ -1,6 +1,7 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
+ from ._schema3 import Schema3, Schema3TypedDict
4
5
  from .assistantmessage import AssistantMessage, AssistantMessageTypedDict
5
6
  from .chatcompletionfinishreason import ChatCompletionFinishReason
6
7
  from .chatmessagetokenlogprobs import (
@@ -17,6 +18,7 @@ from openrouter.types import (
17
18
  from openrouter.utils import validate_open_enum
18
19
  from pydantic import model_serializer
19
20
  from pydantic.functional_validators import PlainValidator
21
+ from typing import List, Optional
20
22
  from typing_extensions import Annotated, NotRequired, TypedDict
21
23
 
22
24
 
@@ -24,6 +26,7 @@ class ChatResponseChoiceTypedDict(TypedDict):
24
26
  finish_reason: Nullable[ChatCompletionFinishReason]
25
27
  index: float
26
28
  message: AssistantMessageTypedDict
29
+ reasoning_details: NotRequired[List[Schema3TypedDict]]
27
30
  logprobs: NotRequired[Nullable[ChatMessageTokenLogprobsTypedDict]]
28
31
 
29
32
 
@@ -36,11 +39,13 @@ class ChatResponseChoice(BaseModel):
36
39
 
37
40
  message: AssistantMessage
38
41
 
42
+ reasoning_details: Optional[List[Schema3]] = None
43
+
39
44
  logprobs: OptionalNullable[ChatMessageTokenLogprobs] = UNSET
40
45
 
41
46
  @model_serializer(mode="wrap")
42
47
  def serialize_model(self, handler):
43
- optional_fields = ["logprobs"]
48
+ optional_fields = ["reasoning_details", "logprobs"]
44
49
  nullable_fields = ["finish_reason", "logprobs"]
45
50
  null_default_fields = []
46
51
 
@@ -1,6 +1,7 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
+ from ._schema3 import Schema3, Schema3TypedDict
4
5
  from .chatstreamingmessagetoolcall import (
5
6
  ChatStreamingMessageToolCall,
6
7
  ChatStreamingMessageToolCallTypedDict,
@@ -26,6 +27,7 @@ class ChatStreamingMessageChunkTypedDict(TypedDict):
26
27
  reasoning: NotRequired[Nullable[str]]
27
28
  refusal: NotRequired[Nullable[str]]
28
29
  tool_calls: NotRequired[List[ChatStreamingMessageToolCallTypedDict]]
30
+ reasoning_details: NotRequired[List[Schema3TypedDict]]
29
31
 
30
32
 
31
33
  class ChatStreamingMessageChunk(BaseModel):
@@ -39,9 +41,18 @@ class ChatStreamingMessageChunk(BaseModel):
39
41
 
40
42
  tool_calls: Optional[List[ChatStreamingMessageToolCall]] = None
41
43
 
44
+ reasoning_details: Optional[List[Schema3]] = None
45
+
42
46
  @model_serializer(mode="wrap")
43
47
  def serialize_model(self, handler):
44
- optional_fields = ["role", "content", "reasoning", "refusal", "tool_calls"]
48
+ optional_fields = [
49
+ "role",
50
+ "content",
51
+ "reasoning",
52
+ "refusal",
53
+ "tool_calls",
54
+ "reasoning_details",
55
+ ]
45
56
  nullable_fields = ["content", "reasoning", "refusal"]
46
57
  null_default_fields = []
47
58
 
@@ -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
- OpenResponsesEasyInputMessageType = Literal["message",]
23
+ OpenResponsesEasyInputMessageTypeMessage = Literal["message",]
16
24
 
17
25
 
18
26
  OpenResponsesEasyInputMessageRoleDeveloper = Literal["developer",]
@@ -49,49 +57,114 @@ OpenResponsesEasyInputMessageRoleUnion = TypeAliasType(
49
57
  )
50
58
 
51
59
 
52
- OpenResponsesEasyInputMessageContent1TypedDict = TypeAliasType(
53
- "OpenResponsesEasyInputMessageContent1TypedDict",
60
+ OpenResponsesEasyInputMessageContentType = Literal["input_image",]
61
+
62
+
63
+ OpenResponsesEasyInputMessageDetail = Union[
64
+ Literal[
65
+ "auto",
66
+ "high",
67
+ "low",
68
+ ],
69
+ UnrecognizedStr,
70
+ ]
71
+
72
+
73
+ class OpenResponsesEasyInputMessageContentInputImageTypedDict(TypedDict):
74
+ r"""Image input content item"""
75
+
76
+ type: OpenResponsesEasyInputMessageContentType
77
+ detail: OpenResponsesEasyInputMessageDetail
78
+ image_url: NotRequired[Nullable[str]]
79
+
80
+
81
+ class OpenResponsesEasyInputMessageContentInputImage(BaseModel):
82
+ r"""Image input content item"""
83
+
84
+ type: OpenResponsesEasyInputMessageContentType
85
+
86
+ detail: Annotated[
87
+ OpenResponsesEasyInputMessageDetail, PlainValidator(validate_open_enum(False))
88
+ ]
89
+
90
+ image_url: OptionalNullable[str] = UNSET
91
+
92
+ @model_serializer(mode="wrap")
93
+ def serialize_model(self, handler):
94
+ optional_fields = ["image_url"]
95
+ nullable_fields = ["image_url"]
96
+ null_default_fields = []
97
+
98
+ serialized = handler(self)
99
+
100
+ m = {}
101
+
102
+ for n, f in type(self).model_fields.items():
103
+ k = f.alias or n
104
+ val = serialized.get(k)
105
+ serialized.pop(k, None)
106
+
107
+ optional_nullable = k in optional_fields and k in nullable_fields
108
+ is_set = (
109
+ self.__pydantic_fields_set__.intersection({n})
110
+ or k in null_default_fields
111
+ ) # pylint: disable=no-member
112
+
113
+ if val is not None and val != UNSET_SENTINEL:
114
+ m[k] = val
115
+ elif val != UNSET_SENTINEL and (
116
+ not k in optional_fields or (optional_nullable and is_set)
117
+ ):
118
+ m[k] = val
119
+
120
+ return m
121
+
122
+
123
+ OpenResponsesEasyInputMessageContentUnion1TypedDict = TypeAliasType(
124
+ "OpenResponsesEasyInputMessageContentUnion1TypedDict",
54
125
  Union[
55
126
  ResponseInputTextTypedDict,
56
127
  ResponseInputAudioTypedDict,
57
- ResponseInputImageTypedDict,
128
+ ResponseInputVideoTypedDict,
129
+ OpenResponsesEasyInputMessageContentInputImageTypedDict,
58
130
  ResponseInputFileTypedDict,
59
131
  ],
60
132
  )
61
133
 
62
134
 
63
- OpenResponsesEasyInputMessageContent1 = Annotated[
135
+ OpenResponsesEasyInputMessageContentUnion1 = Annotated[
64
136
  Union[
65
137
  Annotated[ResponseInputText, Tag("input_text")],
66
- Annotated[ResponseInputImage, Tag("input_image")],
138
+ Annotated[OpenResponsesEasyInputMessageContentInputImage, Tag("input_image")],
67
139
  Annotated[ResponseInputFile, Tag("input_file")],
68
140
  Annotated[ResponseInputAudio, Tag("input_audio")],
141
+ Annotated[ResponseInputVideo, Tag("input_video")],
69
142
  ],
70
143
  Discriminator(lambda m: get_discriminator(m, "type", "type")),
71
144
  ]
72
145
 
73
146
 
74
- OpenResponsesEasyInputMessageContent2TypedDict = TypeAliasType(
75
- "OpenResponsesEasyInputMessageContent2TypedDict",
76
- Union[List[OpenResponsesEasyInputMessageContent1TypedDict], str],
147
+ OpenResponsesEasyInputMessageContentUnion2TypedDict = TypeAliasType(
148
+ "OpenResponsesEasyInputMessageContentUnion2TypedDict",
149
+ Union[List[OpenResponsesEasyInputMessageContentUnion1TypedDict], str],
77
150
  )
78
151
 
79
152
 
80
- OpenResponsesEasyInputMessageContent2 = TypeAliasType(
81
- "OpenResponsesEasyInputMessageContent2",
82
- Union[List[OpenResponsesEasyInputMessageContent1], str],
153
+ OpenResponsesEasyInputMessageContentUnion2 = TypeAliasType(
154
+ "OpenResponsesEasyInputMessageContentUnion2",
155
+ Union[List[OpenResponsesEasyInputMessageContentUnion1], str],
83
156
  )
84
157
 
85
158
 
86
159
  class OpenResponsesEasyInputMessageTypedDict(TypedDict):
87
160
  role: OpenResponsesEasyInputMessageRoleUnionTypedDict
88
- content: OpenResponsesEasyInputMessageContent2TypedDict
89
- type: NotRequired[OpenResponsesEasyInputMessageType]
161
+ content: OpenResponsesEasyInputMessageContentUnion2TypedDict
162
+ type: NotRequired[OpenResponsesEasyInputMessageTypeMessage]
90
163
 
91
164
 
92
165
  class OpenResponsesEasyInputMessage(BaseModel):
93
166
  role: OpenResponsesEasyInputMessageRoleUnion
94
167
 
95
- content: OpenResponsesEasyInputMessageContent2
168
+ content: OpenResponsesEasyInputMessageContentUnion2
96
169
 
97
- type: Optional[OpenResponsesEasyInputMessageType] = None
170
+ type: Optional[OpenResponsesEasyInputMessageTypeMessage] = None
@@ -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
@@ -149,24 +149,27 @@ class OpenResponsesNonStreamingResponseTypedDict(TypedDict):
149
149
  object: Object
150
150
  created_at: float
151
151
  model: str
152
+ status: OpenAIResponsesResponseStatus
153
+ completed_at: Nullable[float]
152
154
  output: List[ResponsesOutputItemTypedDict]
153
155
  error: Nullable[ResponsesErrorFieldTypedDict]
154
156
  r"""Error information returned from the API"""
155
157
  incomplete_details: Nullable[OpenAIResponsesIncompleteDetailsTypedDict]
156
158
  temperature: Nullable[float]
157
159
  top_p: Nullable[float]
160
+ presence_penalty: Nullable[float]
161
+ frequency_penalty: Nullable[float]
158
162
  instructions: Nullable[OpenAIResponsesInputUnionTypedDict]
159
163
  metadata: Nullable[Dict[str, str]]
160
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."""
161
165
  tools: List[OpenResponsesNonStreamingResponseToolUnionTypedDict]
162
166
  tool_choice: OpenAIResponsesToolChoiceUnionTypedDict
163
167
  parallel_tool_calls: bool
164
- status: NotRequired[OpenAIResponsesResponseStatus]
165
168
  user: NotRequired[Nullable[str]]
166
169
  output_text: NotRequired[str]
167
170
  prompt_cache_key: NotRequired[Nullable[str]]
168
171
  safety_identifier: NotRequired[Nullable[str]]
169
- usage: NotRequired[OpenResponsesUsageTypedDict]
172
+ usage: NotRequired[Nullable[OpenResponsesUsageTypedDict]]
170
173
  r"""Token usage information for the response"""
171
174
  max_tool_calls: NotRequired[Nullable[float]]
172
175
  top_logprobs: NotRequired[float]
@@ -193,6 +196,12 @@ class OpenResponsesNonStreamingResponse(BaseModel):
193
196
 
194
197
  model: str
195
198
 
199
+ status: Annotated[
200
+ OpenAIResponsesResponseStatus, PlainValidator(validate_open_enum(False))
201
+ ]
202
+
203
+ completed_at: Nullable[float]
204
+
196
205
  output: List[ResponsesOutputItem]
197
206
 
198
207
  error: Nullable[ResponsesErrorField]
@@ -204,6 +213,10 @@ class OpenResponsesNonStreamingResponse(BaseModel):
204
213
 
205
214
  top_p: Nullable[float]
206
215
 
216
+ presence_penalty: Nullable[float]
217
+
218
+ frequency_penalty: Nullable[float]
219
+
207
220
  instructions: Nullable[OpenAIResponsesInputUnion]
208
221
 
209
222
  metadata: Nullable[Dict[str, str]]
@@ -215,11 +228,6 @@ class OpenResponsesNonStreamingResponse(BaseModel):
215
228
 
216
229
  parallel_tool_calls: bool
217
230
 
218
- status: Annotated[
219
- Optional[OpenAIResponsesResponseStatus],
220
- PlainValidator(validate_open_enum(False)),
221
- ] = None
222
-
223
231
  user: OptionalNullable[str] = UNSET
224
232
 
225
233
  output_text: Optional[str] = None
@@ -228,7 +236,7 @@ class OpenResponsesNonStreamingResponse(BaseModel):
228
236
 
229
237
  safety_identifier: OptionalNullable[str] = UNSET
230
238
 
231
- usage: Optional[OpenResponsesUsage] = None
239
+ usage: OptionalNullable[OpenResponsesUsage] = UNSET
232
240
  r"""Token usage information for the response"""
233
241
 
234
242
  max_tool_calls: OptionalNullable[float] = UNSET
@@ -263,7 +271,6 @@ class OpenResponsesNonStreamingResponse(BaseModel):
263
271
  @model_serializer(mode="wrap")
264
272
  def serialize_model(self, handler):
265
273
  optional_fields = [
266
- "status",
267
274
  "user",
268
275
  "output_text",
269
276
  "prompt_cache_key",
@@ -282,15 +289,19 @@ class OpenResponsesNonStreamingResponse(BaseModel):
282
289
  "text",
283
290
  ]
284
291
  nullable_fields = [
292
+ "completed_at",
285
293
  "user",
286
294
  "prompt_cache_key",
287
295
  "safety_identifier",
288
296
  "error",
289
297
  "incomplete_details",
298
+ "usage",
290
299
  "max_tool_calls",
291
300
  "max_output_tokens",
292
301
  "temperature",
293
302
  "top_p",
303
+ "presence_penalty",
304
+ "frequency_penalty",
294
305
  "instructions",
295
306
  "metadata",
296
307
  "prompt",
@@ -55,6 +55,7 @@ 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",
60
61
  "google-gemini-v1",