.claude/skills/pikku-ai-vercel/SKILL.md
Use when setting up AI agent execution with the Vercel AI SDK in a Pikku app. Covers VercelAIAgentRunner for streaming and non-streaming AI agent steps. TRIGGER when: code uses VercelAIAgentRunner, user asks about Vercel AI SDK integration, AI agent runners, or @pikku/ai-vercel. DO NOT TRIGGER when: user asks about AI agent wiring (use pikku-ai-agent) or voice I/O (use pikku-ai-voice).
npx skillsauth add pikkujs/pikku pikku-ai-vercelInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
@pikku/ai-vercel provides an AI agent runner backed by the Vercel AI SDK. Implements AIAgentRunnerService from @pikku/core.
yarn add @pikku/ai-vercel ai @ai-sdk/openai # or any AI SDK provider
VercelAIAgentRunnerimport { VercelAIAgentRunner } from '@pikku/ai-vercel'
const runner = new VercelAIAgentRunner(
providers: Record<string, any> // Map of provider name → Vercel AI SDK provider instance
)
Methods:
stream(params: AIAgentRunnerParams, channel: AIStreamChannel): Promise<AIAgentStepResult> — Stream AI responses with tool callsrun(params: AIAgentRunnerParams): Promise<AIAgentStepResult> — Execute a single AI step (non-streaming)The providers map lets you register multiple AI providers. Model strings use provider:model format (e.g., "openai:gpt-4o").
import { VercelAIAgentRunner } from '@pikku/ai-vercel'
import { openai } from '@ai-sdk/openai'
import { anthropic } from '@ai-sdk/anthropic'
const createSingletonServices = pikkuServices(async (config) => {
const aiRunner = new VercelAIAgentRunner({
openai: openai,
anthropic: anthropic,
})
return { config, aiRunner }
})
import { wireAIAgent } from '@pikku/core/ai-agent'
wireAIAgent({
name: 'assistant',
model: 'openai:gpt-4o',
systemPrompt: 'You are a helpful assistant.',
func: myAgentFunc,
})
The VercelAIAgentRunner is used internally by Pikku's AI agent wiring to execute model calls. See pikku-ai-agent for wiring details.
documentation
Standard cleanup to run right after a Pikku template is cloned or scaffolded into a new project. TRIGGER when: a Pikku template was just cloned/scaffolded (via `pikku create`, `git clone <template>`, or the user says "I cloned the kanban template / starter / template"), or the working tree still looks like an untouched template (template README, placeholder `@project/*` name in package.json). DO NOT TRIGGER when: working in an established project mid-feature, or editing the template repo itself.
development
Make a Pikku frontend work in both English (LTR) and Arabic / right-to-left languages. Direction is derived from the active locale, applied once at the document root, and the layout mirrors itself — but only if styling is written flow-relative (margin-inline-start, text-align: start, Mantine ms/me) instead of left/right. TRIGGER when: adding Arabic (or Hebrew/Farsi/Urdu), asked to "support RTL / right-to-left / bidi / mirror the layout", or writing layout styles in an app that may run RTL. Builds on pikku-i18n (an RTL language is just another locale file). DO NOT TRIGGER for backend functions or for LTR-only copy changes.
development
Wire i18n into a Pikku frontend (Vite SPA, Vite SSR, or Next.js app-router) with react-i18next + i18next. English by default, every user-facing string goes through a `t()` token, and additional languages are served under `/de` `/es` URL prefixes. TRIGGER when: scaffolding or editing a frontend and writing user-facing text, adding a second language, or asked to "make this translatable / use tokens / add i18n". DO NOT TRIGGER for backend functions, error messages thrown from functions, or log output.
development
Use when translating an n8n Code node body into a real Pikku function body. Triggered when the user opens or points at a stub generated by @pikku/n8n-import (look for `STUB — generated from n8n Code node` in the file's JSDoc), or when the user says 'translate this n8n code', 'port this n8n code node', 'finish the codeStub__... function', etc. The stub file is a `pikkuSessionlessFunc` with a Zod input/output, a JSDoc preserving the original n8n JavaScript verbatim, and a `throw new Error('… — implement me')` body.