{"_id":"@ainative/next-sdk","name":"@ainative/next-sdk","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"name":"@ainative/next-sdk","version":"1.0.1","description":"Official Next.js SDK for AINative Studio API - Server and client utilities for App Router and Pages Router","main":"dist/index.js","module":"dist/index.esm.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.esm.js","require":"./dist/server.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.esm.js","require":"./dist/client.js"}},"scripts":{"build":"rollup -c rollup.config.mjs","build:watch":"rollup -c -w","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","lint":"eslint . --ext .ts,.tsx","lint:fix":"eslint . --ext .ts,.tsx --fix","type-check":"tsc --noEmit","prepublishOnly":"npm run test && npm run build"},"keywords":["ainative","nextjs","next","react","server-components","app-router","pages-router","api","sdk","chat","ai","typescript"],"author":{"name":"AINative Studio"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/AINative-Studio/ainative-sdks.git"},"bugs":{"url":"https://github.com/AINative-Studio/ainative-sdks/issues"},"homepage":"https://ainative.studio","peerDependencies":{"next":"^13.0.0 || ^14.0.0","react":"^18.0.0"},"dependencies":{"@ainative/react-sdk":"^1.0.0"},"devDependencies":{"@rollup/plugin-commonjs":"^25.0.7","@rollup/plugin-node-resolve":"^15.2.3","@rollup/plugin-typescript":"^11.1.5","@rollup/plugin-terser":"^0.4.4","@types/jest":"^29.5.10","@types/node":"^20.10.0","@types/react":"^18.2.45","@typescript-eslint/eslint-plugin":"^6.13.0","@typescript-eslint/parser":"^6.13.0","eslint":"^8.54.0","eslint-plugin-react":"^7.33.2","eslint-plugin-react-hooks":"^4.6.0","jest":"^29.7.0","jest-environment-node":"^29.7.0","next":"^14.0.0","react":"^18.2.0","rollup":"^3.29.4","rollup-plugin-dts":"^5.3.1","ts-jest":"^29.1.1","tslib":"^2.6.2","typescript":"^5.3.2"},"engines":{"node":">=18.0.0"},"_id":"@ainative/next-sdk@1.0.1","gitHead":"8a82dd95afbd1c89bee4517527380f9359448e24","_nodeVersion":"22.21.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-+ke/L1NHn2UP5DmarsZ6pxS2JAfVXh56fNQyua4+jT4guKWLoN5ZRmld/czLKUwJYaNxmcuEKkvv9AvpWSEUCg==","shasum":"8d0c86459d9fc303336cc3959a1225d58b5ed58a","tarball":"https://registry.npmjs.org/@ainative/next-sdk/-/next-sdk-1.0.1.tgz","fileCount":18,"unpackedSize":97525,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCOUwXNQHFfmV+CGLSE02Mg0hC/eu/YvW0Y9Kk3PldhvQIga1HaQWYn9QdE30dO8HmamqvofSv9XFGRUUpa9wKc5uY="}]},"_npmUser":{"name":"ainative-studio","email":"toby@rely.ventures"},"directories":{},"maintainers":[{"name":"ainative-studio","email":"toby@rely.ventures"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/next-sdk_1.0.1_1768463473292_0.21203717629276508"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-15T07:51:13.137Z","1.0.1":"2026-01-15T07:51:13.427Z","modified":"2026-01-15T07:51:13.669Z"},"maintainers":[{"name":"ainative-studio","email":"toby@rely.ventures"}],"description":"Official Next.js SDK for AINative Studio API - Server and client utilities for App Router and Pages Router","homepage":"https://ainative.studio","keywords":["ainative","nextjs","next","react","server-components","app-router","pages-router","api","sdk","chat","ai","typescript"],"repository":{"type":"git","url":"git+https://github.com/AINative-Studio/ainative-sdks.git"},"author":{"name":"AINative Studio"},"bugs":{"url":"https://github.com/AINative-Studio/ainative-sdks/issues"},"license":"MIT","readme":"# @ainative/next-sdk\n\nOfficial Next.js SDK for AINative Studio API. Provides server and client utilities for both App Router and Pages Router.\n\n## Features\n\n- **Server Components**: Use `createServerClient()` in Server Components and Server Actions\n- **Client Components**: Re-exports `@ainative/react-sdk` hooks for Client Components\n- **API Routes**: Protect routes with `withAuth()` middleware\n- **Session Management**: Extract JWT session from cookies\n- **TypeScript**: Full type safety with TypeScript definitions\n- **Zero Config**: Works out of the box with sensible defaults\n\n## Installation\n\n```bash\nnpm install @ainative/next-sdk\n# or\nyarn add @ainative/next-sdk\n# or\npnpm add @ainative/next-sdk\n```\n\n## Quick Start\n\n### App Router (Next.js 13+)\n\n#### Server Component\n\n```tsx\n// app/dashboard/page.tsx\nimport { createServerClient, getApiKey } from '@ainative/next-sdk/server';\nimport { redirect } from 'next/navigation';\n\nexport default async function DashboardPage() {\n  const apiKey = await getApiKey();\n\n  if (!apiKey) {\n    redirect('/login');\n  }\n\n  const client = createServerClient({ apiKey });\n  const balance = await client.credits.balance();\n\n  return (\n    <div>\n      <h1>Dashboard</h1>\n      <p>Credits: {balance.remaining_credits}</p>\n    </div>\n  );\n}\n```\n\n#### Client Component\n\n```tsx\n// app/chat/page.tsx\n'use client';\n\nimport { AINativeProvider, useChat } from '@ainative/next-sdk/client';\n\nexport default function ChatPage({ apiKey }: { apiKey: string }) {\n  return (\n    <AINativeProvider config={{ apiKey }}>\n      <ChatInterface />\n    </AINativeProvider>\n  );\n}\n\nfunction ChatInterface() {\n  const { messages, isLoading, sendMessage } = useChat();\n\n  return (\n    <div>\n      {messages.map((msg, idx) => (\n        <div key={idx}>{msg.content}</div>\n      ))}\n      <button onClick={() => sendMessage('Hello!')}>\n        Send\n      </button>\n    </div>\n  );\n}\n```\n\n#### API Route\n\n```tsx\n// app/api/chat/route.ts\nimport { withAuth, createServerClient } from '@ainative/next-sdk/server';\nimport { NextRequest } from 'next/server';\n\nexport const POST = withAuth(async (req: NextRequest, { session, apiKey }) => {\n  const body = await req.json();\n  const client = createServerClient({ apiKey });\n\n  const response = await client.chat.completions.create({\n    messages: body.messages,\n  });\n\n  return Response.json(response);\n});\n```\n\n### Pages Router (Next.js 12)\n\n#### Page with Server-Side Rendering\n\n```tsx\n// pages/dashboard.tsx\nimport { GetServerSideProps } from 'next';\nimport { getSessionFromCookie, createServerClient, getApiKeyFromCookie } from '@ainative/next-sdk/server';\n\nexport default function DashboardPage({ balance }) {\n  return <div>Credits: {balance.remaining_credits}</div>;\n}\n\nexport const getServerSideProps: GetServerSideProps = async ({ req }) => {\n  const session = getSessionFromCookie(req.headers.cookie);\n\n  if (!session) {\n    return { redirect: { destination: '/login', permanent: false } };\n  }\n\n  const apiKey = getApiKeyFromCookie(req.headers.cookie);\n  const client = createServerClient({ apiKey });\n  const balance = await client.credits.balance();\n\n  return { props: { balance } };\n};\n```\n\n#### API Route\n\n```tsx\n// pages/api/chat.ts\nimport { withAuthPages, createServerClient } from '@ainative/next-sdk/server';\n\nexport default withAuthPages(async (req, res, { session, apiKey }) => {\n  const client = createServerClient({ apiKey });\n\n  const response = await client.chat.completions.create({\n    messages: req.body.messages,\n  });\n\n  res.status(200).json(response);\n});\n```\n\n## API Reference\n\n### Server Utilities\n\n#### `createServerClient(config)`\n\nCreates a server-side API client for use in Server Components, Server Actions, and API routes.\n\n```typescript\nimport { createServerClient } from '@ainative/next-sdk/server';\n\nconst client = createServerClient({\n  apiKey: 'your-jwt-token',\n  baseUrl: 'https://api.ainative.studio/api/v1', // optional\n});\n\n// Chat completions\nconst response = await client.chat.completions.create({\n  messages: [{ role: 'user', content: 'Hello!' }],\n  preferred_model: 'gpt-3.5-turbo',\n  temperature: 0.7,\n});\n\n// Credit balance\nconst balance = await client.credits.balance();\n```\n\n#### `getSession()` (App Router)\n\nGets session from cookies in App Router. Returns `Session | null`.\n\n```typescript\nimport { getSession } from '@ainative/next-sdk/server';\n\nconst session = await getSession(); // default cookie: 'ainative_token'\nconst session = await getSession('custom_cookie'); // custom cookie name\n\nif (session) {\n  console.log(session.userId, session.email);\n}\n```\n\n#### `getSessionFromCookie(cookieHeader)` (Pages Router)\n\nGets session from cookie header in Pages Router. Returns `Session | null`.\n\n```typescript\nimport { getSessionFromCookie } from '@ainative/next-sdk/server';\n\nconst session = getSessionFromCookie(req.headers.cookie);\n```\n\n#### `getApiKey()` (App Router)\n\nGets JWT token from cookies. Returns `string | null`.\n\n```typescript\nimport { getApiKey } from '@ainative/next-sdk/server';\n\nconst apiKey = await getApiKey();\n```\n\n#### `getApiKeyFromCookie(cookieHeader)` (Pages Router)\n\nGets JWT token from cookie header. Returns `string | null`.\n\n```typescript\nimport { getApiKeyFromCookie } from '@ainative/next-sdk/server';\n\nconst apiKey = getApiKeyFromCookie(req.headers.cookie);\n```\n\n#### `withAuth(handler, options?)` (App Router)\n\nHigher-order function to protect API routes in App Router.\n\n```typescript\nimport { withAuth } from '@ainative/next-sdk/server';\n\nexport const POST = withAuth(async (req, { session, apiKey, params }) => {\n  // session: Session object\n  // apiKey: JWT token string\n  // params: Route params (if any)\n\n  return Response.json({ userId: session.userId });\n}, {\n  cookieName: 'ainative_token', // optional\n});\n```\n\n#### `withAuthPages(handler, options?)` (Pages Router)\n\nHigher-order function to protect API routes in Pages Router.\n\n```typescript\nimport { withAuthPages } from '@ainative/next-sdk/server';\n\nexport default withAuthPages(async (req, res, { session, apiKey }) => {\n  res.status(200).json({ userId: session.userId });\n});\n```\n\n### Client Utilities\n\nAll client utilities are re-exported from `@ainative/react-sdk`:\n\n- `AINativeProvider` - Provider component for client-side context\n- `useAINative()` - Access API client in client components\n- `useChat()` - Chat completion hook with state management\n- `useCredits()` - Credit balance hook with auto-refresh\n\nSee [@ainative/react-sdk](https://www.npmjs.com/package/@ainative/react-sdk) for full documentation.\n\n## Types\n\n```typescript\nimport type {\n  // Server types\n  Session,\n  ServerClient,\n  ServerClientConfig,\n  WithAuthOptions,\n\n  // Client types\n  AINativeConfig,\n  Message,\n  ChatCompletionRequest,\n  ChatCompletionResponse,\n  CreditBalance,\n  ChatState,\n} from '@ainative/next-sdk';\n```\n\n## Authentication\n\nThe SDK expects JWT tokens stored in cookies. By default, it looks for a cookie named `ainative_token`.\n\n### Setting the Cookie\n\n```typescript\n// After login, set the JWT token as a cookie\nimport { cookies } from 'next/headers';\n\nasync function loginHandler(email: string, password: string) {\n  // Authenticate with AINative API\n  const response = await fetch('https://api.ainative.studio/api/v1/public/auth/login', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({ email, password }),\n  });\n\n  const { access_token } = await response.json();\n\n  // Set cookie\n  const cookieStore = await cookies();\n  cookieStore.set('ainative_token', access_token, {\n    httpOnly: true,\n    secure: process.env.NODE_ENV === 'production',\n    sameSite: 'lax',\n    maxAge: 60 * 60 * 24 * 7, // 7 days\n  });\n}\n```\n\n### Custom Cookie Name\n\n```typescript\n// Use a custom cookie name\nconst session = await getSession('my_custom_token');\nconst apiKey = await getApiKey('my_custom_token');\n\nexport const POST = withAuth(handler, {\n  cookieName: 'my_custom_token',\n});\n```\n\n## Middleware Example\n\n```typescript\n// middleware.ts\nimport { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\n\nexport function middleware(request: NextRequest) {\n  const token = request.cookies.get('ainative_token')?.value;\n  const isProtected = request.nextUrl.pathname.startsWith('/dashboard');\n\n  if (isProtected && !token) {\n    return NextResponse.redirect(new URL('/login', request.url));\n  }\n\n  return NextResponse.next();\n}\n\nexport const config = {\n  matcher: ['/dashboard/:path*'],\n};\n```\n\n## Error Handling\n\n```typescript\ntry {\n  const client = createServerClient({ apiKey });\n  const response = await client.chat.completions.create({\n    messages: [{ role: 'user', content: 'Hello!' }],\n  });\n} catch (error) {\n  console.error('API error:', error.message);\n  // Handle error appropriately\n}\n```\n\n## Environment Variables\n\n```bash\n# Optional: Override default API URL\nNEXT_PUBLIC_AINATIVE_API_URL=https://api.ainative.studio/api/v1\n```\n\n## Requirements\n\n- Next.js 13.0+ or 14.0+\n- React 18.0+\n- Node.js 18.0+\n\n## Examples\n\nSee the [examples](./examples) directory for complete examples:\n\n- [App Router examples](./examples/app-router)\n- [Pages Router examples](./examples/pages-router)\n\n## Contributing\n\nSee the main [repository](https://github.com/AINative-Studio/core) for contribution guidelines.\n\n## License\n\nMIT\n\n## Support\n\n- Documentation: https://ainative.studio/docs\n- API Reference: https://api.ainative.studio/docs-enhanced\n- Issues: https://github.com/AINative-Studio/core/issues\n","readmeFilename":"README.md","_rev":"1-bc325db967f73d54aa603f924eb9954f"}