coder/ai-sdk

Coder's integrations with the Vercel AI SDK. Run coding agents inside Coder workspaces, and drive Coder Agents from AI SDK code.

Note

All three packages are pre-1.0 and track experimental upstreams (Coder's chat API is experimental). Expect breaking changes.

Packages

Each package is published to npm independently and ships its own README with full install instructions, usage, and API docs.

PackageVersionWhat it does
@coder/ai-sdk-sandboxnpmA sandbox provider for the Vercel AI SDK v7 HarnessAgent. Runs CLI coding agents — Claude Code, Codex — inside a Coder workspace instead of on the local machine, so each agent gets a real, isolated dev environment with your tools, secrets, and network.
@coder/ai-sdk-agentnpmA Vercel AI SDK–compliant Agent (AI SDK v7) backed by Coder Agents, Coder's server-side agent runtime. new CoderAgent() returns a real Agentgenerate(), stream(), tool calls, the whole interface.
@coder/ai-sdk-providernpmA Vercel AI SDK provider that routes generateText / streamText calls through your Coder deployment's AI Gateway. Point it at your deployment with a Coder API token and use any model it proxies — no raw provider keys, with per-user auth and audit.

Experimental: @coder/ai-sdk-effect bridges these packages to Effect (unpublished Phase 1 spike, see #144).

Which package? Need a model (text, streaming, or schema‑constrained structured output) through your deployment → @coder/ai-sdk-provider. Need Coder's server‑side agent (multi‑step tool loop, MCP, workspace file/shell tools) → @coder/ai-sdk-agent. Need to run a CLI coding agent (Claude Code, Codex) inside a workspace → @coder/ai-sdk-sandbox.

Using them together

The packages are independent, but they compose into one application against one deployment, authenticated by one Coder token: provision a workspace with the sandbox package, drive Coder's server-side agent in it with the agent package, then extract a typed result with the provider. The full flow below audits a project's dependencies — the agent works inside the workspace (calling one custom tool that executes in your process), and the provider parses the prose report into a typed object through AI Gateway.

pnpm add @coder/ai-sdk-sandbox @coder/ai-sdk-agent @coder/ai-sdk-provider ai zod
pnpm add @ai-sdk/harness @ai-sdk/provider-utils # peer dependencies of the sandbox packageexport CODER_URL=https://coder.example.com
export CODER_SESSION_TOKEN=$(coder tokens create --name compose-example)export CODER_ORG_ID=<org-uuid># e.g. the first `organization_ids` entry from /api/v2/users/me
import{generateObject,tool}from"ai";import{z}from"zod";import{CoderNativeTransport,ensureCoderWorkspace}from"@coder/ai-sdk-sandbox";import{CoderAgent}from"@coder/ai-sdk-agent";import{createCoder}from"@coder/ai-sdk-provider";// The sandbox transport and the agent both default their connection from the// CODER_URL + CODER_SESSION_TOKEN exported above (explicit `url`/`baseUrl` and// `token` options remain available).// 1. Sandbox: get-or-create a workspace and wait until its agent is ready.// The native transport talks straight to your deployment — no `coder` CLI// or `ssh` on the host. Assumes the template checks out your project.consttransport=newCoderNativeTransport();constws=awaitensureCoderWorkspace({workspace: "dep-audit",create: {template: "docker"},
transport,});if(ws.id===undefined)thrownewError("transport did not report a workspace id");// 2. Agent: drive Coder's server-side agent loop in that workspace. The// server runs the multi-step loop and its file/shell tools; your custom// tool executes here, in this process, and its result is sent back.constagent=newCoderAgent({organizationId: process.env.CODER_ORG_ID!,model: "claude-sonnet-4-6",workspaceId: ws.id,// binds the chat's workspace-scoped toolsinstructions: "Audit the project in the workspace. Use latestVersion to check dependencies.",tools: {latestVersion: tool({description: "Look up the latest published version of an npm package.",inputSchema: z.object({pkg: z.string()}),execute: async({ pkg })=>{constres=awaitfetch(`https://registry.npmjs.org/${encodeURIComponent(pkg)}/latest`);if(!res.ok)return{ pkg,error: `registry returned ${res.status}`};const{ version }=(awaitres.json())as{version: string};return{ pkg, version };},}),},});letreport: string;try{constresult=awaitagent.generate({prompt:
"Read package.json, compare the dependencies against their latest versions, and report on the project's dependency health.",});report=result.text;}finally{awaitagent.archive();// archives the chat; never deletes the workspace}// 3. Provider: schema-constrained extraction through AI Gateway. The provider// takes explicit credentials (its `apiKey` is dual-purpose in BYOK mode).constcoder=createCoder({baseURL: process.env.CODER_URL!,apiKey: process.env.CODER_SESSION_TOKEN!,});const{object: audit}=awaitgenerateObject({model: coder("claude-sonnet-4-6"),schema: z.object({health: z.enum(["good","aging","at-risk"]),outdated: z.array(z.object({pkg: z.string(),current: z.string(),latest: z.string()})),summary: z.string(),}),prompt: `Extract the dependency audit from this report:\n\n${report}`,});console.log(audit.health,audit.summary);console.table(audit.outdated);awaittransport.close();// close cached relay WebSockets on shutdown

Each step stands alone — skip the ones you don't need. For depth on each: ensureCoderWorkspace and workspace creation settings in the sandbox README; custom tools, structured output (when the typed answer must come out of the agent run itself, not a follow-up model call), the workspaces & quota operations guide (fleet sizing, autostop, troubleshooting stuck turns), and the durable-workflow how-to (persisting chatId across job/queue boundaries, drop & timeout recovery) in the agent README; named providers and authentication modes and the enterprise governance & security reference (data flow, credential isolation, audit capture, required permissions) in the provider README.

Contributing

Development setup, the command reference, and how releases work all live in CONTRIBUTING.md. The short version — with mise installed:

mise install && pnpm install # set up the toolchain + dependencies
pnpm check && pnpm test# format check, lint, typecheck, then test

License

Apache-2.0 © Coder Technologies, Inc.

About

Coder's integrations with the Vercel AI SDK

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

coder/ai-sdk

Coder's integrations with the Vercel AI SDK. Run coding agents inside Coder workspaces, and drive Coder Agents from AI SDK code.

Note

All three packages are pre-1.0 and track experimental upstreams (Coder's chat API is experimental). Expect breaking changes.

Packages

Each package is published to npm independently and ships its own README with full install instructions, usage, and API docs.

PackageVersionWhat it does
@coder/ai-sdk-sandboxnpmA sandbox provider for the Vercel AI SDK v7 HarnessAgent. Runs CLI coding agents — Claude Code, Codex — inside a Coder workspace instead of on the local machine, so each agent gets a real, isolated dev environment with your tools, secrets, and network.
@coder/ai-sdk-agentnpmA Vercel AI SDK–compliant Agent (AI SDK v7) backed by Coder Agents, Coder's server-side agent runtime. new CoderAgent() returns a real Agentgenerate(), stream(), tool calls, the whole interface.
@coder/ai-sdk-providernpmA Vercel AI SDK provider that routes generateText / streamText calls through your Coder deployment's AI Gateway. Point it at your deployment with a Coder API token and use any model it proxies — no raw provider keys, with per-user auth and audit.

Experimental: @coder/ai-sdk-effect bridges these packages to Effect (unpublished Phase 1 spike, see #144).

Which package? Need a model (text, streaming, or schema‑constrained structured output) through your deployment → @coder/ai-sdk-provider. Need Coder's server‑side agent (multi‑step tool loop, MCP, workspace file/shell tools) → @coder/ai-sdk-agent. Need to run a CLI coding agent (Claude Code, Codex) inside a workspace → @coder/ai-sdk-sandbox.

Using them together

The packages are independent, but they compose into one application against one deployment, authenticated by one Coder token: provision a workspace with the sandbox package, drive Coder's server-side agent in it with the agent package, then extract a typed result with the provider. The full flow below audits a project's dependencies — the agent works inside the workspace (calling one custom tool that executes in your process), and the provider parses the prose report into a typed object through AI Gateway.

pnpm add @coder/ai-sdk-sandbox @coder/ai-sdk-agent @coder/ai-sdk-provider ai zod
pnpm add @ai-sdk/harness @ai-sdk/provider-utils # peer dependencies of the sandbox packageexport CODER_URL=https://coder.example.com
export CODER_SESSION_TOKEN=$(coder tokens create --name compose-example)export CODER_ORG_ID=<org-uuid># e.g. the first `organization_ids` entry from /api/v2/users/me
import{generateObject,tool}from"ai";import{z}from"zod";import{CoderNativeTransport,ensureCoderWorkspace}from"@coder/ai-sdk-sandbox";import{CoderAgent}from"@coder/ai-sdk-agent";import{createCoder}from"@coder/ai-sdk-provider";// The sandbox transport and the agent both default their connection from the// CODER_URL + CODER_SESSION_TOKEN exported above (explicit `url`/`baseUrl` and// `token` options remain available).// 1. Sandbox: get-or-create a workspace and wait until its agent is ready.// The native transport talks straight to your deployment — no `coder` CLI// or `ssh` on the host. Assumes the template checks out your project.consttransport=newCoderNativeTransport();constws=awaitensureCoderWorkspace({workspace: "dep-audit",create: {template: "docker"},
transport,});if(ws.id===undefined)thrownewError("transport did not report a workspace id");// 2. Agent: drive Coder's server-side agent loop in that workspace. The// server runs the multi-step loop and its file/shell tools; your custom// tool executes here, in this process, and its result is sent back.constagent=newCoderAgent({organizationId: process.env.CODER_ORG_ID!,model: "claude-sonnet-4-6",workspaceId: ws.id,// binds the chat's workspace-scoped toolsinstructions: "Audit the project in the workspace. Use latestVersion to check dependencies.",tools: {latestVersion: tool({description: "Look up the latest published version of an npm package.",inputSchema: z.object({pkg: z.string()}),execute: async({ pkg })=>{constres=awaitfetch(`https://registry.npmjs.org/${encodeURIComponent(pkg)}/latest`);if(!res.ok)return{ pkg,error: `registry returned ${res.status}`};const{ version }=(awaitres.json())as{version: string};return{ pkg, version };},}),},});letreport: string;try{constresult=awaitagent.generate({prompt:
"Read package.json, compare the dependencies against their latest versions, and report on the project's dependency health.",});report=result.text;}finally{awaitagent.archive();// archives the chat; never deletes the workspace}// 3. Provider: schema-constrained extraction through AI Gateway. The provider// takes explicit credentials (its `apiKey` is dual-purpose in BYOK mode).constcoder=createCoder({baseURL: process.env.CODER_URL!,apiKey: process.env.CODER_SESSION_TOKEN!,});const{object: audit}=awaitgenerateObject({model: coder("claude-sonnet-4-6"),schema: z.object({health: z.enum(["good","aging","at-risk"]),outdated: z.array(z.object({pkg: z.string(),current: z.string(),latest: z.string()})),summary: z.string(),}),prompt: `Extract the dependency audit from this report:\n\n${report}`,});console.log(audit.health,audit.summary);console.table(audit.outdated);awaittransport.close();// close cached relay WebSockets on shutdown

Each step stands alone — skip the ones you don't need. For depth on each: ensureCoderWorkspace and workspace creation settings in the sandbox README; custom tools, structured output (when the typed answer must come out of the agent run itself, not a follow-up model call), the workspaces & quota operations guide (fleet sizing, autostop, troubleshooting stuck turns), and the durable-workflow how-to (persisting chatId across job/queue boundaries, drop & timeout recovery) in the agent README; named providers and authentication modes and the enterprise governance & security reference (data flow, credential isolation, audit capture, required permissions) in the provider README.

Contributing

Development setup, the command reference, and how releases work all live in CONTRIBUTING.md. The short version — with mise installed:

mise install && pnpm install # set up the toolchain + dependencies
pnpm check && pnpm test# format check, lint, typecheck, then test

License

Apache-2.0 © Coder Technologies, Inc.

About

Coder's integrations with the Vercel AI SDK

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

coder/ai-sdk

Coder's integrations with the Vercel AI SDK. Run coding agents inside Coder workspaces, and drive Coder Agents from AI SDK code.

Note

All three packages are pre-1.0 and track experimental upstreams (Coder's chat API is experimental). Expect breaking changes.

Packages

Each package is published to npm independently and ships its own README with full install instructions, usage, and API docs.

PackageVersionWhat it does
@coder/ai-sdk-sandboxnpmA sandbox provider for the Vercel AI SDK v7 HarnessAgent. Runs CLI coding agents — Claude Code, Codex — inside a Coder workspace instead of on the local machine, so each agent gets a real, isolated dev environment with your tools, secrets, and network.
@coder/ai-sdk-agentnpmA Vercel AI SDK–compliant Agent (AI SDK v7) backed by Coder Agents, Coder's server-side agent runtime. new CoderAgent() returns a real Agentgenerate(), stream(), tool calls, the whole interface.
@coder/ai-sdk-providernpmA Vercel AI SDK provider that routes generateText / streamText calls through your Coder deployment's AI Gateway. Point it at your deployment with a Coder API token and use any model it proxies — no raw provider keys, with per-user auth and audit.

Experimental: @coder/ai-sdk-effect bridges these packages to Effect (unpublished Phase 1 spike, see #144).

Which package? Need a model (text, streaming, or schema‑constrained structured output) through your deployment → @coder/ai-sdk-provider. Need Coder's server‑side agent (multi‑step tool loop, MCP, workspace file/shell tools) → @coder/ai-sdk-agent. Need to run a CLI coding agent (Claude Code, Codex) inside a workspace → @coder/ai-sdk-sandbox.

Using them together

The packages are independent, but they compose into one application against one deployment, authenticated by one Coder token: provision a workspace with the sandbox package, drive Coder's server-side agent in it with the agent package, then extract a typed result with the provider. The full flow below audits a project's dependencies — the agent works inside the workspace (calling one custom tool that executes in your process), and the provider parses the prose report into a typed object through AI Gateway.

pnpm add @coder/ai-sdk-sandbox @coder/ai-sdk-agent @coder/ai-sdk-provider ai zod
pnpm add @ai-sdk/harness @ai-sdk/provider-utils # peer dependencies of the sandbox packageexport CODER_URL=https://coder.example.com
export CODER_SESSION_TOKEN=$(coder tokens create --name compose-example)export CODER_ORG_ID=<org-uuid># e.g. the first `organization_ids` entry from /api/v2/users/me
import{generateObject,tool}from"ai";import{z}from"zod";import{CoderNativeTransport,ensureCoderWorkspace}from"@coder/ai-sdk-sandbox";import{CoderAgent}from"@coder/ai-sdk-agent";import{createCoder}from"@coder/ai-sdk-provider";// The sandbox transport and the agent both default their connection from the// CODER_URL + CODER_SESSION_TOKEN exported above (explicit `url`/`baseUrl` and// `token` options remain available).// 1. Sandbox: get-or-create a workspace and wait until its agent is ready.// The native transport talks straight to your deployment — no `coder` CLI// or `ssh` on the host. Assumes the template checks out your project.consttransport=newCoderNativeTransport();constws=awaitensureCoderWorkspace({workspace: "dep-audit",create: {template: "docker"},
transport,});if(ws.id===undefined)thrownewError("transport did not report a workspace id");// 2. Agent: drive Coder's server-side agent loop in that workspace. The// server runs the multi-step loop and its file/shell tools; your custom// tool executes here, in this process, and its result is sent back.constagent=newCoderAgent({organizationId: process.env.CODER_ORG_ID!,model: "claude-sonnet-4-6",workspaceId: ws.id,// binds the chat's workspace-scoped toolsinstructions: "Audit the project in the workspace. Use latestVersion to check dependencies.",tools: {latestVersion: tool({description: "Look up the latest published version of an npm package.",inputSchema: z.object({pkg: z.string()}),execute: async({ pkg })=>{constres=awaitfetch(`https://registry.npmjs.org/${encodeURIComponent(pkg)}/latest`);if(!res.ok)return{ pkg,error: `registry returned ${res.status}`};const{ version }=(awaitres.json())as{version: string};return{ pkg, version };},}),},});letreport: string;try{constresult=awaitagent.generate({prompt:
"Read package.json, compare the dependencies against their latest versions, and report on the project's dependency health.",});report=result.text;}finally{awaitagent.archive();// archives the chat; never deletes the workspace}// 3. Provider: schema-constrained extraction through AI Gateway. The provider// takes explicit credentials (its `apiKey` is dual-purpose in BYOK mode).constcoder=createCoder({baseURL: process.env.CODER_URL!,apiKey: process.env.CODER_SESSION_TOKEN!,});const{object: audit}=awaitgenerateObject({model: coder("claude-sonnet-4-6"),schema: z.object({health: z.enum(["good","aging","at-risk"]),outdated: z.array(z.object({pkg: z.string(),current: z.string(),latest: z.string()})),summary: z.string(),}),prompt: `Extract the dependency audit from this report:\n\n${report}`,});console.log(audit.health,audit.summary);console.table(audit.outdated);awaittransport.close();// close cached relay WebSockets on shutdown

Each step stands alone — skip the ones you don't need. For depth on each: ensureCoderWorkspace and workspace creation settings in the sandbox README; custom tools, structured output (when the typed answer must come out of the agent run itself, not a follow-up model call), the workspaces & quota operations guide (fleet sizing, autostop, troubleshooting stuck turns), and the durable-workflow how-to (persisting chatId across job/queue boundaries, drop & timeout recovery) in the agent README; named providers and authentication modes and the enterprise governance & security reference (data flow, credential isolation, audit capture, required permissions) in the provider README.

Contributing

Development setup, the command reference, and how releases work all live in CONTRIBUTING.md. The short version — with mise installed:

mise install && pnpm install # set up the toolchain + dependencies
pnpm check && pnpm test# format check, lint, typecheck, then test

License

Apache-2.0 © Coder Technologies, Inc.

About

Coder's integrations with the Vercel AI SDK

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

coder/ai-sdk

Coder's integrations with the Vercel AI SDK. Run coding agents inside Coder workspaces, and drive Coder Agents from AI SDK code.

Note

All three packages are pre-1.0 and track experimental upstreams (Coder's chat API is experimental). Expect breaking changes.

Packages

Each package is published to npm independently and ships its own README with full install instructions, usage, and API docs.

PackageVersionWhat it does
@coder/ai-sdk-sandboxnpmA sandbox provider for the Vercel AI SDK v7 HarnessAgent. Runs CLI coding agents — Claude Code, Codex — inside a Coder workspace instead of on the local machine, so each agent gets a real, isolated dev environment with your tools, secrets, and network.
@coder/ai-sdk-agentnpmA Vercel AI SDK–compliant Agent (AI SDK v7) backed by Coder Agents, Coder's server-side agent runtime. new CoderAgent() returns a real Agentgenerate(), stream(), tool calls, the whole interface.
@coder/ai-sdk-providernpmA Vercel AI SDK provider that routes generateText / streamText calls through your Coder deployment's AI Gateway. Point it at your deployment with a Coder API token and use any model it proxies — no raw provider keys, with per-user auth and audit.

Experimental: @coder/ai-sdk-effect bridges these packages to Effect (unpublished Phase 1 spike, see #144).

Which package? Need a model (text, streaming, or schema‑constrained structured output) through your deployment → @coder/ai-sdk-provider. Need Coder's server‑side agent (multi‑step tool loop, MCP, workspace file/shell tools) → @coder/ai-sdk-agent. Need to run a CLI coding agent (Claude Code, Codex) inside a workspace → @coder/ai-sdk-sandbox.

Using them together

The packages are independent, but they compose into one application against one deployment, authenticated by one Coder token: provision a workspace with the sandbox package, drive Coder's server-side agent in it with the agent package, then extract a typed result with the provider. The full flow below audits a project's dependencies — the agent works inside the workspace (calling one custom tool that executes in your process), and the provider parses the prose report into a typed object through AI Gateway.

pnpm add @coder/ai-sdk-sandbox @coder/ai-sdk-agent @coder/ai-sdk-provider ai zod
pnpm add @ai-sdk/harness @ai-sdk/provider-utils # peer dependencies of the sandbox packageexport CODER_URL=https://coder.example.com
export CODER_SESSION_TOKEN=$(coder tokens create --name compose-example)export CODER_ORG_ID=<org-uuid># e.g. the first `organization_ids` entry from /api/v2/users/me
import{generateObject,tool}from"ai";import{z}from"zod";import{CoderNativeTransport,ensureCoderWorkspace}from"@coder/ai-sdk-sandbox";import{CoderAgent}from"@coder/ai-sdk-agent";import{createCoder}from"@coder/ai-sdk-provider";// The sandbox transport and the agent both default their connection from the// CODER_URL + CODER_SESSION_TOKEN exported above (explicit `url`/`baseUrl` and// `token` options remain available).// 1. Sandbox: get-or-create a workspace and wait until its agent is ready.// The native transport talks straight to your deployment — no `coder` CLI// or `ssh` on the host. Assumes the template checks out your project.consttransport=newCoderNativeTransport();constws=awaitensureCoderWorkspace({workspace: "dep-audit",create: {template: "docker"},
transport,});if(ws.id===undefined)thrownewError("transport did not report a workspace id");// 2. Agent: drive Coder's server-side agent loop in that workspace. The// server runs the multi-step loop and its file/shell tools; your custom// tool executes here, in this process, and its result is sent back.constagent=newCoderAgent({organizationId: process.env.CODER_ORG_ID!,model: "claude-sonnet-4-6",workspaceId: ws.id,// binds the chat's workspace-scoped toolsinstructions: "Audit the project in the workspace. Use latestVersion to check dependencies.",tools: {latestVersion: tool({description: "Look up the latest published version of an npm package.",inputSchema: z.object({pkg: z.string()}),execute: async({ pkg })=>{constres=awaitfetch(`https://registry.npmjs.org/${encodeURIComponent(pkg)}/latest`);if(!res.ok)return{ pkg,error: `registry returned ${res.status}`};const{ version }=(awaitres.json())as{version: string};return{ pkg, version };},}),},});letreport: string;try{constresult=awaitagent.generate({prompt:
"Read package.json, compare the dependencies against their latest versions, and report on the project's dependency health.",});report=result.text;}finally{awaitagent.archive();// archives the chat; never deletes the workspace}// 3. Provider: schema-constrained extraction through AI Gateway. The provider// takes explicit credentials (its `apiKey` is dual-purpose in BYOK mode).constcoder=createCoder({baseURL: process.env.CODER_URL!,apiKey: process.env.CODER_SESSION_TOKEN!,});const{object: audit}=awaitgenerateObject({model: coder("claude-sonnet-4-6"),schema: z.object({health: z.enum(["good","aging","at-risk"]),outdated: z.array(z.object({pkg: z.string(),current: z.string(),latest: z.string()})),summary: z.string(),}),prompt: `Extract the dependency audit from this report:\n\n${report}`,});console.log(audit.health,audit.summary);console.table(audit.outdated);awaittransport.close();// close cached relay WebSockets on shutdown

Each step stands alone — skip the ones you don't need. For depth on each: ensureCoderWorkspace and workspace creation settings in the sandbox README; custom tools, structured output (when the typed answer must come out of the agent run itself, not a follow-up model call), the workspaces & quota operations guide (fleet sizing, autostop, troubleshooting stuck turns), and the durable-workflow how-to (persisting chatId across job/queue boundaries, drop & timeout recovery) in the agent README; named providers and authentication modes and the enterprise governance & security reference (data flow, credential isolation, audit capture, required permissions) in the provider README.

Contributing

Development setup, the command reference, and how releases work all live in CONTRIBUTING.md. The short version — with mise installed:

mise install && pnpm install # set up the toolchain + dependencies
pnpm check && pnpm test# format check, lint, typecheck, then test

License

Apache-2.0 © Coder Technologies, Inc.

About

Coder's integrations with the Vercel AI SDK

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

coder/ai-sdk

Coder's integrations with the Vercel AI SDK. Run coding agents inside Coder workspaces, and drive Coder Agents from AI SDK code.

Note

All three packages are pre-1.0 and track experimental upstreams (Coder's chat API is experimental). Expect breaking changes.

Packages

Each package is published to npm independently and ships its own README with full install instructions, usage, and API docs.

PackageVersionWhat it does
@coder/ai-sdk-sandboxnpmA sandbox provider for the Vercel AI SDK v7 HarnessAgent. Runs CLI coding agents — Claude Code, Codex — inside a Coder workspace instead of on the local machine, so each agent gets a real, isolated dev environment with your tools, secrets, and network.
@coder/ai-sdk-agentnpmA Vercel AI SDK–compliant Agent (AI SDK v7) backed by Coder Agents, Coder's server-side agent runtime. new CoderAgent() returns a real Agentgenerate(), stream(), tool calls, the whole interface.
@coder/ai-sdk-providernpmA Vercel AI SDK provider that routes generateText / streamText calls through your Coder deployment's AI Gateway. Point it at your deployment with a Coder API token and use any model it proxies — no raw provider keys, with per-user auth and audit.

Experimental: @coder/ai-sdk-effect bridges these packages to Effect (unpublished Phase 1 spike, see #144).

Which package? Need a model (text, streaming, or schema‑constrained structured output) through your deployment → @coder/ai-sdk-provider. Need Coder's server‑side agent (multi‑step tool loop, MCP, workspace file/shell tools) → @coder/ai-sdk-agent. Need to run a CLI coding agent (Claude Code, Codex) inside a workspace → @coder/ai-sdk-sandbox.

Using them together

The packages are independent, but they compose into one application against one deployment, authenticated by one Coder token: provision a workspace with the sandbox package, drive Coder's server-side agent in it with the agent package, then extract a typed result with the provider. The full flow below audits a project's dependencies — the agent works inside the workspace (calling one custom tool that executes in your process), and the provider parses the prose report into a typed object through AI Gateway.

pnpm add @coder/ai-sdk-sandbox @coder/ai-sdk-agent @coder/ai-sdk-provider ai zod
pnpm add @ai-sdk/harness @ai-sdk/provider-utils # peer dependencies of the sandbox packageexport CODER_URL=https://coder.example.com
export CODER_SESSION_TOKEN=$(coder tokens create --name compose-example)export CODER_ORG_ID=<org-uuid># e.g. the first `organization_ids` entry from /api/v2/users/me
import{generateObject,tool}from"ai";import{z}from"zod";import{CoderNativeTransport,ensureCoderWorkspace}from"@coder/ai-sdk-sandbox";import{CoderAgent}from"@coder/ai-sdk-agent";import{createCoder}from"@coder/ai-sdk-provider";// The sandbox transport and the agent both default their connection from the// CODER_URL + CODER_SESSION_TOKEN exported above (explicit `url`/`baseUrl` and// `token` options remain available).// 1. Sandbox: get-or-create a workspace and wait until its agent is ready.// The native transport talks straight to your deployment — no `coder` CLI// or `ssh` on the host. Assumes the template checks out your project.consttransport=newCoderNativeTransport();constws=awaitensureCoderWorkspace({workspace: "dep-audit",create: {template: "docker"},
transport,});if(ws.id===undefined)thrownewError("transport did not report a workspace id");// 2. Agent: drive Coder's server-side agent loop in that workspace. The// server runs the multi-step loop and its file/shell tools; your custom// tool executes here, in this process, and its result is sent back.constagent=newCoderAgent({organizationId: process.env.CODER_ORG_ID!,model: "claude-sonnet-4-6",workspaceId: ws.id,// binds the chat's workspace-scoped toolsinstructions: "Audit the project in the workspace. Use latestVersion to check dependencies.",tools: {latestVersion: tool({description: "Look up the latest published version of an npm package.",inputSchema: z.object({pkg: z.string()}),execute: async({ pkg })=>{constres=awaitfetch(`https://registry.npmjs.org/${encodeURIComponent(pkg)}/latest`);if(!res.ok)return{ pkg,error: `registry returned ${res.status}`};const{ version }=(awaitres.json())as{version: string};return{ pkg, version };},}),},});letreport: string;try{constresult=awaitagent.generate({prompt:
"Read package.json, compare the dependencies against their latest versions, and report on the project's dependency health.",});report=result.text;}finally{awaitagent.archive();// archives the chat; never deletes the workspace}// 3. Provider: schema-constrained extraction through AI Gateway. The provider// takes explicit credentials (its `apiKey` is dual-purpose in BYOK mode).constcoder=createCoder({baseURL: process.env.CODER_URL!,apiKey: process.env.CODER_SESSION_TOKEN!,});const{object: audit}=awaitgenerateObject({model: coder("claude-sonnet-4-6"),schema: z.object({health: z.enum(["good","aging","at-risk"]),outdated: z.array(z.object({pkg: z.string(),current: z.string(),latest: z.string()})),summary: z.string(),}),prompt: `Extract the dependency audit from this report:\n\n${report}`,});console.log(audit.health,audit.summary);console.table(audit.outdated);awaittransport.close();// close cached relay WebSockets on shutdown

Each step stands alone — skip the ones you don't need. For depth on each: ensureCoderWorkspace and workspace creation settings in the sandbox README; custom tools, structured output (when the typed answer must come out of the agent run itself, not a follow-up model call), the workspaces & quota operations guide (fleet sizing, autostop, troubleshooting stuck turns), and the durable-workflow how-to (persisting chatId across job/queue boundaries, drop & timeout recovery) in the agent README; named providers and authentication modes and the enterprise governance & security reference (data flow, credential isolation, audit capture, required permissions) in the provider README.

Contributing

Development setup, the command reference, and how releases work all live in CONTRIBUTING.md. The short version — with mise installed:

mise install && pnpm install # set up the toolchain + dependencies
pnpm check && pnpm test# format check, lint, typecheck, then test

License

Apache-2.0 © Coder Technologies, Inc.

About

Coder's integrations with the Vercel AI SDK

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

coder/ai-sdk

Coder's integrations with the Vercel AI SDK. Run coding agents inside Coder workspaces, and drive Coder Agents from AI SDK code.

Note

All three packages are pre-1.0 and track experimental upstreams (Coder's chat API is experimental). Expect breaking changes.

Packages

Each package is published to npm independently and ships its own README with full install instructions, usage, and API docs.

PackageVersionWhat it does
@coder/ai-sdk-sandboxnpmA sandbox provider for the Vercel AI SDK v7 HarnessAgent. Runs CLI coding agents — Claude Code, Codex — inside a Coder workspace instead of on the local machine, so each agent gets a real, isolated dev environment with your tools, secrets, and network.
@coder/ai-sdk-agentnpmA Vercel AI SDK–compliant Agent (AI SDK v7) backed by Coder Agents, Coder's server-side agent runtime. new CoderAgent() returns a real Agentgenerate(), stream(), tool calls, the whole interface.
@coder/ai-sdk-providernpmA Vercel AI SDK provider that routes generateText / streamText calls through your Coder deployment's AI Gateway. Point it at your deployment with a Coder API token and use any model it proxies — no raw provider keys, with per-user auth and audit.

Experimental: @coder/ai-sdk-effect bridges these packages to Effect (unpublished Phase 1 spike, see #144).

Which package? Need a model (text, streaming, or schema‑constrained structured output) through your deployment → @coder/ai-sdk-provider. Need Coder's server‑side agent (multi‑step tool loop, MCP, workspace file/shell tools) → @coder/ai-sdk-agent. Need to run a CLI coding agent (Claude Code, Codex) inside a workspace → @coder/ai-sdk-sandbox.

Using them together

The packages are independent, but they compose into one application against one deployment, authenticated by one Coder token: provision a workspace with the sandbox package, drive Coder's server-side agent in it with the agent package, then extract a typed result with the provider. The full flow below audits a project's dependencies — the agent works inside the workspace (calling one custom tool that executes in your process), and the provider parses the prose report into a typed object through AI Gateway.

pnpm add @coder/ai-sdk-sandbox @coder/ai-sdk-agent @coder/ai-sdk-provider ai zod
pnpm add @ai-sdk/harness @ai-sdk/provider-utils # peer dependencies of the sandbox packageexport CODER_URL=https://coder.example.com
export CODER_SESSION_TOKEN=$(coder tokens create --name compose-example)export CODER_ORG_ID=<org-uuid># e.g. the first `organization_ids` entry from /api/v2/users/me
import{generateObject,tool}from"ai";import{z}from"zod";import{CoderNativeTransport,ensureCoderWorkspace}from"@coder/ai-sdk-sandbox";import{CoderAgent}from"@coder/ai-sdk-agent";import{createCoder}from"@coder/ai-sdk-provider";// The sandbox transport and the agent both default their connection from the// CODER_URL + CODER_SESSION_TOKEN exported above (explicit `url`/`baseUrl` and// `token` options remain available).// 1. Sandbox: get-or-create a workspace and wait until its agent is ready.// The native transport talks straight to your deployment — no `coder` CLI// or `ssh` on the host. Assumes the template checks out your project.consttransport=newCoderNativeTransport();constws=awaitensureCoderWorkspace({workspace: "dep-audit",create: {template: "docker"},
transport,});if(ws.id===undefined)thrownewError("transport did not report a workspace id");// 2. Agent: drive Coder's server-side agent loop in that workspace. The// server runs the multi-step loop and its file/shell tools; your custom// tool executes here, in this process, and its result is sent back.constagent=newCoderAgent({organizationId: process.env.CODER_ORG_ID!,model: "claude-sonnet-4-6",workspaceId: ws.id,// binds the chat's workspace-scoped toolsinstructions: "Audit the project in the workspace. Use latestVersion to check dependencies.",tools: {latestVersion: tool({description: "Look up the latest published version of an npm package.",inputSchema: z.object({pkg: z.string()}),execute: async({ pkg })=>{constres=awaitfetch(`https://registry.npmjs.org/${encodeURIComponent(pkg)}/latest`);if(!res.ok)return{ pkg,error: `registry returned ${res.status}`};const{ version }=(awaitres.json())as{version: string};return{ pkg, version };},}),},});letreport: string;try{constresult=awaitagent.generate({prompt:
"Read package.json, compare the dependencies against their latest versions, and report on the project's dependency health.",});report=result.text;}finally{awaitagent.archive();// archives the chat; never deletes the workspace}// 3. Provider: schema-constrained extraction through AI Gateway. The provider// takes explicit credentials (its `apiKey` is dual-purpose in BYOK mode).constcoder=createCoder({baseURL: process.env.CODER_URL!,apiKey: process.env.CODER_SESSION_TOKEN!,});const{object: audit}=awaitgenerateObject({model: coder("claude-sonnet-4-6"),schema: z.object({health: z.enum(["good","aging","at-risk"]),outdated: z.array(z.object({pkg: z.string(),current: z.string(),latest: z.string()})),summary: z.string(),}),prompt: `Extract the dependency audit from this report:\n\n${report}`,});console.log(audit.health,audit.summary);console.table(audit.outdated);awaittransport.close();// close cached relay WebSockets on shutdown

Each step stands alone — skip the ones you don't need. For depth on each: ensureCoderWorkspace and workspace creation settings in the sandbox README; custom tools, structured output (when the typed answer must come out of the agent run itself, not a follow-up model call), the workspaces & quota operations guide (fleet sizing, autostop, troubleshooting stuck turns), and the durable-workflow how-to (persisting chatId across job/queue boundaries, drop & timeout recovery) in the agent README; named providers and authentication modes and the enterprise governance & security reference (data flow, credential isolation, audit capture, required permissions) in the provider README.

Contributing

Development setup, the command reference, and how releases work all live in CONTRIBUTING.md. The short version — with mise installed:

mise install && pnpm install # set up the toolchain + dependencies
pnpm check && pnpm test# format check, lint, typecheck, then test

License

Apache-2.0 © Coder Technologies, Inc.

About

Coder's integrations with the Vercel AI SDK

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

coder/ai-sdk

Coder's integrations with the Vercel AI SDK. Run coding agents inside Coder workspaces, and drive Coder Agents from AI SDK code.

Note

All three packages are pre-1.0 and track experimental upstreams (Coder's chat API is experimental). Expect breaking changes.

Packages

Each package is published to npm independently and ships its own README with full install instructions, usage, and API docs.

PackageVersionWhat it does
@coder/ai-sdk-sandboxnpmA sandbox provider for the Vercel AI SDK v7 HarnessAgent. Runs CLI coding agents — Claude Code, Codex — inside a Coder workspace instead of on the local machine, so each agent gets a real, isolated dev environment with your tools, secrets, and network.
@coder/ai-sdk-agentnpmA Vercel AI SDK–compliant Agent (AI SDK v7) backed by Coder Agents, Coder's server-side agent runtime. new CoderAgent() returns a real Agentgenerate(), stream(), tool calls, the whole interface.
@coder/ai-sdk-providernpmA Vercel AI SDK provider that routes generateText / streamText calls through your Coder deployment's AI Gateway. Point it at your deployment with a Coder API token and use any model it proxies — no raw provider keys, with per-user auth and audit.

Experimental: @coder/ai-sdk-effect bridges these packages to Effect (unpublished Phase 1 spike, see #144).

Which package? Need a model (text, streaming, or schema‑constrained structured output) through your deployment → @coder/ai-sdk-provider. Need Coder's server‑side agent (multi‑step tool loop, MCP, workspace file/shell tools) → @coder/ai-sdk-agent. Need to run a CLI coding agent (Claude Code, Codex) inside a workspace → @coder/ai-sdk-sandbox.

Using them together

The packages are independent, but they compose into one application against one deployment, authenticated by one Coder token: provision a workspace with the sandbox package, drive Coder's server-side agent in it with the agent package, then extract a typed result with the provider. The full flow below audits a project's dependencies — the agent works inside the workspace (calling one custom tool that executes in your process), and the provider parses the prose report into a typed object through AI Gateway.

pnpm add @coder/ai-sdk-sandbox @coder/ai-sdk-agent @coder/ai-sdk-provider ai zod
pnpm add @ai-sdk/harness @ai-sdk/provider-utils # peer dependencies of the sandbox packageexport CODER_URL=https://coder.example.com
export CODER_SESSION_TOKEN=$(coder tokens create --name compose-example)export CODER_ORG_ID=<org-uuid># e.g. the first `organization_ids` entry from /api/v2/users/me
import{generateObject,tool}from"ai";import{z}from"zod";import{CoderNativeTransport,ensureCoderWorkspace}from"@coder/ai-sdk-sandbox";import{CoderAgent}from"@coder/ai-sdk-agent";import{createCoder}from"@coder/ai-sdk-provider";// The sandbox transport and the agent both default their connection from the// CODER_URL + CODER_SESSION_TOKEN exported above (explicit `url`/`baseUrl` and// `token` options remain available).// 1. Sandbox: get-or-create a workspace and wait until its agent is ready.// The native transport talks straight to your deployment — no `coder` CLI// or `ssh` on the host. Assumes the template checks out your project.consttransport=newCoderNativeTransport();constws=awaitensureCoderWorkspace({workspace: "dep-audit",create: {template: "docker"},
transport,});if(ws.id===undefined)thrownewError("transport did not report a workspace id");// 2. Agent: drive Coder's server-side agent loop in that workspace. The// server runs the multi-step loop and its file/shell tools; your custom// tool executes here, in this process, and its result is sent back.constagent=newCoderAgent({organizationId: process.env.CODER_ORG_ID!,model: "claude-sonnet-4-6",workspaceId: ws.id,// binds the chat's workspace-scoped toolsinstructions: "Audit the project in the workspace. Use latestVersion to check dependencies.",tools: {latestVersion: tool({description: "Look up the latest published version of an npm package.",inputSchema: z.object({pkg: z.string()}),execute: async({ pkg })=>{constres=awaitfetch(`https://registry.npmjs.org/${encodeURIComponent(pkg)}/latest`);if(!res.ok)return{ pkg,error: `registry returned ${res.status}`};const{ version }=(awaitres.json())as{version: string};return{ pkg, version };},}),},});letreport: string;try{constresult=awaitagent.generate({prompt:
"Read package.json, compare the dependencies against their latest versions, and report on the project's dependency health.",});report=result.text;}finally{awaitagent.archive();// archives the chat; never deletes the workspace}// 3. Provider: schema-constrained extraction through AI Gateway. The provider// takes explicit credentials (its `apiKey` is dual-purpose in BYOK mode).constcoder=createCoder({baseURL: process.env.CODER_URL!,apiKey: process.env.CODER_SESSION_TOKEN!,});const{object: audit}=awaitgenerateObject({model: coder("claude-sonnet-4-6"),schema: z.object({health: z.enum(["good","aging","at-risk"]),outdated: z.array(z.object({pkg: z.string(),current: z.string(),latest: z.string()})),summary: z.string(),}),prompt: `Extract the dependency audit from this report:\n\n${report}`,});console.log(audit.health,audit.summary);console.table(audit.outdated);awaittransport.close();// close cached relay WebSockets on shutdown

Each step stands alone — skip the ones you don't need. For depth on each: ensureCoderWorkspace and workspace creation settings in the sandbox README; custom tools, structured output (when the typed answer must come out of the agent run itself, not a follow-up model call), the workspaces & quota operations guide (fleet sizing, autostop, troubleshooting stuck turns), and the durable-workflow how-to (persisting chatId across job/queue boundaries, drop & timeout recovery) in the agent README; named providers and authentication modes and the enterprise governance & security reference (data flow, credential isolation, audit capture, required permissions) in the provider README.

Contributing

Development setup, the command reference, and how releases work all live in CONTRIBUTING.md. The short version — with mise installed:

mise install && pnpm install # set up the toolchain + dependencies
pnpm check && pnpm test# format check, lint, typecheck, then test

License

Apache-2.0 © Coder Technologies, Inc.

About

Coder's integrations with the Vercel AI SDK

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

coder/ai-sdk

Coder's integrations with the Vercel AI SDK. Run coding agents inside Coder workspaces, and drive Coder Agents from AI SDK code.

Note

All three packages are pre-1.0 and track experimental upstreams (Coder's chat API is experimental). Expect breaking changes.

Packages

Each package is published to npm independently and ships its own README with full install instructions, usage, and API docs.

PackageVersionWhat it does
@coder/ai-sdk-sandboxnpmA sandbox provider for the Vercel AI SDK v7 HarnessAgent. Runs CLI coding agents — Claude Code, Codex — inside a Coder workspace instead of on the local machine, so each agent gets a real, isolated dev environment with your tools, secrets, and network.
@coder/ai-sdk-agentnpmA Vercel AI SDK–compliant Agent (AI SDK v7) backed by Coder Agents, Coder's server-side agent runtime. new CoderAgent() returns a real Agentgenerate(), stream(), tool calls, the whole interface.
@coder/ai-sdk-providernpmA Vercel AI SDK provider that routes generateText / streamText calls through your Coder deployment's AI Gateway. Point it at your deployment with a Coder API token and use any model it proxies — no raw provider keys, with per-user auth and audit.

Experimental: @coder/ai-sdk-effect bridges these packages to Effect (unpublished Phase 1 spike, see #144).

Which package? Need a model (text, streaming, or schema‑constrained structured output) through your deployment → @coder/ai-sdk-provider. Need Coder's server‑side agent (multi‑step tool loop, MCP, workspace file/shell tools) → @coder/ai-sdk-agent. Need to run a CLI coding agent (Claude Code, Codex) inside a workspace → @coder/ai-sdk-sandbox.

Using them together

The packages are independent, but they compose into one application against one deployment, authenticated by one Coder token: provision a workspace with the sandbox package, drive Coder's server-side agent in it with the agent package, then extract a typed result with the provider. The full flow below audits a project's dependencies — the agent works inside the workspace (calling one custom tool that executes in your process), and the provider parses the prose report into a typed object through AI Gateway.

pnpm add @coder/ai-sdk-sandbox @coder/ai-sdk-agent @coder/ai-sdk-provider ai zod
pnpm add @ai-sdk/harness @ai-sdk/provider-utils # peer dependencies of the sandbox packageexport CODER_URL=https://coder.example.com
export CODER_SESSION_TOKEN=$(coder tokens create --name compose-example)export CODER_ORG_ID=<org-uuid># e.g. the first `organization_ids` entry from /api/v2/users/me
import{generateObject,tool}from"ai";import{z}from"zod";import{CoderNativeTransport,ensureCoderWorkspace}from"@coder/ai-sdk-sandbox";import{CoderAgent}from"@coder/ai-sdk-agent";import{createCoder}from"@coder/ai-sdk-provider";// The sandbox transport and the agent both default their connection from the// CODER_URL + CODER_SESSION_TOKEN exported above (explicit `url`/`baseUrl` and// `token` options remain available).// 1. Sandbox: get-or-create a workspace and wait until its agent is ready.// The native transport talks straight to your deployment — no `coder` CLI// or `ssh` on the host. Assumes the template checks out your project.consttransport=newCoderNativeTransport();constws=awaitensureCoderWorkspace({workspace: "dep-audit",create: {template: "docker"},
transport,});if(ws.id===undefined)thrownewError("transport did not report a workspace id");// 2. Agent: drive Coder's server-side agent loop in that workspace. The// server runs the multi-step loop and its file/shell tools; your custom// tool executes here, in this process, and its result is sent back.constagent=newCoderAgent({organizationId: process.env.CODER_ORG_ID!,model: "claude-sonnet-4-6",workspaceId: ws.id,// binds the chat's workspace-scoped toolsinstructions: "Audit the project in the workspace. Use latestVersion to check dependencies.",tools: {latestVersion: tool({description: "Look up the latest published version of an npm package.",inputSchema: z.object({pkg: z.string()}),execute: async({ pkg })=>{constres=awaitfetch(`https://registry.npmjs.org/${encodeURIComponent(pkg)}/latest`);if(!res.ok)return{ pkg,error: `registry returned ${res.status}`};const{ version }=(awaitres.json())as{version: string};return{ pkg, version };},}),},});letreport: string;try{constresult=awaitagent.generate({prompt:
"Read package.json, compare the dependencies against their latest versions, and report on the project's dependency health.",});report=result.text;}finally{awaitagent.archive();// archives the chat; never deletes the workspace}// 3. Provider: schema-constrained extraction through AI Gateway. The provider// takes explicit credentials (its `apiKey` is dual-purpose in BYOK mode).constcoder=createCoder({baseURL: process.env.CODER_URL!,apiKey: process.env.CODER_SESSION_TOKEN!,});const{object: audit}=awaitgenerateObject({model: coder("claude-sonnet-4-6"),schema: z.object({health: z.enum(["good","aging","at-risk"]),outdated: z.array(z.object({pkg: z.string(),current: z.string(),latest: z.string()})),summary: z.string(),}),prompt: `Extract the dependency audit from this report:\n\n${report}`,});console.log(audit.health,audit.summary);console.table(audit.outdated);awaittransport.close();// close cached relay WebSockets on shutdown

Each step stands alone — skip the ones you don't need. For depth on each: ensureCoderWorkspace and workspace creation settings in the sandbox README; custom tools, structured output (when the typed answer must come out of the agent run itself, not a follow-up model call), the workspaces & quota operations guide (fleet sizing, autostop, troubleshooting stuck turns), and the durable-workflow how-to (persisting chatId across job/queue boundaries, drop & timeout recovery) in the agent README; named providers and authentication modes and the enterprise governance & security reference (data flow, credential isolation, audit capture, required permissions) in the provider README.

Contributing

Development setup, the command reference, and how releases work all live in CONTRIBUTING.md. The short version — with mise installed:

mise install && pnpm install # set up the toolchain + dependencies
pnpm check && pnpm test# format check, lint, typecheck, then test

License

Apache-2.0 © Coder Technologies, Inc.

About

Coder's integrations with the Vercel AI SDK

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages