Skip to main content

Installation

npm install openai
# or
yarn add openai
# or
pnpm add openai

Configuration

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: "mvra_live_your_key_here",
  baseURL: "https://app.mavera.io/api/v1",
});
Store your API key in an environment variable: MAVERA_API_KEY
const client = new OpenAI({
  apiKey: process.env.MAVERA_API_KEY,
  baseURL: "https://app.mavera.io/api/v1",
});

Chat Completions

Basic Usage

const response = await client.chat.completions.create({
  model: "mavera-1",
  messages: [
    { role: "system", content: "You are a helpful assistant." },
    { role: "user", content: "What are the latest trends in AI?" },
  ],
  persona_id: "YOUR_PERSONA_ID",
});

console.log(response.choices[0].message.content);
console.log("Credits used:", response.usage.credits_used);

Streaming

const stream = await client.chat.completions.create({
  model: "mavera-1",
  messages: [{ role: "user", content: "Write a short story" }],
  persona_id: "YOUR_PERSONA_ID",
  stream: true,
});

for await (const chunk of stream) {
  const content = chunk.choices[0]?.delta?.content;
  if (content) {
    process.stdout.write(content);
  }
}

With Analysis Mode

const response = await client.chat.completions.create({
  model: "mavera-1",
  messages: [
    { role: "user", content: "How do millennials feel about remote work?" },
  ],
  persona_id: "YOUR_PERSONA_ID",
  analysis_mode: true,
  reasoning_effort: "high",
});

// Access analysis data
const analysis = response.analysis;
console.log(`Confidence: ${analysis.confidence}/10`);

REST API Endpoints

For non-Chat endpoints, use fetch:
const headers = {
  Authorization: "Bearer mvra_live_your_key_here",
  "Content-Type": "application/json",
};
const baseURL = "https://app.mavera.io/api/v1";

// List personas
const personasRes = await fetch(`${baseURL}/personas`, { headers });
const { data: personas } = await personasRes.json();

// Mave Agent
const maveRes = await fetch(`${baseURL}/mave/chat`, {
  method: "POST",
  headers,
  body: JSON.stringify({ message: "Analyze the EV market" }),
});
const maveResult = await maveRes.json();

// Create Focus Group
const fgRes = await fetch(`${baseURL}/focus-groups`, {
  method: "POST",
  headers,
  body: JSON.stringify({
    name: "Product Feedback",
    sample_size: 50,
    persona_ids: ["persona_1", "persona_2"],
    questions: [...],
  }),
});

TypeScript Support

The SDK includes full TypeScript types:
import OpenAI from "openai";
import type { ChatCompletion } from "openai/resources/chat/completions";

const client = new OpenAI({
  apiKey: process.env.MAVERA_API_KEY,
  baseURL: "https://app.mavera.io/api/v1",
});

const response: ChatCompletion = await client.chat.completions.create({
  model: "mavera-1",
  messages: [{ role: "user", content: "Hello" }],
  // @ts-expect-error - Mavera-specific field
  persona_id: "YOUR_PERSONA_ID",
});

Error Handling

import OpenAI from "openai";

try {
  const response = await client.chat.completions.create({...});
} catch (error) {
  if (error instanceof OpenAI.AuthenticationError) {
    console.error("Invalid API key");
  } else if (error instanceof OpenAI.RateLimitError) {
    console.error("Rate limited - implement backoff");
  } else if (error instanceof OpenAI.APIError) {
    if (error.status === 402) {
      console.error("Insufficient credits");
    } else {
      console.error("API error:", error.message);
    }
  }
}

Edge Runtime / Vercel

Works in Edge Runtime environments:
// app/api/chat/route.ts
import OpenAI from "openai";

export const runtime = "edge";

const client = new OpenAI({
  apiKey: process.env.MAVERA_API_KEY,
  baseURL: "https://app.mavera.io/api/v1",
});

export async function POST(req: Request) {
  const { message } = await req.json();

  const response = await client.chat.completions.create({
    model: "mavera-1",
    messages: [{ role: "user", content: message }],
    persona_id: process.env.PERSONA_ID,
  });

  return Response.json(response);
}

React / Next.js Example

"use client";

import { useState } from "react";

export function Chat() {
  const [message, setMessage] = useState("");
  const [response, setResponse] = useState("");

  const handleSubmit = async () => {
    const res = await fetch("/api/chat", {
      method: "POST",
      body: JSON.stringify({ message }),
    });
    const data = await res.json();
    setResponse(data.choices[0].message.content);
  };

  return (
    <div>
      <input value={message} onChange={(e) => setMessage(e.target.value)} />
      <button onClick={handleSubmit}>Send</button>
      <p>{response}</p>
    </div>
  );
}