HiAPI
ブログ

チュートリアル

HiAPI API で imagen-4.0-ultra を使う方法:curl、Python、実行可能なリクエスト例

HiAPI の OpenAI 互換エンドポイントから最高画質の画像モデルを呼び出すためのステップバイステップガイド

Nov 3, 2026
文章封面图:深青底色上以平面切割面构成的水晶矿物截面,青绿与墨绿刻面均衡排布。

imagen-4.0-ultra とは何か、いつ選ぶべきか

imagen-4.0-ultra は imagen-4.0 シリーズの中で最も高い忠実度を持つ階層であり、HiAPI はこれをチャットやその他のモデルシリーズと同じ OpenAI 互換エンドポイント上で画像生成モデルとして公開しています。メンタルモデルはシンプルです。画像を記述した構造化 JSON のリクエストボディを送信すると、チャット補完結果ではなく画像データが返ってきます。

各階層の選択は、主にタスクによって決まり、ランキングによるものではありません:

  • 下書きと反復。 プロンプトを探索したり、構図をテストしたり、方向性を決めるためのサムネイルを生成したりする場合は、より軽量な画像モデルの方が高速に返り、生成ごとのコストも低くなります。ultra は本当に重要なラウンドまで取っておきましょう。
  • 最終素材。 キービジュアル、マーケティングビジュアル、そして人間が原寸で確認するあらゆるコンテンツは、ultra 階層のディテール、プロンプトへの忠実度、そして複数の被写体やテキスト的な要素を含む複雑なシーンを扱う能力から恩恵を受けます。
  • 品質基準を設けたバッチパイプライン。 よくあるパターンは、まず軽量モデルで広く下書きを生成し、選ばれたプロンプトだけを imagen-4.0-ultra で再実行するというものです。HiAPI はモデル ID をリクエストボディに含めるため、階層の切り替えは新しい統合を行うのではなく、文字列を1つ変更するだけで済みます。

あらかじめ想定しておくべき点がいくつかあります。画像生成は即時ではありません。単一の ultra リクエストはテキスト補完よりも明らかに長くかかる可能性があるため、クライアントを設計する際は余裕のあるタイムアウトを設定し、サブ秒のレイテンシを前提にしないでください。また、レスポンスは choices 配列ではなくバイナリ画像データを運ぶため、チャットモデル向けに書かれた解析コードはそのままでは使えません。これに早めに備えてください。

ultra が必要かどうかわからない場合は、まず最小限のリクエストを送信し、実際に納品予定の解像度で出力を確認してから、より軽量な階層と比較してください。縮小されたプレビューで画質を判断するのは誤解を招きます。

前提条件と認証設定

最初のリクエストを送信する前に、3つのことを確認してください。HiAPI の API キーを持っていること、OpenAI 互換 API エンドポイントのベース URL を知っていること、そしてツールが HTTPS リクエストを発行できること(curl、または requests を含む Python、さらに httpx でも可)です。

キーをコードから遠ざける

キーはスクリプトに貼り付けるのではなく、環境変数に保存します:

export HIAPI_API_KEY="your_api_key_here"

本番環境では、プラットフォームのシークレットマネージャーを使用し、実行時に値を注入してください。キーをコードリポジトリにコミットすることは資格情報漏洩の最も一般的な原因であり、キーのローテーションは環境変数から読み取るよりもはるかに苦痛です。

認証ヘッダー

すべてのリクエストは標準の Bearer トークンヘッダーを伴います:

Authorization: Bearer $HIAPI_API_KEY
Content-Type: application/json

両方のヘッダーが重要です。Content-Type を欠くと、サーバーがリクエストボディを拒否したり誤って解析したりする可能性があり、時に明確な検証メッセージではなく、紛らわしい汎用エラーとして現れます。

同じキーと同じヘッダーパターンが HiAPI 上のすべてのモデルシリーズで機能します。これが統一エンドポイントの実利的な利点です。1つの資格情報、1つのクライアント、複数のモデルです。

簡単な健全性チェック

手元にチャット対応のモデル ID がある場合は、まずシンプルなテキストリクエストを送信することが、画像リクエストボディをデバッグする前にキーとヘッダーが正しいことを低コストで確認する方法です。認証の問題とリクエストボディの問題を切り分けることは、本当に時間の節約になります。テキストリクエストが成功して画像リクエストが失敗するなら、問題は画像リクエストボディにあるとわかります。

リクエストボディを組み立てる

画像を生成できる最小限のリクエストボディから始めます。モデル ID とプロンプトです。それ以外はすべてオプションの最適化です。

{
  "model": "imagen-4.0-ultra",
  "prompt": "A sunlit reading room with tall windows, a wooden desk, and shelves of worn books, soft dust motes in the light"
}

2つの原則がこれを保守可能に保ちます。第一に、モデル ID は HiAPI がこのモデルについて記録しているものと完全に一致しなければなりません。スペースなし、独自のバージョンサフィックスなしです。第二に、プロンプトは純粋な自然言語です。写真家に画像を説明するように書き、抽象的な形容詞よりも具体的な名詞や光・構図の手がかりを好んでください。

通常うまくいくプロンプトの形

  • まず被写体、次にシーン、次にスタイル。 「A fox in a snowy birch forest, morning light, shallow depth of field」の方が、スタイルキーワードの羅列より信頼できます。
  • 構図について具体的に。 カメラアングル、フレーミング、レイアウトがユースケースにとって重要なら、それを述べてください。
  • 矛盾を避ける。 同じ文で「ミニマル」と「凝った装飾的ディテール」を要求すると、望まない妥協的な結果が生まれがちです。

サイズとアスペクト比

画像モデルは通常、幅/高さまたはアスペクト比のオプションを受け付けますが、正確なパラメータ名とサポートされる値はモデルによって異なります。推測せず、HiAPI のそのモデルのパラメータドキュメントを確認し、そこに記載された値のみを使用してください。モデルがサポートしないサイズや比率を渡すと、検証エラーが返ることが期待されます(サイレントなフォールバックではありません)。

安全なワークフローは次のとおりです。まずデフォルト値で開始し、成功レスポンスを一度確認してから、サイズパラメータを1つずつ追加して出力を確認します。パラメータを追加した後にリクエストが失敗し始めたら、原因を最後の変更に特定できたことになります。

最初のリクエストにはオプションパラメータを一切含めないでください。2つのフィールドだけで機能するリクエストボディは、10個のフィールドで失敗するリクエストボディよりも良い基盤です。

実行可能な curl リクエスト

キーをエクスポートした後、これはコピーして改変できるリクエストの形です:

curl -sS -X POST "$HIAPI_BASE_URL/images/generations" \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "imagen-4.0-ultra",
    "prompt": "A sunlit reading room with tall windows, a wooden desk, and shelves of worn books, soft dust motes in the light"
  }'

各部分の役割:

  • -X POST —— 画像生成は作成操作であり、読み取り操作ではありません。
  • URL —— HiAPI の OpenAI 互換エンドポイント上の画像生成ルートです。HIAPI_BASE_URL を HiAPI ドキュメントに示されたベース URL に設定すれば、ホストが変わってもパスは正しく保たれます。
  • 2つのヘッダー —— 上述の Bearer 認証と JSON コンテンツタイプです。
  • -d リクエストボディ —— Python で再利用するのと同じ JSON です。引用符が重要です。ペイロードをシングルクォートで囲み、シェルによる中身の展開を防ぎます。

デバッグのヒント

-i を付けるとレスポンスヘッダーが含まれるため、リクエストボディが大きくても HTTP ステータスを確認できます。実際に何が送信されたかを確認したい場合は -v を付けて送信されたリクエスト行を読んでください。不正な URL や欠落したヘッダーを素早く明らかにします。

ターミナルの出力が大量の base64 やバイナリのノイズであれば、それはリクエストが成功した証拠です。それをログにパイプしないでください。よりクリーンな方法についてはレスポンス処理のセクションを参照してください。生のレスポンスをファイルにリダイレクトする(> out.json)のは一度きりの確認には問題ありません。

curl が成功ステータスと解析可能なボディを返したら、検証済みの契約ができたことになります。Python のステップではこの正確な JSON を(構造的に)バイト単位で再現すべきであり、そうすれば以後の失敗は別のリクエストではなくコードに起因すると特定できます。

Python での同じリクエスト

requests を使用した等価な呼び出しは curl バージョンと近い形を保つため、クロスチェックが容易になります:

import os
import requests

base_url = os.environ["HIAPI_BASE_URL"]
api_key = os.environ["HIAPI_API_KEY"]

payload = {
    "model": "imagen-4.0-ultra",
    "prompt": (
        "A sunlit reading room with tall windows, a wooden desk, "
        "and shelves of worn books, soft dust motes in the light"
    ),
}

response = requests.post(
    f"{base_url}/images/generations",
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    json=payload,
    timeout=120,
)
response.raise_for_status()
result = response.json()

実践で重要な点:

  • json=payload は辞書をシリアライズし、コンテンツタイプを自動設定します。明確さのため、または curl との一貫性のために、ヘッダーを明示的に渡しても構いません。
  • timeout=120 は飾りではありません。画像生成は遅い可能性があります。明示的なタイムアウトがないとライブラリのデフォルト値を継承し、それは予想より短い可能性があり、クライアントの中止がサーバー障害のように見えます。
  • raise_for_status() は 4xx および 5xx レスポンスを例外に変換し、不正な形式のエラーレスポンスボディが解析コードに流れ込むのを防ぎます。

再利用のためのカプセル化

呼び出しを小さな関数にまとめ、プロンプトとオプションパラメータを受け取り、解析済みの結果を返し、モデル ID、プロンプト長、ステータスコード、所要時間のみを記録してください。この1行のログでほとんどの問題をデバッグでき、ログアグリゲーターに数メガバイトの画像データを保存する必要はありません。

リクエストボディは純粋な JSON なので、同じ関数を HiAPI 上の他の画像モデルに使用できます。モデル ID を置き換え、必要に応じてサポートされるサイズパラメータを置き換えるだけです。テストスクリプトにサンプルプロンプトをいくつか保持しておけば、クライアントをアップグレードした後でも既知の動作するリクエストを再実行して素早くシグナルを得られます。

画像レスポンスの処理

レスポンスは画像ペイロードであり、チャット補完ではありません。choices[0].message.content を探さないでください。HiAPI ドキュメントに記載されている、画像ルートが実際に返す内容に一致する解析コードを書いてください。

防御的な解析

レスポンスは通常、画像データを base64 文字列として運び、時にはメタデータも伴います。フィールドの存在を確認してからデコードしてください:

import base64

item = result["data"][0]
image_b64 = item.get("b64_json")
if image_b64 is None:
    # 一部のレスポンスは URL やその他の形式を運ぶ可能性があります。ドキュメントを参照してください
    raise ValueError(f"Unexpected image payload keys: {list(item)}")

image_bytes = base64.b64decode(image_b64)
with open("output.png", "wb") as f:
    f.write(image_bytes)

エラーメッセージ内の list(item) が有用な部分です。ペイロードが変わったとき、推測させるのではなく実際のキーを教えてくれます。

バイナリを捨てずにログを記録する

画像リクエストの生のレスポンスボディを絶対にログに記録しないでください。大きく、ほとんど読めません。ステータスコード、コンテンツ長、モデル ID、そしてデコードされた画像のハッシュまたはバイト数を記録してください。これで各プロンプトが異なる画像を生成したことを検証するのに十分であり、ストレージを肥大化させません。

運用上の習慣

  • 保存前に検証する。 デコードされたバイトが認識可能な画像シグネチャで始まることを確認し、ファイル書き込み箇所でデコードエラーを捕捉してください。
  • アトミックな書き込み。 一時パスに保存し、成功後にリネームしてください。書き込み途中のクラッシュが、有効に見える切り詰められたファイルを残すことはありません。
  • プロンプトを出力と一緒に保存する。 各画像の横にプロンプト、モデル ID、サイズパラメータを保存してください。後で関係者がバリエーションを求めたとき、元のリクエストが必要になります。
  • 保持ルールを設定する。 生成された画像は蓄積し続けます。それらをどこに保存し、どれだけ保持するかを早めに決めてください。

失敗したリクエストのトラブルシューティング

初回リクエストの失敗のほとんどは3つのカテゴリに分類できます。プロンプトを変更する前に、この順序で確認してください。

認証の失敗

401 または 403 はほぼ常にヘッダーが誤っていることを意味します。スキームが正確に Bearer であり、その後にスペースとキーが続き、末尾の空白や余分な引用符がないことを確認してください。環境変数がリクエストを実行しているシェルまたはプロセスに実際に設定されていることを確認してください。あるターミナルでエクスポートされたキーは別のターミナルには存在しません。最近キーをローテーションした場合は、古い値が設定ファイルやデプロイシークレットにまだキャッシュされていないことを確認してください。

モデル ID の誤り

モデル未検出のレスポンスは、model フィールドが HiAPI に登録された ID と一致しないことを意味します。識別子は再入力するのではなく、HiAPI モデルドキュメントからコピーしてください。1文字の誤りや独自のバージョンサフィックスで失敗するのに十分です。階層を比較するためにモデル ID を切り替える場合は、置換がコメントだけでなくリクエストボディに反映されていることを確認してください。

パラメータの拒否

特定のフィールドを指す検証エラーは通常、サポートされていないサイズ、アスペクト比、またはモデルが受け付けないオプションパラメータを意味します。すべてのオプションフィールドを削除し、最小の2フィールドリクエストが成功することを確認してから、パラメータを1つずつ戻してください。これで問題箇所を即座に特定できます。

その他の症状

  • 200 だがボディが空または解析不能 —— 間違ったフィールドを読んでいる可能性があります。ペイロードの内部にインデックスする前に、トップレベルのキーを確認してください。
  • クライアントがタイムアウトしたがサーバー側では課金済み —— タイムアウトが短すぎる可能性があります。それを増やし、同じプロンプトで一度再試行してから失敗と判断してください。
  • curl と Python で JSON が異なる —— Python でシリアライズされたペイロードを出力し、curl の -d 文字列と比較してください。ここでの違いが「curl では動く」という報告のほとんどを説明します。

順番に1つずつ確認すれば、プロンプトを1文字も変更せずに初回統合の問題の大多数を解決できます。その後、クライアントや SDK のアップグレードのたびに、小さなテストスクリプトで既知の動作するプロンプトを実行し、リグレッションを早期に発見してください。

永続的なAIアーティファクトで開発を始める

APIキーを取得して、タスクベースの1つのAPIで画像・動画・音声モデルを呼び出せます。

APIドキュメントを読む