MossHubAPI 文档
开发者文档 结构化输出

结构化输出

下载代码

让模型返回 JSON,并在应用侧校验需要的字段。

Python 3 · 标准库Chat Completions服务端示例

使用前确认

需要:上游支持 json_object 模式的 Chat Completions 模型。网关不检查 response_format,原样交给上游;挑选模型时可参考控制台的「结构化输出」标记,或 /v1/models 返回的 capabilities.structured_outputs.supported。先完成快速开始中的环境变量配置,并把 YOUR_MODEL_ID 换成这把密钥可用的模型 ID。

完整示例

可从页头“下载代码”保存为 .py 文件,在配置好环境的服务端运行。

import os, json, urllib.request, urllib.error

BASE = os.environ["MOSSHUB_API_BASE"].rstrip("/")
KEY = os.environ["MOSSHUB_API_KEY"]
MODEL = "YOUR_MODEL_ID"

def chat(messages, **options):
    body = {"model": MODEL, "messages": messages, "stream": False, **options}
    request = urllib.request.Request(
        BASE + "/v1/chat/completions",
        data=json.dumps(body, ensure_ascii=False).encode("utf-8"),
        headers={"Authorization": "Bearer " + KEY,
                 "Content-Type": "application/json"}, method="POST")
    try:
        with urllib.request.urlopen(request, timeout=60) as response:
            result = json.load(response)
    except urllib.error.HTTPError as error:
        raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8')}") from error
    choices = result.get("choices", [])
    if not choices or not isinstance(choices[0].get("message"), dict):
        raise RuntimeError("未返回有效消息,请检查错误信息与模型能力")
    if choices[0].get("finish_reason") == "length":
        raise RuntimeError("回答因输出上限而截断,请调整预算后重试")
    return choices[0]["message"]

message = chat([
    {"role": "system", "content": "只返回 JSON 对象,包含 title 字符串和 tags 字符串数组,不要 Markdown。"},
    {"role": "user", "content": "为一家主打手冲咖啡的小店提取标题和三个标签。"},
], response_format={"type": "json_object"})
text = message.get("content")
if not isinstance(text, str):
    raise RuntimeError("没有可解析的文本内容,检查是否拒绝或返回其他消息类型")
try:
    data = json.loads(text)
except json.JSONDecodeError as error:
    raise RuntimeError("模型没有返回合法 JSON,不要直接交给业务使用") from error
if (not isinstance(data, dict) or not isinstance(data.get("title"), str)
        or not isinstance(data.get("tags"), list)
        or not all(isinstance(tag, str) for tag in data["tags"])):
    raise RuntimeError("JSON 字段类型与约定不一致")
print(json.dumps(data, ensure_ascii=False, indent=2))

JSON 模式不等于字段校验

JSON 可解析,并不保证 title、tags 等业务字段齐全,本例主动校验字段与类型。更严格的 json_schema 模式同样原样交给上游,需确认所选模型支持。

常见问题

  • 上游拒绝 response_format:网关原样返回上游的状态码和错误正文。换用支持的模型,或去掉该字段、在应用中处理普通文本。
  • 输出截断(finish_reason 为 length):调高请求的输出上限后重试,不超过模型的最大输出。
  • 模型拒绝或返回非文本消息:进入错误分支,不当成空 JSON 保存。

继续阅读

文本对话参数 · 协议兼容 · 错误排查

实际可调用的模型、授权与价格以控制台为准。
页面字体:MiSans(小米,依《MiSans 字体知识产权许可协议》使用);Google Sans Flex(SIL Open Font License 1.1)。

本页目录