BazaarLinkBazaarLink
Đăng nhập
Tài liệuTham chiếu APITham chiếu SDKSử dụng AgentKỹ năng AI

Tham chiếu API

Tổng quan về API BazaarLink

BazaarLink cung cấp định dạng yêu cầu và phản hồi thống nhất, tương thích OpenAI trên nhiều mô hình và nhà cung cấp. Bạn chỉ cần tích hợp một lần rồi chuyển đổi mô hình mà không phải viết lại ứng dụng.

Các trường định tuyến do khách hàng chỉ định sẽ bị bỏ qua
provider (toàn bộ đối tượng), transforms, route, service_tier cấp cao nhất và preset bị xóa trước khi gửi đến upstream nên không thể chọn upstream hoặc bậc giá. Trên endpoint Chat Completions và Responses, mảng models được hỗ trợ làm danh sách dự phòng cục bộ: BazaarLink tự định tuyến từng model và áp dụng giá khách hàng của BazaarLink cho model đó; danh sách không được chuyển tiếp lên upstream. Các hậu tố :nitro, :floor và :exacto do khách hàng gửi sẽ bị bỏ qua. :eco vẫn là bậc tiết kiệm của BazaarLink và được ánh xạ nội bộ sang BazaarLink :floor. :free vẫn là biến thể model riêng trong danh mục.
Chi phí bổ sung cho tìm kiếm web
Tìm kiếm web được yêu cầu qua plugins, :online hoặc web_search_options vẫn hoạt động như hiện tại và có thể phát sinh phụ phí upstream. Phí được tính vào khóa dùng cho yêu cầu: khóa nền tảng BazaarLink hoặc khóa BYOK của bạn.

Đặc tả OpenAPI

Toàn bộ API BazaarLink được mô tả bằng đặc tả OpenAPI và có sẵn ở định dạng YAML và JSON:

Sử dụng các đặc tả này với Swagger UI, Postman hoặc trình tạo mã tương thích OpenAPI để khám phá API hay tạo thư viện máy khách.

Yêu cầu

Định dạng yêu cầu Chat Completions

Nội dung yêu cầu Chat Completions được gửi đến endpoint sau:

POST/v1/chat/completions

Để xem danh sách đầy đủ các trường được hỗ trợ, hãy xem Tham số。

Schema yêu cầu
// Definitions of subtypes are below
type Request = {
  // Required by BazaarLink Chat Completions
  model: string;                    // Use an id or alias from GET /v1/models
  messages: Message[];             // Must contain at least one message

  // Generation
  stream?: boolean;
  temperature?: number;
  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;
  presence_penalty?: number;
  repetition_penalty?: number;
  min_p?: number;
  top_a?: number;
  // Sampling values are forwarded without range validation; models may clamp or ignore them.

  // 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";
  include_reasoning?: boolean;
  reasoning?: ReasoningConfig;
  thinking?: ThinkingConfig;
  enable_thinking?: boolean;

};

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

Đầu ra có cấu trúc

Buộc mô hình trả về JSON hợp lệ khớp với schema. Điều này thiết yếu để xây dựng ứng dụng đáng tin cậy phân tích đầu ra mô hình theo chương trình.

  • json_object — chế độ JSON cơ bản; mô hình trả về JSON hợp lệ.
  • json_schema — chế độ schema nghiêm ngặt; đầu ra phải khớp với JSON Schema được cung cấp.

Plugin

BazaarLink chuyển tiếp mảng plugins đến tuyến upstream đã chọn. Khả năng hỗ trợ phụ thuộc vào mô hình và nhà cung cấp; biến thể mô hình :online cũng bật plugin web.

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

Header tùy chọn

Xác định ứng dụng trong header yêu cầu.

TypeScript
await fetch("https://api.bazaarlink.ai/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-4o",
    messages: [{ role: "user", content: "Hello!" }]
  })
});

AHỗ trợ điền trước

Thêm một tin nhắn assistant chưa hoàn chỉnh làm mục cuối để yêu cầu tiếp tục trên các tuyến mô hình tương thích.

Cách hoạt động
BazaarLink giữ nguyên và chuyển tiếp tin nhắn assistant cuối cùng. Hành vi tiếp tục do mô hình và nhà cung cấp upstream được chọn triển khai, vì vậy không được bảo đảm trên mọi tuyến.
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" }
  ]
});

Phản hồi

BazaarLink chuẩn hóa phản hồi completion từ nhiều mô hình và nhà cung cấp thành một định dạng tương thích OpenAI thống nhất.

Định dạng phản hồi Completion

choices luôn là một mảng. Phản hồi streaming dùng delta, phản hồi không streaming dùng message; thông tin sử dụng và chi phí được trả về khi có.

Schema phản hồi
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;
  message: {
    role: "assistant";
    content: string | null;
    tool_calls?: ToolCall[];
    reasoning?: string;                                      // thinking text: when the request asked for it, or by default for the models listed in the reasoning docs section
    reasoning_details?: Array<{ type: string; text?: string }>;
  };
};

type StreamingChoice = {
  index: number;
  finish_reason: string | null;
  delta: {
    role?: string;
    content?: string | null;
    tool_calls?: ToolCall[];
    reasoning?: string;
    reasoning_details?: Array<{ type: string; text?: string }>;
  };
};

Lý do kết thúc

finish_reason dùng các giá trị chuẩn hóa của BazaarLink như stop, length, tool_calls, content_filter và error.

JSON
{
  "finish_reason": "stop"
}

Truy vấn chi phí và thống kê

Dùng BazaarLink request ID opaque từ id phản hồi hoặc header x-request-id với GET /v1/generation; phản hồi không stream cũng có ID đó trong x-generation-id. Số liệu có thể xuất hiện sau vài giây; thử lại 404 trong thời gian ngắn.

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

Đăng ký agent

Khi được bật, agent có thể tạo tài khoản qua cửa đăng ký chưa thanh toán hoặc thanh toán x402.

POSThttps://api.bazaarlink.ai/api/v1/agents/register

Đăng ký chưa thanh toán nhận name, description tùy chọn và referral_code tùy chọn. Phản hồi 201 gồm API key, credit, claim token và thời hạn bảy ngày, URL nâng cấp, mã giới thiệu, free_model auto:free, base URL và liên kết tài liệu. Cơ chế mô hình miễn phí hiện có được sử dụng; tìm kiếm web miễn phí cần email đã xác minh nên agent chưa thanh toán không dùng được.

POSThttps://api.bazaarlink.ai/api/v1/agents/register/x402

Đăng ký trả phí bắt đầu bằng yêu cầu HTTP 402: scheme exact, network eip155:196, asset USD-T0 và payTo. Gửi lại với header X-PAYMENT để nhận các trường đăng ký tương tự cùng payment { txHash, network, amountUsd }. Agent trả phí tuân theo quy tắc tài khoản trả phí thông thường; tài khoản hiện có có thể nạp tại /api/x402/topup.

Con người có thể tiếp quản agent chưa thanh toán tại /claim trong thời hạn token bảy ngày. Giới hạn đăng ký là một lần mỗi IP trong 24 giờ và giới hạn theo nhà cung cấp đám mây; yêu cầu bị từ chối trả về 429 kèm Retry-After.

POSThttps://api.bazaarlink.ai/api/x402/topup

Chat Completions

Endpoint chính. Tương thích với API Chat Completions của OpenAI.

POST/v1/chat/completions

Nội dung yêu cầu

modelbắt buộc
string
Dùng id hoặc alias được liệt kê tại GET /v1/models, ví dụ "claude-sonnet-4.6" hoặc "anthropic/claude-sonnet-4.6".
messagesbắt buộc
Message[]
Mảng đối tượng tin nhắn với role và content
stream
boolean
Nếu true, trả về luồng Server-Sent Events. Mặc định: false
temperature
number
Giá trị sampling được chuyển tiếp mà không kiểm tra phạm vi. Mô hình có thể giới hạn hoặc bỏ qua giá trị ngoài phạm vi hỗ trợ.
max_tokens
integer
Số token tối đa để tạo
max_completion_tokens
integer
Bí danh cho max_tokens (tương thích OpenAI o-series). Cả hai đều được chấp nhận
top_p
number
Xác suất lấy mẫu nucleus. Mặc định: 1
top_k
integer
Giá trị sampling được chuyển tiếp mà không kiểm tra phạm vi. Mô hình có thể giới hạn hoặc bỏ qua giá trị ngoài phạm vi hỗ trợ.
frequency_penalty
number
Phạt token lặp lại. Phạm vi: [-2, 2]. Mặc định: 0
presence_penalty
number
Phạt token dựa trên sự hiện diện. Phạm vi: [-2, 2]. Mặc định: 0
repetition_penalty
number
Giảm lặp lại token từ đầu vào. Phạm vi: (0, 2]. Mặc định: 1
min_p
number
Xác suất tối thiểu tương đối với token hàng đầu. Phạm vi: [0, 1]. Mặc định: 0
top_a
number
Top-P động dựa trên token có xác suất cao nhất. Phạm vi: [0, 1]. Mặc định: 0
seed
integer
Seed số nguyên cho lấy mẫu xác định. Không đảm bảo cho tất cả mô hình
n
integer
Số lượng hoàn thành để tạo. Mặc định: 1
user
string
Định danh người dùng cuối cho giám sát và phát hiện lạm dụng. Không ảnh hưởng thanh toán. Chỉ áp dụng cho mô hình họ OpenAI — xem ghi chú bên dưới.
stop
string | string[]
Chuỗi dừng — tạo văn bản dừng khi gặp
logit_bias
object
Ánh xạ ID token đến giá trị thiên lệch [-100, 100] được thêm trước lấy mẫu. Chỉ áp dụng cho mô hình họ OpenAI — xem ghi chú bên dưới.
logprobs
boolean
Trả về log xác suất của mỗi token đầu ra. Chỉ áp dụng cho mô hình họ OpenAI — xem ghi chú bên dưới.
top_logprobs
integer
Số token có khả năng nhất trả về cho mỗi vị trí (cần logprobs: true). Phạm vi: 0–20. Chỉ áp dụng cho mô hình họ OpenAI — xem ghi chú bên dưới.
tools
Tool[]
Danh sách công cụ (hàm) mô hình có thể gọi
tool_choice
string | object
Điều khiển sử dụng công cụ: "auto", "none", hoặc công cụ cụ thể
parallel_tool_calls
boolean
Bật gọi hàm song song khi cung cấp công cụ. Mặc định: true. Chỉ áp dụng cho mô hình họ OpenAI — xem ghi chú bên dưới.
response_format
object
Buộc đầu ra JSON có cấu trúc. Xem phần Đầu ra có cấu trúc
structured_outputs
boolean
Yêu cầu đầu ra tuân thủ nghiêm ngặt JSON schema trên các nhà cung cấp hỗ trợ. Chuyển tiếp nguyên trạng
reasoning
object
Cấu hình reasoning/thinking riêng của nhà cung cấp. Chuyển tiếp nguyên trạng
reasoning_effort
string
Mức độ reasoning kiểu OpenAI dòng o: "low", "medium", hoặc "high". Chuyển tiếp nguyên trạng
include_reasoning
boolean
true trả về nội dung suy nghĩ trong message.reasoning (delta.reasoning khi streaming); false tắt suy nghĩ cho các mô hình suy nghĩ theo mặc định (xem phần reasoning), nên không bị tính phí suy nghĩ. Khi không gửi reasoning_effort, reasoning hay thinking, chỉ các mô hình đó suy nghĩ và trả về theo mặc định; mô hình khác chỉ trả về khi được yêu cầu
user, logprobs, top_logprobs, logit_bias, và parallel_tool_calls chỉ đến được các mô hình họ OpenAI
Năm tham số này bị loại khỏi yêu cầu upstream bất cứ khi nào mô hình được xác định không phải của chính OpenAI — gửi chúng đến anthropic/claude-*, google/gemini-*, hoặc bất kỳ đích không phải OpenAI nào khác sẽ trả về 200 với tham số bị âm thầm bỏ qua, không phải lỗi. Nếu bạn đặt một trong các tham số này mà không thấy hiệu lực, hãy kiểm tra xem mô hình đích có phải của OpenAI hay không.

Schema yêu cầu (TypeScript)

// Definitions of subtypes are below
type Request = {
  // Required by BazaarLink Chat Completions
  model: string;                    // Use an id or alias from GET /v1/models
  messages: Message[];             // Must contain at least one message

  // Generation
  stream?: boolean;
  temperature?: number;
  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;
  presence_penalty?: number;
  repetition_penalty?: number;
  min_p?: number;
  top_a?: number;
  // Sampling values are forwarded without range validation; models may clamp or ignore them.

  // 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";
  include_reasoning?: boolean;
  reasoning?: ReasoningConfig;
  thinking?: ThinkingConfig;
  enable_thinking?: boolean;

};

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

Yêu cầu mẫu

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

Phản hồi

{
  "id": "85e6f35c71a31f19-SJC",
  "object": "chat.completion",
  "created": 1740000000,
  "model": "openai/gpt-4o",
  "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
    }
  }
}

Schema phản hồi (TypeScript)

BazaarLink trả về phản hồi chuẩn hóa và loại bỏ các trường riêng của upstream. usage.cost là số USD tính cho khách hàng cho yêu cầu này.

Với các yêu cầu dài hơn 100 giây, nên dùng stream:true. Với yêu cầu không stream, sau khoảng 12 giây (giá trị mặc định, có thể điều chỉnh qua cấu hình deployment), hệ thống sẽ trả về 200 trước và bắt đầu gửi khoảng trắng keepalive; nếu xảy ra lỗi sau đó, lỗi sẽ được trả về dưới dạng 200 + error JSON. Keepalive là khoảng trắng trước JSON body và parser JSON tiêu chuẩn sẽ bỏ qua phần này.

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

type NonStreamingChoice = {
  index: number;
  finish_reason: "stop" | "length" | "tool_calls" | "content_filter" | null;
  message: {
    role: "assistant";
    content: string | null;
    tool_calls?: ToolCall[];
    reasoning?: string;                                      // thinking text: when the request asked for it, or by default for the models listed in the reasoning docs section
    reasoning_details?: Array<{ type: string; text?: string }>;
  };
};

type StreamingChoice = {
  index: number;
  finish_reason: string | null;
  delta: {
    role?: string;
    content?: string | null;
    tool_calls?: ToolCall[];
    reasoning?: string;
    reasoning_details?: Array<{ type: string; text?: string }>;
  };
};

type ResponseUsage = {
  prompt_tokens: number;
  completion_tokens: number;
  total_tokens: number;
  cost: number;                      // USD amount charged to the customer for this request
  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 };
};

Tạo hình ảnh

Tạo hình ảnh từ prompt văn bản sử dụng các mô hình như DALL·E và GPT-4o. Chỉnh sửa hình ảnh (sửa đổi một hình ảnh có sẵn) dùng POST /v1/images/edits —— tương thích OpenAI images.edit, multipart/form-data với (các) hình ảnh nguồn của bạn. Các model hỗ trợ chỉnh sửa có modality là text+image->image (ví dụ qwen/qwen-image-3); model chỉ tạo mới là text->image —— kiểm tra modality của từng model trong GET /v1/models.

Response format

/v1/images/generations mặc định trả về JSON đồng bộ tương thích OpenAI (từ 2026-07-25) — client.images.generate() hoạt động không cần wrapper. Truyền stream: true để chuyển sang luồng sự kiện SSE, cung cấp tiến độ cho các model có thời gian tạo dài.

Các yêu cầu không streaming chạy lâu hơn 20 giây sẽ được trả lời trước bằng HTTP 200 (sau đó gửi khoảng trắng để giữ kết nối), nên lỗi xảy ra muộn hơn sẽ được trả về dưới dạng "200 kèm nội dung lỗi": hãy kiểm tra đối tượng `error` cấp cao nhất (chúng tôi cũng thêm `"object": "error"` và `"http_status"`). Nếu thời gian chờ đọc của client đủ dài (SDK OpenAI mặc định 10 phút), hãy gửi `X-BazaarLink-Sync-Wait: 90` (số giây nguyên, 1–90, mặc định 20) để nhận mã trạng thái thật cho các lỗi trong khoảng thời gian đó; với SDK Python dùng `default_headers={"X-BazaarLink-Sync-Wait": "90"}`, với SDK Node dùng `defaultHeaders: { "X-BazaarLink-Sync-Wait": "90" }`. Trên Windows, hãy gửi JSON từ tệp UTF-8 bằng `curl --data-binary @body.json`: văn bản gõ sau `-d` trong console không phải UTF-8 và sẽ bị từ chối ngay với 400 `invalid_utf8`.

A. /v1/chat/completions (native, khuyến nghị)

POST/v1/chat/completions

The canonical streaming path. Recommended for any new integration.

curl -N https://api.bazaarlink.ai/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: thêm phần image_url vào mảng content. Hỗ trợ data URI hoặc URL hình ảnh https (http:// bị từ chối), tối đa 8 hình, mỗi data URI khoảng 10MB. Tin nhắn mang hình ảnh cũng phải chứa phần text (chỉ dẫn chỉnh sửa). Một số mô hình còn hỗ trợ image_config (ví dụ {"strength": 0.7}, 0–1 — giá trị thấp hơn giữ gần với hình gốc hơn), được truyền nguyên vẹn lên upstream.

curl -N https://api.bazaarlink.ai/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
  }'

Chỉnh sửa hình ảnh (tương thích OpenAI)

POST/v1/images/edits

client.images.edit() của OpenAI SDK hoạt động trực tiếp (upload multipart, phản hồi JSON đồng bộ trả về data: [{ url }]). Giới hạn giống image-to-image: tối đa 8 hình, mỗi hình 10MB; mask và response_format=b64_json chưa được hỗ trợ.

curl https://api.bazaarlink.ai/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 (tương thích DALL·E)

POST/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://api.bazaarlink.ai/v1/images/generations \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-image-1",
    "prompt": "a red cat on a sofa",
    "size": "1024x1024"
  }'
modelbắt buộc
string
ID mô hình, ví dụ google/gemini-2.5-flash-image
promptbắt buộc
string
Prompt văn bản
size
string
Kích thước đầu ra (tự động ánh xạ)
n
integer
Số lượng hình (mặc định 1)
# Streaming variant — progressive delivery for long generations
curl -N https://api.bazaarlink.ai/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

Bỏ qua dòng chú thích SSE và sự kiện unknown hoặc ping; xử lý các sự kiện image, usage và done đã mô tả.

: keep-alive

event: image
data: {"index": 0, "url": "https://api.bazaarlink.ai/v1/images/proxy/<token>"}

event: image-cached     # bazaarlink Redis-backed proxy URL (1 hr TTL)
data: {"index": 0, "url": "https://api.bazaarlink.ai/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: {}

Mô hình hình ảnh được hỗ trợ

Model IDModalityi2i (edits)

Tạo video

Quy trình bất đồng bộ ba bước (submit → poll → content). Tạo video mất 30 giây–5 phút nên không phù hợp với ngữ nghĩa yêu cầu/phản hồi đồng bộ của chat-completions — vì vậy BazaarLink tách video sang endpoint riêng /v1/videos theo mẫu job-id: submit trả về ID vjob_* → poll trạng thái → hoàn tất thì fetch bytes. Gọi mô hình video qua /chat/completions hoặc /images/generations sẽ trả về 400 (code: wrong_endpoint_for_video). Chi phí được quyết toán theo usage.cost thực tế khi completed.

Các loại tác vụ video

Một endpoint bao gồm nhiều tác vụ. Tác vụ nào chạy phụ thuộc vào các trường bạn gửi —— một model duy nhất có thể làm image-to-video, keyframe và nối tiếp. Không phải model nào cũng hỗ trợ mọi tác vụ; yêu cầu không được hỗ trợ trả về 400.

Văn bản thành video
prompt
Tạo chỉ từ một prompt văn bản — không cần phương tiện đầu vào.
Ảnh thành video
frame_images: [ first frame ]
Ảnh của bạn CHÍNH LÀ hình ảnh: nó trở thành khung đầu tiên và được làm động, giữ trung thực với bản gốc. Ví dụ: ảnh một con mèo → chính con mèo đó quay đầu trong cùng bối cảnh.
Keyframe (đầu + cuối)
frame_images: [ first, last ]
Cung cấp một ảnh đầu và một ảnh cuối; mô hình nội suy chuyển động ở giữa.
Nối tiếp
input_video
Kéo dài một clip có sẵn. Thời lượng yêu cầu phải lớn hơn độ dài của video nguồn.
Tham chiếu thành video
input_references: [ images ]
Ảnh của bạn là THAM CHIẾU, không phải khung hình: mô hình giữ chủ thể/phong cách và tạo ra một bối cảnh hoàn toàn mới. Ví dụ: ảnh con mèo + "nhảy múa trong rừng" → một video mới trong đó diện mạo con mèo được giữ nguyên nhưng bối cảnh và chuyển động là mới (1–9 ảnh tham chiếu). Khác với ảnh thành video: i2v trung thực với đúng bức ảnh; r2v đưa chủ thể vào cảnh quay mới.
Chỉnh sửa video
input_video + prompt
Chỉnh sửa một video có sẵn — thay đổi bối cảnh, phong cách hoặc chuyển động. Tính phí theo giây video đầu vào + giây đầu ra.

1. Gửi tác vụ (trả về vjob_xxx ngay lập tức)

POST/v1/videos
modelbắt buộc
string
ID mô hình, ví dụ bytedance/seedance-2.0
promptbắt buộc
string
Prompt văn bản
duration
integer
Thời lượng tính bằng giây (tùy mô hình)
resolution
string
Độ phân giải — 480p / 720p / 1080p v.v.
generate_audio
boolean
Tạo âm thanh (true/false)
frame_images
array
Ảnh khung đầu/cuối (image-to-video, keyframe). Đối tượng { type: "image_url", image_url: { url }, frame_type: "first_frame" | "last_frame" } hoặc chuỗi URL thuần.
input_references
array
Ảnh tham chiếu cho reference-to-video —— định hướng chủ thể/phong cách, không phải khung chính xác.
input_video
string|object
URL video nguồn cho nối tiếp và chỉnh sửa video. Phải truy cập công khai được từ upstream.
aspect_ratio
string
Tỉ lệ khung hình, ví dụ 16:9 hoặc 9:16. Bị bỏ qua khi ảnh đầu vào quyết định tỉ lệ.
watermark
boolean
Thêm watermark. Mặc định false.
callback_url
string
URL webhook được gọi khi job đạt trạng thái cuối — chỉ HTTPS, có kiểm tra SSRF. Không có chữ ký trong v1; coi là gợi ý và xác nhận qua GET /videos/{id}.
curl https://api.bazaarlink.ai/v1/videos \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "bytedance/seedance-2.0",
    "prompt": "a bird flying over mountains",
    "duration": 3,
    "resolution": "720p",
    "generate_audio": false
  }'
# → 202 { "id": "vjob_xxx", "status": "pending" }
Note
Khi gửi, credit được giữ theo ước tính trường hợp xấu nhất. Khi job hoàn tất, usage.cost là số USD tính cho khách hàng cho yêu cầu đó.

2. Poll trạng thái

GET/v1/videos/{id}
curl -H "Authorization: Bearer $BL_API_KEY" \
  https://api.bazaarlink.ai/v1/videos/vjob_xxx
Note
Mỗi GET phải cách nhau ≥ 8 giây mới thực sự gọi lên upstream (tránh rate limit).
Note
Khi status=failed, toàn bộ số tiền tạm giữ được hoàn lại cho người dùng.

3. Lấy nội dung video (MP4)

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

Cần biết

  • Độ phân giải cho phép khác nhau theo từng model —— giá trị không được hỗ trợ trả về 400 kèm danh sách được hỗ trợ.
  • Ảnh/video đầu vào phải truy cập được từ URL công khai. Các host chống hotlink (ví dụ một số wiki) sẽ thất bại.
  • Media đầu vào đi qua kiểm duyệt nội dung của upstream và đôi khi có thể bị từ chối.
  • Với nối tiếp, thời lượng yêu cầu phải vượt quá độ dài video nguồn.
  • Tỉ lệ khung hình đầu ra theo ảnh đầu vào —— ảnh vuông cho video vuông.
  • Chỉnh sửa video được tính phí theo số giây của video đầu vào cộng số giây của đầu ra được tạo.
  • input_video (chỉnh sửa / nối tiếp) phải là URL CÔNG KHAI. Video bạn tạo ở đây được phục vụ sau API key của bạn, nên upstream không thể tải về —— hãy host video nguồn của bạn trên một URL truy cập công khai được.
  • Payload webhook không có chữ ký — xác nhận trạng thái/số tiền qua GET /videos/{id} trước khi hành động, và lưu ý unsigned_urls ở đó là tuyệt đối (khác với đường dẫn tương đối trong phản hồi poll).

Mô hình video được hỗ trợ

Model IDModalityTasks
minimax/hailuo-3-maxtext+image->videot2v, i2v
google/veo-3.1text+image->videot2v, i2v
bytedance/seedance-2.5text+image+audio+video->video—
x-ai/grok-imagine-video-1.5-litetext+image->videot2v, i2v
bytedance/seedance-2.0text+image+audio+video->videot2v, i2v
bytedance/seedance-1-5-protext+image->videot2v, i2v
bytedance/seedance-2.0-fasttext+image+audio+video->videot2v, i2v

Tổng hợp giọng nói

Chuyển văn bản thành âm thanh bằng mã mô hình từ /v1/models?output_modalities=speech. Tính phí theo giá mỗi triệu ký tự trên trang mô hình. Toàn bộ âm thanh được đệm xong rồi mới trả về dạng nhị phân; chưa hỗ trợ truyền theo từng đoạn. Các trường điều khiển định tuyến như provider, transforms, route, service_tier và preset sẽ bị bỏ qua.

POST/v1/audio/speech
curl https://api.bazaarlink.ai/v1/audio/speech \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{"model":"<speech-model-id>","input":"Hello","voice":"alloy","response_format":"mp3"}' \
  --output speech.mp3

# Voice settings (elevenlabs/* models; the X-Voice-Settings response header says applied or ignored)
curl -D - https://api.bazaarlink.ai/v1/audio/speech \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{"model":"elevenlabs/eleven-v4","input":"Hello","voice":"george","stability":0.4,"similarity_boost":0.8,"style":0.2,"use_speaker_boost":true,"language_code":"en","audio_effects":{"distance":0.3}}' \
  --output speech.mp3

Chép lời âm thanh

Gửi multipart/form-data model và file hoặc JSON model và input_audio:{data,format} (base64 thuần). Định dạng: wav, mp3, mp4, m4a, ogg, flac, webm, aac. Âm thanh tối đa 25 MiB; thân yêu cầu 50 MiB cho base64. audio.transcription_max_seconds_by_model đặt giới hạn theo mô hình; nếu thiếu, dùng audio.transcription_max_seconds rồi mặc định 60 giây. Âm thanh dài hơn bị từ chối trước khi xử lý với 413 audio_too_long và không bị tính phí. response_format chỉ json hoặc verbose_json; timestamp_granularities word/segment cần verbose_json. Không hỗ trợ stream (400 unsupported_parameter); quá lớn: 413 audio_too_large. Bỏ qua provider. Giá cơ sở dữ liệu theo usage.seconds hoặc token đầu vào/đầu ra; giá phút = 60 × giá giây. usage.cost là phí khách hàng bằng USD.

POST/v1/audio/transcriptions
curl https://api.bazaarlink.ai/v1/audio/transcriptions \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -F model="<transcription-model-id>" \
  -F file=@audio.wav \
  -F response_format=json

curl https://api.bazaarlink.ai/v1/audio/transcriptions \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{"model":"<transcription-model-id>","input_audio":{"data":"<raw-base64-audio>","format":"wav"},"response_format":"verbose_json","timestamp_granularities":["word","segment"]}'

Xếp hạng lại tài liệu

Gửi query và documents để nhận index và relevance_score đã xếp hạng. Đơn vị phí là search, theo giá trang mô hình nhân usage.search_units, không theo số tài liệu. Không hỗ trợ truyền trực tuyến (stream).

POST/v1/rerank
curl https://api.bazaarlink.ai/v1/rerank \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{"model":"your-rerank-model-id","query":"capital of France","documents":["Paris is the capital of France.","Berlin is in Germany."],"top_n":1}'
POST/v1/chat/completions

Dùng audio hoặc input_audio với /v1/chat/completions và mô hình âm thanh. Giá token đầu vào/đầu ra đã cấu hình áp dụng đồng nhất cho tổng token văn bản và âm thanh được báo cáo.

curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{"model":"<audio-chat-model-id>","messages":[{"role":"user","content":"Say hi."}],"stream":true,"modalities":["text","audio"],"audio":{"voice":"alloy","format":"pcm16"},"max_tokens":32}'

Hướng dẫn tạo giọng nói (TTS)

POST /v1/audio/speech tương thích OpenAI-compatible: gửi JSON và nhận tệp âm thanh dạng nhị phân. Dòng ElevenLabs gồm elevenlabs/eleven-v4, eleven-v4-turbo, eleven-v3, eleven-v3-conversational, eleven-multilingual-v2, eleven-flash-v2.5, eleven-flash-v2, eleven-turbo-v2.5, eleven-turbo-v2. Danh sách mới nhất tại GET /v1/models?output_modalities=speech. GET /v1/models mặc định chỉ trả về mô hình văn bản, hãy thêm ?output_modalities=speech (hoặc all) để liệt kê.

POST/v1/audio/speech

Tham số

Tham sốKiểuBắt buộcMô tả
modelstringCóID mô hình giọng nói, ví dụ elevenlabs/eleven-flash-v2.5.
inputstringCóVăn bản cần tổng hợp: tối đa 4.096 ký tự mỗi yêu cầu (10.000 với elevenlabs/eleven-v4 và eleven-v4-turbo). Hãy chia văn bản dài thành nhiều yêu cầu.
voicestringCóGiọng nói cần dùng; định dạng tùy theo mô hình. Xem quy tắc giọng nói bên dưới.
response_formatstringKhôngmp3 (mặc định) hoặc pcm. API chấp nhận opus, aac, flac và wav nhưng mô hình ElevenLabs hiện từ chối chúng bằng 400.
speednumberKhôngTốc độ nói từ 0.25 đến 4.0. Không phải mô hình nào cũng áp dụng.
instructionsstringKhôngChỉ dẫn phong cách giọng nói. Không phải mô hình nào cũng áp dụng.
stabilitynumberKhôngĐộ ổn định của giọng, 0–1 (mặc định 0,5). Thấp hơn giàu cảm xúc hơn, cao hơn đều hơn. Có hiệu lực với mô hình elevenlabs/* khi yêu cầu được phục vụ qua tuyến giọng nói trực tiếp của chúng tôi; header phản hồi X-Voice-Settings cho biết applied hoặc ignored.
similarity_boostnumberKhôngĐộ giống giọng gốc, 0–1 (mặc định 0,75). Eleven v3 không dùng.
stylenumberKhôngMức nhấn phong cách, 0–1 (mặc định 0). Lớn hơn 0 làm tăng độ trễ. Eleven v4 không dùng.
use_speaker_boostbooleanKhôngTăng độ giống người nói gốc (mặc định true); tăng nhẹ độ trễ.
clone_strengthnumberKhôngCường độ nhân bản, 0–1 (khuyến nghị 0 cho hầu hết giọng). Chỉ dùng cho giọng nhân bản chuyên nghiệp của riêng bạn (voice_…) được huấn luyện cho Eleven v4.
language_codestringKhôngMã ngôn ngữ hai chữ cái viết thường (ISO 639-1) như ar, ja, en để cố định ngôn ngữ đọc. Mô hình multilingual-v2 không dùng.
audio_effectsobjectKhôngĐối tượng hiệu ứng âm thanh tùy chọn: filter_preset_id (bộ lọc, ví dụ phone, old_radio), environment_id (không gian vang, ví dụ small_room, hall), background_noise_id (âm nền, ví dụ cafe), distance (0–1), send_level (lượng vang, 0–1) và pan (−1…1). ID gồm chữ thường, chữ số và dấu gạch dưới; không tính thêm phí. Vang hoặc pan khác 0 tạo âm thanh stereo và không dùng được với đầu ra pcm.

Bảy thiết lập giọng nói ở trên đều là tùy chọn; không gửi thì không có gì thay đổi. Giá trị ngoài phạm vi trả về 400 và không được gửi cũng không bị tính phí. Header phản hồi X-Voice-Settings cho biết thiết lập của bạn có được dùng không: applied = đã dùng; ignored = một tuyến dự phòng đã phản hồi nên thiết lập không được dùng (âm thanh vẫn được tạo); không có header = bạn không gửi thiết lập giọng nói nào. Ví dụ: stability 0 đọc giàu biểu cảm hơn, stability 1 đều hơn.

Quy tắc giọng nói

Mô hình ElevenLabs (elevenlabs/…) nhận một trong các tên giọng sau (không phân biệt hoa thường): george, sarah, adam, alice, bella, bill, brian, callum, charlie, chris, daniel, eric, harry, jessica, laura, liam, lily, matilda, river, roger, will. Với mô hình ElevenLabs có thể bỏ voice (mặc định george). Giá trị khác trả 400 invalid_voice. Giọng nói tùy chỉnh của bạn (voice_…) được mô tả ở mục Giọng nói tùy chỉnh bên dưới.

Tên giọng OpenAI-style như alloy, echo hoặc nova chỉ dùng được với mô hình có liệt kê chúng. Xem trang mô hình để biết các giọng được hỗ trợ.

Giọng nói tùy chỉnh (nhân bản) đang được mở theo từng giai đoạn: xem mục Giọng nói tùy chỉnh bên dưới (POST /v1/voices). Cho đến khi được bật cho tài khoản của bạn, hãy dùng một trong 21 tên có sẵn ở trên hoặc một voice ID công khai.

Gửi alloy cho mô hình ElevenLabs sẽ thất bại
Nếu mô hình ElevenLabs nhận một giọng không phải voice ID cũng không thuộc các tên được hỗ trợ (ví dụ alloy hoặc Rachel), nó trả về 400 invalid_voice và thông báo liệt kê các tên được chấp nhận. Yêu cầu thất bại không bị tính phí.

Danh sách giọng có sẵn

Đặt voice thành một trong các tên bên dưới (chữ thường). Mỗi giọng có một đoạn nghe thử riêng của chúng tôi, và GET /api/v1/audio/voices trả về danh sách đầy đủ (giới tính, nhóm tuổi, giọng vùng, phong cách và URL nghe thử).

?lang= (en, zh-TW, zh-CN; mặc định theo Accept-Language) chỉ chọn ngôn ngữ của description. URL nghe thử không đổi theo tham số này: preview_urls.en (giống preview_url) là đoạn tiếng Anh, preview_urls.zh (giống preview_url_zh) là đoạn tiếng Trung.

GiọngMô tảNghe thử
georgeMale, middle-aged, British accent. Mature and steady, suited to narration and storytelling.
sarahFemale, young adult, American accent. Professional and clear, suited to broadcast-style reading.
adamMale, middle-aged, American accent. Everyday and approachable, suited to short social videos.
aliceFemale, middle-aged, British accent. Professional and informative, suited to explainers and teaching.
bellaFemale, middle-aged, American accent. Professional and informative, suited to explainers and teaching.
billMale, senior, American accent. Crisp and direct, suited to advertising voice-overs.
brianMale, middle-aged, American accent. Polished and refined, suited to social and brand content.
callumMale, middle-aged, American accent. Expressive, suited to characters and animation.
charlieMale, young adult, Australian accent. Energetic and lively, suited to conversation.
chrisMale, middle-aged, American accent. Relaxed and casual, suited to conversation.
danielMale, middle-aged, British accent. Formal and measured, suited to news-style and educational reading.
ericMale, middle-aged, American accent. Polished and warm, suited to conversation.
harryMale, young adult, American accent. Rough and gritty, suited to character voices.
jessicaFemale, young adult, American accent. Bright and cute, suited to conversation.
lauraFemale, young adult, American accent. Playful with attitude, suited to social content.
liamMale, young adult, American accent. Confident and upbeat, suited to social content.
lilyFemale, middle-aged, British accent. Confident and clear, suited to explainers and teaching.
matildaFemale, middle-aged, American accent. Upbeat and friendly, suited to explainers and teaching.
riverNeutral voice, middle-aged, American accent. Calm and even, suited to conversation.
rogerMale, middle-aged, American accent. Polished and confident, suited to conversation.
willMale, young adult, American accent. Laid-back and easygoing, suited to conversation.

Thẻ cảm xúc và hành động (audio tags)

Viết thẻ trong dấu ngoặc vuông ngay trong input, ví dụ [laughs], [whispers], [excited], [sighs], [crying], [curious] hoặc [softly]. Thẻ được gửi tới mô hình đúng như đã gõ và quyết định cách thể hiện những từ phía sau. Hãy giữ thẻ bằng tiếng Anh dù nội dung dùng ngôn ngữ khác.

curl https://api.bazaarlink.ai/v1/audio/speech \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"elevenlabs/eleven-v3","input":"[laughs] That was actually funny. [whispers] Do not tell anyone.","voice":"george","response_format":"mp3"}' \
  --output audio-tags.mp3

Được hỗ trợ bởi elevenlabs/eleven-v3 và họ elevenlabs/eleven-v4. Các mô hình giọng nói khác không hiểu thẻ và có thể đọc to nội dung trong ngoặc, nên hãy thử một câu ngắn trước.

Thẻ được tính vào số ký tự của input và tính phí như phần văn bản còn lại.

Định dạng đầu ra

Nếu bỏ response_format, mặc định là mp3 (Content-Type audio/mpeg); pcm (audio/pcm, PCM 16-bit thô) cũng dùng được. API nhận opus, aac, flac và wav nhưng mô hình ElevenLabs hiện từ chối bằng 400. Hãy lưu tệp theo header Content-Type của phản hồi.

Tính phí

Tạo giọng nói được tính theo số ký tự đầu vào. Giá mỗi ký tự nằm trên trang mô hình ở /models và trong GET /v1/models dưới pricing.character. Trang mô hình hiển thị giá cho một triệu ký tự.

Ví dụ

curl https://api.bazaarlink.ai/v1/audio/speech \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"elevenlabs/eleven-flash-v2.5","input":"Hello from BazaarLink.","voice":"george","response_format":"mp3"}' \
  --output speech.mp3

Lỗi thường gặp

Trạng tháiNguyên nhân và cách xử lý
400Yêu cầu không hợp lệ: thiếu model, input hoặc voice; input vượt 4.096 ký tự; speed ngoài 0.25–4.0; response_format không hỗ trợ; Unknown voice; unknown_model (kiểm tra ID tại /models).
401Thiếu hoặc sai khóa API. Gửi Authorization: Bearer cùng khóa BazaarLink.
402Không đủ số dư. Nạp thêm rồi thử lại.
403Khóa quản trị không thể gọi mô hình, hoặc tài khoản bị tạm ngưng. Hãy dùng khóa API thông thường.
429Đã đạt giới hạn tốc độ. Đợi theo Retry-After rồi thử lại.
502Dịch vụ mô hình tạm thời không khả dụng hoặc truyền âm thanh bị gián đoạn. Hãy thử lại; yêu cầu thất bại không bị tính phí.

Tài liệu tham số đầy đủ: Tổng hợp giọng nói

Hướng dẫn chuyển giọng nói thành văn bản

POST /v1/audio/transcriptions tương thích OpenAI-compatible: tải âm thanh lên bằng multipart/form-data hoặc gửi input_audio dạng base64 qua JSON để nhận văn bản. Các mô hình gồm elevenlabs/scribe-v2 và elevenlabs/scribe-v2-medical. Danh sách mới nhất tại GET /v1/models?output_modalities=transcription. GET /v1/models mặc định chỉ trả về mô hình văn bản, hãy thêm ?output_modalities=transcription (hoặc all) để liệt kê.

POST/v1/audio/transcriptions

Tham số

Tham sốKiểuBắt buộcMô tả
modelstringCóID mô hình chuyển lời nói, ví dụ elevenlabs/scribe-v2.
filefileCóTệp âm thanh (multipart). Hỗ trợ wav, mp3, mp4, m4a, ogg, flac, webm, aac, tối đa 25 MiB. Khách JSON có thể gửi input_audio: {data: base64, format} thay thế.
response_formatstringKhôngjson (mặc định) trả về {text}; verbose_json thêm ngôn ngữ, thời lượng và segments/words.
languagestringKhôngGợi ý ngôn ngữ tùy chọn như en hoặc zh. Để trống để tự nhận diện.
promptstringKhôngVăn bản ngữ cảnh tùy chọn giúp nhận diện tên và thuật ngữ. Không phải mô hình nào cũng áp dụng.
timestamp_granularities[]string[]Khôngword và/hoặc segment. Chỉ áp dụng với response_format=verbose_json; định dạng khác sẽ bỏ qua. Hiện chưa trả về mốc thời gian theo từng từ; segments thì có.

Định dạng đầu ra

response_format chỉ nhận json hoặc verbose_json (không hỗ trợ text, srt, vtt). Không hỗ trợ stream. Giới hạn thời lượng theo mô hình, mặc định 60 giây; âm thanh dài hơn bị từ chối trước khi xử lý với 413 audio_too_long và không bị tính phí. Hãy chia bản ghi dài thành đoạn.

Tính phí

Chuyển lời nói được tính theo số giây âm thanh. Giá mỗi giây nằm trên trang mô hình ở /models và trong GET /v1/models dưới pricing.second; giá mỗi phút bằng 60 lần giá mỗi giây. Phản hồi usage ghi số giây tính phí và usage.cost ghi số tiền đã tính.

Ví dụ

curl https://api.bazaarlink.ai/v1/audio/transcriptions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -F model="elevenlabs/scribe-v2" \
  -F file=@audio.mp3 \
  -F response_format=verbose_json \
  -F "timestamp_granularities[]=word"

Lỗi thường gặp

Trạng tháiNguyên nhân và cách xử lý
400Yêu cầu không hợp lệ: thiếu model hoặc file, âm thanh rỗng, response_format khác json/verbose_json, stream=true (unsupported_parameter), hoặc timestamp_granularities khác word/segment.
401Thiếu hoặc sai khóa API.
402Không đủ số dư. Nạp thêm rồi thử lại.
413audio_too_large: âm thanh giải mã vượt 25 MiB. audio_too_long: âm thanh vượt giới hạn theo mô hình (mặc định 60 giây) bị từ chối trước khi xử lý và không bị tính phí. Hãy nén hoặc chia nhỏ.
429Đã đạt giới hạn tốc độ. Đợi theo Retry-After rồi thử lại.
502Dịch vụ mô hình tạm thời không khả dụng hoặc truyền âm thanh bị gián đoạn. Hãy thử lại; yêu cầu thất bại không bị tính phí.

Tài liệu tham số đầy đủ: Chép lời âm thanh

Giọng nói tùy chỉnh (nhân bản giọng nói)

Giọng nói tùy chỉnh (nhân bản giọng nói)
Chỉ mở theo đăng ký. Giọng nói tùy chỉnh được mở từng tài khoản: hãy liên hệ bộ phận hỗ trợ khách hàng để đăng ký. Cho đến khi tài khoản của bạn được bật, mọi yêu cầu /v1/voices đều trả 403 voice_cloning_not_enabled (và 404 not_found khi tính năng đang tắt với mọi người). Các giới hạn và giá trên trang này là giá trị mặc định và có thể thay đổi.

Tải lên một đoạn ghi âm ngắn của giọng nói mà bạn được phép sử dụng và nhận về voice id của chúng tôi (voice_…). Truyền id đó làm voice của POST /v1/audio/speech. Một giọng nói chỉ do người tạo ra nó sử dụng.

Endpoint

POST/v1/voices

Tạo giọng nói (multipart/form-data)

GET/v1/voices

Liệt kê giọng nói của bạn (limit 1–100, after = voice id cho trang sau)

GET/v1/voices/{id}

Lấy một giọng nói của bạn

DELETE/v1/voices/{id}

Xóa giọng nói (có hiệu lực ngay)

POST/v1/voices/report

Báo cáo giọng nói (không cần API key)

Tạo giọng nói: các trường

TrườngKiểuBắt buộcMô tả
namestringCóTên giọng nói, 1–60 ký tự.
filesfile[]Có1 đến 5 tệp ghi âm của giọng nói đó (mp3, wav, m4a, ogg, flac, webm).
consentbooleanCóPhải là true: bạn xác nhận có quyền nhân bản và sử dụng giọng nói này (xem Đồng ý).
consent_statement_versionstringCóPhiên bản tuyên bố đồng ý bạn đã xác nhận. Hiện là "v1".
descriptionstringKhôngTùy chọn, tối đa 200 ký tự.
remove_background_noisebooleanKhôngBoolean tùy chọn, mặc định false. Loại bỏ tiếng ồn nền của mẫu trước khi nhân bản.

Yêu cầu là đồng bộ: nhận 201 nghĩa là giọng nói đã sẵn sàng. Gửi header Idempotency-Key (chuỗi duy nhất bất kỳ) và dùng lại khi thử lại, để việc thử lại không bao giờ tạo hoặc tính phí giọng nói thứ hai.

Phản hồi

201 gồm id (voice_…), object ("voice"), name, description, status ("ready"), created_at (giây Unix) và usage.cost_usd (phí tạo đã tính). Mọi thông tin khác về cách giọng nói được tạo ra không rời khỏi hệ thống của chúng tôi.

GET /v1/voices chỉ trả về giọng nói của chính bạn: { "object": "list", "data": [ … ], "has_more": false }. Voice id của người khác trả 404 voice_not_found, giống hệt một id không tồn tại.

GET /v1/voices/{id} trả về một giọng nói (các trường như trên, không có usage).

DELETE /v1/voices/{id} trả về { "id": "voice_…", "object": "voice", "deleted": true } và có hiệu lực ngay: các yêu cầu speech dùng giọng nói đó sẽ thất bại ngay lập tức. Xóa là miễn phí; phí tạo không được hoàn lại.

Giới hạn (mặc định)

  • Tối đa 3 giọng nói mỗi người.
  • 1 đến 5 tệp âm thanh mỗi giọng nói, mỗi tệp tối đa 10 MB và tổng 25 MB; định dạng: mp3, wav, m4a, ogg, flac, webm. Tổng khoảng 30 giây đến 5 phút giọng nói sạch cho kết quả tốt nhất.
  • Tối đa 3 lần tạo mỗi ngày (ngày UTC).
  • Tài khoản của bạn cần email đã xác minh và số dư tối thiểu US$5.
  • Tên và mô tả bắt chước nhân vật nổi tiếng, hoặc nghe như giọng chính thức hay của nhân viên, sẽ bị từ chối (invalid_voice_name).
  • Bản ghi âm chỉ dùng để tạo giọng nói và chúng tôi không lưu trữ. Chúng tôi chỉ giữ tên giọng nói, chủ sở hữu, bản ghi đồng ý và dấu thời gian.

Giá

Tạo giọng nói mất một khoản phí một lần (mặc định US$1.00); số tiền thực tính được trả về trong usage.cost_usd, và bạn chỉ bị tính phí khi giọng nói được tạo thành công. Dùng giọng nói tùy chỉnh trong speech có giá mỗi ký tự bằng các giọng khác của mô hình đó. Xóa là miễn phí.

Đồng ý

Mỗi lần tạo phải gửi consent=true và consent_statement_version="v1". Nếu tuyên bố được cập nhật, việc tạo trả 400 consent_version_mismatch và bạn xác nhận lại bằng phiên bản mới.

Bản nháp tuyên bố bạn xác nhận (nội dung cuối cùng đang được xem xét và có thể thay đổi):

I confirm that I own the voice in these recordings or have the written permission of the person whose voice it is, that this person is an adult and has agreed to have their voice cloned and synthesized, and that I will not use the voice to impersonate a real person, to deceive, to harass, or for political persuasion, fraud or any unlawful purpose. I understand the voice can be removed and my account suspended if I break these rules.

Dùng giọng nói tùy chỉnh

Truyền voice id làm voice của POST /v1/audio/speech (voice=voice_…) cùng một mô hình giọng nói thuộc họ elevenlabs/*. Giới hạn đầu vào, định dạng và giá mỗi ký tự là của mô hình. Voice id không tồn tại, đã bị xóa hoặc chặn, hoặc thuộc về người khác trả 400 invalid_voice, và giọng nói tùy chỉnh không dùng được với mô hình khác.

Ví dụ

curl https://api.bazaarlink.ai/v1/voices \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -F name="My narrator" \
  -F description="Warm and calm" \
  -F consent=true \
  -F consent_statement_version=v1 \
  -F files=@sample-1.mp3 \
  -F files=@sample-2.wav

curl "https://api.bazaarlink.ai/v1/voices?limit=20" \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY"

curl -X DELETE https://api.bazaarlink.ai/v1/voices/voice_0123456789abcdef01234567 \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY"

curl https://api.bazaarlink.ai/v1/audio/speech \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"elevenlabs/eleven-flash-v2.5","input":"Hello, this is my own voice.","voice":"voice_0123456789abcdef01234567","response_format":"mp3"}' \
  --output my-voice.mp3

Báo cáo giọng nói

Nếu một giọng nói bắt chước bạn hoặc người khác mà không được phép, hãy báo cáo: POST /v1/voices/report (không cần API key) với JSON gồm voice_id (voice_…) hoặc sample_url, reason (impersonation, fraud, harassment, minor, political hoặc other), và tùy chọn details và contact (địa chỉ email). Luôn trả 202. Chúng tôi xem xét báo cáo và gỡ các giọng nói vi phạm quy tắc; tài khoản có thể bị đình chỉ.

curl https://api.bazaarlink.ai/v1/voices/report \
  -H "Content-Type: application/json" \
  -d '{"voice_id":"voice_0123456789abcdef01234567","reason":"impersonation","details":"...","contact":"me@example.com"}'

Sử dụng có trách nhiệm

Không nhân bản giọng nói của nhân vật công chúng, người nổi tiếng, chính trị gia hay bất kỳ ai chưa đồng ý. Không dùng giọng nói nhân bản để khiến người khác tin rằng họ đang nói chuyện với người thật, để lừa dối, quấy rối, thuyết phục chính trị hay gian lận.

Lỗi

Trạng tháiMãÝ nghĩa
400bad_requestYêu cầu sai định dạng: không phải multipart/form-data, không có tệp âm thanh, description quá dài, hoặc limit ngoài 1–100.
400consent_requiredThiếu consent=true.
400consent_version_mismatchPhiên bản tuyên bố đồng ý đã cũ; hãy xác nhận lại bằng phiên bản hiện tại.
400invalid_voice_nameTên trống, dài hơn 60 ký tự hoặc không được phép.
400too_many_filesHơn 5 tệp âm thanh.
401invalid_api_keyThiếu hoặc sai API key.
402insufficient_balanceSố dư quá thấp (phí tạo hoặc số dư tối thiểu).
403email_unverifiedHãy xác minh email của bạn trước.
403voice_cloning_not_enabledTài khoản của bạn chưa được bật giọng nói tùy chỉnh; hãy liên hệ bộ phận hỗ trợ khách hàng để đăng ký.
403voice_cloning_disabledHiện dịch vụ này chưa bật giọng nói tùy chỉnh.
404voice_not_foundKhông có giọng nói này (hoặc không phải của bạn).
404not_foundKhông tìm thấy, bao gồm mọi yêu cầu /v1/voices khi tính năng chưa được bật cho tài khoản của bạn.
405method_not_allowedPhương thức đó không có trên đường dẫn này.
409duplicate_requestIdempotency-Key giống vậy vẫn đang được xử lý; hãy đợi rồi thử lại.
413file_too_largeMột tệp vượt quá 10 MB hoặc tổng các tệp vượt quá 25 MB.
415unsupported_file_typeLoại âm thanh không được hỗ trợ; hãy dùng mp3, wav, m4a, ogg, flac, webm.
422voice_rejectedBước kiểm tra của nhà cung cấp giọng nói không chấp nhận mẫu này (ví dụ giọng nổi tiếng hoặc có sẵn, hay giọng tổng hợp AI đã biết). Giọng nói không được giữ lại và bạn không bị tính phí. Hãy dùng bản ghi âm rõ ràng giọng của chính bạn, hoặc giọng bạn có quyền sử dụng.
429voice_create_rate_limitedĐã đạt giới hạn tạo mỗi ngày; hãy thử lại vào ngày mai (UTC).
429voice_limit_reachedBạn đã đạt số lượng giọng nói tùy chỉnh tối đa.
502upstream_failedKhông thể tạo giọng nói; bạn không bị tính phí. Hãy thử lại với Idempotency-Key mới.
503voice_capacity_fullSức chứa giọng nói tùy chỉnh tạm thời đã đầy; bạn không bị tính phí. Hãy thử lại sau.
504upstream_timeoutDịch vụ giọng nói không phản hồi kịp; bạn không bị tính phí. Hãy thử lại với cùng Idempotency-Key.

API dữ liệu

Sắp ra mắt — Dữ liệu mạng xã hội và thương mại công khai qua ba endpoint của BazaarLink. Dịch vụ này mặc định tắt. Yêu cầu sẽ trả về service_paused cho đến khi được bật.

Gửi yêu cầu dữ liệu mạng xã hội

POST/v1/data/social

Tham số yêu cầu

MãKiểuBắt buộcÝ nghĩa
platformstringCóID nền tảng từ danh mục, chẳng hạn twitter hoặc instagram.
actionstringCóAction được nền tảng đó hỗ trợ; xem danh mục để biết các cặp khả dụng.
paramsobjectKhôngDữ liệu đầu vào riêng cho action. Dùng required_params và optional_params trong danh mục.
modesync | asyncKhôngTùy chọn. async trả về job để thăm dò; action chỉ bất đồng bộ vẫn trả về job khi được bỏ qua.

Định dạng phản hồi

HTTP 200 · data.social · id · object · platform · action · count · results · usage.cost

{
  "id": "req_example",
  "object": "data.social",
  "platform": "twitter",
  "action": "search",
  "count": 1,
  "results": [
    {
      "id": "post_example",
      "url": "https://x.com/someone/status/post_example",
      "text": "Example post",
      "like_count": 120,
      "reply_count": 8,
      "retweet_count": 14,
      "view_count": 5400,
      "posted_at": "2026-10-07T00:48:38+00:00",
      "author_username": "someone",
      "author_name": "Someone",
      "platform": "twitter"
    }
  ],
  "usage": {
    "cost": 0.0048
  }
}

Job bất đồng bộ

Action chỉ bất đồng bộ hoặc mode async trả về HTTP 202 cùng một job id không minh bạch. Thăm dò GET /v1/data/jobs/{id}: HTTP 202 nghĩa là đang chờ và HTTP 200 trả về phản hồi data.social đã hoàn tất. Job hết hạn sau 15 phút (HTTP 410 job_expired). Job không tồn tại hoặc thuộc tài khoản khác trả về HTTP 404 not_found. Job hoàn tất chỉ bị tính phí một lần ở lần lấy thành công đầu tiên.

{
  "platform": "instagram",
  "action": "discover",
  "params": {
    "keyword": "coffee"
  },
  "mode": "async"
}

HTTP 202

{
  "id": "job_example",
  "object": "data.job",
  "status": "pending",
  "platform": "instagram",
  "action": "discover"
}

Thăm dò job bất đồng bộ

GET/v1/data/jobs/{id}

HTTP 202 pending → HTTP 200 data.social · HTTP 410 job_expired · HTTP 404 not_found

{
  "id": "job_example",
  "object": "data.social",
  "platform": "instagram",
  "action": "discover",
  "count": 1,
  "results": [
    {
      "id": "post_example",
      "url": "https://www.instagram.com/p/example/",
      "text": "Example result",
      "platform": "instagram"
    }
  ],
  "usage": {
    "cost": 0.0096
  }
}

Liệt kê action và giá khả dụng

GET/v1/data/catalog

object · product · platforms · actions · required_params · optional_params · max_limit · async · price_usd

{
  "object": "data.catalog",
  "product": "BazaarLink Data API",
  "platforms": [
    {
      "platform": "twitter",
      "actions": [
        {
          "action": "search",
          "label": "Keyword search",
          "required_params": [
            "keyword"
          ],
          "optional_params": [
            "sort"
          ],
          "max_limit": 200,
          "async": false,
          "price_usd": 0.0048
        }
      ]
    },
    {
      "platform": "instagram",
      "actions": [
        {
          "action": "discover",
          "label": "Discover",
          "required_params": [
            "keyword"
          ],
          "optional_params": [],
          "max_limit": null,
          "async": true,
          "price_usd": 0.0096
        }
      ]
    }
  ]
}

Thanh toán

Giá được chia theo bậc dựa trên nền tảng và action. GET /v1/data/catalog hiển thị giá khách hàng cho từng action được bật. Lệnh gọi thành công bị tính phí một lần; lệnh gọi thất bại và không có kết quả đều miễn phí. Data API và tìm kiếm web dùng chung hạn mức miễn phí hằng ngày.

Mã lỗi

{"error":{"code":"<code>","message":"<fixed message>"}}

MãHTTPÝ nghĩa
unauthorized401Thiếu API key hoặc API key không hợp lệ.
forbidden403Yêu cầu không được phép.
invalid_request400Nội dung yêu cầu không hợp lệ.
invalid_params400Tham số action bị từ chối.
unsupported_capability400Nền tảng hoặc action không khả dụng.
insufficient_credits402Không đủ credit.
budget_cap_reached402 or policy statusĐã đạt giới hạn chi tiêu của tài khoản.
body_too_large413Nội dung yêu cầu vượt giới hạn kích thước.
free_quota_exhausted432Đã dùng hết hạn mức miễn phí hằng ngày.
rate_limited429Đã đạt giới hạn tốc độ; hãy tuân theo Retry-After.
data_unavailable503Dịch vụ dữ liệu tạm thời không khả dụng.
timeout504Yêu cầu đã hết thời gian chờ.
bad_upstream_response502Dịch vụ dữ liệu trả về phản hồi không hợp lệ.
job_expired410Job hết hạn sau 15 phút.
not_found404Job không tồn tại hoặc thuộc tài khoản khác.
job_failed503Job bất đồng bộ thất bại.
service_paused503Dịch vụ chưa được bật hoặc đang tạm dừng.

Ví dụ

curl

curl https://api.bazaarlink.ai/v1/data/social \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"platform":"twitter","action":"search","params":{"keyword":"BazaarLink","limit":5}}'

Python (requests)

import os
import requests

response = requests.post(
    "https://api.bazaarlink.ai/v1/data/social",
    headers={"Authorization": f"Bearer {os.environ['BAZAARLINK_API_KEY']}"},
    json={"platform": "twitter", "action": "search", "params": {"keyword": "BazaarLink", "limit": 5}},
    timeout=30,
)
response.raise_for_status()
print(response.json())

JavaScript (fetch)

const response = await fetch("https://api.bazaarlink.ai/v1/data/social", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BAZAARLINK_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ platform: "twitter", action: "search", params: { keyword: "BazaarLink", limit: 5 } }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());

Submit a decisions request

Evaluate a state against named questions with a decisions-output model. This alpha endpoint returns non-streaming JSON. Find available model ids with GET /v1/models?output_modalities=decisions; use this endpoint for Clef instead of chat/completions. Input tokens are billed at the selected model's customer price. Sufficient credits are required. Set BAZAARLINK_API_KEY to your API key; the sample builds its complete Authorization header in BAZAARLINK_AUTH_HEADER.

View the decisions API reference

export BAZAARLINK_AUTH_HEADER="Authorization: $(printf '%s %s' 'Bearer' "$BAZAARLINK_API_KEY")"

curl https://api.bazaarlink.ai/v1/alpha/decisions \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "cloudflare/clef-flash",
    "state": "The support agent issued a full refund.",
    "questions": {
      "refunded": {
        "type": "noul",
        "instructions": "Was a refund issued?"
      }
    }
  }'

Đầu vào video

Gửi tệp video đến các mô hình hỗ trợ đầu vào video để phân tích, tạo chú thích, hoặc trả lời câu hỏi về cảnh và sự kiện. Dùng được URL trực tiếp hoặc base64 data URI — URL hiệu quả hơn cho video công khai; base64 dành cho tệp cục bộ hoặc video riêng tư.

Định dạng được hỗ trợ

MP4 (H.264)MPEGMOVWebM
response = client.chat.completions.create(
    model="google/gemini-3.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?"},
        ],
    }],
)

Tài liệu tham khảo API đầy đủ →

Đầu vào PDF

Gửi tài liệu PDF trực tiếp trong tin nhắn đến các mô hình hỗ trợ đầu vào PDF gốc (ví dụ: Claude, Gemini). BazaarLink chuyển tệp thẳng đến mô hình — tính phí như input token thông thường, không phụ phí hay bước xử lý thêm.

Định dạng được hỗ trợ

  • Tài liệu PDF (văn bản, hình ảnh, bảng, quét)
  • URL dữ liệu base64
  • Tài liệu nhiều trang
  • Chỉ PDF không có mật khẩu
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 tương thích OpenAI Responses API cho hội thoại đa lượt không trạng thái, gọi công cụ và đầu vào đa phương thức. Lý tưởng cho agent và framework sử dụng OpenAI Python SDK ≥ 1.x với client.responses.create().

POST/v1/responses
Note
Chấp nhận cùng xác thực và định tuyến mô hình như Chat Completions.

Nội dung yêu cầu

modelbắt buộc
string
Dùng id hoặc alias được liệt kê tại GET /v1/models, ví dụ "claude-sonnet-4.6" hoặc "anthropic/claude-sonnet-4.6".
inputbắt buộc
string | Item[]
Đầu vào người dùng — chuỗi văn bản (tin nhắn đơn) hoặc mảng mục đầu vào cho hội thoại đa lượt / đa phương thức.
instructions
string
Hướng dẫn cấp hệ thống, tương đương tin nhắn system. Phải gửi lại mỗi yêu cầu.
stream
boolean
Nếu true, trả về sự kiện SSE Responses API. Loại sự kiện: response.created, response.output_text.delta, response.completed.
max_output_tokens
integer
Số token đầu ra tối đa để tạo (bao gồm token suy luận cho mô hình o-series).
temperature
number
Giá trị sampling được chuyển tiếp mà không kiểm tra phạm vi. Mô hình có thể giới hạn hoặc bỏ qua giá trị ngoài phạm vi hỗ trợ.
top_p
number
Xác suất lấy mẫu nucleus. Mặc định: 1
tools
Tool[]
Định nghĩa công cụ (hàm) — cùng định dạng JSON Schema như Chat Completions (chấp nhận cả dạng phẳng của Responses và dạng lồng). Các công cụ tích hợp sẵn của riêng OpenAI (web_search_preview, file_search, computer_use_preview) không được hỗ trợ; tìm kiếm web khả dụng qua plugins: [{id:"web"}] — chỉ hỗ trợ trên một số tuyến model.
tool_choice
string | object
Điều khiển sử dụng công cụ: "auto", "none", hoặc công cụ cụ thể
parallel_tool_calls
boolean
Bật gọi hàm song song khi cung cấp công cụ. Mặc định: true. Chỉ áp dụng cho mô hình họ OpenAI — xem ghi chú bên dưới.
response_format
object
Buộc đầu ra JSON có cấu trúc. Xem phần Đầu ra có cấu trúc
previous_response_id
string
Endpoint này không trạng thái — truyền giá trị khác null sẽ trả về 400 (invalid_prompt) ngay lập tức, không bao giờ được chấp nhận rồi bỏ qua. Hãy dùng chế độ không trạng thái: truyền toàn bộ lịch sử hội thoại trong mảng input.

Schema yêu cầu (TypeScript)

type ResponsesRequest = {
  model: string;                    // Listed id or alias from GET /v1/models
  input: string | InputItem[];      // string or multi-turn array

  // Optional
  instructions?: string;            // System-level message
  stream?: boolean;                 // Default: false
  max_output_tokens?: number;
  temperature?: number;
  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
};

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

Yêu cầu mẫu

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

Định dạng phản hồi

BazaarLink trả về phản hồi chuẩn hóa và loại bỏ các trường riêng của upstream. BazaarLink request ID opaque trong phản hồi trùng với x-request-id; dùng nó với GET /v1/generation. Phản hồi không stream cũng có cùng ID trong x-generation-id. usage.cost là số tiền USD đã tính cho khách hàng. Số liệu có thể xuất hiện sau vài giây khi hoàn tất; thử lại 404 trong thời gian ngắn.

// Non-streaming response object
type ResponsesResponse = {
  id: string;             // Opaque BazaarLink request id; format may change
  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;          // USD amount charged to the customer for this request
  } | 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" };

Di chuyển từ Chat Completions

Thay messages bằng input (chuỗi hoặc mảng), dùng instructions thay cho tin nhắn system-role, và đọc output[0].content[0].text thay vì choices[0].message.content.

# Chat Completions (before)
response = client.chat.completions.create(
    model="openai/gpt-5.4-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-5.4-mini",
    instructions="You are helpful.",
    input="Hello"
)
text = response.output[0].content[0].text

Hạn chế

  • previous_response_id hoặc store: true bị từ chối với 400 (mã lỗi invalid_prompt) — không phải chấp nhận rồi bỏ qua. Luôn dùng chế độ không trạng thái: truyền toàn bộ lịch sử hội thoại trong mảng input.
  • Các công cụ tích hợp sẵn của riêng OpenAI (web_search_preview, file_search, computer_use_preview) không được hỗ trợ. Tìm kiếm web khả dụng qua plugins: [{id:"web"}] — chỉ hỗ trợ trên một số tuyến model.
  • background: true được chấp nhận nhưng bị bỏ qua — mọi yêu cầu đều chạy đồng bộ đến khi hoàn tất.

Messages (Anthropic)

Messages API tương thích Anthropic dành cho Claude SDK. Trỏ SDK tới BazaarLink và dùng khóa API BazaarLink; trường phản hồi và metadata thanh toán tuân theo hợp đồng BazaarLink được mô tả bên dưới.

POST/v1/messages
Note
AChấp nhận mã thông báo mang hoặc tiêu đề x-api-key (khả năng tương thích Anthropic SDK). Kích thước cơ thể tối đa: 10 MB.

Nội dung yêu cầu

modelbắt buộc
string
Dùng id hoặc alias được liệt kê tại GET /v1/models, ví dụ "claude-sonnet-4.6" hoặc "anthropic/claude-sonnet-4.6".
max_tokensbắt buộc
integer
Số lượng mã thông báo tối đa cần tạo (số nguyên dương).
messagesbắt buộc
Message[]
Mảng tin nhắn hội thoại (không trống).
system
string
Lời nhắc hệ thống tùy chọn.
stream
boolean
Nếu true, trả về luồng Server-Sent Events. Mặc định: false
temperature
number
Giá trị sampling được chuyển tiếp mà không kiểm tra phạm vi. Mô hình có thể giới hạn hoặc bỏ qua giá trị ngoài phạm vi hỗ trợ.
top_p
number
Xác suất lấy mẫu nucleus. Mặc định: 1
top_k
integer
Giá trị sampling được chuyển tiếp mà không kiểm tra phạm vi. Mô hình có thể giới hạn hoặc bỏ qua giá trị ngoài phạm vi hỗ trợ.
stop_sequences
string[]
Chuỗi trình tự dừng tùy chỉnh.
tools
Tool[]
Danh sách công cụ (hàm) mô hình có thể gọi
tool_choice
string | object
Điều khiển sử dụng công cụ: "auto", "none", hoặc công cụ cụ thể

Yêu cầu mẫu

from anthropic import Anthropic

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

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

Phản hồi

BazaarLink trả về phản hồi chuẩn hóa và loại bỏ các trường riêng của upstream. BazaarLink request ID opaque trong phản hồi trùng với x-request-id; dùng nó với GET /v1/generation. Phản hồi không stream cũng có cùng ID trong x-generation-id. usage.cost và usage.bz_cost chứa cùng số tiền USD đã tính cho khách hàng. Số liệu có thể xuất hiện sau vài giây khi hoàn tất; thử lại 404 trong thời gian ngắn.

{
  "id": "85e6f35c71a31f19-SJC",
  "type": "message",
  "role": "assistant",
  "model": "anthropic/claude-opus-4.6",
  "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,
    "cost": 0.00042,
    "bz_cost": 0.00042
  }
}

Envelope lỗi thay đổi tùy trường hợp. Phân nhánh theo HTTP status và error.type nếu có; error.code có thể là chuỗi, mã HTTP dạng số hoặc không có. Xem mục Lỗi để biết cách xử lý.

Mô hình

Liệt kê tất cả mô hình khả dụng với thông tin giá và khả năng. Không cần xác thực cho endpoint này.

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

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

Phản hồi

{
  "data": [
    {
      "id": "openai/gpt-4o",
      "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-4o")
  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)
    input_cache_read?: string;   // Cache read price per token (USD); only when the model publishes one
    input_cache_write?: string;  // Cache write price per token (USD); only when the model publishes one
    image_output?: string;       // Image output price per token (USD); only token-billed image models (display only)
  };
  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
    input_cache_read?: string;     // USD per token, only when the tier overrides it
    input_cache_write?: string;    // USD per token, only when the tier overrides it
  }[];
};

Giá theo bậc dựa trên độ dài đầu vào

Một số mô hình chuyển sang bảng giá khác khi prompt vượt ngưỡng token — toàn bộ bảng giá thay đổi, không chỉ phần token vượt ngưỡng. Ngưỡng là bất đẳng thức nghiêm ngặt: prompt có đúng N token vẫn tính theo bậc dưới N; bậc cao hơn chỉ áp dụng khi số token đầu vào lớn hơn N.

pricing_tiers là trường ngang cấp với pricing, chỉ xuất hiện khi mô hình có các bậc ghi đè vượt quá giá cơ bản. Các mục được sắp xếp theo above_prompt_tokens tăng dần; prompt/completion là USD trên mỗi token (cùng đơn vị với pricing.prompt/pricing.completion). pricing.prompt và pricing.completion luôn là bậc cơ bản (thấp nhất).

Hầu hết các mô hình không có bậc giá — với những mô hình đó, khóa pricing_tiers hoàn toàn không có trong phản hồi.

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

Mô hình khả dụng (171)

Đây là các mô hình hiện có trên BazaarLink, tải động từ cơ sở dữ liệu:

Qwen
qwen/qwen3.8-max1000K ctx · $1.65/$4.95text+image+video->text
qwen/qwen3.7-plus1000K ctx · $0.32/$1.28text+image->text
qwen/qwen3.7-max1000K ctx · $1.65/$4.95text->text
qwen/qwen3.7-flash1000K ctx · $0.03/$0.13text+image+video->text
qwen/qwen3.5-35b-a3b262K ctx · $0.31/$1.25text+image+video->text
qwen/qwen3.5-27b262K ctx · $0.26/$2.60text+image+video->text
qwen/qwen3-next-80b-a3b-instruct262K ctx · $0.14/$0.57text->text
qwen/qwen3.5-397b-a17b262K ctx · $0.55/$3.50text+image+video->text
qwen/qwen3.6-plus1000K ctx · $0.33/$1.95text+image+video->text
qwen/qwen3-coder-flash1000K ctx · $0.20/$0.97text->text
qwen/qwen3.5-122b-a10b262K ctx · $0.40/$3.20text+image+video->text
qwen/qwen3-vl-235b-a22b-instruct262K ctx · $0.20/$0.88text+image->text
qwen/qwen3.8-27b1000K ctx · $0.50/$3.00text+image+video->text
qwen/qwen3.8-2.4t-a95b1049K ctx · $2.00/$6.00text->text
qwen/qwen3-embedding-8b33K ctx · $0.01/$0.00text->embeddings
qwen/qwen3-embedding-0.6b33K ctx · $0.01/$0.00text->embeddings
qwen/qwen3-embedding-4b33K ctx · $0.02/$0.00text->embeddings
qwen/qwen3.5-flash-02-231000K ctx · $0.07/$0.26text+image+video->text
qwen/qwen3-coder-30b-a3b-instruct262K ctx · $0.07/$0.28text->text
qwen/qwen3.6-35b-a3b262K ctx · $0.15/$1.00text+image+video->text
qwen/qwen3-coder-next262K ctx · $0.12/$0.80text->text
qwen/qwen3-vl-30b-a3b-instruct262K ctx · $0.15/$0.60text+image->text
qwen/qwen3.5-plus-02-151000K ctx · $0.26/$1.56text+image+video->text
qwen/qwen3.6-27b262K ctx · $0.29/$2.40text+image+video->text
qwen/qwen3.5-plus-202604201000K ctx · $0.30/$1.80text+image+video->text
qwen/qwen3-coder262K ctx · $0.30/$1.00text->text
qwen/qwen-2.5-72b-instruct33K ctx · $0.36/$0.40text->text
qwen/qwen-image-3 · $0.00/$0.00text+image->image
qwen/qwen-image-3-pro · $0.00/$0.00text+image->image
Google
google/gemini-4-argon1049K ctx · $2.00/$10.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-3.1-pro-preview1049K ctx · $2.00/$12.00text+image+file+audio+video->text
google/gemma-3-4b-it131K ctx · $0.05/$0.10text+image->text
google/gemini-3.1-flash-lite1049K ctx · $0.25/$1.50text+image+file+audio+video->text
google/gemini-3.5-flash-lite1049K 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/gemini-3.7-flash1049K ctx · $0.75/$3.75text+image+file+audio+video->text
google/gemini-3.8-flash1049K ctx · $0.75/$3.75text+image+file+audio+video->text
google/gemini-3.6-flash1049K ctx · $0.75/$3.75text+image+file+audio+video->text
google/gemini-3.5-flash1049K ctx · $1.50/$9.00text+image+file+audio+video->text
google/text-embedding-0052K ctx · $0.03/$0.00text->embeddings
google/text-multilingual-embedding-0022K ctx · $0.03/$0.00text->embeddings
google/gemini-embedding-00120K ctx · $0.15/$0.00text->embeddings
google/gemma-4-26b-a4b-it262K ctx · $0.09/$0.34text+image+video->text
google/gemma-4-31b-it262K ctx · $0.09/$0.34text+image+video->text
google/gemini-2.5-flash-image33K ctx · $0.30/$2.50text+image->text+image
google/gemini-3.1-flash-image-preview66K ctx · $0.50/$3.00text+image->text+image
google/gemini-3.1-flash-image131K ctx · $0.50/$3.00text+image->text+image
google/gemini-3-pro-image131K ctx · $2.00/$12.00text+image->text+image
google/veo-3.1 · $0.00/$0.00text+image->video
google/gemini-embedding-2-preview8K ctx · $0.20/$0.00text+image+file+audio+video->embeddings
google/gemini-nano-banana-2.166K ctx · $1.50/$7.50text+image->text+image
OpenAI
openai/gpt-5.3-codex400K ctx · $1.75/$14.00text->text
openai/gpt-6-luna1050K ctx · $0.10/$0.50text+image+file->text
openai/gpt-5.6-luna1050K ctx · $0.20/$1.20text+image+file->text
openai/gpt-5.4-mini400K ctx · $0.75/$4.50text+image+file->text
openai/gpt-6.1-sol1050K ctx · $2.00/$10.00text+image+file->text
openai/gpt-6-sol1050K ctx · $2.00/$10.00text+image+file->text
openai/gpt-5.41050K ctx · $2.50/$15.00text+image+file->text
openai/gpt-5.51050K ctx · $5.00/$30.00text+image+file->text
openai/gpt-6-astra1050K ctx · $10.00/$50.00text+image+file->text
openai/gpt-5.6-terra1050K ctx · $2.00/$12.00text+image+file->text
openai/text-embedding-3-small8K ctx · $0.02/$0.00text->embeddings
openai/gpt-oss-safeguard-20b128K ctx · $0.07/$0.30text->text
openai/gpt-oss-120b131K ctx · $0.15/$0.60text->text
openai/text-embedding-ada-0028K ctx · $0.10/$0.00text->embeddings
openai/text-embedding-3-large · $0.13/$0.00text->embeddings
openai/gpt-5.6-sol1050K ctx · $4.00/$20.00text+image+file->text
openai/gpt-oss-20b131K ctx · $0.03/$0.13text->text
openai/gpt-4o128K ctx · $2.50/$10.00text+image+file->text
openai/gpt-image-1-mini400K ctx · $2.50/$2.50text+image->image
openai/gpt-5.4-image-2272K ctx · $8.00/$15.00text+image+file->text+image
openai/gpt-image-2.5-flare400K ctx · $8.00/$8.00text+image->image
openai/gpt-image-2.5-sunburst400K ctx · $8.00/$8.00text+image->image
openai/gpt-image-1400K ctx · $10.00/$10.00text+image->image
Anthropic
anthropic/claude-sonnet-4.61000K ctx · $3.00/$15.00text+image+file->text
anthropic/claude-opus-4.61000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-haiku-5.51000K ctx · $0.10/$0.50text+image+file->text
anthropic/claude-haiku-4.5200K ctx · $1.00/$5.00text+image+file->text
anthropic/claude-sonnet-51000K ctx · $2.00/$10.00text+image+file->text
anthropic/claude-sonnet-5.51000K ctx · $2.00/$10.00text+image+file->text
anthropic/claude-sonnet-4.51000K ctx · $3.00/$15.00text+image+file->text
anthropic/claude-opus-5.51000K ctx · $4.00/$20.00text+image+file->text
anthropic/claude-opus-4.81000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-opus-4.71000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-opus-51000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-opus-4.5200K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-fable-5.11000K ctx · $10.00/$50.00text+image+file->text
anthropic/claude-fable-51000K ctx · $10.00/$50.00text+image+file->text
anthropic/claude-opus-4.1200K ctx · $15.00/$75.00text+image+file->text
DeepSeek
deepseek/deepseek-v4.1-flash-10171049K ctx · $0.21/$0.85text+image->text
deepseek/deepseek-v4-flash1049K ctx · $0.14/$0.28text->text
deepseek/deepseek-v4-pro1049K ctx · $1.65/$3.30text->text
deepseek/deepseek-v4.1-flash1049K ctx · $0.21/$0.85text+image->text
deepseek/deepseek-chat-v3.1164K ctx · $0.21/$0.79text->text
deepseek/deepseek-chat164K ctx · $0.26/$0.38text->text
deepseek/deepseek-r164K ctx · $0.50/$2.15text->text
deepseek/deepseek-v4-pro-08131049K ctx · $0.89/$2.67text->text
deepseek/deepseek-v4-flash-07311000K ctx · $0.44/$1.32text->text
deepseek/deepseek-r1-0528164K ctx · $0.50/$2.15text->text
deepseek/deepseek-v4-flash-0731free1049K ctx · $0.20/$0.40text->text
elevenlabs
elevenlabs/eleven-v4-turbo · $0.00/$0.00text->speech
elevenlabs/eleven-multilingual-v2 · $0.00/$0.00text->speech
elevenlabs/eleven-v4 · $0.00/$0.00text->speech
elevenlabs/eleven-turbo-v2.5 · $0.00/$0.00text->speech
elevenlabs/eleven-flash-v2 · $0.00/$0.00text->speech
elevenlabs/eleven-v3-conversational · $0.00/$0.00text->speech
elevenlabs/eleven-flash-v2.5 · $0.00/$0.00text->speech
elevenlabs/eleven-v3 · $0.00/$0.00text->speech
elevenlabs/eleven-turbo-v2 · $0.00/$0.00text->speech
elevenlabs/scribe-v2 · $0.00/$0.00audio->transcription
elevenlabs/scribe-v2-medical · $0.00/$0.00audio->transcription
Zhipu AI
z-ai/glm-5v-turbo203K ctx · $1.20/$4.00text+image+video->text
z-ai/glm-5.3-flash1049K ctx · $0.15/$0.50text+image+video->text
z-ai/glm-4.6205K ctx · $0.60/$2.20text->text
z-ai/glm-5.3-flashx1049K ctx · $0.37/$1.25text+image+video->text
z-ai/glm-5.31049K ctx · $1.13/$4.40text->text
z-ai/glm-4.7-flash200K ctx · $0.06/$0.40text->text
z-ai/glm-4.5-air131K ctx · $0.13/$0.85text->text
z-ai/glm-4.6v131K ctx · $0.30/$0.90text+image+video->text
z-ai/glm-4.5v66K ctx · $0.60/$1.80text+image->text
z-ai/glm-4.5131K ctx · $0.60/$2.20text->text
voyage
voyage/voyage-4-lite32K ctx · $0.02/$0.00text->embeddings
voyage/voyage-3.5-lite32K ctx · $0.02/$0.00text->embeddings
voyage/voyage-3.532K ctx · $0.06/$0.00text->embeddings
voyage/voyage-432K ctx · $0.06/$0.00text->embeddings
voyage/voyage-4-large32K ctx · $0.12/$0.00text->embeddings
voyage/voyage-law-216K ctx · $0.12/$0.00text->embeddings
voyage/voyage-finance-232K ctx · $0.12/$0.00text->embeddings
voyage/voyage-code-216K ctx · $0.12/$0.00text->embeddings
voyage/voyage-3-large32K ctx · $0.18/$0.00text->embeddings
voyage/voyage-code-332K ctx · $0.18/$0.00text->embeddings
xAI
x-ai/grok-build-0.1256K ctx · $1.00/$2.00text+image+file->text
x-ai/grok-4.31000K ctx · $1.25/$2.50text+image+file->text
x-ai/grok-4.6500K ctx · $2.00/$6.00text+image+file->text
x-ai/grok-4.5500K ctx · $2.00/$6.00text+image+file->text
x-ai/grok-4.7500K ctx · $2.00/$6.00text+image->text
x-ai/grok-4.202000K ctx · $1.25/$2.50text+image+file->text
x-ai/grok-imagine-video-1.5-lite · $0.00/$0.00text+image->video
x-ai/grok-imagine-image-2.0 · $0.00/$0.00text+image->image
bytedance-seed
bytedance-seed/seed-1.6-flash262K ctx · $0.07/$0.30text+image+video->text
bytedance-seed/seed-2.0-mini262K ctx · $0.10/$0.40text+image+video->text
bytedance-seed/seed-2.0-lite262K ctx · $0.25/$2.00text+image+video->text
bytedance-seed/seed-1.6262K ctx · $0.25/$2.00text+image+video->text
ByteDance
bytedance/seedance-2.5 · $0.00/$0.00text+image+audio+video->video
bytedance/seedance-2.0 · $0.00/$0.00text+image+audio+video->video
bytedance/seedance-1-5-pro · $0.00/$0.00text+image->video
bytedance/seedance-2.0-fast · $0.00/$0.00text+image+audio+video->video
Moonshot AI
moonshotai/kimi-k31049K ctx · $2.83/$14.13text+image+video->text
moonshotai/kimi-k3.1-pro1049K ctx · $2.00/$10.00text+image+video->text
moonshotai/kimi-k2-0905262K ctx · $0.60/$2.50text->text
Cohere
cohere/rerank-v3.54K ctx · $0.00/$0.00text->rerank
cohere/rerank-4-pro33K ctx · $0.00/$0.00text->rerank
cohere/rerank-4-fast33K ctx · $0.00/$0.00text->rerank
MiniMax
minimax/minimax-m31049K ctx · $0.30/$1.20text+image+video->text
minimax/hailuo-3-max · $0.00/$0.00text+image->video
xiaomi
xiaomi/mimo-v2.6-flash1049K ctx · $0.14/$0.28text+image+video+audio->text
xiaomi/mimo-v2.6-pro1049K ctx · $0.43/$0.87text+image+video+audio->text
reflection
reflection/beam-free1049K ctx · $0.00/$0.00text->text
reflection/beam1049K ctx · $0.00/$0.00text->text
Perplexity
perplexity/pplx-embed-v1-0.6b32K ctx · $0.00/$0.00text->embeddings
perplexity/pplx-embed-v1-4b32K ctx · $0.03/$0.00text->embeddings
Mistral
mistralai/mistral-embed-23128K ctx · $0.10/$0.00text->embeddings
mistralai/codestral-embed-25058K ctx · $0.15/$0.00text->embeddings
cloudflare
cloudflare/clef-flash25K ctx · $0.09/$0.00text+image->decisions
cloudflare/clef66K ctx · $0.24/$0.00text+image->decisions
NVIDIA
nvidia/nemotron-3.5-lightning-free1000K ctx · $0.00/$0.00text->text
stealth
stealth/glyph-cluster256K ctx · $0.00/$0.00text->text
Meta
meta/muse-wonder1049K ctx · $4.00/$20.00text+image+file->text
amazon
amazon/titan-embed-text-v28K ctx · $0.02/$0.00text->embeddings
typesafe-ai
typesafe-ai/jev32K ctx · $0.04/$0.00text->decisions

Xem tất cả mô hình trên trang Mô hình.

Đánh giá có cấu trúc (Jev)

Jev đánh giá trạng thái JSON theo các câu hỏi được đặt tên và trả về câu trả lời kiểu boolean, choice hoặc score. Dùng khi ứng dụng cần chuyển tiêu chí rõ ràng thành kết quả có thể đọc bằng chương trình.

Chỉ dùng để đánh giá và nhận định
Jev không hỗ trợ trò chuyện. Gửi yêu cầu Jev đến POST /v1/evaluations; gửi đến POST /v1/chat/completions sẽ nhận HTTP 400.
POST/v1/evaluations

Gọi endpoint này bằng khóa API BazaarLink của bạn. URL đầy đủ: https://api.bazaarlink.ai/v1/evaluations.

Mô tả trường

model
string
Không bắt buộc. Nếu bỏ qua, mặc định là typesafe-ai/jev. ID mô hình khác trả về HTTP 400 với mã model_not_available.
state
string | object | array
Bắt buộc. Cung cấp trạng thái cần đánh giá dưới dạng chuỗi JSON, object hoặc mảng. Tổng state và questions sau khi tuần tự hóa vượt 32.000 tokens sẽ trả về context_length_exceeded.
questions
record<string, Question>
Bắt buộc, là object không rỗng chứa các câu hỏi có tên. Tên mỗi câu hỏi trở thành khóa trong object answers của phản hồi.
type
boolean | choice | score
Bắt buộc cho từng câu hỏi; chọn boolean, choice hoặc score.
instructions
string | object | array
Bắt buộc cho từng câu hỏi. Dùng chuỗi JSON, object hoặc mảng để mô tả nội dung cần quyết định.
criteria
object | array
Tùy theo type: boolean không bắt buộc; nếu có, đây là object chỉ dùng khóa true hoặc false. choice bắt buộc có object không rỗng; score bắt buộc có mảng theo thứ tự với ít nhất hai mục.

Kiểu câu trả lời

  • boolean — criteria là tùy chọn; nếu có, chỉ chấp nhận các khóa true và false. Câu trả lời có probability dạng số.
  • choice — criteria phải là một object không rỗng, ánh xạ tên lựa chọn tới tiêu chí JSON. Câu trả lời có choice dạng chuỗi; probabilities dùng tên lựa chọn làm khóa.
  • score — criteria phải là một mảng có thứ tự với ít nhất hai mục. score là số và là giá trị kỳ vọng của các chỉ số 0..N-1 theo thứ tự trong mảng criteria; probabilities dùng các chỉ số này ở dạng chuỗi làm khóa.

Ví dụ yêu cầu

curl --fail-with-body https://api.bazaarlink.ai/v1/evaluations \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "typesafe-ai/jev",
  "state": "The support agent issued a full refund and apologised for the delay.",
  "questions": {
    "refunded": {
      "type": "boolean",
      "instructions": "Was a refund issued?"
    },
    "tone": {
      "type": "choice",
      "instructions": "Tone of the agent?",
      "criteria": {
        "apologetic": "The agent apologises",
        "neutral": "No emotional language",
        "hostile": "The agent is rude"
      }
    },
    "quality": {
      "type": "score",
      "instructions": "How complete was the resolution?",
      "criteria": [
        "poor",
        "partial",
        "complete"
      ]
    }
  }
}'

Ví dụ phản hồi thành công

Phản hồi mẫu có id, object, model, answers, usage, rounding và warnings. answers dùng tên câu hỏi làm khóa. usage gồm input_tokens, output_tokens và total_tokens; rounding hiển thị probabilityDecimals và scoreDecimals. warnings là một mảng và rỗng trong ví dụ này. Trong answers, probabilities của choice dùng tên lựa chọn làm khóa, còn probabilities của score dùng chỉ số criteria ở dạng chuỗi làm khóa.

{
  "id": "eval-a3d350e5-2705-4a9b-be7c-838fa4e4eb2b",
  "object": "evaluation",
  "model": "typesafe-ai/jev",
  "answers": {
    "refunded": {
      "type": "boolean",
      "probability": 0.99
    },
    "tone": {
      "type": "choice",
      "choice": "apologetic",
      "probabilities": {
        "apologetic": 1,
        "neutral": 0,
        "hostile": 0
      }
    },
    "quality": {
      "type": "score",
      "score": 1.98,
      "probabilities": {
        "0": 0,
        "1": 0.02,
        "2": 0.98
      }
    }
  },
  "usage": {
    "input_tokens": 394,
    "output_tokens": 74,
    "total_tokens": 468
  },
  "rounding": {
    "probabilityDecimals": 2,
    "scoreDecimals": 2
  },
  "warnings": []
}

Phản hồi lỗi từ endpoint trò chuyện

Gửi Jev đến endpoint trò chuyện sẽ nhận HTTP 400. Các trường và giá trị dưới đây khớp với trình xử lý; message được thay bằng văn bản giữ chỗ, còn nội dung thực tế do máy chủ cung cấp.

{
  "error": {
    "message": "<server-generated message>",
    "type": "invalid_request_error",
    "code": 400
  }
}

Streaming

Đặt stream: true để nhận luồng Server-Sent Events (SSE). Mỗi sự kiện chứa một phần của phản hồi.

from openai import OpenAI

client = OpenAI(
    base_url="https://api.bazaarlink.ai/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)

Định dạng SSE

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"Hello"},"index":0}]}

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":" world"},"index":0}]}

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

data: [DONE]
Sử dụng trong streaming
Khi streaming, dữ liệu sử dụng được trả về trong phần cuối cùng trước tin nhắn [DONE], cùng với mảng choices có delta rỗng và finish_reason: "stop".

Keep-alive & chunk cuối

Stream có thể chứa dòng chú thích SSE và sự kiện unknown hoặc ping làm keep-alive; hãy bỏ qua và phân tích data frame. Data frame cuối có thể chứa usage trước data: [DONE].

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

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"Hi"},"index":0}]}

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{...}}

data: [DONE]

Hủy Stream

Yêu cầu streaming có thể bị hủy bằng cách đóng kết nối phía client — ví dụ gọi AbortController.abort() hoặc đóng đối tượng stream. BazaarLink sẽ ngừng chuyển tiếp các chunk tiếp theo và hủy yêu cầu gửi đến nhà cung cấp ngay khi nhận được lệnh hủy.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.bazaarlink.ai/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();
Không tính phí cho stream bị gián đoạn
Nếu stream kết thúc trước khi chunk usage cuối cùng đến — kể cả khi client chủ động hủy — sẽ không có căn cứ số token đáng tin cậy cho yêu cầu đó, vì vậy BazaarLink hoàn lại toàn bộ khoản đã giữ trước. Bạn không bị tính phí cho nội dung đã gửi tới client trước khi hủy.
Không đảm bảo dừng ngay lập tức ở phía nhà cung cấp
Đóng kết nối khiến BazaarLink ngừng chuyển tiếp và tính phí token ngay lập tức, nhưng việc nhà cung cấp upstream có dừng sinh nội dung trên máy chủ của họ ngay khi kết nối bị ngắt hay không tùy thuộc vào nhà cung cấp đó — một số có thể vẫn xử lý thêm một chút sau khi ngắt kết nối.

Lỗi Giữa Luồng

Khung lỗi không có trường choices
Nếu lỗi xảy ra sau khi streaming đã bắt đầu (ví dụ kết nối upstream bị ngắt), bạn sẽ nhận được một SSE data frame dạng {error:{message,type,code}} thay vì {choices:[...]} thông thường — không có thay đổi trạng thái HTTP vì header đã được gửi. Hãy kiểm tra trường error trước khi đọc choices[0].delta, và chỉ các token đã stream mới bị tính phí (áp dụng tính phí một phần).
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"The capital of "},"index":0}]}

data: {"error":{"message":"The request could not be completed.","type":"upstream_error","code":502}}

data: [DONE]

Embeddings

Embeddings là biểu diễn số học của văn bản nắm bắt ý nghĩa ngữ nghĩa — chuyển văn bản thành vector (dãy số) có thể dùng cho nhiều tác vụ machine learning. BazaarLink cung cấp một endpoint thống nhất, tương thích với OpenAI Embeddings API, để bạn gọi các mô hình embedding từ nhiều nhà cung cấp qua một giao diện duy nhất.

Phản hồi embedding dùng BazaarLink request ID opaque trùng với x-request-id; dùng nó với GET /v1/generation. Phản hồi không stream cũng có cùng ID trong x-generation-id. usage.cost là số tiền USD đã tính cho khách hàng cho yêu cầu này. Số liệu có thể xuất hiện sau vài giây khi hoàn tất; thử lại 404 trong thời gian ngắn.

Embeddings là gì?

Embeddings biến văn bản thành vector nhiều chiều, trong đó các văn bản có ý nghĩa tương tự nằm gần nhau hơn trong không gian vector — ví dụ, "cat" và "kitten" sẽ có embedding tương tự nhau, còn "cat" và "airplane" sẽ cách xa nhau. Các biểu diễn vector này giúp máy hiểu được mối quan hệ giữa các đoạn văn bản, là nền tảng của nhiều ứng dụng AI.

Các trường hợp sử dụng phổ biến

Trường hợp sử dụng
Mô tả
RAG (Thế hệ tăng cường truy xuất)Xây dựng hệ thống truy xuất ngữ cảnh liên quan từ cơ sở tri thức trước khi tạo câu trả lời — embeddings tìm ra các tài liệu liên quan nhất để đưa vào ngữ cảnh của LLM.
Tìm kiếm ngữ nghĩaChuyển tài liệu và truy vấn thành embeddings, sau đó tìm tài liệu liên quan nhất bằng độ tương đồng vector — hiểu ý nghĩa thay vì chỉ khớp từ khóa, cho kết quả tốt hơn tìm kiếm từ khóa.
Hệ thống đề xuấtTạo embeddings cho các mục (sản phẩm, bài viết, video) và sở thích người dùng để đề xuất các mục tương tự — so sánh vector tìm ra các mục liên quan về ngữ nghĩa ngay cả khi không có từ khóa chung.
Phân cụm & Phân loạiNhóm các tài liệu tương tự hoặc phân loại văn bản bằng cách phân tích các mẫu embedding — tài liệu có embedding tương tự thường thuộc cùng chủ đề hoặc danh mục.
Phát hiện trùng lặpTìm nội dung trùng lặp hoặc gần trùng lặp bằng cách so sánh độ tương đồng embedding — vẫn hoạt động ngay cả khi nội dung đã được diễn đạt lại.
Phát hiện bất thườngNhận diện nội dung bất thường hoặc ngoại lệ bằng cách xác định các embedding lệch đáng kể so với mẫu điển hình của tập dữ liệu.
POST/v1/embeddings
Note
Nếu nguồn upstream không hỗ trợ mô hình embeddings được yêu cầu, yêu cầu có thể thử một nguồn khả dụng khác. Nếu không có nguồn nào hỗ trợ, yêu cầu sẽ trả lỗi.

Tham số

modelbắt buộc
string
Mô hình embedding sử dụng, ví dụ "openai/text-embedding-3-small".
inputbắt buộc
string | string[] | ContentItem[]
Văn bản cần embedding — một chuỗi đơn, mảng chuỗi cho một lệnh gọi hàng loạt, hoặc (với các mô hình hỗ trợ) mảng các mục {content:[...]} kết hợp phần text và image_url.
dimensions
integer
Kích thước vector đầu ra được yêu cầu. Chỉ được áp dụng bởi các mô hình hỗ trợ số chiều thay đổi (ví dụ dòng OpenAI text-embedding-3); được chuyển tiếp nguyên trạng đến nhà cung cấp upstream và bị bỏ qua với các mô hình không hỗ trợ.
encoding_format
string
Định dạng mã hóa embedding được yêu cầu, ví dụ "float" hoặc "base64". Được chuyển tiếp nguyên trạng đến nhà cung cấp upstream — mức hỗ trợ tùy thuộc vào mô hình.
provider
object
Unsupported. The entire object is ignored and removed before forwarding; it cannot select an upstream or price tier.

Yêu Cầu Cơ Bản

from openai import OpenAI

client = OpenAI(
    base_url="https://api.bazaarlink.ai/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

Xử Lý Hàng Loạt

Gửi một mảng chuỗi để embedding nhiều văn bản trong một yêu cầu duy nhất — rẻ hơn và nhanh hơn so với gọi riêng cho từng văn bản.

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

Đầu Vào Đa Phương Thức (Hình Ảnh + Văn Bản)

Các mô hình hỗ trợ đầu vào hình ảnh (output_modalities gồm "embeddings" và inputModalities gồm "image") chấp nhận các mục đầu vào có dạng {content:[{type:"text",...}, {type:"image_url",...}]}, cho phép bạn embedding riêng một hình ảnh hoặc kết hợp cùng văn bản.

Tùy thuộc mô hình
Chỉ một số mô hình embedding chấp nhận đầu vào hình ảnh — kiểm tra các phương thức mà mô hình hỗ trợ trên trang Models trước khi gửi nội dung image_url. Mô hình chỉ hỗ trợ văn bản sẽ từ chối dạng này.
import requests

response = requests.post(
    "https://api.bazaarlink.ai/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)}")

Tìm Mô Hình Embedding

Không có endpoint riêng để liệt kê mô hình embedding — gọi GET /v1/models rồi lọc phía client các mục có output_modalities chứa "embeddings", hoặc duyệt trang Models.

Giới Hạn

  • Không hỗ trợ streaming — embeddings luôn được trả về dưới dạng phản hồi hoàn chỉnh, khác với chat completions.
  • Mỗi mô hình có độ dài đầu vào tối đa; văn bản vượt quá giới hạn đó sẽ bị cắt bớt hoặc từ chối ở upstream.
  • Embeddings cho cùng một đầu vào là tất định (deterministic) — không có temperature hay tính ngẫu nhiên.

Thực Hành Tốt Nhất

  • Chọn mô hình theo cân bằng tốc độ/chất lượng/chi phí — mô hình nhỏ hơn (ví dụ qwen/qwen3-embedding-4b) rẻ và nhanh hơn; mô hình lớn hơn (ví dụ openai/text-embedding-3-large) thường embedding với độ chính xác cao hơn.
  • Gộp nhiều văn bản vào một yêu cầu thay vì gọi riêng cho từng văn bản — giảm số lượt round trip và overhead.
  • Lưu cache kết quả — embedding của cùng một đầu vào không bao giờ thay đổi, nên lưu lại thay vì tạo lại.
  • So sánh bằng cosine similarity thay vì khoảng cách Euclidean — bất biến theo tỷ lệ và hoạt động tốt hơn với vector nhiều chiều.
  • Chú ý độ dài ngữ cảnh của từng mô hình — tài liệu dài có thể cần chia nhỏ (chunking) trước khi embedding.

Tham số

Tham số lấy mẫu định hình quá trình tạo token. BazaarLink chuyển các tham số được hỗ trợ đến nhà cung cấp upstream; tham số không được hỗ trợ bị bỏ qua im lặng.

Tham số lấy mẫu

Chuyển tiếp thuần túy — không có giá trị mặc định cục bộ
Giá trị sampling được chuyển tiếp mà không kiểm tra phạm vi. Mô hình có thể giới hạn hoặc bỏ qua giá trị ngoài phạm vi hỗ trợ.
temperature
number
Giá trị sampling được chuyển tiếp mà không kiểm tra phạm vi. Mô hình có thể giới hạn hoặc bỏ qua giá trị ngoài phạm vi hỗ trợ.
top_p
number
Xác suất lấy mẫu nucleus. Mặc định: 1
top_k
integer
Giá trị sampling được chuyển tiếp mà không kiểm tra phạm vi. Mô hình có thể giới hạn hoặc bỏ qua giá trị ngoài phạm vi hỗ trợ.
frequency_penalty
number
Phạt token lặp lại. Phạm vi: [-2, 2]. Mặc định: 0
presence_penalty
number
Phạt token dựa trên sự hiện diện. Phạm vi: [-2, 2]. Mặc định: 0
repetition_penalty
number
Giảm lặp lại token từ đầu vào. Phạm vi: (0, 2]. Mặc định: 1
min_p
number
Xác suất tối thiểu tương đối với token hàng đầu. Phạm vi: [0, 1]. Mặc định: 0
top_a
number
Top-P động dựa trên token có xác suất cao nhất. Phạm vi: [0, 1]. Mặc định: 0
seed
integer
Seed số nguyên cho lấy mẫu xác định. Không đảm bảo cho tất cả mô hình
max_tokens
integer
Số token tối đa để tạo
n
integer
Số lượng hoàn thành để tạo. Mặc định: 1
logit_bias
object
Ánh xạ ID token đến giá trị thiên lệch [-100, 100] được thêm trước lấy mẫu. Chỉ áp dụng cho mô hình họ OpenAI — xem ghi chú bên dưới.
logprobs
boolean
Trả về log xác suất của mỗi token đầu ra. Chỉ áp dụng cho mô hình họ OpenAI — xem ghi chú bên dưới.
top_logprobs
integer
Số token có khả năng nhất trả về cho mỗi vị trí (cần logprobs: true). Phạm vi: 0–20. Chỉ áp dụng cho mô hình họ OpenAI — xem ghi chú bên dưới.
response_format
object
Buộc đầu ra JSON có cấu trúc. Xem phần Đầu ra có cấu trúc
structured_outputs
boolean
Yêu cầu đầu ra tuân thủ nghiêm ngặt JSON schema trên các nhà cung cấp hỗ trợ. Chuyển tiếp nguyên trạng
reasoning
object
Cấu hình reasoning/thinking riêng của nhà cung cấp. Chuyển tiếp nguyên trạng
reasoning_effort
string
Mức độ reasoning kiểu OpenAI dòng o: "low", "medium", hoặc "high". Chuyển tiếp nguyên trạng
include_reasoning
boolean
true trả về nội dung suy nghĩ trong message.reasoning (delta.reasoning khi streaming); false tắt suy nghĩ cho các mô hình suy nghĩ theo mặc định (xem phần reasoning), nên không bị tính phí suy nghĩ. Khi không gửi reasoning_effort, reasoning hay thinking, chỉ các mô hình đó suy nghĩ và trả về theo mặc định; mô hình khác chỉ trả về khi được yêu cầu
stop
string | string[]
Chuỗi dừng — tạo văn bản dừng khi gặp
tools
Tool[]
Danh sách công cụ (hàm) mô hình có thể gọi
tool_choice
string | object
Điều khiển sử dụng công cụ: "auto", "none", hoặc công cụ cụ thể
parallel_tool_calls
boolean
Bật gọi hàm song song khi cung cấp công cụ. Mặc định: true. Chỉ áp dụng cho mô hình họ OpenAI — xem ghi chú bên dưới.

Tín dụng Thông tin chính của

Truy vấn số dư tín dụng hiện tại và mức sử dụng API trọn đời.

GET/v1/credits
Auth
Yêu cầu mã thông báo mang (khóa API tiêu chuẩn sk-bl-...).

Yêu cầu mẫu

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

Phản hồi

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

Errors: 401 (khóa missing/invalid), 403 (người dùng bị treo).

Dùng BazaarLink request ID opaque từ id phản hồi hoặc header x-request-id với GET /v1/generation; phản hồi không stream cũng có ID đó trong x-generation-id. Số liệu có thể xuất hiện sau vài giây; thử lại 404 trong thời gian ngắn.

GET/v1/generation?id=<generation-id>
Auth
Yêu cầu mã thông báo mang (khóa API tiêu chuẩn). Tham số truy vấn bắt buộc: id.

Yêu cầu mẫu

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

Phản hồi

{
  "data": {
    "id": "85e6f35c71a31f19-SJC",
    "model": "openai/gpt-4o",
    "provider": "bazaarlink",
    "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
    }
  }
}

Lỗi: 400 (thiếu id), 401 (auth), 404 (không tìm thấy thế hệ).

API Chi tiết thế hệ

Query (định dạng phản hồi tuân theo các quy ước API thông tin khóa phổ biến của ngành).

GET/v1/key
Auth
Yêu cầu mã thông báo mang (khóa API tiêu chuẩn).

Phản hồi

{
  "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 khi số dư tín dụng < $10. Windows nằm trong UTC: hàng ngày = ngày hiện tại, hàng tuần = Thứ Hai–Chủ Nhật, hàng tháng = ngày 1–EOM. Khi khóa được đặt giới hạn chi tiêu cho mỗi khóa (thông qua thông số giới hạn trên khóa creation/update), limit / limit_remaining / limit_reset phản ánh giới hạn đó và mức sử dụng của khoảng thời gian phù hợp; nếu không thì giới hạn sẽ không có giá trị và limit_remaining sẽ quay trở lại số dư tín dụng tài khoản của bạn. hết hạn_at là thời gian hết hạn của khóa (null nếu không có). is_management_key và is_provisioning_key là bí danh của cùng một khái niệm — cả hai đều đúng đối với khóa quản lý.
BYOK
BazaarLink không cung cấp chương trình mang theo chìa khóa của riêng bạn (BYOK), vì vậy điểm cuối này không trả về bất kỳ trường byok_usage nào.

Errors: 401 (auth), 404 (thiếu người dùng - hiếm). Số dư điểm

Mã lỗi

Error Trạng thái

Envelope lỗi khác nhau theo endpoint. Dựa vào HTTP status và error.type nếu có. error.code có thể là chuỗi hoặc số, đôi khi không có; error.message chỉ để hiển thị.

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

HTTP và error.code

Envelope lỗi khác nhau theo endpoint. Dựa vào HTTP status và error.type nếu có. error.code có thể là chuỗi hoặc số, đôi khi không có; error.message chỉ để hiển thị.

Mã
Tên
Mô tả
424Lỗi phụ thuộcKhóa BYOK do bạn tự cấu hình đã bị nhà cung cấp upstream từ chối; hãy kiểm tra hoặc xoay vòng khóa trong phần cài đặt BYOK. Lỗi này chỉ xuất hiện ở chế độ strict
400Yêu cầu xấuYêu cầu không hợp lệ, mảng messages rỗng, hoặc thiếu trường bắt buộc
401Không được phépKhóa API bị thiếu, không hợp lệ, hoặc bị vô hiệu hóa
402Yêu cầu thanh toánKhông đủ tín dụng tài khoản, đạt giới hạn chi tiêu theo khóa, hoặc vượt ngân sách hàng tháng/tuần
403Bị cấmTài khoản bị tạm ngưng hoặc không có quyền
404Không tìm thấyRequested model, generation, key, or other resource does not exist
409Xung độtResource is not in the required state, such as an incomplete video job
410Không còn nữaRequested model has been retired and must be replaced
413Tải trọng quá lớnBody yêu cầu vượt quá 10 MB; giảm kích thước nội dung hoặc chia yêu cầu
416Range không thỏa mãnRequested byte range is invalid for generated video content
429Quá nhiều yêu cầu Lỗi máy chủVượt giới hạn tốc độ; kiểm tra header Retry-After trước khi thử lại
432Hết hạn mức miễn phíCác endpoint tương thích Tavily (/v1/search, /v1/extract, /v1/crawl, /v1/map): hạn mức tìm kiếm miễn phí đã dùng hết, hoặc số dư bằng 0 hoặc âm; hãy nạp thêm credit để tiếp tục. Nội dung phản hồi theo định dạng Tavily: {"detail":{"error":"..."}}
500CổngLỗi nội bộ BazaarLink
502BadKhông có nguồn upstream nào xử lý được yêu cầu; yêu cầu sẽ trả lỗi.
503Dịch vụ không khả dụngKhông có nhà cung cấp upstream được cấu hình cho mô hình này; liên hệ admin
504Gateway Hết thời gian chờUpstream connection or stream stalled and timed out

Mã thanh toán có thể đọc được bằng máy

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

Mã
Mô tả
byok_key_invalidKhóa BYOK do bạn tự cấu hình đã bị nhà cung cấp upstream từ chối; hãy kiểm tra hoặc xoay vòng khóa trong phần cài đặt BYOK. Lỗi này chỉ xuất hiện ở chế độ strict.
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.
capacity_unavailableThis model is temporarily at capacity. Retry shortly; the Retry-After header says how long to wait.

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.

Mô hình và điểm cuối Các lỗi tra cứu mô hình, vòng đời, giá cả, phương thức và điểm cuối của
.
Mã
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
Yêu cầu và an toàn
Các tham số, ngữ cảnh, công cụ, lược đồ và từ chối an toàn nội dung không hợp lệ.
Mã
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
Tạo và chỉnh sửa hình ảnh
Lỗi đầu vào hình ảnh, chỉnh sửa nhiều phần, đầu ra và đường dẫn hình ảnh.
Mã
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
Định tuyến ngược dòng
Các lỗi kết nối, xác thực, điều chỉnh và tính khả dụng của nhà cung cấp đã được vệ sinh.
Mã
HTTP
upstream_unreachable502
upstream_auth_failed502
upstream_rate_limited429
capacity_unavailable429
upstream_unavailable502/503
byok_key_invalid424

Kiểm duyệt nội dung

Tất cả các yêu cầu đều được tự động kiểm duyệt trước khi gửi đến mô hình. Các yêu cầu vi phạm chính sách sử dụng của chúng tôi sẽ bị từ chối trước khi đến mô hình và trả về lỗi 403.

Các danh mục nội dung sẽ bị chặn

Việc kiểm duyệt dựa trên Chính sách Sử dụng Được chấp nhận (Acceptable Use Policy) của chúng tôi và chủ yếu chặn các danh mục nội dung sau:

  • Nội dung bóc lột tình dục
  • Đe dọa bạo lực
  • Hướng dẫn thực hiện hành vi bất hợp pháp
  • Nội dung liên quan đến nguy cơ sinh học

Định dạng phản hồi 403

Một yêu cầu bị chặn bởi kiểm duyệt sẽ trả về lỗi theo định dạng sau:

{
  "error": {
    "message": "Your prompt was blocked by content moderation.",
    "type": "invalid_request_error",
    "code": "content_filter"
  }
}

Các yêu cầu bị chặn sẽ không bị tính phí — bạn sẽ không bị tính phí cho một yêu cầu bị từ chối.

Khiếu nại khi bị chặn nhầm

Nếu bạn cho rằng một yêu cầu đã bị chặn không chính xác, vui lòng liên hệ bộ phận hỗ trợ kèm theo thời gian yêu cầu và (nếu thuận tiện) request id — chúng tôi sẽ xem xét lại.

Quyền riêng tư

Mọi yêu cầu đều được tự động kiểm duyệt nội dung.

Các yêu cầu bị phát hiện vi phạm sẽ được lưu giữ nội dung làm bằng chứng tuân thủ.

Các yêu cầu khác sẽ không được lưu giữ đầy đủ nội dung prompt.

Giới hạn tỷ lệ, ngân sách và phanh khẩn cấp

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

Điều khiển
HTTP
Làm thế nào để xác định nó Giới hạn tốc độ yêu cầu
429Mã string hoặc mã số 429; sử dụng header Retry-After và X-RateLimit-*.
Khối hình phạt giới hạn tỷ lệ429Mã số 429 và thông báo hạn chế tạm thời; sử dụng Thử lại sau. Phanh khẩn cấp
Global503Mã số 503, thông báo giới hạn chi tiêu toàn cầu và Thử lại sau 30 hoặc 300 giây.
Scoped spend brake429Numeric code 429 and a spend circuit-breaker message naming the scope.
Kiểm soát thanh toán và ngân sách402Sử dụng mã chuỗi thanh toán ổn định được liệt kê ở trên.

Envelope lỗi khác nhau theo endpoint. Dựa vào HTTP status và error.type nếu có. error.code có thể là chuỗi hoặc số, đôi khi không có; error.message chỉ để hiển thị.

Trạng thái tài nguyên video và phương tiện

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

Chính sách thử lại

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.

Thử lại với thời gian chờ
429, 502, 503, and 504. Check the original generation job before creating another after an ambiguous network failure.
Fix trước khi thử lại
400, 401, 402, 403, 404, 409, 410, 413, and 416. Fix the request, credentials, balance, permissions, resource state, or Range header first.

Xử lý lỗi

import random
import time
from openai import OpenAI, APIStatusError

client = OpenAI(
    base_url="https://api.bazaarlink.ai/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-4o",
            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)

Định dạng lỗi Streaming

Lỗi xảy ra trước khi stream token trả về phản hồi HTTP lỗi tiêu chuẩn với body JSON.

Sau khi stream bắt đầu, phản hồi HTTP đã là 200. Hãy phân tích từng SSE data frame và coi error cấp cao nhất hoặc choices[0].finish_reason === "error" là phản hồi thất bại, chưa hoàn chỉnh.

Nếu stream thất bại sau khi bắt đầu, BazaarLink có thể phát sự kiện SSE cuối cùng chứa đối tượng error cấp cao nhất, theo sau là data: [DONE]. Hãy coi phản hồi là chưa hoàn chỉnh; không dùng đầu ra một phần như kết quả đã hoàn tất.

data: {"error":{"message":"The request could not be completed.","type":"upstream_error","code":502}}

data: [DONE]

// Branch on error.code; error.type can vary by failure path.

Quản Lý Phiên Bản

BazaarLink cung cấp một đường dẫn API ổn định duy nhất, /v1 — không có phiên bản gắn theo ngày hay header phiên bản cần quản lý. API phát triển liên tục thay vì qua các bản phát hành đánh số.

Thay Đổi Không Phá Vỡ

Các thay đổi sau được triển khai mà không cần thông báo trước:

  • Endpoint mới
  • Mô hình mới được thêm vào danh mục
  • Tham số yêu cầu tùy chọn mới
  • Trường phản hồi mới
  • Schema mới với thuộc tính tùy chọn
  • Mã trạng thái/lỗi phản hồi bổ sung
Viết client theo hướng phòng thủ
Bỏ qua các trường phản hồi bạn không nhận ra, và đừng để lỗi khi gặp giá trị không xác định trong các trường dạng enum — giá trị mới được thêm khi danh mục và tính năng mở rộng.

Thay Đổi Phá Vỡ

Những thay đổi này hiếm khi xảy ra, bao gồm:

  • Xóa hoặc đổi tên endpoint, tham số, hoặc trường phản hồi
  • Thay đổi kiểu dữ liệu của một trường
  • Biến tham số tùy chọn thành bắt buộc

Khi xảy ra, một thay đổi phá vỡ chỉ áp dụng cho một endpoint cụ thể chứ không phải toàn bộ /v1 — không có việc nâng phiên bản đơn lẻ nào có thể làm hỏng mọi tích hợp cùng lúc. Chúng tôi chưa công bố changelog chính thức có gắn nhãn Breaking (xem "Cập Nhật Thông Tin" bên dưới) — với những gì quan trọng cho tích hợp của bạn, hãy liên hệ Support trước khi dựa vào hành vi chưa được ghi trong tài liệu.

Chính Sách Ngừng Hỗ Trợ

Sự kiện "phá vỡ" định kỳ duy nhất bạn nên lường trước: từng mô hình bị ngừng hỗ trợ khi nhà cung cấp upstream loại bỏ chúng. Kiểm tra trạng thái hiện tại của một mô hình qua GET /v1/models.

GET https://api.bazaarlink.ai/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" } }

Cập Nhật Thông Tin

Chúng tôi chưa công bố changelog API riêng hay RSS feed. Hiện tại, hãy kiểm tra trực tiếp trang này, theo dõi trạng thái của mô hình qua GET /v1/models, hoặc liên hệ Support nếu bạn cần được thông báo trước cho một tích hợp quan trọng.

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