Base URL

OpenAI 兼容 API 的推荐 Base URL:

https://miyang.cn/api/v1
旧地址 https://miyang.cn/v1 继续兼容已有客户端;新接入请使用 https://miyang.cn/api/v1。
鉴权

除公开的模型列表和模型费用接口外,推理接口均需在请求头携带 API Key。支持两种请求头:

  • 推荐:Authorization: Bearer miyang-xxxxx
  • 备用:x-api-key: miyang-xxxxx

API Key 在控制台创建并加密保存,可在「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 Key 独立计数,默认 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://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说明
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://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:单个音频或视频文件不超过 2 GB;音频最长 3 小时,视频最长 2 小时。Base64 编码后的单个音频或视频必须小于 10 MB。长媒体处理可能耗时较久,请提高客户端超时。
模型列表
GET /api/v1/models

公开接口,无需 API Key。返回当前公开可用模型;携带 API Key 时还会按账号权限返回内部或白名单模型。响应字段在标准 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 Key 时列出公开模型;携带 API Key 时会按账号权限补充内部或白名单模型。

不同模型类型使用不同计费单位,请以 billing_unit 为准;rates 是当前生效价格,effective_pricing 会标明基础价、分时价或活动价。

每项价格均带独立币种;响应中的 mili_per_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 是面向所有米羊 API 用户的低成本结构化决策模型,底层固定为 typesafe/jev-1.13。它只回答明确的问题,不生成对话文本;Alice 的长期记忆预筛是首个生产用途。

任何有效米羊 API Key 都可使用 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 Key 的用户

请求必须指定已登记的 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://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 兼容的图像生成接口。根据文本 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://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 兼容的图像编辑接口。上传一张或多张参考图,配合文本 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://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 须含 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://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 秒查询一次。

成功视频会自动转存到当前用户的米羊盘并占用云端空间。空间不足时返回 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}

取消仍在处理的任务并释放计费预授权。若任务已有米羊盘文件,取消时会一并移除;已完成且上游不允许取消时,以接口响应为准。

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,再通过查询接口获取全文、分段、说话人和时长。

直接使用 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://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"

示例二:提交公网文件 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 等常见音频流;米羊会自动解码并转换为最适合实时识别的内部格式,再返回统一的识别事件。客户端无需适配具体识别线路。

创建时按 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://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 分钟且只能连接一次,连接建立即表示识别任务已启动。之后持续发送与创建参数一致的音频字节,米羊会自动处理格式转换和说话停顿。需要结束时发送 {"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://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

按上游返回的输入与输出 Token 计费,本次用量同时写在响应头 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 请求头鉴权。米羊透明转发 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://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));
网络搜索(总览与计费)

为 Agent 和应用提供实时联网能力:网页搜索、新闻搜索和网页正文读取。全部为 GET 接口,使用与推理接口相同的 API Key 鉴权(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 的模型,上游返回的缓存命中 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://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
  }'