Base URL

OpenAI 兼容 API 的建議 Base URL:

https://api.alice.fans/api/v1
舊地址 https://api.alice.fans/v1 繼續兼容現有客戶端;新接入請使用 https://api.alice.fans/api/v1。
鑑權

除公開的模型列表和模型費用接口外,推理接口均須在請求頭攜帶 API 密鑰。支援兩種請求頭:

  • 建議:Authorization: Bearer miyang-xxxxx
  • 備用:x-api-key: miyang-xxxxx

API 密鑰在控制台建立並加密保存,可在「API Keys」頁面再次查看和複製。

bash
# 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 的模型。

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 token 用量計費
  • 支援 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最大輸出 token 數
response_formatobject結構化輸出格式,見「結構化輸出」章節
bash
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
  }'
Omni v1

miyang/miyang-omni-v1 是用於音影片理解、會議紀要和內容分析的全模態模型,可在同一則用戶訊息中組合文字、圖片、音訊和影片,並輸出文字結果。

Omni 的輸出是生成式理解結果,適合摘要、問答和內容分析;需要穩定的逐字稿、說話者分離和結構化分段時,請使用錄音檔轉寫模型 miyang-asr。
模型資訊值
調用 IDmiyang/miyang-omni-v1
輸入模態文字、圖片、音訊、影片,可組合輸入
輸出模態文字(不產生語音)
上下文上限1000000 tokens

多模態 content 格式

type說明
text文字指令,放在 text 欄位
image_url公開 URL 或 Base64 Data URL,放在 image_url.url
input_audio公開 URL 或 Base64 Data URL,放在 input_audio.data,並提供 format
video_url公開影片 URL 或 Base64 Data URL,放在 video_url.url

Omni 擴展參數

參數類型說明
reasoning_effortstringnone、low、medium 或 xhigh。上游預設 xhigh;只做轉寫或快速摘要時建議設為 none。
use_multichannelboolean是否保留雙聲道立體聲或四聲道 FOA 空間資訊,預設 false;僅在輸入確為對應多聲道音訊時開啟。

音訊理解範例

bash
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
  }'
公開 URL:單個音訊或影片檔案不超過 2 GB;音訊最長 3 小時,影片最長 2 小時。Base64 編碼後的單個音訊或影片必須小於 10 MB。長媒體可能耗時較久,請提高客戶端逾時。
模型列表
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 密鑰時列出公開模型;攜帶 API 密鑰時會按賬號權限補充內部或白名單模型。

不同模型類型使用不同計費單位,請以 billing_unit 為準;rates 是目前生效價格,effective_pricing 會標明基礎價、分時價或活動價。

每項價格均帶獨立幣種;響應中的 mili_per_usd 提供美元餘額與啫喱豆的換算口徑。
bash
curl https://api.alice.fans/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://api.alice.fans/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 是提供給所有米羊 API 用戶的低成本結構化決策模型,底層固定為 typesafe/jev-1.13。它只回答明確問題,不生成對話文本;Alice 的長期記憶預篩是首個正式用途。

任何有效米羊 API 密鑰都可使用 Authorization: Bearer miyang-xxx 調用。它採用獨立 Decisions 協議,不兼容 /api/v1/chat/completions,因此不會混入 Chat 專用的 /api/v1/models 列表。
模型資訊值
米羊模型 IDmiyang/jev-1.13
決策引擎typesafe/jev-1.13
上下文上限32768 tokens
問題類型noul / choice / score
開放範圍所有持有效米羊 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 正文或決策答案,只記錄問題數量、耗時與 token 用量。

bash
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": "一次性任務、普通問答或寒暄"
        }
      }
    }
  }'
json
{
  "model": "miyang/jev-1.13",
  "provider": "miyang",
  "answers": {
    "remember": {
      "type": "noul",
      "noul": 0.02
    }
  }
}
Images Generations(文生圖)
POST /api/v1/images/generations

OpenAI 兼容的圖像生成接口。根據文本 prompt 生成圖像,響應返回圖片 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(透明背景,適合 icon/貼紙)
moderationstring內容審核:auto(默認)或 low(寬鬆)

基礎示例 — 文生圖:

bash
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"
  }'
python
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 輸出 + 壓縮 + 保存到本地:

python
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"])
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 兼容的圖像編輯接口。上傳一張或多張參考圖,配合文本 prompt 生成新圖像。支援局部編輯(mask)和多圖合成。請求使用 multipart/form-data 格式。

典型場景:

  • 風格轉換 — 上傳照片 + "轉為油畫風格"
  • 多圖合成 — 上傳多張素材 + "生成包含這些物品的禮品籃"
  • 局部編輯 — 上傳原圖 + mask + "在遮罩區域添加一隻火烈鳥"
參數類型說明
model 必填string模型 ID,如 ts/gpt-image-2
image 必填file / file[]參考圖片。單張用 image,多張用 image[](支援多個 image[]=@file.png)
prompt 必填string編輯指令描述
maskfile蒙版圖片(需含 alpha 通道),透明區域為需要編輯的部分。多圖時 mask 應用於第一張
ninteger生成數量,默認 1
sizestring輸出尺寸,默認 auto,支援與 Generations 相同的尺寸選項
qualitystringlow · medium · high · auto

單圖編輯 — 風格轉換:

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

多圖合成 — 將多張素材合為一張:

bash
# 多图参考:用 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 遮罩:

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 須含 alpha 通道(透明區域為編輯區)。GPT Image 的 mask 是基於 prompt 的引導,不保證精確貼合遮罩邊緣。
Ripple 圖片修復:建立任務
POST https://lab.miyang.cn/ripple/api/v1/jobs

當使用者想修復 AI 圖片在反覆墊圖或生成中累積的格子紋、鱗片紋、疊瓦等週期性偽影時使用。它會把原圖交給背景服務完成診斷、淨化、需要時重新生成及品質驗收,讓使用者直接取得可發布、可列印或可繼續創作的乾淨成品。

必須帶上 Idempotency-Key。網絡逾時後以相同值重試會傳回原任務;同一值改傳另一張圖或另一組參數會傳回 409。

建立時按最大處理範圍凍結啫喱豆,任務完成後按實際處理結算並釋放差額;失敗任務會釋放預授權。
參數類型說明
image 必填file待修復圖片;支援 PNG、JPEG、WebP,最大 40 MB、8.3 MP
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 小時,長期保存請及時下載或從米羊盤讀取。
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_watermarkboolean是否加入 AIGC 水印
extraobject只限 H3 Max,可設定 prompt_expansion_mode:disabled、balanced 或 quality

content 素材格式

typerole說明
text—必填且只能一項,最長 7000 字元
image_urlfirst_frame / last_frame / reference_image首幀、尾幀或參考圖;單張未指定 role 時自動作為首幀
video_urlreference_video參考影片,最多 3 個,必須指定 role
audio_urlreference_audio參考音訊,最多 3 個,必須指定 role
bash
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"
  }'
json
{
  "task_id": "443429054845209"
}
查詢影片任務
GET /api/v1/videos/generations/{task_id}

使用建立任務返回的 task_id 輪詢。狀態可能為 queued、running、succeeded、failed 或 cancelled。建議每 5–15 秒查詢一次。

成功影片會自動轉存到目前用戶的米羊盤並佔用雲端空間。空間不足時返回 quota_full,清理檔案或擴充空間後才能完成轉存與結算;播放 URL 為臨時簽名地址,請按需要重新查詢。
bash
curl https://api.alice.fans/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}

取消仍在處理的任務並釋放計費預授權。若任務已有米羊盤檔案,取消時會一併移除;已完成且上游不允許取消時,以接口回應為準。

bash
curl -X DELETE https://api.alice.fans/api/v1/videos/generations/443429054845209 \
  -H "Authorization: Bearer miyang-xxx"
錄音檔轉寫(miyang-asr)
POST /api/v1/audio/transcriptions

使用 miyang-asr 非同步轉寫已錄製完成的音訊或影片檔,支援 30 種語言與多種中文方言,並可區分說話者。建立成功會回傳任務 ID,再透過查詢介面取得全文、分段、說話者和時長。

直接以 multipart/form-data 上載的檔案上限為 50 MB,會自動儲存到目前用戶的米羊盤並計入空間;file_url 支援公開 HTTP(S) 檔案,單檔不超過 2 GB、時長不超過 12 小時,不會複製進米羊盤。

舊模型名 miyang/transcription 與 miyang/transcription-realtime 仍可繼續使用,會自動對應到 miyang-asr 與 miyang-asr-realtime,既有程式碼無需修改。

參數類型說明
modelstring填寫 miyang-asr(也可寫作 miyang/miyang-asr);省略時預設使用此模型
filefile與 file_url 二擇一。支援 mp3、wav、m4a、aac、flac、ogg、opus、mp4、mov、mkv、webm 等格式,直接上載不超過 50 MB
file_urlstring與 file 二擇一。可公開存取的 HTTP(S) 位址,網域須解析到公網 IP;檔案不超過 2 GB、時長不超過 12 小時
source_languagestring預設 auto 自動辨識;可指定 cn、en、yue、ja、ko;multilingual 需搭配 language_hints;fspk 表示中英混說
language_hintsarray / string僅 source_language=multilingual 時可用;可提示 cn、en、yue、ja、ko、de、fr、ru,最多 4 個
diarizationboolean是否區分說話者,預設 true;啟用時建議音訊不超過 2 小時
speaker_countinteger預期說話者人數,0 表示自動判斷;指定時範圍 2–100

依上游實際回傳的 Token 用量計費,音訊輸入 Token 與文字輸出 Token 分別計價;具體價格和最終扣費請以控制台用量明細為準。

建立任務時依 12 小時音訊的用量上限凍結啫喱豆;任務完成後只扣實際用量並釋放差額。失敗任務不扣費。

範例一:直接上載並自動存入米羊盤

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

範例二:提交公開檔案 URL(適合大型檔案)

bash
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"]
  }'
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://api.alice.fans/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 等常見音訊串流;米羊會自動解碼並轉換為最適合即時辨識的內部格式,再回傳統一的辨識事件。客戶端不必配合特定辨識線路。

建立時依 max_duration_seconds 凍結啫喱豆,連線結束後依上游實際回傳的 Token 用量結算並釋放差額;失聯連線會自動結束,重複結束不會重複扣費。
參數類型說明
modelstring填寫 miyang-asr-realtime(也可寫作 miyang/miyang-asr-realtime);省略時預設使用此模型
formatstringpcm / wav / mp3 / aac / opus / speex / ogg / webm / m4a / mp4
sample_rateinteger支援 16000;僅中文也支援 8000
source_languagestringcn / en / yue / ja / ko / multilingual
language_hintsarray僅 source_language=multilingual 時可用;即時辨識只採用第一個提示語言
promptstring選填的辨識上下文,最多 400 字。建議填入人名、產品名、會議主題、專業術語或緊鄰前文,用於提升辨識準確率;它不會改變輸出格式,也不是通用對話系統提示詞
output_levelinteger1 = 只回傳完整句;2 = 回傳中間結果與完整句(預設)
max_duration_secondsinteger本次即時串流允許的最長秒數,範圍 1–86400;依此上限凍結啫喱豆,結束後依實際用量結算

格式約定:opus 與 speex 使用 Ogg 封裝,aac 使用 ADTS,m4a/mp4 使用可串流讀取的分片 MP4。瀏覽器建議使用 WebM/Opus,Apple 客戶端建議使用 M4A/AAC;米羊會統一完成解碼、單聲道轉換與重新取樣。

上下文增強案例

prompt 應提供下一段語音可能涉及的事實背景,而不是要求模型執行任務。背景越貼近即將出現的內容,人名、產品名與專業術語越容易被正確辨識。

使用情境建議 prompt
人名與專有名詞與會者包括洛小山和 Eason,產品名稱是米羊,項目名稱是星潮計劃。
會議或課程背景這是一次產品週會,主要討論截圖雲端庫、儲存預算和七天待刪除區。
承接前文上一段討論了即時語音辨識,接下來將說明上下文增強和動態更新。
會中切換主題接下來討論星潮計劃的發布安排,負責人是洛小山。
用簡短事實說明「有哪些人、甚麼項目、哪些術語、正在討論甚麼」。不要寫「請準確辨識」「不要出錯」等空泛命令;主題變化時使用 context.update 替換為新的背景。
bash
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
  }'
json
{
  "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 分鐘且只能連線一次,連線建立即表示辨識已啟動。之後持續傳送與建立參數一致的音訊位元組,米羊會自動處理格式轉換和說話停頓。要結束時傳送 {"header":{"name":"StopTranscription"}},伺服器會補發最後一句的 SentenceEnd 和 TranscriptionCompleted,再以 1000 關閉連線;也可以直接關閉連線。結束後可用統一查詢介面取得全文與結算結果。伺服器事件皆為 JSON,header.name 取值如下:

上下文改變時,可在同一個 WebSocket 中傳送 {"type":"context.update","prompt":"接下来讨论星潮计划的发布安排。"}。新的提示詞會套用到後續音訊,米羊接受後會回傳 ContextUpdated。

javascript
// 主題變化時更新後續辨識上下文
ws.send(JSON.stringify({
  type: "context.update",
  prompt: "接下來討論星潮計劃的發布安排,負責人是洛小山。"
}));

// 收到 ContextUpdated 後繼續傳送音訊
ws.send(nextAudioChunk);
事件說明
SentenceBegin偵測到一句話開始;payload 含句序號 index 與開始時間 time(毫秒)
TranscriptionResultChanged目前句子的中間結果,payload.result 為最新文字;output_level=1 時不傳送
SentenceEnd一句話結束;payload 含最終文字 result、begin_time、time 與逐詞時間 words
ContextUpdated米羊已接受 context.update,新的 prompt 將套用到後續音訊
ContextUpdateFailedcontext.update 未通過驗證;payload.status_text 說明原因,修正後可繼續傳送
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

在同一個轉寫介面把 model 設為 miyang-asr-flash,請求會直接回傳辨識文字,不建立非同步任務。適合 5 分鐘以內的短音訊;較長的錄音請使用 miyang-asr。請求內容與錄音檔轉寫相同,file 與 file_url 二擇一。

依上游回傳的 Token 用量計費,成功後立即扣費;失敗不扣費。

bash
curl https://api.alice.fans/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

依上游回傳的輸入與輸出 Token 計費,本次用量同時寫在回應標頭 X-Usage-Input-Tokens 與 X-Usage-Output-Tokens。

bash
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
即時語音對話
WS /api/v1/realtime?model=miyang-omni-v1-realtime

miyang-omni-v1-realtime 是全雙工語音對話模型。使用 WebSocket 連線,並以 Authorization: Bearer miyang-xxx 請求標頭驗證。米羊透明轉發 Realtime 協定的客戶端與伺服器事件(如 session.update、input_audio_buffer.append、response.create、response.audio.delta)。

連線建立時凍結啫喱豆,依上游回傳的 Token 用量結算;文字 Token 依等價音訊 Token 折算。

連線會以下列關閉碼拒絕:4401 驗證失敗,4402 餘額不足,4403 無模型權限,4429 限流,4503 線路暫不可用。

javascript
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));
網絡搜尋(總覽與計費)

為 Agent 和應用提供即時連網能力:網頁搜尋、新聞搜尋和網頁正文讀取。全部為 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://api.alice.fans/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://api.alice.fans/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://api.alice.fans/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://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。由上游模型保證輸出格式,平台不做額外處理。

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 的模型,上游返回的緩存命中 token 會按折扣價計費。平台完整透傳上游 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://api.alice.fans/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://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
  }'