mcpbeat

AI

vercel-labs/ai

AI SDK for Python (the `ai` package). Use when writing Python that calls LLMs or builds agents — model calls, streaming, tool calling, subagents, human-in-the-loop approvals, durable/serverless execution, telemetry, AI SDK UI chat backends, custom providers.

3k tokens
context cost
the whole folder, loaded on every use
7
files
instructions only
0
copies elsewhere
how many repositories repackaged it
155
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/vercel-labs/ai-python --skill ai

What comes with it

9 449 bytes besides the instruction
references/custom-loops.md
references/custom-provider.md
references/durable.md
references/serverless.md
references/streaming-tools.md
references/ui.md

What it tells the agent to use

found in the instruction text
Task spawns other agents

The instruction itself

3 sections, as written by the author

AI SDK for Python

Package: ai. Requires Python 3.12+. Install with uv add ai.

Unprefixed model IDs use AI Gateway and AI_GATEWAY_API_KEY. Direct providers

use provider:model, their API key, and an extra:

uv add "ai[openai]"     # OPENAI_API_KEY,    ai.get_model("openai:gpt-5")
uv add "ai[anthropic]"  # ANTHROPIC_API_KEY, ai.get_model("anthropic:claude-sonnet-4")

Basic use

Use ai.stream for one model call without Python tool execution:

import ai

model = ai.get_model("anthropic/claude-sonnet-4")
messages = [
    ai.system_message("Be concise."),
    ai.user_message("Write a haiku about rain."),
]

async with ai.stream(model, messages) as stream:
    async for event in stream:
        if isinstance(event, ai.events.TextDelta):
            print(event.chunk, end="", flush=True)

answer = stream.output
message = stream.message

Use ai.Agent for a loop that executes Python tools and manages history:

@ai.tool
async def get_weather(city: str) -> str:
    """Get the weather for a city."""
    return "Sunny"


agent = ai.Agent(tools=[get_weather])
async with agent.run(model, messages) as run:
    async for event in run:
        if isinstance(event, ai.events.TextDelta):
            print(event.chunk, end="", flush=True)

answer = run.output
history = run.messages

These examples are sufficient for basic model calls, messages, tools, and

agents.

Advanced work

For an advanced task, fetch its page under https://ai-python.dev/docs/ and

read the listed local notes before writing code.

| Task | Page | Local notes |

|---|---|---|

| Provider clients, options, discovery | basics/providers.md | — |

| Structured output, complex streams | basics/streaming.md | — |

| Events and serialization | basics/messages-and-events.md | — |

| Advanced tools, streaming, aggregation | basics/tools.md | streaming-tools.md |

| Advanced agent behavior | basics/agents.md | — |

| Subagents and multi-agent | basics/subagents-and-multi-agent.md | streaming-tools.md |

| Custom agent loops | basics/custom-loops.md | custom-loops.md |

| Approvals and hooks | basics/human-in-the-loop.md | — |

| Serverless resume | basics/human-in-the-loop.md | serverless.md |

| Durable execution | basics/durable-execution.md | durable.md |

| Telemetry and tracing | basics/telemetry.md | — |

| AI SDK UI backends | basics/ai-sdk-ui.md | ui.md |

| Custom providers | basics/providers.md | custom-provider.md |

For exact APIs, use reference.md and the relevant reference/*.md page.

How to use it

Copy the folder

Take vercel-labs/ai from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.