PopNowDocs API
Intégrations
Contenu principal

Fournisseur Vercel AI SDK

Utilisez les modèles PopNow avec le Vercel AI SDK 7 : generateImage pour images et retouche, generateSpeech, transcribe et modèles de chat, facturés en USD.

@popnow/ai-sdk-provider relie les modèles PopNow au Vercel AI SDK. Avec une seule clé API, vous appelez les modèles de génération et de retouche d’images avec generateImage, la synthèse vocale avec generateSpeech, la transcription avec transcribe, et les modèles de chat avec generateText et streamText. Tout est facturé en USD sur votre solde API distinct.

Le paquet est open source sous licence MIT (GitHub). Il nécessite AI SDK 7 (ai@^7) et Node.js 22 ou plus récent.

En un coup d’œil

Fonction du AI SDKModèles PopNowFabrique
generateImageTexte vers image et retouche d’images : Nano Banana, GPT Image, Seedream, FLUX, Qwen Image et d’autrespopnow.image(id)
generateSpeechSynthèse vocalepopnow.speech(id)
transcribeReconnaissance vocalepopnow.transcription(id)
generateText, streamTextModèles de chat via le point de terminaison compatible OpenAIpopnow(id), popnow.chat(id)

Mise en place

Installer les paquets

npm install @popnow/ai-sdk-provider ai

Créer une clé API

Créez une clé dans la console API. Les clés commencent par sk-popnow-. Le solde API démarre à $0 ; rechargez-le dans la Facturation API avant le premier appel payant.

Mettre la clé dans votre environnement

L’instance popnow par défaut lit POPNOW_API_KEY :

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

Gardez la clé côté serveur. Quiconque peut la lire peut dépenser votre solde API.

Générer une image

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);

Réglages du fournisseur

Pour d’autres réglages, créez votre propre instance avec createPopNow :

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 accepte aussi une fonction fetch personnalisée.

Retoucher une image

Les modèles de retouche ont des IDs qui se terminent par /edit. Passez les images source, et un masque lorsque le modèle en accepte un, dans le 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'],
  },
});

Les URLs sont transmises telles quelles. Les images fournies en octets ou en base64 sont envoyées directement lorsqu’il s’agit de JPEG, PNG, WebP ou GIF d’au plus 1 MiB, et sont sinon envoyées à PopNow.

Comment les réglages correspondent à PopNow

Chaque modèle PopNow valide son input avec son propre JSON Schema et rejette les champs inconnus. Le fournisseur lit le schéma du modèle (GET /api/v1/models/{model}, mis en cache pendant dix minutes) et n’envoie un réglage que si le modèle possède le champ correspondant :

Réglage du AI SDKChamp d’entrée PopNow
promptprompt
aspectRatioaspect_ratio
sizewidth et height ; sinon réduit à aspect_ratio, avec un avertissement compatibility
seedseed
nnum_outputs ou num_images ; pour les modèles qui n’ont aucun des deux, chaque image est une tâche distincte et le AI SDK en lance plusieurs
images du promptimage_urls, ou image_url pour les modèles à une seule image
mask du promptmask_url

Un réglage que le modèle ne possède pas est omis et signalé dans warnings comme unsupported. Tout autre champ du modèle va dans providerOptions.popnow, écrit exactement comme dans le schéma du modèle (snake_case), par exemple resolution, output_format ou quality. Ces valeurs remplacent les valeurs mappées.

Synthèse vocale

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 correspond à voice_id, outputFormat à output_format, et instructions, speed et language à des champs de même nom lorsque le modèle les possède. Le schéma de chaque modèle liste les voix qu’il accepte.

Transcription

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);

Les octets audio sont d’abord envoyés à PopNow (MP3 et WAV, jusqu’à 90 MiB). Une URL publique https:// (audio: new URL('https://...')) est transmise directement à PopNow, sans téléchargement.

Modèles de chat

PopNow sert les modèles de chat par une API compatible OpenAI à https://api.popnow.ai/v1. Le fournisseur utilise @ai-sdk/openai-compatible pour eux, avec la même clé API et le même solde :

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 fonctionne avec le même modèle :

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);

Les modèles de chat sont facturés au token, sans minimum par requête. Modèles de chat répertorie chaque modèle et les paramètres qu’il accepte.

IDs de modèle

Les IDs de modèle ont la forme <maker>/<model>/<task>, par exemple google/nano-banana-2.1/text-to-image, openai/tts-1/text-to-speech ou openai/whisper-1/speech-to-text. Les types TypeScript en suggèrent quelques-uns ; tout ID que votre clé peut appeler fonctionne. Modèles répertorie chaque modèle avec ses paramètres et ses prix. Pour les lister depuis du code, avec leurs schémas d’entrée :

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

modality vaut image, video ou audio. Les modèles de chat sont listés à GET https://api.popnow.ai/v1/models.

Tarifs

Les prix sont en USD par image, par seconde ou par tranche de 1 000 caractères, selon le modèle, et figurent sur Modèles et sur la page de chaque modèle. L’indice des prix IA les liste aussi. Chaque tâche bloque son prix maximal sur votre solde API à son acceptation, puis règle le montant réel à la fin. Les tâches échouées ou expirées ne sont pas facturées. Détails : Facturation et devis.

Chaque entrée d’image dans providerMetadata.popnow.images porte le taskId, son costUsd (une chaîne décimale en USD) et indique si le débit est settled. Les résultats de synthèse et de transcription portent les mêmes champs dans providerMetadata.popnow.

Tâches, interrogation et nouvelles tentatives

La génération PopNow est asynchrone. Chaque appel crée une tâche, attend jusqu’à 60 secondes la réponse à la requête de création, interroge ensuite la tâche (d’abord toutes les 2 secondes, puis jusqu’à toutes les 15 secondes) jusqu’à son état final, et télécharge les fichiers de sortie depuis leurs liens signés. La clé API n’est jamais envoyée à ces liens.

Ces options vont dans providerOptions.popnow et ne sont pas envoyées au modèle :

OptionValeur par défautSignification
pollIntervalMs2000Premier délai entre deux interrogations
pollTimeoutMsÉchéance de la tâche plus deux minutesArrête l’attente après ce délai ; la tâche continue
waitSeconds60Durée pendant laquelle la requête de création reste ouverte (de 0 à 60)
idempotencyKeyGénéré à chaque appelClé stable pour une génération logique
metadataAucuneVos propres étiquettes, enregistrées avec la tâche

Chaque requête de création porte un Idempotency-Key. Les erreurs de connexion, les 429 et les réponses 5xx réessayables sont relancées deux fois avec la même clé, si bien qu’une nouvelle tentative ne lance jamais une seconde tâche. Lorsque vous passez votre propre idempotencyKey, les nouvelles tentatives du AI SDK (maxRetries) la réutilisent aussi. Voir Idempotence.

abortSignal arrête l’attente immédiatement. Une tâche déjà acceptée continue de tourner sur PopNow.

Erreurs

  • APICallError (de @ai-sdk/provider) pour les erreurs d’API. Le message contient le code métier PopNow, par exemple 40201 (solde API insuffisant) ou 40301 (la clé ne peut pas appeler ce modèle). Voir Erreurs.
  • PopNowTaskError lorsqu’une tâche se termine en failed ou expired. Elle expose taskId, state, errorCode (par exemple content_rejected), errorMessage et costUsd. Ces tâches ne sont pas facturées.
  • PopNowTaskTimeoutError lorsque pollTimeoutMs est écoulé. Elle expose taskId ; la tâche continue de tourner.
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);
}

Non inclus

Quelle version du AI SDK faut-il ?

AI SDK 7 (ai@^7) sur Node.js 22 ou plus récent. Installez les deux avec npm install @popnow/ai-sdk-provider ai.

Puis-je l’appeler depuis le navigateur ?

Pas avec votre clé API dans la page : quiconque peut lire la clé peut dépenser votre solde API. Appelez le AI SDK depuis une route serveur, comme un gestionnaire de route Next.js ou une server action, et envoyez le résultat au navigateur.

Prend-il en charge les modèles vidéo ?

Pas encore, car l’interface vidéo du AI SDK est expérimentale. Utilisez l’API de tâches ou le SDK JavaScript pour la vidéo.

Comment voir le coût d’un appel ?

Lisez providerMetadata.popnow : chaque tâche indique son taskId, son costUsd et si le débit est settled. La console API affiche l’usage par clé.

Sur cette page