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-Funktion | PopNow-Modelle | Factory |
|---|---|---|
generateImage | Text zu Bild und Bildbearbeitung: Nano Banana, GPT Image, Seedream, FLUX, Qwen Image und mehr | popnow.image(id) |
generateSpeech | Text zu Sprache | popnow.speech(id) |
transcribe | Sprache zu Text | popnow.transcription(id) |
generateText, streamText | Chat-Modelle über den OpenAI-kompatiblen Endpunkt | popnow(id), popnow.chat(id) |
Einrichten
Pakete installieren
npm install @popnow/ai-sdk-provider aiAPI-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
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:
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:
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-Einstellung | PopNow-Eingabefeld |
|---|---|
prompt | prompt |
aspectRatio | aspect_ratio |
size | width und height; sonst auf aspect_ratio reduziert, mit einer compatibility-Warnung |
seed | seed |
n | num_outputs oder num_images; bei Modellen ohne beides ist jedes Bild ein eigener Task, und das AI SDK führt mehrere aus |
Prompt-images | image_urls, bei Einzelbild-Modellen image_url |
Prompt-mask | mask_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
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
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:
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:
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:
| Option | Standard | Bedeutung |
|---|---|---|
pollIntervalMs | 2000 | Erste Wartezeit zwischen den Abfragen |
pollTimeoutMs | Task-Frist plus zwei Minuten | Nach dieser Zeit hört das Warten auf; der Task läuft weiter |
waitSeconds | 60 | Wie lange die Anfrage zum Anlegen offen gehalten wird (0 bis 60) |
idempotencyKey | Pro Aufruf erzeugt | Stabiler Schlüssel für eine logische Generierung |
metadata | Keine | Eigene 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, etwa40201(nicht genug API-Guthaben) oder40301(der Schlüssel darf dieses Modell nicht aufrufen). Siehe Fehler.PopNowTaskError, wenn ein Task alsfailedoderexpiredendet. Er hattaskId,state,errorCode(zum Beispielcontent_rejected),errorMessageundcostUsd. Diese Tasks werden nicht berechnet.PopNowTaskTimeoutError, wennpollTimeoutMsabläuft. Er hattaskId; der Task läuft weiter.
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.
embeddingModelwirftNoSuchModelError.
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.
Verwandte Seiten
LangChain
Tools für LangChain- und LangGraph-Agenten, die mit PopNow KI-Bilder, Videos, Musik und Sprache erzeugen. Kostenpflichtige Aufrufe werden zuerst in USD bepreist.
n8n
Erzeuge KI-Bilder, Video und Audio in n8n mit dem integrierten HTTP-Request-Node und der PopNow-API. Importierbares Workflow-JSON, Einrichtung der Zugangsdaten, Abfrageschleife, Webhooks und Lösungen für häufige Fehler.

