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 openaiConfigurer le client
Définissez baseURL et apiKey. Créez le client une seule fois et réutilisez-le.
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 :
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 PromptixCô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
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.
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.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
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.
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().