BazaarLinkBazaarLink
Masuk
DokumentasiReferensi APIReferensi SDKPenggunaan AgentikSkill AI

Referensi API

Ikhtisar API BazaarLink

BazaarLink menyediakan format permintaan dan respons terpadu yang kompatibel dengan OpenAI untuk berbagai model dan penyedia. Integrasikan sekali, lalu ganti model tanpa menulis ulang aplikasi.

Spesifikasi OpenAPI

API BazaarLink lengkap didokumentasikan dengan spesifikasi OpenAPI dalam format YAML dan JSON:

Gunakan spesifikasi ini dengan Swagger UI, Postman, atau generator kode yang kompatibel dengan OpenAPI untuk menjelajahi API atau membuat pustaka klien.

Permintaan

Format Permintaan Chat Completions

Isi permintaan chat completions dikirim ke endpoint berikut:

POST/api/v1/chat/completions

Untuk daftar lengkap bidang yang didukung, lihat Parameter

Skema Permintaan
// 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>;
};

Output Terstruktur

Paksa model mengembalikan JSON valid yang cocok dengan skema. Ini penting untuk membangun aplikasi andal yang mem-parse output model secara programatik.

  • json_objectmode JSON dasar; model mengembalikan JSON yang valid.
  • json_schemamode skema ketat; keluaran harus cocok dengan JSON Schema yang diberikan.

Plugin

BazaarLink meneruskan array plugins ke rute upstream yang dipilih. Ketersediaan bergantung pada model dan penyedia; varian model :online juga mengaktifkan plugin web.

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

Header Opsional

Identifikasi aplikasi Anda di header permintaan untuk mengaktifkan pelacakan penggunaan, visibilitas dasbor, dan analitik terperinci.

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!" }]
  })
});

AAsisten Prefill

Tambahkan pesan assistant yang belum selesai sebagai item terakhir untuk meminta kelanjutan pada rute model yang kompatibel.

Cara kerjanya
BazaarLink mempertahankan dan meneruskan pesan assistant terakhir. Perilaku kelanjutan diterapkan oleh model dan penyedia upstream yang dipilih, sehingga tidak dijamin pada setiap rute.
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" }
  ]
});

Respons

BazaarLink menormalkan respons completion dari berbagai model dan penyedia ke satu format yang kompatibel dengan OpenAI.

Format Respons Completion

choices selalu berupa array. Respons streaming memakai delta, sedangkan non-streaming memakai message. Detail penggunaan dan biaya dikembalikan jika tersedia.

Skema Respons
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[];
  };
};

Alasan Selesai

finish_reason memakai nilai ternormalisasi seperti stop, length, tool_calls, content_filter, dan error; native_finish_reason mempertahankan nilai asli penyedia.

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

Meminta Biaya dan Statistik

Ambil statistik terperinci untuk penyelesaian tunggal berdasarkan ID generasi (dari id respons chat/completions atau header streaming x-bz-gen-id).

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 Versi

Endpoint utama. Kompatibel dengan OpenAI Chat Completions API.

POST/api/v1/chat/completions

Body Permintaan

modelwajib
string
ID Model, mis. "openai/gpt-4o" atau "anthropic/claude-3.5-sonnet"
messageswajib
Message[]
Array objek pesan dengan role dan content
stream
boolean
Jika true, mengembalikan stream Server-Sent Events. Default: false
temperature
number
Temperatur sampling 0–2. Lebih tinggi = lebih acak. Default: 1
max_tokens
integer
Jumlah maksimum token yang dihasilkan
max_completion_tokens
integer
Alias untuk max_tokens (kompatibel OpenAI o-series). Keduanya diterima; yang mana pun yang disediakan berlaku
top_p
number
Massa probabilitas sampling nukleus. Default: 1
top_k
integer
Batasi pilihan token ke top-K. 0 = dinonaktifkan (pertimbangkan semua). Default: 0
frequency_penalty
number
Penalti token berulang. Rentang: [-2, 2]. Default: 0
presence_penalty
number
Penalti token berdasarkan kehadiran. Rentang: [-2, 2]. Default: 0
repetition_penalty
number
Kurangi pengulangan token dari input. Rentang: (0, 2]. Default: 1
min_p
number
Probabilitas minimum relatif terhadap token teratas. Rentang: [0, 1]. Default: 0
top_a
number
Top-P dinamis berdasarkan token probabilitas tertinggi. Rentang: [0, 1]. Default: 0
seed
integer
Seed integer untuk sampling deterministik. Tidak dijamin untuk semua model
n
integer
Jumlah completion yang dihasilkan. Default: 1
user
string
Pengidentifikasi pengguna akhir untuk pemantauan dan deteksi penyalahgunaan. Tidak berpengaruh pada tagihan. Hanya model keluarga OpenAI — lihat catatan di bawah.
stop
string | string[]
Urutan berhenti — generasi berhenti saat ditemukan
logit_bias
object
Peta ID token ke nilai bias [-100, 100] yang ditambahkan sebelum sampling. Hanya model keluarga OpenAI — lihat catatan di bawah.
logprobs
boolean
Kembalikan probabilitas log dari setiap token output. Hanya model keluarga OpenAI — lihat catatan di bawah.
top_logprobs
integer
Jumlah token paling mungkin per posisi (memerlukan logprobs: true). Rentang: 0–20. Hanya model keluarga OpenAI — lihat catatan di bawah.
tools
Tool[]
Daftar tools (fungsi) yang dapat dipanggil model
tool_choice
string | object
Mengontrol penggunaan tool: "auto", "none", atau tool tertentu
parallel_tool_calls
boolean
Aktifkan pemanggilan fungsi paralel saat tools disediakan. Default: true. Hanya model keluarga OpenAI — lihat catatan di bawah.
response_format
object
Paksa output JSON terstruktur. Lihat bagian Output Terstruktur
structured_outputs
boolean
Meminta output yang sesuai skema JSON secara ketat pada penyedia yang mendukungnya. Diteruskan apa adanya
reasoning
object
Konfigurasi reasoning/thinking spesifik penyedia. Diteruskan apa adanya
reasoning_effort
string
Tingkat upaya reasoning gaya OpenAI seri-o: "low", "medium", atau "high". Diteruskan apa adanya
transforms
string[]
Transformasi pesan yang diterapkan, mis. ["middle-out"]. Abaikan untuk menerapkan otomatis pada model konteks <=8k
models
string[]
Daftar model fallback — BazaarLink mencoba masing-masing secara berurutan jika utama gagal
route
string
Field kompatibilitas routing lanjutan — sebagian besar pengguna tidak memerlukannya. Gunakan "models" untuk fallback.
provider
object
Preferensi routing lanjutan — sebagian besar pengguna tidak memerlukannya.
user, logprobs, top_logprobs, logit_bias, dan parallel_tool_calls hanya sampai ke model keluarga OpenAI
Kelima parameter ini dihapus dari permintaan upstream setiap kali model yang di-resolve bukan dikenali sebagai milik OpenAI sendiri — mengirimkannya ke anthropic/claude-*, google/gemini-*, atau target non-OpenAI lainnya mengembalikan 200 dengan parameter diabaikan secara diam-diam, bukan error. Jika Anda mengatur salah satu parameter ini dan efeknya tidak muncul, periksa apakah model target adalah milik OpenAI.

Skema Permintaan (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>;
};

Contoh Permintaan

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
  }'

Respons

{
  "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
    }
  }
}

Skema Respons (TypeScript)

BazaarLink menormalkan tepat dua field — model dan penghapusan field provider — lalu meneruskan sisa respons upstream apa adanya. Field seperti native_finish_reason, system_fingerprint, dan reasoning hanya ada jika penyedia upstream tertentu mengisinya; jangan mengandalkan kehadirannya di semua model. usage.cost adalah pengecualian — selalu berupa jumlah yang diselesaikan/ditagih oleh BazaarLink sendiri, bukan nilai yang diteruskan dari upstream.

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 };
};

Pembuatan Gambar

Hasilkan gambar dari prompt teks menggunakan model seperti DALL·E dan GPT-4o. Gunakan parameter `modalities` untuk meminta output gambar dari endpoint chat completions. Pengeditan gambar (memodifikasi gambar yang sudah ada) menggunakan POST /v1/images/edits —— kompatibel dengan OpenAI images.edit, multipart/form-data dengan gambar sumber Anda. Model yang mendukung pengeditan memiliki modality text+image->image (mis. qwen/qwen-image-edit); model murni-generasi adalah text->image —— periksa modality tiap model di GET /v1/models.

Response format

/api/v1/images/generations secara default mengembalikan JSON sinkron kompatibel OpenAI (sejak 2026-07-25) — client.images.generate() berfungsi tanpa wrapper. Kirim stream: true untuk beralih ke aliran event SSE, yang memberikan progres untuk model dengan waktu pembuatan lama.

A. /v1/chat/completions (native, direkomendasikan)

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
  }'

Image-to-image: sertakan bagian image_url dalam array content. Mendukung data URI atau URL gambar https (http:// ditolak), hingga 8 gambar, ~10MB per data URI. Pesan yang membawa gambar juga harus menyertakan bagian teks (instruksi penyuntingan). Beberapa model juga mendukung image_config (mis. {"strength": 0.7}, 0–1 — nilai lebih rendah lebih mendekati gambar sumber), diteruskan ke upstream apa adanya.

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
  }'

Penyuntingan Gambar (kompatibel OpenAI)

POST/api/v1/images/edits

client.images.edit() dari OpenAI SDK berfungsi langsung (unggahan multipart, respons JSON sinkron yang mengembalikan data: [{ url }]). Batas sama dengan image-to-image: hingga 8 gambar, 10MB per gambar; mask dan response_format=b64_json belum didukung.

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 (kompatibel DALL·E)

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"
  }'
modelwajib
string
ID model, misalnya google/gemini-2.5-flash-image
promptwajib
string
Prompt teks
size
string
Ukuran keluaran (dipetakan otomatis)
n
integer
Jumlah gambar (default 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: {}

Model gambar yang didukung

Model IDModalityi2i (edits)

Pembuatan Video

Alur asinkron tiga langkah (submit → poll → content). Pembuatan video memakan waktu 30 detik–5 menit, sehingga tidak cocok dengan semantik permintaan/respons sinkron chat-completions — karena itu BazaarLink memisahkan video ke jalur /api/v1/videos dengan pola job-id: submit mengembalikan ID vjob_* → poll status → ambil bytes setelah selesai. Memanggil model video lewat /chat/completions atau /images/generations akan mengembalikan 400 (code: wrong_endpoint_for_video). Biaya diselesaikan berdasarkan usage.cost aktual saat completed.

Jenis tugas video

Satu endpoint mencakup beberapa tugas. Tugas mana yang berjalan ditentukan oleh field yang Anda kirim —— satu model bisa melakukan image-to-video, keyframe, dan lanjutan. Tidak semua model mendukung setiap tugas; permintaan yang tidak didukung mengembalikan 400.

Teks-ke-video
prompt
Menghasilkan hanya dari prompt teks — tanpa media masukan.
Gambar-ke-video
frame_images: [ first frame ]
Gambar Anda ADALAH gambarnya: menjadi frame pertama dan dianimasikan, tetap setia pada aslinya. Mis. foto seekor kucing → kucing yang sama menoleh di adegan yang sama.
Keyframe (pertama + terakhir)
frame_images: [ first, last ]
Berikan gambar awal dan gambar akhir; model menginterpolasi gerakan di antaranya.
Lanjutan
input_video
Memperpanjang klip yang sudah ada. Durasi yang diminta harus lebih besar dari panjang video sumber.
Referensi-ke-video
input_references: [ images ]
Gambar Anda adalah REFERENSI, bukan frame: model mempertahankan subjek/gaya dan menghasilkan adegan yang benar-benar baru. Mis. foto kucing + "menari di hutan" → video baru di mana tampilan kucing dipertahankan tetapi adegan dan gerakannya baru (1–9 referensi). Bedanya dengan gambar-ke-video: i2v tetap setia pada gambar persisnya; r2v menampilkan ulang subjek ke dalam rekaman baru.
Pengeditan video
input_video + prompt
Mengedit video yang sudah ada — mengubah adegan, gaya, atau gerakan. Ditagih berdasarkan detik video masukan + detik keluaran.

1. Kirim job (langsung mengembalikan vjob_xxx)

POST/api/v1/videos
modelwajib
string
ID model, misalnya alibaba/wan2.7-t2v
promptwajib
string
Prompt teks
duration
integer
Durasi dalam detik (tergantung model)
resolution
string
Resolusi: 480p / 720p / 1080p dll.
generate_audio
boolean
Hasilkan trek audio (true/false)
frame_images
array
Gambar frame pertama/terakhir (image-to-video, keyframe). Objek { type: "image_url", image_url: { url }, frame_type: "first_frame" | "last_frame" } atau string URL biasa.
input_references
array
Gambar referensi untuk reference-to-video —— panduan subjek/gaya, bukan frame persis.
input_video
string|object
URL video sumber untuk lanjutan dan pengeditan video. Harus dapat diambil secara publik oleh upstream.
aspect_ratio
string
Rasio aspek, mis. 16:9 atau 9:16. Diabaikan bila gambar input menentukan rasionya.
watermark
boolean
Menambahkan watermark. Default false.
callback_url
string
URL webhook yang dipanggil saat job mencapai status akhir — hanya HTTPS, diperiksa SSRF. Tidak ada tanda tangan di v1; perlakukan sebagai petunjuk dan konfirmasi via GET /videos/{id}.
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
Saat submit, dana ditahan sebesar skenario terburuk × durasi × multiplier; saat completed, usage.cost dari upstream menyelesaikan selisihnya.

2. Status jajak pendapat

GET/api/v1/videos/{id}
curl -H "Authorization: Bearer $BL_API_KEY" \
  https://bazaarlink.ai/api/v1/videos/vjob_xxx
Note
Setiap GET harus berjarak ≥ 8 detik agar benar-benar diteruskan ke upstream (menghindari rate limit).
Note
Jika status=failed, seluruh jumlah reserve dikembalikan ke pengguna.

3. Ambil konten video (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

Perlu diketahui

  • Resolusi yang diizinkan berbeda per model —— nilai yang tidak didukung mengembalikan 400 beserta daftar yang didukung.
  • Gambar/video input harus dapat dijangkau dari URL publik. Host yang dilindungi hotlink (mis. beberapa wiki) akan gagal.
  • Media input melewati moderasi konten upstream dan sesekali dapat ditolak.
  • Untuk lanjutan, durasi yang diminta harus melebihi panjang video sumber.
  • Rasio aspek output mengikuti gambar input —— gambar persegi menghasilkan video persegi.
  • Pengeditan video ditagih berdasarkan detik video input ditambah detik output yang dihasilkan.
  • input_video (pengeditan / lanjutan) harus berupa URL PUBLIK. Video yang Anda hasilkan di sini disajikan di balik API key Anda, sehingga upstream tidak bisa mengambilnya —— host video sumber Anda di URL yang dapat diakses publik.
  • Payload webhook tidak ditandatangani — konfirmasi status/jumlah via GET /videos/{id} sebelum bertindak, dan perhatikan unsigned_urls di sana bersifat absolut (berbeda dari path relatif pada respons poll).

Model video yang didukung

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

Input Video

Kirim file video ke model yang mendukung input video untuk dianalisis, diberi keterangan, atau dijawab pertanyaannya seputar adegan dan peristiwa. Bisa pakai URL langsung atau base64 data URI — URL lebih efisien untuk video yang dapat diakses publik; base64 untuk file lokal atau video privat.

Format yang Didukung

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?"},
        ],
    }],
)

Referensi API lengkap →

Input PDF

Kirim dokumen PDF langsung dalam pesan ke model yang mendukung input PDF secara native (mis. Claude, Gemini). BazaarLink meneruskan file langsung ke model — ditagih sebagai input token biasa, tanpa biaya tambahan atau langkah pemrosesan ekstra.

Format yang Didukung

  • Dokumen PDF (teks, gambar, tabel, pindai)
  • URL data base64 (`data:application/pdf;base64,...`)
  • Dokumen multi-halaman
  • Hanya PDF tanpa kata sandi
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

Endpoint yang kompatibel dengan OpenAI Responses API untuk percakapan multi-turn stateless, tool calling, dan input multimodal. Ideal untuk agen dan framework yang menggunakan OpenAI Python SDK >= 1.x dengan client.responses.create().

POST/api/v1/responses
Note
Menerima autentikasi dan routing model yang sama dengan Chat Completions.

Body Permintaan

modelwajib
string
ID Model, mis. "openai/gpt-4o" atau "anthropic/claude-3.5-sonnet"
inputwajib
string | Item[]
Input pengguna — string biasa (pesan tunggal) atau array item input untuk percakapan multi-turn / multimodal.
instructions
string
Instruksi level sistem, setara dengan pesan sistem. Harus dikirim ulang pada setiap permintaan.
stream
boolean
Jika true, mengembalikan event stream SSE Responses API. Tipe event: response.created, response.output_text.delta, response.completed.
max_output_tokens
integer
Jumlah maksimum token output yang dihasilkan (termasuk token penalaran untuk model o-series).
temperature
number
Temperatur sampling 0–2. Lebih tinggi = lebih acak. Default: 1
top_p
number
Massa probabilitas sampling nukleus. Default: 1
tools
Tool[]
Definisi tool (fungsi) — format JSON Schema yang sama dengan Chat Completions (menerima bentuk datar Responses maupun bentuk bersarang). Tool bawaan milik OpenAI sendiri (web_search_preview, file_search, computer_use_preview) tidak didukung; pencarian web tersedia melalui plugins: [{id:"web"}] — hanya didukung pada beberapa rute model.
tool_choice
string | object
Mengontrol penggunaan tool: "auto", "none", atau tool tertentu
parallel_tool_calls
boolean
Aktifkan pemanggilan fungsi paralel saat tools disediakan. Default: true. Hanya model keluarga OpenAI — lihat catatan di bawah.
response_format
object
Paksa output JSON terstruktur. Lihat bagian Output Terstruktur
models
string[]
Daftar model fallback — BazaarLink mencoba masing-masing secara berurutan jika utama gagal
transforms
string[]
Transformasi pesan yang diterapkan, mis. ["middle-out"]. Abaikan untuk menerapkan otomatis pada model konteks <=8k
previous_response_id
string
Endpoint ini stateless — mengirim nilai yang bukan null langsung mengembalikan 400 (invalid_prompt), tidak pernah diterima lalu diabaikan. Gunakan mode stateless: kirim riwayat percakapan lengkap dalam array input.
provider
object
Preferensi routing lanjutan — sebagian besar pengguna tidak memerlukannya.

Skema Permintaan (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" };

Contoh Permintaan

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?"
  }'

Format Respons

// 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" };

Migrasi dari Chat Completions

Ganti messages dengan input (string atau array), gunakan instructions sebagai pengganti pesan system-role, dan baca output[0].content[0].text alih-alih 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

Keterbatasan

  • previous_response_id atau store: true ditolak dengan 400 (kode error invalid_prompt) — bukan diterima lalu diabaikan. Selalu gunakan mode stateless: kirim riwayat percakapan lengkap dalam array input.
  • Tool bawaan milik OpenAI sendiri (web_search_preview, file_search, computer_use_preview) tidak didukung. Pencarian web tersedia melalui plugins: [{id:"web"}] — hanya didukung pada beberapa rute model.
  • background: true diterima tetapi diabaikan — setiap permintaan selalu berjalan secara sinkron hingga selesai.

Messages (Anthropic)

Anthropic API untuk Claude SDK. Gunakan persis seperti yang Anda lakukan dengan API Anthropic — cukup ubah basis URL dan header autentikasi.

POST/api/v1/messages
Note
AMenerima token pembawa atau header x-api-key (kompatibilitas Anthropic SDK). Ukuran badan maksimal: 10 MB.

Body Permintaan

modelwajib
string
ID Model, mis. "openai/gpt-4o" atau "anthropic/claude-3.5-sonnet"
max_tokenswajib
integer
Jumlah maksimum token yang akan dihasilkan (bilangan bulat positif).
messageswajib
Message[]
Array pesan percakapan (tidak kosong).
system
string
Permintaan sistem opsional.
stream
boolean
Jika true, mengembalikan stream Server-Sent Events. Default: false
temperature
number
Temperatur sampling 0–2. Lebih tinggi = lebih acak. Default: 1
top_p
number
Massa probabilitas sampling nukleus. Default: 1
top_k
integer
Batasi pilihan token ke top-K. 0 = dinonaktifkan (pertimbangkan semua). Default: 0
stop_sequences
string[]
String urutan penghentian khusus.
tools
Tool[]
Daftar tools (fungsi) yang dapat dipanggil model
tool_choice
string | object
Mengontrol penggunaan tool: "auto", "none", atau tool tertentu

Contoh Permintaan

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)

Respons

{
  "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
  }
}

Kesalahan: 400 (validasi), 402 (kredit tidak mencukupi), 429 (batas kecepatan), 502 (kesalahan hulu/kunci hilang), 503 (server dimulai ulang).

Model

Daftar semua model yang tersedia dengan informasi harga dan kemampuan. Tidak diperlukan autentikasi untuk endpoint ini.

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"

Respons

{
  "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
  }[];
};

Harga Bertingkat Berdasarkan Panjang Input

Beberapa model beralih ke tabel harga yang berbeda setelah prompt melebihi ambang token — seluruh tabel berubah, bukan hanya token di atas ambang. Ambang bersifat ketat: prompt dengan tepat N token masih ditagih pada tingkat di bawah N; tingkat yang lebih tinggi berlaku hanya ketika token input lebih besar dari N.

pricing_tiers adalah field sejajar dengan pricing, hanya ada ketika model memiliki tingkat override di atas harga dasar. Entri diurutkan berdasarkan above_prompt_tokens menaik; prompt/completion adalah USD per token (satuan sama dengan pricing.prompt/pricing.completion). pricing.prompt dan pricing.completion selalu tetap menjadi tingkat dasar (terendah).

Sebagian besar model tidak memiliki tingkat — untuk model tersebut, key pricing_tiers tidak ada sama sekali dalam respons.

{
  "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"
    }
  ]
}

Model Tersedia (257)

Ini adalah model yang saat ini tersedia di BazaarLink, dimuat secara dinamis dari database kami:

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

Jelajahi semua model di halaman Model.

Streaming

Atur stream: true untuk menerima stream Server-Sent Events (SSE). Setiap event berisi potongan respons.

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)

Format SSE

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]
Penggunaan dalam streaming
Saat streaming, data penggunaan dikembalikan dalam potongan terakhir sebelum pesan [DONE], bersama array choices dengan delta kosong dan finish_reason: "stop".

Keep-alive & chunk terakhir

Stream dapat berisi baris komentar SSE (diawali tanda titik dua) atau event heartbeat sebagai keep-alive — lewati baris non-data: alih-alih mem-JSON.parse stream mentah. Chunk data terakhir membawa usage (jumlah token dan biaya) sebelum data: [DONE]. Respons yang berhasil menyertakan header X-Request-Id — sertakan saat melaporkan masalah.

: 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]

Pembatalan Stream

Permintaan streaming dapat dibatalkan dengan menutup koneksi klien — misalnya memanggil AbortController.abort() atau menutup objek stream. BazaarLink berhenti meneruskan chunk berikutnya dan membatalkan permintaan ke provider segera setelah pembatalan diterima.

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();
Tidak ada biaya untuk stream yang terputus
Jika stream berakhir sebelum chunk usage terakhir tiba — termasuk pembatalan dari sisi klien — tidak ada data jumlah token yang valid untuk permintaan tersebut, sehingga BazaarLink mengembalikan penuh reservasi. Anda tidak dikenakan biaya untuk konten yang sudah terkirim ke klien sebelum pembatalan.
Tidak dijamin langsung berhenti di sisi provider
Menutup koneksi langsung menghentikan BazaarLink dari meneruskan dan menagih token berikutnya, tetapi apakah provider upstream benar-benar menghentikan generasi di server mereka sendiri saat koneksi terputus tergantung pada provider tersebut — beberapa mungkin masih memproses sebentar setelah terputus.

Error di Tengah Stream

Tidak ada field choices pada frame error
Jika terjadi kegagalan setelah streaming sudah dimulai (mis. koneksi upstream terputus), Anda akan menerima SSE data frame berbentuk {error:{message,type,code}} alih-alih {choices:[...]} yang biasa — tanpa perubahan status HTTP, karena header sudah terkirim. Periksa field error sebelum membaca choices[0].delta, dan hanya token yang sudah di-stream yang ditagih (berlaku billing parsial).
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 adalah representasi numerik teks yang menangkap makna semantik — mengubah teks menjadi vektor (deretan angka) yang dapat digunakan untuk berbagai tugas machine learning. BazaarLink menyediakan endpoint terpadu yang kompatibel dengan OpenAI Embeddings API, sehingga Anda dapat memanggil model embedding dari berbagai penyedia melalui satu antarmuka.

Apa itu Embeddings?

Embeddings mengubah teks menjadi vektor berdimensi tinggi, di mana teks yang secara semantik mirip akan berdekatan dalam ruang vektor — misalnya, "kucing" dan "anak kucing" akan memiliki embedding yang mirip, sedangkan "kucing" dan "pesawat" akan sangat berjauhan. Representasi vektor ini memungkinkan mesin memahami hubungan antar teks, menjadikannya fondasi banyak aplikasi AI.

Kasus Penggunaan Umum

Kasus Penggunaan
Deskripsi
RAG (Generasi Augmented Pengambilan)Membangun sistem yang mengambil konteks relevan dari basis pengetahuan sebelum menghasilkan jawaban — embeddings menemukan dokumen paling relevan untuk disertakan dalam konteks LLM.
Pencarian SemantikMengubah dokumen dan kueri menjadi embeddings, lalu menemukan dokumen paling relevan berdasarkan kemiripan vektor — memahami makna, bukan sekadar mencocokkan kata kunci, sehingga hasilnya lebih baik daripada pencarian kata kunci.
Sistem RekomendasiMenghasilkan embeddings untuk item (produk, artikel, video) dan preferensi pengguna untuk merekomendasikan item serupa — perbandingan vektor menemukan item yang terkait secara semantik meskipun tidak ada kata kunci yang sama.
Clustering & KlasifikasiMengelompokkan dokumen serupa atau mengklasifikasikan teks dengan menganalisis pola embedding — dokumen dengan embedding serupa biasanya termasuk topik atau kategori yang sama.
Deteksi DuplikatMenemukan konten duplikat atau hampir duplikat dengan membandingkan kemiripan embedding — tetap berfungsi meskipun konten telah diparafrasekan.
Deteksi AnomaliMengenali konten yang tidak biasa atau outlier dengan mengidentifikasi embedding yang menyimpang jauh dari pola umum dataset.
POST/api/v1/embeddings
Note
Tidak semua penyedia upstream mendukung embeddings. Jika penyedia yang dikonfigurasi tidak mendukung model yang diminta, BazaarLink akan otomatis failover ke penyedia berikutnya yang tersedia.

Parameter

modelwajib
string
Model embedding yang digunakan, mis. "openai/text-embedding-3-small".
inputwajib
string | string[] | ContentItem[]
Teks yang akan di-embed — satu string, array string untuk satu panggilan batch, atau (untuk model yang mendukung) array item {content:[...]} yang menggabungkan bagian text dan image_url.
dimensions
integer
Ukuran vektor output yang diminta. Hanya dihormati oleh model yang mendukung dimensi variabel (mis. keluarga OpenAI text-embedding-3); diteruskan apa adanya ke penyedia upstream dan diabaikan oleh model yang tidak mendukungnya.
encoding_format
string
Format encoding embedding yang diminta, mis. "float" atau "base64". Diteruskan apa adanya ke penyedia upstream — dukungan tergantung pada model.
provider
object
Preferensi routing penyedia — order, allow_fallbacks, data_collection, dan field lain yang dijelaskan di Provider Selection.

Permintaan Dasar

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

Pemrosesan Batch

Kirim array string untuk meng-embed beberapa teks dalam satu permintaan — lebih murah dan cepat daripada satu panggilan per teks.

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")

Input Multimodal (Gambar + Teks)

Model dengan dukungan input gambar (output_modalities mencakup "embeddings" dan inputModalities mencakup "image") menerima item input berbentuk {content:[{type:"text",...}, {type:"image_url",...}]}, memungkinkan Anda meng-embed gambar sendiri atau bersama teks.

Tergantung model
Hanya sebagian model embedding yang menerima input gambar — periksa modalitas yang didukung model di halaman Models sebelum mengirim konten image_url. Model teks-saja akan menolak bentuk ini.
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)}")

Perutean Penyedia

Kendalikan upstream mana yang melayani permintaan embedding, sama seperti chat completions — lihat Provider Selection untuk referensi field lengkap.

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

Menemukan Model Embedding

Tidak ada endpoint khusus untuk mendaftar model embedding — panggil GET /api/v1/models lalu filter di sisi klien untuk entri yang output_modalities-nya mencakup "embeddings", atau jelajahi halaman Models.

Keterbatasan

  • Tidak ada streaming — embedding selalu dikembalikan sebagai respons lengkap, berbeda dengan chat completions.
  • Setiap model punya panjang input maksimum; teks yang melebihi batas akan dipotong atau ditolak di upstream.
  • Embedding untuk input yang identik bersifat deterministik — tidak ada temperature atau keacakan.

Praktik Terbaik

  • Pilih model sesuai trade-off kecepatan/kualitas/biaya — model lebih kecil (mis. qwen/qwen3-embedding-4b) lebih murah dan cepat; model lebih besar (mis. openai/text-embedding-3-large) umumnya meng-embed dengan fidelitas lebih tinggi.
  • Gabungkan beberapa teks dalam satu permintaan alih-alih satu panggilan per teks — lebih sedikit round trip, overhead lebih rendah.
  • Simpan hasil (cache) — embedding untuk input yang sama tidak pernah berubah, jadi simpan alih-alih membuatnya ulang.
  • Bandingkan dengan cosine similarity, bukan Euclidean distance — bersifat scale-invariant dan lebih baik untuk vektor berdimensi tinggi.
  • Perhatikan context length setiap model — dokumen panjang mungkin perlu dipecah (chunking) sebelum di-embed.

Parameter

Parameter sampling membentuk proses generasi token. BazaarLink meneruskan parameter yang didukung ke penyedia upstream; parameter yang tidak didukung diabaikan secara diam-diam.

Parameter Sampling

Murni passthrough — tidak ada default lokal
Parameter ini diteruskan ke penyedia upstream persis seperti yang dikirim — BazaarLink tidak pernah menyisipkan atau memaksakan nilai default. "Default" di bawah menjelaskan perilaku penyedia sendiri saat field diabaikan, bukan jaminan dari BazaarLink.
temperature
number
Temperatur sampling 0–2. Lebih tinggi = lebih acak. Default: 1
top_p
number
Massa probabilitas sampling nukleus. Default: 1
top_k
integer
Batasi pilihan token ke top-K. 0 = dinonaktifkan (pertimbangkan semua). Default: 0
frequency_penalty
number
Penalti token berulang. Rentang: [-2, 2]. Default: 0
presence_penalty
number
Penalti token berdasarkan kehadiran. Rentang: [-2, 2]. Default: 0
repetition_penalty
number
Kurangi pengulangan token dari input. Rentang: (0, 2]. Default: 1
min_p
number
Probabilitas minimum relatif terhadap token teratas. Rentang: [0, 1]. Default: 0
top_a
number
Top-P dinamis berdasarkan token probabilitas tertinggi. Rentang: [0, 1]. Default: 0
seed
integer
Seed integer untuk sampling deterministik. Tidak dijamin untuk semua model
max_tokens
integer
Jumlah maksimum token yang dihasilkan
n
integer
Jumlah completion yang dihasilkan. Default: 1
logit_bias
object
Peta ID token ke nilai bias [-100, 100] yang ditambahkan sebelum sampling. Hanya model keluarga OpenAI — lihat catatan di bawah.
logprobs
boolean
Kembalikan probabilitas log dari setiap token output. Hanya model keluarga OpenAI — lihat catatan di bawah.
top_logprobs
integer
Jumlah token paling mungkin per posisi (memerlukan logprobs: true). Rentang: 0–20. Hanya model keluarga OpenAI — lihat catatan di bawah.
response_format
object
Paksa output JSON terstruktur. Lihat bagian Output Terstruktur
structured_outputs
boolean
Meminta output yang sesuai skema JSON secara ketat pada penyedia yang mendukungnya. Diteruskan apa adanya
reasoning
object
Konfigurasi reasoning/thinking spesifik penyedia. Diteruskan apa adanya
reasoning_effort
string
Tingkat upaya reasoning gaya OpenAI seri-o: "low", "medium", atau "high". Diteruskan apa adanya
stop
string | string[]
Urutan berhenti — generasi berhenti saat ditemukan
tools
Tool[]
Daftar tools (fungsi) yang dapat dipanggil model
tool_choice
string | object
Mengontrol penggunaan tool: "auto", "none", atau tool tertentu
parallel_tool_calls
boolean
Aktifkan pemanggilan fungsi paralel saat tools disediakan. Default: true. Hanya model keluarga OpenAI — lihat catatan di bawah.

Parameter Khusus BazaarLink

transforms
string[]
Transformasi pesan yang diterapkan, mis. ["middle-out"]. Abaikan untuk menerapkan otomatis pada model konteks <=8k
models
string[]
Daftar model fallback — BazaarLink mencoba masing-masing secara berurutan jika utama gagal
route
string
Field kompatibilitas routing lanjutan — sebagian besar pengguna tidak memerlukannya. Gunakan "models" untuk fallback.
provider
object
Preferensi routing lanjutan — sebagian besar pengguna tidak memerlukannya.

Kredit

Query saldo kredit saat ini dan penggunaan API seumur hidup.

GET/api/v1/credits
Auth
Membutuhkan token Pembawa (kunci API standar sk-bl-...).

Contoh Permintaan

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

Respons

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

Errors: 401 (kunci missing/invalid), 403 (pengguna yang ditangguhkan).

Detail Generasi

Ambil statistik terperinci untuk penyelesaian tunggal berdasarkan ID generasi (dari id respons chat/completions atau header streaming x-bz-gen-id).

GET/api/v1/generation?id=<generation-id>
Auth
Memerlukan token Pembawa (kunci API standar). Parameter kueri yang diperlukan: id.

Contoh Permintaan

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

Respons

{
  "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 (id hilang), 401 (auth), 404 (generasi tidak ditemukan).

API Info Kunci

Query tingkat batas kecepatan kunci API saat ini dan penghitung penggunaan gabungan (format respons mengikuti konvensi API info kunci industri umum).

GET/api/v1/key
Auth
Membutuhkan token Pembawa (kunci API standar).

Respons

{
  "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 = benar bila saldo kredit < $10. Windows dalam format UTC: harian = hari ini, mingguan = Senin–Minggu, bulanan = 1–EOM. Ketika kunci memiliki batas pembelanjaan per kunci yang ditetapkan (melalui parameter batas pada kunci creation/update), limit / limit_remaining / limit_reset mencerminkan batas tersebut dan penggunaan periode yang cocok; jika tidak, limit adalah nol dan limit_remaining akan dikembalikan ke saldo kredit akun Anda. expired_at adalah waktu kedaluwarsa kunci (null jika tidak ada). is_management_key dan is_provisioning_key adalah alias untuk konsep yang sama — keduanya berlaku untuk kunci manajemen.
BYOK
BazaarLink tidak menawarkan program bawa kunci Anda sendiri (BYOK), jadi titik akhir ini tidak mengembalikan bidang byok_usage apa pun.

Errors: 401 (auth), 404 (pengguna hilang — jarang terjadi). Saldo Poin

APendaftaran Agen

Pendaftaran layanan mandiri untuk agen AI (bot, sistem otonom). Mengembalikan kunci API dengan kredit percobaan dan token klaim untuk peningkatan akun.

POST/api/v1/agents/register
Rate Limit
Tidak diperlukan otentikasi, tetapi IP dibatasi untuk 1 pendaftaran per 24 jam.

Body Permintaan

namewajib
string
ANama agen (tidak kosong, terpangkas, maks 100 karakter).
description
string
Deskripsi agen opsional.
referral_code
string
Kode rujukan opsional.

Contoh Permintaan

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

Respons

{
  "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 (isi tidak valid / nama hilang), 429 (batas kecepatan — 1/IP/24h), 500 (internal).

Kode Error

Format respons kesalahan

Endpoint inferensi model mengembalikan amplop kesalahan yang kompatibel dengan OpenAI. Kolom type dapat berbeda atau tidak disertakan; gunakan status HTTP dan error.code untuk logika program, bukan mengurai pesan.

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

HTTP status dan kode kesalahan

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.

Kode
Nama
Deskripsi
400Permintaan BurukPermintaan salah format, array messages kosong, atau field wajib hilang
401Tidak SahKunci API hilang, tidak valid, atau dinonaktifkan
402Pembayaran DiperlukanKredit akun tidak cukup, batas pengeluaran per kunci tercapai, atau batas anggaran bulanan/mingguan terlampaui
403DilarangAkun ditangguhkan atau tidak memiliki izin
404Tidak DitemukanRequested model, generation, key, or other resource does not exist
409KonflikResource is not in the required state, such as an incomplete video job
410HilangRequested model has been retired and must be replaced
413Muatan Terlalu BesarBody permintaan melebihi 10 MB; kurangi ukuran konten atau pecah permintaan
416Rentang Tidak MemuaskanRequested byte range is invalid for generated video content
429Terlalu Banyak PermintaanBatas rate terlampaui; periksa header Retry-After sebelum mencoba ulang
500Kesalahan ServerError internal BazaarLink
502Gerbang BurukSemua penyedia upstream gagal; failover telah dicoba
503Layanan Tidak TersediaTidak ada penyedia upstream yang dikonfigurasi untuk model ini; hubungi admin
504Gateway Batas WaktuUpstream connection or stream stalled and timed out

Kode penagihan yang dapat dibaca mesin

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

Kode
Deskripsi
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.

Model dan titik akhir
Kesalahan pencarian model, siklus hidup, harga, modalitas, dan kompatibilitas titik akhir.
Kode
HTTP
unknown_model400
invalid_model_id400
model_not_found404
model_retired410
model_endpoint_mismatch400
embedding_on_chat_endpoint400
model_not_priced400
invalid_modality_for_model400
Permintaan dan keamanan
Parameter, konteks, alat, skema, dan penolakan keamanan konten tidak valid.
Kode
HTTP
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
Pembuatan dan pengeditan gambar
Masukan gambar, pengeditan multibagian, keluaran, dan kesalahan saluran gambar.
Kode
HTTP
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
Perutean hulu
Konektivitas penyedia yang disanitasi, autentikasi, pembatasan, dan kesalahan ketersediaan.
Kode
HTTP
upstream_unreachable502
upstream_auth_failed502
upstream_rate_limited429
upstream_unavailable502/503

Batas tarif, anggaran, dan rem darurat

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

Kontrol
HTTP
Cara mengidentifikasinya
Batas kecepatan permintaan429Kode numerik 429; gunakan header Retry-After dan X-RateLimit-*.
Blok penalti batas tarif429Kode numerik 429 dan pesan pembatasan sementara; gunakan Coba Lagi-Setelah.
Global menghabiskan rem darurat503Kode numerik 503, pesan batas pembelanjaan global, dan Coba Lagi Setelah 30 atau 300 detik.
Scoped spend brake429Numeric code 429 and a spend circuit-breaker message naming the scope.
Penagihan dan kontrol anggaran402Gunakan kode string penagihan stabil yang tercantum di atas.

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

Status sumber daya video dan media

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

Kebijakan coba lagi

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.

Coba lagi dengan backoff
429, 502, 503, and 504. Check the original generation job before creating another after an ambiguous network failure.
Perbaiki sebelum mencoba lagi
400, 401, 402, 403, 404, 409, 410, 413, and 416. Fix the request, credentials, balance, permissions, resource state, or Range header first.

Menangani Error

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)

Format Error Streaming

Error yang terjadi sebelum token apa pun di-stream mengembalikan respons error HTTP standar dengan body JSON.

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.

Jika stream gagal di tengah jalan, BazaarLink mengirim event SSE terakhir dengan objek error tingkat atas, diikuti data: [DONE]. Chunk yang diteruskan apa adanya dari beberapa upstream mungkin justru membawa error pada choice (choices[0].finish_reason === "error") — tangani keduanya.

// 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.

BazaarLink menyediakan satu jalur API stabil, /api/v1 — tidak ada versi berbasis tanggal atau header versi yang perlu dikelola. API berkembang secara berkelanjutan, bukan melalui rilis bernomor.

Perubahan Non-Breaking

Perubahan ini dirilis tanpa pemberitahuan sebelumnya:

  • Endpoint baru
  • Model baru ditambahkan ke katalog
  • Parameter permintaan opsional baru
  • Field respons baru
  • Skema baru dengan properti opsional
  • Kode status/error respons tambahan
Tulis klien secara defensif
Abaikan field respons yang tidak Anda kenali, dan jangan gagal pada nilai yang tidak dikenal di field bertipe enum — nilai baru ditambahkan seiring bertambahnya katalog dan fitur.

Perubahan Breaking

Perubahan ini jarang terjadi, dan mencakup:

  • Menghapus atau mengganti nama endpoint, parameter, atau field respons
  • Mengubah tipe suatu field
  • Menjadikan parameter opsional sebagai wajib

Jika terjadi, perubahan breaking berlaku pada endpoint tertentu, bukan seluruh permukaan /api/v1 — tidak ada satu lompatan versi yang bisa merusak semua integrasi sekaligus. Kami belum mempublikasikan changelog resmi dengan tag Breaking (lihat "Tetap Update" di bawah) — untuk hal yang kritis bagi integrasi Anda, hubungi Support sebelum mengandalkan perilaku yang tidak terdokumentasi.

Kebijakan Deprecation

Satu peristiwa "breaking" rutin yang perlu Anda antisipasi: model tertentu dipensiunkan seiring penyedia upstream men-deprecate-nya. Periksa status model saat ini melalui GET /api/v1/models.

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" } }

Tetap Update

Kami belum mempublikasikan changelog API khusus atau RSS feed. Untuk saat ini, periksa langsung halaman ini, pantau status model melalui GET /api/v1/models, atau hubungi Support jika Anda memerlukan pemberitahuan lebih awal untuk integrasi yang kritis.

Support
Support
Hi! How can we help you?
Send a message and we'll get back to you soon.