File: code-execution-tool.md | Updated: 11/15/2025
Agent Skills are now available! Learn more about extending Claude's capabilities with Agent Skills .
English
Search...
Ctrl K
Search...
Navigation
Tools
Code execution tool
Home Developer Guide API Reference Model Context Protocol (MCP) Resources Release Notes
On this page
Claude can analyze data, create visualizations, perform complex calculations, run system commands, create and edit files, and process uploaded files directly within the API conversation. The code execution tool allows Claude to run Bash commands and manipulate files, including writing code, in a secure, sandboxed environment.
The code execution tool is currently in public beta.To use this feature, add the "code-execution-2025-08-25" beta header
to your API requests.
The code execution tool is available on the following models:
| Model | Tool Version |
| --- | --- |
| Claude Opus 4.1 (claude-opus-4-1-20250805) | code_execution_20250825 |
| Claude Opus 4 (claude-opus-4-20250514) | code_execution_20250825 |
| Claude Sonnet 4.5 (claude-sonnet-4-5-20250929) | code_execution_20250825 |
| Claude Sonnet 4 (claude-sonnet-4-20250514) | code_execution_20250825 |
| Claude Sonnet 3.7 (claude-3-7-sonnet-20250219) (deprecated<br>) | code_execution_20250825 |
| Claude Haiku 4.5 (claude-haiku-4-5-20251001) | code_execution_20250825 |
| Claude Haiku 3.5 (claude-3-5-haiku-latest) | code_execution_20250825 |
The current version code_execution_20250825 supports Bash commands and file operations. A legacy version code_execution_20250522 (Python only) is also available. See Upgrade to latest tool version
for migration details.
Older tool versions are not guaranteed to be backwards-compatible with newer models. Always use the tool version that corresponds to your model version.
Hereβs a simple example that asks Claude to perform a calculation:
Shell
Python
TypeScript
Copy
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: code-execution-2025-08-25" \
--header "content-type: application/json" \
--data '{
"model": "claude-sonnet-4-5",
"max_tokens": 4096,
"messages": [\
{\
"role": "user",\
"content": "Calculate the mean and standard deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"\
}\
],
"tools": [{\
"type": "code_execution_20250825",\
"name": "code_execution"\
}]
}'
When you add the code execution tool to your API request:
Execute Bash commands
Ask Claude to check system information and install packages:
Shell
Python
TypeScript
Copy
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: code-execution-2025-08-25" \
--header "content-type: application/json" \
--data '{
"model": "claude-sonnet-4-5",
"max_tokens": 4096,
"messages": [{\
"role": "user",\
"content": "Check the Python version and list installed packages"\
}],
"tools": [{\
"type": "code_execution_20250825",\
"name": "code_execution"\
}]
}'
Create and edit files directly
Claude can create, view, and edit files directly in the sandbox using the file manipulation capabilities:
Shell
Python
TypeScript
Copy
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: code-execution-2025-08-25" \
--header "content-type: application/json" \
--data '{
"model": "claude-sonnet-4-5",
"max_tokens": 4096,
"messages": [{\
"role": "user",\
"content": "Create a config.yaml file with database settings, then update the port from 5432 to 3306"\
}],
"tools": [{\
"type": "code_execution_20250825",\
"name": "code_execution"\
}]
}'
Upload and analyze your own files
To analyze your own data files (CSV, Excel, images, etc.), upload them via the Files API and reference them in your request:
Using the Files API with Code Execution requires two beta headers: "anthropic-beta": "code-execution-2025-08-25,files-api-2025-04-14"
The Python environment can process various file types uploaded via the Files API, including:
Upload and analyze files
Upload your file using the Files API
Reference the file in your message using a container_upload content block
Include the code execution tool in your API request
Shell
Python
TypeScript
Copy
# First, upload a file
curl https://api.anthropic.com/v1/files \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: files-api-2025-04-14" \
--form 'file=@"data.csv"' \
# Then use the file_id with code execution
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: code-execution-2025-08-25,files-api-2025-04-14" \
--header "content-type: application/json" \
--data '{
"model": "claude-sonnet-4-5",
"max_tokens": 4096,
"messages": [{\
"role": "user",\
"content": [\
{"type": "text", "text": "Analyze this CSV data"},\
{"type": "container_upload", "file_id": "file_abc123"}\
]\
}],
"tools": [{\
"type": "code_execution_20250825",\
"name": "code_execution"\
}]
}'
Retrieve generated files
When Claude creates files during code execution, you can retrieve these files using the Files API:
Python
TypeScript
Copy
from anthropic import Anthropic
# Initialize the client
client = Anthropic()
# Request code execution that creates files
response = client.beta.messages.create(
model="claude-sonnet-4-5",
betas=["code-execution-2025-08-25", "files-api-2025-04-14"],
max_tokens=4096,
messages=[{\
"role": "user",\
"content": "Create a matplotlib visualization and save it as output.png"\
}],
tools=[{\
"type": "code_execution_20250825",\
"name": "code_execution"\
}]
)
# Extract file IDs from the response
def extract_file_ids(response):
file_ids = []
for item in response.content:
if item.type == 'bash_code_execution_tool_result':
content_item = item.content
if content_item.type == 'bash_code_execution_result':
for file in content_item.content:
if hasattr(file, 'file_id'):
file_ids.append(file.file_id)
return file_ids
# Download the created files
for file_id in extract_file_ids(response):
file_metadata = client.beta.files.retrieve_metadata(file_id)
file_content = client.beta.files.download(file_id)
file_content.write_to_file(file_metadata.filename)
print(f"Downloaded: {file_metadata.filename}")
Combine operations
A complex workflow using all capabilities:
Shell
Python
TypeScript
Copy
# First, upload a file
curl https://api.anthropic.com/v1/files \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: files-api-2025-04-14" \
--form 'file=@"data.csv"' \
> file_response.json
# Extract file_id (using jq)
FILE_ID=$(jq -r '.id' file_response.json)
# Then use it with code execution
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: code-execution-2025-08-25,files-api-2025-04-14" \
--header "content-type: application/json" \
--data '{
"model": "claude-sonnet-4-5",
"max_tokens": 4096,
"messages": [{\
"role": "user",\
"content": [\
{\
"type": "text", \
"text": "Analyze this CSV data: create a summary report, save visualizations, and create a README with the findings"\
},\
{\
"type": "container_upload", \
"file_id": "'$FILE_ID'"\
}\
]\
}],
"tools": [{\
"type": "code_execution_20250825",\
"name": "code_execution"\
}]
}'
The code execution tool requires no additional parameters:
JSON
Copy
{
"type": "code_execution_20250825",
"name": "code_execution"
}
When this tool is provided, Claude automatically gains access to two sub-tools:
bash_code_execution: Run shell commandstext_editor_code_execution: View, create, and edit files, including writing codeThe code execution tool can return two types of results depending on the operation:
Bash command response
Copy
{
"type": "server_tool_use",
"id": "srvtoolu_01B3C4D5E6F7G8H9I0J1K2L3",
"name": "bash_code_execution",
"input": {
"command": "ls -la | head -5"
}
},
{
"type": "bash_code_execution_tool_result",
"tool_use_id": "srvtoolu_01B3C4D5E6F7G8H9I0J1K2L3",
"content": {
"type": "bash_code_execution_result",
"stdout": "total 24\ndrwxr-xr-x 2 user user 4096 Jan 1 12:00 .\ndrwxr-xr-x 3 user user 4096 Jan 1 11:00 ..\n-rw-r--r-- 1 user user 220 Jan 1 12:00 data.csv\n-rw-r--r-- 1 user user 180 Jan 1 12:00 config.json",
"stderr": "",
"return_code": 0
}
}
File operation responses
View file:
Copy
{
"type": "server_tool_use",
"id": "srvtoolu_01C4D5E6F7G8H9I0J1K2L3M4",
"name": "text_editor_code_execution",
"input": {
"command": "view",
"path": "config.json"
}
},
{
"type": "text_editor_code_execution_tool_result",
"tool_use_id": "srvtoolu_01C4D5E6F7G8H9I0J1K2L3M4",
"content": {
"type": "text_editor_code_execution_result",
"file_type": "text",
"content": "{\n \"setting\": \"value\",\n \"debug\": true\n}",
"numLines": 4,
"startLine": 1,
"totalLines": 4
}
}
Create file:
Copy
{
"type": "server_tool_use",
"id": "srvtoolu_01D5E6F7G8H9I0J1K2L3M4N5",
"name": "text_editor_code_execution",
"input": {
"command": "create",
"path": "new_file.txt",
"file_text": "Hello, World!"
}
},
{
"type": "text_editor_code_execution_tool_result",
"tool_use_id": "srvtoolu_01D5E6F7G8H9I0J1K2L3M4N5",
"content": {
"type": "text_editor_code_execution_result",
"is_file_update": false
}
}
Edit file (str_replace):
Copy
{
"type": "server_tool_use",
"id": "srvtoolu_01E6F7G8H9I0J1K2L3M4N5O6",
"name": "text_editor_code_execution",
"input": {
"command": "str_replace",
"path": "config.json",
"old_str": "\"debug\": true",
"new_str": "\"debug\": false"
}
},
{
"type": "text_editor_code_execution_tool_result",
"tool_use_id": "srvtoolu_01E6F7G8H9I0J1K2L3M4N5O6",
"content": {
"type": "text_editor_code_execution_result",
"oldStart": 3,
"oldLines": 1,
"newStart": 3,
"newLines": 1,
"lines": ["- \"debug\": true", "+ \"debug\": false"]
}
}
Results
All execution results include:
stdout: Output from successful executionstderr: Error messages if execution failsreturn_code: 0 for success, non-zero for failureAdditional fields for file operations:
file_type, content, numLines, startLine, totalLinesis_file_update (whether file already existed)oldStart, oldLines, newStart, newLines, lines (diff format)Errors
Each tool type can return specific errors: Common errors (all tools):
Copy
{
"type": "bash_code_execution_tool_result",
"tool_use_id": "srvtoolu_01VfmxgZ46TiHbmXgy928hQR",
"content": {
"type": "bash_code_execution_tool_result_error",
"error_code": "unavailable"
}
}
Error codes by tool type:
| Tool | Error Code | Description |
| --- | --- | --- |
| All tools | unavailable | The tool is temporarily unavailable |
| All tools | execution_time_exceeded | Execution exceeded maximum time limit |
| All tools | container_expired | Container expired and is no longer available |
| All tools | invalid_tool_input | Invalid parameters provided to the tool |
| All tools | too_many_requests | Rate limit exceeded for tool usage |
| text_editor | file_not_found | File doesnβt exist (for view/edit operations) |
| text_editor | string_not_found | The old_str not found in file (for str_replace) |
pause_turn stop reason
The response may include a pause_turn stop reason, which indicates that the API paused a long-running turn. You may provide the response back as-is in a subsequent request to let Claude continue its turn, or modify the content if you wish to interrupt the conversation.
The code execution tool runs in a secure, containerized environment designed specifically for code execution, with a higher focus on Python.
Runtime environment
Resource limits
Networking and security
Pre-installed libraries
The sandboxed Python environment includes these commonly used libraries:
You can reuse an existing container across multiple API requests by providing the container ID from a previous response. This allows you to maintain created files between requests.
Example
Python
TypeScript
Shell
Copy
import os
from anthropic import Anthropic
# Initialize the client
client = Anthropic(
api_key=os.getenv("ANTHROPIC_API_KEY")
)
# First request: Create a file with a random number
response1 = client.beta.messages.create(
model="claude-sonnet-4-5",
betas=["code-execution-2025-08-25"],
max_tokens=4096,
messages=[{\
"role": "user",\
"content": "Write a file with a random number and save it to '/tmp/number.txt'"\
}],
tools=[{\
"type": "code_execution_20250825",\
"name": "code_execution"\
}]
)
# Extract the container ID from the first response
container_id = response1.container.id
# Second request: Reuse the container to read the file
response2 = client.beta.messages.create(
container=container_id, # Reuse the same container
model="claude-sonnet-4-5",
betas=["code-execution-2025-08-25"],
max_tokens=4096,
messages=[{\
"role": "user",\
"content": "Read the number from '/tmp/number.txt' and calculate its square"\
}],
tools=[{\
"type": "code_execution_20250825",\
"name": "code_execution"\
}]
)
With streaming enabled, youβll receive code execution events as they occur:
Copy
event: content_block_start
data: {"type": "content_block_start", "index": 1, "content_block": {"type": "server_tool_use", "id": "srvtoolu_xyz789", "name": "code_execution"}}
// Code execution streamed
event: content_block_delta
data: {"type": "content_block_delta", "index": 1, "delta": {"type": "input_json_delta", "partial_json": "{\"code\":\"import pandas as pd\\ndf = pd.read_csv('data.csv')\\nprint(df.head())\"}"}}
// Pause while code executes
// Execution results streamed
event: content_block_start
data: {"type": "content_block_start", "index": 2, "content_block": {"type": "code_execution_tool_result", "tool_use_id": "srvtoolu_xyz789", "content": {"stdout": " A B C\n0 1 2 3\n1 4 5 6", "stderr": ""}}}
You can include the code execution tool in the Messages Batches API . Code execution tool calls through the Messages Batches API are priced the same as those in regular Messages API requests.
Code execution tool usage is tracked separately from token usage. Execution time has a minimum of 5 minutes. If files are included in the request, execution time is billed even if the tool is not used due to files being preloaded onto the container. Each organization receives 50 free hours of usage with the code execution tool per day. Additional usage beyond the first 50 hours is billed at $0.05 per hour, per container.
By upgrading to code-execution-2025-08-25, you get access to file manipulation and Bash capabilities, including code in multiple languages. There is no price difference.
Whatβs changed
| Component | Legacy | Current |
| --- | --- | --- |
| Beta header | code-execution-2025-05-22 | code-execution-2025-08-25 |
| Tool type | code_execution_20250522 | code_execution_20250825 |
| Capabilities | Python only | Bash commands, file operations |
| Response types | code_execution_result | bash_code_execution_result, text_editor_code_execution_result |
Backward compatibility
Upgrade steps
To upgrade, you need to make the following changes in your API requests:
Update the beta header:
Copy
- "anthropic-beta": "code-execution-2025-05-22"
+ "anthropic-beta": "code-execution-2025-08-25"
Update the tool type:
Copy
- "type": "code_execution_20250522"
+ "type": "code_execution_20250825"
Review response handling (if parsing responses programmatically):
The code execution tool enables Claude to use Agent Skills . Skills are modular capabilities consisting of instructions, scripts, and resources that extend Claudeβs functionality. Learn more in the Agent Skills documentation and Agent Skills API guide .
Was this page helpful?
YesNo
Assistant
Responses are generated using AI and may contain mistakes.