@ai-sdk/harness-claude-code
v1.0.152
Published
Readme
AI SDK - Claude Code Harness
HarnessV1 adapter backed by @anthropic-ai/claude-agent-sdk, which drives the claude CLI. The adapter ships a bridge process that runs inside a sandbox and talks to the host over a WebSocket on a sandbox-proxied loopback port.
Setup
npm i @ai-sdk/harness-claude-code @ai-sdk/harness @ai-sdk/sandbox-vercelThe bridge installs @anthropic-ai/claude-agent-sdk and @anthropic-ai/claude-code inside the sandbox the first time the session starts.
Usage
import { HarnessAgent } from '@ai-sdk/harness/agent';
import { createClaudeCode } from '@ai-sdk/harness-claude-code';
import { createVercelNetworkSandboxSession } from '@ai-sdk/sandbox-vercel';
import { tool } from 'ai';
import { z } from 'zod/v4';
const agent = new HarnessAgent({
harness: createClaudeCode({
skills: [
{
name: 'careful-refactors',
description: 'Make minimal diffs and keep tests green.',
content: 'Prefer changes that touch the fewest files possible.',
},
],
}),
id: 'demo',
tools: {
deploy: tool({
description: 'Deploy a service.',
inputSchema: z.object({ env: z.enum(['staging', 'production']) }),
execute: async ({ env }) => ({ url: `https://${env}.example.com` }),
}),
},
harnessOptions: {
'claude-code': {
thinking: { type: 'adaptive', display: 'summarized' },
},
},
});
const sandboxSession = await createVercelNetworkSandboxSession({
runtime: 'node24',
ports: [4000],
template: await agent.getSandboxTemplate(),
});
const session = await agent.createSession({ sandboxSession });
try {
const result = await agent.generate({
session,
prompt: 'Read README.md and summarise the goals.',
});
console.log(result.text);
} finally {
await session.destroy();
await sandboxSession.destroy();
}The adapter needs a sandbox session with an exposed port. The caller owns the sandbox lifecycle: ending the harness session does not stop the sandbox.
Runtime configuration
Use env to add environment variables to the Claude Code process. Configured
values override variables inherited from the sandbox bridge process.
const harness = createClaudeCode({
env: {
DEPLOYMENT_ENV: 'staging',
},
});Sub-agent messages and task/background notifications are surfaced as raw
stream parts. agentProgressSummaries adds periodic summaries to raw
task_progress messages, while forwardSubagentText includes sub-agent text
and thinking messages in the raw stream.
