BazaarLinkBazaarLink
Anmelden
DokumentationAPI-ReferenzSDK-ReferenzAgentic-NutzungKI-Skills

API-Referenz

Überblick über die BazaarLink API

BazaarLink bietet ein einheitliches, OpenAI-kompatibles Anfrage- und Antwortschema für verschiedene Modelle und Anbieter. Sie integrieren einmal und können Modelle wechseln, ohne Ihre Anwendung neu zu schreiben.

OpenAPI-Spezifikation

Die vollständige BazaarLink API ist als OpenAPI-Spezifikation in YAML und JSON dokumentiert:

Verwenden Sie die Spezifikationen mit Swagger UI, Postman oder einem OpenAPI-kompatiblen Codegenerator, um die API zu erkunden oder Clientbibliotheken zu erzeugen.

Anfragen

Anfrageformat für Chat Completions

Der Anfragekörper für Chat Completions wird an folgenden Endpunkt gesendet:

POST/api/v1/chat/completions

Die vollständige Liste unterstützter Felder finden Sie unter Parameter

Request-Schema
// Definitions of subtypes are below
type Request = {
  // Required by BazaarLink Chat Completions
  model: string;                    // Use a provider-qualified catalog ID
  messages: Message[];             // Must contain at least one message

  // Generation
  stream?: boolean;
  temperature?: number;            // Range: [0, 2]
  max_tokens?: number;             // Positive integer
  max_completion_tokens?: number;  // Alias mapped to max_tokens upstream
  n?: number;
  seed?: number;
  stop?: string | string[];

  // Sampling
  top_p?: number;
  top_k?: number;
  frequency_penalty?: number;      // Range: [-2, 2]
  presence_penalty?: number;       // Range: [-2, 2]
  repetition_penalty?: number;     // Range: (0, 2]
  min_p?: number;                  // Range: [0, 1]
  top_a?: number;                  // Range: [0, 1]

  // Token probabilities
  logit_bias?: Record<number, number>;
  logprobs?: boolean;
  top_logprobs?: number;

  // Stable end-user identifier for abuse prevention
  user?: string;

  // Tool calling
  tools?: Tool[];
  tool_choice?: ToolChoice;
  parallel_tool_calls?: boolean;

  // Structured output
  response_format?: ResponseFormat;
  structured_outputs?: boolean;

  // Plugin configuration — forwarded to upstreams that support plugins.
  plugins?: Plugin[];

  // Multimodal and image-generation options
  modalities?: Array<"text" | "image">;
  image_config?: Record<string, unknown>;
  input_audio?: InputAudio;

  // Provider-specific reasoning controls
  reasoning_effort?: "low" | "medium" | "high";
  reasoning?: ReasoningConfig;
  thinking?: ThinkingConfig;
  enable_thinking?: boolean;

  // BazaarLink message transforms and fallback routing
  transforms?: Array<"middle-out">;
  models?: string[];             // Fallback list — this drives waterfall routing, not route
  route?: "fallback";            // Passthrough only; forwarded as-is, no local effect
  provider?: ProviderPreferences;
};

// Message types
type Message =
  | SystemMessage
  | UserMessage
  | AssistantMessage
  | ToolMessage;

type SystemMessage = {
  role: "system";
  content: string | ContentPart[];
  name?: string;
};

type UserMessage = {
  role: "user";
  content: string | ContentPart[];
  name?: string;
};

type AssistantMessage = {
  role: "assistant";
  content?: string | ContentPart[] | null;
  name?: string;
  tool_calls?: ToolCall[];
};

type ToolMessage = {
  role: "tool";
  content: string;
  tool_call_id: string;
  name?: string;
};

// Multimodal content parts
type ContentPart =
  | TextContentPart
  | ImageContentPart
  | FileContentPart
  | AudioContentPart
  | VideoContentPart;

type TextContentPart = {
  type: "text";
  text: string;
};

type ImageContentPart = {
  type: "image_url";
  image_url: {
    url: string;                    // Remote URL or base64 data URI
    detail?: string;
  };
};

type FileContentPart = {
  type: "file";
  file: {
    filename?: string;
    file_data: string;              // Base64 data URI
  };
};

type AudioContentPart = {
  type: "input_audio";
  input_audio: InputAudio;
};

type InputAudio = {
  data: string;                     // Raw base64 without a data URI prefix
  format: string;                   // For example "wav" or "mp3"
};

type VideoContentPart = {
  type: "video_url";
  video_url: {
    url: string;                    // Remote URL or base64 data URI
  };
};

// Tool calling subtypes
type FunctionDescription = {
  name: string;
  description?: string;
  parameters: object;               // JSON Schema object
};

type Tool = {
  type: "function";
  function: FunctionDescription;
};

type ToolChoice =
  | "none"
  | "auto"
  | "required"
  | {
      type: "function";
      function: {
        name: string;
      };
    };

type ToolCall = {
  id: string;
  type: "function";
  function: {
    name: string;
    arguments: string;
  };
};

// Structured output
type ResponseFormat =
  | {
      type: "json_object";
    }
  | {
      type: "json_schema";
      json_schema: {
        name: string;
        strict?: boolean;
        schema: object;
      };
    };

// Upstream plugin configuration
type Plugin = {
  id: string;
  enabled?: boolean;
  [key: string]: unknown;
};

// Reasoning controls vary by model family
type ReasoningConfig = {
  effort?: "low" | "medium" | "high";
  max_tokens?: number;
  exclude?: boolean;
};

type ThinkingConfig = {
  type?: "enabled" | "disabled";
  budget_tokens?: number;
};

// Provider routing preferences
type ProviderPreferences = {
  order?: string[];
  only?: string[];
  ignore?: string[];
  allow_fallbacks?: boolean;
  sort?:
    | "price"
    | "latency"
    | "throughput"
    | {
        by: string;
        partition?: string;
      };
  require_parameters?: boolean;
  data_collection?: "allow" | "deny";
  quantizations?: string[];
  max_price?: Record<string, number>;
};

Strukturierte Ausgabe

Erzwingen Sie, dass das Modell gültiges JSON gemäß einem Schema zurückgibt. Dies ist essenziell für zuverlässige Anwendungen, die Modellausgaben programmatisch verarbeiten.

  • json_objecteinfacher JSON-Modus; das Modell liefert gültiges JSON.
  • json_schemastrikter Schema-Modus; die Ausgabe muss dem angegebenen JSON Schema entsprechen.

Plugins

BazaarLink leitet das plugins-Array an die gewählte Upstream-Route weiter. Die Verfügbarkeit hängt von Modell und Anbieter ab; die Modellvariante :online aktiviert zusätzlich das web-Plugin.

JSON
{
  "model": "openai/gpt-4.1",
  "messages": [
    { "role": "user", "content": "What happened today?" }
  ],
  "plugins": [
    { "id": "web" }
  ]
}

Optionale Header

Identifizieren Sie Ihre Anwendung in Request-Headern, um Nutzungsverfolgung, Dashboard-Sichtbarkeit und feinkörnige Analysen zu ermöglichen.

TypeScript
await fetch("https://bazaarlink.ai/api/v1/chat/completions", {
  method: "POST",
  headers: {
    "Authorization": "Bearer <BAZAARLINK_API_KEY>",
    "Content-Type": "application/json",
    "HTTP-Referer": "https://your-app.example",
    "X-Title": "Your App"
  },
  body: JSON.stringify({
    model: "openai/gpt-4.1",
    messages: [{ role: "user", content: "Hello!" }]
  })
});

Assistant Prefill

Fügen Sie als letzten Eintrag eine unvollständige assistant-Nachricht hinzu, um auf kompatiblen Modellrouten eine Fortsetzung anzufordern.

Funktionsweise
BazaarLink behält die letzte assistant-Nachricht bei und leitet sie weiter. Das Fortsetzungsverhalten wird vom ausgewählten Upstream-Modell und Anbieter implementiert und ist daher nicht auf jeder Route garantiert.
TypeScript
const response = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-4.6",
  messages: [
    { role: "user", content: "What is the meaning of life?" },
    // Intentional partial response; compatible routes continue from here.
    { role: "assistant", content: "My best answer is" }
  ]
});

Antworten

BazaarLink normalisiert Completion-Antworten verschiedener Modelle und Anbieter in ein einheitliches, OpenAI-kompatibles Format.

Format der Completion-Antwort

choices ist immer ein Array. Streaming-Antworten verwenden delta, nicht gestreamte Antworten message. Nutzungs- und Kostendaten werden, sofern verfügbar, mitgeliefert.

Response-Schema
type Response = {
  id: string;
  object: "chat.completion" | "chat.completion.chunk";
  created: number;
  model: string;
  choices: Array<NonStreamingChoice | StreamingChoice>;
  usage?: {
    prompt_tokens: number;
    completion_tokens: number;
    total_tokens: number;
    cost?: number;
    prompt_tokens_details?: {
      cached_tokens: number;
      cache_write_tokens?: number;
      audio_tokens?: number;
    };
    completion_tokens_details?: {
      reasoning_tokens?: number;
      image_tokens?: number;
    };
  };
};

type NonStreamingChoice = {
  index: number;
  finish_reason: string | null;
  native_finish_reason: string | null;
  message: {
    role: "assistant";
    content: string | null;
    tool_calls?: ToolCall[];
  };
};

type StreamingChoice = {
  index: number;
  finish_reason: string | null;
  native_finish_reason: string | null;
  delta: {
    role?: string;
    content?: string | null;
    tool_calls?: ToolCall[];
  };
};

Beendigungsgrund

finish_reason verwendet normalisierte Werte wie stop, length, tool_calls, content_filter und error; native_finish_reason bewahrt den ursprünglichen Anbieterwert.

JSON
{
  "finish_reason": "stop",
  "native_finish_reason": "stop"
}

Kosten und Statistiken abfragen

Rufen Sie detaillierte Statistiken für einen einzelnen Abschluss nach Generations-ID ab (aus der chat/completions-Antwort-ID oder dem Streaming-x-bz-gen-id-Header).

TypeScript
const generation = await fetch(
  "https://bazaarlink.ai/api/v1/generation?id=<GENERATION_ID>",
  {
    headers: {
      Authorization: "Bearer <BAZAARLINK_API_KEY>"
    }
  }
).then((response) => response.json());

Chat Completions

Der primäre Endpunkt. Kompatibel mit der OpenAI Chat Completions API.

POST/api/v1/chat/completions

Anfragetext

modelerforderlich
string
Modell-ID, z.B. "openai/gpt-4o" oder "anthropic/claude-3.5-sonnet"
messageserforderlich
Message[]
Array von Nachrichtenobjekten mit role und content
stream
boolean
Bei true wird ein Server-Sent Events Stream zurückgegeben. Standard: false
temperature
number
Sampling-Temperatur 0–2. Höher = zufälliger. Standard: 1
max_tokens
integer
Maximale Anzahl zu generierender Tokens
max_completion_tokens
integer
Alias für max_tokens (OpenAI o-series kompatibel). Beide werden akzeptiert; der angegebene Wert gilt
top_p
number
Nucleus-Sampling-Wahrscheinlichkeitsmasse. Standard: 1
top_k
integer
Token-Auswahl auf Top-K begrenzen. 0 = deaktiviert (alle berücksichtigen). Standard: 0
frequency_penalty
number
Wiederholte Tokens bestrafen. Bereich: [-2, 2]. Standard: 0
presence_penalty
number
Tokens basierend auf Vorkommen bestrafen. Bereich: [-2, 2]. Standard: 0
repetition_penalty
number
Token-Wiederholung aus der Eingabe reduzieren. Bereich: (0, 2]. Standard: 1
min_p
number
Minimale Wahrscheinlichkeit relativ zum Top-Token. Bereich: [0, 1]. Standard: 0
top_a
number
Dynamisches Top-P basierend auf dem Token mit höchster Wahrscheinlichkeit. Bereich: [0, 1]. Standard: 0
seed
integer
Integer-Seed für deterministische Generierung. Nicht für alle Modelle garantiert
n
integer
Anzahl der zu generierenden Completions. Standard: 1
user
string
Endbenutzer-Kennung für Überwachung und Missbrauchserkennung. Hat keine Auswirkung auf die Abrechnung. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
stop
string | string[]
Stoppsequenzen — Generierung stoppt bei Auftreten
logit_bias
object
Token-IDs zu Bias-Werten [-100, 100] zuordnen, die vor dem Sampling addiert werden. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
logprobs
boolean
Log-Wahrscheinlichkeiten jedes Ausgabe-Tokens zurückgeben. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
top_logprobs
integer
Anzahl der wahrscheinlichsten Tokens pro Position (erfordert logprobs: true). Bereich: 0–20. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
tools
Tool[]
Liste der Tools (Funktionen), die das Modell aufrufen kann
tool_choice
string | object
Steuert die Tool-Nutzung: "auto", "none" oder bestimmtes Tool
parallel_tool_calls
boolean
Parallele Funktionsaufrufe aktivieren, wenn Tools bereitgestellt werden. Standard: true. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
response_format
object
Strukturierte JSON-Ausgabe erzwingen. Siehe Abschnitt Structured Output
structured_outputs
boolean
Fordert striktes, JSON-Schema-konformes Output bei Providern an, die dies unterstützen. Wird unverändert weitergegeben
reasoning
object
Provider-spezifische Reasoning-/Thinking-Konfiguration. Wird unverändert weitergegeben
reasoning_effort
string
OpenAI o-Serie Reasoning-Aufwand: "low", "medium" oder "high". Wird unverändert weitergegeben
transforms
string[]
Anzuwendende Nachrichtentransformationen, z.B. ["middle-out"]. Weglassen für automatische Anwendung bei ≤8k-Kontext-Modellen
models
string[]
Fallback-Modellliste — BazaarLink probiert jedes der Reihe nach, wenn das primäre fehlschlägt
route
string
Erweitertes Routing-Kompatibilitätsfeld — die meisten Nutzer brauchen es nicht. Für Fallback "models" verwenden.
provider
object
Erweiterte Routing-Einstellungen — die meisten Nutzer brauchen sie nicht.
user, logprobs, top_logprobs, logit_bias und parallel_tool_calls erreichen nur Modelle der OpenAI-Familie
Diese fünf Parameter werden aus der Upstream-Anfrage entfernt, sobald das aufgelöste Modell nicht als OpenAI-eigenes Modell erkannt wird — das Senden an anthropic/claude-*, google/gemini-* oder ein anderes Nicht-OpenAI-Ziel liefert 200 zurück, wobei der Parameter stillschweigend ignoriert wird, kein Fehler. Wenn Sie einen dieser Parameter setzen und die Wirkung ausbleibt, prüfen Sie, ob das Zielmodell von OpenAI stammt.

Request-Schema (TypeScript)

// Definitions of subtypes are below
type Request = {
  // Required by BazaarLink Chat Completions
  model: string;                    // Use a provider-qualified catalog ID
  messages: Message[];             // Must contain at least one message

  // Generation
  stream?: boolean;
  temperature?: number;            // Range: [0, 2]
  max_tokens?: number;             // Positive integer
  max_completion_tokens?: number;  // Alias mapped to max_tokens upstream
  n?: number;
  seed?: number;
  stop?: string | string[];

  // Sampling
  top_p?: number;
  top_k?: number;
  frequency_penalty?: number;      // Range: [-2, 2]
  presence_penalty?: number;       // Range: [-2, 2]
  repetition_penalty?: number;     // Range: (0, 2]
  min_p?: number;                  // Range: [0, 1]
  top_a?: number;                  // Range: [0, 1]

  // Token probabilities
  logit_bias?: Record<number, number>;
  logprobs?: boolean;
  top_logprobs?: number;

  // Stable end-user identifier for abuse prevention
  user?: string;

  // Tool calling
  tools?: Tool[];
  tool_choice?: ToolChoice;
  parallel_tool_calls?: boolean;

  // Structured output
  response_format?: ResponseFormat;
  structured_outputs?: boolean;

  // Plugin configuration — forwarded to upstreams that support plugins.
  plugins?: Plugin[];

  // Multimodal and image-generation options
  modalities?: Array<"text" | "image">;
  image_config?: Record<string, unknown>;
  input_audio?: InputAudio;

  // Provider-specific reasoning controls
  reasoning_effort?: "low" | "medium" | "high";
  reasoning?: ReasoningConfig;
  thinking?: ThinkingConfig;
  enable_thinking?: boolean;

  // BazaarLink message transforms and fallback routing
  transforms?: Array<"middle-out">;
  models?: string[];             // Fallback list — this drives waterfall routing, not route
  route?: "fallback";            // Passthrough only; forwarded as-is, no local effect
  provider?: ProviderPreferences;
};

// Message types
type Message =
  | SystemMessage
  | UserMessage
  | AssistantMessage
  | ToolMessage;

type SystemMessage = {
  role: "system";
  content: string | ContentPart[];
  name?: string;
};

type UserMessage = {
  role: "user";
  content: string | ContentPart[];
  name?: string;
};

type AssistantMessage = {
  role: "assistant";
  content?: string | ContentPart[] | null;
  name?: string;
  tool_calls?: ToolCall[];
};

type ToolMessage = {
  role: "tool";
  content: string;
  tool_call_id: string;
  name?: string;
};

// Multimodal content parts
type ContentPart =
  | TextContentPart
  | ImageContentPart
  | FileContentPart
  | AudioContentPart
  | VideoContentPart;

type TextContentPart = {
  type: "text";
  text: string;
};

type ImageContentPart = {
  type: "image_url";
  image_url: {
    url: string;                    // Remote URL or base64 data URI
    detail?: string;
  };
};

type FileContentPart = {
  type: "file";
  file: {
    filename?: string;
    file_data: string;              // Base64 data URI
  };
};

type AudioContentPart = {
  type: "input_audio";
  input_audio: InputAudio;
};

type InputAudio = {
  data: string;                     // Raw base64 without a data URI prefix
  format: string;                   // For example "wav" or "mp3"
};

type VideoContentPart = {
  type: "video_url";
  video_url: {
    url: string;                    // Remote URL or base64 data URI
  };
};

// Tool calling subtypes
type FunctionDescription = {
  name: string;
  description?: string;
  parameters: object;               // JSON Schema object
};

type Tool = {
  type: "function";
  function: FunctionDescription;
};

type ToolChoice =
  | "none"
  | "auto"
  | "required"
  | {
      type: "function";
      function: {
        name: string;
      };
    };

type ToolCall = {
  id: string;
  type: "function";
  function: {
    name: string;
    arguments: string;
  };
};

// Structured output
type ResponseFormat =
  | {
      type: "json_object";
    }
  | {
      type: "json_schema";
      json_schema: {
        name: string;
        strict?: boolean;
        schema: object;
      };
    };

// Upstream plugin configuration
type Plugin = {
  id: string;
  enabled?: boolean;
  [key: string]: unknown;
};

// Reasoning controls vary by model family
type ReasoningConfig = {
  effort?: "low" | "medium" | "high";
  max_tokens?: number;
  exclude?: boolean;
};

type ThinkingConfig = {
  type?: "enabled" | "disabled";
  budget_tokens?: number;
};

// Provider routing preferences
type ProviderPreferences = {
  order?: string[];
  only?: string[];
  ignore?: string[];
  allow_fallbacks?: boolean;
  sort?:
    | "price"
    | "latency"
    | "throughput"
    | {
        by: string;
        partition?: string;
      };
  require_parameters?: boolean;
  data_collection?: "allow" | "deny";
  quantizations?: string[];
  max_price?: Record<string, number>;
};

Beispielanfrage

curl https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4.1",
    "messages": [
      {"role": "system", "content": "You are a helpful assistant."},
      {"role": "user", "content": "Explain quantum computing in one paragraph."}
    ],
    "temperature": 0.7,
    "max_tokens": 512
  }'

Antwort

{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1740000000,
  "model": "openai/gpt-4.1",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Quantum computing leverages quantum mechanics..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 28,
    "completion_tokens": 74,
    "total_tokens": 102,
    "cost": 0.0006480,
    "prompt_tokens_details": {
      "cached_tokens": 0
    },
    "completion_tokens_details": {
      "reasoning_tokens": 0
    }
  }
}

Response-Schema (TypeScript)

BazaarLink normalisiert genau zwei Felder — model und die Entfernung eines provider-Felds — und leitet den Rest der Upstream-Antwort unverändert weiter. Felder wie native_finish_reason, system_fingerprint und reasoning sind nur vorhanden, wenn der jeweilige Upstream-Anbieter sie befüllt; verlassen Sie sich nicht darauf, dass sie bei jedem Modell vorhanden sind. usage.cost ist die Ausnahme — es ist immer der von BazaarLink selbst abgerechnete Betrag, kein von Upstream weitergeleiteter Wert.

type Response = {
  id: string;
  object: "chat.completion" | "chat.completion.chunk";
  created: number;                 // Unix timestamp
  model: string;
  choices: (NonStreamingChoice | StreamingChoice)[];
  usage?: ResponseUsage;
  cost?: number;                   // Total cost in USD
};

type NonStreamingChoice = {
  index: number;
  finish_reason: "stop" | "length" | "tool_calls" | "content_filter" | null;
  native_finish_reason: string | null;  // Provider's original finish reason
  message: {
    role: "assistant";
    content: string | null;
    tool_calls?: ToolCall[];
  };
};

type StreamingChoice = {
  index: number;
  finish_reason: string | null;
  native_finish_reason: string | null;  // Provider's original finish reason
  delta: {
    role?: string;
    content?: string | null;
    tool_calls?: ToolCall[];
  };
};

type ResponseUsage = {
  prompt_tokens: number;
  completion_tokens: number;
  total_tokens: number;
  cost: number;                      // Total cost for this request in USD
  prompt_tokens_details?: {
    cached_tokens: number;           // Tokens served from prompt cache (reduced cost)
    cache_write_tokens?: number;     // Tokens written to cache in this request
    audio_tokens?: number;
  };
  completion_tokens_details?: {
    reasoning_tokens?: number;       // Thinking/reasoning tokens (e.g. o3, Qwen3, DeepSeek R1)
    image_tokens?: number;
  };
};

type ToolCall = {
  id: string;
  type: "function";
  function: { name: string; arguments: string };
};

Bilderzeugung

Generieren Sie Bilder aus Textprompts mit Modellen wie DALL·E und GPT-4o. Verwenden Sie den `modalities`-Parameter, um Bildausgabe vom Chat-Completions-Endpunkt anzufordern. Die Bildbearbeitung (Ändern eines vorhandenen Bildes) verwendet POST /v1/images/edits —— kompatibel mit OpenAI images.edit, multipart/form-data mit Ihrem/Ihren Quellbild(ern). Bearbeitungsfähige Modelle haben die Modalität text+image->image (z. B. qwen/qwen-image-edit); reine Generierungsmodelle sind text->image —— prüfen Sie die Modalität jedes Modells in GET /v1/models.

Response format

/api/v1/images/generations liefert standardmäßig OpenAI-kompatibles synchrones JSON (seit 2026-07-25) — client.images.generate() funktioniert ohne Wrapper. Mit stream: true erhalten Sie stattdessen den SSE-Event-Stream, der bei Modellen mit langer Generierungszeit Fortschritt liefert.

A. /v1/chat/completions (nativ, empfohlen)

POST/api/v1/chat/completions

The canonical streaming path. Recommended for any new integration.

curl -N https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-5.4-image-2",
    "messages": [{"role":"user","content":"a red cat on a sofa"}],
    "modalities": ["image","text"],
    "stream": true
  }'

Bild-zu-Bild: Fügen Sie einen image_url-Teil in das content-Array ein. Unterstützt Daten-URIs oder https-Bild-URLs (http:// wird abgelehnt), bis zu 8 Bilder, ~10MB pro Daten-URI. Die Nachricht mit den Bildern muss auch einen Text-Teil enthalten (die Bearbeitungsanweisung). Einige Modelle unterstützen zusätzlich image_config (z.B. {"strength": 0.7}, 0–1 — niedrigere Werte bleiben näher am Quellbild), das unverändert an das Upstream durchgereicht wird.

curl -N https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-5.4-image-2",
    "messages": [{"role":"user","content":[
      {"type":"image_url","image_url":{"url":"data:image/png;base64,..."}},
      {"type":"text","text":"change the background to a night city"}
    ]}],
    "modalities": ["image"],
    "stream": true
  }'

Bildbearbeitung (OpenAI-kompatibel)

POST/api/v1/images/edits

client.images.edit() des OpenAI SDK funktioniert direkt (Multipart-Upload, synchrone JSON-Antwort mit data: [{ url }]). Gleiche Limits wie Bild-zu-Bild: bis zu 8 Bilder, je 10MB; mask und response_format=b64_json werden noch nicht unterstützt.

curl https://bazaarlink.ai/api/v1/images/edits \
  -H "Authorization: Bearer $BL_API_KEY" \
  -F model="openai/gpt-5.4-image-2" \
  -F image=@cat.png \
  -F prompt="change the background to a night city"

B. /v1/images/generations (DALL·E-kompatibel)

POST/api/v1/images/generations

OpenAI DALL-E request shape. Sync JSON ({ created, data: [{ url }] }) is the default and works with client.images.generate() out of the box; pass stream: true to get the SSE event stream documented below instead.

curl https://bazaarlink.ai/api/v1/images/generations \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-image-2",
    "prompt": "a red cat on a sofa",
    "size": "1024x1024"
  }'
modelerforderlich
string
Modell-ID, z. B. google/gemini-2.5-flash-image
prompterforderlich
string
Text-Prompt
size
string
Ausgabegröße (automatisch gemappt)
n
integer
Anzahl der Bilder (Standard 1)
# Streaming variant — progressive delivery for long generations
curl -N https://bazaarlink.ai/api/v1/images/generations \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Accept: text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{"model":"openai/gpt-5.4-image-2","prompt":"a red cat on a sofa","stream":true}'

SSE event protocol

Both endpoints emit the same event types:

event: heartbeat        # every 60 s, keeps Cloudflare happy
data: {}

event: image            # upstream URL, fastest path
data: {"index": 0, "url": "https://upstream/a.png"}

event: image-cached     # bazaarlink Redis-backed proxy URL (1 hr TTL)
data: {"index": 0, "url": "https://bazaarlink.ai/api/v1/images/proxy/<token>"}

event: usage            # final cost / token count
data: {"promptTokens": 12, "completionTokens": 7080, "cost": 0.226, "durationMs": 163400, "imageCount": 1}

event: done
data: {}

Unterstützte Bildmodelle

Model IDModalityi2i (edits)

Videogenerierung

Asynchroner Drei-Schritt-Ablauf (submit → poll → content). Die Videogenerierung dauert 30 s–5 min und passt damit nicht zur synchronen Anfrage/Antwort-Semantik von chat-completions — deshalb stellt BazaarLink dafür einen eigenen /api/v1/videos-Endpunkt mit Job-ID-Muster bereit: submit liefert eine vjob_*-ID → Status pollen → nach Abschluss die Bytes abrufen. Der Aufruf eines Videomodells über /chat/completions oder /images/generations gibt 400 zurück (code: wrong_endpoint_for_video). Die Abrechnung erfolgt bei completed anhand der tatsächlichen usage.cost.

Video-Aufgaben

Ein Endpunkt deckt mehrere Aufgaben ab. Welche Aufgabe ausgeführt wird, entscheiden die gesendeten Felder —— ein einzelnes Modell kann Bild-zu-Video, Keyframes und Fortsetzung. Nicht jedes Modell unterstützt jede Aufgabe; eine nicht unterstützte Anfrage gibt 400 zurück.

Text-zu-Video
prompt
Allein aus einem Text-Prompt generieren – keine Eingabemedien.
Bild-zu-Video
frame_images: [ first frame ]
Ihr Bild IST das Motiv: Es wird zum ersten Frame und wird animiert, treu zum Original. Z. B. ein Foto einer Katze → dieselbe Katze dreht in derselben Szene den Kopf.
Keyframes (erstes + letztes)
frame_images: [ first, last ]
Geben Sie ein Start- und ein Endbild an; das Modell interpoliert die Bewegung dazwischen.
Fortsetzung
input_video
Einen vorhandenen Clip verlängern. Die angeforderte Dauer muss größer als die Länge des Quellvideos sein.
Referenz-zu-Video
input_references: [ images ]
Ihre Bilder sind REFERENZEN, keine Frames: Das Modell behält Motiv/Stil bei und erzeugt eine völlig neue Szene. Z. B. ein Katzenfoto + "tanzt in einem Wald" → ein neues Video, in dem das Aussehen der Katze erhalten bleibt, Szene und Bewegung aber neu sind (1–9 Referenzen). Unterschied zu Bild-zu-Video: i2v bleibt dem exakten Bild treu; r2v inszeniert das Motiv in neuem Material.
Video-Bearbeitung
input_video + prompt
Ein vorhandenes Video bearbeiten – Szene, Stil oder Bewegung ändern. Abgerechnet nach Eingabevideo-Sekunden + Ausgabesekunden.

1. Job absenden (liefert sofort vjob_xxx)

POST/api/v1/videos
modelerforderlich
string
Modell-ID, z. B. alibaba/wan2.7-t2v
prompterforderlich
string
Text-Prompt
duration
integer
Dauer in Sekunden (modellabhängig)
resolution
string
Auflösung — 480p / 720p / 1080p usw.
generate_audio
boolean
Audiospur erzeugen (true/false)
frame_images
array
Erste/letzte Frame-Bilder (Bild-zu-Video, Keyframes). Objekte { type: "image_url", image_url: { url }, frame_type: "first_frame" | "last_frame" } oder einfache URL-Strings.
input_references
array
Referenzbilder für Referenz-zu-Video —— Motiv-/Stilführung, keine exakten Frames.
input_video
string|object
Quellvideo-URL für Fortsetzung und Video-Bearbeitung. Muss vom Upstream öffentlich abrufbar sein.
aspect_ratio
string
Seitenverhältnis, z. B. 16:9 oder 9:16. Wird ignoriert, wenn ein Eingabebild das Verhältnis vorgibt.
watermark
boolean
Wasserzeichen hinzufügen. Standard: false.
callback_url
string
Webhook-URL, die beim Erreichen des Endzustands aufgerufen wird — nur HTTPS, SSRF-geprüft. Keine Signatur in v1; als Hinweis behandeln und über GET /videos/{id} bestätigen.
curl https://bazaarlink.ai/api/v1/videos \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "alibaba/wan2.7-t2v",
    "prompt": "a bird flying over mountains",
    "duration": 3,
    "resolution": "720p",
    "generate_audio": false
  }'
# → 202 { "id": "vjob_xxx", "status": "pending" }
Note
Beim Absenden wird der schlimmste Fall × Dauer × Multiplikator reserviert; bei Abschluss gleicht die reale usage.cost des Upstreams die Differenz aus.

2. Status pollen

GET/api/v1/videos/{id}
curl -H "Authorization: Bearer $BL_API_KEY" \
  https://bazaarlink.ai/api/v1/videos/vjob_xxx
Note
Jeder GET muss ≥ 8 s auseinanderliegen, um tatsächlich das Upstream zu erreichen (vermeidet Rate-Limits).
Note
Bei status=failed wird der gesamte reservierte Betrag an den Nutzer zurückerstattet.

3. Videoinhalt abrufen (MP4)

GET/api/v1/videos/{id}/content
curl -H "Authorization: Bearer $BL_API_KEY" \
  -o output.mp4 \
  https://bazaarlink.ai/api/v1/videos/vjob_xxx/content

Gut zu wissen

  • Zulässige Auflösungen unterscheiden sich je Modell —— ein nicht unterstützter Wert gibt 400 mit den unterstützten Werten zurück.
  • Eingabebilder/-videos müssen über eine öffentliche URL erreichbar sein. Hotlink-geschützte Hosts (z. B. einige Wikis) schlagen fehl.
  • Eingabemedien durchlaufen die Upstream-Inhaltsmoderation und können gelegentlich abgelehnt werden.
  • Bei der Fortsetzung muss die angeforderte Dauer die Länge des Quellvideos überschreiten.
  • Das Ausgabe-Seitenverhältnis folgt dem Eingabebild —— ein quadratisches Bild ergibt ein quadratisches Video.
  • Die Video-Bearbeitung wird nach den Sekunden des Eingabevideos plus den Sekunden der erzeugten Ausgabe abgerechnet.
  • input_video (Bearbeitung / Fortsetzung) muss eine ÖFFENTLICHE URL sein. Hier erzeugte Videos werden hinter Ihrem API-Schlüssel bereitgestellt, sodass der Upstream sie nicht abrufen kann —— hosten Sie Ihr Quellvideo unter einer öffentlich erreichbaren URL.
  • Webhook-Payloads sind unsigniert — bestätigen Sie Status/Betrag über GET /videos/{id}, bevor Sie handeln; die dortigen unsigned_urls sind absolut (anders als die relativen Pfade der Poll-Antwort).

Unterstützte Videomodelle

Model IDModalityTasks
bytedance/seedance-2.0text+image+audio+video->videot2v, i2v
bytedance/seedance-2.0-fasttext+image+audio+video->videot2v, i2v
google/veo-3.1text+image->videot2v, i2v
openai/sora-2-protext+image->videot2v, i2v
bytedance/seedance-1-5-protext+image->videot2v, i2v
alibaba/happyhorse-1.0text->videot2v
alibaba/wan2.6-r2v-flashtext+image+video->videor2v
alibaba/wan2.5-i2v-previewtext+image->videoi2v
alibaba/happyhorse-1.1text->videot2v
alibaba/wan2.7-t2vtext->videot2v
alibaba/wan2.7-i2vtext+image+video->videoi2v, kf2v, continuation
alibaba/wan2.6-t2vtext->videot2v
alibaba/wan2.5-t2v-previewtext->videot2v
alibaba/wan2.2-t2v-plustext->videot2v
alibaba/wan2.7-r2vtext+image+video->videor2v
alibaba/wan2.1-t2v-plustext->videot2v
alibaba/wan2.1-t2v-turbotext->videot2v
alibaba/wan2.6-i2v-flashtext+image->videoi2v
alibaba/wan2.2-i2v-flashtext+image->videoi2v
alibaba/wan2.7-videoedittext+image+video->videovideoedit
alibaba/wan2.6-i2vtext+image->videoi2v
alibaba/wan2.2-i2v-plustext+image->videoi2v
alibaba/wan2.6-r2vtext+image+video->videor2v

Video-Eingaben

Senden Sie Videodateien an Modelle mit Videoeingabe-Unterstützung zur Analyse, Beschriftung oder Beantwortung von Fragen zu Szenen und Ereignissen. Funktioniert mit einer direkten URL oder einem base64-Daten-URI — eine URL ist effizienter für öffentlich zugängliche Videos, base64 für lokale Dateien oder private Videos.

Unterstützte Formate

MP4 (H.264)MPEGMOVWebM
response = client.chat.completions.create(
    model="google/gemini-2.5-flash",
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "video_url",
                "video_url": {"url": "https://example.com/video.mp4"},
            },
            {"type": "text", "text": "What is happening in this video?"},
        ],
    }],
)

Vollständige API-Referenz →

PDF-Eingaben

Senden Sie PDF-Dokumente direkt in Nachrichten an Modelle mit nativer PDF-Unterstützung (z. B. Claude, Gemini). BazaarLink leitet die Datei direkt an das Modell weiter — abgerechnet als normale Input-Tokens, ohne Zusatzkosten oder zusätzlichen Verarbeitungsschritt.

Unterstützte Formate

  • PDF-Dokumente (Text, Bilder, Tabellen, gescannt)
  • Base64-kodierte Daten-URL (`data:application/pdf;base64,...`)
  • Mehrseitige Dokumente
  • Nur passwortfreie PDFs
import base64

with open("document.pdf", "rb") as f:
    pdf_data = base64.b64encode(f.read()).decode()

response = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.6",
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "file",
                "file": {
                    "filename": "document.pdf",
                    "file_data": f"data:application/pdf;base64,{pdf_data}",
                },
            },
            {"type": "text", "text": "Summarize this document."},
        ],
    }],
)

Responses API

Ein OpenAI Responses API-kompatibler Endpunkt für zustandslose Multi-Turn-Konversationen, Tool Calling und multimodale Eingaben. Ideal für Agenten und Frameworks, die das OpenAI Python SDK ≥ 1.x mit client.responses.create() verwenden.

POST/api/v1/responses
Note
Akzeptiert die gleiche Authentifizierung und das gleiche Model-Routing wie Chat Completions.

Anfragetext

modelerforderlich
string
Modell-ID, z.B. "openai/gpt-4o" oder "anthropic/claude-3.5-sonnet"
inputerforderlich
string | Item[]
Benutzereingabe — ein einfacher String (einzelne Nachricht) oder ein Array von Eingabeelementen für Multi-Turn-/multimodale Konversationen.
instructions
string
Anweisungen auf Systemebene, äquivalent zu einer Systemnachricht. Muss bei jeder Anfrage erneut gesendet werden.
stream
boolean
Bei true werden Responses API SSE-Stream-Events zurückgegeben. Event-Typen: response.created, response.output_text.delta, response.completed.
max_output_tokens
integer
Maximale Anzahl der zu generierenden Ausgabe-Tokens (einschließlich Reasoning-Tokens für o-series-Modelle).
temperature
number
Sampling-Temperatur 0–2. Höher = zufälliger. Standard: 1
top_p
number
Nucleus-Sampling-Wahrscheinlichkeitsmasse. Standard: 1
tools
Tool[]
Tool-(Funktions-)Definitionen — gleiches JSON-Schema-Format wie Chat Completions (akzeptiert sowohl die flache Responses-Form als auch die verschachtelte Form). OpenAIs eigene integrierte gehostete Tools (web_search_preview, file_search, computer_use_preview) werden nicht unterstützt; Websuche ist über plugins: [{id:"web"}] verfügbar — nur auf manchen Modellrouten unterstützt.
tool_choice
string | object
Steuert die Tool-Nutzung: "auto", "none" oder bestimmtes Tool
parallel_tool_calls
boolean
Parallele Funktionsaufrufe aktivieren, wenn Tools bereitgestellt werden. Standard: true. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
response_format
object
Strukturierte JSON-Ausgabe erzwingen. Siehe Abschnitt Structured Output
models
string[]
Fallback-Modellliste — BazaarLink probiert jedes der Reihe nach, wenn das primäre fehlschlägt
transforms
string[]
Anzuwendende Nachrichtentransformationen, z.B. ["middle-out"]. Weglassen für automatische Anwendung bei ≤8k-Kontext-Modellen
previous_response_id
string
Dieser Endpunkt ist zustandslos — die Übergabe eines Nicht-null-Werts liefert sofort 400 (invalid_prompt); er wird nie akzeptiert und ignoriert. Verwenden Sie stattdessen den zustandslosen Modus: Übergeben Sie den vollständigen Konversationsverlauf im input-Array.
provider
object
Erweiterte Routing-Einstellungen — die meisten Nutzer brauchen sie nicht.

Request-Schema (TypeScript)

type ResponsesRequest = {
  model: string;                    // "provider/model-name"
  input: string | InputItem[];      // string or multi-turn array

  // Optional
  instructions?: string;            // System-level message
  stream?: boolean;                 // Default: false
  max_output_tokens?: number;
  temperature?: number;             // Range: [0, 2], default: 0.7
  top_p?: number;
  tools?: Tool[];
  tool_choice?: "auto" | "none" | "required" | object;
  parallel_tool_calls?: boolean;    // Default: true
  previous_response_id?: string;    // Not supported — use full input array
  provider?: ProviderPreferences;   // Same as Chat Completions
};

type InputItem =
  | { type?: "message"; role: "user" | "assistant" | "system" | "developer"; content: string | ContentBlock[] }
  | { type: "function_call_output"; call_id: string; output: string }   // tool result
  | { type: "function_call"; call_id: string; name: string; arguments: string };

type ContentBlock =
  | { type: "input_text"; text: string }
  | { type: "input_image"; image_url: string; detail?: "auto" | "low" | "high" };

Beispielanfrage

curl https://bazaarlink.ai/api/v1/responses \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "instructions": "You are a helpful assistant.",
    "input": "What is the capital of Taiwan?"
  }'

Antwortformat

// Non-streaming response object
type ResponsesResponse = {
  id: string;             // "resp_..."
  object: "response";
  created_at: number;
  completed_at: number;
  status: "completed" | "failed" | "incomplete";
  model: string;
  output: OutputItem[];
  usage: {
    input_tokens: number;   // equivalent to prompt_tokens
    output_tokens: number;  // equivalent to completion_tokens
    total_tokens: number;
    cost?: number;          // actual cost in credits
  } | null;
  error: null | { code: string; message: string };
};

type OutputItem =
  | {
      type: "message";
      id: string;
      role: "assistant";
      status: "completed";
      content: Array<{ type: "output_text"; text: string; annotations: [] }>;
    }
  | { type: "function_call"; id: string; call_id: string; name: string; arguments: string; status: "completed" };

Migration von Chat Completions

Ersetzen Sie messages durch input (String oder Array), verwenden Sie instructions statt einer system-role-Nachricht und lesen Sie output[0].content[0].text statt choices[0].message.content.

# Chat Completions (before)
response = client.chat.completions.create(
    model="openai/gpt-4o-mini",
    messages=[
        {"role": "system", "content": "You are helpful."},
        {"role": "user",   "content": "Hello"},
    ]
)
text = response.choices[0].message.content

# Responses API (after)
response = client.responses.create(
    model="openai/gpt-4o-mini",
    instructions="You are helpful.",
    input="Hello"
)
text = response.output[0].content[0].text

Einschränkungen

  • previous_response_id oder store: true wird mit 400 (Fehlercode invalid_prompt) abgelehnt — nicht akzeptiert und ignoriert. Verwenden Sie stets den zustandslosen Modus: Übergeben Sie den vollständigen Konversationsverlauf im input-Array.
  • OpenAIs eigene integrierte gehostete Tools (web_search_preview, file_search, computer_use_preview) werden nicht unterstützt. Websuche ist über plugins: [{id:"web"}] verfügbar — nur auf manchen Modellrouten unterstützt.
  • background: true wird akzeptiert, aber ignoriert — jede Anfrage läuft synchron bis zum Abschluss.

Messages (Anthropic)

Anthropic-kompatible Nachrichten API für Claude SDK. Verwenden Sie es genau so, wie Sie es mit API von Anthropic tun würden – ändern Sie einfach den Basis-URL und den Auth-Header.

POST/api/v1/messages
Note
Akzeptiert Bearer-Token oder X-API-Key-Header (Kompatibilität Anthropic SDK). Maximale Körpergröße: 10 MB.

Anfragetext

modelerforderlich
string
Modell-ID, z.B. "openai/gpt-4o" oder "anthropic/claude-3.5-sonnet"
max_tokenserforderlich
integer
Maximale Anzahl zu generierender Token (positive ganze Zahl).
messageserforderlich
Message[]
Array von Konversationsnachrichten (nicht leer).
system
string
Optionale Systemaufforderung.
stream
boolean
Bei true wird ein Server-Sent Events Stream zurückgegeben. Standard: false
temperature
number
Sampling-Temperatur 0–2. Höher = zufälliger. Standard: 1
top_p
number
Nucleus-Sampling-Wahrscheinlichkeitsmasse. Standard: 1
top_k
integer
Token-Auswahl auf Top-K begrenzen. 0 = deaktiviert (alle berücksichtigen). Standard: 0
stop_sequences
string[]
Benutzerdefinierte Stoppsequenzzeichenfolgen.
tools
Tool[]
Liste der Tools (Funktionen), die das Modell aufrufen kann
tool_choice
string | object
Steuert die Tool-Nutzung: "auto", "none" oder bestimmtes Tool

Beispielanfrage

from anthropic import Anthropic

client = Anthropic(
    base_url="https://bazaarlink.ai/api/v1",
    api_key="sk-bl-YOUR_KEY"
)

response = client.messages.create(
    model="anthropic/claude-opus-4",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello"}]
)
print(response.content[0].text)

Antwort

{
  "id": "msg_...",
  "type": "message",
  "role": "assistant",
  "model": "anthropic/claude-opus-4",
  "content": [
    { "type": "text", "text": "Hello! How can I help you today?" }
  ],
  "stop_reason": "end_turn",
  "usage": {
    "input_tokens": 10,
    "output_tokens": 12,
    "cache_read_input_tokens": 0,
    "cache_creation_input_tokens": 0,
    "bz_cost": 0.00042
  }
}

Errors: 400 (Validierung), 402 (unzureichende Credits), 429 (Ratenbegrenzung), 502 (Upstream-Fehler/fehlender Schlüssel), 503 (Serverneustart).

Modelle

Alle verfügbaren Modelle mit Preis- und Fähigkeitsinformationen auflisten. Für diesen Endpunkt ist keine Authentifizierung erforderlich.

GET/api/v1/models
# Text models (default)
curl https://bazaarlink.ai/api/v1/models

# Complete catalog
curl "https://bazaarlink.ai/api/v1/models?output_modalities=all"

Antwort

{
  "data": [
    {
      "id": "openai/gpt-4.1",
      "name": "GPT 4.1",
      "context_length": 1047576,
      "modality": "text+image+file->text",
      "pricing": {
        "prompt": "2.00",
        "completion": "8.00"
      }
    }
  ]
}
// /v1/models — Response Schema
type ModelsResponse = {
  data: Model[];
};

type Model = {
  id: string;                    // Model ID (e.g. "openai/gpt-4.1")
  name: string;                  // Human-readable name
  context_length: number | null; // Max context window in tokens
  modality: string | null;       // e.g. "text->text", "text+image->text"
  architecture?: {
    input_modalities?: string[];
    output_modalities?: Array<
      "text" | "image" | "embeddings" | "audio" |
      "video" | "rerank" | "speech" | "transcription"
    >;
  };
  pricing: {
    prompt: string;              // Input price per 1M tokens (USD)
    completion: string;          // Output price per 1M tokens (USD)
  };
  description?: string | null;   // Model description
  top_provider?: {
    max_completion_tokens?: number;
  };
  supported_parameters?: string[]; // e.g. ["tools", "response_format", "reasoning"]
  pricing_tiers?: {               // Present only for models with input-length tiers
    above_prompt_tokens: number;  // Ascending; strict "greater than" threshold
    prompt: string;                // USD per token, override tier
    completion: string;            // USD per token, override tier
  }[];
};

Gestaffelte Preise nach Eingabelänge

Manche Modelle wechseln zu einer anderen Preistabelle, sobald der Prompt einen Token-Schwellenwert überschreitet — die gesamte Tabelle ändert sich, nicht nur die Tokens über dem Schwellenwert. Die Schwellenwerte sind strikt: Ein Prompt mit genau N Tokens wird noch mit der Stufe unter N abgerechnet; die höhere Stufe gilt erst, wenn die Eingabe-Tokens größer als N sind.

pricing_tiers ist ein Geschwisterfeld von pricing und ist nur vorhanden, wenn ein Modell Override-Stufen oberhalb des Basispreises hat. Einträge sind nach above_prompt_tokens aufsteigend sortiert; prompt/completion sind USD pro Token (gleiche Einheit wie pricing.prompt/pricing.completion). pricing.prompt und pricing.completion bleiben immer die Basis-(niedrigste) Stufe.

Die meisten Modelle haben keine Stufen — dort fehlt der Schlüssel pricing_tiers in der Antwort einfach.

{
  "id": "openai/gpt-4.1",
  "name": "GPT 4.1",
  "pricing": {
    "prompt": "2.00",
    "completion": "8.00"
  },
  "pricing_tiers": [
    {
      "above_prompt_tokens": 128000,
      "prompt": "4.00",
      "completion": "16.00"
    }
  ]
}

Verfügbare Modelle (257)

Dies sind die derzeit auf BazaarLink verfügbaren Modelle, dynamisch aus unserer Datenbank geladen:

OpenAI
openai/gpt-5.3-codex400K ctx · $1.75/$14.00text+image+file->text
openai/gpt-3.5-turbo-instruct4K ctx · $1.50/$2.00text->text
openai/gpt-5.4-nano400K ctx · $0.20/$1.25text+image+file->text
openai/gpt-5-codex400K ctx · $1.25/$10.00text+image->text
openai/text-embedding-ada-0028K ctx · $0.10/$0.00text->embeddings
openai/gpt-5.2-codex400K ctx · $1.75/$14.00text+image->text
openai/gpt-4-turbo-preview128K ctx · $10.00/$30.00text->text
openai/o4-mini200K ctx · $1.10/$4.40text+image+file->text
openai/o1-pro200K ctx · $150.00/$600.00text+image+file->text
openai/gpt-5.4-mini400K ctx · $0.75/$4.50text+image+file->text
openai/gpt-5.1400K ctx · $1.25/$10.00text+image+file->text
openai/o3-pro200K ctx · $20.00/$80.00text+image+file->text
openai/gpt-5.6-luna-pro1050K ctx · $1.00/$6.00text+image+file->text
openai/gpt-48K ctx · $30.00/$60.00text->text
openai/gpt-5.6-sol1050K ctx · $5.00/$30.00text+image+file->text
openai/gpt-4o-mini-2024-07-18128K ctx · $0.15/$0.60text+image+file->text
openai/gpt-5-mini400K ctx · $0.25/$2.00text+image+file->text
openai/gpt-5.6-luna1050K ctx · $1.00/$6.00text+image+file->text
openai/gpt-4o-2024-08-06128K ctx · $2.50/$10.00text+image+file->text
openai/o3-deep-research200K ctx · $10.00/$40.00text+image+file->text
openai/gpt-5.2-chat128K ctx · $1.75/$14.00text+image+file->text
openai/gpt-5.2400K ctx · $1.75/$14.00text+image+file->text
openai/gpt-5.1-chat128K ctx · $1.25/$10.00text+image+file->text
openai/o4-mini-deep-research200K ctx · $2.00/$8.00text+image+file->text
openai/text-embedding-3-small8K ctx · $0.02/$0.00text->embeddings
openai/gpt-4.1-nano1048K ctx · $0.10/$0.40text+image+file->text
openai/o3200K ctx · $2.00/$8.00text+image+file->text
openai/gpt-3.5-turbo16K ctx · $0.50/$1.50text->text
openai/gpt-5.51050K ctx · $5.00/$30.00text+image+file->text
openai/gpt-3.5-turbo-06134K ctx · $1.00/$2.00text->text
openai/gpt-4.11048K ctx · $2.00/$8.00text+image+file->text
openai/gpt-5-pro400K ctx · $15.00/$120.00text+image+file->text
openai/gpt-4.1-mini1048K ctx · $0.40/$1.60text+image+file->text
openai/gpt-oss-20b131K ctx · $0.03/$0.13text->text
openai/gpt-5.2-pro400K ctx · $21.00/$168.00text+image+file->text
openai/o4-mini-high200K ctx · $1.10/$4.40text+image+file->text
openai/gpt-3.5-turbo-16k16K ctx · $3.00/$4.00text->text
openai/gpt-4o-mini128K ctx · $0.15/$0.60text+image+file->text
openai/gpt-5.3-chat128K ctx · $1.75/$14.00text+image+file->text
openai/gpt-4o-2024-05-13128K ctx · $5.00/$15.00text+image+file->text
openai/gpt-oss-120b131K ctx · $0.15/$0.60text->text
openai/o3-mini200K ctx · $1.10/$4.40text+file->text
openai/gpt-4-turbo128K ctx · $10.00/$30.00text+image->text
openai/gpt-5.4-pro1050K ctx · $30.00/$180.00text+image+file->text
openai/text-embedding-3-large8K ctx · $0.13/$0.00text->embeddings
openai/gpt-5.41050K ctx · $2.50/$15.00text+image+file->text
openai/gpt-5.1-codex-max400K ctx · $1.25/$10.00text+image->text
openai/gpt-5-nano400K ctx · $0.05/$0.40text+image+file->text
openai/o1200K ctx · $15.00/$60.00text+image+file->text
openai/gpt-5.1-codex-mini400K ctx · $0.25/$2.00text+image->text
openai/gpt-5.6-terra-pro1050K ctx · $2.50/$15.00text+image+file->text
openai/gpt-5.6-terra1050K ctx · $2.50/$15.00text+image+file->text
openai/gpt-5400K ctx · $1.25/$10.00text+image+file->text
openai/gpt-5.6-sol-pro1050K ctx · $5.00/$30.00text+image+file->text
openai/gpt-5.1-codex400K ctx · $1.25/$10.00text+image->text
openai/o3-mini-high200K ctx · $1.10/$4.40text+file->text
openai/gpt-4o-2024-11-20128K ctx · $2.50/$10.00text+image+file->text
openai/sora-2-pro · $0.00/$0.00text+image->video
openai/gpt-4o128K ctx · $2.50/$10.00text+image+file->text
openai/gpt-oss-safeguard-20b131K ctx · $0.07/$0.30text->text
openai/gpt-5.4-image-2272K ctx · $8.00/$15.00text+image+file->text+image
openai/gpt-image-1400K ctx · $10.00/$10.00text+image->image
openai/gpt-image-2400K ctx · $8.00/$8.00text+image->image
openai/gpt-image-1-mini400K ctx · $2.50/$2.50text+image->image
Qwen
qwen/qwen3.7-plus1000K ctx · $0.32/$1.28text+image->text
qwen/qwen3.7-max1000K ctx · $1.48/$4.42text->text
qwen/qwen3.5-plus-02-151000K ctx · $0.26/$1.56text+image+video->text
qwen/qwen3-coder-flash1000K ctx · $0.20/$0.97text->text
qwen/qwen-2.5-coder-32b-instruct33K ctx · $0.66/$1.00text->text
qwen/qwen-plus1000K ctx · $0.26/$0.78text->text
qwen/qwen3.6-35b-a3b262K ctx · $0.14/$1.00text+image+video->text
qwen/qwen3-coder262K ctx · $0.30/$1.00text->text
qwen/qwen-plus-2025-07-281000K ctx · $0.26/$0.78text->text
qwen/qwen3-235b-a22b-2507262K ctx · $0.09/$0.55text->text
qwen/qwen3.5-plus-202604201000K ctx · $0.30/$1.80text+image+video->text
qwen/qwen3-embedding-4b33K ctx · $0.02/$0.00text->embeddings
qwen/qwen3-coder-30b-a3b-instruct262K ctx · $0.07/$0.27text->text
qwen/qwen-2.5-7b-instruct33K ctx · $0.04/$0.10text->text
qwen/qwen3-coder-plus1000K ctx · $0.65/$3.25text->text
qwen/qwen3-next-80b-a3b-instruct262K ctx · $0.10/$1.10text->text
qwen/qwen-2.5-72b-instruct33K ctx · $0.36/$0.40text->text
qwen/qwen-plus-2025-07-28:thinking1000K ctx · $0.40/$1.20text->text
qwen/qwen3-vl-235b-a22b-thinking131K ctx · $0.40/$4.00text+image->text
qwen/qwen3-vl-8b-thinking131K ctx · $0.18/$2.10text+image->text
qwen/qwen3-30b-a3b-instruct-2507262K ctx · $0.05/$0.19text->text
qwen/qwen3.5-flash-02-231000K ctx · $0.07/$0.26text+image+video->text
qwen/qwen3-vl-235b-a22b-instruct262K ctx · $0.21/$1.90text+image->text
qwen/qwen3.5-27b262K ctx · $0.20/$1.56text+image+video->text
qwen/qwen3-235b-a22b131K ctx · $0.46/$1.82text->text
qwen/qwen3.5-9b262K ctx · $0.10/$0.15text+image+video->text
qwen/qwen3-32b131K ctx · $0.08/$0.28text->text
qwen/qwen3-30b-a3b131K ctx · $0.13/$0.52text->text
qwen/qwen3-8b131K ctx · $0.12/$0.46text->text
qwen/qwen3-max-thinking262K ctx · $0.78/$3.90text->text
qwen/qwen3-vl-8b-instruct262K ctx · $0.12/$0.46text+image->text
qwen/qwen3.5-122b-a10b262K ctx · $0.26/$2.08text+image+video->text
qwen/qwen3-next-80b-a3b-thinking262K ctx · $0.15/$1.20text->text
qwen/qwen3-vl-30b-a3b-thinking262K ctx · $0.20/$2.40text+image->text
qwen/qwen2.5-vl-72b-instruct128K ctx · $0.80/$1.00text+image->text
qwen/qwen3-235b-a22b-thinking-2507262K ctx · $0.30/$3.00text->text
qwen/qwen3.5-35b-a3b262K ctx · $0.14/$1.00text+image+video->text
qwen/qwen3-coder-next262K ctx · $0.12/$0.80text->text
qwen/qwen3-max262K ctx · $0.78/$3.90text->text
qwen/qwen3-30b-a3b-thinking-250782K ctx · $0.20/$2.40text->text
qwen/qwen3-vl-30b-a3b-instruct262K ctx · $0.13/$0.52text+image->text
qwen/qwen3-vl-32b-instruct131K ctx · $0.10/$0.42text+image->text
qwen/qwen3-14b131K ctx · $0.23/$0.91text->text
qwen/qwen3.5-397b-a17b262K ctx · $0.39/$2.34text+image+video->text
qwen/qwen3.6-27b262K ctx · $0.29/$2.40text+image+video->text
qwen/qwen3.6-plus1000K ctx · $0.33/$1.95text+image+video->text
qwen/qwen3-embedding-8b33K ctx · $0.01/$0.00text->embeddings
qwen/qwen-image-maxtext->image
qwen/qwen-image-plustext->image
qwen/qwen-image-edittext+image->image
qwen/qwen-image-2.0-protext->image
qwen/qwen-image-edit-plustext+image->image
qwen/qwen-image-2.0text->image
qwen/qwen-imagetext->image
qwen/qwen-image-edit-maxtext+image->image
Alibaba
alibaba/wan2.7-image-protext->image
alibaba/happyhorse-1.0 · $0.00/$0.00text->video
alibaba/wan2.6-r2v-flash · $0.00/$0.00text+image+video->video
alibaba/wan2.2-t2i-flashtext->image
alibaba/wan2.1-t2i-plustext->image
alibaba/wan2.1-t2i-turbotext->image
alibaba/z-image-turbotext->image
alibaba/wan2.2-t2i-plustext->image
alibaba/wan2.6-imagetext->image
alibaba/wan2.5-i2v-preview · $0.00/$0.00text+image->video
alibaba/happyhorse-1.1 · $0.00/$0.00text->video
alibaba/wan2.7-t2v · $0.00/$0.00text->video
alibaba/wan2.7-i2v · $0.00/$0.00text+image+video->video
alibaba/wan2.6-t2v · $0.00/$0.00text->video
alibaba/wan2.5-t2v-preview · $0.00/$0.00text->video
alibaba/wan2.2-t2v-plus · $0.00/$0.00text->video
alibaba/wan2.7-r2v · $0.00/$0.00text+image+video->video
alibaba/wan2.1-t2v-plus · $0.00/$0.00text->video
alibaba/wan2.1-t2v-turbo · $0.00/$0.00text->video
alibaba/wan2.6-i2v-flash · $0.00/$0.00text+image->video
alibaba/wan2.2-i2v-flash · $0.00/$0.00text+image->video
alibaba/wan2.5-t2i-previewtext->image
alibaba/wan2.7-videoedit · $0.00/$0.00text+image+video->video
alibaba/wan2.6-i2v · $0.00/$0.00text+image->video
alibaba/wan2.5-i2i-previewtext+image->image
alibaba/wan2.2-i2v-plus · $0.00/$0.00text+image->video
alibaba/wan2.6-r2v · $0.00/$0.00text+image+video->video
alibaba/wan2.6-t2itext->image
alibaba/wan2.7-imagetext->image
Google
google/gemini-3.1-pro-preview1049K ctx · $2.00/$12.00text+image+file+audio+video->text
google/gemini-3.1-flash-lite-preview1049K ctx · $0.25/$1.50text+image+file+audio+video->text
google/gemini-2.5-flash-lite1049K ctx · $0.10/$0.40text+image+file+audio+video->text
google/gemma-3-4b-it131K ctx · $0.05/$0.10text+image->text
google/gemini-embedding-2-preview8K ctx · $0.20/$0.00text+image+file+audio+video->embeddings
google/gemini-2.5-flash-image33K ctx · $0.30/$2.50text+image->text+image
google/gemini-3.5-flash1049K ctx · $1.50/$9.00text+image+file+audio+video->text
google/gemini-2.5-pro-preview1049K ctx · $1.25/$10.00text+image+file+audio->text
google/gemma-3n-e4b-it33K ctx · $0.06/$0.12text->text
google/gemini-3.1-flash-image131K ctx · $0.50/$3.00text+image->text+image
google/gemini-2.5-flash1049K ctx · $0.30/$2.50text+image+file+audio+video->text
google/gemini-3-flash-preview1049K ctx · $0.50/$3.00text+image+file+audio+video->text
google/gemma-3-12b-it131K ctx · $0.05/$0.15text+image->text
google/gemma-2-27b-it8K ctx · $0.65/$0.65text->text
google/gemini-2.5-pro1049K ctx · $1.25/$10.00text+image+file+audio+video->text
google/gemma-4-31b-it262K ctx · $0.14/$0.40text+image+video->text
google/gemini-embedding-00120K ctx · $0.15/$0.00text->embeddings
google/gemini-2.5-pro-preview-05-061049K ctx · $1.25/$10.00text+image+file+audio+video->text
google/gemini-3.5-flash-lite1049K ctx · $0.30/$2.50text+image+file+audio+video->text
google/gemma-3-27b-it262K ctx · $0.08/$0.45text+image->text
google/veo-3.1 · $0.00/$0.00text+image->video
google/gemini-3-pro-image131K ctx · $2.00/$12.00text+image->text+image
google/gemini-3.1-pro-preview-customtools1049K ctx · $2.00/$12.00text+image+file+audio+video->text
google/gemma-4-26b-a4b-it262K ctx · $0.07/$0.34text+image+video->text
google/gemini-3.6-flash1049K ctx · $1.50/$7.50text+image+file+audio+video->text
google/gemini-3.1-flash-image-preview66K ctx · $0.50/$3.00text+image->text+image
Anthropic
anthropic/claude-opus-4.61000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-sonnet-4.61000K ctx · $3.00/$15.00text+image+file->text
anthropic/claude-sonnet-41000K ctx · $3.00/$15.00text+image+file->text
anthropic/claude-sonnet-51000K ctx · $2.00/$10.00text+image+file->text
anthropic/claude-haiku-4.5200K ctx · $1.00/$5.00text+image+file->text
anthropic/claude-sonnet-4.51000K ctx · $3.00/$15.00text+image+file->text
anthropic/claude-opus-4.71000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-fable-51000K ctx · $10.00/$50.00text+image+file->text
anthropic/claude-opus-4.81000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-3-haiku200K ctx · $0.25/$1.25text+image->text
anthropic/claude-opus-4.5200K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-opus-4200K ctx · $15.00/$75.00text+image+file->text
anthropic/claude-opus-4.1200K ctx · $15.00/$75.00text+image+file->text
anthropic/claude-opus-51000K ctx · $5.00/$25.00text+image+file->text
Zhipu AI
z-ai/glm-4.7205K ctx · $0.40/$1.75text->text
z-ai/glm-5205K ctx · $1.00/$3.20text->text
z-ai/glm-5.1205K ctx · $1.40/$4.40text->text
z-ai/glm-5.21049K ctx · $1.40/$4.40text->text
z-ai/glm-5v-turbo203K ctx · $1.20/$4.00text+image+video->text
z-ai/glm-5-turbo203K ctx · $1.20/$4.00text->text
z-ai/glm-4.6v131K ctx · $0.30/$0.90text+image+video->text
z-ai/glm-4.6205K ctx · $0.50/$2.00text->text
z-ai/glm-4.7-flash203K ctx · $0.06/$0.40text->text
z-ai/glm-4.5-air131K ctx · $0.13/$0.85text->text
z-ai/glm-4.5131K ctx · $0.60/$2.20text->text
z-ai/glm-4.5v66K ctx · $0.60/$1.80text+image->text
DeepSeek
deepseek/deepseek-v3.2164K ctx · $0.28/$0.42text->text
deepseek/deepseek-v4-pro1049K ctx · $2.40/$4.80text->text
deepseek/deepseek-v4-flash1049K ctx · $0.20/$0.40text->text
deepseek/deepseek-v3.2-exp164K ctx · $0.27/$0.41text->text
deepseek/deepseek-r1164K ctx · $0.70/$2.50text->text
deepseek/deepseek-v3.1-terminus164K ctx · $0.27/$1.00text->text
deepseek/deepseek-chat-v3-0324164K ctx · $0.27/$1.12text->text
deepseek/deepseek-r1-0528164K ctx · $0.50/$2.15text->text
deepseek/deepseek-r1-distill-llama-70b8K ctx · $0.80/$0.80text->text
deepseek/deepseek-chat-v3.1164K ctx · $0.25/$0.95text->text
deepseek/deepseek-chat164K ctx · $0.40/$1.30text->text
Moonshot AI
moonshotai/kimi-k31049K ctx · $3.00/$15.00text+image->text
moonshotai/kimi-k2.7-code-highspeed · $1.90/$8.00
moonshotai/kimi-k2.7-code262K ctx · $0.95/$4.00text+image->text
moonshotai/kimi-k2.5262K ctx · $0.60/$3.00text+image->text
moonshotai/kimi-k2.6262K ctx · $0.86/$3.57text+image->text
moonshotai/kimi-k2131K ctx · $0.57/$2.30text->text
moonshotai/kimi-k2-0905262K ctx · $0.60/$2.50text->text
moonshotai/kimi-k2-thinking262K ctx · $0.60/$2.50text->text
xAI
x-ai/grok-4.202000K ctx · $1.25/$2.50text+image+file->text
x-ai/grok-4.20-multi-agent2000K ctx · $1.25/$2.50text+image+file->text
x-ai/grok-4.31000K ctx · $1.25/$2.50text+image+file->text
x-ai/grok-4.5500K ctx · $2.00/$6.00text+image+file->text
x-ai/grok-build-0.1256K ctx · $1.00/$2.00text+image+file->text
Perplexity
perplexity/sonar-pro200K ctx · $3.00/$15.00text+image->text
perplexity/sonar-reasoning-pro128K ctx · $2.00/$8.00text+image->text
perplexity/sonar127K ctx · $1.00/$1.00text+image->text
perplexity/sonar-deep-research128K ctx · $2.00/$8.00text->text
perplexity/sonar-pro-search200K ctx · $3.00/$15.00text+image->text
MiniMax
minimax/minimax-m2.7205K ctx · $0.30/$1.20text->text
minimax/minimax-m2.5205K ctx · $0.30/$1.20text->text
minimax/minimax-m31049K ctx · $0.30/$1.20text+image+video->text
minimax/minimax-m2.1205K ctx · $0.30/$1.20text->text
Tencent
tencent/kinfra-text-embedding-4b · $0.08/$0.00
tencent/hy3 · $0.13/$0.53
tencent/hy-mt2-plus · $0.10/$0.40
tencent/kinfra-text-embedding-0.6b · $0.07/$0.00
bytedance-seed
bytedance-seed/seed-2.0-mini262K ctx · $0.10/$0.40text+image+video->text
bytedance-seed/seed-1.6-flash262K ctx · $0.07/$0.30text+image+video->text
bytedance-seed/seed-1.6262K ctx · $0.25/$2.00text+image+video->text
bytedance-seed/seed-2.0-lite262K ctx · $0.25/$2.00text+image+video->text
Nous
nousresearch/hermes-3-llama-3.1-70b131K ctx · $0.70/$0.70text->text
nousresearch/hermes-3-llama-3.1-405b131K ctx · $1.00/$1.00text->text
nousresearch/hermes-4-70b131K ctx · $0.13/$0.40text->text
nousresearch/hermes-4-405b131K ctx · $1.00/$3.00text->text
ByteDance
bytedance/seedance-2.0 · $0.00/$0.00text+image+audio+video->video
bytedance/seedance-2.0-fast · $0.00/$0.00text+image+audio+video->video
bytedance/seedance-1-5-pro · $0.00/$0.00text+image->video
Mistral
mistralai/mistral-large128K ctx · $2.00/$6.00text+file->text
mistralai/mixtral-8x22b-instruct66K ctx · $2.00/$6.00text+file->text
NVIDIA
nvidia/nemotron-3-super-120b-a12b1000K ctx · $0.30/$0.90text->text
nvidia/nemotron-3-nano-30b-a3b262K ctx · $0.05/$0.20text->text
xiaomi
xiaomi/mimo-v2.51050K ctx · $0.14/$0.28text+image+audio+video->text
xiaomi/mimo-v2.5-pro1050K ctx · $0.43/$0.87text->text
ibm-granite
ibm-granite/granite-4.0-h-micro131K ctx · $0.02/$0.11text->text
Meta
meta-llama/llama-3.2-1b-instruct60K ctx · $0.03/$0.20text->text
Tongyi-MAI
Tongyi-MAI/Z-Image-Turbotext->image

Alle Modelle durchsuchen auf der Modellseite.

Streaming

Setzen Sie stream: true um einen Server-Sent Events (SSE) Stream zu erhalten. Jedes Event enthält einen Teil der Antwort.

from openai import OpenAI

client = OpenAI(
    base_url="https://bazaarlink.ai/api/v1",
    api_key="sk-bl-YOUR_API_KEY",
)

stream = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.6",
    messages=[{"role": "user", "content": "Count to 10 slowly."}],
    stream=True,
)

for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="", flush=True)

SSE-Format

data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"Hello"},"index":0}]}

data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":" world"},"index":0}]}

data: {"id":"chatcmpl-abc","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{"prompt_tokens":10,"completion_tokens":4,"total_tokens":14}}

data: [DONE]
Nutzung beim Streaming
Beim Streaming werden Nutzungsdaten im letzten Chunk vor der [DONE]-Nachricht zurückgegeben, zusammen mit einem choices-Array mit leerem delta und finish_reason: "stop".

Keep-alive & letzter Chunk

Streams können SSE-Kommentarzeilen (beginnend mit einem Doppelpunkt) oder Heartbeat-Events als Keep-alives enthalten — überspringen Sie Nicht-data:-Zeilen, statt den rohen Stream mit JSON.parse zu verarbeiten. Der letzte data-Chunk enthält usage (Token-Zahlen und Kosten) vor data: [DONE]. Erfolgreiche Antworten enthalten einen X-Request-Id-Header — geben Sie ihn beim Melden von Problemen an.

: keepalive          <- SSE comment line — ignore, do NOT JSON.parse

data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"Hi"},"index":0}]}

data: {"id":"chatcmpl-abc","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{...}}

data: [DONE]

Stream-Abbruch

Streaming-Anfragen können abgebrochen werden, indem die Client-Verbindung geschlossen wird — z. B. durch Aufruf von AbortController.abort() oder Schließen des Stream-Objekts. BazaarLink stoppt das Weiterleiten weiterer Chunks und bricht die ausgehende Anfrage an den Provider ab, sobald der Abbruch erkannt wird.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://bazaarlink.ai/api/v1",
  apiKey: "sk-bl-YOUR_API_KEY",
});

const controller = new AbortController();

const stream = await client.chat.completions.create(
  {
    model: "anthropic/claude-sonnet-4.6",
    messages: [{ role: "user", content: "Write a long story." }],
    stream: true,
  },
  { signal: controller.signal }
);

for await (const chunk of stream) {
  const content = chunk.choices[0]?.delta?.content;
  if (content) process.stdout.write(content);
}

// e.g. on a "Stop" button click:
controller.abort();
Keine Kosten für einen unterbrochenen Stream
Endet ein Stream, bevor der letzte usage-Chunk eintrifft — auch bei einem clientseitigen Abbruch — gibt es keine belastbare Token-Zählung für diese Anfrage, weshalb BazaarLink die vollständige Reservierung erstattet. Für bereits an Ihren Client ausgelieferte Inhalte vor dem Abbruch werden Sie nicht berechnet.
Kein garantierter sofortiger Stopp beim Provider
Das Schließen der Verbindung stoppt sofort die Weiterleitung und Abrechnung weiterer Token durch BazaarLink, ob der vorgelagerte Provider die Generierung auf seinen eigenen Servern jedoch augenblicklich einstellt, hängt vom jeweiligen Provider ab — manche rechnen noch kurz weiter, nachdem die Verbindung getrennt wurde.

Fehler mitten im Stream

Kein choices-Feld bei Fehler-Frames
Tritt ein Fehler auf, nachdem das Streaming bereits begonnen hat (z. B. Abbruch der Upstream-Verbindung), erhalten Sie einen SSE-Datenframe der Form {error:{message,type,code}} statt des üblichen {choices:[...]} — ohne Änderung des HTTP-Status, da die Header bereits gesendet wurden. Prüfen Sie auf ein error-Feld, bevor Sie choices[0].delta lesen. Abgerechnet werden nur die bereits gestreamten Tokens (anteilige Abrechnung).
data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"The capital of "},"index":0}]}

data: {"error":{"message":"Upstream connection lost.","type":"upstream_error","code":502}}

data: [DONE]

Embeddings

Embeddings sind numerische Darstellungen von Text, die semantische Bedeutung erfassen — sie wandeln Text in Vektoren (Zahlenfolgen) um, die für vielfältige Machine-Learning-Aufgaben genutzt werden können. BazaarLink bietet einen einheitlichen, zur OpenAI Embeddings API kompatiblen Endpunkt, über den Sie Embedding-Modelle mehrerer Anbieter über eine einzige Schnittstelle aufrufen können.

Was sind Embeddings?

Embeddings wandeln Text in hochdimensionale Vektoren um, bei denen semantisch ähnliche Texte im Vektorraum näher beieinanderliegen — zum Beispiel hätten "Katze" und "Kätzchen" ähnliche Embeddings, während "Katze" und "Flugzeug" weit auseinanderlägen. Diese Vektordarstellungen ermöglichen es Maschinen, Beziehungen zwischen Textabschnitten zu verstehen, und bilden damit die Grundlage vieler KI-Anwendungen.

Typische Anwendungsfälle

Anwendungsfall
Beschreibung
RAG (Abruf-erweiterte Generierung)Systeme entwickeln, die vor der Antwortgenerierung relevanten Kontext aus einer Wissensdatenbank abrufen — Embeddings finden die relevantesten Dokumente für den Kontext des LLM.
Semantische SucheDokumente und Anfragen in Embeddings umwandeln und dann die relevantesten Dokumente über Vektorähnlichkeit finden — versteht Bedeutung statt nur Schlüsselwörter abzugleichen und liefert bessere Ergebnisse als reine Schlüsselwortsuche.
EmpfehlungssystemeEmbeddings für Artikel (Produkte, Beiträge, Videos) und Nutzerpräferenzen erzeugen, um ähnliche Artikel zu empfehlen — Vektorvergleich findet semantisch verwandte Artikel auch ohne gemeinsame Schlüsselwörter.
Clustering & KlassifizierungÄhnliche Dokumente gruppieren oder Text klassifizieren, indem Embedding-Muster analysiert werden — Dokumente mit ähnlichen Embeddings gehören meist zum selben Thema oder zur selben Kategorie.
DuplikaterkennungDuplikate oder nahezu identische Inhalte durch Vergleich der Embedding-Ähnlichkeit finden — funktioniert auch bei umformuliertem Inhalt.
AnomalieerkennungUngewöhnliche oder abweichende Inhalte erkennen, indem Embeddings identifiziert werden, die deutlich vom typischen Muster des Datensatzes abweichen.
POST/api/v1/embeddings
Note
Nicht alle Upstream-Anbieter unterstützen Embeddings. Wenn Ihr konfigurierter Anbieter das angeforderte Modell nicht unterstützt, wechselt BazaarLink automatisch zum nächsten verfügbaren Anbieter.

Parameter

modelerforderlich
string
Das zu verwendende Embedding-Modell, z. B. "openai/text-embedding-3-small".
inputerforderlich
string | string[] | ContentItem[]
Zu embeddender Text — ein einzelner String, ein Array von Strings für einen Batch-Aufruf, oder (bei unterstützenden Modellen) ein Array von {content:[...]}-Elementen mit Text- und image_url-Teilen.
dimensions
integer
Angeforderte Ausgabevektorgröße. Wird nur von Modellen mit variabler Dimension unterstützt (z. B. die OpenAI text-embedding-3-Familie); wird unverändert an den Upstream-Anbieter weitergeleitet und von nicht unterstützenden Modellen ignoriert.
encoding_format
string
Angefordertes Embedding-Encoding, z. B. "float" oder "base64". Wird unverändert an den Upstream-Anbieter weitergeleitet — die Unterstützung hängt vom Modell ab.
provider
object
Provider-Routing-Einstellungen — order, allow_fallbacks, data_collection und weitere Felder, siehe Provider-Auswahl.

Einfache Anfrage

from openai import OpenAI

client = OpenAI(
    base_url="https://bazaarlink.ai/api/v1",
    api_key="sk-bl-YOUR_API_KEY",
)

response = client.embeddings.create(
    model="openai/text-embedding-3-small",
    input="The quick brown fox jumps over the lazy dog",
)

print(response.data[0].embedding)  # 1536-dimensional vector

Batch-Verarbeitung

Senden Sie ein Array von Strings, um mehrere Texte in einer einzigen Anfrage zu embedden — günstiger und schneller als ein Aufruf pro Text.

response = client.embeddings.create(
    model="openai/text-embedding-3-small",
    input=[
        "Machine learning is a subset of artificial intelligence",
        "Deep learning uses neural networks with multiple layers",
        "Natural language processing enables computers to understand text",
    ],
)

for i, item in enumerate(response.data):
    print(f"Embedding {i}: {len(item.embedding)} dimensions")

Multimodale Eingabe (Bild + Text)

Modelle mit Bildeingabe-Unterstützung (output_modalities enthält "embeddings", inputModalities enthält "image") akzeptieren Eingabe-Elemente in der Form {content:[{type:"text",...}, {type:"image_url",...}]} — so können Sie ein Bild allein oder gemeinsam mit Text embedden.

Modellabhängig
Nur manche Embedding-Modelle akzeptieren Bildeingaben — prüfen Sie die unterstützten Modalitäten eines Modells auf der Modelle-Seite, bevor Sie image_url-Inhalte senden. Reine Textmodelle lehnen diese Form ab.
import requests

response = requests.post(
    "https://bazaarlink.ai/api/v1/embeddings",
    headers={
        "Authorization": "Bearer sk-bl-YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={
        "model": "google/gemini-embedding-2-preview",
        "input": [{
            "content": [
                {"type": "text", "text": "A scenic boardwalk through a green meadow"},
                {"type": "image_url", "image_url": {"url": "https://example.com/boardwalk.jpg"}},
            ]
        }],
        "encoding_format": "float",
    },
)

embedding = response.json()["data"][0]["embedding"]
print(f"Embedding dimension: {len(embedding)}")

Provider-Routing

Steuern Sie, welcher Upstream eine Embedding-Anfrage bedient — genau wie bei Chat Completions. Die vollständige Feldreferenz finden Sie unter Provider-Auswahl.

{
  "model": "openai/text-embedding-3-small",
  "input": "Your text here",
  "provider": {
    "order": ["openai"],
    "allow_fallbacks": true,
    "data_collection": "deny"
  }
}

Embedding-Modelle finden

Es gibt keinen eigenen Endpunkt zum Auflisten von Embedding-Modellen — rufen Sie GET /api/v1/models auf und filtern Sie clientseitig nach Einträgen, deren output_modalities "embeddings" enthält, oder durchsuchen Sie die Modelle-Seite.

Einschränkungen

  • Kein Streaming — Embeddings werden immer als vollständige Antwort zurückgegeben, anders als bei Chat Completions.
  • Jedes Modell hat eine maximale Eingabelänge; Text darüber hinaus wird upstream gekürzt oder abgelehnt.
  • Embeddings für identische Eingaben sind deterministisch — keine Temperature oder Zufälligkeit im Spiel.

Best Practices

  • Wählen Sie ein Modell nach Geschwindigkeit/Qualität/Kosten — kleinere Modelle (z. B. qwen/qwen3-embedding-4b) sind günstiger und schneller; größere (z. B. openai/text-embedding-3-large) embedden meist mit höherer Genauigkeit.
  • Fassen Sie mehrere Texte in einer Anfrage zusammen statt einem Aufruf pro Text — weniger Roundtrips, geringerer Overhead.
  • Cachen Sie Ergebnisse — Embeddings für dieselbe Eingabe ändern sich nie, speichern Sie sie statt sie neu zu erzeugen.
  • Vergleichen Sie mit Kosinus-Ähnlichkeit, nicht mit euklidischem Abstand — sie ist skaleninvariant und funktioniert besser bei hochdimensionalen Vektoren.
  • Achten Sie auf die Kontextlänge jedes Modells — lange Dokumente müssen vor dem Embedding evtl. in Abschnitte zerlegt werden.

Parameter

Sampling-Parameter bestimmen den Token-Generierungsprozess. BazaarLink leitet unterstützte Parameter an den Upstream-Anbieter weiter; nicht unterstützte Parameter werden stillschweigend ignoriert.

Sampling-Parameter

Reine Passthrough — keine lokalen Standardwerte
Diese werden unverändert an den Upstream-Provider weitergegeben — BazaarLink setzt oder erzwingt niemals einen Standardwert. „Standard" unten beschreibt das Verhalten des Providers, wenn ein Feld weggelassen wird, keine Garantie von BazaarLink.
temperature
number
Sampling-Temperatur 0–2. Höher = zufälliger. Standard: 1
top_p
number
Nucleus-Sampling-Wahrscheinlichkeitsmasse. Standard: 1
top_k
integer
Token-Auswahl auf Top-K begrenzen. 0 = deaktiviert (alle berücksichtigen). Standard: 0
frequency_penalty
number
Wiederholte Tokens bestrafen. Bereich: [-2, 2]. Standard: 0
presence_penalty
number
Tokens basierend auf Vorkommen bestrafen. Bereich: [-2, 2]. Standard: 0
repetition_penalty
number
Token-Wiederholung aus der Eingabe reduzieren. Bereich: (0, 2]. Standard: 1
min_p
number
Minimale Wahrscheinlichkeit relativ zum Top-Token. Bereich: [0, 1]. Standard: 0
top_a
number
Dynamisches Top-P basierend auf dem Token mit höchster Wahrscheinlichkeit. Bereich: [0, 1]. Standard: 0
seed
integer
Integer-Seed für deterministische Generierung. Nicht für alle Modelle garantiert
max_tokens
integer
Maximale Anzahl zu generierender Tokens
n
integer
Anzahl der zu generierenden Completions. Standard: 1
logit_bias
object
Token-IDs zu Bias-Werten [-100, 100] zuordnen, die vor dem Sampling addiert werden. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
logprobs
boolean
Log-Wahrscheinlichkeiten jedes Ausgabe-Tokens zurückgeben. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
top_logprobs
integer
Anzahl der wahrscheinlichsten Tokens pro Position (erfordert logprobs: true). Bereich: 0–20. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
response_format
object
Strukturierte JSON-Ausgabe erzwingen. Siehe Abschnitt Structured Output
structured_outputs
boolean
Fordert striktes, JSON-Schema-konformes Output bei Providern an, die dies unterstützen. Wird unverändert weitergegeben
reasoning
object
Provider-spezifische Reasoning-/Thinking-Konfiguration. Wird unverändert weitergegeben
reasoning_effort
string
OpenAI o-Serie Reasoning-Aufwand: "low", "medium" oder "high". Wird unverändert weitergegeben
stop
string | string[]
Stoppsequenzen — Generierung stoppt bei Auftreten
tools
Tool[]
Liste der Tools (Funktionen), die das Modell aufrufen kann
tool_choice
string | object
Steuert die Tool-Nutzung: "auto", "none" oder bestimmtes Tool
parallel_tool_calls
boolean
Parallele Funktionsaufrufe aktivieren, wenn Tools bereitgestellt werden. Standard: true. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.

BazaarLink-spezifische Parameter

transforms
string[]
Anzuwendende Nachrichtentransformationen, z.B. ["middle-out"]. Weglassen für automatische Anwendung bei ≤8k-Kontext-Modellen
models
string[]
Fallback-Modellliste — BazaarLink probiert jedes der Reihe nach, wenn das primäre fehlschlägt
route
string
Erweitertes Routing-Kompatibilitätsfeld — die meisten Nutzer brauchen es nicht. Für Fallback "models" verwenden.
provider
object
Erweiterte Routing-Einstellungen — die meisten Nutzer brauchen sie nicht.

Credits

Fragen Sie den aktuellen Guthabenstand und die Lebensdauer API Nutzung ab.

GET/api/v1/credits
Auth
Benötigt Bearer-Token (Standard-API-Schlüssel sk-bl-...).

Beispielanfrage

curl https://bazaarlink.ai/api/v1/credits \
  -H "Authorization: Bearer sk-bl-YOUR_KEY"

Antwort

{
  "data": {
    "total_credits": 100.00,
    "total_usage": 12.34
  }
}

Errors: 401 (missing/invalid-Schlüssel), 403 (gesperrter Benutzer).

Generationsdetails

Rufen Sie detaillierte Statistiken für einen einzelnen Abschluss nach Generations-ID ab (aus der chat/completions-Antwort-ID oder dem Streaming-x-bz-gen-id-Header).

GET/api/v1/generation?id=<generation-id>
Auth
Erfordert Bearer-Token (Standardschlüssel API). Erforderlicher Abfrageparameter: ID.

Beispielanfrage

curl "https://bazaarlink.ai/api/v1/generation?id=gen_abc123" \
  -H "Authorization: Bearer sk-bl-YOUR_KEY"

Antwort

{
  "data": {
    "id": "gen_xyz...",
    "model": "openai/gpt-4.1",
    "provider": "openai",
    "created_at": "2026-04-20T10:00:00.000Z",
    "app_name": "MyApp",
    "finish_reason": "stop",
    "status": 200,
    "duration_ms": 1234,
    "first_token_ms": 234,
    "throughput": 45.6,
    "usage": {
      "prompt_tokens": 100,
      "completion_tokens": 200,
      "total_tokens": 300,
      "prompt_tokens_details": { "cached_tokens": 50 },
      "completion_tokens_details": { "reasoning_tokens": 30 },
      "cost": 0.00123
    },
    "cost_breakdown": {
      "subtotal": 0.00123,
      "cache_discount": 0.00015,
      "total": 0.00108
    }
  }
}

Errors: 400 (fehlende ID), 401 (Authentifizierung), 404 (Generation nicht gefunden).

API Schlüsselinformationen

Fragen Sie die Ratenbegrenzungsstufe des aktuellen API-Schlüssels und die aggregierten Nutzungszähler ab (das Antwortformat folgt den branchenüblichen Konventionen für Schlüsselinformationen API).

GET/api/v1/key
Auth
Benötigt Bearer-Token (Standardschlüssel API).

Antwort

{
  "data": {
    "label": "Production Key",
    "limit": null,
    "limit_remaining": 100.00,
    "limit_reset": null,
    "expires_at": null,
    "is_free_tier": false,
    "is_management_key": false,
    "is_provisioning_key": false,
    "usage": 12.34,
    "usage_daily": 0.12,
    "usage_weekly": 0.45,
    "usage_monthly": 1.23,
    "requests": 1234,
    "requests_daily": 10,
    "requests_weekly": 50,
    "requests_monthly": 200,
    "rate_limit": { "requests": 600, "interval": "1m", "note": "Paid-tier rate limit." }
  }
}
Note
is_free_tier = true, wenn das Guthaben < 10 $ ist. Die Fenster sind in UTC: täglich = aktueller Tag, wöchentlich = Mo–So, monatlich = 1.–EOM. Wenn für den Schlüssel ein Ausgabenlimit pro Schlüssel festgelegt ist (über den Limit-Parameter des Schlüssels creation/update), spiegelt limit / limit_remaining / limit_reset dieses Limit und die Nutzung des entsprechenden Zeitraums wider; andernfalls ist limit null und limit_remaining fällt auf den Guthabenstand Ihres Kontos zurück. expires_at ist die Ablaufzeit des Schlüssels (null, wenn keine). is_management_key und is_provisioning_key sind Aliase für dasselbe Konzept – beide gelten für einen Verwaltungsschlüssel.
BYOK
BazaarLink bietet kein Programm zum Bringen Ihres eigenen Schlüssels (BYOK), daher gibt dieser Endpunkt keine byok_usage-Felder zurück.

Fehler: 401 (Authentifizierung), 404 (Benutzer fehlt – selten).

Agent-Registrierung

Self-Service-Registrierung für KI-Agenten (Bots, autonome Systeme). Gibt einen API-Schlüssel mit Testguthaben und einem Anspruchstoken für ein Konto-Upgrade zurück.

POST/api/v1/agents/register
Rate Limit
Keine Authentifizierung erforderlich, aber IP-begrenzt auf 1 Registrierung pro 24 Stunden.

Anfragetext

nameerforderlich
string
Agent-Name (nicht leer, gekürzt, max. 100 Zeichen).
description
string
Optionale Agentenbeschreibung.
referral_code
string
Optionaler Empfehlungscode.

Beispielanfrage

curl -X POST https://bazaarlink.ai/api/v1/agents/register \
  -H "content-type: application/json" \
  -d '{
    "name": "My Agent",
    "description": "Autonomous research bot"
  }'

Antwort

{
  "api_key": "sk-bl-xxxxx...",
  "credits": 0.10,
  "credits_usd": "$0.1000",
  "claim_token": "abc...xyz",
  "claim_expires": "2026-04-27T10:00:00.000Z",
  "upgrade_url": "https://bazaarlink.ai/claim?token=...",
  "referral_code": "aBcDeFgH",
  "free_model": "auto:free",
  "message": "Welcome to BazaarLink!...",
  "referral_message": "Share referral link:...",
  "base_url": "https://bazaarlink.ai/api/v1",
  "docs": "https://bazaarlink.ai/llms.txt"
}

Errors: 400 (ungültiger Text / fehlender Name), 429 (Ratenbegrenzung – 1/IP/24h), 500 (intern).

Fehlercodes

Fehlerantwortformat

Modellinferenz-Endpunkte geben eine OpenAI-kompatible Fehlerhülle zurück. Das Feld type kann variieren oder fehlen; verwenden Sie für die Programmlogik den HTTP-Status und error.code, statt die Meldung auszuwerten.

{
  "error": {
    "message": "Insufficient credits. Please top up to continue.",
    "type": "invalid_request_error",
    "code": "insufficient_credits"
  }
}

HTTP Status und Fehlercode

Before streaming, the HTTP status identifies the broad failure class. error.code is either that number or a stable string for a specific remedy. Prefer the string code when present, otherwise use the HTTP status.

Code
Name
Beschreibung
400Bad RequestFehlerhafte Anfrage, leeres messages-Array oder fehlende Pflichtfelder
401Nicht autorisiertAPI-Schlüssel fehlt, ist ungültig oder deaktiviert
402Zahlung erforderlichUnzureichendes Kontoguthaben, Schlüssel-Ausgabenlimit erreicht oder monatliches/wöchentliches Budgetlimit überschritten
403VerbotenKonto ist gesperrt oder hat keine Berechtigung
404Nicht gefundenRequested model, generation, key, or other resource does not exist
409KonfliktResource is not in the required state, such as an incomplete video job
410GegangenRequested model has been retired and must be replaced
413Payload zu großRequest-Body überschreitet 10 MB; reduzieren Sie die Inhaltsgröße oder teilen Sie die Anfrage auf
416Range nicht erfüllbarRequested byte range is invalid for generated video content
429Zu viele AnfragenRate Limit überschritten; prüfen Sie den Retry-After-Header vor dem erneuten Versuch
500ServerfehlerInterner BazaarLink-Fehler
502Bad GatewayAlle Upstream-Anbieter fehlgeschlagen; Failover wurde versucht
503Dienst nicht verfügbarKein Upstream-Anbieter für dieses Modell konfiguriert; Admin kontaktieren
504Gateway-TimeoutUpstream connection or stream stalled and timed out

Maschinenlesbare Abrechnungscodes

A 402 can represent different controls. Use these stable codes to choose the correct action.

Code
Beschreibung
budget_cap_reachedA weekly or monthly budget cap was reached; raise or reset the cap.
credit_limit_exceededA monthly-billing organization's credit line was exhausted; contact billing.
insufficient_creditsThe prepaid balance is insufficient; add credits.
spend_limit_exceededThe API key reached its daily, weekly, or monthly spend limit.

Stable error.code catalog

These string codes are emitted by public inference and media paths. Branch on the string code when present; the HTTP status remains the broad failure class.

Modell und Endpunkt
Modellsuch-, Lebenszyklus-, Preis-, Modalitäts- und Endpunktkompatibilitätsfehler.
Code
HTTP-Status
unknown_model400
invalid_model_id400
model_not_found404
model_retired410
model_endpoint_mismatch400
embedding_on_chat_endpoint400
model_not_priced400
invalid_modality_for_model400
Anfrage und Sicherheit
Ungültige Parameter, Kontext, Tools, Schemata und Inhaltssicherheitsverweigerungen.
Code
HTTP-Status
missing_required_field400
unsupported_param400
max_tokens_invalid400
context_too_long400
tool_use_unsupported400
malformed_tool_messages400
invalid_response_format_schema400
invalid_tools_definition400
content_moderation403
content_filter403
unknown_4xx400
Bildgenerierung und -bearbeitung
Bildeingabe-, mehrteilige Bearbeitungs-, Ausgabe- und Bild-Pipeline-Fehler.
Code
HTTP-Status
invalid_image_url400
input_images_not_supported400
invalid_content_type400
mask_not_supported400
unsupported_response_format400
missing_prompt400
missing_image400
too_many_images400
invalid_image_type400
image_too_large400
invalid_n400
pipeline_error502
no_images502
Upstream-Routing
Sanitized Provider-Konnektivität, Authentifizierung, Drosselung und Verfügbarkeitsfehler.
Code
HTTP-Status
upstream_unreachable502
upstream_auth_failed502
upstream_rate_limited429
upstream_unavailable502/503

Ratengrenzen, Budgets und Notbremsen

These controls can reject an otherwise valid request and require different recovery actions.

Control
HTTP-Status
So identifizieren Sie es
Anforderungsratenbegrenzung429Numerischer Code 429; Verwenden Sie die Header „Retry-After“ und „X-RateLimit-*“.
Rate-Limit-Strafblock429Numerischer Code 429 und eine vorübergehende Einschränkungsnachricht; Verwenden Sie Retry-After.
Globale Ausgaben-Notbremse503Numerischer Code 503, Nachricht zum globalen Ausgabenlimit und Wiederholungsversuch nach 30 oder 300 Sekunden.
Scoped spend brake429Numeric code 429 and a spend circuit-breaker message naming the scope.
Abrechnungs- und Budgetkontrollen402Verwenden Sie die oben aufgeführten stabilen Abrechnungszeichenfolgencodes.

Compatibility note: rate-limit and emergency-brake paths currently emit numeric error.code values. Use HTTP status, Retry-After, and the documented response message.

Video- und Medienressourcenstatus

Video validation commonly returns numeric code 400. Missing jobs return 404, retired models 410, unfinished video content 409, and invalid video byte ranges 416.

Retry-Richtlinie

Retry only failures that may recover without changing the request. Honor Retry-After or use exponential backoff with jitter. Do not stack SDK and manual retries.

Wiederholen Sie den Vorgang mit Backoff
429, 502, 503, and 504. Check the original generation job before creating another after an ambiguous network failure.
Fix vor dem erneuten Versuch
400, 401, 402, 403, 404, 409, 410, 413, and 416. Fix the request, credentials, balance, permissions, resource state, or Range header first.

Fehlerbehandlung

import random
import time
from openai import OpenAI, APIStatusError

client = OpenAI(
    base_url="https://bazaarlink.ai/api/v1",
    api_key="sk-bl-YOUR_API_KEY",
    max_retries=0,  # Avoid double retries; this example handles them.
)

RETRYABLE = {429, 502, 503, 504}

for attempt in range(5):
    try:
        response = client.chat.completions.create(
            model="openai/gpt-4.1",
            messages=[{"role": "user", "content": "Hello!"}],
        )
        break
    except APIStatusError as error:
        if error.status_code not in RETRYABLE or attempt == 4:
            raise
        retry_after = error.response.headers.get("Retry-After")
        delay = (
            float(retry_after)
            if retry_after
            else min(8, 0.5 * (2 ** attempt)) + random.uniform(0, 0.25)
        )
        time.sleep(delay)

Streaming-Fehlerformate

Fehler, die vor dem Streamen von Tokens auftreten, geben eine Standard-HTTP-Fehlerantwort mit einem JSON-Body zurück.

After a stream starts, the HTTP response is already 200. Parse each SSE data frame and treat a top-level error or choices[0].finish_reason === "error" as a failed, incomplete response.

Wenn der Stream mitten in der Übertragung fehlschlägt, sendet BazaarLink ein letztes SSE-Event mit einem error-Objekt auf oberster Ebene, gefolgt von data: [DONE]. Chunks, die von manchen Upstreams unverändert weitergeleitet werden, können den Fehler stattdessen auf der Choice tragen (choices[0].finish_reason === "error") — behandeln Sie beide Fälle.

// If the stream fails mid-flight, BazaarLink emits a final SSE event
// with a top-level "error" object, followed by data: [DONE]
data: {"error":{"message":"Upstream stream interrupted. The response is incomplete.","type":"upstream_error","code":502}}

data: [DONE]

// Chunks relayed verbatim from some upstreams may instead carry the error
// inline on the choice: choices[0].finish_reason === "error" with an
// "error" object ({ code, message }) on the choice — handle both shapes.
// Branch on error.code; error.type can vary by failure path.

Versionierung

BazaarLink stellt einen einzigen stabilen API-Pfad bereit, /api/v1 — es gibt keine datumsgebundenen Versionen oder Versions-Header zu verwalten. Die API entwickelt sich fortlaufend weiter statt über nummerierte Releases.

Nicht-brechende Änderungen

Diese werden ohne vorherige Ankündigung veröffentlicht:

  • Neue Endpunkte
  • Neue Modelle im Katalog
  • Neue optionale Anfrageparameter
  • Neue Antwortfelder
  • Neue Schemas mit optionalen Feldern
  • Zusätzliche Antwortstatus-/Fehlercodes
Clients defensiv schreiben
Ignorieren Sie Antwortfelder, die Sie nicht kennen, und scheitern Sie nicht an unbekannten Werten in enum-artigen Feldern — neue kommen hinzu, wenn Katalog und Funktionsumfang wachsen.

Breaking Changes

Diese sind selten und umfassen:

  • Entfernen oder Umbenennen eines Endpunkts, Parameters oder Antwortfelds
  • Ändern des Typs eines Felds
  • Verpflichtendmachen eines optionalen Parameters

Wenn sie vorkommen, betrifft ein Breaking Change einen bestimmten Endpunkt statt der gesamten /api/v1-Oberfläche — es gibt keinen einzelnen Versionssprung, der alle Integrationen gleichzeitig brechen könnte. Wir veröffentlichen noch kein formelles Changelog mit einem Breaking-Tag (siehe „Aktuell bleiben" unten) — bei integrationskritischen Fällen wenden Sie sich vorab an den Support, statt sich auf undokumentiertes Verhalten zu verlassen.

Deprecation-Richtlinie

Das eine routinemäßige „Breaking"-Ereignis, mit dem Sie rechnen sollten: einzelne Modelle werden abgeschaltet, wenn Upstream-Anbieter sie deprecaten. Fragen Sie den aktuellen Status eines Modells über GET /api/v1/models ab.

GET https://bazaarlink.ai/api/v1/models
Authorization: Bearer sk-bl-YOUR_API_KEY

# A model within 30 days of its deprecation date shows in the catalog
# with an "EOL" badge on the Models page. After the effective date it's
# dropped from the catalog and calls return:
# 410 { "error": { "type": "model_not_available", "code": "model_retired" } }

Aktuell bleiben

Wir veröffentlichen noch kein eigenes API-Changelog oder RSS-Feed. Prüfen Sie vorerst direkt diese Seite, verfolgen Sie den Status eines Modells über GET /api/v1/models, oder kontaktieren Sie den Support, wenn Sie für eine kritische Integration Vorlaufzeit benötigen.

Support
Support
Hi! How can we help you?
Send a message and we'll get back to you soon.
API-Referenz | Chat, Embeddings und Modell-Routing