Kimi K3 API クイックスタート:Python、ストリーミング、ビジョン、ツール呼び出し

Kimi K3 APIをPythonとcURLから呼び出し、推論強度、ストリーミング、画像入力、構造化出力、ツール呼び出し、1Mコンテキストの制限を解説します。

Kimi K3 は、プログラミング、知識作業、および複雑な推論シナリオのための Kimi の主力モデルです。これは、キミ デルタ アテンション (KDA)、アテンション残差、MoE アーキテクチャを使用しており、パラメータ スケールは 2.8 兆で、ネイティブの視覚的理解と 100 万のトークン コンテキストを提供します。

この記事はKimi K3 官方 Quickstartに基づいており、API キーと最小限の呼び出しから始まり、Python、cURL、ストリーミング出力、ビジュアル入力、構造化出力、ツール呼び出しの実行可能な例を整理し、K2.x から移行するときに最も遭遇しやすいパラメーターの違いをマークしています。

Quick Answer

Python 3.9+ と Kimi API Key を用意し、OpenAI SDK をインストールします。キーをMOONSHOT_API_KEYに設定し、OpenAI クライアントのbase_urlhttps://api.moonshot.ai/v1に指定して、モデル名にkimi-k3を使用します。

1
python3 -m pip install --upgrade 'openai>=1.0'
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import os

from openai import OpenAI

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

completion = client.chat.completions.create(
    model="kimi-k3",
    messages=[{"role": "user", "content": "用一句话介绍 Kimi K3。"}],
)

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

K3は常に思考モードです。推論強度を明示的に設定するには、最上位フィールドreasoning_effort="max"を使用し、K2.x からthinkingパラメーターを継承しません。

APIキーと環境変数を準備する

まず Kimi API Platform で API キーを取得します。キーをスクリプトへ直接書き込んだり、Git にコミットしたりせず、環境変数で渡してください。

Windows PowerShell

1
2
$env:MOONSHOT_API_KEY = "你的 API Key"
python .\kimi_k3_demo.py

現在の Windows ユーザー用に永久に保存するには、次のコマンドを実行します。

1
[Environment]::SetEnvironmentVariable("MOONSHOT_API_KEY", "你的 API Key", "User")

保存後、ターミナルを再度開いてください。

macOS と Linux

1
2
export MOONSHOT_API_KEY="你的 API Key"
python3 kimi_k3_demo.py

cURL を使用して最小限の呼び出しを完了する

最初に Python プロジェクトを作成したくない場合は、OpenAI Chat Completions と互換性のあるインターフェイスを直接呼び出すことができます。

1
2
3
4
5
6
7
curl https://api.moonshot.ai/v1/chat/completions \
  --header "Authorization: Bearer $MOONSHOT_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
    "model": "kimi-k3",
    "messages": [{"role": "user", "content": "用一句话介绍 Kimi K3。"}]
  }'

Invoke-RestMethodを PowerShell で使用すると、Bash のバックスラッシュ改行を直接コピーすることを回避できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$headers = @{
    Authorization = "Bearer $env:MOONSHOT_API_KEY"
    "Content-Type" = "application/json"
}

$body = @{
    model = "kimi-k3"
    messages = @(
        @{ role = "user"; content = "用一句话介绍 Kimi K3。" }
    )
} | ConvertTo-Json -Depth 5

Invoke-RestMethod `
    -Uri "https://api.moonshot.ai/v1/chat/completions" `
    -Method Post `
    -Headers $headers `
    -Body $body

K3 の推論強度を設定します

K3 は現在、デフォルトでもあるmaxのみをサポートしています。公式は将来的にさらに多くのギアを追加する予定なので、この段階ではこのフィールドは省略できます。構成の意図をより明確にしたい場合は、次のように記述できます。

1
2
3
4
5
6
7
8
9
completion = client.chat.completions.create(
    model="kimi-k3",
    reasoning_effort="max",
    messages=[
        {"role": "user", "content": "证明根号 2 是无理数。"}
    ],
)

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

複数ラウンドの会話とツール呼び出しでは、API から返された完全なアシスタント メッセージを次のリクエストに戻す必要があります。contentだけを保持することはできません。完全なメッセージには、推論やツールの呼び出しに必要な情報も含まれている場合があり、枝刈り後にコンテキストが不完全になる可能性があります。

ストリーミング推論と最終回答を個別に処理する

ストリーミング応答では、思考プロセスがreasoning_contentに配置され、最終的な答えがcontentに配置されます。アプリケーション インターフェイスは、次の 2 種類の増分を個別に処理できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
stream = client.chat.completions.create(
    model="kimi-k3",
    messages=[{"role": "user", "content": "解释天空为什么是蓝色的。"}],
    stream=True,
)

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

運用環境では通常、フロントエンドが 2 つのコンテンツを混同しないように、ユーザーへの最終的な回答とは別にreasoning_contentを保存または表示する必要があります。

ローカルの写真を送信する

ビジュアル メッセージのcontentはオブジェクト配列である必要があり、配列を文字列にシリアル化することはできません。 K3 は、パブリック イメージ URL の直接読み取りをサポートしていません。ローカル画像は Base64 データ URL に変換する必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import base64
from pathlib import Path

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

completion = 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": "描述这张图片。"},
            ],
        }
    ],
)

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

ビデオは、最初にファイル API を介してアップロードし、次にms://<file-id>で参照する必要があります。無駄なデータが長期間保持されないように、タスクの完了後は必ず一時ファイルを削除してください。

厳密な JSON スキーマ出力を使用する

安定して処理するために結果をプログラムに渡す必要がある場合、最終出力はjson_schemaおよびstrict: trueによって制限できます。解析するときは、message.contentのみを読み取り、reasoning_contentを解析しないでください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import json

completion = client.chat.completions.create(
    model="kimi-k3",
    messages=[
        {"role": "user", "content": "小林今年 28 岁,提取姓名和年龄。"}
    ],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "person",
            "strict": True,
            "schema": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "age": {"type": "integer"},
                },
                "required": ["name", "age"],
                "additionalProperties": False,
            },
        },
    },
)

person = json.loads(completion.choices[0].message.content or "{}")
print(person)

additionalProperties: falseを使用すると、モデルがスキーマ以外のフィールドを追加するのを防ぐことができます。これは、データ抽出、フォーム入力、およびダウンストリーム自動化に適しています。

最小限のツール呼び出しループを実装する

最初のパスでtool_choice="required"を設定するには、モデルがツールを少なくとも 1 回呼び出す必要があります。ツールを実行した後、完全なアシスタント メッセージを保持し、呼び出しごとにtool_call_idが一致するツール メッセージを追加する必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import json
from typing import Any

tools: list[dict[str, Any]] = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "查询城市天气",
            "parameters": {
                "type": "object",
                "properties": {"city": {"type": "string"}},
                "required": ["city"],
            },
        },
    }
]

messages: list[Any] = [
    {"role": "user", "content": "今天上海天气如何?"}
]

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 tool_call in assistant_message.tool_calls or []:
    arguments = json.loads(tool_call.function.arguments)
    result = json.dumps(
        {"city": arguments["city"], "weather": "sunny", "temperature_c": 32},
        ensure_ascii=False,
    )
    messages.append(
        {
            "role": "tool",
            "tool_call_id": tool_call.id,
            "content": result,
        }
    )

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

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

実際のプロジェクトでは、書き込み、削除、送信などのリスクの高い操作を実行する前に、ツールのパラメーターを確認し、アクセス可能なリソースを制限し、タイムアウトを設定し、手動による確認を追加する必要もあります。

動的読み込みツール

ツールが多数ある場合は、会話が必要なポイントに達したときに、contentを使用せずに、systemメッセージを介して完全なツール定義を挿入できます。定義にはnamedescription、およびparametersが含まれ、後続のリクエスト履歴に保持される必要があります。サーバーはアプリケーションのこの定義を保存しません。

この機能は大規模なエージェントに適しています。最初に少数の基本ツールを提供し、タスクの方向性を確認してから、データベース、ブラウザ、またはビジネス システム ツールをロードすることで、最初に送信されるツールの説明の数を減らします。

1M コンテキストと自動キャッシュ

通常のモデル リクエストでは、コンテキスト キャッシュが自動的に試行され、キャッシュ ID、TTL、または追加のパラメーターを指定する必要はありません。ヒットの可能性を高めるには、より長く安定したコンテンツをリクエストの先頭に配置し、後続のリクエストではこのプレフィックスを変更しないようにします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from pathlib import Path

knowledge = Path("knowledge-base.md").read_text(encoding="utf-8")

for question in ["总结主要结论。", "列出三个实施风险。"]:
    completion = client.chat.completions.create(
        model="kimi-k3",
        messages=[
            {"role": "system", "content": knowledge},
            {"role": "user", "content": question},
        ],
    )
    print(completion.choices[0].message.content)

100 万トークンが容量の上限ですが、これはすべてのリクエストにコンテキストを入力する必要があるという意味ではありません。通常、ファイルのスクリーニング、セグメント化された取得、および結果の重複排除を最初に実行すると、遅延とコストが削減され、無関係なコンテンツによる干渉も軽減されます。

現在の制限と移行に関する考慮事項

アクセスする前に、以下の制限事項を項目ごとに確認することをお勧めします。

  • K3 は常に思考モードを有効にし、reasoning_effortは現在maxのみをサポートします。
  • max_completion_tokensのデフォルトは 131072 で、最大 1048576 に設定できます。
  • temperature=1.0top_p=0.95n=1presence_penalty=0、およびfrequency_penalty=0は固定値です。リクエストからは省略してください。
  • 複数ラウンドのダイアログとツール呼び出しでは、完全なアシスタント メッセージをそのまま返す必要があります。
  • ビジュアル入力はパブリック画像 URL をサポートしていません。Base64 またはms://<file-id>を使用する必要があります。
  • Kimi 公式の Web 検索ツールは更新中であり、現時点では本番ワークフローでの利用は推奨されていません。

古いプロジェクトが K2.x を使用している場合、移行中に、まずthinking、サンプリング パラメーター、およびcontentのみを保存するメッセージ処理コードをグローバルに検索し、次にストリーミングreasoning_content、ビジュアル配列形式、およびツール呼び出しバックフィル テストを追加します。

よくある質問

Kimi K3 は OpenAI SDK を直接使用できますか?

できる。openai>=1.0をインストールし、base_urlhttps://api.moonshot.ai/v1に設定し、MOONSHOT_API_KEYを通じてキーを渡します。

temperatureを設定するとリクエストが失敗するのはなぜですか?

K3のtemperaturetop_pなどのサンプリングパラメータは固定値を採用しています。これらのフィールドを省略し、他の OpenAI 互換モデルの共通構成をコピーしないことが公式に推奨されています。

画像を HTTP アドレスに直接アップロードできますか?

できません。ローカル画像は Base64 データ URL としてエンコードするか、ファイルのアップロード後にms://<file-id>を使用する必要があります。

1M コンテキストのキャッシュを手動で有効にする必要がありますか?

不要。通常のモデル リクエストでは、自動的にキャッシュが試行されます。長いプレフィックスを完全に一貫した状態に保つと、後続のリクエストがキャッシュにヒットしやすくなります。

Kimi K3 の料金体系は?

公式システムは従量課金制を採用しており、100 万トークンのコンテキストは長さのラダーに分割されていません。入力ではキャッシュのヒットとミスの単価が区別され、出力はトークンによって課金されます。特定の価格は調整される場合がありますので、ご使用前にKimi K3 Pricingページをご確認ください。

记录并分享
Hugo で構築されています。
テーマ StackJimmy によって設計されています。