I’m currently building an application using the Responses API.
I’m using GPT-5.2
Since the GPT-5.4 release, I’ve been experiencing issues when enabling our internal function tools alongside the built-in tools ("type": "shell", "type": "apply_patch", and "type": "web_search").
Before GPT-5.4, everything worked as expected:
-
The model would correctly invoke functional tools when needed.
-
It would also use
apply_patchandshellappropriately when the task required them.
However, after the release, the model appears to ignore the built-in tools whenever custom function tools are present in the tools array.
Observed Behaviors
-
Shell tool ignored when function tools are present
When functional tools such as"create_file_with_fs"are included in the tools array, theshelltool is not used.-
The
shellcommands array comes back empty. -
If I remove the custom function tools,
shellworks as intended again.
-
-
Refusal to use shell tool
When I explicitly ask the model to “Run a simple shell command”, it responds by saying it cannot run shell commands.
Instead, it attempts to call unrelated function tools. -
apply_patch tool not invoked
A similar issue occurs with theapply_patchtool:-
When function tools are present, the model does not invoke
apply_patch. -
Instead, it returns the patch as plain text.
-
If I explicitly instruct it to use
apply_patch, it responds with:“I do not have such a tool.”
-
It seems that when custom function tools are included in the tools array, GPT-5.4 deprioritizes or completely ignores the built-in tools (shell, apply_patch, web_search). This behavior differs from previous versions, where both tool types coexisted without issue.
Has anyone else experienced this?
Is there a change in tool prioritization or invocation logic in GPT-5.4 that could explain this behavior?
Any insights would be greatly appreciated.
This is an example of my tools array:
"tools": [
{
"type": "web_search"
},
{
"environment": {
"type": "local"
},
"type": "shell"
},
{
"type": "apply_patch"
},
{
"name": "create_file_with_fs",
"description": "Updated description",
"parameters": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "Brief description of why this operation is being performed (e.g., 'Creating config file', 'Backing up data', 'Updating dependencies')"
},
"content": {
"type": "string",
"description": "The content to write to the file. For text files: Plain text, code, JSON, HTML, or any string content. For binary files: Base64-encoded string when using encoding='base64'. Examples: - Text: 'Hello World' with encoding='utf8' - Image: 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB...' with encoding='base64' - Binary data: Use base64 encoding for images, documents, executables, etc."
},
"encoding": {
"type": "string",
"description": "The file encoding to use when writing the file. - 'utf8': For text files (default) - code, JSON, HTML, plain text - 'base64': For binary files - images, PDFs, executables, media files - 'ascii': For simple text files with ASCII characters only - 'binary': For raw binary data (advanced use) - 'hex': For hexadecimal encoded data (advanced use)"
},
"filePath": {
"type": "string",
"description": "The absolute path where the file should be created. Must be a complete path including drive letter on Windows (e.g., 'C:\\Users\\username\\Documents\\file.txt') or full path on Unix systems (e.g., '/home/username/documents/file.txt'). Include the filename and extension."
},
"createDirectories": {
"type": "boolean",
"description": "Whether to automatically create parent directories if they don't exist. When true, will create the full directory path recursively (similar to mkdir -p)."
}
},
"required": [
"filePath",
"content",
"reason",
"createDirectories",
"encoding"
],
"additionalProperties": false
},
"strict": true,
"type": "function"
}
}