Skip to main content
Orux AIOruxAI

Orux AI / 模型观察

Claude Sonnet 5.5 API:价格、SDK与JSON验证

用OpenAI Python SDK调用Claude Sonnet 5.5 API,查看每100万tokens输入190、输出950 Credits价格与缓存条件。含两次博物馆JSON提取的输入输出、Node/Python验证器、9个拒绝样本和调用费用;区分结构正确与事实一致,并说明最低收费和Haiku的100K阈值。

Orux AI发布于 8 分钟阅读
Claude Sonnet 5.5 API:价格、SDK与JSON验证 — 用OpenAI Python SDK调用Claude Sonnet 5.5 API,查看每100万tokens输入190、输出950 Credits价格与缓存条件。
文章目录

Claude Sonnet 5.5 API:价格、调用与经过验证的 JSON 提取

Anthropic 的 Claude Sonnet 5.5 API 标价为每100万输入 tokens $2、输出 $10。在 Orux AI,同一模型 claude-sonnet-5-5 的价格是输入190 Credits($0.95)、输出950 Credits($4.75),标准 OpenAI Python SDK 只需更改 base_url 即可调用。下文提供价格表、可用的 Python 和 cURL 请求、实际运行过两次的 JSON 提取案例、发现首轮不匹配的验证器,以及这两次调用的费用。

Claude Sonnet 5.5 API 速览

Claude Sonnet 5.5 是 Anthropic 于2026年9月28日发布的中间档型号。Haiku 不足以完成任务、Opus 成本又偏高时,可以把它作为候选。以下价格按每100万 tokens 计,核对日为2026年10月29日。

费率(每100万 tokens)Anthropic 标价Orux AIOrux 占官方标价
输入$2.00190 Credits($0.95)47.5%
输出$10.00950 Credits($4.75)47.5%
缓存读取$0.1012 Credits($0.06)60%
5分钟缓存写入$2.50237.5 Credits($1.19)47.5%
1小时缓存写入$4.00380 Credits($1.90)47.5%

左右滑动查看完整表格。

来源:Anthropic 定价及 Claude Sonnet 5.5 模型页。Orux AI 以 Credits 结算,固定1 Credit=$0.005,即200 Credits=$1;括号内美元仅用于比较。

表中还未体现三件事:

  • Orux AI 每次聊天请求最低收费0.001 Credits。
  • Anthropic Batch API 提供50%折扣。Orux AI 当前不为该模型提供批处理,所以上表比较的是标准非批量价格。
  • 失败请求不收费,只对完成的调用计费,使用预付余额,无月费。

Claude 三档型号、缓存计算和 Haiku 100K 阈值的完整对照,见Claude API 定价(英文)。

用 OpenAI SDK 调用 Claude Sonnet 5.5

Orux AI 的 OpenAI 兼容 Chat Completions 接入地址为 https://orux.top/api/v1。在/keys创建密钥;完整明文只在创建时展示一次,应立即保存到环境变量。

Python
# pip install openai
import os
from openai import OpenAI

client = OpenAI(base_url="https://orux.top/api/v1", api_key=os.environ["ORUX_API_KEY"])

resp = client.chat.completions.create(
    model="claude-sonnet-5-5",
    messages=[{"role": "user", "content": "Summarize this in 3 bullet points: ..."}],
    max_tokens=500,
)
print(resp.choices[0].message.content)

# Estimate the charge in Credits from the published rates (Credits per 1M tokens)
IN_RATE, OUT_RATE = 190, 950  # claude-sonnet-5-5, checked 2026-10-29
u = resp.usage
print(f"~ {(u.prompt_tokens * IN_RATE + u.completion_tokens * OUT_RATE) / 1e6:.6f} Credits")

同一请求的 cURL 版本:

Shell
curl https://orux.top/api/v1/chat/completions \
  -H "Authorization: Bearer $ORUX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-5-5", "max_tokens": 500,
       "messages": [{"role": "user", "content": "Summarize this in 3 bullet points: ..."}]}'

设置 stream=True 即可流式返回。错误处理应从接入第一天做好:401 表示密钥有误,402 表示余额不足,应充值而非轮换密钥;429 表示需要降低速率,并采用带随机抖动的指数退避。

还要分清不同接入方式。Anthropic 提供自己的 OpenAI SDK 兼容层,当前文档将其介绍为用于测试 Claude API,并列明功能限制(官方文档,译文于2026年11月1日复核)。原文把它描述为主要用于试用和比较;这里不把这句话扩大为官方全面禁止生产使用。需要原生功能时可直接使用 Anthropic SDK。Orux AI 则是独立第三方网关:同一个密钥、OpenAI 风格客户端和余额,可以访问 Claude、GPT、Gemini、DeepSeek 等模型。按需要接入的模型范围选择即可。

从 Claude 获得可验证的 JSON

Orux AI 的 Claude Sonnet 5.5 端点资料列有 messages 和 max_tokens。下方测试没有使用 JSON 模式或 schema 参数,而是先通过提示词生成,再由代码验证。无论选什么模型,都值得区分“返回了能解析的 JSON”与“数据正确”。

提取契约

2026年10月29日的测试使用4条虚构博物馆借展记录及 max_tokens=1000。记录包含相互冲突且未批准的估值、明确确认的零、缺失展厅和不可能的日期(2月30日),用来暴露粗心提取的问题。完整首轮请求如下,保留原始英文:

文本
Extract this fictional museum loan inventory. Return JSON only, without Markdown. The root has exactly one key, items. Each item has exactly id, title, gallery, insurance_usd, arrival_date. Preserve the stated item order. insurance_usd is a nonnegative JSON number or null; an explicitly confirmed zero is 0, not null. arrival_date is an actual calendar date in YYYY-MM-DD or null. Missing, unapproved, conflicting or impossible values must be null. Never choose between conflicting unapproved estimates. Do not infer facts.

A1: Brass compass. Gallery A. Approved insurance USD 12000. Arrival 2026-11-14.
B2: Silk route map. Gallery B. Draft insurance estimates: USD 8000 in one note and USD 9000 in another; neither approved. Arrival 2026-11-16.
C3: Ceramic sherd. Insurance is explicitly confirmed as USD 0. Gallery and arrival date are unconfirmed.
D4: Glass lens. Gallery D. Approved insurance USD 500. Arrival is written as 2026-02-30; the actual date has not been confirmed.

首轮输出与澄清后重跑

首轮回复未改写:

JSON
{"items":[{"id":"A1","title":"Brass compass","gallery":"A","insurance_usd":12000,"arrival_date":"2026-11-14"},{"id":"B2","title":"Silk route map","gallery":"B","insurance_usd":null,"arrival_date":"2026-11-16"},{"id":"C3","title":"Ceramic sherd","gallery":null,"insurance_usd":0,"arrival_date":null},{"id":"D4","title":"Glass lens","gallery":"D","insurance_usd":500,"arrival_date":null}]}

它正确处理了难点:C3 确认的零仍是 0,B2 没在8000和9000之间擅自选择,2月30日变为 null。但“Gallery A”被缩短为“A”。提示词没有要求保留完整标签,所以这是契约缺口,不是误解事实;按“Gallery A”作键的导入表仍会出错。

我们加上一句话,保持记录和参数不变重跑:

文本
For gallery, preserve the full source label exactly (for example, "Gallery A", not "A"). Never shorten or translate these labels.

第二次回复同样未编辑,保存为 response.json:

JSON
{
  "items": [
    {"id": "A1", "title": "Brass compass", "gallery": "Gallery A", "insurance_usd": 12000, "arrival_date": "2026-11-14"},
    {"id": "B2", "title": "Silk route map", "gallery": "Gallery B", "insurance_usd": null, "arrival_date": "2026-11-16"},
    {"id": "C3", "title": "Ceramic sherd", "gallery": null, "insurance_usd": 0, "arrival_date": null},
    {"id": "D4", "title": "Glass lens", "gallery": "Gallery D", "insurance_usd": 500, "arrival_date": null}
  ]
}

两次都以 finish_reason=stop 结束。单个 null 会把未批准、未确认和不可能等原因合并为同一值。真实导入应在 JSON 之外保留源文及人工审核队列。

可运行的验证器

验证器检查根键、字段集合、非空且唯一的 ID、数值类型、非负金额及真实日历日期。给出第二个文件时,还会逐值比较参考答案和条目顺序。本例的预期值由编辑根据源记录手工录入,与第二轮回复一致,因此 expected.json 和 response.json 内容相同。

实际使用的 Node.js 22 版本,保存为 validate.mjs:

JavaScript
import fs from 'node:fs';
import {pathToFileURL} from 'node:url';
import {isDeepStrictEqual} from 'node:util';
export function validate(raw, expected) {
  const x = JSON.parse(raw), keys = ['id','title','gallery','insurance_usd','arrival_date'];
  const object = v => v !== null && typeof v === 'object' && !Array.isArray(v);
  const sameKeys = (v, k) => object(v) && Object.keys(v).sort().join('|') === [...k].sort().join('|');
  if (!sameKeys(x, ['items']) || !Array.isArray(x.items) || !x.items.length) throw Error('items');
  const seen = new Set();
  for (const item of x.items) {
    if (!sameKeys(item, keys)) throw Error('keys');
    if (typeof item.id !== 'string' || !item.id.trim() || seen.has(item.id)) throw Error('id');
    seen.add(item.id);
    for (const k of ['title','gallery']) {
      if (item[k] !== null && (typeof item[k] !== 'string' || !item[k].trim())) throw Error(k);
    }
    const n = item.insurance_usd;
    if (n !== null && (typeof n !== 'number' || !Number.isFinite(n) || n < 0)) throw Error('insurance_usd');
    const d = item.arrival_date;
    if (d !== null) {
      if (typeof d !== 'string' || !/^\d{4}-\d{2}-\d{2}$/.test(d)) throw Error('arrival_date');
      const parsed = new Date(d + 'T00:00:00Z');
      if (!Number.isFinite(parsed.getTime()) || parsed.toISOString().slice(0,10) !== d) throw Error('arrival_date');
    }
  }
  if (expected !== undefined && !isDeepStrictEqual(x, expected)) throw Error('source_mismatch');
  return x;
}
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
  try {
    const expected = process.argv[3] ? JSON.parse(fs.readFileSync(process.argv[3],'utf8')) : undefined;
    const data = validate(fs.readFileSync(process.argv[2],'utf8'), expected);
    console.log(`PASS ${data.items.length} items; source fixture ${expected ? 'checked' : 'NOT checked'}`);
  } catch (error) { console.error('REJECT', error.message); process.exitCode = 1; }
}

Python 等价实现 validate.py,采用相同的核心检查及错误标签:

Python
import json, math, re, sys
from datetime import date

KEYS = {"id", "title", "gallery", "insurance_usd", "arrival_date"}


def validate(raw, expected=None):
    x = json.loads(raw)  # Markdown fences or prose around the JSON fail here
    if not isinstance(x, dict) or set(x) != {"items"} or not isinstance(x["items"], list) or not x["items"]:
        raise ValueError("items")
    seen = set()
    for item in x["items"]:
        if not isinstance(item, dict) or set(item) != KEYS:
            raise ValueError("keys")
        item_id = item["id"]
        if not isinstance(item_id, str) or not item_id.strip() or item_id in seen:
            raise ValueError("id")
        seen.add(item_id)
        for k in ("title", "gallery"):
            v = item[k]
            if v is not None and (not isinstance(v, str) or not v.strip()):
                raise ValueError(k)
        n = item["insurance_usd"]
        if n is not None and (isinstance(n, bool) or not isinstance(n, (int, float))
                              or not math.isfinite(n) or n < 0):
            raise ValueError("insurance_usd")
        d = item["arrival_date"]
        if d is not None:
            if not isinstance(d, str) or not re.fullmatch(r"[0-9]{4}-[0-9]{2}-[0-9]{2}", d):
                raise ValueError("arrival_date")
            try:
                date.fromisoformat(d)  # rejects 2026-02-30
            except ValueError:
                raise ValueError("arrival_date") from None
    if expected is not None and x != expected:
        raise ValueError("source_mismatch")
    return x


if __name__ == "__main__":
    try:
        expected = json.load(open(sys.argv[2])) if len(sys.argv) > 2 else None
        data = validate(open(sys.argv[1]).read(), expected)
        checked = "checked" if expected is not None else "NOT checked"
        print(f"PASS {len(data['items'])} items; source fixture {checked}")
    except json.JSONDecodeError:
        print("REJECT json", file=sys.stderr)
        sys.exit(1)
    except ValueError as e:
        print("REJECT", e, file=sys.stderr)
        sys.exit(1)

任选其一,把回复和参考文件一起传入:

Shell
node validate.mjs response.json expected.json
python validate.py response.json expected.json
# PASS 4 items; source fixture checked

只传 response.json 时,只检查结构;金额即使错误,只要是合法数值类型也可能通过。参考答案比较才会发现内容错误。相对该参考,首轮因展厅标签缩写而报 source_mismatch,第二轮通过。

把调用和验证串起来时,可复用快速入门的客户端:

Python
import json
from validate import validate

PROMPT = open("prompt.txt").read()        # the contract and records above, plus the gallery rule
expected = json.load(open("expected.json"))

resp = client.chat.completions.create(
    model="claude-sonnet-5-5",
    messages=[{"role": "user", "content": PROMPT}],
    max_tokens=1000,
)
data = validate(resp.choices[0].message.content, expected)  # raises on any mismatch

9种损坏样本,全部被拒绝

随后将参考文件故意改坏9次,再逐个运行验证器。9个均被拒绝。Python 版本与 Node 原版的标签一致,但 Markdown 围栏样本在 Python 中报告 json,Node 则是 JSON.parse 错误。这是验证器测试,不是9次模型失败。

  • 重复 ID:id
  • 条目多出一个键:keys
  • 删除一条:source_mismatch
  • 把12000改成字符串“12000”:insurance_usd
  • 未知估值从 null 改为0:source_mismatch
  • 已确认零从0改为 null:source_mismatch
  • 到达日期改为2026-02-30:arrival_date
  • 12000改成12500:source_mismatch
  • 给 JSON 加 Markdown 代码围栏:解析阶段拒绝

两次模型调用和9个样本说明了本例发生的事,不构成可靠性百分比。验证失败时应停止导入,转交人工处理。

两次调用实际花了多少

两次返回的用量分别为402输入/195输出 tokens、446输入/207输出 tokens。按上面的费率:

调用tokens(输入/输出)Orux AIAnthropic 标价
首轮402 / 1950.26163 Credits($0.001308)$0.002754
澄清后重跑446 / 2070.28139 Credits($0.001407)$0.002962
合计848 / 4020.54302 Credits($0.002715)$0.005716

左右滑动查看完整表格。

算式就是用量乘费率:(402×190+195×950)÷1,000,000=0.26163 Credits。输出单价是输入的5倍,因此账单往往主要来自输出;比起缩短提示词,约束输出格式通常更值得先试。按两次平均0.27151 Credits估算,每月10,000次类似提取约为2,715 Credits($13.58)。

什么时候换用 Haiku 5.5 或 Opus 5.5

同一假设任务:每次2000输入、500输出 tokens,以下按1000次请求计,价格日期为2026年10月29日。

模型Orux 每100万(输入/输出)Orux 每1000次Anthropic 每1000次标价适合先评估的任务
Claude Haiku 5.5(提示≤100K)10.8 / 54 Credits48.6 Credits($0.243)$0.45高频分类、路由、短提取
Claude Sonnet 5.5190 / 950 Credits855 Credits($4.275)$9.00常规提取、草稿、调试
Claude Opus 5.5380 / 1,900 Credits1,710 Credits($8.55)$18.00答错代价高的复杂推理

左右滑动查看完整表格。

Haiku 5.5 有价格阶梯:输入超过100,000 tokens时,每100万按56/280 Credits收费,官方为$0.50/$2.50。可先在 Haiku 上运行上述验证器;若它通过你的参考样本,该参考工作量的费用约可降至原来的1/17。跨厂商选择可参考Claude Sonnet 5.5、GPT-6 Luna 与 Gemini 4 Argon 对比(英文)。

FAQ

Claude Sonnet 5.5 支持 JSON 模式吗?

Orux AI 的端点资料列有 messages 和 max_tokens,本例没有使用 JSON 模式或 schema 参数。我们在提示词中明确键、类型和 null 规则,再由代码验证,获得了可解析 JSON。能解析只是检查的开始,不代表数据已经正确。

能用 OpenAI Python SDK 调 Claude 吗?

可以,将 SDK 指向 https://orux.top/api/v1,使用 Orux AI 密钥并设置 model="claude-sonnet-5-5";标准 Chat Completions 调用的其他部分不变。Anthropic 也有自己的兼容层,当前文档介绍了测试用途和功能限制,使用前应核对原生与兼容接口的差异。

一次 Claude Sonnet 5.5 调用多少钱?

用量乘费率即可:Orux AI 每100万输入190 Credits,输出950 Credits。本例真实402输入、195输出调用为0.26163 Credits(约$0.0013),Anthropic 标价约$0.0028。每次聊天请求最低收费0.001 Credits。

Orux AI 支持 Claude Sonnet 5.5 提示缓存吗?

模型页公布了缓存费率:每100万缓存读取12 Credits,5分钟写入237.5 Credits,1小时写入380 Credits。长且完全相同的前缀,例如系统提示或文档,在缓存窗口内多次复用时,缓存才可能带来节省。

请求失败会怎样?

失败请求不计费,只为完成的调用付费。402 按余额不足处理并充值,401 检查密钥,429 采用带抖动的指数退避。能够解析、但没通过你的验证器的回复,仍属于已完成调用,会收费,这也是控制输出长度的理由。

来源与下一步

在Claude Sonnet 5.5 模型页选择已保存的“Museum inventory · validated extraction”示例;载入只填表,不会自动运行。价格核对日2026-10-29。来源:Anthropic 定价、Anthropic OpenAI SDK 兼容说明、Orux AI 定价。

在 Orux AI 试用 Claude Sonnet 5.5 模型页在模型页在线试用,并查看价格与 API 示例。打开模型在 Orux AI 试用 Claude Haiku 5.5在模型页在线试用,并查看价格与 API 示例。打开模型在 Orux AI 试用 Claude Opus 5.5在模型页在线试用,并查看价格与 API 示例。打开模型

用一个 API 调用这些模型

一个 OpenAI 兼容 API,覆盖对话、图像、视频与音频模型,按积分计费。