PopNowAPI-Doku
Integrationen
Hauptinhalt

Vercel-AI-SDK-Provider

PopNow-Modelle im Vercel AI SDK 7 nutzen: generateImage für Bilder und Bildbearbeitung, generateSpeech, transcribe und Chat-Modelle, abgerechnet in USD.

@popnow/ai-sdk-provider verbindet PopNow-Modelle mit dem Vercel AI SDK. Mit einem API-Schlüssel rufst du Bilderzeugungs- und Bildbearbeitungsmodelle über generateImage auf, Text zu Sprache über generateSpeech, Sprache zu Text über transcribe und Chat-Modelle über generateText und streamText. Alles wird in USD aus deinem separaten API-Guthaben abgerechnet.

Das Paket ist Open Source unter der MIT-Lizenz (GitHub). Es setzt AI SDK 7 (ai@^7) und Node.js 22 oder neuer voraus.

Auf einen Blick

AI-SDK-FunktionPopNow-ModelleFactory
generateImageText zu Bild und Bildbearbeitung: Nano Banana, GPT Image, Seedream, FLUX, Qwen Image und mehrpopnow.image(id)
generateSpeechText zu Sprachepopnow.speech(id)
transcribeSprache zu Textpopnow.transcription(id)
generateText, streamTextChat-Modelle über den OpenAI-kompatiblen Endpunktpopnow(id), popnow.chat(id)

Einrichten

Pakete installieren

npm install @popnow/ai-sdk-provider ai

API-Schlüssel anlegen

Lege einen Schlüssel in der API-Konsole an. Schlüssel beginnen mit sk-popnow-. Das API-Guthaben beginnt bei $0; lade es vor dem ersten kostenpflichtigen Aufruf unter API-Abrechnung auf.

Schlüssel in die Umgebung legen

Die Standardinstanz popnow liest POPNOW_API_KEY:

export POPNOW_API_KEY="sk-popnow-..."

Bewahre den Schlüssel auf deinem Server auf. Wer ihn lesen kann, kann dein API-Guthaben ausgeben.

Ein Bild erzeugen

TypeScript
import { popnow } from '@popnow/ai-sdk-provider';
import { generateImage } from 'ai';
import fs from 'node:fs';

const { image } = await generateImage({
  model: popnow.image('google/nano-banana-2.1/text-to-image'),
  prompt: 'A cozy reading nook beside a rain-streaked window, warm lamp light',
  aspectRatio: '16:9',
  providerOptions: {
    popnow: { resolution: '2k' },
  },
});

await fs.promises.writeFile('nook.png', image.uint8Array);

Provider-Einstellungen

Für andere Einstellungen erstellst du mit createPopNow eine eigene Instanz:

TypeScript
import { createPopNow } from '@popnow/ai-sdk-provider';

const popnow = createPopNow({
  apiKey: process.env.POPNOW_API_KEY, // default: POPNOW_API_KEY
  baseURL: 'https://api.popnow.ai', // default: POPNOW_BASE_URL or https://api.popnow.ai
  headers: { 'X-PopNow-Tags': 'my-app' }, // optional, sent with every request
});

createPopNow nimmt außerdem eine eigene fetch-Funktion entgegen.

Bild bearbeiten

Bearbeitungsmodelle haben IDs, die auf /edit enden. Übergib die Quellbilder und, wo das Modell eine Maske nimmt, die Maske im Prompt:

TypeScript
import { popnow } from '@popnow/ai-sdk-provider';
import { generateImage } from 'ai';

const { image } = await generateImage({
  model: popnow.image('google/nano-banana-2.1/edit'),
  prompt: {
    text: 'Change the jacket to deep forest green; keep the face and background',
    images: ['https://example.com/portrait.jpg'],
  },
});

URLs werden unverändert übergeben. Bilder als Bytes oder Base64 werden direkt mitgesendet, wenn sie JPEG, PNG, WebP oder GIF mit höchstens 1 MiB sind, und sonst zu PopNow hochgeladen.

So werden Einstellungen auf PopNow abgebildet

Jedes PopNow-Modell prüft sein input gegen sein eigenes JSON-Schema und lehnt unbekannte Felder ab. Der Provider liest das Schema des Modells (GET /api/v1/models/{model}, zehn Minuten zwischengespeichert) und sendet eine Einstellung nur, wenn das Modell das passende Feld hat:

AI-SDK-EinstellungPopNow-Eingabefeld
promptprompt
aspectRatioaspect_ratio
sizewidth und height; sonst auf aspect_ratio reduziert, mit einer compatibility-Warnung
seedseed
nnum_outputs oder num_images; bei Modellen ohne beides ist jedes Bild ein eigener Task, und das AI SDK führt mehrere aus
Prompt-imagesimage_urls, bei Einzelbild-Modellen image_url
Prompt-maskmask_url

Eine Einstellung, die das Modell nicht hat, wird weggelassen und in warnings als unsupported gemeldet. Jedes andere Modellfeld gehört in providerOptions.popnow, genau so geschrieben wie im Schema des Modells (snake_case), zum Beispiel resolution, output_format oder quality. Diese Werte überschreiben die abgebildeten.

Text zu Sprache

TypeScript
import { popnow } from '@popnow/ai-sdk-provider';
import { generateSpeech } from 'ai';
import fs from 'node:fs';

const { audio } = await generateSpeech({
  model: popnow.speech('openai/tts-1/text-to-speech'),
  text: 'Hello from PopNow.',
  voice: 'nova',
  speed: 1.1,
});

await fs.promises.writeFile('hello.mp3', audio.uint8Array);

voice wird auf voice_id abgebildet, outputFormat auf output_format, und instructions, speed und language auf gleichnamige Felder, wenn das Modell sie hat. Das Schema jedes Modells listet die Stimmen, die es akzeptiert.

Transkription

TypeScript
import { popnow } from '@popnow/ai-sdk-provider';
import { transcribe } from 'ai';
import fs from 'node:fs';

const result = await transcribe({
  model: popnow.transcription('openai/whisper-1/speech-to-text'),
  audio: await fs.promises.readFile('meeting.mp3'),
  providerOptions: { popnow: { language: 'en' } },
});

console.log(result.text, result.words);

Audiodaten werden zuerst zu PopNow hochgeladen (MP3 und WAV, bis 90 MiB). Eine öffentliche https://-URL (audio: new URL('https://...')) wird ohne Download direkt an PopNow übergeben.

Chat-Modelle

PopNow stellt Chat-Modelle über eine OpenAI-kompatible API unter https://api.popnow.ai/v1 bereit. Der Provider nutzt dafür @ai-sdk/openai-compatible, mit demselben API-Schlüssel und demselben Guthaben:

TypeScript
import { popnow } from '@popnow/ai-sdk-provider';
import { generateText } from 'ai';

const { text } = await generateText({
  model: popnow('anthropic/claude-haiku-5.5/chat'),
  prompt: 'Suggest three names for a kite shop by the sea.',
});

streamText funktioniert mit demselben Modell:

TypeScript
import { popnow } from '@popnow/ai-sdk-provider';
import { streamText } from 'ai';

const result = streamText({
  model: popnow('anthropic/claude-haiku-5.5/chat'),
  prompt: 'Write a short welcome message for a kite shop.',
});

for await (const delta of result.textStream) process.stdout.write(delta);

Chat-Modelle werden pro Token abgerechnet, ohne Mindestbetrag pro Anfrage. Chat-Modelle listet jedes Modell und die Parameter auf, die es akzeptiert.

Modell-IDs

Modell-IDs haben die Form <maker>/<model>/<task>, zum Beispiel google/nano-banana-2.1/text-to-image, openai/tts-1/text-to-speech oder openai/whisper-1/speech-to-text. Die TypeScript-Typen schlagen einige vor; jede ID, die dein Schlüssel aufrufen darf, funktioniert. Modelle listet jedes Modell mit Parametern und Preisen. Um sie mit Eingabeschemas aus Code abzurufen:

curl "https://api.popnow.ai/api/v1/models?modality=image&includeSchema=1" \
  -H "Authorization: Bearer $POPNOW_API_KEY"

modality ist image, video oder audio. Chat-Modelle werden unter GET https://api.popnow.ai/v1/models aufgelistet.

Preise

Preise stehen in USD pro Bild, pro Sekunde oder pro 1.000 Zeichen, je nach Modell, und sind auf Modelle und der Seite jedes Modells angegeben. Der KI-Preisindex listet sie ebenfalls auf. Jeder Task reserviert beim Annehmen seinen maximalen Preis aus deinem API-Guthaben und verrechnet den tatsächlichen Betrag, wenn er fertig ist. Tasks, die fehlschlagen oder ablaufen, werden nicht berechnet. Details: Abrechnung und Angebote.

Jeder Bildeintrag in providerMetadata.popnow.images enthält die taskId, seine costUsd (ein USD-Dezimalstring) und ob die Belastung settled ist. Sprach- und Transkriptionsergebnisse tragen dieselben Felder in providerMetadata.popnow.

Tasks, Abfrage und Wiederholungen

PopNow-Generierung ist asynchron. Jeder Aufruf legt einen Task an, wartet bis zu 60 Sekunden auf die Anfrage zum Anlegen, fragt dann den Task ab (zuerst alle 2 Sekunden, später bis alle 15 Sekunden), bis er endgültig ist, und lädt die Ausgabedateien über ihre signierten Links herunter. Der API-Schlüssel wird nie an diese Links gesendet.

Diese Optionen gehören in providerOptions.popnow und werden nicht an das Modell gesendet:

OptionStandardBedeutung
pollIntervalMs2000Erste Wartezeit zwischen den Abfragen
pollTimeoutMsTask-Frist plus zwei MinutenNach dieser Zeit hört das Warten auf; der Task läuft weiter
waitSeconds60Wie lange die Anfrage zum Anlegen offen gehalten wird (0 bis 60)
idempotencyKeyPro Aufruf erzeugtStabiler Schlüssel für eine logische Generierung
metadataKeineEigene Labels, die mit dem Task gespeichert werden

Jede Anfrage zum Anlegen trägt einen Idempotency-Key. Verbindungsfehler, 429 und wiederholbare 5xx-Antworten werden zweimal mit demselben Schlüssel wiederholt, sodass ein erneuter Versuch nie einen zweiten Task startet. Wenn du deinen eigenen idempotencyKey übergibst, verwenden auch die Wiederholungen des AI SDK (maxRetries) ihn. Siehe Idempotenz.

abortSignal beendet das Warten sofort. Ein bereits angenommener Task läuft auf PopNow weiter.

Fehler

  • APICallError (aus @ai-sdk/provider) für API-Fehler. Die Meldung enthält den PopNow-Geschäftscode, etwa 40201 (nicht genug API-Guthaben) oder 40301 (der Schlüssel darf dieses Modell nicht aufrufen). Siehe Fehler.
  • PopNowTaskError, wenn ein Task als failed oder expired endet. Er hat taskId, state, errorCode (zum Beispiel content_rejected), errorMessage und costUsd. Diese Tasks werden nicht berechnet.
  • PopNowTaskTimeoutError, wenn pollTimeoutMs abläuft. Er hat taskId; der Task läuft weiter.
TypeScript
import { popnow, PopNowTaskError } from '@popnow/ai-sdk-provider';
import { generateImage } from 'ai';

try {
  await generateImage({
    model: popnow.image('google/nano-banana-2.1/text-to-image'),
    prompt: 'A lighthouse at dawn, watercolor',
  });
} catch (error) {
  if (PopNowTaskError.isInstance(error)) console.log(error.taskId, error.errorCode);
}

Nicht enthalten

  • Video. Das Videomodell-Interface des AI SDK ist noch experimentell (experimental_generateVideo), deshalb implementiert dieses Paket es noch nicht. PopNow-Videomodelle sind über die Task-API, die offiziellen SDKs und die OpenAI-Videos-kompatiblen Endpunkte verfügbar.
  • Embeddings. embeddingModel wirft NoSuchModelError.

Welche Version des AI SDK wird benötigt?

AI SDK 7 (ai@^7) auf Node.js 22 oder neuer. Installiere beides mit npm install @popnow/ai-sdk-provider ai.

Kann ich es im Browser aufrufen?

Nicht mit deinem API-Schlüssel auf der Seite: Wer den Schlüssel lesen kann, kann dein API-Guthaben ausgeben. Rufe das AI SDK aus einer Server-Route auf, etwa einem Next.js-Route-Handler oder einer Server Action, und schicke das Ergebnis an den Browser.

Unterstützt es Videomodelle?

Noch nicht, weil das Videointerface des AI SDK noch experimentell ist. Nutze für Video die Task-API oder das JavaScript-SDK.

Wie sehe ich, was ein Aufruf gekostet hat?

Lies providerMetadata.popnow: Jeder Task meldet seine taskId, costUsd und ob die Belastung settled ist. Die API-Konsole zeigt die Nutzung pro Schlüssel.

Auf dieser Seite