We gebruiken cookies. Cookies en browseropslag houden je ingelogd en onthouden je voorkeuren. Met je toestemming meten we ook hoe de site wordt gebruikt. Je kunt je wanneer je wilt. Zie ons cookiebeleid.

Python

SDK-gidsen

Python

Gebruik het officiële Python-pakket openai met api14: client en async client instellen, chat, streaming, tool calling, Pydantic en foutafhandeling.

Gebruik het officiële Python-pakket openai met api14. Stel base_url en api_key in; gebruik elk model-id (bijvoorbeeld openai/gpt-5-mini) als model.

Installeren

pip install openai
export API14_API_KEY="sk-api14-..."

Configureren

from openai import OpenAI
import os

client = OpenAI(
    base_url="https://api14.com/api/v1",
    api_key=os.environ["API14_API_KEY"],
)

Er is ook een asynchrone client: from openai import AsyncOpenAI neemt dezelfde argumenten. Gebruik die wanneer je veel requests tegelijk uitvoert, bijvoorbeeld in een webserver of batchtaak:

import asyncio
from openai import AsyncOpenAI

aclient = AsyncOpenAI(base_url="https://api14.com/api/v1", api_key=os.environ["API14_API_KEY"])

async def ask(q):
    r = await aclient.chat.completions.create(model="openai/gpt-5-mini", messages=[{"role": "user", "content": q}])
    return r.choices[0].message.content

async def main():
    return await asyncio.gather(*(ask(q) for q in ["What is RAG?", "What is a token?"]))

answers = asyncio.run(main())

Houd de gelijktijdigheid onder de limiet voor requests per minuut van je abonnement. Zie Gids: batchverwerking.

Zonder argumenten leest OpenAI() OPENAI_BASE_URL en OPENAI_API_KEY, zodat je een bestaande app alleen via de omgeving op api14 kunt richten:

export OPENAI_BASE_URL="https://api14.com/api/v1"
export OPENAI_API_KEY="sk-api14-..."

Chat

result = client.chat.completions.create(
    model="openai/gpt-5-mini",
    messages=[{"role": "user", "content": "Explain vector databases in two sentences."}],
)
print(result.choices[0].message.content)

Streaming

stream = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.5",
    messages=[{"role": "user", "content": "Write a haiku about APIs."}],
    stream=True,
)
for chunk in stream:
    if chunk.choices:
        print(chunk.choices[0].delta.content or "", end="")

Zie Streaming.

Tool calling

import json

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Current weather for a city",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    },
}]
messages = [{"role": "user", "content": "What's the weather in Istanbul?"}]

while True:
    res = client.chat.completions.create(model="openai/gpt-5-mini", messages=messages, tools=tools)
    msg = res.choices[0].message
    if not msg.tool_calls:
        break
    messages.append(msg)
    for call in msg.tool_calls:
        args = json.loads(call.function.arguments)
        result = get_weather(**args)  # je eigen functie
        messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})

print(msg.content)

Zie Tool calling.

Gestructureerde uitvoer

client.chat.completions.parse zet een Pydantic-model om in een strikt JSON Schema en geeft het geparste object terug. Het vereist een recente openai-release; oudere 1.x-versies bieden het aan als client.beta.chat.completions.parse. Gebruik een model waarvan de supported_parameters structured_outputs of response_format bevatten:

from pydantic import BaseModel

class Person(BaseModel):
    name: str
    born: int
    city: str

res = client.chat.completions.parse(
    model="openai/gpt-5-mini",
    messages=[{"role": "user", "content": "Extract: Ada Lovelace, born 1815 in London."}],
    response_format=Person,
)
person = res.choices[0].message.parsed  # Person(name='Ada Lovelace', born=1815, city='London')

Zie Structured outputs.

Afbeeldingen als invoer

import base64

image = base64.b64encode(open("photo.png", "rb").read()).decode()

res = client.chat.completions.create(
    model="google/gemini-2.5-flash",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "What is in this picture?"},
            {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{image}"}},
        ],
    }],
)

Een openbare https://-URL werkt ook. Zie Beeld en bestanden.

Afbeeldingen genereren

result = client.images.generate(
    model="openai/gpt-5.4-image-2",
    prompt="A minimalist product photo of a ceramic mug on a wooden table",
    n=1,
    extra_body={"aspect_ratio": "1:1"},
)
open("image.png", "wb").write(base64.b64decode(result.data[0].b64_json))

Parameters die de SDK niet kent (aspect_ratio, provider, models, reasoning) gaan in extra_body.

Spraak en transcriptie

audio = client.audio.speech.create(
    model="openai/gpt-4o-mini-tts",
    input="Hello from api14!",
    voice="alloy",
)
audio.write_to_file("speech.mp3")

text = client.audio.transcriptions.create(
    model="openai/whisper-1",
    file=open("speech.mp3", "rb"),
)
print(text.text)

Fouten

import openai

try:
    client.chat.completions.create(
        model="openai/gpt-5-mini",
        messages=[{"role": "user", "content": "Hi"}],
    )
except openai.APIStatusError as e:
    if e.status_code == 402:
        print("Balance too low, add funds:", e.code)  # insufficient_balance
    elif e.status_code == 429:
        print("Retry after", e.response.headers.get("retry-after"), "s:", e.code)  # rate_limited
    else:
        raise

Zie Fouten.

Timeouts en nieuwe pogingen

De SDK probeert verbindingsfouten, 408, 409, 429 en 5xx standaard twee keer opnieuw met exponentiële backoff, waarbij Retry-After wordt gerespecteerd. De standaardtimeout is 10 minuten. Configureer beide op de client, of per aanroep met with_options:

import httpx

client = OpenAI(
    base_url="https://api14.com/api/v1",
    api_key=os.environ["API14_API_KEY"],
    timeout=httpx.Timeout(60.0, connect=5.0),
    max_retries=4,
)

client.with_options(timeout=300, max_retries=0).chat.completions.create(...)

Opnieuw proberen helpt niet bij daily_limit_reached of insufficient_balance; stop en geef in plaats daarvan een melding. Zie Rate limits.

Alle mogelijkheden

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api14.com/api/v1",
  apiKey: process.env.API14_API_KEY,
});

const result = await client.chat.completions.create({
  "model": "openai/gpt-5-mini",
  "messages": [
    {
      "role": "user",
      "content": "Explain vector databases in two sentences."
    }
  ]
});
console.log(result.choices[0].message.content);