[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-vercel-add-harness-package":3,"mdc--idlax2-key":51,"related-org-vercel-add-harness-package":1871,"related-repo-vercel-add-harness-package":2037},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":46,"sourceUrl":49,"mdContent":50},"add-harness-package","add AI SDK harness packages","Guide for adding new AI SDK harness packages. Use when creating a new @ai-sdk\u002Fharness-\u003Cname> package that adapts a coding-agent runtime to HarnessV1.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"vercel","Vercel","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fvercel.png",[12,14,17,20,23],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Harness","harness",{"name":18,"slug":19,"type":13},"Agents","agents",{"name":21,"slug":22,"type":13},"AI SDK","ai-sdk",{"name":24,"slug":25,"type":13},"SDK","sdk",25670,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fai","2026-06-18T08:29:19.858737",null,4816,[32,33,34,35,36,37,38,39,40,41,42,43,44,8,45],"anthropic","artificial-intelligence","gemini","generative-ai","generative-ui","javascript","language-model","llm","nextjs","openai","react","svelte","typescript","vue",{"repoUrl":27,"stars":26,"forks":30,"topics":47,"description":48},[32,33,34,35,36,37,38,39,40,41,42,43,44,8,45],"The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and agents ","https:\u002F\u002Fgithub.com\u002Fvercel\u002Fai\u002Ftree\u002FHEAD\u002Fskills\u002Fadd-harness-package","---\nname: add-harness-package\ndescription: Guide for adding new AI SDK harness packages. Use when creating a new @ai-sdk\u002Fharness-\u003Cname> package that adapts a coding-agent runtime to HarnessV1.\nmetadata:\n  internal: true\n---\n\n## Adding a New Harness Package\n\nThis guide covers creating a new `@ai-sdk\u002Fharness-\u003Cname>` package for an agent harness.\n\nA 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.\nPrefer host-driven when the runtime supports it.\n\n## First-Party vs Third-Party Harnesses\n\n- **Third-party packages**: Any runtime can publish an external harness package.\n- **First-party `@ai-sdk\u002Fharness-\u003Cname>` packages**: Create an issue first to discuss whether the runtime belongs in this repo.\n\n## Reference Example\n\nSee https:\u002F\u002Fgithub.com\u002Fvercel\u002Fai\u002Fpull\u002F16255\u002Fchanges for a complete example of adding a new harness.\n\n## Harness Architecture\n\nThe AI SDK uses a layered harness architecture following the adapter pattern:\n\n1. **Harness specification** (`@ai-sdk\u002Fharness`): Defines interfaces like `HarnessV1` and `HarnessV1Session`\n2. **Utilities** (`@ai-sdk\u002Fharness\u002Futils`): Shared code for implementing harnesses\n3. **Harness implementations** (`@ai-sdk\u002Fharness-\u003Cname>`): Concrete adapters for harnesses\n4. **Harness agent** (`@ai-sdk\u002Fharness\u002Fagent`): The high-level user-facing `HarnessAgent` API\n\n## Step-by-Step Guide\n\n### 1. Create Package Structure\n\nCreate `packages\u002Fharness-\u003Cname>` with this baseline structure:\n\n```\npackages\u002Fharness-\u003Cname>\u002F\n├── src\u002F\n│   ├── index.ts\n│   ├── \u003Cname>-harness.ts\n│   ├── \u003Cname>-harness.test.ts\n│   └── \u003Cname>-auth.ts              # if the runtime needs auth resolution\n├── package.json\n├── tsconfig.json\n├── tsconfig.build.json\n├── tsup.config.ts\n├── turbo.json\n├── vitest.node.config.js\n└── README.md\n```\n\nIf the runtime must execute inside the sandbox, add bridge files as well:\n\n```\nsrc\u002F\n├── \u003Cname>-bridge-protocol.ts\n├── \u003Cname>-bridge-protocol.test.ts\n└── bridge\u002F\n    ├── index.ts\n    ├── package.json\n    └── pnpm-lock.yaml\n```\n\nAdd a `CHANGELOG.md` containing just the package heading (`# @ai-sdk\u002Fharness-\u003Cname>`). Every package is required to have one.\n\n### 2. Configure package.json\n\nUse existing harness packages as the source of truth for scripts, exports, repository metadata, and publish settings.\n\nRequired package basics:\n\n- `\"name\": \"@ai-sdk\u002Fharness-\u003Cname>\"`\n- `\"type\": \"module\"`\n- `\"version\": \"0.0.0\"` (starting point for new packages)\n- `\"license\": \"Apache-2.0\"`\n- `\"sideEffects\": false`\n- dependency on `@ai-sdk\u002Fharness` via `workspace:*`\n- dependency on `@ai-sdk\u002Fprovider-utils` via `workspace:*` when using sandbox\u002Fauth\u002Fschema utilities\n- runtime SDK\u002FCLI dependencies required by the harness\n- dev dependencies matching existing harness packages\n- `\"engines\": { \"node\": \">=22\" }`\n\nFor bridge packages, add any bridge asset copy step required for files under `src\u002Fbridge\u002F`.\n\nBridge dependency rules (bridge-backed harnesses):\n\n- The bridge's runtime deps live in `src\u002Fbridge\u002Fpackage.json` (installed in-sandbox at bootstrap), not the main package.json. After changing them, regenerate `src\u002Fbridge\u002Fpnpm-lock.yaml` with `pnpm --dir packages\u002Fharness-\u003Cname>\u002Fsrc\u002Fbridge install --lockfile-only --ignore-workspace` (runnable from the repo root).\n- For every third-party import in `src\u002Fbridge\u002F`, keep three things in sync: the import, the `external` array in `tsup.config.ts`, and the dep in `src\u002Fbridge\u002Fpackage.json`. A missing entry shows up only at sandbox runtime as a module-resolution error.\n- Include packages the runtime _lazily_ imports — e.g. provider SDKs (`@anthropic-ai\u002Fsdk`, `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.\n- 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.\n\n### 3. Create TypeScript, Build, and Test Configs\n\nCopy the nearest existing harness package config files and adjust paths\u002Fpackage names:\n\n- `tsconfig.json`\n- `tsconfig.build.json`\n- `tsup.config.ts`\n- `turbo.json`\n- `vitest.node.config.js`\n\nHarness packages currently use Node tests only unless the implementation has a specific reason to add another runtime.\n\n### 4. Implement the Harness Adapter\n\nExport a factory from `\u003Cname>-harness.ts` and re-export it from `src\u002Findex.ts`.\n\nUse the architecture doc for contract details. At implementation time, verify:\n\n- return a `HarnessV1` with `specificationVersion: 'harness-v1'`;\n- use a stable kebab-case `harnessId`;\n- expose adapter-native built-in tools through `builtinTools`;\n- keep construction synchronous and side-effect free;\n- use `startOpts.sandboxSession` and `startOpts.sessionWorkDir`; never create a separate sandbox;\n- throw `HarnessCapabilityUnsupportedError` from the method that needs an unsupported runtime capability;\n- 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 `modelId` consistent with what's actually sent (don't report a model the bridge silently overrode);\n- handle the `tools` and `instructions` that `doPromptTurn`\u002F`doContinueTurn` may receive: if the runtime can't take custom `tools`, throw `HarnessCapabilityUnsupportedError` so it's obvious rather than silently dropped; if it has no native `instructions` input, prepend them to the first user message (the Codex\u002FClaude Code workaround);\n- quote interpolated paths (`workDir`, bridge-state dir, …) when building shell commands for `sandbox.run`\u002F`sandbox.spawn` — they can contain spaces.\n\nIf the runtime needs in-sandbox setup, expose `getBootstrap()`.\n\n### 5. Implement Runtime-Specific Concerns\n\nAdd only the concerns the runtime needs:\n\n- auth resolution — for AI Gateway support, use the central `getAiGatewayAuthFromEnv()` helper rather than reading env directly. This ensures both `VERCEL_OIDC_TOKEN` and `AI_GATEWAY_API_KEY` are 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 `\u002Fv1\u002Fmessages` to a root base, an OpenAI client appends to a `\u002Fv1` base);\n- AI Gateway client attribution — follow the convention in existing harness packages: define a versioned client app value such as `ai-sdk\u002Fharness-\u003Cname>\u002F${VERSION}` and use it for Gateway requests. Configure both `User-Agent` and `x-client-app` headers when the underlying runtime\u002FSDK 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);\n- 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;\n- skill or discovery-file materialization;\n- native protocol to harness stream\u002Fcontrol translation;\n- lifecycle state schema;\n- bridge protocol and diagnostics.\n\nCertain structural conventions for harness adapters are being enforced via the `konsistent` CLI.\nRun `pnpm konsistent` once you're done to check for those. Fix any violations flagged before proceeding.\n\n### 6. Write Tests\n\nAdd focused Node tests for:\n\n- factory metadata and settings;\n- auth resolution;\n- sandbox usage and path placement;\n- host-driven remote operations or bridge protocol behavior;\n- prompt\u002Fcontrol event translation;\n- resume session vs continue turn behavior;\n- unsupported capability errors;\n- skill materialization, if supported.\n\nUse mocked sandbox sessions and bridge\u002Fruntime boundaries where possible. Do not require live provider credentials in unit tests.\n\n`getBootstrap()` reads the _compiled_ bridge assets (e.g. `dist\u002Fbridge\u002Findex.mjs`), which don't exist when tests run against `src`, so a test that calls it will hit `ENOENT`. Mock `node:fs\u002Fpromises` `readFile` for the bridge asset paths (see the Codex\u002FOpenCode harness tests for the pattern).\n\n### 7. Add README\n\nKeep README short:\n\n- package purpose;\n- setup command;\n- minimal `HarnessAgent` usage;\n- required sandbox capabilities, such as ports for bridge-backed runtimes;\n- notable auth configuration.\n\nLink to the main harness docs for broader concepts.\n\n### 8. Add Examples\n\nAdd relevant examples for the new harness.\n\n- Add API\u002Ffunction examples under `examples\u002Fai-functions` when the harness package needs a scriptable provider-behavior example.\n- Add interactive examples mirroring the existing harness examples in `examples\u002Fharness-e2e-next` (Next.js) and `examples\u002Fharness-e2e-tui` (TUI).\n\n### 9. Add Documentation\n\nCreate documentation in `content\u002Fproviders\u002F02-ai-sdk-harnesses\u002F\u003Cnext number>-\u003Cname>.mdx`.\n\nInclude:\n\n- Setup instructions\n- Required sandbox capabilities\n- Authentication configuration\n- Harness-specific options\n- Usage examples\n- Known limitations\n\nUpdate `content\u002Fdocs\u002F03-ai-sdk-harnesses\u002F05-harness-adapters.mdx` to list the new harness when it is ready to be public.\n\n### 10. Update References and Validate\n\nRun from the workspace root:\n\n```bash\npnpm konsistent\npnpm update-references\npnpm --filter @ai-sdk\u002Fharness-\u003Cname> build\npnpm --filter @ai-sdk\u002Fharness-\u003Cname> test\npnpm type-check:full\n```\n\nAdd 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.\n\nRun 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\u002Fexamples are built on top.\n\n## Checklist\n\n- [ ] Package structure created in `packages\u002Fharness-\u003Cname>`\n- [ ] `package.json` configured with correct dependencies\n- [ ] TypeScript configs set up (`tsconfig.json`, `tsconfig.build.json`)\n- [ ] Build configuration (`tsup.config.ts`)\n- [ ] Test configuration (`vitest.node.config.js`)\n- [ ] Harness adapter implementation complete\n- [ ] Runtime placement handled without creating a hidden sandbox\n- [ ] Bridge assets copied during build, if bridge-backed\n- [ ] Auth resolution implemented, if needed\n- [ ] AI Gateway requests include `User-Agent` and\u002For `x-client-app` client attribution\n- [ ] Harness infra, skills, bridge code, and secrets kept out of `sessionWorkDir`\n- [ ] Session resume and turn continuation tested\n- [ ] Unit tests written and passing\n- [ ] README.md written\n- [ ] `CHANGELOG.md` added (package heading; required by `konsistent`)\n- [ ] Changeset added (`major` for a first release)\n- [ ] Examples added\n- [ ] Documentation added in `content\u002Fproviders\u002F02-ai-sdk-harnesses\u002F`\n- [ ] Harness adapter list updated, if public\n- [ ] Validated against a live sandbox (not just unit tests \u002F type-check)\n- [ ] `pnpm update-references` run\n- [ ] Package build passing\n- [ ] Package tests passing\n- [ ] Type checking passing (`pnpm type-check:full` from root)\n- [ ] Relevant examples run successfully\n\n## Related Documentation\n\n- [Harness Abstraction Architecture](..\u002F..\u002Farchitecture\u002Fharness-abstraction.md)\n- [`@ai-sdk\u002Fharness` README](..\u002F..\u002Fpackages\u002Fharness\u002FREADME.md)\n- Existing harness packages with similar runtime placement\n",{"data":52,"body":55},{"name":4,"description":6,"metadata":53},{"internal":54},true,{"type":56,"children":57},"root",[58,67,82,102,108,140,146,161,167,172,266,272,279,292,304,309,318,339,345,350,355,460,473,478,578,584,589,636,641,647,667,672,854,866,872,877,992,1013,1019,1024,1067,1072,1129,1135,1140,1175,1180,1186,1191,1228,1234,1246,1251,1284,1297,1303,1308,1443,1472,1492,1498,1828,1834,1865],{"type":59,"tag":60,"props":61,"children":63},"element","h2",{"id":62},"adding-a-new-harness-package",[64],{"type":65,"value":66},"text","Adding a New Harness Package",{"type":59,"tag":68,"props":69,"children":70},"p",{},[71,73,80],{"type":65,"value":72},"This guide covers creating a new ",{"type":59,"tag":74,"props":75,"children":77},"code",{"className":76},[],[78],{"type":65,"value":79},"@ai-sdk\u002Fharness-\u003Cname>",{"type":65,"value":81}," package for an agent harness.",{"type":59,"tag":68,"props":83,"children":84},{},[85,87,93,95,100],{"type":65,"value":86},"A harness can be ",{"type":59,"tag":88,"props":89,"children":90},"strong",{},[91],{"type":65,"value":92},"host-driven",{"type":65,"value":94},", where the runtime runs in the host process and uses the sandbox remotely, or ",{"type":59,"tag":88,"props":96,"children":97},{},[98],{"type":65,"value":99},"bridge-backed",{"type":65,"value":101},", where a small bridge runs inside the sandbox because the runtime needs local access to the sandbox filesystem or process environment.\nPrefer host-driven when the runtime supports it.",{"type":59,"tag":60,"props":103,"children":105},{"id":104},"first-party-vs-third-party-harnesses",[106],{"type":65,"value":107},"First-Party vs Third-Party Harnesses",{"type":59,"tag":109,"props":110,"children":111},"ul",{},[112,123],{"type":59,"tag":113,"props":114,"children":115},"li",{},[116,121],{"type":59,"tag":88,"props":117,"children":118},{},[119],{"type":65,"value":120},"Third-party packages",{"type":65,"value":122},": Any runtime can publish an external harness package.",{"type":59,"tag":113,"props":124,"children":125},{},[126,138],{"type":59,"tag":88,"props":127,"children":128},{},[129,131,136],{"type":65,"value":130},"First-party ",{"type":59,"tag":74,"props":132,"children":134},{"className":133},[],[135],{"type":65,"value":79},{"type":65,"value":137}," packages",{"type":65,"value":139},": Create an issue first to discuss whether the runtime belongs in this repo.",{"type":59,"tag":60,"props":141,"children":143},{"id":142},"reference-example",[144],{"type":65,"value":145},"Reference Example",{"type":59,"tag":68,"props":147,"children":148},{},[149,151,159],{"type":65,"value":150},"See ",{"type":59,"tag":152,"props":153,"children":157},"a",{"href":154,"rel":155},"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fai\u002Fpull\u002F16255\u002Fchanges",[156],"nofollow",[158],{"type":65,"value":154},{"type":65,"value":160}," for a complete example of adding a new harness.",{"type":59,"tag":60,"props":162,"children":164},{"id":163},"harness-architecture",[165],{"type":65,"value":166},"Harness Architecture",{"type":59,"tag":68,"props":168,"children":169},{},[170],{"type":65,"value":171},"The AI SDK uses a layered harness architecture following the adapter pattern:",{"type":59,"tag":173,"props":174,"children":175},"ol",{},[176,208,225,241],{"type":59,"tag":113,"props":177,"children":178},{},[179,184,186,192,194,200,202],{"type":59,"tag":88,"props":180,"children":181},{},[182],{"type":65,"value":183},"Harness specification",{"type":65,"value":185}," (",{"type":59,"tag":74,"props":187,"children":189},{"className":188},[],[190],{"type":65,"value":191},"@ai-sdk\u002Fharness",{"type":65,"value":193},"): Defines interfaces like ",{"type":59,"tag":74,"props":195,"children":197},{"className":196},[],[198],{"type":65,"value":199},"HarnessV1",{"type":65,"value":201}," and ",{"type":59,"tag":74,"props":203,"children":205},{"className":204},[],[206],{"type":65,"value":207},"HarnessV1Session",{"type":59,"tag":113,"props":209,"children":210},{},[211,216,217,223],{"type":59,"tag":88,"props":212,"children":213},{},[214],{"type":65,"value":215},"Utilities",{"type":65,"value":185},{"type":59,"tag":74,"props":218,"children":220},{"className":219},[],[221],{"type":65,"value":222},"@ai-sdk\u002Fharness\u002Futils",{"type":65,"value":224},"): Shared code for implementing harnesses",{"type":59,"tag":113,"props":226,"children":227},{},[228,233,234,239],{"type":59,"tag":88,"props":229,"children":230},{},[231],{"type":65,"value":232},"Harness implementations",{"type":65,"value":185},{"type":59,"tag":74,"props":235,"children":237},{"className":236},[],[238],{"type":65,"value":79},{"type":65,"value":240},"): Concrete adapters for harnesses",{"type":59,"tag":113,"props":242,"children":243},{},[244,249,250,256,258,264],{"type":59,"tag":88,"props":245,"children":246},{},[247],{"type":65,"value":248},"Harness agent",{"type":65,"value":185},{"type":59,"tag":74,"props":251,"children":253},{"className":252},[],[254],{"type":65,"value":255},"@ai-sdk\u002Fharness\u002Fagent",{"type":65,"value":257},"): The high-level user-facing ",{"type":59,"tag":74,"props":259,"children":261},{"className":260},[],[262],{"type":65,"value":263},"HarnessAgent",{"type":65,"value":265}," API",{"type":59,"tag":60,"props":267,"children":269},{"id":268},"step-by-step-guide",[270],{"type":65,"value":271},"Step-by-Step Guide",{"type":59,"tag":273,"props":274,"children":276},"h3",{"id":275},"_1-create-package-structure",[277],{"type":65,"value":278},"1. Create Package Structure",{"type":59,"tag":68,"props":280,"children":281},{},[282,284,290],{"type":65,"value":283},"Create ",{"type":59,"tag":74,"props":285,"children":287},{"className":286},[],[288],{"type":65,"value":289},"packages\u002Fharness-\u003Cname>",{"type":65,"value":291}," with this baseline structure:",{"type":59,"tag":293,"props":294,"children":298},"pre",{"className":295,"code":297,"language":65},[296],"language-text","packages\u002Fharness-\u003Cname>\u002F\n├── src\u002F\n│   ├── index.ts\n│   ├── \u003Cname>-harness.ts\n│   ├── \u003Cname>-harness.test.ts\n│   └── \u003Cname>-auth.ts              # if the runtime needs auth resolution\n├── package.json\n├── tsconfig.json\n├── tsconfig.build.json\n├── tsup.config.ts\n├── turbo.json\n├── vitest.node.config.js\n└── README.md\n",[299],{"type":59,"tag":74,"props":300,"children":302},{"__ignoreMap":301},"",[303],{"type":65,"value":297},{"type":59,"tag":68,"props":305,"children":306},{},[307],{"type":65,"value":308},"If the runtime must execute inside the sandbox, add bridge files as well:",{"type":59,"tag":293,"props":310,"children":313},{"className":311,"code":312,"language":65},[296],"src\u002F\n├── \u003Cname>-bridge-protocol.ts\n├── \u003Cname>-bridge-protocol.test.ts\n└── bridge\u002F\n    ├── index.ts\n    ├── package.json\n    └── pnpm-lock.yaml\n",[314],{"type":59,"tag":74,"props":315,"children":316},{"__ignoreMap":301},[317],{"type":65,"value":312},{"type":59,"tag":68,"props":319,"children":320},{},[321,323,329,331,337],{"type":65,"value":322},"Add a ",{"type":59,"tag":74,"props":324,"children":326},{"className":325},[],[327],{"type":65,"value":328},"CHANGELOG.md",{"type":65,"value":330}," containing just the package heading (",{"type":59,"tag":74,"props":332,"children":334},{"className":333},[],[335],{"type":65,"value":336},"# @ai-sdk\u002Fharness-\u003Cname>",{"type":65,"value":338},"). Every package is required to have one.",{"type":59,"tag":273,"props":340,"children":342},{"id":341},"_2-configure-packagejson",[343],{"type":65,"value":344},"2. Configure package.json",{"type":59,"tag":68,"props":346,"children":347},{},[348],{"type":65,"value":349},"Use existing harness packages as the source of truth for scripts, exports, repository metadata, and publish settings.",{"type":59,"tag":68,"props":351,"children":352},{},[353],{"type":65,"value":354},"Required package basics:",{"type":59,"tag":109,"props":356,"children":357},{},[358,367,376,387,396,405,423,441,446,451],{"type":59,"tag":113,"props":359,"children":360},{},[361],{"type":59,"tag":74,"props":362,"children":364},{"className":363},[],[365],{"type":65,"value":366},"\"name\": \"@ai-sdk\u002Fharness-\u003Cname>\"",{"type":59,"tag":113,"props":368,"children":369},{},[370],{"type":59,"tag":74,"props":371,"children":373},{"className":372},[],[374],{"type":65,"value":375},"\"type\": \"module\"",{"type":59,"tag":113,"props":377,"children":378},{},[379,385],{"type":59,"tag":74,"props":380,"children":382},{"className":381},[],[383],{"type":65,"value":384},"\"version\": \"0.0.0\"",{"type":65,"value":386}," (starting point for new packages)",{"type":59,"tag":113,"props":388,"children":389},{},[390],{"type":59,"tag":74,"props":391,"children":393},{"className":392},[],[394],{"type":65,"value":395},"\"license\": \"Apache-2.0\"",{"type":59,"tag":113,"props":397,"children":398},{},[399],{"type":59,"tag":74,"props":400,"children":402},{"className":401},[],[403],{"type":65,"value":404},"\"sideEffects\": false",{"type":59,"tag":113,"props":406,"children":407},{},[408,410,415,417],{"type":65,"value":409},"dependency on ",{"type":59,"tag":74,"props":411,"children":413},{"className":412},[],[414],{"type":65,"value":191},{"type":65,"value":416}," via ",{"type":59,"tag":74,"props":418,"children":420},{"className":419},[],[421],{"type":65,"value":422},"workspace:*",{"type":59,"tag":113,"props":424,"children":425},{},[426,427,433,434,439],{"type":65,"value":409},{"type":59,"tag":74,"props":428,"children":430},{"className":429},[],[431],{"type":65,"value":432},"@ai-sdk\u002Fprovider-utils",{"type":65,"value":416},{"type":59,"tag":74,"props":435,"children":437},{"className":436},[],[438],{"type":65,"value":422},{"type":65,"value":440}," when using sandbox\u002Fauth\u002Fschema utilities",{"type":59,"tag":113,"props":442,"children":443},{},[444],{"type":65,"value":445},"runtime SDK\u002FCLI dependencies required by the harness",{"type":59,"tag":113,"props":447,"children":448},{},[449],{"type":65,"value":450},"dev dependencies matching existing harness packages",{"type":59,"tag":113,"props":452,"children":453},{},[454],{"type":59,"tag":74,"props":455,"children":457},{"className":456},[],[458],{"type":65,"value":459},"\"engines\": { \"node\": \">=22\" }",{"type":59,"tag":68,"props":461,"children":462},{},[463,465,471],{"type":65,"value":464},"For bridge packages, add any bridge asset copy step required for files under ",{"type":59,"tag":74,"props":466,"children":468},{"className":467},[],[469],{"type":65,"value":470},"src\u002Fbridge\u002F",{"type":65,"value":472},".",{"type":59,"tag":68,"props":474,"children":475},{},[476],{"type":65,"value":477},"Bridge dependency rules (bridge-backed harnesses):",{"type":59,"tag":109,"props":479,"children":480},{},[481,510,545,573],{"type":59,"tag":113,"props":482,"children":483},{},[484,486,492,494,500,502,508],{"type":65,"value":485},"The bridge's runtime deps live in ",{"type":59,"tag":74,"props":487,"children":489},{"className":488},[],[490],{"type":65,"value":491},"src\u002Fbridge\u002Fpackage.json",{"type":65,"value":493}," (installed in-sandbox at bootstrap), not the main package.json. After changing them, regenerate ",{"type":59,"tag":74,"props":495,"children":497},{"className":496},[],[498],{"type":65,"value":499},"src\u002Fbridge\u002Fpnpm-lock.yaml",{"type":65,"value":501}," with ",{"type":59,"tag":74,"props":503,"children":505},{"className":504},[],[506],{"type":65,"value":507},"pnpm --dir packages\u002Fharness-\u003Cname>\u002Fsrc\u002Fbridge install --lockfile-only --ignore-workspace",{"type":65,"value":509}," (runnable from the repo root).",{"type":59,"tag":113,"props":511,"children":512},{},[513,515,520,522,528,530,536,538,543],{"type":65,"value":514},"For every third-party import in ",{"type":59,"tag":74,"props":516,"children":518},{"className":517},[],[519],{"type":65,"value":470},{"type":65,"value":521},", keep three things in sync: the import, the ",{"type":59,"tag":74,"props":523,"children":525},{"className":524},[],[526],{"type":65,"value":527},"external",{"type":65,"value":529}," array in ",{"type":59,"tag":74,"props":531,"children":533},{"className":532},[],[534],{"type":65,"value":535},"tsup.config.ts",{"type":65,"value":537},", and the dep in ",{"type":59,"tag":74,"props":539,"children":541},{"className":540},[],[542],{"type":65,"value":491},{"type":65,"value":544},". A missing entry shows up only at sandbox runtime as a module-resolution error.",{"type":59,"tag":113,"props":546,"children":547},{},[548,550,556,558,564,566,571],{"type":65,"value":549},"Include packages the runtime ",{"type":59,"tag":551,"props":552,"children":553},"em",{},[554],{"type":65,"value":555},"lazily",{"type":65,"value":557}," imports — e.g. provider SDKs (",{"type":59,"tag":74,"props":559,"children":561},{"className":560},[],[562],{"type":65,"value":563},"@anthropic-ai\u002Fsdk",{"type":65,"value":565},", ",{"type":59,"tag":74,"props":567,"children":569},{"className":568},[],[570],{"type":65,"value":41},{"type":65,"value":572},") 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.",{"type":59,"tag":113,"props":574,"children":575},{},[576],{"type":65,"value":577},"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.",{"type":59,"tag":273,"props":579,"children":581},{"id":580},"_3-create-typescript-build-and-test-configs",[582],{"type":65,"value":583},"3. Create TypeScript, Build, and Test Configs",{"type":59,"tag":68,"props":585,"children":586},{},[587],{"type":65,"value":588},"Copy the nearest existing harness package config files and adjust paths\u002Fpackage names:",{"type":59,"tag":109,"props":590,"children":591},{},[592,601,610,618,627],{"type":59,"tag":113,"props":593,"children":594},{},[595],{"type":59,"tag":74,"props":596,"children":598},{"className":597},[],[599],{"type":65,"value":600},"tsconfig.json",{"type":59,"tag":113,"props":602,"children":603},{},[604],{"type":59,"tag":74,"props":605,"children":607},{"className":606},[],[608],{"type":65,"value":609},"tsconfig.build.json",{"type":59,"tag":113,"props":611,"children":612},{},[613],{"type":59,"tag":74,"props":614,"children":616},{"className":615},[],[617],{"type":65,"value":535},{"type":59,"tag":113,"props":619,"children":620},{},[621],{"type":59,"tag":74,"props":622,"children":624},{"className":623},[],[625],{"type":65,"value":626},"turbo.json",{"type":59,"tag":113,"props":628,"children":629},{},[630],{"type":59,"tag":74,"props":631,"children":633},{"className":632},[],[634],{"type":65,"value":635},"vitest.node.config.js",{"type":59,"tag":68,"props":637,"children":638},{},[639],{"type":65,"value":640},"Harness packages currently use Node tests only unless the implementation has a specific reason to add another runtime.",{"type":59,"tag":273,"props":642,"children":644},{"id":643},"_4-implement-the-harness-adapter",[645],{"type":65,"value":646},"4. Implement the Harness Adapter",{"type":59,"tag":68,"props":648,"children":649},{},[650,652,658,660,666],{"type":65,"value":651},"Export a factory from ",{"type":59,"tag":74,"props":653,"children":655},{"className":654},[],[656],{"type":65,"value":657},"\u003Cname>-harness.ts",{"type":65,"value":659}," and re-export it from ",{"type":59,"tag":74,"props":661,"children":663},{"className":662},[],[664],{"type":65,"value":665},"src\u002Findex.ts",{"type":65,"value":472},{"type":59,"tag":68,"props":668,"children":669},{},[670],{"type":65,"value":671},"Use the architecture doc for contract details. At implementation time, verify:",{"type":59,"tag":109,"props":673,"children":674},{},[675,694,706,718,723,743,756,769,826],{"type":59,"tag":113,"props":676,"children":677},{},[678,680,685,686,692],{"type":65,"value":679},"return a ",{"type":59,"tag":74,"props":681,"children":683},{"className":682},[],[684],{"type":65,"value":199},{"type":65,"value":501},{"type":59,"tag":74,"props":687,"children":689},{"className":688},[],[690],{"type":65,"value":691},"specificationVersion: 'harness-v1'",{"type":65,"value":693},";",{"type":59,"tag":113,"props":695,"children":696},{},[697,699,705],{"type":65,"value":698},"use a stable kebab-case ",{"type":59,"tag":74,"props":700,"children":702},{"className":701},[],[703],{"type":65,"value":704},"harnessId",{"type":65,"value":693},{"type":59,"tag":113,"props":707,"children":708},{},[709,711,717],{"type":65,"value":710},"expose adapter-native built-in tools through ",{"type":59,"tag":74,"props":712,"children":714},{"className":713},[],[715],{"type":65,"value":716},"builtinTools",{"type":65,"value":693},{"type":59,"tag":113,"props":719,"children":720},{},[721],{"type":65,"value":722},"keep construction synchronous and side-effect free;",{"type":59,"tag":113,"props":724,"children":725},{},[726,728,734,735,741],{"type":65,"value":727},"use ",{"type":59,"tag":74,"props":729,"children":731},{"className":730},[],[732],{"type":65,"value":733},"startOpts.sandboxSession",{"type":65,"value":201},{"type":59,"tag":74,"props":736,"children":738},{"className":737},[],[739],{"type":65,"value":740},"startOpts.sessionWorkDir",{"type":65,"value":742},"; never create a separate sandbox;",{"type":59,"tag":113,"props":744,"children":745},{},[746,748,754],{"type":65,"value":747},"throw ",{"type":59,"tag":74,"props":749,"children":751},{"className":750},[],[752],{"type":65,"value":753},"HarnessCapabilityUnsupportedError",{"type":65,"value":755}," from the method that needs an unsupported runtime capability;",{"type":59,"tag":113,"props":757,"children":758},{},[759,761,767],{"type":65,"value":760},"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 ",{"type":59,"tag":74,"props":762,"children":764},{"className":763},[],[765],{"type":65,"value":766},"modelId",{"type":65,"value":768}," consistent with what's actually sent (don't report a model the bridge silently overrode);",{"type":59,"tag":113,"props":770,"children":771},{},[772,774,780,781,787,789,795,797,803,805,810,812,817,819,824],{"type":65,"value":773},"handle the ",{"type":59,"tag":74,"props":775,"children":777},{"className":776},[],[778],{"type":65,"value":779},"tools",{"type":65,"value":201},{"type":59,"tag":74,"props":782,"children":784},{"className":783},[],[785],{"type":65,"value":786},"instructions",{"type":65,"value":788}," that ",{"type":59,"tag":74,"props":790,"children":792},{"className":791},[],[793],{"type":65,"value":794},"doPromptTurn",{"type":65,"value":796},"\u002F",{"type":59,"tag":74,"props":798,"children":800},{"className":799},[],[801],{"type":65,"value":802},"doContinueTurn",{"type":65,"value":804}," may receive: if the runtime can't take custom ",{"type":59,"tag":74,"props":806,"children":808},{"className":807},[],[809],{"type":65,"value":779},{"type":65,"value":811},", throw ",{"type":59,"tag":74,"props":813,"children":815},{"className":814},[],[816],{"type":65,"value":753},{"type":65,"value":818}," so it's obvious rather than silently dropped; if it has no native ",{"type":59,"tag":74,"props":820,"children":822},{"className":821},[],[823],{"type":65,"value":786},{"type":65,"value":825}," input, prepend them to the first user message (the Codex\u002FClaude Code workaround);",{"type":59,"tag":113,"props":827,"children":828},{},[829,831,837,839,845,846,852],{"type":65,"value":830},"quote interpolated paths (",{"type":59,"tag":74,"props":832,"children":834},{"className":833},[],[835],{"type":65,"value":836},"workDir",{"type":65,"value":838},", bridge-state dir, …) when building shell commands for ",{"type":59,"tag":74,"props":840,"children":842},{"className":841},[],[843],{"type":65,"value":844},"sandbox.run",{"type":65,"value":796},{"type":59,"tag":74,"props":847,"children":849},{"className":848},[],[850],{"type":65,"value":851},"sandbox.spawn",{"type":65,"value":853}," — they can contain spaces.",{"type":59,"tag":68,"props":855,"children":856},{},[857,859,865],{"type":65,"value":858},"If the runtime needs in-sandbox setup, expose ",{"type":59,"tag":74,"props":860,"children":862},{"className":861},[],[863],{"type":65,"value":864},"getBootstrap()",{"type":65,"value":472},{"type":59,"tag":273,"props":867,"children":869},{"id":868},"_5-implement-runtime-specific-concerns",[870],{"type":65,"value":871},"5. Implement Runtime-Specific Concerns",{"type":59,"tag":68,"props":873,"children":874},{},[875],{"type":65,"value":876},"Add only the concerns the runtime needs:",{"type":59,"tag":109,"props":878,"children":879},{},[880,924,952,972,977,982,987],{"type":59,"tag":113,"props":881,"children":882},{},[883,885,891,893,899,900,906,908,914,916,922],{"type":65,"value":884},"auth resolution — for AI Gateway support, use the central ",{"type":59,"tag":74,"props":886,"children":888},{"className":887},[],[889],{"type":65,"value":890},"getAiGatewayAuthFromEnv()",{"type":65,"value":892}," helper rather than reading env directly. This ensures both ",{"type":59,"tag":74,"props":894,"children":896},{"className":895},[],[897],{"type":65,"value":898},"VERCEL_OIDC_TOKEN",{"type":65,"value":201},{"type":59,"tag":74,"props":901,"children":903},{"className":902},[],[904],{"type":65,"value":905},"AI_GATEWAY_API_KEY",{"type":65,"value":907}," are 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 ",{"type":59,"tag":74,"props":909,"children":911},{"className":910},[],[912],{"type":65,"value":913},"\u002Fv1\u002Fmessages",{"type":65,"value":915}," to a root base, an OpenAI client appends to a ",{"type":59,"tag":74,"props":917,"children":919},{"className":918},[],[920],{"type":65,"value":921},"\u002Fv1",{"type":65,"value":923}," base);",{"type":59,"tag":113,"props":925,"children":926},{},[927,929,935,937,943,944,950],{"type":65,"value":928},"AI Gateway client attribution — follow the convention in existing harness packages: define a versioned client app value such as ",{"type":59,"tag":74,"props":930,"children":932},{"className":931},[],[933],{"type":65,"value":934},"ai-sdk\u002Fharness-\u003Cname>\u002F${VERSION}",{"type":65,"value":936}," and use it for Gateway requests. Configure both ",{"type":59,"tag":74,"props":938,"children":940},{"className":939},[],[941],{"type":65,"value":942},"User-Agent",{"type":65,"value":201},{"type":59,"tag":74,"props":945,"children":947},{"className":946},[],[948],{"type":65,"value":949},"x-client-app",{"type":65,"value":951}," headers when the underlying runtime\u002FSDK 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);",{"type":59,"tag":113,"props":953,"children":954},{},[955,957,962,964,970],{"type":65,"value":956},"custom-tool schema translation — if you convert host tools' JSON Schema into the runtime's tool format, convert ",{"type":59,"tag":551,"props":958,"children":959},{},[960],{"type":65,"value":961},"recursively",{"type":65,"value":963}," (nested objects, array ",{"type":59,"tag":74,"props":965,"children":967},{"className":966},[],[968],{"type":65,"value":969},"items",{"type":65,"value":971},", 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;",{"type":59,"tag":113,"props":973,"children":974},{},[975],{"type":65,"value":976},"skill or discovery-file materialization;",{"type":59,"tag":113,"props":978,"children":979},{},[980],{"type":65,"value":981},"native protocol to harness stream\u002Fcontrol translation;",{"type":59,"tag":113,"props":983,"children":984},{},[985],{"type":65,"value":986},"lifecycle state schema;",{"type":59,"tag":113,"props":988,"children":989},{},[990],{"type":65,"value":991},"bridge protocol and diagnostics.",{"type":59,"tag":68,"props":993,"children":994},{},[995,997,1003,1005,1011],{"type":65,"value":996},"Certain structural conventions for harness adapters are being enforced via the ",{"type":59,"tag":74,"props":998,"children":1000},{"className":999},[],[1001],{"type":65,"value":1002},"konsistent",{"type":65,"value":1004}," CLI.\nRun ",{"type":59,"tag":74,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":65,"value":1010},"pnpm konsistent",{"type":65,"value":1012}," once you're done to check for those. Fix any violations flagged before proceeding.",{"type":59,"tag":273,"props":1014,"children":1016},{"id":1015},"_6-write-tests",[1017],{"type":65,"value":1018},"6. Write Tests",{"type":59,"tag":68,"props":1020,"children":1021},{},[1022],{"type":65,"value":1023},"Add focused Node tests for:",{"type":59,"tag":109,"props":1025,"children":1026},{},[1027,1032,1037,1042,1047,1052,1057,1062],{"type":59,"tag":113,"props":1028,"children":1029},{},[1030],{"type":65,"value":1031},"factory metadata and settings;",{"type":59,"tag":113,"props":1033,"children":1034},{},[1035],{"type":65,"value":1036},"auth resolution;",{"type":59,"tag":113,"props":1038,"children":1039},{},[1040],{"type":65,"value":1041},"sandbox usage and path placement;",{"type":59,"tag":113,"props":1043,"children":1044},{},[1045],{"type":65,"value":1046},"host-driven remote operations or bridge protocol behavior;",{"type":59,"tag":113,"props":1048,"children":1049},{},[1050],{"type":65,"value":1051},"prompt\u002Fcontrol event translation;",{"type":59,"tag":113,"props":1053,"children":1054},{},[1055],{"type":65,"value":1056},"resume session vs continue turn behavior;",{"type":59,"tag":113,"props":1058,"children":1059},{},[1060],{"type":65,"value":1061},"unsupported capability errors;",{"type":59,"tag":113,"props":1063,"children":1064},{},[1065],{"type":65,"value":1066},"skill materialization, if supported.",{"type":59,"tag":68,"props":1068,"children":1069},{},[1070],{"type":65,"value":1071},"Use mocked sandbox sessions and bridge\u002Fruntime boundaries where possible. Do not require live provider credentials in unit tests.",{"type":59,"tag":68,"props":1073,"children":1074},{},[1075,1080,1082,1087,1089,1095,1097,1103,1105,1111,1113,1119,1121,1127],{"type":59,"tag":74,"props":1076,"children":1078},{"className":1077},[],[1079],{"type":65,"value":864},{"type":65,"value":1081}," reads the ",{"type":59,"tag":551,"props":1083,"children":1084},{},[1085],{"type":65,"value":1086},"compiled",{"type":65,"value":1088}," bridge assets (e.g. ",{"type":59,"tag":74,"props":1090,"children":1092},{"className":1091},[],[1093],{"type":65,"value":1094},"dist\u002Fbridge\u002Findex.mjs",{"type":65,"value":1096},"), which don't exist when tests run against ",{"type":59,"tag":74,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":65,"value":1102},"src",{"type":65,"value":1104},", so a test that calls it will hit ",{"type":59,"tag":74,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":65,"value":1110},"ENOENT",{"type":65,"value":1112},". Mock ",{"type":59,"tag":74,"props":1114,"children":1116},{"className":1115},[],[1117],{"type":65,"value":1118},"node:fs\u002Fpromises",{"type":65,"value":1120}," ",{"type":59,"tag":74,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":65,"value":1126},"readFile",{"type":65,"value":1128}," for the bridge asset paths (see the Codex\u002FOpenCode harness tests for the pattern).",{"type":59,"tag":273,"props":1130,"children":1132},{"id":1131},"_7-add-readme",[1133],{"type":65,"value":1134},"7. Add README",{"type":59,"tag":68,"props":1136,"children":1137},{},[1138],{"type":65,"value":1139},"Keep README short:",{"type":59,"tag":109,"props":1141,"children":1142},{},[1143,1148,1153,1165,1170],{"type":59,"tag":113,"props":1144,"children":1145},{},[1146],{"type":65,"value":1147},"package purpose;",{"type":59,"tag":113,"props":1149,"children":1150},{},[1151],{"type":65,"value":1152},"setup command;",{"type":59,"tag":113,"props":1154,"children":1155},{},[1156,1158,1163],{"type":65,"value":1157},"minimal ",{"type":59,"tag":74,"props":1159,"children":1161},{"className":1160},[],[1162],{"type":65,"value":263},{"type":65,"value":1164}," usage;",{"type":59,"tag":113,"props":1166,"children":1167},{},[1168],{"type":65,"value":1169},"required sandbox capabilities, such as ports for bridge-backed runtimes;",{"type":59,"tag":113,"props":1171,"children":1172},{},[1173],{"type":65,"value":1174},"notable auth configuration.",{"type":59,"tag":68,"props":1176,"children":1177},{},[1178],{"type":65,"value":1179},"Link to the main harness docs for broader concepts.",{"type":59,"tag":273,"props":1181,"children":1183},{"id":1182},"_8-add-examples",[1184],{"type":65,"value":1185},"8. Add Examples",{"type":59,"tag":68,"props":1187,"children":1188},{},[1189],{"type":65,"value":1190},"Add relevant examples for the new harness.",{"type":59,"tag":109,"props":1192,"children":1193},{},[1194,1207],{"type":59,"tag":113,"props":1195,"children":1196},{},[1197,1199,1205],{"type":65,"value":1198},"Add API\u002Ffunction examples under ",{"type":59,"tag":74,"props":1200,"children":1202},{"className":1201},[],[1203],{"type":65,"value":1204},"examples\u002Fai-functions",{"type":65,"value":1206}," when the harness package needs a scriptable provider-behavior example.",{"type":59,"tag":113,"props":1208,"children":1209},{},[1210,1212,1218,1220,1226],{"type":65,"value":1211},"Add interactive examples mirroring the existing harness examples in ",{"type":59,"tag":74,"props":1213,"children":1215},{"className":1214},[],[1216],{"type":65,"value":1217},"examples\u002Fharness-e2e-next",{"type":65,"value":1219}," (Next.js) and ",{"type":59,"tag":74,"props":1221,"children":1223},{"className":1222},[],[1224],{"type":65,"value":1225},"examples\u002Fharness-e2e-tui",{"type":65,"value":1227}," (TUI).",{"type":59,"tag":273,"props":1229,"children":1231},{"id":1230},"_9-add-documentation",[1232],{"type":65,"value":1233},"9. Add Documentation",{"type":59,"tag":68,"props":1235,"children":1236},{},[1237,1239,1245],{"type":65,"value":1238},"Create documentation in ",{"type":59,"tag":74,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":65,"value":1244},"content\u002Fproviders\u002F02-ai-sdk-harnesses\u002F\u003Cnext number>-\u003Cname>.mdx",{"type":65,"value":472},{"type":59,"tag":68,"props":1247,"children":1248},{},[1249],{"type":65,"value":1250},"Include:",{"type":59,"tag":109,"props":1252,"children":1253},{},[1254,1259,1264,1269,1274,1279],{"type":59,"tag":113,"props":1255,"children":1256},{},[1257],{"type":65,"value":1258},"Setup instructions",{"type":59,"tag":113,"props":1260,"children":1261},{},[1262],{"type":65,"value":1263},"Required sandbox capabilities",{"type":59,"tag":113,"props":1265,"children":1266},{},[1267],{"type":65,"value":1268},"Authentication configuration",{"type":59,"tag":113,"props":1270,"children":1271},{},[1272],{"type":65,"value":1273},"Harness-specific options",{"type":59,"tag":113,"props":1275,"children":1276},{},[1277],{"type":65,"value":1278},"Usage examples",{"type":59,"tag":113,"props":1280,"children":1281},{},[1282],{"type":65,"value":1283},"Known limitations",{"type":59,"tag":68,"props":1285,"children":1286},{},[1287,1289,1295],{"type":65,"value":1288},"Update ",{"type":59,"tag":74,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":65,"value":1294},"content\u002Fdocs\u002F03-ai-sdk-harnesses\u002F05-harness-adapters.mdx",{"type":65,"value":1296}," to list the new harness when it is ready to be public.",{"type":59,"tag":273,"props":1298,"children":1300},{"id":1299},"_10-update-references-and-validate",[1301],{"type":65,"value":1302},"10. Update References and Validate",{"type":59,"tag":68,"props":1304,"children":1305},{},[1306],{"type":65,"value":1307},"Run from the workspace root:",{"type":59,"tag":293,"props":1309,"children":1313},{"className":1310,"code":1311,"language":1312,"meta":301,"style":301},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm konsistent\npnpm update-references\npnpm --filter @ai-sdk\u002Fharness-\u003Cname> build\npnpm --filter @ai-sdk\u002Fharness-\u003Cname> test\npnpm type-check:full\n","bash",[1314],{"type":59,"tag":74,"props":1315,"children":1316},{"__ignoreMap":301},[1317,1335,1348,1393,1430],{"type":59,"tag":1318,"props":1319,"children":1322},"span",{"class":1320,"line":1321},"line",1,[1323,1329],{"type":59,"tag":1318,"props":1324,"children":1326},{"style":1325},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1327],{"type":65,"value":1328},"pnpm",{"type":59,"tag":1318,"props":1330,"children":1332},{"style":1331},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1333],{"type":65,"value":1334}," konsistent\n",{"type":59,"tag":1318,"props":1336,"children":1338},{"class":1320,"line":1337},2,[1339,1343],{"type":59,"tag":1318,"props":1340,"children":1341},{"style":1325},[1342],{"type":65,"value":1328},{"type":59,"tag":1318,"props":1344,"children":1345},{"style":1331},[1346],{"type":65,"value":1347}," update-references\n",{"type":59,"tag":1318,"props":1349,"children":1351},{"class":1320,"line":1350},3,[1352,1356,1361,1366,1372,1377,1383,1388],{"type":59,"tag":1318,"props":1353,"children":1354},{"style":1325},[1355],{"type":65,"value":1328},{"type":59,"tag":1318,"props":1357,"children":1358},{"style":1331},[1359],{"type":65,"value":1360}," --filter",{"type":59,"tag":1318,"props":1362,"children":1363},{"style":1331},[1364],{"type":65,"value":1365}," @ai-sdk\u002Fharness-",{"type":59,"tag":1318,"props":1367,"children":1369},{"style":1368},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[1370],{"type":65,"value":1371},"\u003C",{"type":59,"tag":1318,"props":1373,"children":1374},{"style":1331},[1375],{"type":65,"value":1376},"nam",{"type":59,"tag":1318,"props":1378,"children":1380},{"style":1379},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1381],{"type":65,"value":1382},"e",{"type":59,"tag":1318,"props":1384,"children":1385},{"style":1368},[1386],{"type":65,"value":1387},">",{"type":59,"tag":1318,"props":1389,"children":1390},{"style":1331},[1391],{"type":65,"value":1392}," build\n",{"type":59,"tag":1318,"props":1394,"children":1396},{"class":1320,"line":1395},4,[1397,1401,1405,1409,1413,1417,1421,1425],{"type":59,"tag":1318,"props":1398,"children":1399},{"style":1325},[1400],{"type":65,"value":1328},{"type":59,"tag":1318,"props":1402,"children":1403},{"style":1331},[1404],{"type":65,"value":1360},{"type":59,"tag":1318,"props":1406,"children":1407},{"style":1331},[1408],{"type":65,"value":1365},{"type":59,"tag":1318,"props":1410,"children":1411},{"style":1368},[1412],{"type":65,"value":1371},{"type":59,"tag":1318,"props":1414,"children":1415},{"style":1331},[1416],{"type":65,"value":1376},{"type":59,"tag":1318,"props":1418,"children":1419},{"style":1379},[1420],{"type":65,"value":1382},{"type":59,"tag":1318,"props":1422,"children":1423},{"style":1368},[1424],{"type":65,"value":1387},{"type":59,"tag":1318,"props":1426,"children":1427},{"style":1331},[1428],{"type":65,"value":1429}," test\n",{"type":59,"tag":1318,"props":1431,"children":1433},{"class":1320,"line":1432},5,[1434,1438],{"type":59,"tag":1318,"props":1435,"children":1436},{"style":1325},[1437],{"type":65,"value":1328},{"type":59,"tag":1318,"props":1439,"children":1440},{"style":1331},[1441],{"type":65,"value":1442}," type-check:full\n",{"type":59,"tag":68,"props":1444,"children":1445},{},[1446,1448,1454,1456,1462,1464,1470],{"type":65,"value":1447},"Add a changeset with ",{"type":59,"tag":74,"props":1449,"children":1451},{"className":1450},[],[1452],{"type":65,"value":1453},"pnpm changeset",{"type":65,"value":1455},". For a brand-new harness package's first release, use ",{"type":59,"tag":74,"props":1457,"children":1459},{"className":1458},[],[1460],{"type":65,"value":1461},"major",{"type":65,"value":1463}," (not the usual ",{"type":59,"tag":74,"props":1465,"children":1467},{"className":1466},[],[1468],{"type":65,"value":1469},"patch",{"type":65,"value":1471},"), matching the other harness packages.",{"type":59,"tag":68,"props":1473,"children":1474},{},[1475,1477,1482,1484,1490],{"type":65,"value":1476},"Run relevant harness examples against a live sandbox ",{"type":59,"tag":88,"props":1478,"children":1479},{},[1480],{"type":65,"value":1481},"early",{"type":65,"value":1483}," — don't rely on unit tests and ",{"type":59,"tag":74,"props":1485,"children":1487},{"className":1486},[],[1488],{"type":65,"value":1489},"type-check",{"type":65,"value":1491}," 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\u002Fexamples are built on top.",{"type":59,"tag":60,"props":1493,"children":1495},{"id":1494},"checklist",[1496],{"type":65,"value":1497},"Checklist",{"type":59,"tag":109,"props":1499,"children":1502},{"className":1500},[1501],"contains-task-list",[1503,1520,1536,1558,1573,1588,1597,1606,1615,1624,1647,1662,1671,1680,1689,1710,1726,1735,1750,1759,1768,1784,1793,1802,1819],{"type":59,"tag":113,"props":1504,"children":1507},{"className":1505},[1506],"task-list-item",[1508,1513,1515],{"type":59,"tag":1509,"props":1510,"children":1512},"input",{"disabled":54,"type":1511},"checkbox",[],{"type":65,"value":1514}," Package structure created in ",{"type":59,"tag":74,"props":1516,"children":1518},{"className":1517},[],[1519],{"type":65,"value":289},{"type":59,"tag":113,"props":1521,"children":1523},{"className":1522},[1506],[1524,1527,1528,1534],{"type":59,"tag":1509,"props":1525,"children":1526},{"disabled":54,"type":1511},[],{"type":65,"value":1120},{"type":59,"tag":74,"props":1529,"children":1531},{"className":1530},[],[1532],{"type":65,"value":1533},"package.json",{"type":65,"value":1535}," configured with correct dependencies",{"type":59,"tag":113,"props":1537,"children":1539},{"className":1538},[1506],[1540,1543,1545,1550,1551,1556],{"type":59,"tag":1509,"props":1541,"children":1542},{"disabled":54,"type":1511},[],{"type":65,"value":1544}," TypeScript configs set up (",{"type":59,"tag":74,"props":1546,"children":1548},{"className":1547},[],[1549],{"type":65,"value":600},{"type":65,"value":565},{"type":59,"tag":74,"props":1552,"children":1554},{"className":1553},[],[1555],{"type":65,"value":609},{"type":65,"value":1557},")",{"type":59,"tag":113,"props":1559,"children":1561},{"className":1560},[1506],[1562,1565,1567,1572],{"type":59,"tag":1509,"props":1563,"children":1564},{"disabled":54,"type":1511},[],{"type":65,"value":1566}," Build configuration (",{"type":59,"tag":74,"props":1568,"children":1570},{"className":1569},[],[1571],{"type":65,"value":535},{"type":65,"value":1557},{"type":59,"tag":113,"props":1574,"children":1576},{"className":1575},[1506],[1577,1580,1582,1587],{"type":59,"tag":1509,"props":1578,"children":1579},{"disabled":54,"type":1511},[],{"type":65,"value":1581}," Test configuration (",{"type":59,"tag":74,"props":1583,"children":1585},{"className":1584},[],[1586],{"type":65,"value":635},{"type":65,"value":1557},{"type":59,"tag":113,"props":1589,"children":1591},{"className":1590},[1506],[1592,1595],{"type":59,"tag":1509,"props":1593,"children":1594},{"disabled":54,"type":1511},[],{"type":65,"value":1596}," Harness adapter implementation complete",{"type":59,"tag":113,"props":1598,"children":1600},{"className":1599},[1506],[1601,1604],{"type":59,"tag":1509,"props":1602,"children":1603},{"disabled":54,"type":1511},[],{"type":65,"value":1605}," Runtime placement handled without creating a hidden sandbox",{"type":59,"tag":113,"props":1607,"children":1609},{"className":1608},[1506],[1610,1613],{"type":59,"tag":1509,"props":1611,"children":1612},{"disabled":54,"type":1511},[],{"type":65,"value":1614}," Bridge assets copied during build, if bridge-backed",{"type":59,"tag":113,"props":1616,"children":1618},{"className":1617},[1506],[1619,1622],{"type":59,"tag":1509,"props":1620,"children":1621},{"disabled":54,"type":1511},[],{"type":65,"value":1623}," Auth resolution implemented, if needed",{"type":59,"tag":113,"props":1625,"children":1627},{"className":1626},[1506],[1628,1631,1633,1638,1640,1645],{"type":59,"tag":1509,"props":1629,"children":1630},{"disabled":54,"type":1511},[],{"type":65,"value":1632}," AI Gateway requests include ",{"type":59,"tag":74,"props":1634,"children":1636},{"className":1635},[],[1637],{"type":65,"value":942},{"type":65,"value":1639}," and\u002For ",{"type":59,"tag":74,"props":1641,"children":1643},{"className":1642},[],[1644],{"type":65,"value":949},{"type":65,"value":1646}," client attribution",{"type":59,"tag":113,"props":1648,"children":1650},{"className":1649},[1506],[1651,1654,1656],{"type":59,"tag":1509,"props":1652,"children":1653},{"disabled":54,"type":1511},[],{"type":65,"value":1655}," Harness infra, skills, bridge code, and secrets kept out of ",{"type":59,"tag":74,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":65,"value":1661},"sessionWorkDir",{"type":59,"tag":113,"props":1663,"children":1665},{"className":1664},[1506],[1666,1669],{"type":59,"tag":1509,"props":1667,"children":1668},{"disabled":54,"type":1511},[],{"type":65,"value":1670}," Session resume and turn continuation tested",{"type":59,"tag":113,"props":1672,"children":1674},{"className":1673},[1506],[1675,1678],{"type":59,"tag":1509,"props":1676,"children":1677},{"disabled":54,"type":1511},[],{"type":65,"value":1679}," Unit tests written and passing",{"type":59,"tag":113,"props":1681,"children":1683},{"className":1682},[1506],[1684,1687],{"type":59,"tag":1509,"props":1685,"children":1686},{"disabled":54,"type":1511},[],{"type":65,"value":1688}," README.md written",{"type":59,"tag":113,"props":1690,"children":1692},{"className":1691},[1506],[1693,1696,1697,1702,1704,1709],{"type":59,"tag":1509,"props":1694,"children":1695},{"disabled":54,"type":1511},[],{"type":65,"value":1120},{"type":59,"tag":74,"props":1698,"children":1700},{"className":1699},[],[1701],{"type":65,"value":328},{"type":65,"value":1703}," added (package heading; required by ",{"type":59,"tag":74,"props":1705,"children":1707},{"className":1706},[],[1708],{"type":65,"value":1002},{"type":65,"value":1557},{"type":59,"tag":113,"props":1711,"children":1713},{"className":1712},[1506],[1714,1717,1719,1724],{"type":59,"tag":1509,"props":1715,"children":1716},{"disabled":54,"type":1511},[],{"type":65,"value":1718}," Changeset added (",{"type":59,"tag":74,"props":1720,"children":1722},{"className":1721},[],[1723],{"type":65,"value":1461},{"type":65,"value":1725}," for a first release)",{"type":59,"tag":113,"props":1727,"children":1729},{"className":1728},[1506],[1730,1733],{"type":59,"tag":1509,"props":1731,"children":1732},{"disabled":54,"type":1511},[],{"type":65,"value":1734}," Examples added",{"type":59,"tag":113,"props":1736,"children":1738},{"className":1737},[1506],[1739,1742,1744],{"type":59,"tag":1509,"props":1740,"children":1741},{"disabled":54,"type":1511},[],{"type":65,"value":1743}," Documentation added in ",{"type":59,"tag":74,"props":1745,"children":1747},{"className":1746},[],[1748],{"type":65,"value":1749},"content\u002Fproviders\u002F02-ai-sdk-harnesses\u002F",{"type":59,"tag":113,"props":1751,"children":1753},{"className":1752},[1506],[1754,1757],{"type":59,"tag":1509,"props":1755,"children":1756},{"disabled":54,"type":1511},[],{"type":65,"value":1758}," Harness adapter list updated, if public",{"type":59,"tag":113,"props":1760,"children":1762},{"className":1761},[1506],[1763,1766],{"type":59,"tag":1509,"props":1764,"children":1765},{"disabled":54,"type":1511},[],{"type":65,"value":1767}," Validated against a live sandbox (not just unit tests \u002F type-check)",{"type":59,"tag":113,"props":1769,"children":1771},{"className":1770},[1506],[1772,1775,1776,1782],{"type":59,"tag":1509,"props":1773,"children":1774},{"disabled":54,"type":1511},[],{"type":65,"value":1120},{"type":59,"tag":74,"props":1777,"children":1779},{"className":1778},[],[1780],{"type":65,"value":1781},"pnpm update-references",{"type":65,"value":1783}," run",{"type":59,"tag":113,"props":1785,"children":1787},{"className":1786},[1506],[1788,1791],{"type":59,"tag":1509,"props":1789,"children":1790},{"disabled":54,"type":1511},[],{"type":65,"value":1792}," Package build passing",{"type":59,"tag":113,"props":1794,"children":1796},{"className":1795},[1506],[1797,1800],{"type":59,"tag":1509,"props":1798,"children":1799},{"disabled":54,"type":1511},[],{"type":65,"value":1801}," Package tests passing",{"type":59,"tag":113,"props":1803,"children":1805},{"className":1804},[1506],[1806,1809,1811,1817],{"type":59,"tag":1509,"props":1807,"children":1808},{"disabled":54,"type":1511},[],{"type":65,"value":1810}," Type checking passing (",{"type":59,"tag":74,"props":1812,"children":1814},{"className":1813},[],[1815],{"type":65,"value":1816},"pnpm type-check:full",{"type":65,"value":1818}," from root)",{"type":59,"tag":113,"props":1820,"children":1822},{"className":1821},[1506],[1823,1826],{"type":59,"tag":1509,"props":1824,"children":1825},{"disabled":54,"type":1511},[],{"type":65,"value":1827}," Relevant examples run successfully",{"type":59,"tag":60,"props":1829,"children":1831},{"id":1830},"related-documentation",[1832],{"type":65,"value":1833},"Related Documentation",{"type":59,"tag":109,"props":1835,"children":1836},{},[1837,1846,1860],{"type":59,"tag":113,"props":1838,"children":1839},{},[1840],{"type":59,"tag":152,"props":1841,"children":1843},{"href":1842},"..\u002F..\u002Farchitecture\u002Fharness-abstraction.md",[1844],{"type":65,"value":1845},"Harness Abstraction Architecture",{"type":59,"tag":113,"props":1847,"children":1848},{},[1849],{"type":59,"tag":152,"props":1850,"children":1852},{"href":1851},"..\u002F..\u002Fpackages\u002Fharness\u002FREADME.md",[1853,1858],{"type":59,"tag":74,"props":1854,"children":1856},{"className":1855},[],[1857],{"type":65,"value":191},{"type":65,"value":1859}," README",{"type":59,"tag":113,"props":1861,"children":1862},{},[1863],{"type":65,"value":1864},"Existing harness packages with similar runtime placement",{"type":59,"tag":1866,"props":1867,"children":1868},"style",{},[1869],{"type":65,"value":1870},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1872,"total":2036},[1873,1895,1909,1928,1939,1954,1966,1974,1986,2005,2016,2026],{"slug":1874,"name":1874,"fn":1875,"description":1876,"org":1877,"tags":1878,"stars":1892,"repoUrl":1893,"updatedAt":1894},"next-cache-components-adoption","enable and migrate to Next.js Cache Components","Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the `cacheComponents` flag, work through a flood of blocking-prerender \u002F instant validation errors, run the `cache-components-instant-false` codemod, or decide between opting routes out with `export const instant = false` and fixing them in place.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1879,1882,1885,1888,1891],{"name":1880,"slug":1881,"type":13},"Caching","caching",{"name":1883,"slug":1884,"type":13},"Frontend","frontend",{"name":1886,"slug":1887,"type":13},"Migration","migration",{"name":1889,"slug":1890,"type":13},"Next.js","next-js",{"name":9,"slug":8,"type":13},141208,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fnext.js","2026-07-24T05:38:30.118542",{"slug":1896,"name":1896,"fn":1897,"description":1898,"org":1899,"tags":1900,"stars":1892,"repoUrl":1893,"updatedAt":1908},"next-cache-components-optimizer","optimize Next.js cache components","Drive a Next.js route to instant navigation by setting up an agentic loop, under Cache Components \u002F PPR, on initial load (hard navigation) and client-side navigation (soft navigation). Encode the goal as a failing @next\u002Fplaywright instant() e2e and work it to green, one verified route at a time; the shipped test then guards against regression. Use when asked to make a route's navigation instant (its static shell commits immediately), fix a route whose static shell isn't prerendered\u002Fserved\u002Fprefetched, grow a route's static shell or fix its slow first paint, diagnose which Suspense boundary keeps a route out of its static shell, or write the instant() e2e guard for one. Requires Next.js 16.3+ with cacheComponents; directs an upgrade if older.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1901,1902,1903,1904,1907],{"name":1880,"slug":1881,"type":13},{"name":1883,"slug":1884,"type":13},{"name":1889,"slug":1890,"type":13},{"name":1905,"slug":1906,"type":13},"Performance","performance",{"name":9,"slug":8,"type":13},"2026-07-30T05:31:10.674078",{"slug":1910,"name":1910,"fn":1911,"description":1912,"org":1913,"tags":1914,"stars":1892,"repoUrl":1893,"updatedAt":1927},"next-dev-loop","verify Next.js runtime behavior","Verify Next.js runtime behavior after editing app code. Use this skill to confirm a change actually works in a running app — not just that it compiles or type-checks. Combines \u002F_next\u002Fmcp (Next.js's view) with agent-browser (the browser's view). Requires a running `next dev`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1915,1918,1919,1922,1923,1924],{"name":1916,"slug":1917,"type":13},"Debugging","debugging",{"name":1883,"slug":1884,"type":13},{"name":1920,"slug":1921,"type":13},"Local Development","local-development",{"name":1889,"slug":1890,"type":13},{"name":9,"slug":8,"type":13},{"name":1925,"slug":1926,"type":13},"Web Development","web-development","2026-05-22T06:45:28.627735",{"slug":1929,"name":1929,"fn":1930,"description":1931,"org":1932,"tags":1933,"stars":1892,"repoUrl":1893,"updatedAt":1938},"next-partial-prefetching-adoption","adopt Partial Prefetching in Next.js apps","Turn on Partial Prefetching in a Next.js app and work through the insights it surfaces. Use when the user wants to enable or adopt Partial Prefetching, flip the `partialPrefetching` flag, opt routes in with `export const prefetch = 'partial'`, audit `\u003CLink prefetch={true}>` calls, or resolve the link-prefetch-partial and instant-shell-url-data insights.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1934,1935,1936,1937],{"name":1883,"slug":1884,"type":13},{"name":1889,"slug":1890,"type":13},{"name":1905,"slug":1906,"type":13},{"name":9,"slug":8,"type":13},"2026-07-30T05:31:11.591864",{"slug":1940,"name":1940,"fn":1941,"description":1942,"org":1943,"tags":1944,"stars":1951,"repoUrl":1952,"updatedAt":1953},"turborepo","manage monorepos with Turborepo","Turborepo monorepo build system guidance. Triggers on: turbo.json, task pipelines,\ndependsOn, caching, remote cache, the \"turbo\" CLI, --filter, --affected, CI optimization, environment\nvariables, internal packages, monorepo structure\u002Fbest practices, and boundaries.\n\nUse when user: configures tasks\u002Fworkflows\u002Fpipelines, creates packages, sets up\nmonorepo, shares code between apps, runs changed\u002Faffected packages, debugs cache,\nor has apps\u002Fpackages directories.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1945,1948,1949],{"name":1946,"slug":1947,"type":13},"CI\u002FCD","ci-cd",{"name":1905,"slug":1906,"type":13},{"name":1950,"slug":1940,"type":13},"Turborepo",30809,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fturborepo","2026-07-30T05:32:14.920116",{"slug":1955,"name":1955,"fn":1956,"description":1957,"org":1958,"tags":1959,"stars":26,"repoUrl":27,"updatedAt":1965},"add-function-examples","add AI function examples for testing","Guide for adding new AI function examples, for testing specific features against the actual provider APIs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1960,1961,1964],{"name":21,"slug":22,"type":13},{"name":1962,"slug":1963,"type":13},"Testing","testing",{"name":9,"slug":8,"type":13},"2026-04-06T18:55:51.318866",{"slug":4,"name":4,"fn":5,"description":6,"org":1967,"tags":1968,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1969,1970,1971,1972,1973],{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":24,"slug":25,"type":13},{"name":9,"slug":8,"type":13},{"slug":1975,"name":1975,"fn":1976,"description":1977,"org":1978,"tags":1979,"stars":26,"repoUrl":27,"updatedAt":1985},"add-provider-package","add new provider packages to AI SDK","Guide for adding new AI provider packages to the AI SDK. Use when creating a new @ai-sdk\u002F\u003Cprovider> package to integrate an AI service into the SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1980,1981,1984],{"name":21,"slug":22,"type":13},{"name":1982,"slug":1983,"type":13},"API Development","api-development",{"name":9,"slug":8,"type":13},"2026-04-06T18:55:47.45549",{"slug":1987,"name":1987,"fn":1988,"description":1989,"org":1990,"tags":1991,"stars":26,"repoUrl":27,"updatedAt":2004},"adr-skill","create and maintain architecture decision records","Create and maintain Architecture Decision Records (ADRs) optimized for agentic coding workflows. Use when you need to propose, write, update, accept\u002Freject, deprecate, or supersede an ADR; bootstrap an adr folder and index; consult existing ADRs before implementing changes; or enforce ADR conventions. This skill uses Socratic questioning to capture intent before drafting, and validates output against an agent-readiness checklist.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1992,1995,1998,2001],{"name":1993,"slug":1994,"type":13},"ADR","adr",{"name":1996,"slug":1997,"type":13},"Architecture","architecture",{"name":1999,"slug":2000,"type":13},"Documentation","documentation",{"name":2002,"slug":2003,"type":13},"Engineering","engineering","2026-04-06T18:55:50.043694",{"slug":22,"name":22,"fn":2006,"description":2007,"org":2008,"tags":2009,"stars":26,"repoUrl":27,"updatedAt":2015},"build AI features with Vercel AI SDK","Answer questions about the AI SDK and help build AI-powered features. Use when developers: (1) Ask about AI SDK functions like generateText, streamText, ToolLoopAgent, embed, or tools, (2) Want to build AI agents, chatbots, RAG systems, or text generation features, (3) Have questions about AI providers (OpenAI, Anthropic, Google, etc.), streaming, tool calling, structured output, or embeddings, (4) Use React hooks like useChat or useCompletion. Triggers on: \"AI SDK\", \"Vercel AI SDK\", \"generateText\", \"streamText\", \"add AI to my app\", \"build an agent\", \"tool calling\", \"structured output\", \"useChat\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2010,2011,2012,2014],{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":2013,"slug":39,"type":13},"LLM",{"name":9,"slug":8,"type":13},"2026-04-06T18:55:48.739463",{"slug":2017,"name":2017,"fn":2018,"description":2019,"org":2020,"tags":2021,"stars":26,"repoUrl":27,"updatedAt":2025},"capture-api-response-test-fixture","capture API response test fixtures","Capture API response test fixture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2022,2023,2024],{"name":1982,"slug":1983,"type":13},{"name":1962,"slug":1963,"type":13},{"name":9,"slug":8,"type":13},"2026-04-06T18:55:56.374433",{"slug":2027,"name":2027,"fn":2028,"description":2029,"org":2030,"tags":2031,"stars":26,"repoUrl":27,"updatedAt":2035},"develop-ai-functions-example","develop AI SDK function examples","Develop examples for AI SDK functions. Use when creating, running, or modifying examples under examples\u002Fai-functions\u002Fsrc to validate provider support, demonstrate features, or create test fixtures.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2032,2033,2034],{"name":21,"slug":22,"type":13},{"name":1962,"slug":1963,"type":13},{"name":9,"slug":8,"type":13},"2026-04-06T18:55:55.088956",68,{"items":2038,"total":2085},[2039,2045,2053,2059,2066,2073,2079],{"slug":1955,"name":1955,"fn":1956,"description":1957,"org":2040,"tags":2041,"stars":26,"repoUrl":27,"updatedAt":1965},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2042,2043,2044],{"name":21,"slug":22,"type":13},{"name":1962,"slug":1963,"type":13},{"name":9,"slug":8,"type":13},{"slug":4,"name":4,"fn":5,"description":6,"org":2046,"tags":2047,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2048,2049,2050,2051,2052],{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":24,"slug":25,"type":13},{"name":9,"slug":8,"type":13},{"slug":1975,"name":1975,"fn":1976,"description":1977,"org":2054,"tags":2055,"stars":26,"repoUrl":27,"updatedAt":1985},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2056,2057,2058],{"name":21,"slug":22,"type":13},{"name":1982,"slug":1983,"type":13},{"name":9,"slug":8,"type":13},{"slug":1987,"name":1987,"fn":1988,"description":1989,"org":2060,"tags":2061,"stars":26,"repoUrl":27,"updatedAt":2004},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2062,2063,2064,2065],{"name":1993,"slug":1994,"type":13},{"name":1996,"slug":1997,"type":13},{"name":1999,"slug":2000,"type":13},{"name":2002,"slug":2003,"type":13},{"slug":22,"name":22,"fn":2006,"description":2007,"org":2067,"tags":2068,"stars":26,"repoUrl":27,"updatedAt":2015},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2069,2070,2071,2072],{"name":18,"slug":19,"type":13},{"name":21,"slug":22,"type":13},{"name":2013,"slug":39,"type":13},{"name":9,"slug":8,"type":13},{"slug":2017,"name":2017,"fn":2018,"description":2019,"org":2074,"tags":2075,"stars":26,"repoUrl":27,"updatedAt":2025},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2076,2077,2078],{"name":1982,"slug":1983,"type":13},{"name":1962,"slug":1963,"type":13},{"name":9,"slug":8,"type":13},{"slug":2027,"name":2027,"fn":2028,"description":2029,"org":2080,"tags":2081,"stars":26,"repoUrl":27,"updatedAt":2035},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2082,2083,2084],{"name":21,"slug":22,"type":13},{"name":1962,"slug":1963,"type":13},{"name":9,"slug":8,"type":13},12]