# Migrating from Vercel AI SDK to NeuroLink ## Why Migrate? While Vercel AI SDK is excellent for Next.js applications, NeuroLink offers broader capabilities for enterprise and multi-framework applications: | Benefit | Vercel AI SDK | NeuroLink | | ----------------------- | ------------------------------ | ---------------------------------------- | | **Multi-Provider** | Separate packages per provider | 30+ providers in single package | | **Framework Support** | Optimized for Next.js | Next.js, SvelteKit, Express, any Node.js | | **Tool Integration** | Function calling only | MCP (58+ servers) + function calling | | **Enterprise Features** | Basic | HITL, Redis memory, middleware, failover | | **Memory/State** | useChat hook (client-side) | Redis-backed server-side memory | | **Production Ready** | Good for prototypes | In production use at Juspay | | **Bundle Size** | Moderate | Optimized, tree-shakeable | | **Streaming** | Excellent | Excellent (same quality) | **Migration time:** Most Next.js apps can migrate in 2-3 hours with feature parity and enhanced capabilities. --- ## Concept Mapping | Vercel AI SDK | NeuroLink | Notes | | ------------------------------------ | ----------------------- | ------------------------------------- | | `generateText()` | `generate()` | Similar API, unified across providers | | `streamText()` | `stream()` | Built-in streaming | | `useChat()` | Custom hook + API route | Server-side memory more robust | | `CoreMessage` | `ChatMessage` | Type compatible | | `tool()` function | MCP Tools | More powerful, 58+ servers | | Provider packages (`@ai-sdk/openai`) | `provider` parameter | Single package | | `generateObject()` | `generate({ schema })` | Zod schema validation | | Edge Runtime | Node.js runtime | Compatible with Edge via adapters | --- ## Quick Start Migration ### Before (Vercel AI SDK) ```typescript import { generateText } from "ai"; import { openai } from "@ai-sdk/openai"; const { text } = await generateText({ model: openai("gpt-4"), prompt: "Write a haiku about programming", }); console.log(text); ``` ### After (NeuroLink) ```typescript import { NeuroLink } from "@juspay/neurolink"; const neurolink = new NeuroLink({ provider: "openai", model: "gpt-4", }); const result = await neurolink.generate({ input: { text: "Write a haiku about programming" }, }); console.log(result.content); ``` **Key changes:** - Single import instead of multiple packages - Unified `generate()` method - `content` instead of `text` property - Provider specified in config, not per-call --- ## Feature-by-Feature Migration ### 1. Text Generation **Vercel AI SDK:** ```typescript import { generateText } from "ai"; import { openai } from "@ai-sdk/openai"; const result = await generateText({ model: openai("gpt-4"), prompt: "Explain TypeScript", temperature: 0.7, maxTokens: 500, }); console.log(result.text); console.log(result.usage); ``` **NeuroLink:** ```typescript import { NeuroLink } from "@juspay/neurolink"; const neurolink = new NeuroLink({ provider: "openai" }); const result = await neurolink.generate({ input: { text: "Explain TypeScript" }, model: "gpt-4", temperature: 0.7, maxTokens: 500, }); console.log(result.content); console.log(result.usage); // { promptTokens, completionTokens, totalTokens } ``` --- ### 2. Streaming **Vercel AI SDK:** ```typescript import { streamText } from "ai"; import { openai } from "@ai-sdk/openai"; const result = await streamText({ model: openai("gpt-4"), prompt: "Tell me a story", }); for await (const chunk of result.textStream) { process.stdout.write(chunk); } ``` **NeuroLink:** ```typescript import { NeuroLink } from "@juspay/neurolink"; const neurolink = new NeuroLink({ provider: "openai" }); const result = await neurolink.stream({ input: { text: "Tell me a story" }, model: "gpt-4", }); for await (const chunk of result.stream) { process.stdout.write(chunk.content); } ``` **Full chunk data:** ```typescript for await (const chunk of result.stream) { console.log(chunk.content); // Text content } ``` --- ### 3. Tool Calling (Function Calling) **Vercel AI SDK:** ```typescript import { generateText } from "ai"; import { openai } from "@ai-sdk/openai"; import { z } from "zod"; const result = await generateText({ model: openai("gpt-4"), prompt: "What is the weather in San Francisco?", tools: { getWeather: { description: "Get weather for a location", parameters: z.object({ location: z.string(), }), execute: async ({ location }) => { return { temp: 72, condition: "Sunny" }; }, }, }, }); ``` **NeuroLink:** ```typescript import { NeuroLink } from "@juspay/neurolink"; const neurolink = new NeuroLink({ provider: "openai" }); // Option 1: Register custom tool neurolink.registerTool("getWeather", { name: "getWeather", description: "Get weather for a location", inputSchema: { type: "object", properties: { location: { type: "string" }, }, required: ["location"], }, execute: async ({ location }) => { return { temp: 72, condition: "Sunny" }; }, }); const result = await neurolink.generate({ input: { text: "What is the weather in San Francisco?" }, model: "gpt-4", }); // Option 2: Use MCP server (more powerful) await neurolink.addExternalMCPServer("weather", { command: "npx", args: ["-y", "@modelcontextprotocol/server-weather"], transport: "stdio", env: { WEATHER_API_KEY: process.env.WEATHER_API_KEY }, }); const result2 = await neurolink.generate({ input: { text: "What is the weather in San Francisco?" }, }); ``` **Benefits:** - MCP servers provide 58+ pre-built integrations - No manual tool registration needed - Tools work across all providers --- ### 4. Structured Output **Vercel AI SDK:** ```typescript import { generateObject } from "ai"; import { openai } from "@ai-sdk/openai"; import { z } from "zod"; const result = await generateObject({ model: openai("gpt-4"), schema: z.object({ name: z.string(), age: z.number(), email: z.string().email(), }), prompt: "Generate a user profile for John Doe, age 30", }); console.log(result.object); // { name: "John Doe", age: 30, email: "..." } ``` **NeuroLink:** ```typescript import { NeuroLink } from "@juspay/neurolink"; import { z } from "zod"; const neurolink = new NeuroLink({ provider: "openai" }); const schema = z.object({ name: z.string(), age: z.number(), email: z.string().email(), }); const result = await neurolink.generate({ input: { text: "Generate a user profile for John Doe, age 30" }, model: "gpt-4", schema, }); console.log(result.content); // JSON string with { name: "John Doe", age: 30, email: "..." } // Automatically validated against Zod schema ``` **Benefits:** - Type-safe results - Automatic validation - Works across all providers --- ### 5. Multi-Provider Support **Vercel AI SDK:** ```typescript import { generateText } from "ai"; import { openai } from "@ai-sdk/openai"; import { anthropic } from "@ai-sdk/anthropic"; // OpenAI const result1 = await generateText({ model: openai("gpt-4"), prompt: "Hello", }); // Anthropic (requires separate package) const result2 = await generateText({ model: anthropic("claude-3-5-sonnet-20241022"), prompt: "Hello", }); ``` **NeuroLink:** ```typescript import { NeuroLink } from "@juspay/neurolink"; const neurolink = new NeuroLink(); // OpenAI const result1 = await neurolink.generate({ input: { text: "Hello" }, provider: "openai", model: "gpt-4", }); // Anthropic (same package) const result2 = await neurolink.generate({ input: { text: "Hello" }, provider: "anthropic", model: "claude-3-5-sonnet-20241022", }); // Or set default provider const neurolinkAnthropic = new NeuroLink({ provider: "anthropic" }); ``` **With automatic failover:** ```typescript const neurolink = new NeuroLink({ provider: "openai", fallbackProviders: ["anthropic", "vertex"], }); // Automatically tries Anthropic or Vertex if OpenAI fails const result = await neurolink.generate({ input: { text: "Hello" }, }); ``` **Benefits:** - Single package for all 30+ providers - Runtime provider switching - Automatic failover - No need to install separate packages --- ## Next.js Integration ### Pattern 1: API Routes **Vercel AI SDK:** ```typescript // app/api/chat/route.ts import { streamText } from "ai"; import { openai } from "@ai-sdk/openai"; export async function POST(req: Request) { const { messages } = await req.json(); const result = await streamText({ model: openai("gpt-4"), messages, }); return result.toAIStreamResponse(); } ``` **NeuroLink:** ```typescript // app/api/chat/route.ts import { NeuroLink } from "@juspay/neurolink"; import { NextResponse } from "next/server"; const neurolink = new NeuroLink({ provider: "openai", conversationMemory: { enabled: true, store: "redis", // Persistent across instances }, }); export async function POST(req: Request) { const { message } = await req.json(); const result = await neurolink.stream({ input: { text: message }, model: "gpt-4", }); // Convert stream to Response const encoder = new TextEncoder(); const readableStream = new ReadableStream({ async start(controller) { for await (const chunk of result.stream) { controller.enqueue(encoder.encode(chunk.content)); } controller.close(); }, }); return new Response(readableStream, { headers: { "Content-Type": "text/plain; charset=utf-8" }, }); } ``` **With better error handling:** ```typescript export async function POST(req: Request) { try { const { message } = await req.json(); const result = await neurolink.stream({ input: { text: message }, }); const encoder = new TextEncoder(); const stream = new ReadableStream({ async start(controller) { try { for await (const chunk of result.stream) { controller.enqueue( encoder.encode(`data: ${JSON.stringify(chunk)}\n\n`), ); } controller.enqueue(encoder.encode("data: [DONE]\n\n")); } catch (error) { controller.enqueue( encoder.encode( `data: ${JSON.stringify({ error: "Stream error" })}\n\n`, ), ); } finally { controller.close(); } }, }); return new Response(stream, { headers: { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", Connection: "keep-alive", }, }); } catch (error) { return NextResponse.json( { error: "Failed to generate response" }, { status: 500 }, ); } } ``` --- ### Pattern 2: Server Components **Vercel AI SDK:** ```typescript // app/page.tsx (Server Component) import { generateText } from 'ai'; import { openai } from '@ai-sdk/openai'; export default async function Page() { const { text } = await generateText({ model: openai('gpt-4'), prompt: 'Generate a welcome message', }); return