# 🏗️ Framework Integration Guide NeuroLink integrates seamlessly with popular web frameworks. Here are complete examples for common use cases. ## SvelteKit Integration ### API Route (`src/routes/api/chat/+server.ts`) ```typescript import { createBestAIProvider } from "@juspay/neurolink"; import type { RequestHandler } from "./$types"; export const POST: RequestHandler = async ({ request }) => { try { const { message } = await request.json(); const provider = createBestAIProvider(); const result = await provider.stream({ input: { text: message }, temperature: 0.7, maxTokens: 1000, }); // Manually create ReadableStream from AsyncIterable const readable = new ReadableStream({ async start(controller) { try { for await (const chunk of result.stream) { if (chunk && typeof chunk === "object" && "content" in chunk) { controller.enqueue(new TextEncoder().encode(chunk.content)); } } controller.close(); } catch (error) { controller.error(error); } }, }); return new Response(readable, { headers: { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", Connection: "keep-alive", }, }); } catch (error) { return new Response(JSON.stringify({ error: error.message }), { status: 500, headers: { "Content-Type": "application/json" }, }); } }; ``` ### Svelte Component (`src/routes/chat/+page.svelte`) ```svelte
{#if response}
{response}
{/if}
``` ### Environment Configuration ```bash # .env OPENAI_API_KEY="sk-your-key" AWS_ACCESS_KEY_ID="your-aws-key" AWS_SECRET_ACCESS_KEY="your-aws-secret" # Add other provider keys as needed ``` ### Dynamic Model Integration (v1.8.0+) #### Smart Model Selection API Route ```typescript import { AIProviderFactory } from "@juspay/neurolink"; import type { RequestHandler } from "./$types"; export const POST: RequestHandler = async ({ request }) => { try { const { message, useCase, optimizeFor } = await request.json(); const factory = new AIProviderFactory(); // Use dynamic model selection based on use case const provider = await factory.createProvider({ provider: "auto", capability: useCase === "vision" ? "vision" : "general", optimizeFor: optimizeFor || "quality", // 'cost', 'speed', or 'quality' }); const result = await provider.stream({ input: { text: message }, temperature: 0.7, maxTokens: 1000, }); // Manually create ReadableStream from AsyncIterable const readable = new ReadableStream({ async start(controller) { try { for await (const chunk of result.stream) { if (chunk && typeof chunk === "object" && "content" in chunk) { controller.enqueue(new TextEncoder().encode(chunk.content)); } } controller.close(); } catch (error) { controller.error(error); } }, }); return new Response(readable, { headers: { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", Connection: "keep-alive", "X-Model-Used": result.model, "X-Provider-Used": result.provider, }, }); } catch (error) { return new Response(JSON.stringify({ error: error.message }), { status: 500, headers: { "Content-Type": "application/json" }, }); } }; ``` #### Cost-Optimized Component ```svelte
{#if response}
Model: {modelUsed} | Provider: {providerUsed}
{response}
{/if}
``` ## Next.js Integration ### App Router API (`app/api/ai/route.ts`) ```typescript import { createBestAIProvider } from "@juspay/neurolink"; import { NextRequest, NextResponse } from "next/server"; export async function POST(request: NextRequest) { try { const { prompt, ...options } = await request.json(); const provider = createBestAIProvider(); const result = await provider.generate({ input: { text: prompt }, temperature: 0.7, maxTokens: 1000, ...options, }); return NextResponse.json({ text: result.text, provider: result.provider, usage: result.usage, }); } catch (error) { return NextResponse.json({ error: error.message }, { status: 500 }); } } // Streaming endpoint export async function PUT(request: NextRequest) { try { const { prompt } = await request.json(); const provider = createBestAIProvider(); const result = await provider.stream({ input: { text: prompt }, }); // Manually create ReadableStream from AsyncIterable const readable = new ReadableStream({ async start(controller) { try { for await (const chunk of result.stream) { if (chunk && typeof chunk === "object" && "content" in chunk) { controller.enqueue(new TextEncoder().encode(chunk.content)); } } controller.close(); } catch (error) { controller.error(error); } }, }); return new Response(readable, { headers: { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", Connection: "keep-alive", }, }); } catch (error) { return NextResponse.json({ error: error.message }, { status: 500 }); } } ``` ### React Component (`components/AIChat.tsx`) ```typescript 'use client'; import { useState } from 'react'; type AIResponse = { text: string; provider: string; usage?: { promptTokens: number; completionTokens: number; totalTokens: number; }; } export default function AIChat() { const [prompt, setPrompt] = useState(''); const [result, setResult] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const generate = async () => { if (!prompt.trim()) return; setLoading(true); setError(''); setResult(null); try { const response = await fetch('/api/ai', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ prompt }) }); const data = await response.json(); if (response.ok) { setResult(data); } else { setError(data.error || 'An error occurred'); } } catch (err) { setError(err instanceof Error ? err.message : 'Network error'); } finally { setLoading(false); } }; const handleKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); generate(); } }; return (

AI Chat with NeuroLink