GLM-5.1 APIの使い方: コード例付き完全ガイド

Ashley Innocent

Ashley Innocent

8 4月 2026

GLM-5.1 APIの使い方: コード例付き完全ガイド

TL;DR (要約)

GLM-5.1は、BigModel API(https://open.bigmodel.cn/api/paas/v4/)を通じて利用できます。このAPIはOpenAI互換で、エンドポイント構造、リクエスト形式、ストリーミングパターンはすべて同じです。BigModelアカウント、APIキー、およびモデル名glm-5.1が必要です。このガイドでは、認証、最初のリクエスト、ストリーミング、ツール呼び出し、およびApidogとの統合テストについて説明します。

はじめに

GLM-5.1はZ.AIのフラッグシップであるエージェントモデルで、2026年4月にリリースされました。SWE-Bench Proで1位を獲得し、主要なコーディングベンチマークすべてにおいてGLM-5を上回っています。AIコーディングアシスタント、自律型エージェント、または長期にわたるタスク実行の恩恵を受けるアプリケーションを構築しているなら、GLM-5.1は統合する価値があります。

開発者にとっての良いニュースは、このAPIがOpenAI互換であることです。すでにGPT-4やClaudeで開発している場合、ベースURLとモデル名を変更するだけでGLM-5.1に切り替えることができます。新しいSDKを学習する必要も、異なるレスポンス形式に対応する必要もありません。

💡
エージェントAPIの主な課題はテストです。何分にもわたって何百ものツール呼び出しを実行するモデルは、クォータを使い果たすことなく実際のAPIに対してテストするのが困難です。Apidogのテストシナリオはこれを解決します。エージェントが行うリクエストの完全なシーケンスを定義し、各状態に対するレスポンスをモックし、本番環境に移行する前にストリーミング、ツール呼び出し、エラー条件を正しく処理しているかを検証できます。このガイドのテストセクションを試すために、Apidogを無料でダウンロードしてください。
button

前提条件

最初のリクエストを行う前に、以下のものが必要です。

  1. bigmodel.cnでの**BigModelアカウント**。登録は無料です。
  2. BigModelコンソールのAPIキーセクションから取得した**APIキー**。
  3. **Python 3.8+** または **Node.js 18+**(両方の例があります)。
  4. **OpenAI SDK** または標準の requests/fetch(GLM-5.1のAPIはOpenAI互換です)。

APIキーを環境変数として設定してください。

export BIGMODEL_API_KEY="your_api_key_here"

ソースコードにAPIキーをハードコードしないでください。

認証

すべてのリクエストは、AuthorizationヘッダーにBearerトークンを必要とします。

Authorization: Bearer YOUR_API_KEY

BigModel APIキーの形式は xxxxxxxx.xxxxxxxxxxxxxxxx のように、ドットで区切られた2つの部分からなる文字列です。これはOpenAIの sk- 形式とは異なりますが、ヘッダーでの動作は同じです。

ベースURL

https://open.bigmodel.cn/api/paas/v4/

チャット補完のエンドポイントは次のとおりです。

POST https://open.bigmodel.cn/api/paas/v4/chat/completions

最初のリクエスト

curlを使用する

curl https://open.bigmodel.cn/api/paas/v4/chat/completions \
  -H "Authorization: Bearer $BIGMODEL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "glm-5.1",
    "messages": [
      {
        "role": "user",
        "content": "Write a Python function that finds all prime numbers up to n using the Sieve of Eratosthenes."
      }
    ],
    "max_tokens": 1024,
    "temperature": 0.7
  }'

Pythonを使用する (requestsライブラリ)

import os
import requests

api_key = os.environ["BIGMODEL_API_KEY"]

response = requests.post(
    "https://open.bigmodel.cn/api/paas/v4/chat/completions",
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    },
    json={
        "model": "glm-5.1",
        "messages": [
            {
                "role": "user",
                "content": "Write a Python function that finds all prime numbers up to n using the Sieve of Eratosthenes."
            }
        ],
        "max_tokens": 1024,
        "temperature": 0.7
    }
)

result = response.json()
print(result["choices"][0]["message"]["content"])

OpenAI SDKを使用する (推奨)

APIがOpenAI互換であるため、公式のOpenAI Python SDKをカスタムベースURLで使用できます。

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["BIGMODEL_API_KEY"],
    base_url="https://open.bigmodel.cn/api/paas/v4/"
)

response = client.chat.completions.create(
    model="glm-5.1",
    messages=[
        {
            "role": "user",
            "content": "Write a Python function that finds all prime numbers up to n using the Sieve of Eratosthenes."
        }
    ],
    max_tokens=1024,
    temperature=0.7
)

print(response.choices[0].message.content)

これが最もクリーンなアプローチです。OpenAI SDKは、リトライ、タイムアウト管理、レスポンス解析を処理します。BigModelのベースURLを指定するだけで、これらすべてを無料で利用できます。

レスポンス形式

レスポンス構造はOpenAIと同一です。

{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1744000000,
  "model": "glm-5.1",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "def sieve_of_eratosthenes(n):\n    ..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 32,
    "completion_tokens": 215,
    "total_tokens": 247
  }
}

レスポンステキストには result["choices"][0]["message"]["content"] でアクセスします。

usageフィールドは、リクエストのトークン数を示します。GLM-5.1はピーク時間帯(UTC+8 14:00〜18:00)にクォータの3倍を消費するため、これを追跡してクォータ消費を監視してください。

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

長いコード生成タスクの場合、ストリーミングは完全なレスポンスを待つのではなく、トークンが到着するたびに提供します。これは、ユーザー向けのアプリケーションにとって不可欠です。

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["BIGMODEL_API_KEY"],
    base_url="https://open.bigmodel.cn/api/paas/v4/"
)

stream = client.chat.completions.create(
    model="glm-5.1",
    messages=[
        {
            "role": "user",
            "content": "Explain how a B-tree index works in a database, with a code example."
        }
    ],
    stream=True,
    max_tokens=2048
)

for chunk in stream:
    if chunk.choices[0].delta.content is not None:
        print(chunk.choices[0].delta.content, end="", flush=True)

print()  # ストリーミング完了後に改行

ストリーム内の各チャンクは、前回のチャンク以降の新しいトークンのみを含むデルタです。最後のチャンクは finish_reason"stop"(トークン制限に達した場合は "length")に設定されます。

生のHTTPリクエストでのストリーミング

OpenAI SDKを使用しない場合:

import os
import json
import requests

api_key = os.environ["BIGMODEL_API_KEY"]

response = requests.post(
    "https://open.bigmodel.cn/api/paas/v4/chat/completions",
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    },
    json={
        "model": "glm-5.1",
        "messages": [{"role": "user", "content": "Write a merge sort in Python."}],
        "stream": True,
        "max_tokens": 1024
    },
    stream=True
)

for line in response.iter_lines():
    if line:
        line = line.decode("utf-8")
        if line.startswith("data: "):
            data = line[6:]
            if data == "[DONE]":
                break
            chunk = json.loads(data)
            delta = chunk["choices"][0]["delta"]
            if "content" in delta:
                print(delta["content"], end="", flush=True)

ツール呼び出し

GLM-5.1はツール呼び出しをサポートしています。これは、会話の途中で関数実行をリクエストする機能です。これは、モデルがコードを実行したり、データベースを検索したり、外部APIを呼び出したり、現実世界で行動を起こしたりする必要があるエージェントワークフローの核となるメカニズムです。

ツールの定義

import os
import json
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["BIGMODEL_API_KEY"],
    base_url="https://open.bigmodel.cn/api/paas/v4/"
)

tools = [
    {
        "type": "function",
        "function": {
            "name": "run_python",
            "description": "Execute Python code and return the output. Use this to test, profile, or benchmark code.",
            "parameters": {
                "type": "object",
                "properties": {
                    "code": {
                        "type": "string",
                        "description": "The Python code to execute"
                    }
                },
                "required": ["code"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "read_file",
            "description": "Read the contents of a file",
            "parameters": {
                "type": "object",
                "properties": {
                    "path": {
                        "type": "string",
                        "description": "File path to read"
                    }
                },
                "required": ["path"]
            }
        }
    }
]

response = client.chat.completions.create(
    model="glm-5.1",
    messages=[
        {
            "role": "user",
            "content": "Write a function to compute Fibonacci numbers, test it for n=10, and show me the output."
        }
    ],
    tools=tools,
    tool_choice="auto"
)

message = response.choices[0].message
print(f"完了理由: {response.choices[0].finish_reason}")

if message.tool_calls:
    for tool_call in message.tool_calls:
        print(f"\n呼び出されたツール: {tool_call.function.name}")
        print(f"引数: {tool_call.function.arguments}")

ツール呼び出しレスポンスの処理

GLM-5.1がツール呼び出しをリクエストしたら、関数を実行し、次のメッセージで結果を返します。

import subprocess

def execute_tool(tool_call):
    """ツールを実行し、結果を返します。"""
    name = tool_call.function.name
    args = json.loads(tool_call.function.arguments)

    if name == "run_python":
        result = subprocess.run(
            ["python3", "-c", args["code"]],
            capture_output=True,
            text=True,
            timeout=10
        )
        return result.stdout or result.stderr

    elif name == "read_file":
        try:
            with open(args["path"]) as f:
                return f.read()
        except FileNotFoundError:
            return f"エラー: ファイル {args['path']} が見つかりません"

    return f"不明なツール: {name}"


def run_agent_loop(user_message, tools, max_iterations=20):
    """ツール呼び出しを含む完全なエージェントループを実行します。"""
    messages = [{"role": "user", "content": user_message}]

    for i in range(max_iterations):
        response = client.chat.completions.create(
            model="glm-5.1",
            messages=messages,
            tools=tools,
            tool_choice="auto",
            max_tokens=4096
        )

        message = response.choices[0].message
        messages.append(message.model_dump())

        if response.choices[0].finish_reason == "stop":
            # モデルは完了しました
            return message.content

        if response.choices[0].finish_reason == "tool_calls":
            # 各ツール呼び出しを実行し、結果を追加します
            for tool_call in message.tool_calls:
                tool_result = execute_tool(tool_call)
                messages.append({
                    "role": "tool",
                    "tool_call_id": tool_call.id,
                    "content": tool_result
                })

    return "最大イテレーション数に達しました"


result = run_agent_loop(
    "Write a quicksort implementation, test it with a random list of 1000 integers, and report the time.",
    tools
)
print(result)

このパターンは、エージェントモデルとしてのGLM-5.1の強みに直接スケールします。モデルにツールの呼び出し時期を決定させ、結果を処理させ、解決策に達するか完了と判断するまで続行させます。

主要なパラメータ

パラメータ タイプ デフォルト 説明
model 文字列 必須 "glm-5.1" を使用
messages 配列 必須 会話履歴
max_tokens 整数 1024 生成する最大トークン数 (最大163,840)
temperature 浮動小数点数 0.95 ランダム性。低いほど決定論的。範囲: 0.0-1.0
top_p 浮動小数点数 0.7 ニュークリアスサンプリング。Z.AIはコーディングタスクに0.7を推奨しています。
stream 真偽値 false ストリーミングレスポンスを有効にする
tools 配列 null ツール呼び出しのための関数定義
tool_choice 文字列/オブジェクト "auto" "auto""none"、または特定のツール
stop 文字列/配列 null カスタム停止シーケンス

コーディングタスクの推奨設定:

{
    "model": "glm-5.1",
    "temperature": 1.0,
    "top_p": 0.95,
    "max_tokens": 163840  # 長期のエージェント実行のためのフルコンテキスト
}

Z.AIは、独自のベンチマーク評価でこれらの設定を使用しています。決定論的なコード生成のためには、`temperature`を0.2〜0.4に下げてください。

GLM-5.1をコーディングアシスタントで使用する

Z.AIコーディングプランでは、Claude Code、Cline、Kilo Code、その他のAIコーディングアシスタントをBigModel API経由でGLM-5.1にルーティングできます。これは、Claude OpusやGPT-5.4を直接実行するよりも低コストで強力なコーディングモデルが必要な場合に役立ちます。

Claude Codeのセットアップ

Claude Code設定ファイル(~/.claude/settings.json または同等のファイル)で:

{
  "model": "glm-5.1",
  "baseURL": "https://open.bigmodel.cn/api/paas/v4/",
  "apiKey": "your_bigmodel_api_key"
}

Cline / Roo Codeのセットアップ

VS Codeの設定またはCline拡張機能の設定で:

{
  "cline.apiProvider": "openai",
  "cline.openAIBaseURL": "https://open.bigmodel.cn/api/paas/v4/",
  "cline.openAIApiKey": "your_bigmodel_api_key",
  "cline.openAIModelId": "glm-5.1"
}

クォータ消費量

GLM-5.1は、トークンごとの課金ではなく、Z.AIクォータシステムを使用します。

大量のエージェントワークロードの場合、長時間実行されるタスクはオフピーク時間にスケジュールしてください。Z.AIが示したような600イテレーションの最適化実行は、ピーク時にはるかに多くのクォータを消費します。

ApidogでGLM-5.1 APIをテストする

エージェントAPI統合をテストするには、通常の補完、ストリーミングチャンク、ツール呼び出しリクエスト、ツール結果メッセージ、エラー状態など、複数のレスポンスタイプを正しく処理する必要があります。これらすべてを実際のAPIに対してテストすると、クォータを消費し、ライブ接続が必要になります。

Apidogのスマートモックを使用すると、これらすべてのレスポンス状態を定義し、実際のAPIにアクセスすることなくテストできます。

モックエンドポイントのセットアップ

  1. Apidogで新しいエンドポイントを作成します:POST https://open.bigmodel.cn/api/paas/v4/chat/completions
  2. 標準的な成功レスポンスのモック期待値を追加します。
{
  "id": "chatcmpl-test123",
  "object": "chat.completion",
  "created": 1744000000,
  "model": "glm-5.1",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "def sieve(n): ..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 32,
    "completion_tokens": 120,
    "total_tokens": 152
  }
}
  1. ツール呼び出しレスポンスの2番目の期待値を追加します。
{
  "id": "chatcmpl-tool456",
  "object": "chat.completion",
  "created": 1744000001,
  "model": "glm-5.1",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": null,
        "tool_calls": [
          {
            "id": "call_abc",
            "type": "function",
            "function": {
              "name": "run_python",
              "arguments": "{\"code\": \"print(2+2)\"}"
            }
          }
        ]
      },
      "finish_reason": "tool_calls"
    }
  ],
  "usage": {
    "prompt_tokens": 48,
    "completion_tokens": 35,
    "total_tokens": 83
  }
}
  1. レート制限レスポンス (HTTP 429) を追加します。
{
  "error": {
    "message": "Rate limit exceeded. Please retry after 60 seconds.",
    "type": "rate_limit_error",
    "code": "rate_limit_exceeded"
  }
}

完全なエージェントループのテスト

Apidogのテストシナリオを使用して、複数のリクエストを連鎖させます。エージェントループテストの場合:

  1. ステップ1:最初のメッセージで /chat/completionsPOST し、200 および finish_reason == "tool_calls" をアサートします。
  2. ステップ2:メッセージ配列にツール結果を含めて再度 POST し、200 および finish_reason == "stop" をアサートします。
  3. ステップ3:最終的なコンテンツを抽出し、予期されるコードが含まれていることをアサートします。

これにより、クォータを消費することなく完全なエージェントループをテストできます。モックを429を返すように切り替えて、リトライロジックが正しく機能するかどうかを検証することで、エラー処理もテストできます。

複数ステップのエージェントワークフローの場合、Apidogのテストシナリオを使用すると、変数を使用してステップ間でデータを渡すことができるため、ステップ1からの request_id または tool_call_id の値が自動的にステップ2に渡されます。これは、実際のエージェントループの動作を模倣し、本番環境に移行する前に統合のバグを発見します。

エラー処理

APIは標準のHTTPステータスコードを返します。

ステータス 意味 アクション
200 成功 レスポンスを通常通り処理する
400 不正なリクエスト リクエスト形式を確認する
401 認証されていない APIキーを確認する
429 レート制限 Retry-Afterヘッダーの値に従って再試行する
500 サーバーエラー 指数バックオフで再試行する
503 サービス利用不可 指数バックオフで再試行する
import time
import requests

def call_with_retry(payload, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = requests.post(
                "https://open.bigmodel.cn/api/paas/v4/chat/completions",
                headers={"Authorization": f"Bearer {os.environ['BIGMODEL_API_KEY']}",
                         "Content-Type": "application/json"},
                json=payload,
                timeout=120
            )

            if response.status_code == 429:
                retry_after = int(response.headers.get("Retry-After", 60))
                print(f"レート制限。{retry_after}秒待機しています...")
                time.sleep(retry_after)
                continue

            response.raise_for_status()
            return response.json()

        except requests.exceptions.Timeout:
            wait = 2 ** attempt
            print(f"試行 {attempt + 1} でタイムアウトしました。{wait}秒後に再試行します...")
            time.sleep(wait)

    raise Exception("最大再試行回数を超えました")

個々のステップが30〜60秒かかる可能性のある長いエージェント実行の場合、常に十分なタイムアウト(120〜300秒)を設定してください。モデルは、完全なコードファイルを生成したり、複雑なベンチマーク結果を分析したりするのに時間が必要な場合があります。

まとめ

GLM-5.1のOpenAI互換APIは、GPTやClaudeですでに作業したことがある場合、数分で統合できることを意味します。主な違いは、エンドポイント(open.bigmodel.cn)と、トークンごとの課金ではなくクォータシステムである点です。

モデルが長いセッションで何百ものツール呼び出しを実行するエージェントアプリケーションにとって、GLM-5.1の長期最適化機能は大きな利点です。Apidogのスマートモックとテストシナリオを介した適切なテストと組み合わせることで、自動実行される前に統合がすべてのエッジケースを処理することを確認してください。

GLM-5.1とは何か、そのベンチマークがどのように比較されるかについては、GLM-5.1モデルの概要を参照してください。Apidogを使用したAIエージェントワークフローの構築とテストの詳細については、AIエージェントメモリの仕組みを参照してください。

button

よくある質問 (FAQ)

GLM-5.1 APIはOpenAI互換ですか?
はい。リクエスト形式、レスポンス構造、ストリーミングプロトコル、およびツール呼び出し形式は、OpenAIチャット補完APIとすべて同一です。ベースURLをhttps://open.bigmodel.cn/api/paas/v4/に設定することで、公式のOpenAI Python SDKまたはOpenAI互換の任意のクライアントを使用できます。

APIリクエストで使用するモデル名は何ですか?
モデル名として"glm-5.1"を使用してください。完全なバージョン名ではなく、glm-5.1だけで動作します。

GLM-5.1 APIの料金体系はどうなっていますか?
BigModel APIはクォータシステムを使用しています。GLM-5.1はピーク時間帯(UTC+8 14:00〜18:00)にはクォータの3倍、オフピーク時には2倍を消費します。2026年4月末までは、オフピーク時の使用はプロモーション料金としてクォータの1倍で請求されます。

最大コンテキスト長はどれくらいですか?
入力コンテキストは200,000トークンです。最大出力は163,840トークンです。長いエージェント実行の場合、タスクの途中でモデルの出力が途切れるのを避けるため、max_tokensを大きな値(32,768以上)に設定してください。

GLM-5.1を関数呼び出し/ツール利用に使用できますか?
はい。GLM-5.1はOpenAIのAPIと同じツール呼び出し形式をサポートしています。type: "function"スキーマでツールを定義し、それらをtools配列で渡し、エージェントループでfinish_reason: "tool_calls"レスポンスを処理してください。

クォータを消費せずにGLM-5.1 API呼び出しをテストするにはどうすればよいですか?
Apidogのスマートモックを使用して、成功、ツール呼び出し、レート制限、エラーなど、各API状態のモックレスポンスを定義します。開発中はモックに対してテストスイートを実行し、最終検証にのみ実際のAPIを使用してください。

GLM-5.1のモデルウェイトはどこで入手できますか?
オープンソースのウェイトはHuggingFaceのzai-org/GLM-5.1にあります。MITライセンスの下でリリースされており、ローカル推論のためにvLLMとSGLangをサポートしています。

ApidogでAPIデザイン中心のアプローチを取る

APIの開発と利用をよりシンプルなことにする方法を発見できる