Skip to content

Commit fc0d6e9

Browse files
feat(responses): accept non-standard tool and input item types for Codex compatibility
External clients like OpenAI Codex send tool types (local_shell, tool_search, image_generation, custom) and input item types (local_shell_call, custom_tool_call, tool_search_call) that are not part of the standard OpenAI Responses API. Previously these caused 422 validation errors because the Pydantic unions used strict discriminators. This adds catch-all models (OpenAIResponseInputToolCustom for tools, OpenAIResponseInputUnknown for input items) and switches the unions from discriminated to left-to-right mode so that known types are matched first and unknown types are gracefully accepted. Client-side tool types are skipped during chat conversion since the model doesn't need to see them. Also adds the verbosity field to OpenAIResponseText which Codex sends in its text configuration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
1 parent eb34cb9 commit fc0d6e9

File tree

12 files changed

+830
-323
lines changed

12 files changed

+830
-323
lines changed

client-sdks/stainless/openapi.yml

Lines changed: 85 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -7349,7 +7349,9 @@ components:
73497349
title: OpenAIResponseMCPApprovalResponse
73507350
- $ref: '#/components/schemas/OpenAIResponseMessage'
73517351
title: OpenAIResponseMessage
7352-
title: OpenAIResponseInputFunctionToolCallOutput | OpenAIResponseMCPApprovalResponse | OpenAIResponseMessage
7352+
- $ref: '#/components/schemas/OpenAIResponseInputUnknown'
7353+
title: OpenAIResponseInputUnknown
7354+
title: OpenAIResponseInputFunctionToolCallOutput | ... (4 variants)
73537355
OpenAIResponseInputToolFileSearch:
73547356
properties:
73557357
type:
@@ -7552,7 +7554,7 @@ components:
75527554
tools:
75537555
anyOf:
75547556
- items:
7555-
oneOf:
7557+
anyOf:
75567558
- $ref: '#/components/schemas/OpenAIResponseInputToolWebSearch'
75577559
title: OpenAIResponseInputToolWebSearch
75587560
- $ref: '#/components/schemas/OpenAIResponseInputToolFileSearch'
@@ -7561,17 +7563,9 @@ components:
75617563
title: OpenAIResponseInputToolFunction
75627564
- $ref: '#/components/schemas/OpenAIResponseToolMCP'
75637565
title: OpenAIResponseToolMCP
7564-
discriminator:
7565-
propertyName: type
7566-
mapping:
7567-
file_search: '#/components/schemas/OpenAIResponseInputToolFileSearch'
7568-
function: '#/components/schemas/OpenAIResponseInputToolFunction'
7569-
mcp: '#/components/schemas/OpenAIResponseToolMCP'
7570-
web_search: '#/components/schemas/OpenAIResponseInputToolWebSearch'
7571-
web_search_2025_08_26: '#/components/schemas/OpenAIResponseInputToolWebSearch'
7572-
web_search_preview: '#/components/schemas/OpenAIResponseInputToolWebSearch'
7573-
web_search_preview_2025_03_11: '#/components/schemas/OpenAIResponseInputToolWebSearch'
7574-
title: OpenAIResponseInputToolWebSearch | ... (4 variants)
7566+
- $ref: '#/components/schemas/OpenAIResponseInputToolCustom'
7567+
title: OpenAIResponseInputToolCustom
7568+
title: OpenAIResponseInputToolWebSearch | ... (5 variants)
75757569
type: array
75767570
- type: 'null'
75777571
tool_choice:
@@ -7693,7 +7687,9 @@ components:
76937687
title: OpenAIResponseMCPApprovalResponse
76947688
- $ref: '#/components/schemas/OpenAIResponseMessage-Output'
76957689
title: OpenAIResponseMessage-Output
7696-
title: OpenAIResponseInputFunctionToolCallOutput | OpenAIResponseMCPApprovalResponse | OpenAIResponseMessage-Output
7690+
- $ref: '#/components/schemas/OpenAIResponseInputUnknown'
7691+
title: OpenAIResponseInputUnknown
7692+
title: OpenAIResponseInputFunctionToolCallOutput | ... (4 variants)
76977693
type: array
76987694
title: Input
76997695
required:
@@ -7776,20 +7772,18 @@ components:
77767772
title: OpenAIResponseTextFormat
77777773
- type: 'null'
77787774
title: OpenAIResponseTextFormat
7775+
verbosity:
7776+
anyOf:
7777+
- type: string
7778+
enum:
7779+
- low
7780+
- medium
7781+
- high
7782+
- type: 'null'
77797783
title: OpenAIResponseText
77807784
description: Text response configuration for OpenAI responses.
77817785
OpenAIResponseTool:
7782-
discriminator:
7783-
mapping:
7784-
file_search: '#/components/schemas/OpenAIResponseInputToolFileSearch'
7785-
function: '#/components/schemas/OpenAIResponseInputToolFunction'
7786-
mcp: '#/components/schemas/OpenAIResponseToolMCP'
7787-
web_search: '#/components/schemas/OpenAIResponseInputToolWebSearch'
7788-
web_search_2025_08_26: '#/components/schemas/OpenAIResponseInputToolWebSearch'
7789-
web_search_preview: '#/components/schemas/OpenAIResponseInputToolWebSearch'
7790-
web_search_preview_2025_03_11: '#/components/schemas/OpenAIResponseInputToolWebSearch'
7791-
propertyName: type
7792-
oneOf:
7786+
anyOf:
77937787
- $ref: '#/components/schemas/OpenAIResponseInputToolWebSearch'
77947788
title: OpenAIResponseInputToolWebSearch
77957789
- $ref: '#/components/schemas/OpenAIResponseInputToolFileSearch'
@@ -7798,7 +7792,9 @@ components:
77987792
title: OpenAIResponseInputToolFunction
77997793
- $ref: '#/components/schemas/OpenAIResponseToolMCP'
78007794
title: OpenAIResponseToolMCP
7801-
title: OpenAIResponseInputToolWebSearch | ... (4 variants)
7795+
- $ref: '#/components/schemas/OpenAIResponseInputToolCustom'
7796+
title: OpenAIResponseInputToolCustom
7797+
title: OpenAIResponseInputToolWebSearch | ... (5 variants)
78027798
OpenAIResponseToolMCP:
78037799
properties:
78047800
type:
@@ -7857,17 +7853,7 @@ components:
78577853
title: ResponseGuardrailSpec
78587854
description: Specification for a guardrail to apply during response generation.
78597855
OpenAIResponseInputTool:
7860-
discriminator:
7861-
mapping:
7862-
file_search: '#/components/schemas/OpenAIResponseInputToolFileSearch'
7863-
function: '#/components/schemas/OpenAIResponseInputToolFunction'
7864-
mcp: '#/components/schemas/OpenAIResponseInputToolMCP'
7865-
web_search: '#/components/schemas/OpenAIResponseInputToolWebSearch'
7866-
web_search_2025_08_26: '#/components/schemas/OpenAIResponseInputToolWebSearch'
7867-
web_search_preview: '#/components/schemas/OpenAIResponseInputToolWebSearch'
7868-
web_search_preview_2025_03_11: '#/components/schemas/OpenAIResponseInputToolWebSearch'
7869-
propertyName: type
7870-
oneOf:
7856+
anyOf:
78717857
- $ref: '#/components/schemas/OpenAIResponseInputToolWebSearch'
78727858
title: OpenAIResponseInputToolWebSearch
78737859
- $ref: '#/components/schemas/OpenAIResponseInputToolFileSearch'
@@ -7876,7 +7862,9 @@ components:
78767862
title: OpenAIResponseInputToolFunction
78777863
- $ref: '#/components/schemas/OpenAIResponseInputToolMCP'
78787864
title: OpenAIResponseInputToolMCP
7879-
title: OpenAIResponseInputToolWebSearch | ... (4 variants)
7865+
- $ref: '#/components/schemas/OpenAIResponseInputToolCustom'
7866+
title: OpenAIResponseInputToolCustom
7867+
title: OpenAIResponseInputToolWebSearch | ... (5 variants)
78807868
OpenAIResponseInputToolMCP:
78817869
properties:
78827870
type:
@@ -8044,7 +8032,7 @@ components:
80448032
tools:
80458033
anyOf:
80468034
- items:
8047-
oneOf:
8035+
anyOf:
80488036
- $ref: '#/components/schemas/OpenAIResponseInputToolWebSearch'
80498037
title: OpenAIResponseInputToolWebSearch
80508038
- $ref: '#/components/schemas/OpenAIResponseInputToolFileSearch'
@@ -8053,17 +8041,9 @@ components:
80538041
title: OpenAIResponseInputToolFunction
80548042
- $ref: '#/components/schemas/OpenAIResponseToolMCP'
80558043
title: OpenAIResponseToolMCP
8056-
discriminator:
8057-
propertyName: type
8058-
mapping:
8059-
file_search: '#/components/schemas/OpenAIResponseInputToolFileSearch'
8060-
function: '#/components/schemas/OpenAIResponseInputToolFunction'
8061-
mcp: '#/components/schemas/OpenAIResponseToolMCP'
8062-
web_search: '#/components/schemas/OpenAIResponseInputToolWebSearch'
8063-
web_search_2025_08_26: '#/components/schemas/OpenAIResponseInputToolWebSearch'
8064-
web_search_preview: '#/components/schemas/OpenAIResponseInputToolWebSearch'
8065-
web_search_preview_2025_03_11: '#/components/schemas/OpenAIResponseInputToolWebSearch'
8066-
title: OpenAIResponseInputToolWebSearch | ... (4 variants)
8044+
- $ref: '#/components/schemas/OpenAIResponseInputToolCustom'
8045+
title: OpenAIResponseInputToolCustom
8046+
title: OpenAIResponseInputToolWebSearch | ... (5 variants)
80678047
type: array
80688048
- type: 'null'
80698049
tool_choice:
@@ -9363,7 +9343,9 @@ components:
93639343
title: OpenAIResponseMCPApprovalResponse
93649344
- $ref: '#/components/schemas/OpenAIResponseMessage-Output'
93659345
title: OpenAIResponseMessage-Output
9366-
title: OpenAIResponseInputFunctionToolCallOutput | OpenAIResponseMCPApprovalResponse | OpenAIResponseMessage-Output
9346+
- $ref: '#/components/schemas/OpenAIResponseInputUnknown'
9347+
title: OpenAIResponseInputUnknown
9348+
title: OpenAIResponseInputFunctionToolCallOutput | ... (4 variants)
93679349
type: array
93689350
title: Data
93699351
object:
@@ -11925,10 +11907,12 @@ components:
1192511907
title: OpenAIResponseInputFunctionToolCallOutput
1192611908
- $ref: '#/components/schemas/OpenAIResponseMCPApprovalResponse'
1192711909
title: OpenAIResponseMCPApprovalResponse
11928-
title: OpenAIResponseInputFunctionToolCallOutput | OpenAIResponseMCPApprovalResponse
11910+
- $ref: '#/components/schemas/OpenAIResponseInputUnknown'
11911+
title: OpenAIResponseInputUnknown
11912+
title: OpenAIResponseInputFunctionToolCallOutput | OpenAIResponseMCPApprovalResponse | OpenAIResponseInputUnknown
1192911913
type: array
11930-
title: list[OpenAIResponseMessageUnion | OpenAIResponseInputFunctionToolCallOutput | OpenAIResponseMCPApprovalResponse]
11931-
title: string | list[OpenAIResponseMessageUnion | OpenAIResponseInputFunctionToolCallOutput | OpenAIResponseMCPApprovalResponse]
11914+
title: list[OpenAIResponseMessageUnion | OpenAIResponseInputFunctionToolCallOutput | ...]
11915+
title: string | list[OpenAIResponseMessageUnion | OpenAIResponseInputFunctionToolCallOutput | ...]
1193211916
description: Input message(s) to create the response.
1193311917
model:
1193411918
type: string
@@ -12048,7 +12032,7 @@ components:
1204812032
tools:
1204912033
anyOf:
1205012034
- items:
12051-
oneOf:
12035+
anyOf:
1205212036
- $ref: '#/components/schemas/OpenAIResponseInputToolWebSearch'
1205312037
title: OpenAIResponseInputToolWebSearch
1205412038
- $ref: '#/components/schemas/OpenAIResponseInputToolFileSearch'
@@ -12057,17 +12041,9 @@ components:
1205712041
title: OpenAIResponseInputToolFunction
1205812042
- $ref: '#/components/schemas/OpenAIResponseInputToolMCP'
1205912043
title: OpenAIResponseInputToolMCP
12060-
discriminator:
12061-
propertyName: type
12062-
mapping:
12063-
file_search: '#/components/schemas/OpenAIResponseInputToolFileSearch'
12064-
function: '#/components/schemas/OpenAIResponseInputToolFunction'
12065-
mcp: '#/components/schemas/OpenAIResponseInputToolMCP'
12066-
web_search: '#/components/schemas/OpenAIResponseInputToolWebSearch'
12067-
web_search_2025_08_26: '#/components/schemas/OpenAIResponseInputToolWebSearch'
12068-
web_search_preview: '#/components/schemas/OpenAIResponseInputToolWebSearch'
12069-
web_search_preview_2025_03_11: '#/components/schemas/OpenAIResponseInputToolWebSearch'
12070-
title: OpenAIResponseInputToolWebSearch | ... (4 variants)
12044+
- $ref: '#/components/schemas/OpenAIResponseInputToolCustom'
12045+
title: OpenAIResponseInputToolCustom
12046+
title: OpenAIResponseInputToolWebSearch | ... (5 variants)
1207112047
type: array
1207212048
- type: 'null'
1207312049
description: List of tools available to the model.
@@ -12746,6 +12722,49 @@ components:
1274612722
default: web_search
1274712723
title: OpenAIResponseInputToolChoiceWebSearch
1274812724
description: Indicates that the model should use web search to generate a response
12725+
OpenAIResponseInputToolCustom:
12726+
properties:
12727+
type:
12728+
type: string
12729+
title: Type
12730+
name:
12731+
anyOf:
12732+
- type: string
12733+
- type: 'null'
12734+
description:
12735+
anyOf:
12736+
- type: string
12737+
- type: 'null'
12738+
additionalProperties: true
12739+
required:
12740+
- type
12741+
title: OpenAIResponseInputToolCustom
12742+
description: |-
12743+
Catch-all tool configuration for non-standard tool types.
12744+
12745+
Accepts arbitrary fields for compatibility with custom tool definitions
12746+
from external clients (e.g., Codex sends ``local_shell``, ``tool_search``,
12747+
``image_generation``, and ``custom`` tool types).
12748+
OpenAIResponseInputUnknown:
12749+
properties:
12750+
type:
12751+
type: string
12752+
title: Type
12753+
id:
12754+
anyOf:
12755+
- type: string
12756+
- type: 'null'
12757+
additionalProperties: true
12758+
required:
12759+
- type
12760+
title: OpenAIResponseInputUnknown
12761+
description: |-
12762+
Catch-all for unrecognized input item types.
12763+
12764+
Accepts items with unknown ``type`` values (e.g. ``local_shell_call``,
12765+
``custom_tool_call``, ``tool_search_call``) so that external clients like
12766+
Codex can pass their full conversation history through without validation
12767+
errors. These items are forwarded to the upstream inference provider as-is.
1274912768
OpenAIResponseMessage-Input:
1275012769
properties:
1275112770
content:

0 commit comments

Comments
 (0)