bash-tool
Creates a bash tool environment with specified files for code execution.
by Vercel, Inc.
Requires sys access to "cpus", run again with the --allow-sys flag
Last checked: 3/2/2026, 4:20:15 AM
Test bash-tool (createBashTool) with AI-powered execution
0/2000 characters
Install this tool and use it with the AI SDK
npm install bash-toolpnpm add bash-toolyarn add bash-toolbun add bash-tooldeno add npm:bash-toolimport { createBashTool } from 'bash-tool';import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';
import { createBashTool } from 'bash-tool';
const result = await generateText({
model: openai('gpt-4o'),
tools: { createBashTool },
prompt: 'Your prompt here...',
});
console.log(result.text);How AI agents can use this tool
Use this tool to execute bash commands and manipulate files within a sandboxed environment.
Available configuration options
filesobjectAn object containing file paths as keys and file contents as values.
Schema extracted: 3/2/2026, 1:12:30 AM
Try to auto-extract schema from the package
Generic bash tool for AI agents, compatible with AI SDK.
npm install bash-tool just-bash
For full VM support, install @vercel/sandbox or another sandbox product instead of just-bash.
import { createBashTool } from "bash-tool"; import { ToolLoopAgent, stepCountIs } from "ai"; const { tools } = await createBashTool({ files: { "src/index.ts": "export const hello = 'world';", "package.json": '{"name": "my-project"}', }, }); const agent = new ToolLoopAgent({ model: yourModel, tools, // Or use just the bash tool as tools: {bash: tools.bash} stopWhen: stepCountIs(20), }); const result = await agent.generate({ prompt: "Analyze the project and create a summary report", });
The tools object contains three tools that can be used by AI agents:
bashExecute bash commands in the sandbox environment. For analysis agents, this may be the only tool you need to give to the agent.
Input:
command (string): The bash command to executeReturns:
stdout (string): Standard output from the commandstderr (string): Standard error from the commandexitCode (number): Exit code of the commandreadFileRead the contents of a file from the sandbox.
Input:
path (string): The path to the file to readReturns:
content (string): The file contentswriteFileWrite content to a file in the sandbox. Creates parent directories if needed.
Input:
path (string): The path where the file should be writtencontent (string): The content to write to the fileReturns:
success (boolean): true if the write succeededconst { bash } = await createBashTool({ uploadDirectory: { source: "./my-project", include: "**/*.{ts,json}", // optional glob filter }, });
import { Sandbox } from "@vercel/sandbox"; const sandbox = await Sandbox.create(); // Files are written to ./workspace by default const { tools } = await createBashTool({ sandbox, files: { "index.ts": "console.log('hello');" }, });
Use Sandbox.get to reconnect to an existing sandbox by ID:
import { Sandbox } from "@vercel/sandbox"; // First invocation: create sandbox and store the ID const newSandbox = await Sandbox.create(); const sandboxId = newSandbox.sandboxId; // Store sandboxId in database, session, or return to client // Subsequent invocations: reconnect to existing sandbox const existingSandbox = await Sandbox.get({ sandboxId }); const { tools } = await createBashTool({ sandbox: existingSandbox }); // All previous files and state are preserved
import { Bash } from "just-bash"; const sandbox = new Bash({ cwd: "/app" }); const { tools } = await createBashTool({ sandbox, destination: "/app", });
const { tools } = await createBashTool({ onBeforeBashCall: ({ command }) => { console.log("Running:", command); // Optionally modify the command if (command.includes("rm -rf")) { return { command: "echo 'Blocked dangerous command'" }; } }, onAfterBashCall: ({ command, result }) => { console.log(`Exit code: ${result.exitCode}`); // Optionally modify the result return { result: { ...result, stdout: result.stdout.trim() } }; }, });
import { createBashTool, Sandbox } from "bash-tool"; const customSandbox: Sandbox = { async executeCommand(command) { // Your implementation here return { stdout: "", stderr: "", exitCode: 0 }; }, async readFile(path) { // Your implementation here return ""; }, async writeFiles(files) { // Your implementation here - files is Array<{path, content}> }, }; const { tools } = await createBashTool({ sandbox: customSandbox });
Skills are modular capabilities that extend agent functionality. Each skill is a directory containing a SKILL.md file with instructions and optional scripts.
import { experimental_createSkillTool as createSkillTool, createBashTool, } from "bash-tool"; import { ToolLoopAgent } from "ai"; // Discover skills and get files to upload const { skill, files, instructions } = await createSkillTool({ skillsDirectory: "./skills", }); // Providing a bash tool with skills is optional if your skill only has a SKILL.md file // and no further files and scripts. const { tools } = await createBashTool({ files, extraInstructions: instructions, }); // Use both tools with an agent const agent = new ToolLoopAgent({ model, tools: { skill, ...tools }, });
Full Example and see Skills.sh for a directory of publicly available skills.
skills/ ├── csv/ │ ├── SKILL.md # Required: instructions with YAML frontmatter │ └── scripts/ # Optional: scripts the agent can run │ ├── analyze.sh │ └── filter.sh └── text/ ├── SKILL.md └── scripts/ └── search.sh
See the example skills for a complete reference.
For AI agents working with bash-tool, additional guidance is available in AGENTS.md:
cat node_modules/bash-tool/dist/AGENTS.md
MIT
Downloads/month
93,001
GitHub Stars
0
Quality Score