Vercel AI SDK Integration
agents-wire ships a first-class Vercel AI SDK v3 provider. Import from @pivanov/agents-wire/ai-sdk.
The ai package is a peer dependency - install it separately:
bun add ai
# or: npm install aiagentModel(agentId, options?)
Returns a LanguageModelV3 that can be dropped into streamText, generateText, useChat, and any other AI SDK consumer.
import { streamText } from "ai";
import { agentModel } from "@pivanov/agents-wire/ai-sdk";
const { textStream } = streamText({
model: agentModel("claude", { permission: "auto-allow" }),
prompt: "Refactor src/auth.ts",
});
for await (const chunk of textStream) {
process.stdout.write(chunk);
}createAgentProvider(options?)
Creates a provider factory with preset defaults.
import { createAgentProvider } from "@pivanov/agents-wire/ai-sdk";
const provider = createAgentProvider({
permission: "auto-allow",
cwd: process.cwd(),
});
const { text } = await generateText({
model: provider("claude"),
prompt: "Summarize this file",
});Multi-Turn with createAgentModelSession
For multi-turn conversations that share one subprocess across AI SDK calls:
import { streamText } from "ai";
import { createAgentModelSession } from "@pivanov/agents-wire/ai-sdk";
await using s = await createAgentModelSession(
"codex",
{
permission: "auto-allow",
},
);
await streamText({ model: s.model, prompt: "List all TODOs" });
await streamText({ model: s.model, prompt: "Now fix the highest-priority one" });Each streamText call reuses the same session subprocess, so conversation context carries over.
Slash Commands via providerOptions
Send slash commands to agents that support them:
import { generateText } from "ai";
import { agentModel } from "@pivanov/agents-wire/ai-sdk";
const { text } = await generateText({
model: agentModel("claude"),
prompt: "run the test suite",
providerOptions: {
agentsWire: {
command: "/test", // sent as a slash command
},
},
});The key AI_SDK_PROVIDER_OPTIONS_KEY (exported from the main entry) holds the string "agentsWire" for use in dynamic contexts.
Tool Call Forwarding
Tool calls from the agent are forwarded as AI SDK tool-call and tool-result parts, compatible with useChat's tool invocation UI.
import { streamText, tool } from "ai";
import { agentModel } from "@pivanov/agents-wire/ai-sdk";
import { z } from "zod";
const { fullStream } = streamText({
model: agentModel("claude", { permission: "auto-allow" }),
prompt: "Read and summarize src/auth.ts",
tools: {
Read: tool({
description: "Read a file",
parameters: z.object({ file_path: z.string() }),
execute: async ({ file_path }) => {
return await Bun.file(file_path).text();
},
}),
},
});
for await (const part of fullStream) {
if (part.type === "tool-call") console.log("calling tool:", part.toolName);
if (part.type === "tool-result") console.log("tool result:", part.result);
if (part.type === "text-delta") process.stdout.write(part.textDelta);
}provider.fromAdapter(adapter)
Create a LanguageModelV3 from a custom IAgentAdapter (for proprietary or future agents not in the built-in catalog). fromAdapter is a method on the provider returned by createAgentProvider(), not a standalone export:
import { createAgentProvider } from "@pivanov/agents-wire/ai-sdk";
import type { IAgentAdapter } from "@pivanov/agents-wire";
const myAdapter: IAgentAdapter = {
// ... custom launch logic
};
const provider = createAgentProvider({
permission: "auto-allow",
});
const model = provider.fromAdapter(myAdapter);
const { text } = await generateText({ model, prompt: "Hello" });Unsupported LLM Parameters
The provider warns when AI SDK parameters that don't map to agent concepts are passed (temperature, topP, frequencyPenalty, etc.). These are forwarded to options.onWarning (default: console.warn). The call still proceeds - the parameters are silently ignored by the agent.
Response Metadata
The provider emits response-metadata with the live session ID after each turn:
const { experimental_providerMetadata } = await generateText({
model: agentModel("claude"),
prompt: "Hello",
});
console.log(experimental_providerMetadata?.agentsWire?.sessionId);