HiAPI
ブログ

チュートリアル

grok-4.6 APIの使い方:cURL、Python、そして動作するリクエスト

hiapi の OpenAI 互換チャット補完エンドポイントでストリーミング出力、ツール呼び出し、JSON モードを利用する

Sep 24, 2026
grok-4.6 APIの使い方:cURL、Python、そして動作するリクエスト

grok-4.6 は推論調整されたチャットモデルで、hiapi API を通じて利用できます。hiapi の画像・動画モデルとは異なり、非同期の /v1/tasks パイプラインを使用しません。これは同期型の OpenAI 互換チャット補完インターフェースであるため、ポーリング不要で通常の HTTP レスポンス(または SSE ストリーム)を直接受け取ります。本記事ではまず最小限の動作するリクエストを紹介し、その後、本番環境で実際に必要となる部分(ストリーミング出力、ツール呼び出し、JSON モード、エラーハンドリング)を解説します。

準備するもの

  • hiapi API キー。まだお持ちでない場合はコンソールから取得してください。以下のすべてのリクエストで、Authorization: Bearer sk-... ヘッダーに含める必要があります。
  • 任意の HTTP クライアント。サンプルでは curl と Python の requests を使用しています。どの言語を使っても JSON 構造は同じです。
  • SDK は不要です。grok-4.6 のリクエスト/レスポンス形式は OpenAI のチャット補完の慣習に非常に近いため、OpenAI 互換のツールは通常そのまま使えますが、hiapi は独自のチャット補完エンドポイントを提供しており、専用エンドポイントではありません。クライアントを https://api.hiapi.ai/v1/chat/completions に向け、ベアモデル ID grok-4.6 を使用してください。

最小限の動作するリクエスト

curl https://api.hiapi.ai/v1/chat/completions \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "grok-4.6",
    "messages": [
      {"role": "user", "content": "カルマンフィルタの役割を一文で説明してください。"}
    ]
  }'

成功時のレスポンスは次のようになります:

{
  "id": "b6c018d3-218e-9b06-aa12-5afc02e21b5c",
  "object": "chat.completion",
  "model": "grok-4.6",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "カルマンフィルタは、ノイズを含む測定値と予測モデルを組み合わせ、それぞれの不確実性に応じて重み付けすることで、時間とともに変化するシステムの真の状態を推定します。"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 24,
    "completion_tokens": 31,
    "total_tokens": 55
  }
}

回答テキストは、他の OpenAI 形式のチャット API と同様に choices[0].message.content に格納されています。

以下は requests を使った同じ呼び出しを Python で書いたものです:

import os
import requests

resp = requests.post(
    "https://api.hiapi.ai/v1/chat/completions",
    headers={"Authorization": f"Bearer {os.environ['HIAPI_API_KEY']}"},
    json={
        "model": "grok-4.6",
        "messages": [
            {"role": "user", "content": "カルマンフィルタの役割を一文で説明してください。"}
        ],
    },
    timeout=60,
)
resp.raise_for_status()
print(resp.json()["choices"][0]["message"]["content"])

grok-4.6 の推論調整パラメータ

grok-4.6 は推論モデルです。最終回答を書き出す前に「思考」のために追加のトークンを消費し、この推論トークンは出力トークンとして課金されます(現在の料金は料金ページを参照)。reasoning_effort で思考量を制御でき、値は low、medium、high、xhigh のいずれかです(省略した場合、API のデフォルトは high):

curl https://api.hiapi.ai/v1/chat/completions \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "grok-4.6",
    "messages": [{"role": "user", "content": "五つの単語で挨拶してください。"}],
    "reasoning_effort": "low"
  }'

非ストリーミングレスポンスでは、モデルの推論軌跡が message.reasoning_content に最終的な message.content とは別に提供されます。短時間・低遅延のタスクには low または medium に下げ、多段階の問題には high または xhigh を使うことで、遅延とトークンを犠牲にしてより良い回答が得られます。

ストリーミングレスポンス

"stream": true を設定すると、完全な補完を待たずに Server-Sent Events としてレスポンスを読み取れます:

curl -N https://api.hiapi.ai/v1/chat/completions \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "grok-4.6",
    "messages": [{"role": "user", "content": "1 から 5 まで数えてください。"}],
    "stream": true
  }'

各行は data: {...} データブロックです。推論トークンは choices[0].delta.reasoning_content を経由してストリーミングされ、続いて回答トークンが choices[0].delta.content を経由してストリーミングされ、ストリームはリテラル data: [DONE] で終了します:

data: {"id":"...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"reasoning_content":"列挙"},"finish_reason":null}]}

data: {"id":"...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"1, 2"},"finish_reason":null}]}

data: {"id":"...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: [DONE]

Python では、requests を使ってストリームを行ごとにイテレートできます:

import json
import requests

with requests.post(
    "https://api.hiapi.ai/v1/chat/completions",
    headers={"Authorization": f"Bearer {os.environ['HIAPI_API_KEY']}"},
    json={
        "model": "grok-4.6",
        "messages": [{"role": "user", "content": "1 から 5 まで数えてください。"}],
        "stream": True,
    },
    stream=True,
    timeout=60,
) as resp:
    for line in resp.iter_lines():
        if not line or not line.startswith(b"data: "):
            continue
        payload = line[len(b"data: "):]
        if payload == b"[DONE]":
            break
        chunk = json.loads(payload)
        delta = chunk["choices"][0]["delta"]
        if "content" in delta:
            print(delta["content"], end="", flush=True)

ツール呼び出し

grok-4.6 は OpenAI 形式の関数呼び出しをサポートしています。tools 配列を渡し、tool_choice: "auto" でモデル自身にツールを呼び出すタイミングを決定させます。

curl https://api.hiapi.ai/v1/chat/completions \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "grok-4.6",
    "messages": [{"role": "user", "content": "東京の天気はどうですか?"}],
    "tools": [
      {
        "type": "function",
        "function": {
          "name": "get_weather",
          "description": "指定した都市の現在の天気を取得する",
          "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"]
          }
        }
      }
    ],
    "tool_choice": "auto"
  }'

モデルがツールを呼び出すと判断した場合、finish_reason は "tool_calls" を返し、引数は JSON 文字列として届くため、自分で解析する必要があります:

{
  "choices": [
    {
      "message": {
        "role": "assistant",
        "tool_calls": [
          {
            "id": "call_...",
            "type": "function",
            "function": {"name": "get_weather", "arguments": "{\"city\":\"Tokyo\"}"}
          }
        ]
      },
      "finish_reason": "tool_calls"
    }
  ]
}

関数を実行した後、実行結果と一致する tool_call_id を含む role: "tool" のメッセージを messages に追加し、会話を送り返すことで、最終的な自然言語の回答を得られます。

JSON モード

ツール呼び出しの往復なしでレスポンスを解析したい場合は、response_format を設定します:

curl https://api.hiapi.ai/v1/chat/completions \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "grok-4.6",
    "messages": [
      {"role": "system", "content": "\"city\" と \"country\" の二つのキーを持つ JSON オブジェクトで回答してください。"},
      {"role": "user", "content": "エッフェル塔はどこにありますか?"}
    ],
    "response_format": {"type": "json_object"}
  }'

message.content は JSON 文字列として返されます(引き続き通常のチャット補完のエンベロープ内にあります)。手元で json.loads(...) を使って解析してください。プロンプトでモデルに実際に JSON を生成するよう指示することを忘れないでください。response_format は出力形式を制約しますが、スキーマを代わりに構築してくれるわけではありません。

本番環境での実践

  • 文書化されたエラーコードを処理する。 キーが誤っているか欠落している場合は HTTP 401 が返され、レスポンスボディは {"error":{"code":"permission_denied","message":"...","request_id":"...","type":"hiapi_error"}} です。残高不足は 402、モデル ID が無効またはパラメータ形式が誤っている場合は 400 が返されます。まずステータスコードを確認し、エラーレスポンスボディの request_id を記録してください。問題を報告する必要がある場合、これがまさに使う情報です。
  • 429 と 503 にはバックオフ付きリトライを。 hiapi はアカウント単位でレート制限を実施します。429 は上限超過、503 はモデルが一時的に利用不可であることを示します。どちらも、タイトなループではなく、上限付きの指数バックオフリトライ(例:1 秒、2 秒、4 秒、数回試行後に断念)が適しています。
  • リクエストタイムアウトを設定する。 high または xhigh の推論強度では、low よりも明らかに時間がかかります。単一のグローバル定数ではなく、使用する強度レベルに応じてクライアントのタイムアウトを設定してください。
  • ユーザー向けのシナリオではストリーミング出力を優先する。 非ストリーミング呼び出しは完全なレスポンス(すべての推論トークンを含む)が準備できるまでブロックします。ストリーミング出力なら最初のトークンを即座に UI に届けられ、reasoning_content のデルタが最終回答より先に到着した際に「思考中」状態を表示できます。
  • キーをハードコードしない。 環境変数またはシークレットマネージャーから読み込み、ソースコード管理からは決して読まないでください。上記の例が $HIAPI_API_KEY / os.environ["HIAPI_API_KEY"] から読み込んでいるのはまさにこの理由からです。

完全なパラメータリファレンス(grok-4.6 が受け付けるすべてのフィールドを含む)については、モデルページと grok-4.6 ドキュメントを参照してください。

よくある質問

hiapi 上の grok-4.6 は OpenAI SDK と互換性がありますか? リクエストとレスポンスの構造は OpenAI チャット補完の慣習(messages、choices[0].message.content、ストリーミングデルタ、ツール呼び出し)に従っているため、ベース URL とモデル ID を上書きできる OpenAI 互換ツールのほとんどは動作するはずです。ベース URL を https://api.hiapi.ai/v1 に設定し、モデル ID として grok-4.6 を使用してください。

なぜ他のモデルよりレスポンスが遅いのですか? grok-4.6 は回答前に内部推論のためにトークンを消費し、これらのトークンは出力トークンとして課金されます。遅延に敏感な呼び出しでは、reasoning_effort を low または medium に下げるか、ストリーミング出力に切り替えることで、レスポンス全体を一度に待つ必要がなくなります。

reasoning_content とは何ですか、ユーザーに隠せますか? これはモデルの中間推論軌跡で、content とは別に返されます(ストリーミング時は delta.reasoning_content として返されます)。UI でレンダリングしないことはまったく可能です。最終回答は content だけです。

401 と permission_denied を受け取りました——何が問題ですか? Authorization ヘッダーが欠落している、形式が誤っている、またはキーが無効/失効しています。Authorization: Bearer sk-... を送信しているか、コンソールで有効なキーを使用しているかを再確認してください。

同じリクエストで grok-4.6 の関数呼び出しと JSON モードを同時に使用できますか? tools/tool_choice と response_format は独立したパラメータであり、同時に設定できます。ただし、モデルがツールを呼び出すと判断した場合、そのターンの finish_reason は "tool_calls" になり、message.content が空になる可能性があります。まずツール呼び出しを処理し、その後続のターンで最終的な JSON 形式の回答を要求してください。

コストを制御するには? 推論トークンは出力トークンに計上されるため、コストは reasoning_effort とレスポンス長によって変動します。高負荷なタスクを実行する前に、料金ページで現在のトークン単価を確認してください。

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

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

APIドキュメントを読む