OpenAI 호환 API의 권장 Base URL:
https://api.alice.fans/v1는 기존 클라이언트와 계속 호환돼요. 새로 연동할 때는 https://api.alice.fans/api/v1를 사용해 주세요.
공개 모델 목록과 모델 요금 엔드포인트를 제외한 추론 엔드포인트는 요청 헤더에 API 키가 필요해요. 다음 두 가지 헤더를 지원해요:
- 권장:
Authorization: Bearer miyang-xxxxx - 대체:
x-api-key: miyang-xxxxx
API 키는 콘솔에서 만들고 암호화해 저장하며, API Keys 페이지에서 다시 확인하고 복사할 수 있어요.
# Bearer Token(推荐) curl https://api.alice.fans/api/v1/models \ -H "Authorization: Bearer miyang-xxx" # x-api-key(备用) curl https://api.alice.fans/api/v1/models \ -H "x-api-key: miyang-xxx"
모델 ID는 보통 {provider_slug}/{model_name} 형식이에요. miyang/auto로 자동 선택하거나, 모델 목록 또는 콘솔에서 다른 호출 ID를 복사할 수 있어요.
miyang/auto— 현재 요청에 맞는 모델을 자동으로 선택해요miyang/standard— 스탠다드 모델miyang/premium— 프리미엄 모델
miyang/* 모델은 Alice 클라이언트용이에요. 다른 앱이나 스크립트는 모델 목록에서 usage_scope가 general인 모델을 선택해 주세요.
# 自动选择适合当前请求的模型 model = "miyang/auto"
API 키마다 따로 집계되며, 기본값은 분당 60회이에요. 상한은 콘솔에서 조정할 수 있어요. 제한을 넘으면 429 Too Many Requests를 반환해요.
{
"error": {
"message": "Rate limit exceeded",
"type": "rate_limit_error",
"code": 1002
}
}
호출은 실제 사용량에 따라 실시간 정산돼요. 현재 가격은 콘솔과 모델 요금 응답을 확인하세요.
- 호출 전 잔액이 0보다 큰지 확인하며, 잔액이 부족하면
402를 반환해요 - prompt + completion 토큰 사용량으로 과금해요
- Prompt Cache를 지원하며
cache_read_tokens는 할인 요금으로 계산해요
콘솔에서 젤리빈을 충전하고, 사용량에서 호출과 소비 내역을 볼 수 있어요.
// 余额不足响应(402) { "error": { "message": "Insufficient balance", "type": "insufficient_balance", "code": 1004 } }
OpenAI 호환 대화 엔드포인트로, 스트리밍과 비스트리밍을 지원해요. OpenAI SDK의 base_url만 바꾸면 돼요.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| model 필수 | string | 모델 ID, 형식 provider_slug/model |
| messages 필수 | array | 대화 메시지 목록이며 각 항목은 role과 content를 포함해요 |
| stream | boolean | 스트리밍(SSE) 사용 여부, 기본값 false |
| temperature | float | 샘플링 온도, 범위 0–2 |
| max_tokens | integer | 최대 출력 토큰 수 |
| response_format | object | 구조화 출력 형식. 「구조화 출력」 섹션을 참고하세요 |
curl https://api.alice.fans/api/v1/chat/completions \ -H "Authorization: Bearer miyang-xxx" \ -H "Content-Type: application/json" \ -d '{ "model": "miyang/auto", "messages": [ {"role": "user", "content": "Hello!"} ], "stream": false }'
miyang/miyang-omni-v1은 오디오·비디오 이해, 회의록, 콘텐츠 분석을 위한 옴니모달 모델이에요. 하나의 사용자 메시지에 텍스트, 이미지, 오디오, 비디오를 함께 넣고 텍스트 결과를 받을 수 있어요.
miyang-asr을 사용하세요.
| 모델 정보 | 값 |
|---|---|
| 호출 ID | miyang/miyang-omni-v1 |
| 입력 모달리티 | 텍스트, 이미지, 오디오, 비디오를 조합 가능 |
| 출력 모달리티 | 텍스트(음성 생성 없음) |
| 컨텍스트 한도 | 1000000 tokens |
멀티모달 content 형식
| type | 설명 |
|---|---|
text | text 필드에 넣는 텍스트 지시 |
image_url | image_url.url에 넣는 공개 URL 또는 Base64 데이터 URL |
input_audio | input_audio.data에 넣는 공개 URL 또는 Base64 데이터 URL과 format |
video_url | video_url.url에 넣는 공개 비디오 URL 또는 Base64 데이터 URL |
Omni 확장 매개변수
| 매개변수 | 유형 | 설명 |
|---|---|---|
| reasoning_effort | string | none, low, medium, xhigh 중 하나예요. 업스트림 기본값은 xhigh이며, 전사나 빠른 요약에는 none을 권장해요. |
| use_multichannel | boolean | 스테레오 또는 4채널 FOA 공간 정보를 유지할지 정해요. 기본값은 false이며, 입력이 해당 채널 구성일 때만 켜세요. |
오디오 이해 예시
curl https://api.alice.fans/api/v1/chat/completions \ -H "Authorization: Bearer miyang-xxx" \ -H "Content-Type: application/json" \ -d '{ "model": "miyang/miyang-omni-v1", "reasoning_effort": "none", "messages": [{ "role": "user", "content": [ {"type": "text", "text": "이 녹음을 시간순으로 전사하고 요약해 주세요."}, {"type": "input_audio", "input_audio": { "data": "https://example.com/meeting.mp3", "format": "mp3" }} ] }], "stream": false }'
공개 엔드포인트이며 API 키가 필요 없어요. 현재 공개 모델을 반환하고, API 키를 넣으면 계정 권한에 따라 내부 또는 허용 목록 모델도 포함돼요. 응답 필드는 표준 OpenAI 형식에 context_length와 사용 범위 정보를 더해요.
{
"object": "list",
"data": [
{
"id": "miyang/auto",
"object": "model",
"owned_by": "miyang",
"name": "自动",
"model_type": "text",
"usage_scope": "alice",
"usage_hint": "请在 Alice 客户端内使用",
"context_length": 262144
}
]
}
현재 계정에서 볼 수 있는 모든 모델의 요금을 반환해요. API 키가 없으면 공개 모델을, 키가 있으면 계정 권한에 따른 내부 또는 허용 목록 모델도 포함해요.
모델 유형마다 과금 단위가 다르므로 billing_unit을 기준으로 확인하세요. rates에는 현재 적용 가격이, effective_pricing에는 기본가·시간대별 요금·프로모션 요금 여부가 표시돼요.
mili_per_usd에서 USD 잔액과 젤리빈의 환산 기준을 제공해요.
curl https://api.alice.fans/api/v1/pricing \
-H "Authorization: Bearer miyang-xxx"
{
"object": "pricing.list",
"mili_per_usd": 1000,
"data": [
{
"id": "miyang/auto",
"model_type": "text",
"currency": "USD",
"billing_mode": "tokens",
"billing_unit": "per_1m_tokens",
"effective_pricing": "<base | peak | promotion>",
"rates": {
"input": "<current rate>",
"output": "<current rate>",
"cache_read": "<current rate>",
"cache_write": "<current rate>"
}
}
]
}
OpenAI 호환 임베딩 엔드포인트예요. 모델이 벡터 작업을 지원하는지는 모델 목록과 콘솔 표시를 확인해 주세요.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| model 필수 | string | Embedding 모델 호출 ID |
| input 필수 | string / array | 벡터화할 텍스트 또는 텍스트 배열 |
| encoding_format | string | 벡터 인코딩 형식. 흔히 float를 사용해요 |
curl https://api.alice.fans/api/v1/embeddings \ -H "Authorization: Bearer miyang-xxx" \ -H "Content-Type: application/json" \ -d '{ "model": "provider/embedding-model", "input": "需要向量化的文本" }'
miyang/jev-1.13은 모든 Miyang API 사용자가 이용할 수 있는 저비용 구조화 결정 모델이며 엔진은 typesafe/jev-1.13으로 고정돼요. 대화 문장을 생성하지 않고 명시된 질문에 답해요. Alice의 장기 기억 사전 필터가 첫 번째 운영 사례예요.
Authorization: Bearer miyang-xxx로 호출할 수 있어요. /api/v1/chat/completions과 다른 전용 Decisions 프로토콜을 사용하므로 Chat 전용 /api/v1/models 목록에는 섞이지 않아요.
| 모델 정보 | 값 |
|---|---|
| Miyang 모델 ID | miyang/jev-1.13 |
| 결정 엔진 | typesafe/jev-1.13 |
| 컨텍스트 한도 | 32768 tokens |
| 질문 유형 | noul / choice / score |
| 사용 범위 | 유효한 Miyang API 키를 가진 모든 사용자 |
요청에는 등록된 Decisions 모델 셸을 지정해야 해요. Gateway는 해당 셸로 과금하면서 실제 업스트림 엔진을 고정해요. state에는 판단할 구조화 컨텍스트를, questions에는 답할 질문을 넣어요.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| model 필수 | string | 공개 호출에는 miyang/jev-1.13을 사용해요. 일반 API 사용자는 내부 시나리오 셸을 호출할 수 없어요. |
| state 필수 | object | 결정에 사용할 구조화 상태예요. 호출자는 전송 전에 불필요한 민감 정보를 제거해야 해요. |
| questions 필수 | object | 질문 이름을 키로 하는 객체이며 1개 이상 24개 이하예요. |
| questions.*.type 필수 | string | noul(0–1 확률), choice 또는 score. |
| questions.*.instructions 필수 | string | 모델이 판단할 내용을 명확하게 설명해요. |
| questions.*.criteria | object | 선택 사항. 각 답이나 점수의 의미를 설명해 모호함을 줄여요. |
요청 본문은 최대 64 KiB, 질문은 최대 24개예요. 서버는 state 본문이나 결정 답변을 기록하지 않고 질문 수, 지연 시간, 토큰 사용량만 저장해요.
curl https://api.alice.fans/api/v1/decisions \ -H "Authorization: Bearer miyang-xxx" \ -H "Content-Type: application/json" \ -d '{ "model": "miyang/jev-1.13", "state": {"dialog": "사용자가 일반적인 기술 질문을 했어요"}, "questions": { "remember": { "type": "noul", "instructions": "이 대화에 장기 보관할 가치가 있는 정보가 있나요?", "criteria": { "true": "안정적인 신원, 장기 선호 또는 명시적인 관계 사건", "false": "일회성 작업, 일반 질의응답 또는 가벼운 대화" } } } }'
{
"model": "miyang/jev-1.13",
"provider": "miyang",
"answers": {
"remember": {
"type": "noul",
"noul": 0.02
}
}
}
OpenAI 호환 이미지 생성 엔드포인트예요. 텍스트 프롬프트로 이미지를 만들고 URL 또는 Base64를 반환하며, OpenAI Images API와 완전히 호환돼요.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| model 필수 | string | 모델 ID, 형식 provider/model, 예: ts/gpt-image-2 |
| prompt 필수 | string | 이미지 설명 텍스트 |
| n | integer | 생성할 이미지 수. 기본값 1, 여러 장 가능 |
| size | string | 이미지 크기. 자주 쓰는 값: 1024x1024(정사각), 1024x1536(세로), 1536x1024(가로), auto(모델이 선택). 긴 변 최대 3840px, 양쪽은 16의 배수, 장단비는 3:1 이하 |
| quality | string | 렌더 품질: low(빠른 초안), medium, high, auto(기본, 모델이 선택) |
| output_format | string | 출력 형식: png(기본), jpeg(더 빠름), webp |
| output_compression | integer | 압축률 0–100. JPEG / WebP만 적용돼요 |
| background | string | opaque(기본) 또는 transparent(투명 배경, 아이콘/스티커에 적합) |
| moderation | string | 콘텐츠 검열: auto(기본) 또는 low(느슨함) |
기본 예제 — 텍스트-이미지:
curl https://api.alice.fans/api/v1/images/generations \ -H "Authorization: Bearer miyang-xxx" \ -H "Content-Type: application/json" \ -d '{ "model": "ts/gpt-image-2", "prompt": "A children'\''s book drawing of a veterinarian listening to the heartbeat of a baby otter", "size": "1024x1024", "quality": "high" }'
from openai import OpenAI import base64 client = OpenAI( api_key="miyang-xxx", base_url="https://api.alice.fans/api/v1", timeout=180.0, # 图像生成需要较长超时 ) result = client.images.generate( model="ts/gpt-image-2", prompt="A children's book drawing of a veterinarian listening to the heartbeat of a baby otter", size="1024x1024", quality="high", ) print(result.data[0].url)
고급 예제 — JPEG 출력 + 압축 + 로컬 저장:
import httpx, json, base64 resp = httpx.post( "https://api.alice.fans/api/v1/images/generations", headers={"Authorization": "Bearer miyang-xxx"}, json={ "model": "ts/gpt-image-2", "prompt": "A serene Japanese garden with a koi pond", "size": "1536x1024", "quality": "medium", "output_format": "jpeg", # jpeg 比 png 更快 "output_compression": 80, # 压缩率 0-100 }, timeout=180.0, ) data = resp.json() print(data["data"][0]["url"])
// 响应示例 { "created": 1779691963, "data": [ { "url": "https://image.token-recyclebin.com/images/2026/05/25/xxx.png", "revised_prompt": "A serene Japanese garden with a koi pond..." } ] }
크기와 품질 참고
| 매개변수 | 선택값 | 설명 |
|---|---|---|
| size | 1024x1024(정사각)1536x1024(가로)1024x1536(세로)2048x2048(2K)3840x2160(4K 가로)auto | 긴 변 ≤ 3840px, 양쪽은 16의 배수, 비율 ≤ 3:1, 총 픽셀 655,360 – 8,294,400 |
| quality | low · medium · high · auto | low가 가장 빠르고 초안·반복에 좋아요. high가 가장 정밀하고 최종 출력에 좋아요 |
| output_format | png · jpeg · webp | jpeg가 png보다 빨라서 지연에 민감한 상황에 우선 사용해요 |
OpenAI 호환 이미지 편집 엔드포인트예요. 참조 이미지를 한 장 이상 올리고 텍스트 프롬프트로 새 이미지를 만들어요. 부분 편집(mask)과 여러 장 합성을 지원하며, 요청은 multipart/form-data 형식이에요.
대표 사용 예:
- 스타일 변환 — 사진 업로드 + "유화 스타일로 바꿔 주세요"
- 여러 장 합성 — 여러 소재 업로드 + "이 물건들이 들어간 선물 바구니를 만들어 주세요"
- 부분 편집 — 원본 + mask + "마스크 영역에 플라밍고를 추가해 주세요"
| 매개변수 | 유형 | 설명 |
|---|---|---|
| model 필수 | string | 모델 ID, 예: ts/gpt-image-2 |
| image 필수 | file / file[] | 참조 이미지. 한 장은 image, 여러 장은 image[]( image[]=@file.png를 여러 번) |
| prompt 필수 | string | 편집 지시 설명 |
| mask | file | 마스크 이미지(알파 채널 필요). 투명 영역이 편집 대상이에요. 여러 장일 때 mask는 첫 장에 적용돼요 |
| n | integer | 생성 수, 기본값 1 |
| size | string | 출력 크기. 기본값 auto. Generations와 같은 크기 옵션을 지원해요 |
| quality | string | low · medium · high · auto |
한 장 편집 — 스타일 변환:
curl https://api.alice.fans/api/v1/images/edits \ -H "Authorization: Bearer miyang-xxx" \ -F "model=ts/gpt-image-2" \ -F "prompt=Turn this photo into a Studio Ghibli style illustration" \ -F "image=@photo.png" \ -F "size=1536x1024"
from openai import OpenAI client = OpenAI( api_key="miyang-xxx", base_url="https://api.alice.fans/api/v1", timeout=180.0, ) result = client.images.edit( model="ts/gpt-image-2", image=open("photo.png", "rb"), prompt="Turn this photo into a Studio Ghibli style illustration", ) print(result.data[0].url)
여러 장 합성 — 여러 소재를 한 장으로:
# 多图参考:用 image[] 传多张 curl https://api.alice.fans/api/v1/images/edits \ -H "Authorization: Bearer miyang-xxx" \ -F "model=ts/gpt-image-2" \ -F "image[]=@lotion.png" \ -F "image[]=@soap.png" \ -F "image[]=@candle.png" \ -F 'prompt=A gift basket on a white background containing all these items'
부분 편집 — mask 사용:
# mask 需要有 alpha 通道,透明区域为编辑区 result = client.images.edit( model="ts/gpt-image-2", image=open("room.png", "rb"), mask=open("mask.png", "rb"), prompt="Add a flamingo in the pool area", quality="high", ) print(result.data[0].url)
AI 이미지를 반복해서 참조하거나 생성하는 과정에서 누적된 격자, 비늘, 기와 모양 등의 주기적 아티팩트를 제거해야 할 때 사용합니다. 원본 이미지를 백그라운드에서 진단·정화하고 필요하면 재생성한 뒤 품질까지 검증하여, 게시·인쇄·후속 편집에 바로 쓸 수 있는 깨끗한 결과물을 제공합니다.
Idempotency-Key는 필수입니다. 네트워크 시간 초과 후 같은 값을 사용하면 기존 작업을 반환하며, 다른 이미지나 매개변수에 재사용하면 409를 반환합니다.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| image 필수 | file | 복원할 이미지. PNG, JPEG, WebP, 최대 40MB 및 8.3MP |
| allow_regen | boolean | 규칙 기반 정화가 충분하지 않을 때 재생성을 허용할지 여부. 기본값 true |
| max_regen | integer | 최대 재생성 횟수, 1–2. 기본값 2 |
curl https://lab.miyang.cn/ripple/api/v1/jobs \ -H "Authorization: Bearer miyang-xxx" \ -H "Idempotency-Key: restore-order-001" \ -F "image=@photo.png" \ -F "allow_regen=true" \ -F "max_regen=2"
{
"id": "rp-api-...",
"object": "ripple.job",
"status": "queued",
"phase": "queued",
"result": null,
"error": null
}
작업 생성 후 진행 상황과 최종 결과물을 가져올 때 사용합니다. 비동기 조회 방식이므로 연결을 계속 유지하거나 사용자를 기다리게 할 필요가 없으며, 성공하면 완성된 결과물 링크를 받을 수 있습니다.
status는 queued, processing, succeeded, failed, cancelled 또는 expired일 수 있습니다. 성공하면 result.artifacts에 최종 결과물과 과정 파일이 표시됩니다.
curl https://lab.miyang.cn/ripple/api/v1/jobs/rp-api-... \
-H "Authorization: Bearer miyang-xxx"
{
"id": "rp-api-...",
"status": "succeeded",
"result": {
"outcome": "delivered",
"regen_rounds": 1,
"artifacts": [
{
"name": "photo_restored.png",
"primary": true,
"url": "https://lab.miyang.cn/ripple/api/v1/jobs/rp-api-.../artifacts/photo_restored.png"
}
]
},
"error": null
}
비동기 비디오 생성 엔드포인트예요. 생성 요청이 성공하면 task_id를 반환해요. 같은 요청을 다시 보내지 말고 조회 엔드포인트로 상태를 확인해 주세요.
miyang/h3, miyang/h3-max예요.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| model 필수 | string | miyang/h3 또는 miyang/h3-max |
| content 필수 | array | 정확히 하나의 비어 있지 않은 텍스트를 포함하는 멀티모달 배열이며 이미지, 비디오, 오디오를 함께 넣을 수 있어요 |
| duration 필수 | integer | 출력 길이(초). H3는 4–15초, H3 Max는 5–15초를 지원해요 |
| resolution | string | 기본값 768P. H3는 768P / 2K, H3 Max는 480P / 768P를 지원해요 |
| ratio | string | 화면 비율: 21:9, 16:9, 4:3, 1:1, 3:4, 9:16. 참조 미디어는 adaptive를 사용할 수 있어요 |
| aigc_watermark | boolean | AIGC 워터마크 추가 여부 |
| extra | object | H3 Max 전용. prompt_expansion_mode는 disabled, balanced, quality 중 하나예요 |
content 미디어 형식
| type | role | 설명 |
|---|---|---|
| text | — | 정확히 한 개가 필요하며 최대 7,000자예요 |
| image_url | first_frame / last_frame / reference_image | 첫 프레임, 마지막 프레임 또는 참조 이미지. role이 없는 이미지 한 장은 첫 프레임으로 처리돼요 |
| video_url | reference_video | 참조 비디오, 최대 3개. role이 필요해요 |
| audio_url | reference_audio | 참조 오디오, 최대 3개. role이 필요해요 |
curl https://api.alice.fans/api/v1/videos/generations \ -H "Authorization: Bearer miyang-xxx" \ -H "Idempotency-Key: alice-video-001" \ -H "Content-Type: application/json" \ -d '{ "model": "miyang/h3", "content": [ {"type": "text", "text": "A lamb runs across a sunlit meadow"} ], "duration": 5, "resolution": "768P", "ratio": "16:9" }'
{
"task_id": "443429054845209"
}
생성 시 받은 task_id로 조회해요. 상태는 queued, running, succeeded, failed, cancelled 중 하나예요. 5–15초 간격으로 조회하는 것을 권장해요.
curl https://api.alice.fans/api/v1/videos/generations/443429054845209 \
-H "Authorization: Bearer miyang-xxx"
{
"task": {
"status": "succeeded",
"resolution": "768P",
"duration": 5,
"content": {
"url": "https://signed.example/video.mp4",
"drive_file_id": "drv-xxx",
"size_bytes": 1757278,
"expires_in": 3600
}
}
}
처리 중인 작업을 취소하고 과금 보류를 해제해요. 연결된 Miyang Drive 파일도 함께 삭제돼요. 완료된 작업을 업스트림에서 취소할 수 없는 경우 엔드포인트 응답을 따라 주세요.
curl -X DELETE https://api.alice.fans/api/v1/videos/generations/443429054845209 \
-H "Authorization: Bearer miyang-xxx"
miyang-asr로 녹음이 끝난 오디오·비디오 파일을 비동기로 전사합니다. 30개 언어와 다양한 중국어 방언을 지원하며 화자를 구분할 수 있습니다. 생성 시 작업 ID가 반환되며, 조회 API로 전문, 구간, 화자, 길이를 받습니다.
multipart/form-data로 직접 업로드하는 파일은 50 MB까지이며 현재 사용자의 Miyang 드라이브에 자동 저장되어 용량에 포함됩니다. file_url은 공개 HTTP(S) 파일을 최대 2 GB·12시간까지 지원하며 드라이브에 복사하지 않습니다.
기존 모델명 miyang/transcription와 miyang/transcription-realtime도 계속 사용할 수 있으며 miyang-asr와 miyang-asr-realtime로 자동 매핑됩니다. 기존 코드는 수정할 필요가 없습니다.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| model | string | miyang-asr(또는 miyang/miyang-asr)를 입력합니다. 생략 시 이 모델을 사용합니다 |
| file | file | file_url과 둘 중 하나. mp3, wav, m4a, aac, flac, ogg, opus, mp4, mov, mkv, webm 등을 지원하며 직접 업로드는 50 MB 이하 |
| file_url | string | file과 둘 중 하나. 공개 IP로 해석되는 HTTP(S) 주소, 최대 2 GB·12시간 |
| source_language | string | 기본값 auto(자동 인식). cn, en, yue, ja, ko 지정 가능. multilingual은 language_hints와 함께 사용하며, fspk는 중국어·영어 혼용을 뜻합니다 |
| language_hints | array / string | source_language=multilingual일 때만 사용. cn, en, yue, ja, ko, de, fr, ru 중 최대 4개 |
| diarization | boolean | 화자 구분 여부, 기본값 true. 사용 시 2시간 이하 오디오를 권장합니다 |
| speaker_count | integer | 예상 화자 수. 0은 자동 판단, 지정 시 2–100 |
업스트림이 보고한 토큰 사용량으로 과금하며 오디오 입력 토큰과 텍스트 출력 토큰의 단가가 다릅니다. 현재 가격과 최종 차감액은 콘솔 사용 내역을 기준으로 합니다.
작업 생성 시 12시간 분량 오디오 기준으로 젤리빈을 동결하고, 완료 후 실제 사용량만 차감하고 차액을 해제합니다. 실패한 작업은 과금하지 않습니다.
예시 1: 파일을 업로드하고 Miyang 드라이브에 저장
curl https://api.alice.fans/api/v1/audio/transcriptions \ -H "Authorization: Bearer miyang-xxx" \ -H "Idempotency-Key: meeting-20260921" \ -F "model=miyang-asr" \ -F "source_language=cn" \ -F "diarization=true" \ -F "file=@meeting.m4a"
예시 2: 공개 파일 URL 제출(대용량 파일에 권장)
curl https://api.alice.fans/api/v1/audio/transcriptions \ -H "Authorization: Bearer miyang-xxx" \ -H "Idempotency-Key: archive-001" \ -H "Content-Type: application/json" \ -d '{ "model": "miyang-asr", "file_url": "https://example.com/recording.mp3", "source_language": "multilingual", "language_hints": ["cn", "en"] }'
{
"id": "6f3a...task",
"object": "audio.transcription.job",
"status": "processing",
"model": "miyang/miyang-asr",
"request_id": "3d7e...request",
"source_file_id": "drv-..."
}
생성 응답의 id로 5–15초마다 조회하는 것을 권장해요. 제출 결과가 불확실하면 request_id로도 같은 작업을 조회할 수 있어요.
curl https://api.alice.fans/api/v1/audio/transcriptions/6f3a...task \
-H "Authorization: Bearer miyang-xxx"
{
"id": "6f3a...task",
"object": "audio.transcription.job",
"status": "completed",
"model": "miyang/miyang-asr",
"text": "Meeting transcript...",
"duration": 93.4,
"segments": [
{"speaker": "0", "start": 0.0, "end": 5.2, "text": "..."}
],
"usage": {
"audio_seconds": 93.4,
"duration_ms": 93400,
"input_tokens": 3270,
"output_tokens": 412
},
"source_file_id": "drv-..."
}
주요 오류:402는 젤리빈 부족, 409는 다른 요청에 동일 멱등 키 사용, 411/413은 업로드 길이 누락 또는 50 MB 초과, 429는 속도 제한, 503 submission_uncertain은 업스트림 결과 확인 중을 뜻해요.
실시간 기록을 만든 뒤 응답의 일회용 stream_url에 연결합니다. PCM을 직접 보내거나 WAV, MP3, AAC, Ogg, WebM, M4A 같은 일반적인 오디오 스트림을 보낼 수 있습니다. Miyang이 실시간 인식에 가장 적합한 내부 형식으로 자동 디코딩하고 통합 인식 이벤트를 반환하므로 클라이언트는 특정 인식 경로에 맞출 필요가 없습니다.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| model | string | miyang-asr-realtime(또는 miyang/miyang-asr-realtime)을 입력합니다. 생략 시 이 모델을 사용합니다 |
| format | string | pcm / wav / mp3 / aac / opus / speex / ogg / webm / m4a / mp4 |
| sample_rate | integer | 16000 지원. 중국어만 8000도 지원 |
| source_language | string | cn / en / yue / ja / ko / multilingual |
| language_hints | array | source_language=multilingual일 때만 사용. 실시간 인식은 첫 번째 힌트만 사용합니다 |
| prompt | string | 선택형 인식 컨텍스트로 최대 400자입니다. 이름, 제품명, 회의 주제, 전문 용어 또는 바로 앞 문장을 넣어 정확도를 높일 수 있습니다. 응답 형식을 바꾸지 않으며 일반 대화용 시스템 프롬프트가 아닙니다 |
| output_level | integer | 1 = 완성된 문장만, 2 = 중간 결과와 완성 문장(기본값) |
| max_duration_seconds | integer | 이번 실시간 스트림의 최대 초, 1–86400. 이 상한으로 젤리빈을 동결하고 종료 후 실제 사용량으로 정산합니다 |
형식 규칙: opus와 speex는 Ogg 컨테이너, aac는 ADTS, m4a/mp4는 스트리밍 가능한 fragmented MP4를 사용합니다. 브라우저에는 WebM/Opus, Apple 클라이언트에는 M4A/AAC를 권장하며, 디코딩·모노 변환·리샘플링은 Miyang이 처리합니다.
컨텍스트 강화 예시
prompt에는 모델에게 작업을 지시하는 문장보다 다음 음성에 등장할 가능성이 높은 사실 배경을 적으세요. 이어질 내용과 가까울수록 이름, 제품명, 전문 용어를 더 정확히 인식합니다.
| 사용 사례 | 권장 prompt |
|---|---|
| 이름과 고유명사 | 참석자는 Luo Xiaoshan과 Eason이며, 제품명은 Miyang, 프로젝트명은 Xingchao입니다. |
| 회의 또는 수업 배경 | 스크린샷 클라우드 라이브러리, 저장 용량 예산, 7일 삭제 대기 영역을 논의하는 제품 주간 회의입니다. |
| 앞 문맥 이어가기 | 이전 구간에서는 실시간 음성 인식을 논의했고, 다음에는 컨텍스트 강화와 동적 업데이트를 설명합니다. |
| 세션 중 주제 전환 | 다음 주제는 Luo Xiaoshan이 담당하는 Xingchao 출시 계획입니다. |
curl https://api.alice.fans/api/v1/audio/transcriptions/realtime \ -H "Authorization: Bearer miyang-xxx" \ -H "Idempotency-Key: live-meeting-001" \ -H "Content-Type: application/json" \ -d '{ "model": "miyang-asr-realtime", "format": "pcm", "sample_rate": 16000, "source_language": "cn", "prompt": "这是一场米羊产品会议,参会人包括洛小山,项目名称是星潮计划。", "max_duration_seconds": 300, "output_level": 2 }'
{
"id": "realtime-task-id",
"status": "ready",
"mode": "realtime",
"model": "miyang/miyang-asr-realtime",
"stream_url": "wss://api.alice.fans/api/v1/audio/transcriptions/realtime/.../stream?token=...",
"stream_token_expires_in": 600
}
stream_url은 10분간 유효하며 한 번만 연결할 수 있고, 연결되면 인식이 시작된 것입니다. 생성 파라미터에 맞는 오디오 바이트를 계속 보내면 Miyang이 형식 변환과 말 사이의 정지를 자동으로 처리합니다. 끝낼 때는 {"header":{"name":"StopTranscription"}}을 보내면 서버가 마지막 SentenceEnd와 TranscriptionCompleted를 보낸 뒤 1000으로 연결을 닫습니다. 연결을 바로 닫아도 됩니다. 이후 공통 조회 API로 전문과 정산 결과를 확인하세요. 서버 이벤트는 JSON이며 header.name 값은 다음과 같습니다.
상황이 바뀌면 같은 WebSocket에서 {"type":"context.update","prompt":"接下来讨论星潮计划的发布安排。"}를 보내세요. 새 prompt는 이후 오디오에 적용되며 Miyang은 수락 후 ContextUpdated를 반환합니다.
// 주제가 바뀌면 이후 음성에 사용할 컨텍스트를 업데이트합니다 ws.send(JSON.stringify({ type: "context.update", prompt: "다음 주제는 Luo Xiaoshan이 담당하는 Xingchao 출시 계획입니다." })); // ContextUpdated를 받은 뒤 계속 음성을 전송합니다 ws.send(nextAudioChunk);
| 이벤트 | 설명 |
|---|---|
| SentenceBegin | 문장 시작 감지. payload에 문장 번호 index와 시작 시각 time(ms) 포함 |
| TranscriptionResultChanged | 현재 문장의 중간 결과, payload.result가 최신 텍스트. output_level=1이면 보내지 않음 |
| SentenceEnd | 문장 종료. payload에 최종 result, begin_time, time, 단어별 시간 words 포함 |
| ContextUpdated | Miyang이 context.update를 수락했으며 새 prompt가 이후 오디오에 적용됩니다 |
| ContextUpdateFailed | context.update가 검증을 통과하지 못했습니다. payload.status_text에서 원인을 확인하고 수정한 prompt로 다시 시도할 수 있습니다 |
| TranscriptionCompleted | 인식 작업 종료, 이후 서버가 연결을 닫음 |
| TaskFailed | 인식 실패. header.status는 40000000, payload.status_text에 사유. 이후 서버가 1011로 연결을 닫음 |
{
"header": {"namespace": "SpeechTranscriber", "name": "SentenceEnd", "status": 20000000},
"payload": {
"index": 1,
"begin_time": 0,
"time": 1820,
"result": "今天的会议先同步进度。",
"words": [{"text": "今天", "startTime": 0, "endTime": 320, "punctuation": ""}]
}
}
같은 전사 API에서 model을 miyang-asr-flash로 지정하면 비동기 작업 없이 인식 텍스트를 바로 반환합니다. 5분 이내 오디오에 적합하며, 더 긴 녹음은 miyang-asr를 사용하세요. 요청 본문은 녹음 파일 전사와 같고 file과 file_url 중 하나를 사용합니다.
업스트림이 보고한 토큰 사용량으로 과금하며 성공 시 즉시 차감합니다. 실패는 과금하지 않습니다.
curl https://api.alice.fans/api/v1/audio/transcriptions \ -H "Authorization: Bearer miyang-xxx" \ -F "model=miyang-asr-flash" \ -F "file=@voice-note.m4a"
{
"text": "明天上午十点提醒我开会。",
"model": "miyang/miyang-asr-flash",
"usage": {"input_tokens": 125, "output_tokens": 9, "total_tokens": 134},
"request_id": "3d7e...request"
}
오디오 바이너리를 동기로 반환하며 Content-Type은 response_format에 대응합니다. miyang-tts-v1는 실시간 상호작용에 최적화되어 음색, 음높이, 스타일 지시를 지원합니다. miyang-tts-v1-pro는 통합 오디오 생성 모델로 현재 단일 화자 합성을 제공하며 참고 오디오를 넣을 수 있습니다.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| model | string | miyang-tts-v1 또는 miyang-tts-v1-pro |
| input | string | 합성할 텍스트(text도 가능). v1 최대 20000자, v1 Pro 최대 3000자 |
| voice | string | 음색 ID, 기본값 longanhuan_v3.1. v1 전용 |
| response_format | string | mp3(기본값), wav, pcm. v1은 opus도 지원 |
| sample_rate | integer | 8000, 16000, 22050, 24000, 44100, 48000. v1 기본 24000, v1 Pro 기본 48000이며 22050 미지원 |
| speed | number | 말하기 속도 0.5–2, 기본값 1 |
| volume | number | 음량 0–100, 기본값 50 |
| pitch | number | 음높이 0.5–2, 기본값 1. v1 전용 |
| instruction | string | 자연어 스타일 지시, 최대 500자. v1 전용 |
| references | array | 참고 오디오 최대 3개, 각 항목은 audio_url 또는 audio_data 중 하나. v1 Pro 전용 |
업스트림이 보고한 입력·출력 토큰으로 과금하며, 사용량은 응답 헤더 X-Usage-Input-Tokens와 X-Usage-Output-Tokens에도 표시됩니다.
curl https://api.alice.fans/api/v1/audio/speech \ -H "Authorization: Bearer miyang-xxx" \ -H "Content-Type: application/json" \ -d '{ "model": "miyang-tts-v1", "input": "欢迎使用米羊语音合成。", "voice": "longanhuan_v3.1", "response_format": "mp3" }' \ --output speech.mp3
miyang-omni-v1-realtime은 전이중 음성 대화 모델입니다. WebSocket으로 연결하고 Authorization: Bearer miyang-xxx 요청 헤더로 인증합니다. Miyang은 Realtime 프로토콜의 클라이언트·서버 이벤트(session.update, input_audio_buffer.append, response.create, response.audio.delta 등)를 그대로 전달합니다.
거부된 연결의 종료 코드: 4401 인증 실패, 4402 미립 부족, 4403 모델 권한 없음, 4429 요청 제한, 4503 경로 사용 불가.
import WebSocket from "ws"; const ws = new WebSocket( "wss://api.alice.fans/api/v1/realtime?model=miyang-omni-v1-realtime", { headers: { Authorization: "Bearer miyang-xxx" } } ); ws.on("open", () => { ws.send(JSON.stringify({ type: "session.update", session: { modalities: ["text", "audio"] } })); // then send input_audio_buffer.append (Base64 PCM) and read response.audio.delta }); ws.on("message", (data) => console.log(JSON.parse(data).type));
에이전트와 앱에 실시간 웹 기능을 제공해요: 웹 검색, 뉴스 검색, 페이지 본문 읽기. 모두 GET이며 추론과 같은 API 키로 인증해요(Authorization: Bearer miyang-xxx).
| 엔드포인트 | 매개변수 | 설명 |
|---|---|---|
| /api/v1/websearch/search | q | 심층 검색: 결과에 페이지 본문 추출과 재정렬 컨텍스트가 있어 RAG에 좋아요 |
| /api/v1/websearch/simple-search | q | 빠른 검색: 제목과 요약만 반환하며 더 빨라요 |
| /api/v1/websearch/reader | url | 페이지 읽기: 지정 URL을 가져와 깨끗한 텍스트로 변환해요 |
| /api/v1/websearch/search-news | q | 뉴스 검색: 최근 뉴스 소스만 검색하며 결과에도 검색 컨텍스트가 있어요 |
전체 파이프라인: 검색 → 페이지 추출 → 벡터 검색 → 재정렬. 각 결과에 contexts 본문 조각이 있어 모델에 바로 넣어 인용 답변을 만들 수 있어요. 응답은 보통 3–8초예요.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| q 필수 | string | 검색 키워드 |
curl "https://api.alice.fans/api/v1/websearch/search?q=最新AI新闻" \ -H "Authorization: Bearer miyang-xxx"
// 响应示例 { "code": 200, "message": "ok", "took_ms": 4200, "data": { "organic": [ { "title": "AI News", "link": "https://example.com", "snippet": "Latest updates...", "contexts": [ { "idx": 0, "text": "..." } ] } ] } }
검색만 하고 페이지 추출·재정렬은 하지 않아요. 보통 1초 안에 돌아와요. 제목 + 요약 + 링크만 필요할 때 쓰면 좋아요. 답변 카드에 히트하면 응답에 answerBox 필드가 추가로 들어가요.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| q 필수 | string | 검색 키워드 |
curl "https://api.alice.fans/api/v1/websearch/simple-search?q=最新AI新闻" \ -H "Authorization: Bearer miyang-xxx"
// 响应示例 { "code": 200, "message": "ok", "took_ms": 950, "data": { "answerBox": { "title": "Latest AI news", "snippet": "..." }, "organic": [ { "title": "AI News", "link": "https://example.com", "snippet": "Latest updates..." } ] } }
대상 페이지 URL을 이미 알 때 페이지를 가져와 깨끗한 Markdown으로 변환해요. 이 엔드포인트는 최상위 content를 반환하며 data가 아니에요.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| url 필수 | string | 읽을 웹페이지 주소. http:// 또는 https://로 시작해야 해요 |
curl "https://api.alice.fans/api/v1/websearch/reader?url=https://go.dev" \ -H "Authorization: Bearer miyang-xxx"
// 响应示例(content 为页面正文) { "code": 200, "message": "ok", "content": "# The Go Programming Language\n\nGo is an open source programming language..." }
최근 뉴스 소스만 검색해요. 나머지 파이프라인은 심층 검색과 같고, 결과에도 contexts 본문 조각이 있어요.
404를 반환해요(본문 {"code": 404, "message": "no search results"}). 정상적인 업무 결과이며 차감하지 않아요.
| 매개변수 | 유형 | 설명 |
|---|---|---|
| q 필수 | string | 뉴스 검색 키워드 |
curl "https://api.alice.fans/api/v1/websearch/search-news?q=OpenAI" \ -H "Authorization: Bearer miyang-xxx"
// 响应示例 { "code": 200, "message": "ok", "took_ms": 4200, "data": { "organic": [ { "title": "Latest OpenAI news", "link": "https://example.com/news", "snippet": "Recent product and research updates...", "contexts": [ { "idx": 0, "text": "..." } ] } ] } }
요청 본문에 "stream": true을 넣으면 스트리밍이 켜져요. 응답 형식은 OpenAI SSE 규격과 완전히 호환돼요. 스트림 종료 표시는 data: [DONE]이에요.
from openai import OpenAI client = OpenAI( api_key="miyang-xxx", base_url="https://api.alice.fans/api/v1", ) stream = client.chat.completions.create( model="miyang/auto", messages=[{"role": "user", "content": "Hello!"}], stream=True, ) for chunk in stream: print(chunk.choices[0].delta.content, end="")
response_format 필드를 그대로 전달하며 JSON Schema를 지원해요. 출력 형식은 업스트림 모델이 보장하고, 플랫폼은 추가로 가공하지 않아요.
{
"model": "miyang/auto",
"messages": [...],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "result",
"schema": {
"type": "object",
"properties": {
"answer": { "type": "string" }
}
}
}
}
}
Prompt Cache를 지원하는 모델은 업스트림이 반환한 캐시 히트 토큰을 할인 요금으로 과금해요. 플랫폼은 업스트림 usage 필드를 그대로 전달하고, 청구서에 캐시 히트량이 보여요.
공급업체마다 필드 이름이 달라요:
cache_read_input_tokens— Anthropicprompt_cache_hit_tokens— DeepSeekcached_tokens— OpenAI
{
"usage": {
"prompt_tokens": 1000,
"completion_tokens": 200,
"cache_read_input_tokens": 800, // Anthropic
"prompt_cache_hit_tokens": 800, // DeepSeek
"cached_tokens": 800 // OpenAI
}
}
base_url과 api_key만 바꾸면 OpenAI SDK로 호출할 수 있어요.
from openai import OpenAI client = OpenAI( api_key="miyang-xxx", base_url="https://api.alice.fans/api/v1", ) resp = client.chat.completions.create( model="miyang/auto", messages=[{"role": "user", "content": "Hello!"}], ) print(resp.choices[0].message.content)
SDK 설치 없이 API Key, 연결 상태, 요청 파라미터를 빠르게 검증할 수 있어 첫 연동이나 호출 문제 진단에 적합합니다.
# 非流式 curl https://api.alice.fans/api/v1/chat/completions \ -H "Authorization: Bearer miyang-xxx" \ -H "Content-Type: application/json" \ -d '{ "model": "miyang/auto", "messages": [{"role": "user", "content": "Hello"}] }' # 流式 curl https://api.alice.fans/api/v1/chat/completions \ -H "Authorization: Bearer miyang-xxx" \ -H "Content-Type: application/json" \ -d '{ "model": "miyang/auto", "messages": [{"role": "user", "content": "Hello"}], "stream": true }'