Aller au contenu

SDK OpenAI pour Node.js

Utilisez le package npm officiel openai avec Promptix en changeant simplement baseURL.

Le package npm officiel openai fonctionne tel quel avec Promptix, sous Node.js 18+, Bun, Deno et les environnements edge. Faites-le pointer vers l'URL de base de Promptix et utilisez votre clé Promptix.

Installation

npm install openai

Configurer le client

Définissez baseURL et apiKey. Créez le client une seule fois et réutilisez-le.

client.tsTypeScript
import OpenAI from 'openai'; export const promptix = new OpenAI({  baseURL: 'https://promptix.tn/api/v1', // the only line that changes  apiKey: process.env.PROMPTIX_API_KEY,});

Ou, sans modifier le code, définissez les variables d'environnement que le SDK lit par défaut :

terminalbash
export OPENAI_BASE_URL="https://promptix.tn/api/v1"export OPENAI_API_KEY="$PROMPTIX_API_KEY" # Existing code that calls new OpenAI() with no options now goes through Promptix

Côté serveur uniquement

Ne créez pas le client dans du code navigateur et n'utilisez pas dangerouslyAllowBrowser : votre clé serait visible par tous. Appelez Promptix depuis un route handler, une server action ou votre API.

Chat completion

chat.tsTypeScript
import { promptix } from './client.js'; const completion = await promptix.chat.completions.create({  model: 'anthropic/claude-sonnet-5',  messages: [    { role: 'system', content: 'You are a helpful assistant who answers in French.' },    { role: 'user', content: 'Explain what a VAT number is in two sentences.' },  ],  temperature: 0.3,  max_tokens: 300,}); console.log(completion.choices[0].message.content);console.log(completion.usage?.total_tokens, 'tokens');

Streaming

Passez stream: true et itérez avec for await. Voir Streaming pour le format des événements.

stream.tsTypeScript
const stream = await promptix.chat.completions.create({  model: 'openai/gpt-6-luna',  messages: [{ role: 'user', content: 'List five dishes from Tunisian cuisine.' }],  stream: true,}); for await (const chunk of stream) {  process.stdout.write(chunk.choices[0]?.delta?.content ?? '');}

Dans un route handler Next.js, transmettez les tokens au navigateur au fur et à mesure :

app/api/chat/route.tsTypeScript
// app/api/chat/route.ts: stream the answer to the browser as plain textimport OpenAI from 'openai'; const promptix = new OpenAI({  baseURL: 'https://promptix.tn/api/v1',  apiKey: process.env.PROMPTIX_API_KEY,}); export async function POST(req: Request) {  const { prompt } = await req.json();   const stream = await promptix.chat.completions.create({    model: 'openai/gpt-6-luna',    messages: [{ role: 'user', content: String(prompt) }],    max_tokens: 800,    stream: true,  });   const encoder = new TextEncoder();  const body = new ReadableStream({    async start(controller) {      try {        for await (const chunk of stream) {          const text = chunk.choices[0]?.delta?.content;          if (text) controller.enqueue(encoder.encode(text));        }        controller.close();      } catch (err) {        controller.error(err);      }    },  });   return new Response(body, { headers: { 'Content-Type': 'text/plain; charset=utf-8' } });}

Appel d'outils

tools.mjsJavaScript
const tools = [  {    type: 'function',    function: {      name: 'get_order_status',      description: 'Look up an order by its number',      parameters: {        type: 'object',        properties: { orderId: { type: 'string' } },        required: ['orderId'],      },    },  },]; const messages = [{ role: 'user', content: 'Where is my order 10452?' }];const first = await promptix.chat.completions.create({ model: 'openai/gpt-6-luna', messages, tools });const call = first.choices[0].message.tool_calls?.[0]; if (call) {  const args = JSON.parse(call.function.arguments);  const result = { orderId: args.orderId, status: 'shipped', eta: '2 days' }; // your own lookup   const second = await promptix.chat.completions.create({    model: 'openai/gpt-6-luna',    tools,    messages: [      ...messages,      first.choices[0].message,      { role: 'tool', tool_call_id: call.id, content: JSON.stringify(result) },    ],  });  console.log(second.choices[0].message.content);}

Erreurs et nouvelles tentatives

Le SDK réessaie deux fois par défaut les réponses 408, 409, 429 et 5xx (option maxRetries) et lève des sous-classes de OpenAI.APIError. Voir Erreurs et limites.

errors.tsTypeScript
import OpenAI from 'openai'; try {  await promptix.chat.completions.create({    model: 'openai/gpt-6-luna',    messages: [{ role: 'user', content: 'Hello' }],  });} catch (err) {  if (err instanceof OpenAI.APIError) {    // err.status: 401, 402, 429...; err.code: 'key_monthly_limit' for the per-key limit    console.error(err.status, err.code, err.message);  }  throw err;}

Ce qui n'est pas disponible

Les chat completions et client.models.list() sont exposés. embeddings, images, audio, responses et files ne sont pas disponibles via l'URL de base de Promptix. Consultez la liste des modèles pour les champs renvoyés par models.list().