how-tos

Kimi K3 APIガイド:Python、Vision、ツール、1Mコンテキスト

Poyo.ai Team
4 min read
Share:

Kimi K3 API開発者ガイド

Kimi K3は、Moonshot AIが提供するOpenAI互換のChat Completions APIで、モデルID kimi-k3 として利用できます。このAPIは、常時有効な推論機能、ストリーミング、画像、アップロードした動画、厳格なJSON Schema、カスタムツール、動的ツール読み込み、そして100万トークンのコンテキストウィンドウをサポートしています。

ただし、「互換性がある」ことは「動作が同じ」であることを意味しません。K3ではサンプリング値が固定されており、ツール呼び出しや会話の後続ターンでは完全なアシスタント状態を保持する必要があります。また、推論は最終的な回答内容とは分離して処理されます。このガイドでは、そうしたK3固有の仕様に重点を置いて解説します。

提供状況と料金を2026年7月22日に更新。 Kimi K3 は Poyo.ai で kimi-k3 として OpenAI 互換 Chat Completions API から利用できます。料金は入力100万トークンあたり$2.28、出力100万トークンあたり$11.40で、公式料金より24%安価です。

必要なもの

以下を準備してください。

  • Python 3.9以降
  • openai Pythonパッケージ バージョン1.0以降
  • ソースコード管理外に安全に保存されたMoonshot APIキー
  • ベースURL https://api.moonshot.ai/v1
  • モデルID kimi-k3

SDKをインストールします。

python -m pip install --upgrade "openai>=1.0"

シェルでAPIキーを設定します。

export MOONSHOT_API_KEY="your-key"

PowerShellの場合:

$env:MOONSHOT_API_KEY="your-key"

本番環境のAPIキーをコード例、クライアントサイドのバンドル、ログ、リポジトリに含めないでください。

最初のKimi K3リクエストを送信する

Python

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["MOONSHOT_API_KEY"],
    base_url="https://api.moonshot.ai/v1",
)

response = client.chat.completions.create(
    model="kimi-k3",
    messages=[
        {"role": "user", "content": "Review this migration plan and list its three highest risks."}
    ],
)

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

cURL

curl https://api.moonshot.ai/v1/chat/completions \
  -H "Authorization: Bearer $MOONSHOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kimi-k3",
    "messages": [
      {"role": "user", "content": "Explain Kimi Delta Attention in plain language."}
    ]
  }'

推論負荷を設定する

K3では常に思考モードが有効です。推論負荷はトップレベルの reasoning_effort フィールドで設定します。

response = client.chat.completions.create(
    model="kimi-k3",
    reasoning_effort="high",
    messages=[
        {"role": "user", "content": "Find the flaw in this distributed lock design."}
    ],
)

サポートされている値は以下のとおりです。

値推奨用途
lowレイテンシや応答速度を重視する比較的簡単なタスク
high難易度の高いコーディング、分析、ツール計画
max最も難しいタスクやベンチマーク評価

ドキュメント上のデフォルトは max です。ただし、本番環境で最も低コストとは限りません。各設定で成功率、レイテンシ、生成トークン数を評価してください。

推論と最終回答をストリーミングする

ストリーミング応答では、推論内容と最終テキストが異なるdeltaフィールドで提供されます。

stream = client.chat.completions.create(
    model="kimi-k3",
    messages=[{"role": "user", "content": "Review this architecture for race conditions."}],
    stream=True,
)

for chunk in stream:
    delta = chunk.choices[0].delta
    reasoning = getattr(delta, "reasoning_content", None)
    if reasoning:
        # Store or process according to your product and provider policies.
        pass
    if delta.content:
        print(delta.content, end="", flush=True)

ユーザー向けの最終回答と内部処理用の推論内容は分離して扱ってください。reasoning_content を構造化データとして解析しないでください。

Kimi K3に画像を送信する

K3のVisionメッセージでは、コンテンツオブジェクトの配列を使用します。このフローでは公開画像URLはサポートされていないため、ローカル画像をbase64形式でエンコードしてください。

import base64
from pathlib import Path

image_data = base64.b64encode(Path("interface.png").read_bytes()).decode()

response = client.chat.completions.create(
    model="kimi-k3",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {"url": f"data:image/png;base64,{image_data}"},
                },
                {
                    "type": "text",
                    "text": "Identify the three largest accessibility problems in this interface.",
                },
            ],
        }
    ],
)

ユーザーがアップロードした画像は、エンコード前にファイル形式とサイズを検証してください。base64ペイロードはログに記録しないようにしましょう。

Kimi K3に動画を送信する

Files APIで動画をアップロードし、返されたIDを ms:// スキームで参照します。不要になったらファイルを削除してください。

from pathlib import Path

video = client.files.create(file=Path("demo.mp4"), purpose="video")

try:
    response = client.chat.completions.create(
        model="kimi-k3",
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "video_url",
                        "video_url": {"url": f"ms://{video.id}"},
                    },
                    {"type": "text", "text": "Summarize the workflow and identify failed steps."},
                ],
            }
        ],
    )
finally:
    client.files.delete(video.id)

厳格なJSON Schema形式で出力する

後続処理で決まったデータ構造が必要な場合は、strict: true を使用してください。

import json

response = client.chat.completions.create(
    model="kimi-k3",
    messages=[
        {"role": "user", "content": "Extract the risk, severity, and owner from this incident note."}
    ],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "incident_risk",
            "strict": True,
            "schema": {
                "type": "object",
                "properties": {
                    "risk": {"type": "string"},
                    "severity": {"type": "string", "enum": ["low", "medium", "high"]},
                    "owner": {"type": ["string", "null"]},
                },
                "required": ["risk", "severity", "owner"],
                "additionalProperties": False,
            },
        },
    },
)

result = json.loads(response.choices[0].message.content or "{}")

解析するのは最終的な message.content のみとし、その後もアプリケーション側で再度バリデーションを実施してください。

カスタムツールを呼び出す

最初の応答では、1つ以上のツール呼び出しが要求される場合があります。許可された各ツールを実行し、完全なアシスタントメッセージを追加した後、それぞれの tool_call_id に対応するツール結果を追加してください。

import json

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_build_status",
            "description": "Return the current build status for an allowed project.",
            "parameters": {
                "type": "object",
                "properties": {"project": {"type": "string"}},
                "required": ["project"],
                "additionalProperties": False,
            },
        },
    }
]

messages = [{"role": "user", "content": "Check the web build and summarize any failure."}]

first = client.chat.completions.create(
    model="kimi-k3",
    messages=messages,
    tools=tools,
    tool_choice="required",
)

assistant_message = first.choices[0].message
messages.append(assistant_message)

for call in assistant_message.tool_calls or []:
    arguments = json.loads(call.function.arguments)
    # Authorize and validate before executing a real tool.
    tool_result = {"project": arguments["project"], "status": "passed"}
    messages.append(
        {
            "role": "tool",
            "tool_call_id": call.id,
            "content": json.dumps(tool_result),
        }
    )

final = client.chat.completions.create(
    model="kimi-k3",
    messages=messages,
    tools=tools,
)

モデルが生成した任意のシェルコマンドを、権限管理、入力検証、限定された実行環境、監査ログなしで実行しないでください。

ツールを動的に読み込む

K3では、利用可能になった時点で完全なツール定義を system メッセージとして追加できます。このメッセージはサーバー側で保持されないため、その後の履歴にも必ず残してください。

動的読み込みにより、大規模なエージェントシステムでは毎ターンすべてのツールスキーマを送信する必要がなくなります。一方で、状態管理の要件も増えます。後続のツール結果を正しく解釈するには、モデルが元の定義を参照できる必要があります。

100万トークンのコンテキストウィンドウを活用する

大規模コンテキストは、離れた場所にある情報同士をまとめて推論する場合に最も効果を発揮します。次のポイントを意識して利用しましょう。

  1. 安定したリポジトリや文書群は先頭に配置する。
  2. プレフィックスを書き換えず、質問や結果を追記する。
  3. キャッシュ済み入力と未キャッシュ入力を区別して管理する。
  4. 全文が不要な場合は必要な部分だけ取得する。
  5. 出典識別子を付け、最終回答を検証できるようにする。
  6. K3が必要とする状態をクライアント側で保持できる場合のみ履歴を圧縮する。

自動キャッシュにはキャッシュIDや一般的なTTLパラメータはありません。安定したプレフィックスを維持することで、キャッシュが利用される可能性が高まります。

マルチターンの完全な状態を保持する

これはK3固有の統合で最も重要なルールです。

会話を継続したりツール結果を返したりする際は、APIから返された完全なアシスタントメッセージを追加してください。content だけを保持してはいけません。Moonshotによれば、K3は思考履歴を保持した状態で学習されており、必要な履歴が欠落したり、セッション途中で別モデルからK3へ切り替えたりすると、不安定な動作になる可能性があります。

会話状態は安全に保存し、保持期間を制限し、閲覧権限のないユーザーへ内部状態を公開しないようにしてください。

Kimi K3 APIの重要な制限事項

  • K3では常に思考モードが有効です。
  • reasoning_effort は low、high、max をサポートします。
  • max_completion_tokens のデフォルトは131,072で、最大1,048,576まで設定できます。
  • temperature=1.0、top_p=0.95、n=1、presence_penalty=0、frequency_penalty=0 は固定値のため指定不要です。
  • Visionメッセージでは公開画像URLはサポートされていません。
  • マルチターン会話およびツール呼び出しでは、完全なアシスタントメッセージを保持する必要があります。
  • Moonshotによると、Web検索ツールは現在更新中であり、本番環境での利用は推奨されていません。

本番運用チェックリスト

  • APIキーはサーバー側で管理する。
  • リクエストタイムアウトと制限付きリトライを設定する。
  • ツール引数を検証し、すべての操作を認可する。
  • ツール呼び出し回数と応答長を制限する。
  • K3の完全なアシスタント状態を保持する。
  • 生成後に厳格なJSONを検証する。
  • 入力、キャッシュ済み入力、出力、レイテンシ、エラーを記録する。
  • K3セッション途中でモデルを切り替えない。
  • 過剰な自律動作を抑えるため、明示的な動作制約を追加する。
  • ツール障害、部分応答、長い履歴でテストする。

コンテキストと出力の制限を決める前に、Kimi K3 API Pricingをご確認ください。Poyo.aiでの提供状況については、Kimi K3 model pageをご覧ください。

よくある質問

Kimi K3 APIはOpenAI互換ですか?

はい。MoonshotはOpenAI互換のChat Completionsエンドポイントを提供しています。ただし、K3固有の状態管理、推論、サンプリング、メディア処理のルールは適用されます。

Kimi K3のモデルIDは何ですか?

Moonshot APIの正式なモデルIDは kimi-k3 です。

Kimi K3はFunction Callingに対応していますか?

はい。カスタムツール、必須ツール選択、対応するツール結果、動的ツール読み込みをサポートしています。

Kimi K3は動画を処理できますか?

はい。Files API経由で動画をアップロードし、動画コンテンツオブジェクト内で ms:// ファイルIDを指定して参照します。

100万トークンのコンテキストウィンドウはどのように使いますか?

通常のモデルリクエストで必要なメッセージとコンテンツを送信し、自動キャッシュを活用できるよう安定したプレフィックスを維持しつつ、適切な完了トークン上限を設定してください。

参考資料

Share: