Skip to main content
Orux AIOruxAI

Orux AI / モデルノート

Claude Sonnet 5.5 API:料金とJSON抽出の検証

Claude Sonnet 5.5 APIをOpenAI Python SDKで呼び出す手順。100万tokens当たり190/950 Credits、キャッシュ条件、2回のJSON抽出と費用、Node/Python検証器、9つの拒否例を示します。構造と原文一致を分け、最低料金とHaikuの100K境界も確認します。

Orux AI公開 8 分で読めます
Claude Sonnet 5.5 API:料金とJSON抽出の検証 — Claude Sonnet 5.5 APIをOpenAI Python SDKで呼び出す手順。
目次

Claude Sonnet 5.5 API:料金、呼び出し、検証済みJSON抽出

Claude Sonnet 5.5 APIのAnthropic定価は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、実際に2回実行したJSON抽出、初回の不一致を検出した検証器、2回分の費用を示します。

Claude Sonnet 5.5 APIの概要

Claude Sonnet 5.5は2026年9月28日公開のAnthropicの中間モデルです。Haikuでは不足し、Opusでは高すぎるタスクの候補になります。次は2026年10月29日確認、100万tokens当たりの料金です。

料金(100万tokens当たり)Anthropic定価Orux AI定価に対する割合
入力$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は1 Credit=$0.005、200 Credits=$1の固定換算で請求します。括弧内のドルは比較用です。

表に含まれない点が3つあります。

  • Orux AIのチャットは1リクエスト最低0.001 Creditsです。
  • Anthropic Batch APIは50%割引ですが、Orux AIではこのモデルのバッチ処理を提供していません。上表は通常の非バッチ比較です。
  • 失敗リクエストは課金せず、完了した呼び出しのみを前払残高から請求します。月額料金はありません。

3つの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.

2回目も未編集です。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、値型、非負金額、実在日付を調べます。第2ファイルを渡すと、値と順序も参照回答と比較します。本例の期待値は編集者が原記録から手入力し、2回目と一致したため、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、2回目は合格しました。

呼び出しから検証まで続けるなら、入門のクライアントを再利用します。

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通りに故意に壊して検査し、全て拒否されました。Python移植はNodeと同じラベルですが、Markdown例はJSON.parseエラーでなくjsonになります。モデルが9回失敗したのではなく、検証器の試験です。

  • ID重複:id
  • 項目の余分なキー:keys
  • 1件削除:source_mismatch
  • 12000を文字列「12000」へ:insurance_usd
  • 不明評価のnullを0へ:source_mismatch
  • 確定ゼロをnullへ:source_mismatch
  • 到着日を2026-02-30へ:arrival_date
  • 12000を12500へ:source_mismatch
  • JSONをMarkdownコード柵で囲む:解析時拒否

2回のモデル呼出しと9例は今回の観測で、信頼率ではありません。失敗した取込は止め、人に回してください。

実際の2回の費用

報告使用量は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倍なので、通常はプロンプト短縮より出力形式を締めることから検討します。2回平均0.27151 Creditsなら月10,000件の同様な抽出は約2,715 Credits($13.58)です。

Haiku 5.5やOpus 5.5を選ぶ場合

入力2000・出力500tokens/回の同じ仮定を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は入力100,000tokens超で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を呼べますか?

はい。https://orux.top/api/v1を指定し、Orux AIキーとmodel="claude-sonnet-5-5"を使います。標準Chat Completionsの他部分は変わりません。Anthropicにも互換層があり、現在の文書はテスト用途と機能制約を説明しています。ネイティブAPIとの差を確認してください。

1回のClaude Sonnet 5.5はいくらですか?

Orux AIでは100万入力190 Credits、出力950 Creditsを使用量に掛けます。実測402入力/195出力の呼出しは0.26163 Credits(約$0.0013)、Anthropic定価なら約$0.0028でした。チャット1回の最低料金は0.001 Creditsです。

Orux AIでSonnet 5.5のキャッシュを使えますか?

モデルページには100万tokens当たり読取12 Credits、5分書込237.5、1時間書込380の価格があります。システムプロンプトや文書など、長く同一の接頭部分をキャッシュ期間内に複数回使う場合に節約を検討できます。

リクエストが失敗するとどうなりますか?

失敗は課金せず、完了した呼出しだけに支払います。402は入金、401はキー確認、429はジッター付き指数バックオフです。解析できても自分の検証器に落ちた応答は完了済みで課金されるため、出力を短く保つ理由にもなります。

出典と次の操作

Claude Sonnet 5.5ページで保存済み「Museum inventory · validated extraction」を選べます。読込はフォームを埋めるだけで実行しません。料金確認日2026-10-29。出典:Anthropic料金、SDK互換性、Orux AI料金。

Orux AI で Claude Sonnet 5.5ページ を試すモデルページでオンライン試用し、料金と API の例を確認できます。モデルを開くOrux AI で Claude Haiku 5.5 を試すモデルページでオンライン試用し、料金と API の例を確認できます。モデルを開くOrux AI で Claude Opus 5.5 を試すモデルページでオンライン試用し、料金と API の例を確認できます。モデルを開く

1 つの API でこれらのモデルを利用

チャット・画像・動画・音声モデルに対応した OpenAI 互換 API。Credits で従量課金です。