Le package Python officiel openai fonctionne tel quel avec Promptix. Faites-le pointer vers l'URL de base de Promptix, utilisez votre clé Promptix et choisissez n'importe quel modèle du catalogue.
Installation
pip install --upgrade openaiConfigurer le client
Définissez base_url et api_key. Tout le reste de votre code est inchangé.
import osfrom openai import OpenAI client = OpenAI( base_url="https://promptix.tn/api/v1", # the only line that changes api_key=os.environ["PROMPTIX_API_KEY"],)Vous pouvez aussi, sans toucher au code, définir 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 OpenAI() with no arguments now goes through PromptixChat completion
import osfrom openai import OpenAI client = OpenAI( base_url="https://promptix.tn/api/v1", api_key=os.environ["PROMPTIX_API_KEY"],) completion = client.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,) print(completion.choices[0].message.content)print(completion.usage.total_tokens, "tokens")Streaming
Passez stream=True et parcourez les chunks. Le dernier chunk contient usage et peut avoir une liste choices vide, d'où la vérification. Voir Streaming.
stream = client.chat.completions.create( model="openai/gpt-6-luna", messages=[{"role": "user", "content": "List five dishes from Tunisian cuisine."}], stream=True,) for chunk in stream: if chunk.choices and chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="", flush=True)Client asynchrone
AsyncOpenAI accepte les mêmes options. Pratique pour les serveurs web (FastAPI, vues asynchrones Django) et les traitements en lot.
import asyncioimport osfrom openai import AsyncOpenAI client = AsyncOpenAI( base_url="https://promptix.tn/api/v1", api_key=os.environ["PROMPTIX_API_KEY"],) async def summarize(text: str) -> str: completion = await client.chat.completions.create( model="openai/gpt-6-luna", messages=[{"role": "user", "content": f"Summarize in one sentence:\n\n{text}"}], max_tokens=100, ) return completion.choices[0].message.content async def main(): texts = ["First document...", "Second document...", "Third document..."] # Keep concurrency modest: providers rate-limit bursts semaphore = asyncio.Semaphore(4) async def bounded(t: str) -> str: async with semaphore: return await summarize(t) for summary in await asyncio.gather(*(bounded(t) for t in texts)): print(summary) asyncio.run(main())Sortie structurée
Sur les modèles qui prennent en charge les schémas JSON, l'assistant parse du SDK renvoie des objets typés :
from pydantic import BaseModel class Invoice(BaseModel): city: str amount_tnd: float completion = client.chat.completions.parse( model="openai/gpt-6-luna", messages=[{"role": "user", "content": "Invoice from Sousse, total due 245.500 dinars."}], response_format=Invoice,) invoice = completion.choices[0].message.parsedprint(invoice.city, invoice.amount_tnd)Erreurs et nouvelles tentatives
Le SDK réessaie deux fois par défaut les réponses 408, 409, 429 et 5xx (réglez max_retries sur le client pour changer ce comportement) et lève des exceptions typées. Les cas propres à Promptix sont décrits dans Erreurs et limites.
import openai try: completion = client.chat.completions.create( model="openai/gpt-6-luna", messages=[{"role": "user", "content": "Hello"}], )except openai.AuthenticationError: ... # 401: invalid or revoked keyexcept openai.RateLimitError: ... # 429: provider throttling (already retried by the SDK)except openai.APIStatusError as e: if e.status_code == 402: ... # balance too low, or key_monthly_limit reached raiseCe qui n'est pas disponible
Promptix expose les chat completions et client.models.list(). Les autres endpoints OpenAI (embeddings, images, audio, responses, 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().