모델 ID, 예: "openai/gpt-4o" 또는 "anthropic/claude-sonnet-4.6"
messages필수
Message[]
role과 content를 가진 메시지 객체 배열
stream
boolean
true이면 Server-Sent Events 스트림을 반환합니다. 기본값: false
temperature
number
샘플링 온도 0–2. 높을수록 무작위. 기본값: 1
max_tokens
integer
생성할 최대 토큰 수
max_completion_tokens
integer
max_tokens의 별칭 (OpenAI o-시리즈 호환). 둘 다 허용; 제공된 것이 적용됨
top_p
number
핵 샘플링 확률 질량. 기본값: 1
top_k
integer
상위 K개로 토큰 선택 제한. 0 = 비활성화 (모두 고려). 기본값: 0
frequency_penalty
number
반복 토큰 패널티. 범위: [-2, 2]. 기본값: 0
presence_penalty
number
존재 기반 토큰 패널티. 범위: [-2, 2]. 기본값: 0
repetition_penalty
number
입력에서 토큰 반복 감소. 범위: (0, 2]. 기본값: 1
min_p
number
상위 토큰 대비 최소 확률. 범위: [0, 1]. 기본값: 0
top_a
number
최고 확률 토큰 기반 동적 top-P. 범위: [0, 1]. 기본값: 0
seed
integer
결정적 샘플링을 위한 정수 시드. 모든 모델에서 보장되지 않음
n
integer
생성할 완성 수. 기본값: 1
user
string
모니터링 및 남용 감지를 위한 최종 사용자 식별자. 과금에 영향 없음. OpenAI 계열 모델에만 적용 — 아래 참고 사항 확인.
stop
string | string[]
중지 시퀀스 — 만나면 생성 중단
logit_bias
object
토큰 ID를 바이어스 값 [-100, 100]에 매핑하여 샘플링 전 추가. OpenAI 계열 모델에만 적용 — 아래 참고 사항 확인.
logprobs
boolean
각 출력 토큰의 로그 확률 반환. OpenAI 계열 모델에만 적용 — 아래 참고 사항 확인.
top_logprobs
integer
위치당 반환할 최고 확률 토큰 수 (logprobs: true 필요). 범위: 0–20. OpenAI 계열 모델에만 적용 — 아래 참고 사항 확인.
tools
Tool[]
모델이 호출할 수 있는 도구(함수) 목록
tool_choice
string | object
도구 사용 제어: "auto", "none", 또는 특정 도구
parallel_tool_calls
boolean
도구 제공 시 병렬 함수 호출 활성화. 기본값: true. OpenAI 계열 모델에만 적용 — 아래 참고 사항 확인.
response_format
object
구조화된 JSON 출력 강제. 구조화된 출력 섹션 참조
structured_outputs
boolean
지원하는 제공자에서 엄격한 JSON 스키마 준수 출력을 요청. 그대로 전달
reasoning
object
제공자별 reasoning/thinking 설정. 그대로 전달
reasoning_effort
string
OpenAI o-시리즈 스타일 reasoning 강도: "low", "medium", 또는 "high". 그대로 전달
transforms
string[]
적용할 메시지 변환, 예: ["middle-out"]. ≤8k 컨텍스트 모델에서 자동 적용하려면 생략
models
string[]
장애 복구 모델 목록 — BazaarLink이 기본 모델 실패 시 순서대로 시도
route
string
고급 라우팅 호환 필드 — 대부분의 사용자에게는 필요하지 않습니다. 폴백에는 "models"를 사용하세요.
provider
object
고급 라우팅 설정 — 대부분의 사용자에게는 필요하지 않습니다.
user, logprobs, top_logprobs, logit_bias, parallel_tool_calls는 OpenAI 계열 모델에만 전달됩니다
이 다섯 개 매개변수는 확인된 모델이 OpenAI 자체 모델로 인식되지 않을 때 업스트림 요청에서 제거됩니다 — anthropic/claude-*, google/gemini-* 등 OpenAI가 아닌 대상으로 보내면 오류가 아니라 매개변수가 조용히 무시된 채 200을 반환합니다. 이 중 하나를 설정했는데 효과가 나타나지 않는다면, 대상 모델이 OpenAI 모델인지 확인하세요.
BazaarLink는 정확히 두 개의 필드만 정규화합니다 — model과 provider 필드 제거 — 나머지 업스트림 응답은 그대로 전달합니다. native_finish_reason, system_fingerprint, reasoning 같은 필드는 해당 업스트림 공급자가 값을 채운 경우에만 존재합니다 — 모든 모델에서 항상 존재한다고 가정하지 마세요. usage.cost는 예외로, 업스트림에서 전달된 값이 아니라 항상 BazaarLink 자체가 정산·청구한 금액입니다.
DALL·E 및 GPT-4o 같은 모델을 사용하여 텍스트 프롬프트에서 이미지를 생성합니다. `modalities` 파라미터를 사용하여 채팅 완성 엔드포인트에서 이미지 출력을 요청합니다. 이미지 편집(기존 이미지 수정)은 POST /v1/images/edits를 사용합니다 —— OpenAI images.edit 호환이며, multipart/form-data로 소스 이미지를 업로드합니다. 편집 가능한 모델은 modality가 text+image->image입니다(예: qwen/qwen-image-3). 순수 생성 모델은 text->image입니다 —— 각 모델의 modality는 GET /v1/models에서 확인하세요.
Response format
/v1/images/generations는 기본적으로 OpenAI 호환 동기 JSON을 반환합니다(2026-07-25부터) — client.images.generate()가 래퍼 없이 바로 동작합니다. stream: true를 전달하면 SSE 이벤트 스트림으로 전환되어 생성 시간이 긴 모델의 진행 상황을 받을 수 있습니다.
A. /v1/chat/completions (네이티브, 권장)
POST/v1/chat/completions
The canonical streaming path. Recommended for any new integration.
1
2
3
4
5
6
7
8
9
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
}'
이미지-투-이미지: content 배열에 image_url 파트를 포함하세요. 데이터 URI 또는 https 이미지 URL(http:// 는 거부됨)을 지원하며, 최대 8장, 데이터 URI당 약 10MB입니다. 이미지를 포함한 메시지에는 text 파트(편집 지시)도 함께 있어야 합니다. 일부 모델은 image_config(예: {"strength": 0.7}, 0–1 — 낮을수록 원본 이미지에 가까움)를 추가로 지원하며, 그대로 업스트림에 전달됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
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
}'
이미지 편집 (OpenAI 호환)
POST/v1/images/edits
OpenAI SDK의 client.images.edit()가 그대로 동작합니다(multipart 업로드, data: [{ url }] 을 반환하는 동기 JSON 응답). 제한은 이미지-투-이미지와 동일: 최대 8장, 각 10MB. mask와 response_format=b64_json은 아직 지원되지 않습니다.
1
2
3
4
5
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 (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.
1
2
3
4
5
6
7
8
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"
}'
model필수
string
모델 ID, 예: google/gemini-2.5-flash-image
prompt필수
string
텍스트 프롬프트
size
string
출력 크기 (자동 매핑)
n
integer
생성 개수 (기본값 1)
1
2
3
4
5
6
# 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}'
비동기 3단계 플로우(submit → poll → content)입니다. 비디오 생성은 30초~5분이 걸려 chat-completions의 동기 요청/응답 방식에 맞지 않습니다 — 그래서 BazaarLink는 비디오를 전용 /v1/videos 경로로 분리하고 job-id 패턴을 사용합니다: submit으로 vjob_* ID 수신 → 상태 poll → 완료 후 bytes fetch. video model을 /chat/completions 또는 /images/generations로 호출하면 400(code: wrong_endpoint_for_video)이 반환됩니다. 비용은 completed 시점에 실제 usage.cost로 정산됩니다.
동영상 작업 유형
하나의 엔드포인트가 여러 작업을 처리합니다. 실제로 어떤 작업이 실행되는지는 전송하는 필드로 결정됩니다 —— 하나의 모델로 이미지-투-비디오, 키프레임, 이어 붙이기를 모두 할 수 있습니다. 모든 모델이 모든 작업을 지원하지는 않으며, 미지원 요청은 400을 반환합니다.
텍스트→동영상
prompt
텍스트 프롬프트만으로 생성하며, 입력 미디어가 필요 없습니다.
이미지→동영상
frame_images: [ first frame ]
이미지 자체가 화면입니다. 첫 프레임이 되어 움직이며 원본에 충실합니다. 예: 고양이 사진 → 같은 장면에서 그 고양이가 고개를 돌립니다.
키프레임(첫+마지막)
frame_images: [ first, last ]
시작 이미지와 끝 이미지를 주면 모델이 그 사이의 움직임을 보간합니다.
이어 붙이기
input_video
기존 클립을 연장합니다. 요청한 duration은 원본 동영상 길이보다 커야 합니다.
참조→동영상
input_references: [ images ]
이미지는 프레임이 아니라 '참조'입니다. 모델은 피사체/스타일을 유지하면서 완전히 새로운 장면을 생성합니다. 예: 고양이 사진 + "숲에서 춤추기" → 고양이의 모습은 유지되지만 장면과 움직임은 새로운 영상(참조 1~9장). 이미지→동영상과의 차이: i2v는 원본 이미지에 충실하고, r2v는 피사체를 새 영상으로 다시 연출합니다.
동영상 편집
input_video + prompt
기존 동영상을 편집합니다 — 장면, 스타일, 움직임 변경. 입력 동영상 초 + 출력 초로 과금됩니다.
허용 해상도는 모델마다 다릅니다 —— 미지원 값을 보내면 지원 값을 나열한 400을 반환합니다.
입력 이미지/동영상은 공개 URL에서 접근 가능해야 합니다. 핫링크 보호된 호스트(일부 wiki 등)는 실패합니다.
입력 미디어는 업스트림 콘텐츠 검열을 거치며 가끔 거부될 수 있습니다.
이어 붙이기의 경우 요청한 duration이 원본 동영상 길이를 초과해야 합니다.
출력 화면 비율은 입력 이미지를 따릅니다 —— 정사각형 이미지는 정사각형 동영상이 됩니다.
동영상 편집은 입력 동영상의 초와 생성된 출력의 초로 과금됩니다.
편집/이어 붙이기의 input_video는 공개 URL이어야 합니다. 여기서 생성한 동영상은 API 키 뒤에서 제공되므로 업스트림이 가져올 수 없습니다 —— 소스 동영상을 공개적으로 접근 가능한 URL에 호스팅하세요.
웹훅 페이로드는 서명되지 않습니다 — 조치 전에 GET /videos/{id}로 상태/금액을 확인하세요. 거기의 unsigned_urls는 절대 경로입니다(폴링 응답의 상대 경로와 다름).
지원되는 비디오 모델
Model ID
Modality
Tasks
bytedance/seedance-2.0
text+image+audio+video->video
t2v, i2v
bytedance/seedance-2.0-fast
text+image+audio+video->video
t2v, i2v
minimax/hailuo-3-max
text+image->video
t2v, i2v
google/veo-3.1
text+image->video
t2v, i2v
openai/sora-2-pro
text+image->video
t2v, i2v
bytedance/seedance-1-5-pro
text+image->video
t2v, i2v
bytedance/seedance-2.5
text+image+audio+video->video
—
비디오 입력
동영상 입력을 지원하는 모델에 동영상 파일을 전송하여 분석, 캡션 생성, 장면 및 이벤트에 대한 질문에 답하게 합니다. 직접 URL 또는 base64 데이터 URI를 사용할 수 있습니다 — URL은 공개적으로 접근 가능한 동영상에 효율적이며, base64는 로컬 파일이나 비공개 동영상에 사용합니다.
지원 형식
MP4(H.264)MPEGMOVWebM
1
2
3
4
5
6
7
8
9
10
11
12
13
response = client.chat.completions.create(
model="google/gemini-2.5-flash",
messages=[{
"role": "user",
"content": [
{
"type": "video_url",
"video_url": {"url": "https://example.com/video.mp4"},
},
{"type": "text", "text": "What is happening in this video?"},
],
}],
)
상태 비저장 멀티턴 대화, 도구 호출, 멀티모달 입력을 위한 OpenAI Responses API 호환 엔드포인트. client.responses.create()를 사용하는 OpenAI Python SDK ≥ 1.x 에이전트 및 프레임워크에 적합합니다.
POST/v1/responses
Note
채팅 완성과 동일한 인증 및 모델 라우팅을 지원합니다.
요청 바디
model필수
string
모델 ID, 예: "openai/gpt-4o" 또는 "anthropic/claude-sonnet-4.6"
input필수
string | Item[]
사용자 입력 — 일반 문자열(단일 메시지) 또는 멀티턴/멀티모달 대화를 위한 입력 항목 배열.
instructions
string
시스템 수준 지시사항, 시스템 메시지와 동일. 매 요청마다 다시 보내야 합니다.
stream
boolean
true이면 Responses API SSE 스트림 이벤트를 반환합니다. 이벤트 유형: response.created, response.output_text.delta, response.completed.
max_output_tokens
integer
생성할 최대 출력 토큰 수 (o-시리즈 모델의 경우 추론 토큰 포함).
temperature
number
샘플링 온도 0–2. 높을수록 무작위. 기본값: 1
top_p
number
핵 샘플링 확률 질량. 기본값: 1
tools
Tool[]
도구(함수) 정의 — Chat Completions와 동일한 JSON Schema 형식(평면 Responses 형식과 중첩 형식 모두 허용). OpenAI 자체의 내장 호스팅 도구(web_search_preview, file_search, computer_use_preview)는 지원되지 않습니다. 웹 검색은 plugins: [{id:"web"}]로 사용할 수 있으며 — 일부 모델 라우트에서만 지원됩니다.
tool_choice
string | object
도구 사용 제어: "auto", "none", 또는 특정 도구
parallel_tool_calls
boolean
도구 제공 시 병렬 함수 호출 활성화. 기본값: true. OpenAI 계열 모델에만 적용 — 아래 참고 사항 확인.
response_format
object
구조화된 JSON 출력 강제. 구조화된 출력 섹션 참조
models
string[]
장애 복구 모델 목록 — BazaarLink이 기본 모델 실패 시 순서대로 시도
transforms
string[]
적용할 메시지 변환, 예: ["middle-out"]. ≤8k 컨텍스트 모델에서 자동 적용하려면 생략
previous_response_id
string
이 엔드포인트는 상태 비저장입니다 — null이 아닌 값을 전달하면 즉시 400(invalid_prompt)을 반환하며, 절대 수락된 후 무시되지 않습니다. 대신 상태 비저장 모드를 사용하세요: input 배열에 전체 대화 기록을 전달하세요.
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?"
}'
{"id":"msg_...","type":"message","role":"assistant","model":"anthropic/claude-opus-4","content":[{"type":"text","text":"Hello! How can I help you today?"}],"stop_reason":"end_turn","usage":{"input_tokens":10,"output_tokens":12,"cache_read_input_tokens":0,"cache_creation_input_tokens":0,"bz_cost":0.00042}}
// /v1/models — Response SchematypeModelsResponse = {
data: Model[];
};
typeModel = {
id: string; // Model ID (e.g. "openai/gpt-4o")name: string; // Human-readable namecontext_length: number | null; // Max context window in tokensmodality: string | null; // e.g. "text->text", "text+image->text"architecture?: {
input_modalities?: string[];
output_modalities?: Array<
"text" | "image" | "embeddings" | "audio" |
"video" | "rerank" | "speech" | "transcription"
>;
};
pricing: {
prompt: string; // Input price per 1M tokens (USD)completion: string; // Output price per 1M tokens (USD)
};
description?: string | null; // Model descriptiontop_provider?: {
max_completion_tokens?: number;
};
supported_parameters?: string[]; // e.g. ["tools", "response_format", "reasoning"]pricing_tiers?: { // Present only for models with input-length tiersabove_prompt_tokens: number; // Ascending; strict "greater than" thresholdprompt: string; // USD per token, override tiercompletion: string; // USD per token, override tier
}[];
};
입력 길이 기반 단계별 가격
일부 모델은 프롬프트가 token 임계값을 초과하면 전체 가격표가 전환됩니다(임계값을 초과한 부분만이 아닙니다). 임계값은 엄격한 부등식입니다: 입력 token 수가 정확히 N이면 N 이하 단계가 적용되고, N을 초과할 때만 상위 단계가 적용됩니다.
pricing_tiers는 pricing과 동일한 레벨의 필드로, 기본 가격을 초과하는 오버라이드 단계가 있는 모델에만 존재합니다. 항목은 above_prompt_tokens 오름차순으로 정렬되며, prompt/completion은 token당 USD 가격입니다(pricing.prompt/pricing.completion과 동일한 단위). pricing.prompt와 pricing.completion은 항상 기본(최저) 단계입니다.
대부분의 모델에는 단계가 없습니다 — 이 경우 응답에 pricing_tiers 키 자체가 없습니다.
스트리밍 시, 사용량 데이터는 [DONE] 메시지 이전의 마지막 청크에서 빈 delta와 finish_reason: "stop"을 가진 choices 배열과 함께 반환됩니다.
Keep-alive 및 마지막 청크
스트림에는 keep-alive로 SSE 주석 줄(콜론으로 시작)이나 하트비트 이벤트가 포함될 수 있습니다 — 원시 스트림을 그대로 JSON.parse하지 말고 data: 가 아닌 줄은 건너뛰세요. 마지막 data 청크는 data: [DONE] 전에 usage(토큰 수와 비용)를 담고 있습니다. 성공한 응답에는 X-Request-Id 헤더가 포함됩니다 — 문제를 보고할 때 함께 제공하세요.
1
2
3
4
5
6
7
: keepalive <- SSE comment line — ignore, do NOT JSON.parse
data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"Hi"},"index":0}]}
data: {"id":"chatcmpl-abc","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{...}}
data: [DONE]
스트림 취소
클라이언트 연결을 종료하면 스트리밍 요청을 취소할 수 있습니다 — 예: AbortController.abort() 호출 또는 stream 객체 종료. BazaarLink는 취소 신호를 받는 즉시 이후 청크 전달을 중단하고 공급자로 나가는 요청을 취소합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
importOpenAIfrom"openai";
const client = newOpenAI({
baseURL: "https://api.bazaarlink.ai/v1",
apiKey: "sk-bl-YOUR_API_KEY",
});
const controller = newAbortController();
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 }
);
forawait (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();
중단된 스트림은 과금되지 않습니다
마지막 usage 청크가 도착하기 전에 스트림이 끝나면 — 클라이언트 측 취소를 포함해서 — 해당 요청의 신뢰할 수 있는 토큰 수 근거가 없으므로 BazaarLink는 예약된 금액 전액을 환불합니다. 취소 전에 클라이언트로 이미 전달된 내용에 대해서는 과금되지 않습니다.
공급자 측 즉시 중단은 보장되지 않습니다
연결을 종료하면 BazaarLink는 즉시 이후 토큰 전달과 과금을 중단하지만, 업스트림 공급자가 연결이 끊기는 순간 자사 서버에서 생성을 멈추는지 여부는 해당 공급자에 따라 다릅니다 — 일부는 연결 종료 후에도 잠시 계속 계산할 수 있습니다.
스트림 도중 오류
오류 프레임에는 choices 필드가 없음
스트리밍이 이미 시작된 후 실패가 발생하면(예: 업스트림 연결 끊김), 일반적인 {choices:[...]} 대신 {error:{message,type,code}} 형태의 SSE 데이터 프레임을 받게 됩니다 — 헤더는 이미 전송되었으므로 HTTP 상태 변경은 없습니다. choices[0].delta를 읽기 전에 error 키가 있는지 확인하세요. 이미 스트리밍된 토큰에 대해서만 과금됩니다(부분 과금 적용).
1
2
3
4
5
data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"The capital of "},"index":0}]}
data: {"error":{"message":"Upstream connection lost.","type":"upstream_error","code":502}}
data: [DONE]
임베딩
임베딩(Embeddings)은 의미를 포착하는 수치 표현으로, 텍스트를 벡터(숫자 배열)로 변환하여 다양한 머신러닝 작업에 활용할 수 있습니다. BazaarLink는 OpenAI 임베딩 API와 호환되는 통합 엔드포인트를 제공하여 하나의 인터페이스로 여러 공급자의 임베딩 모델을 호출할 수 있습니다.
임베딩이란?
임베딩은 텍스트를 고차원 벡터로 변환하며, 의미적으로 유사한 텍스트는 벡터 공간에서 더 가깝게 위치합니다——예를 들어 "고양이"와 "새끼 고양이"의 임베딩은 비슷하지만, "고양이"와 "비행기"는 멀리 떨어져 있습니다. 이러한 벡터 표현 덕분에 기계가 텍스트 간의 관계를 이해할 수 있으며, 많은 AI 애플리케이션의 기반이 됩니다.
일반적인 사용 사례
사용 사례
설명
RAG (검색 증강 생성)답변을 생성하기 전에 지식 베이스에서 관련 컨텍스트를 검색하는 시스템을 구축——임베딩은 LLM 컨텍스트에 포함할 가장 관련성 높은 문서를 찾아줍니다.
시맨틱 검색문서와 쿼리를 임베딩으로 변환한 후 벡터 유사도로 가장 관련성 높은 문서를 찾습니다——키워드 일치만이 아니라 의미를 이해하므로 키워드 검색보다 더 나은 결과를 제공합니다.
추천 시스템상품, 기사, 동영상 등의 항목과 사용자 선호도에 대한 임베딩을 생성하여 유사한 항목을 추천——공통 키워드가 없어도 벡터 비교로 의미적으로 관련된 항목을 찾을 수 있습니다.
클러스터링 및 분류임베딩 패턴을 분석하여 유사한 문서를 그룹화하거나 분류——임베딩이 비슷한 문서는 보통 같은 주제나 카테고리에 속합니다.
중복 감지임베딩 유사도를 비교하여 중복 또는 거의 중복된 콘텐츠를 감지——내용이 바꿔 표현되었더라도 감지할 수 있습니다.
이상 감지데이터셋의 일반적인 패턴에서 크게 벗어난 임베딩을 찾아 이상치나 특이한 콘텐츠를 식별합니다.
POST/v1/embeddings
Note
모든 업스트림 공급자가 임베딩을 지원하는 것은 아닙니다. 구성된 공급자가 요청된 모델을 지원하지 않으면 BazaarLink이 자동으로 다음 사용 가능한 공급자로 장애 복구합니다.
매개변수
model필수
string
사용할 임베딩 모델, 예: "openai/text-embedding-3-small".
input필수
string | string[] | ContentItem[]
임베딩할 텍스트 — 단일 문자열, 한 번의 배치 호출을 위한 문자열 배열, 또는 (지원하는 모델의 경우) text와 image_url 파트를 섞은 {content:[...]} 항목 배열.
dimensions
integer
요청하는 출력 벡터 크기. 가변 차원을 지원하는 모델(예: OpenAI text-embedding-3 계열)에서만 적용됩니다. 업스트림 공급자에 그대로 전달되며, 지원하지 않는 모델에서는 무시됩니다.
encoding_format
string
요청하는 임베딩 인코딩, 예: "float" 또는 "base64". 업스트림 공급자에 그대로 전달됩니다 — 지원 여부는 모델에 따라 다릅니다.
provider
object
공급자 라우팅 설정 — order, allow_fallbacks, data_collection 및 Provider Selection에 설명된 기타 필드.
기본 요청
1
2
3
4
5
6
7
8
9
10
11
12
13
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
배치 처리
문자열 배열을 보내면 한 번의 요청으로 여러 텍스트를 임베딩할 수 있습니다 — 텍스트별로 호출하는 것보다 저렴하고 빠릅니다.
1
2
3
4
5
6
7
8
9
10
11
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 inenumerate(response.data):
print(f"Embedding {i}: {len(item.embedding)} dimensions")
멀티모달 입력 (이미지 + 텍스트)
이미지 입력을 지원하는 모델(output_modalities에 "embeddings", inputModalities에 "image" 포함)은 {content:[{type:"text",...}, {type:"image_url",...}]} 형태의 입력 항목을 받아, 이미지 단독 또는 텍스트와 함께 임베딩할 수 있습니다.
모델에 따라 다름
일부 임베딩 모델만 이미지 입력을 받습니다 — image_url 콘텐츠를 보내기 전에 Models 페이지에서 해당 모델의 지원 모달리티를 확인하세요. 텍스트 전용 모델은 이 형식을 거부합니다.
크레딧 잔액이 $10 미만일 때 is_free_tier = true. 윈도우는 UTC: daily = 당일, weekly = 월~일, monthly = 1일~말일. 키에 개별 사용 한도가 설정된 경우(키 생성/수정 시 limit 파라미터), limit / limit_remaining / limit_reset은 해당 한도와 그 기간의 사용량을 반영합니다. 설정되지 않은 경우 limit은 null이며 limit_remaining은 계정 크레딧 잔액으로 대체됩니다. expires_at은 키의 만료 시각(없으면 null)입니다. is_management_key와 is_provisioning_key는 동일한 개념의 별칭으로, 관리 키인 경우 둘 다 true입니다.
BYOK
BazaarLink는 BYOK(자체 키 지참) 프로그램을 제공하지 않으므로 이 엔드포인트는 byok_usage 관련 필드를 반환하지 않습니다.
오류: 401 (auth), 404 (사용자 없음 — 드물게).
오류 코드
오류 응답 형식
모델 추론 엔드포인트는 OpenAI 호환 오류 응답을 반환합니다. type 필드는 달라지거나 생략될 수 있으므로 메시지를 파싱하지 말고 HTTP 상태와 error.code를 프로그램 로직에 사용하세요.
1
2
3
4
5
6
7
{"error":{"message":"Insufficient credits. Please top up to continue.","type":"invalid_request_error","code":"insufficient_credits"}}
HTTP 상태 및 오류.코드
Before streaming, the HTTP status identifies the broad failure class. error.code is either that number or a stable string for a specific remedy. Prefer the string code when present, otherwise use the HTTP status.
코드
이름
설명
400잘못된 요청잘못된 요청, 빈 messages 배열, 또는 필수 필드 누락
401승인되지 않음API 키가 누락, 잘못됨, 또는 비활성화됨
402결제 필요계정 크레딧 부족, 키별 지출 한도 도달, 또는 월간/주간 예산 상한 초과
403금지됨계정이 정지되었거나 권한이 없음
404찾을 수 없음Requested model, generation, key, or other resource does not exist
409충돌Resource is not in the required state, such as an incomplete video job
410사라Requested model has been retired and must be replaced
413페이로드가 너무 큼요청 바디가 10 MB 초과; 콘텐츠 크기를 줄이거나 요청을 분할하세요
416범위가 만족스럽지 않음Requested byte range is invalid for generated video content
429요청이 너무 많습니다속도 제한 초과; 재시도 전 Retry-After 헤더를 확인하세요
500서버 오류BazaarLink 내부 오류
502잘못된 게이트웨이모든 업스트림 공급자 실패; 장애 복구가 시도됨
503서비스를 이용할 수 없습니다이 모델에 구성된 업스트림 공급자 없음; 관리자에게 문의하세요
504게이트웨이 시간 초과Upstream connection or stream stalled and timed out
기계 판독 가능한 청구 코드
A 402 can represent different controls. Use these stable codes to choose the correct action.
코드
설명
budget_cap_reachedA weekly or monthly budget cap was reached; raise or reset the cap.
credit_limit_exceededA monthly-billing organization's credit line was exhausted; contact billing.
insufficient_creditsThe prepaid balance is insufficient; add credits.
spend_limit_exceededThe API key reached its daily, weekly, or monthly spend limit.
Stable error.code catalog
These string codes are emitted by public inference and media paths. Branch on the string code when present; the HTTP status remains the broad failure class.
모델 및 엔드포인트
모델 조회, 수명 주기, 가격 책정, 양식 및 엔드포인트 호환성 오류입니다.
코드
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
요청 및 안전
잘못된 매개변수, 컨텍스트, 도구, 스키마 및 콘텐츠 안전 거부.
코드
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
이미지 생성 및 편집
이미지 입력, 멀티파트 편집, 출력 및 이미지 파이프라인 오류입니다.
코드
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
업스트림 라우팅
공급자 연결, 인증, 제한 및 가용성 오류를 삭제했습니다.
코드
HTTP 상태
upstream_unreachable502
upstream_auth_failed502
upstream_rate_limited429
upstream_unavailable502/503
콘텐츠 검토
모든 요청은 모델로 전달되기 전에 자동 콘텐츠 검토를 거칩니다. 이용 정책을 위반하는 요청은 모델에 전달되지 않고 거부되며 403 오류가 반환됩니다.
차단되는 콘텐츠 카테고리
검토는 당사의 이용 정책(Acceptable Use Policy)에 따라 이루어지며, 주로 다음 카테고리의 콘텐츠를 차단합니다:
성적 착취 콘텐츠
폭력적 위협
불법 행위 실행 안내
생물학적 위해 관련 콘텐츠
403 응답 형식
검토에 의해 차단된 요청은 다음 형식의 오류를 반환합니다:
1
2
3
4
5
6
7
{"error":{"message":"Your prompt was blocked by content moderation.","type":"invalid_request_error","code":"content_filter"}}
These controls can reject an otherwise valid request and require different recovery actions.
제어
HTTP 상태
식별 방법
요청 속도 제한429숫자 코드 429; Retry-After 및 X-RateLimit-* 헤더를 사용합니다.
속도 제한 페널티 블록429숫자 코드 429 및 임시 제한 메시지; 재시도 후를 사용하십시오.
글로벌 소비 비상 브레이크503숫자 코드 503, 글로벌 지출 한도 메시지 및 30초 또는 300초 후 재시도.
Scoped spend brake429Numeric code 429 and a spend circuit-breaker message naming the scope.
청구 및 예산 관리402위에 나열된 안정적인 청구 문자열 코드를 사용하세요.
Compatibility note: rate-limit and emergency-brake paths currently emit numeric error.code values. Use HTTP status, Retry-After, and the documented response message.
비디오 및 미디어 리소스 상태
Video validation commonly returns numeric code 400. Missing jobs return 404, retired models 410, unfinished video content 409, and invalid video byte ranges 416.
재시도 정책
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.
백오프로 재시도
429, 502, 503, and 504. Check the original generation job before creating another after an ambiguous network failure.
재시도하기 전에 수정하세요
400, 401, 402, 403, 404, 409, 410, 413, and 416. Fix the request, credentials, balance, permissions, resource state, or Range header first.
오류 처리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 inrange(5):
try:
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Hello!"}],
)
breakexcept APIStatusError as error:
if error.status_code notin RETRYABLE or attempt == 4:
raise
retry_after = error.response.headers.get("Retry-After")
delay = (
float(retry_after)
if retry_after
elsemin(8, 0.5 * (2 ** attempt)) + random.uniform(0, 0.25)
)
time.sleep(delay)
스트리밍 오류 형식
토큰 스트리밍 전에 발생한 오류는 JSON 바디와 함께 표준 HTTP 오류 응답을 반환합니다.
After a stream starts, the HTTP response is already 200. Parse each SSE data frame and treat a top-level error or choices[0].finish_reason === "error" as a failed, incomplete response.
스트림이 중간에 실패하면 BazaarLink는 최상위 error 객체를 담은 마지막 SSE 이벤트를 보내고 이어서 data: [DONE]을 보냅니다. 일부 업스트림에서 그대로 전달되는 청크는 대신 choice에 오류를 담을 수 있습니다(choices[0].finish_reason === "error") — 두 경우 모두 처리하세요.
1
2
3
4
5
6
7
8
9
10
// If the stream fails mid-flight, BazaarLink emits a final SSE event
// with a top-level "error" object, followed by data: [DONE]
data: {"error":{"message":"Upstream stream interrupted. The response is incomplete.","type":"upstream_error","code":502}}
data: [DONE]
// Chunks relayed verbatim from some upstreams may instead carry the error
// inline on the choice: choices[0].finish_reason === "error" with an
// "error" object ({ code, message }) on the choice — handle both shapes.
// Branch on error.code; error.type can vary by failure path.
버전 관리
BazaarLink는 단일 안정 API 경로인 /api/v1을 제공합니다 — 관리해야 할 날짜 고정 버전이나 버전 헤더가 없습니다. API는 번호가 매겨진 릴리스가 아니라 지속적으로 발전합니다.
비파괴적 변경
다음은 사전 공지 없이 배포됩니다:
새 엔드포인트
카탈로그에 새 모델 추가
새로운 선택적 요청 매개변수
새로운 응답 필드
선택적 속성을 가진 새 스키마
추가 응답 상태/오류 코드
방어적으로 클라이언트를 작성하세요
인식하지 못하는 응답 필드는 무시하고, enum 형태 필드의 알 수 없는 값에서 실패하지 않도록 하세요 — 카탈로그와 기능이 늘어나면서 새 값이 추가됩니다.
파괴적 변경
이는 드물게 발생하며, 다음을 포함합니다:
엔드포인트, 매개변수, 응답 필드를 제거하거나 이름을 바꾸는 것
필드 타입을 변경하는 것
선택적 매개변수를 필수로 만드는 것
발생하더라도 파괴적 변경은 전체 /v1 표면이 아니라 특정 엔드포인트에만 적용됩니다 — 모든 연동을 한 번에 깨뜨릴 수 있는 단일 버전 업그레이드는 없습니다. 아직 Breaking 태그가 있는 공식 changelog는 게시하지 않습니다(아래 "최신 정보 확인" 참고) — 연동에 중요한 부분이라면, 문서화되지 않은 동작에 의존하기 전에 Support에 문의하세요.
지원 종료 정책
예상해야 할 유일한 정기적인 "파괴적" 이벤트: 업스트림 공급자가 지원을 종료함에 따라 개별 모델이 폐지됩니다. GET /v1/models로 모델의 현재 상태를 조회하세요.
1
2
3
4
5
6
7
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" } }
최신 정보 확인
아직 전용 API changelog나 RSS 피드는 게시하지 않습니다. 지금은 이 페이지를 직접 확인하거나, GET /v1/models로 모델 상태를 확인하거나, 중요한 연동에 사전 통지가 필요하면 Support에 문의하세요.
Support
Support
Hi! How can we help you? Send a message and we'll get back to you soon.