Base URL

OpenAI 호환 API의 권장 Base URL:

https://miyang.cn/api/v1
이전 주소 https://miyang.cn/v1는 기존 클라이언트와 계속 호환돼요. 새로 연동할 때는 https://miyang.cn/api/v1를 사용해 주세요.
인증

공개 모델 목록과 모델 요금 엔드포인트를 제외한 추론 엔드포인트는 요청 헤더에 API 키가 필요해요. 다음 두 가지 헤더를 지원해요:

  • 권장:Authorization: Bearer miyang-xxxxx
  • 대체:x-api-key: miyang-xxxxx

API 키는 콘솔에서 만들고 암호화해 저장하며, API Keys 페이지에서 다시 확인하고 복사할 수 있어요.

bash
# Bearer Token(推荐)
curl https://miyang.cn/api/v1/models \
  -H "Authorization: Bearer miyang-xxx"

# x-api-key(备用)
curl https://miyang.cn/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인 모델을 선택해 주세요.

python
# 自动选择适合当前请求的模型
model = "miyang/auto"
속도 제한

API 키마다 따로 집계되며, 기본값은 분당 60회이에요. 상한은 콘솔에서 조정할 수 있어요. 제한을 넘으면 429 Too Many Requests를 반환해요.

http
{
  "error": {
    "message": "Rate limit exceeded",
    "type": "rate_limit_error",
    "code": 1002
  }
}
과금

호출은 실제 사용량에 따라 실시간 정산돼요. 현재 가격은 콘솔과 모델 요금 응답을 확인하세요.

  • 호출 전 잔액이 0보다 큰지 확인하며, 잔액이 부족하면 402를 반환해요
  • prompt + completion 토큰 사용량으로 과금해요
  • Prompt Cache를 지원하며 cache_read_tokens는 할인 요금으로 계산해요

콘솔에서 크레딧(米粒)을 충전하고, 사용량에서 호출과 소비 내역을 볼 수 있어요.

json
// 余额不足响应(402)
{
  "error": {
    "message": "Insufficient balance",
    "type": "insufficient_balance",
    "code": 1004
  }
}
Chat Completions
POST /api/v1/chat/completions

OpenAI 호환 대화 엔드포인트로, 스트리밍과 비스트리밍을 지원해요. OpenAI SDK의 base_url만 바꾸면 돼요.

매개변수유형설명
model 필수string모델 ID, 형식 provider_slug/model
messages 필수array대화 메시지 목록이며 각 항목은 role과 content를 포함해요
streamboolean스트리밍(SSE) 사용 여부, 기본값 false
temperaturefloat샘플링 온도, 범위 0–2
max_tokensinteger최대 출력 토큰 수
response_formatobject구조화 출력 형식. 「구조화 출력」 섹션을 참고하세요
bash
curl https://miyang.cn/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
  }'
Omni v1

miyang/miyang-omni-v1은 오디오·비디오 이해, 회의록, 콘텐츠 분석을 위한 옴니모달 모델이에요. 하나의 사용자 메시지에 텍스트, 이미지, 오디오, 비디오를 함께 넣고 텍스트 결과를 받을 수 있어요.

Omni는 생성형 이해 결과를 출력하므로 요약, 질의응답, 콘텐츠 분석에 적합합니다. 안정적인 받아쓰기, 화자 분리, 구조화된 구간이 필요하면 녹음 파일 전사 모델 miyang-asr을 사용하세요.
모델 정보값
호출 IDmiyang/miyang-omni-v1
입력 모달리티텍스트, 이미지, 오디오, 비디오를 조합 가능
출력 모달리티텍스트(음성 생성 없음)
컨텍스트 한도1000000 tokens

멀티모달 content 형식

type설명
texttext 필드에 넣는 텍스트 지시
image_urlimage_url.url에 넣는 공개 URL 또는 Base64 데이터 URL
input_audioinput_audio.data에 넣는 공개 URL 또는 Base64 데이터 URL과 format
video_urlvideo_url.url에 넣는 공개 비디오 URL 또는 Base64 데이터 URL

Omni 확장 매개변수

매개변수유형설명
reasoning_effortstringnone, low, medium, xhigh 중 하나예요. 업스트림 기본값은 xhigh이며, 전사나 빠른 요약에는 none을 권장해요.
use_multichannelboolean스테레오 또는 4채널 FOA 공간 정보를 유지할지 정해요. 기본값은 false이며, 입력이 해당 채널 구성일 때만 켜세요.

오디오 이해 예시

bash
curl https://miyang.cn/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
  }'
공개 URL 파일은 오디오나 비디오 각각 2GB 이하여야 해요. 오디오는 최대 3시간, 비디오는 최대 2시간이며 Base64 인코딩 파일은 10MB 미만이어야 해요. 긴 미디어는 오래 걸릴 수 있으니 클라이언트 타임아웃을 늘리세요.
모델 목록
GET /api/v1/models

공개 엔드포인트이며 API 키가 필요 없어요. 현재 공개 모델을 반환하고, API 키를 넣으면 계정 권한에 따라 내부 또는 허용 목록 모델도 포함돼요. 응답 필드는 표준 OpenAI 형식에 context_length와 사용 범위 정보를 더해요.

json
{
  "object": "list",
  "data": [
    {
      "id": "miyang/auto",
      "object": "model",
      "owned_by": "miyang",
      "name": "自动",
      "model_type": "text",
      "usage_scope": "alice",
      "usage_hint": "请在 Alice 客户端内使用",
      "context_length": 262144
    }
  ]
}
모델 요금
GET /api/v1/pricing

현재 계정에서 볼 수 있는 모든 모델의 요금을 반환해요. API 키가 없으면 공개 모델을, 키가 있으면 계정 권한에 따른 내부 또는 허용 목록 모델도 포함해요.

모델 유형마다 과금 단위가 다르므로 billing_unit을 기준으로 확인하세요. rates에는 현재 적용 가격이, effective_pricing에는 기본가·시간대별 요금·프로모션 요금 여부가 표시돼요.

각 항목은 자체 통화를 표시하며, mili_per_usd에서 USD 잔액과 미리의 환산 기준을 제공해요.
bash
curl https://miyang.cn/api/v1/pricing \
  -H "Authorization: Bearer miyang-xxx"
json
{
  "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>"
      }
    }
  ]
}
Embeddings
POST /api/v1/embeddings

OpenAI 호환 임베딩 엔드포인트예요. 모델이 벡터 작업을 지원하는지는 모델 목록과 콘솔 표시를 확인해 주세요.

매개변수유형설명
model 필수stringEmbedding 모델 호출 ID
input 필수string / array벡터화할 텍스트 또는 텍스트 배열
encoding_formatstring벡터 인코딩 형식. 흔히 float를 사용해요
bash
curl https://miyang.cn/api/v1/embeddings \
  -H "Authorization: Bearer miyang-xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "provider/embedding-model",
    "input": "需要向量化的文本"
  }'
Structured Decisions (Jev)
POST /api/v1/decisions

miyang/jev-1.13은 모든 Miyang API 사용자가 이용할 수 있는 저비용 구조화 결정 모델이며 엔진은 typesafe/jev-1.13으로 고정돼요. 대화 문장을 생성하지 않고 명시된 질문에 답해요. Alice의 장기 기억 사전 필터가 첫 번째 운영 사례예요.

유효한 Miyang API 키가 있으면 누구나 Authorization: Bearer miyang-xxx로 호출할 수 있어요. /api/v1/chat/completions과 다른 전용 Decisions 프로토콜을 사용하므로 Chat 전용 /api/v1/models 목록에는 섞이지 않아요.
모델 정보값
Miyang 모델 IDmiyang/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 필수stringnoul(0–1 확률), choice 또는 score.
questions.*.instructions 필수string모델이 판단할 내용을 명확하게 설명해요.
questions.*.criteriaobject선택 사항. 각 답이나 점수의 의미를 설명해 모호함을 줄여요.

요청 본문은 최대 64 KiB, 질문은 최대 24개예요. 서버는 state 본문이나 결정 답변을 기록하지 않고 질문 수, 지연 시간, 토큰 사용량만 저장해요.

bash
curl https://miyang.cn/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": "일회성 작업, 일반 질의응답 또는 가벼운 대화"
        }
      }
    }
  }'
json
{
  "model": "miyang/jev-1.13",
  "provider": "miyang",
  "answers": {
    "remember": {
      "type": "noul",
      "noul": 0.02
    }
  }
}
Images Generations (텍스트-이미지)
POST /api/v1/images/generations

OpenAI 호환 이미지 생성 엔드포인트예요. 텍스트 프롬프트로 이미지를 만들고 URL 또는 Base64를 반환하며, OpenAI Images API와 완전히 호환돼요.

이미지 생성은 시간이 걸려요(보통 30–120초). SDK나 HTTP 클라이언트에서 타임아웃을 최소 180초으로 설정해 주세요.
매개변수유형설명
model 필수string모델 ID, 형식 provider/model, 예: ts/gpt-image-2
prompt 필수string이미지 설명 텍스트
ninteger생성할 이미지 수. 기본값 1, 여러 장 가능
sizestring이미지 크기. 자주 쓰는 값: 1024x1024(정사각), 1024x1536(세로), 1536x1024(가로), auto(모델이 선택). 긴 변 최대 3840px, 양쪽은 16의 배수, 장단비는 3:1 이하
qualitystring렌더 품질: low(빠른 초안), medium, high, auto(기본, 모델이 선택)
output_formatstring출력 형식: png(기본), jpeg(더 빠름), webp
output_compressioninteger압축률 0–100. JPEG / WebP만 적용돼요
backgroundstringopaque(기본) 또는 transparent(투명 배경, 아이콘/스티커에 적합)
moderationstring콘텐츠 검열: auto(기본) 또는 low(느슨함)

기본 예제 — 텍스트-이미지:

bash
curl https://miyang.cn/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"
  }'
python
from openai import OpenAI
import base64

client = OpenAI(
    api_key="miyang-xxx",
    base_url="https://miyang.cn/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 출력 + 압축 + 로컬 저장:

python
import httpx, json, base64

resp = httpx.post(
    "https://miyang.cn/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"])
json
// 响应示例
{
  "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..."
    }
  ]
}

크기와 품질 참고

매개변수선택값설명
size1024x1024(정사각)
1536x1024(가로)
1024x1536(세로)
2048x2048(2K)
3840x2160(4K 가로)
auto
긴 변 ≤ 3840px, 양쪽은 16의 배수, 비율 ≤ 3:1, 총 픽셀 655,360 – 8,294,400
qualitylow · medium · high · autolow가 가장 빠르고 초안·반복에 좋아요. high가 가장 정밀하고 최종 출력에 좋아요
output_formatpng · jpeg · webpjpeg가 png보다 빨라서 지연에 민감한 상황에 우선 사용해요
Images Edits (참조 이미지 / 이미지-이미지)
POST /api/v1/images/edits

OpenAI 호환 이미지 편집 엔드포인트예요. 참조 이미지를 한 장 이상 올리고 텍스트 프롬프트로 새 이미지를 만들어요. 부분 편집(mask)과 여러 장 합성을 지원하며, 요청은 multipart/form-data 형식이에요.

대표 사용 예:

  • 스타일 변환 — 사진 업로드 + "유화 스타일로 바꿔 주세요"
  • 여러 장 합성 — 여러 소재 업로드 + "이 물건들이 들어간 선물 바구니를 만들어 주세요"
  • 부분 편집 — 원본 + mask + "마스크 영역에 플라밍고를 추가해 주세요"
매개변수유형설명
model 필수string모델 ID, 예: ts/gpt-image-2
image 필수file / file[]참조 이미지. 한 장은 image, 여러 장은 image[]( image[]=@file.png를 여러 번)
prompt 필수string편집 지시 설명
maskfile마스크 이미지(알파 채널 필요). 투명 영역이 편집 대상이에요. 여러 장일 때 mask는 첫 장에 적용돼요
ninteger생성 수, 기본값 1
sizestring출력 크기. 기본값 auto. Generations와 같은 크기 옵션을 지원해요
qualitystringlow · medium · high · auto

한 장 편집 — 스타일 변환:

bash
curl https://miyang.cn/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"
python
from openai import OpenAI

client = OpenAI(
    api_key="miyang-xxx",
    base_url="https://miyang.cn/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)

여러 장 합성 — 여러 소재를 한 장으로:

bash
# 多图参考:用 image[] 传多张
curl https://miyang.cn/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 사용:

python
# 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)
Mask 요구사항:mask와 원본은 크기와 형식이 같아야 하고, 각각 50MB 미만이어야 해요. mask에는 알파 채널이 있어야 하며 투명 영역이 편집 구역이에요. GPT Image의 mask는 프롬프트 안내라서 가장자리를 정확히 따르지 않을 수 있어요.
Ripple 이미지 복원: 작업 생성
POST https://lab.miyang.cn/ripple/api/v1/jobs

AI 이미지를 반복해서 참조하거나 생성하는 과정에서 누적된 격자, 비늘, 기와 모양 등의 주기적 아티팩트를 제거해야 할 때 사용합니다. 원본 이미지를 백그라운드에서 진단·정화하고 필요하면 재생성한 뒤 품질까지 검증하여, 게시·인쇄·후속 편집에 바로 쓸 수 있는 깨끗한 결과물을 제공합니다.

Idempotency-Key는 필수입니다. 네트워크 시간 초과 후 같은 값을 사용하면 기존 작업을 반환하며, 다른 이미지나 매개변수에 재사용하면 409를 반환합니다.

생성 시 최대 처리 범위에 해당하는 미리를 예약합니다. 완료 후 실제 수행한 작업만 정산하고 차액을 해제하며, 실패한 작업은 예약 금액을 해제합니다.
매개변수유형설명
image 필수file복원할 이미지. PNG, JPEG, WebP, 최대 40MB 및 8.3MP
allow_regenboolean규칙 기반 정화가 충분하지 않을 때 재생성을 허용할지 여부. 기본값 true
max_regeninteger최대 재생성 횟수, 1–2. 기본값 2
bash
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"
json
{
  "id": "rp-api-...",
  "object": "ripple.job",
  "status": "queued",
  "phase": "queued",
  "result": null,
  "error": null
}
Ripple 이미지 복원: 작업 조회
GET https://lab.miyang.cn/ripple/api/v1/jobs/{job_id}

작업 생성 후 진행 상황과 최종 결과물을 가져올 때 사용합니다. 비동기 조회 방식이므로 연결을 계속 유지하거나 사용자를 기다리게 할 필요가 없으며, 성공하면 완성된 결과물 링크를 받을 수 있습니다.

status는 queued, processing, succeeded, failed, cancelled 또는 expired일 수 있습니다. 성공하면 result.artifacts에 최종 결과물과 과정 파일이 표시됩니다.

결과물 URL에도 API Key가 필요하므로 다운로드할 때 Authorization 헤더를 유지하세요. 작업 파일은 24시간 보관되며, 장기 보관하려면 즉시 다운로드하거나 Miyang Drive에 전달된 사본을 사용하세요.
bash
curl https://lab.miyang.cn/ripple/api/v1/jobs/rp-api-... \
  -H "Authorization: Bearer miyang-xxx"
json
{
  "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
}
Videos Generations (비디오 생성)
POST /api/v1/videos/generations

비동기 비디오 생성 엔드포인트예요. 생성 요청이 성공하면 task_id를 반환해요. 같은 요청을 다시 보내지 말고 조회 엔드포인트로 상태를 확인해 주세요.

현재 Alice 및 내부 계정에서만 사용할 수 있어요. 지원 모델은 miyang/h3, miyang/h3-max예요.
매개변수유형설명
model 필수stringmiyang/h3 또는 miyang/h3-max
content 필수array정확히 하나의 비어 있지 않은 텍스트를 포함하는 멀티모달 배열이며 이미지, 비디오, 오디오를 함께 넣을 수 있어요
duration 필수integer출력 길이(초). H3는 4–15초, H3 Max는 5–15초를 지원해요
resolutionstring기본값 768P. H3는 768P / 2K, H3 Max는 480P / 768P를 지원해요
ratiostring화면 비율: 21:9, 16:9, 4:3, 1:1, 3:4, 9:16. 참조 미디어는 adaptive를 사용할 수 있어요
aigc_watermarkbooleanAIGC 워터마크 추가 여부
extraobjectH3 Max 전용. prompt_expansion_mode는 disabled, balanced, quality 중 하나예요

content 미디어 형식

typerole설명
text—정확히 한 개가 필요하며 최대 7,000자예요
image_urlfirst_frame / last_frame / reference_image첫 프레임, 마지막 프레임 또는 참조 이미지. role이 없는 이미지 한 장은 첫 프레임으로 처리돼요
video_urlreference_video참조 비디오, 최대 3개. role이 필요해요
audio_urlreference_audio참조 오디오, 최대 3개. role이 필요해요
bash
curl https://miyang.cn/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"
  }'
json
{
  "task_id": "443429054845209"
}
비디오 작업 조회
GET /api/v1/videos/generations/{task_id}

생성 시 받은 task_id로 조회해요. 상태는 queued, running, succeeded, failed, cancelled 중 하나예요. 5–15초 간격으로 조회하는 것을 권장해요.

성공한 비디오는 현재 사용자의 Miyang Drive에 자동 저장되어 클라우드 용량을 사용해요. 공간이 부족하면 quota_full을 반환하며, 파일을 정리하거나 용량을 확장해야 저장과 정산이 완료돼요. 재생 URL은 임시 서명 주소이므로 필요할 때 다시 조회해 주세요.
bash
curl https://miyang.cn/api/v1/videos/generations/443429054845209 \
  -H "Authorization: Bearer miyang-xxx"
json
{
  "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
    }
  }
}
비디오 작업 취소
DELETE /api/v1/videos/generations/{task_id}

처리 중인 작업을 취소하고 과금 보류를 해제해요. 연결된 Miyang Drive 파일도 함께 삭제돼요. 완료된 작업을 업스트림에서 취소할 수 없는 경우 엔드포인트 응답을 따라 주세요.

bash
curl -X DELETE https://miyang.cn/api/v1/videos/generations/443429054845209 \
  -H "Authorization: Bearer miyang-xxx"
녹음 파일 전사 (miyang-asr)
POST /api/v1/audio/transcriptions

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로 자동 매핑됩니다. 기존 코드는 수정할 필요가 없습니다.

매개변수유형설명
modelstringmiyang-asr(또는 miyang/miyang-asr)를 입력합니다. 생략 시 이 모델을 사용합니다
filefilefile_url과 둘 중 하나. mp3, wav, m4a, aac, flac, ogg, opus, mp4, mov, mkv, webm 등을 지원하며 직접 업로드는 50 MB 이하
file_urlstringfile과 둘 중 하나. 공개 IP로 해석되는 HTTP(S) 주소, 최대 2 GB·12시간
source_languagestring기본값 auto(자동 인식). cn, en, yue, ja, ko 지정 가능. multilingual은 language_hints와 함께 사용하며, fspk는 중국어·영어 혼용을 뜻합니다
language_hintsarray / stringsource_language=multilingual일 때만 사용. cn, en, yue, ja, ko, de, fr, ru 중 최대 4개
diarizationboolean화자 구분 여부, 기본값 true. 사용 시 2시간 이하 오디오를 권장합니다
speaker_countinteger예상 화자 수. 0은 자동 판단, 지정 시 2–100

업스트림이 보고한 토큰 사용량으로 과금하며 오디오 입력 토큰과 텍스트 출력 토큰의 단가가 다릅니다. 현재 가격과 최종 차감액은 콘솔 사용 내역을 기준으로 합니다.

작업 생성 시 12시간 분량 오디오 기준으로 미립을 동결하고, 완료 후 실제 사용량만 차감하고 차액을 해제합니다. 실패한 작업은 과금하지 않습니다.

예시 1: 파일을 업로드하고 Miyang 드라이브에 저장

bash
curl https://miyang.cn/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 제출(대용량 파일에 권장)

bash
curl https://miyang.cn/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"]
  }'
json
{
  "id": "6f3a...task",
  "object": "audio.transcription.job",
  "status": "processing",
  "model": "miyang/miyang-asr",
  "request_id": "3d7e...request",
  "source_file_id": "drv-..."
}
녹음 파일 전사 조회
GET /api/v1/audio/transcriptions/{task_id}

생성 응답의 id로 5–15초마다 조회하는 것을 권장해요. 제출 결과가 불확실하면 request_id로도 같은 작업을 조회할 수 있어요.

상태는 processing, completed, failed 또는 submission_uncertain이에요. submission_uncertain이면 기존 Idempotency-Key를 유지해 조회하고 새 Key로 다시 제출하지 마세요.
bash
curl https://miyang.cn/api/v1/audio/transcriptions/6f3a...task \
  -H "Authorization: Bearer miyang-xxx"
json
{
  "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은 업스트림 결과 확인 중을 뜻해요.

실시간 음성 인식 (miyang-asr-realtime)
POST /api/v1/audio/transcriptions/realtime

실시간 기록을 만든 뒤 응답의 일회용 stream_url에 연결합니다. PCM을 직접 보내거나 WAV, MP3, AAC, Ogg, WebM, M4A 같은 일반적인 오디오 스트림을 보낼 수 있습니다. Miyang이 실시간 인식에 가장 적합한 내부 형식으로 자동 디코딩하고 통합 인식 이벤트를 반환하므로 클라이언트는 특정 인식 경로에 맞출 필요가 없습니다.

생성 시 max_duration_seconds 기준으로 미립을 동결하고, 연결 종료 후 업스트림이 보고한 토큰 사용량으로 정산하고 차액을 해제합니다. 끊긴 연결은 자동 종료되며 중복 종료로 두 번 과금되지 않습니다.
매개변수유형설명
modelstringmiyang-asr-realtime(또는 miyang/miyang-asr-realtime)을 입력합니다. 생략 시 이 모델을 사용합니다
formatstringpcm / wav / mp3 / aac / opus / speex / ogg / webm / m4a / mp4
sample_rateinteger16000 지원. 중국어만 8000도 지원
source_languagestringcn / en / yue / ja / ko / multilingual
language_hintsarraysource_language=multilingual일 때만 사용. 실시간 인식은 첫 번째 힌트만 사용합니다
promptstring선택형 인식 컨텍스트로 최대 400자입니다. 이름, 제품명, 회의 주제, 전문 용어 또는 바로 앞 문장을 넣어 정확도를 높일 수 있습니다. 응답 형식을 바꾸지 않으며 일반 대화용 시스템 프롬프트가 아닙니다
output_levelinteger1 = 완성된 문장만, 2 = 중간 결과와 완성 문장(기본값)
max_duration_secondsinteger이번 실시간 스트림의 최대 초, 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 출시 계획입니다.
참여자, 프로젝트, 중요 용어, 현재 주제를 짧은 사실로 적으세요. “정확히 인식해 주세요”, “실수하지 마세요” 같은 모호한 지시는 피하고, 주제가 바뀌면 context.update로 새 배경을 전달하세요.
bash
curl https://miyang.cn/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
  }'
json
{
  "id": "realtime-task-id",
  "status": "ready",
  "mode": "realtime",
  "model": "miyang/miyang-asr-realtime",
  "stream_url": "wss://miyang.cn/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를 반환합니다.

javascript
// 주제가 바뀌면 이후 음성에 사용할 컨텍스트를 업데이트합니다
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 포함
ContextUpdatedMiyang이 context.update를 수락했으며 새 prompt가 이후 오디오에 적용됩니다
ContextUpdateFailedcontext.update가 검증을 통과하지 못했습니다. payload.status_text에서 원인을 확인하고 수정한 prompt로 다시 시도할 수 있습니다
TranscriptionCompleted인식 작업 종료, 이후 서버가 연결을 닫음
TaskFailed인식 실패. header.status는 40000000, payload.status_text에 사유. 이후 서버가 1011로 연결을 닫음
json
{
  "header": {"namespace": "SpeechTranscriber", "name": "SentenceEnd", "status": 20000000},
  "payload": {
    "index": 1,
    "begin_time": 0,
    "time": 1820,
    "result": "今天的会议先同步进度。",
    "words": [{"text": "今天", "startTime": 0, "endTime": 320, "punctuation": ""}]
  }
}
짧은 오디오 동기 인식
POST /api/v1/audio/transcriptions

같은 전사 API에서 model을 miyang-asr-flash로 지정하면 비동기 작업 없이 인식 텍스트를 바로 반환합니다. 5분 이내 오디오에 적합하며, 더 긴 녹음은 miyang-asr를 사용하세요. 요청 본문은 녹음 파일 전사와 같고 file과 file_url 중 하나를 사용합니다.

업스트림이 보고한 토큰 사용량으로 과금하며 성공 시 즉시 차감합니다. 실패는 과금하지 않습니다.

bash
curl https://miyang.cn/api/v1/audio/transcriptions \
  -H "Authorization: Bearer miyang-xxx" \
  -F "model=miyang-asr-flash" \
  -F "file=@voice-note.m4a"
json
{
  "text": "明天上午十点提醒我开会。",
  "model": "miyang/miyang-asr-flash",
  "usage": {"input_tokens": 125, "output_tokens": 9, "total_tokens": 134},
  "request_id": "3d7e...request"
}
음성 합성
POST /api/v1/audio/speech

오디오 바이너리를 동기로 반환하며 Content-Type은 response_format에 대응합니다. miyang-tts-v1는 실시간 상호작용에 최적화되어 음색, 음높이, 스타일 지시를 지원합니다. miyang-tts-v1-pro는 통합 오디오 생성 모델로 현재 단일 화자 합성을 제공하며 참고 오디오를 넣을 수 있습니다.

매개변수유형설명
modelstringmiyang-tts-v1 또는 miyang-tts-v1-pro
inputstring합성할 텍스트(text도 가능). v1 최대 20000자, v1 Pro 최대 3000자
voicestring음색 ID, 기본값 longanhuan_v3.1. v1 전용
response_formatstringmp3(기본값), wav, pcm. v1은 opus도 지원
sample_rateinteger8000, 16000, 22050, 24000, 44100, 48000. v1 기본 24000, v1 Pro 기본 48000이며 22050 미지원
speednumber말하기 속도 0.5–2, 기본값 1
volumenumber음량 0–100, 기본값 50
pitchnumber음높이 0.5–2, 기본값 1. v1 전용
instructionstring자연어 스타일 지시, 최대 500자. v1 전용
referencesarray참고 오디오 최대 3개, 각 항목은 audio_url 또는 audio_data 중 하나. v1 Pro 전용

업스트림이 보고한 입력·출력 토큰으로 과금하며, 사용량은 응답 헤더 X-Usage-Input-Tokens와 X-Usage-Output-Tokens에도 표시됩니다.

bash
curl https://miyang.cn/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
실시간 음성 대화
WS /api/v1/realtime?model=miyang-omni-v1-realtime

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 경로 사용 불가.

javascript
import WebSocket from "ws";

const ws = new WebSocket(
  "wss://miyang.cn/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/searchq심층 검색: 결과에 페이지 본문 추출과 재정렬 컨텍스트가 있어 RAG에 좋아요
/api/v1/websearch/simple-searchq빠른 검색: 제목과 요약만 반환하며 더 빨라요
/api/v1/websearch/readerurl페이지 읽기: 지정 URL을 가져와 깨끗한 텍스트로 변환해요
/api/v1/websearch/search-newsq뉴스 검색: 최근 뉴스 소스만 검색하며 결과에도 검색 컨텍스트가 있어요
빠른 검색
GET /api/v1/websearch/simple-search

검색만 하고 페이지 추출·재정렬은 하지 않아요. 보통 1초 안에 돌아와요. 제목 + 요약 + 링크만 필요할 때 쓰면 좋아요. 답변 카드에 히트하면 응답에 answerBox 필드가 추가로 들어가요.

매개변수유형설명
q 필수string검색 키워드
bash
curl "https://miyang.cn/api/v1/websearch/simple-search?q=最新AI新闻" \
  -H "Authorization: Bearer miyang-xxx"
json
// 响应示例
{
  "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..."
      }
    ]
  }
}
페이지 읽기
GET /api/v1/websearch/reader

대상 페이지 URL을 이미 알 때 페이지를 가져와 깨끗한 Markdown으로 변환해요. 이 엔드포인트는 최상위 content를 반환하며 data가 아니에요.

매개변수유형설명
url 필수string읽을 웹페이지 주소. http:// 또는 https://로 시작해야 해요
bash
curl "https://miyang.cn/api/v1/websearch/reader?url=https://go.dev" \
  -H "Authorization: Bearer miyang-xxx"
json
// 响应示例(content 为页面正文)
{
  "code": 200,
  "message": "ok",
  "content": "# The Go Programming Language\n\nGo is an open source programming language..."
}
뉴스 검색
GET /api/v1/websearch/search-news

최근 뉴스 소스만 검색해요. 나머지 파이프라인은 심층 검색과 같고, 결과에도 contexts 본문 조각이 있어요.

맞는 뉴스가 없으면 404를 반환해요(본문 {"code": 404, "message": "no search results"}). 정상적인 업무 결과이며 차감하지 않아요.
매개변수유형설명
q 필수string뉴스 검색 키워드
bash
curl "https://miyang.cn/api/v1/websearch/search-news?q=OpenAI" \
  -H "Authorization: Bearer miyang-xxx"
json
// 响应示例
{
  "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": "..." }
        ]
      }
    ]
  }
}
스트리밍(SSE)

요청 본문에 "stream": true을 넣으면 스트리밍이 켜져요. 응답 형식은 OpenAI SSE 규격과 완전히 호환돼요. 스트림 종료 표시는 data: [DONE]이에요.

python
from openai import OpenAI

client = OpenAI(
    api_key="miyang-xxx",
    base_url="https://miyang.cn/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를 지원해요. 출력 형식은 업스트림 모델이 보장하고, 플랫폼은 추가로 가공하지 않아요.

json
{
  "model": "miyang/auto",
  "messages": [...],
  "response_format": {
    "type": "json_schema",
    "json_schema": {
      "name": "result",
      "schema": {
        "type": "object",
        "properties": {
          "answer": { "type": "string" }
        }
      }
    }
  }
}
Prompt Cache

Prompt Cache를 지원하는 모델은 업스트림이 반환한 캐시 히트 토큰을 할인 요금으로 과금해요. 플랫폼은 업스트림 usage 필드를 그대로 전달하고, 청구서에 캐시 히트량이 보여요.

공급업체마다 필드 이름이 달라요:

  • cache_read_input_tokens — Anthropic
  • prompt_cache_hit_tokens — DeepSeek
  • cached_tokens — OpenAI
json
{
  "usage": {
    "prompt_tokens": 1000,
    "completion_tokens": 200,
    "cache_read_input_tokens": 800,   // Anthropic
    "prompt_cache_hit_tokens": 800,    // DeepSeek
    "cached_tokens": 800               // OpenAI
  }
}
Python SDK 예제

base_url과 api_key만 바꾸면 OpenAI SDK로 호출할 수 있어요.

python
from openai import OpenAI

client = OpenAI(
    api_key="miyang-xxx",
    base_url="https://miyang.cn/api/v1",
)

resp = client.chat.completions.create(
    model="miyang/auto",
    messages=[{"role": "user", "content": "Hello!"}],
)
print(resp.choices[0].message.content)
cURL 예제

SDK 설치 없이 API Key, 연결 상태, 요청 파라미터를 빠르게 검증할 수 있어 첫 연동이나 호출 문제 진단에 적합합니다.

bash
# 非流式
curl https://miyang.cn/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://miyang.cn/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
  }'