Docs
CodeRabbit
Cloudflare
Railway
Netlify
AG Grid
WorkOS
SerpAPI
OpenRouter
Clerk
Electric
Sentry
Unkey
Prisma
CodeRabbit
Cloudflare
Railway
Netlify
AG Grid
WorkOS
SerpAPI
OpenRouter
Clerk
Electric
Sentry
Unkey
Prisma
Class References
Function References
Interface References
Type Alias References
Variable References
Tools

Provider Skills

Provider Skills are hosted, provider-managed capability bundles that the model loads on demand and runs inside the provider's server-side sandbox. You reference them by a skill ID; the provider handles installation and execution.

Not to be confused with @tanstack/ai-code-mode-skills, which are locally-generated TypeScript functions evaluated client-side. Provider Skills run entirely on the provider's infrastructure.

Skills are inert without an execution tool. The execution tool activates the sandbox; skills are additional bundles that run inside it:

  • Anthropic: skills attach to codeExecutionTool (@tanstack/ai-anthropic/tools).
  • OpenAI: skills nest inside shellTool (@tanstack/ai-openai/tools) and require the Responses API.

You already have a chat() call working. By the end of this page you will have attached a hosted skill to the right execution tool, with the provider handling the rest.


Anthropic: skills via codeExecutionTool

1. Install the package

sh
npm install @tanstack/ai-anthropic
npm install @tanstack/ai-anthropic

2. Add the codeExecutionTool with skills

Import codeExecutionTool from @tanstack/ai-anthropic/tools, not from the adapter root. Pass a skills array as the second argument.

typescript
import { chat, toServerSentEventsResponse } from '@tanstack/ai'
import { anthropicText } from '@tanstack/ai-anthropic'
import { codeExecutionTool } from '@tanstack/ai-anthropic/tools'

export async function POST(request: Request) {
  const { messages } = await request.json()

  const stream = chat({
    adapter: anthropicText('claude-sonnet-4-5'),
    messages,
    tools: [
      codeExecutionTool(
        { type: 'code_execution_20250825', name: 'code_execution' },
        {
          skills: [{ type: 'anthropic', skill_id: 'pptx', version: 'latest' }],
        },
      ),
    ],
  })

  return toServerSentEventsResponse(stream)
}
import { chat, toServerSentEventsResponse } from '@tanstack/ai'
import { anthropicText } from '@tanstack/ai-anthropic'
import { codeExecutionTool } from '@tanstack/ai-anthropic/tools'

export async function POST(request: Request) {
  const { messages } = await request.json()

  const stream = chat({
    adapter: anthropicText('claude-sonnet-4-5'),
    messages,
    tools: [
      codeExecutionTool(
        { type: 'code_execution_20250825', name: 'code_execution' },
        {
          skills: [{ type: 'anthropic', skill_id: 'pptx', version: 'latest' }],
        },
      ),
    ],
  })

  return toServerSentEventsResponse(stream)
}

The adapter automatically:

  • Lifts your skills into the request's top-level container.skills parameter (the shape Anthropic's API requires).
  • Attaches the code-execution-2025-08-25 beta header, plus the skills-2025-10-02 beta header when skills are present.

You do not set beta headers manually.

Skill shape

Each entry in the skills array is an AnthropicContainerSkill:

FieldTypeRequiredNotes
type'anthropic' | 'custom'yes'anthropic' for Anthropic-hosted skills; 'custom' for your own bundles.
skill_idstringyes1–64 characters.
versionstringnoSpecific version string, or 'latest' (default when omitted).

Up to 8 skills per request. The factory throws at call time if you exceed this or supply an invalid skill_id.

Deprecation notice

Setting skills via modelOptions.container.skills is deprecated. Use codeExecutionTool(config, { skills }) instead — the legacy path bypasses the automatic beta-header wiring.


OpenAI: skills via shellTool (Responses API only)

The OpenAI shellTool accepts an environment object that can carry a skills array. This is Responses API only; the Chat Completions API does not support the shell tool.

1. Install the package

sh
npm install @tanstack/ai-openai
npm install @tanstack/ai-openai

2. Add the shellTool with skills

typescript
import { chat, toServerSentEventsResponse } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
import { shellTool } from '@tanstack/ai-openai/tools'

export async function POST(request: Request) {
  const { messages } = await request.json()

  const stream = chat({
    adapter: openaiText('gpt-5.2'),
    messages,
    tools: [
      shellTool({
        environment: {
          type: 'container_auto',
          skills: [
            { type: 'skill_reference', skill_id: 'skill_abc', version: '2' },
          ],
        },
      }),
    ],
  })

  return toServerSentEventsResponse(stream)
}
import { chat, toServerSentEventsResponse } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
import { shellTool } from '@tanstack/ai-openai/tools'

export async function POST(request: Request) {
  const { messages } = await request.json()

  const stream = chat({
    adapter: openaiText('gpt-5.2'),
    messages,
    tools: [
      shellTool({
        environment: {
          type: 'container_auto',
          skills: [
            { type: 'skill_reference', skill_id: 'skill_abc', version: '2' },
          ],
        },
      }),
    ],
  })

  return toServerSentEventsResponse(stream)
}

Skill shape

Each entry in the skills array is a SkillReference:

FieldTypeRequiredNotes
type'skill_reference'yesAlways 'skill_reference' for OpenAI.
skill_idstringyesThe skill identifier provided by OpenAI.
versionstringnoA positive integer as a string (e.g. '2') or 'latest'.

Note: version is a string, not a number.


Scope

Only hosted, managed-by-id skills are wired by these factories:

  • Anthropic: type: 'anthropic' or type: 'custom'
  • OpenAI: type: 'skill_reference'

Inline bundles, local-path references, and upload-API skill creation are not handled by codeExecutionTool or shellTool.