Server-side AINative client for Next.js with App Router support, streaming chat, and auth middleware.
npm install @ainative/next-sdk
// app/api/chat/route.ts
import { createServerClient } from '@ainative/next-sdk/server';
export async function POST(request: Request) {
const { messages } = await request.json();
const client = createServerClient({
apiKey: process.env.AINATIVE_API_KEY!,
});
// Non-streaming
const result = await client.chat.completions.create({
model: 'claude-3-5-sonnet-20241022',
messages,
max_tokens: 1024,
});
return Response.json(result);
}
// app/api/chat/route.ts
import { createServerClient } from '@ainative/next-sdk/server';
export async function POST(request: Request) {
const { messages } = await request.json();
const client = createServerClient({ apiKey: process.env.AINATIVE_API_KEY! });
const stream = await client.chat.completions.create({
model: 'claude-3-5-sonnet-20241022',
messages,
stream: true,
});
return new Response(stream.body, {
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
},
});
}
// middleware.ts (repo root or src/)
import { createMiddleware } from '@ainative/next-sdk/middleware';
export const middleware = createMiddleware({
apiKey: process.env.AINATIVE_API_KEY!,
protectedPaths: ['/dashboard', '/api/protected'],
loginPath: '/login',
publicPaths: ['/', '/about', '/api/chat'],
});
export const config = {
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
};
// app/components/Chat.tsx
'use client';
import { useState } from 'react';
export function Chat() {
const [messages, setMessages] = useState<{ role: string; content: string }[]>([]);
const [input, setInput] = useState('');
const send = async () => {
const newMessages = [...messages, { role: 'user', content: input }];
setMessages(newMessages);
setInput('');
const res = await fetch('/api/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ messages: newMessages }),
});
const data = await res.json();
setMessages([...newMessages, data.choices[0].message]);
};
return (
<div>
{messages.map((m, i) => <p key={i}><b>{m.role}:</b> {m.content}</p>)}
<input value={input} onChange={e => setInput(e.target.value)} />
<button onClick={send}>Send</button>
</div>
);
}
// pages/api/chat.ts
import type { NextApiRequest, NextApiResponse } from 'next';
import { createServerClient } from '@ainative/next-sdk/server';
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const client = createServerClient({ apiKey: process.env.AINATIVE_API_KEY! });
const result = await client.chat.completions.create({
model: 'claude-3-5-sonnet-20241022',
messages: req.body.messages,
});
res.json(result);
}
# .env.local
AINATIVE_API_KEY=ak_your_key
Never expose AINATIVE_API_KEY to the client — only use it in server-side code (route handlers, Server Actions, getServerSideProps).
import { createServerClient } from '@ainative/next-sdk/server';
import { createMiddleware } from '@ainative/next-sdk/middleware';
packages/sdks/nextjs/src/server/createServerClient.ts — Server clientpackages/sdks/nextjs/src/middleware/ — Auth middlewarepackages/sdks/nextjs/examples/app-router/ — Example apppackages/sdks/nextjs/src/index.ts — Package exports共 1 个版本