
Add Harness Package
OfficialFreeStreamline the creation of AI SDK harness packages.
Free · Opens the source repo
What Add Harness Package does
The Add Harness Package skill provides a structured guide for developers looking to create new AI SDK harness packages, specifically those prefixed with @ai-sdk/harness-<name>. This skill is particularly useful when integrating a coding-agent runtime with HarnessV1, allowing for both host-driven and bridge-backed implementations. The documentation details the necessary steps and considerations for setting up these packages, ensuring that developers can efficiently adapt their runtimes to the Harness architecture.
The skill outlines the architecture of the AI SDK, emphasizing the layered harness structure that includes specifications, utilities, implementations, and the user-facing agent API. By following this guide, developers can create both first-party and third-party harness packages, with clear instructions on how to structure their code, configure package settings, and implement runtime-specific concerns. This comprehensive approach minimizes the risk of errors and ensures compatibility with existing harness packages.
Moreover, the skill includes a reference example for adding a new harness, which serves as a practical template for developers. It emphasizes best practices such as maintaining consistent dependency versions, using existing package configurations as a reference, and implementing the harness adapter correctly. By adhering to these guidelines, developers can create robust and maintainable harness packages that integrate seamlessly with the AI SDK ecosystem.
This skill is ideal for developers and designers working on AI applications who need to create or modify harness packages for their coding agents. It provides the necessary framework and best practices to ensure successful implementation, making it a valuable resource for anyone involved in AI SDK development.
When to use it
Use this skill when you need to develop a new harness package for an AI SDK, particularly when adapting a runtime to HarnessV1.
When not to use it
This skill may not be suitable if you're not working with AI SDKs or if you require a more general-purpose package creation guide.
What you can build with it
Creating a New AI Harness Package
When starting a new project that requires an AI SDK harness, this skill guides you through the necessary steps and structures.
Adapting Existing Runtimes
If you need to modify an existing coding-agent runtime to work with HarnessV1, this skill provides the framework for doing so.
Ensuring Compatibility with AI SDKs
Use this skill to maintain compatibility and best practices when developing harness packages for AI SDKs.
How to install Add Harness Package
View source1. Install with the skills CLI
npx skills add vercel/ai/add-harness-package --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by vercelAdding a New Harness Package
This guide covers creating a new @ai-sdk/harness-<name> package for an agent harness.
A harness can be host-driven, where the runtime runs in the host process and uses the sandbox remotely, or bridge-backed, where a small bridge runs inside the sandbox because the runtime needs local access to the sandbox filesystem or process environment. Prefer host-driven when the runtime supports it.
First-Party vs Third-Party Harnesses
- Third-party packages: Any runtime can publish an external harness package.
- First-party
@ai-sdk/harness-<name>packages: Create an issue first to discuss whether the runtime belongs in this repo.
Reference Example
See https://github.com/vercel/ai/pull/16255/changes for a complete example of adding a new harness.
Harness Architecture
The AI SDK uses a layered harness architecture following the adapter pattern:
- Harness specification (
@ai-sdk/harness): Defines interfaces likeHarnessV1andHarnessV1Session - Utilities (
@ai-sdk/harness/utils): Shared code for implementing harnesses - Harness implementations (
@ai-sdk/harness-<name>): Concrete adapters for harnesses - Harness agent (
@ai-sdk/harness/agent): The high-level user-facingHarnessAgentAPI
Step-by-Step Guide
1. Create Package Structure
Create packages/harness-<name> with this baseline structure:
packages/harness-<name>/
├── src/
│ ├── index.ts
│ ├── <name>-harness.ts
│ ├── <name>-harness.test.ts
│ └── <name>-auth.ts # if the runtime needs auth resolution
├── package.json
├── tsconfig.json
├── tsconfig.build.json
├── tsup.config.ts
├── turbo.json
├── vitest.node.config.js
└── README.md
If the runtime must execute inside the sandbox, add bridge files as well:
src/
├── <name>-bridge-protocol.ts
├── <name>-bridge-protocol.test.ts
└── bridge/
├── index.ts
├── package.json
└── pnpm-lock.yaml
Add a CHANGELOG.md containing just the package heading (# @ai-sdk/harness-<name>). Every package is required to have one.
2. Configure package.json
Use existing harness packages as the source of truth for scripts, exports, repository metadata, and publish settings.
Required package basics:
"name": "@ai-sdk/harness-<name>""type": "module""version": "0.0.0"(starting point for new packages)"license": "Apache-2.0""sideEffects": false- dependency on
@ai-sdk/harnessviaworkspace:* - dependency on
@ai-sdk/provider-utilsviaworkspace:*when using sandbox/auth/schema utilities - runtime SDK/CLI dependencies required by the harness
- dev dependencies matching existing harness packages
"engines": { "node": ">=22" }
For bridge packages, add any bridge asset copy step required for files under src/bridge/.
Bridge dependency rules (bridge-backed harnesses):
- The bridge's runtime deps live in
src/bridge/package.json(installed in-sandbox at bootstrap), not the main package.json. After changing them, regeneratesrc/bridge/pnpm-lock.yamlwithpnpm --dir packages/harness-<name>/src/bridge install --lockfile-only --ignore-workspace(runnable from the repo root). - For every third-party import in
src/bridge/, keep three things in sync: the import, theexternalarray intsup.config.ts, and the dep insrc/bridge/package.json. A missing entry shows up only at sandbox runtime as a module-resolution error. - Include packages the runtime lazily imports — e.g. provider SDKs (
@anthropic-ai/sdk,openai) resolved from the model id at runtime — even though nothing imports them directly. These fail only when a model of that provider is actually used. - Match shared dependency versions (transport, schema, tooling, runtime SDKs) to what the other harness packages currently use — copy from a sibling package rather than choosing your own pins. Stale pins drift from security patches and can desync from the shared bridge runtime; check the current versions at creation time.
3. Create TypeScript, Build, and Test Configs
Copy the nearest existing harness package config files and adjust paths/package names:
tsconfig.jsontsconfig.build.jsontsup.config.tsturbo.jsonvitest.node.config.js
Harness packages currently use Node tests only unless the implementation has a specific reason to add another runtime.
4. Implement the Harness Adapter
Export a factory from <name>-harness.ts and re-export it from src/index.ts.
Use the architecture doc for contract details. At implementation time, verify:
- return a
HarnessV1withspecificationVersion: 'harness-v1'; - use a stable kebab-case
harnessId; - expose adapter-native built-in tools through
builtinTools; - keep construction synchronous and side-effect free;
- use
startOpts.sandboxSessionandstartOpts.sessionWorkDir; never create a separate sandbox; - throw
HarnessCapabilityUnsupportedErrorfrom the method that needs an unsupported runtime capability; - don't hardcode a default model unless the runtime technically requires one — some underlying SDKs have no default of their own. Otherwise pass the model only when the consumer configured one and leave the original SDK's default untouched; keep the session's
modelIdconsistent with what's actually sent (don't report a model the bridge silently overrode); - handle the
toolsandinstructionsthatdoPromptTurn/doContinueTurnmay receive: if the runtime can't take customtools, throwHarnessCapabilityUnsupportedErrorso it's obvious rather than silently dropped; if it has no nativeinstructionsinput, prepend them to the first user message (the Codex/Claude Code workaround); - quote interpolated paths (
workDir, bridge-state dir, …) when building shell commands forsandbox.run/sandbox.spawn— they can contain spaces.
If the runtime needs in-sandbox setup, expose getBootstrap().
5. Implement Runtime-Specific Concerns
Add only the concerns the runtime needs:
- auth resolution — for AI Gateway support, use the central
getAiGatewayAuthFromEnv()helper rather than reading env directly. This ensures bothVERCEL_OIDC_TOKENandAI_GATEWAY_API_KEYare accepted as Gateway credential. When the runtime resolves provider per model, resolve the provider from the model id and set that provider's env; if routing through the gateway, note that base-URL conventions differ per provider (e.g. an Anthropic client appends/v1/messagesto a root base, an OpenAI client appends to a/v1base); - AI Gateway client attribution — follow the convention in existing harness packages: define a versioned client app value such as
ai-sdk/harness-<name>/${VERSION}and use it for Gateway requests. Configure bothUser-Agentandx-client-appheaders when the underlying runtime/SDK supports both; at least one of those two headers is required. If the runtime cannot set arbitrary headers directly, use the runtime-supported equivalent that produces one of those headers (e.g. an SDK client-app environment variable); - custom-tool schema translation — if you convert host tools' JSON Schema into the runtime's tool format, convert recursively (nested objects, array
items, enums, descriptions); a flat top-level-only conversion silently drops the model's structured guidance. Passing the JSON Schema through directly, if the runtime accepts it, avoids the problem; - skill or discovery-file materialization;
- native protocol to harness stream/control translation;
- lifecycle state schema;
- bridge protocol and diagnostics.
Certain structural conventions for harness adapters are being enforced via the konsistent CLI.
Run pnpm konsistent once you're done to check for those. Fix any violations flagged before proceeding.
6. Write Tests
Add focused Node tests for:
- factory metadata and settings;
- auth resolution;
- sandbox usage and path placement;
- host-driven remote operations or bridge protocol behavior;
- prompt/control event translation;
- resume session vs continue turn behavior;
- unsupported capability errors;
- skill materialization, if supported.
Use mocked sandbox sessions and bridge/runtime boundaries where possible. Do not require live provider credentials in unit tests.
getBootstrap() reads the compiled bridge assets (e.g. dist/bridge/index.mjs), which don't exist when tests run against src, so a test that calls it will hit ENOENT. Mock node:fs/promises readFile for the bridge asset paths (see the Codex/OpenCode harness tests for the pattern).
7. Add README
Keep README short:
- package purpose;
- setup command;
- minimal
HarnessAgentusage; - required sandbox capabilities, such as ports for bridge-backed runtimes;
- notable auth configuration.
Link to the main harness docs for broader concepts.
8. Add Examples
Add relevant examples for the new harness.
- Add API/function examples under
examples/ai-functionswhen the harness package needs a scriptable provider-behavior example. - Add interactive examples mirroring the existing harness examples in
examples/harness-e2e-next(Next.js) andexamples/harness-e2e-tui(TUI).
9. Add Documentation
Create documentation in content/providers/02-ai-sdk-harnesses/<next number>-<name>.mdx.
Include:
- Setup instructions
- Required sandbox capabilities
- Authentication configuration
- Harness-specific options
- Usage examples
- Known limitations
Update content/docs/03-ai-sdk-harnesses/05-harness-adapters.mdx to list the new harness when it is ready to be public.
10. Update References and Validate
Run from the workspace root:
pnpm konsistent
pnpm update-references
pnpm --filter @ai-sdk/harness-<name> build
pnpm --filter @ai-sdk/harness-<name> test
pnpm type-check:full
Add a changeset with pnpm changeset. For a brand-new harness package's first release, use major (not the usual patch), matching the other harness packages.
Run relevant harness examples against a live sandbox early — don't rely on unit tests and type-check alone. Runtime API constraints (e.g. unexpected config-option rejections, the exact streaming event names the runtime emits, gateway base-URL format) surface only when the bridge actually drives the runtime, and they're far cheaper to find before the docs/examples are built on top.
Checklist
- Package structure created in
packages/harness-<name> -
package.jsonconfigured with correct dependencies - TypeScript configs set up (
tsconfig.json,tsconfig.build.json) - Build configuration (
tsup.config.ts) - Test configuration (
vitest.node.config.js) - Harness adapter implementation complete
- Runtime placement handled without creating a hidden sandbox
- Bridge assets copied during build, if bridge-backed
- Auth resolution implemented, if needed
- AI Gateway requests include
User-Agentand/orx-client-appclient attribution - Harness infra, skills, bridge code, and secrets kept out of
sessionWorkDir - Session resume and turn continuation tested
- Unit tests written and passing
- README.md written
-
CHANGELOG.mdadded (package heading; required bykonsistent) - Changeset added (
majorfor a first release) - Examples added
- Documentation added in
content/providers/02-ai-sdk-harnesses/ - Harness adapter list updated, if public
- Validated against a live sandbox (not just unit tests / type-check)
-
pnpm update-referencesrun - Package build passing
- Package tests passing
- Type checking passing (
pnpm type-check:fullfrom root) - Relevant examples run successfully
Related Documentation
- Harness Abstraction Architecture
@ai-sdk/harnessREADME- Existing harness packages with similar runtime placement
Frequently asked questions about Add Harness Package
Similar skills
WinMD API Search
Easily find and explore Windows desktop APIs.
WebMCPify
Transform any web app into an agent-ready platform.
Phoenix Tracing
Instrument LLM applications with OpenInference tracing.
Foundry Hosted Agent CopilotKit
Guidance for developing agentic web apps on Azure.
Power Automate Foundation
Connect AI agents to Power Automate seamlessly.
Power Automate Flow Builder
Efficiently build and deploy Power Automate flows programmatically.
