# ストリーミングチャット CLI クイックスタート > Kiln の返信をトークン単位でリアルタイムに表示するターミナルチャットクライアントを作ります。 Source: https://kiln.bricksum.com/docs/ja/cookbook/streaming-chat-cli ## ゴール レスポンス全体を待たずに、Kiln の返信をトークン単位でリアルタイムに表示するターミナルチャットクライアントを作ります。 ## 成果物 実行可能な Python スクリプト chat.py です。会話履歴を保持し、入力した行を新しい user ターンとして送信し、生成される assistant の返信をターミナルにリアルタイムで表示します。 ## エージェントに貼り付けるプロンプト **prompt** ```text Write a Python CLI named chat.py that: reads KILN_API_KEY (required) and KILN_BASE_URL (optional, default "https://api.bricksum.com/v1") from the environment, creates an OpenAI client pointed at that base URL, keeps a `messages` list, and loops reading a line from stdin. Each line becomes a user message. Call client.chat.completions.create with model="qwen3-32b", stream=True and max_tokens=800, print chunk.choices[0].delta.content as each chunk arrives, then append the full reply as an assistant message only if it is non-empty. Exit the loop when the input is "exit". ``` ## 前提条件 - Python 3.10 以降と openai パッケージ(pip install openai)。このページの検証に使った openai のバージョンは 3.10 以降が必要です。3.9 では pip が古いメジャーバージョンを黙ってインストールします。 - コンソール → API キーで発行した Kiln の API キーを KILN_API_KEY として export。 ## 1. SDK のインストール 公式の OpenAI Python クライアントが、このストリーミング CLI の唯一の依存関係です。 **pip** ```bash pip install openai ``` ## 2. chat.py を書く 以下のスクリプトを保存します。入力を 1 行ずつ読み取って user ターンとして送信し、完成した返信を待たずに各 delta をストリーミングで表示します。 **chat.py** ```python import os from openai import OpenAI client = OpenAI( base_url=os.environ.get("KILN_BASE_URL", "https://api.bricksum.com/v1"), api_key=os.environ["KILN_API_KEY"], # sk-bk-... ) messages = [] print("Streaming chat CLI. Type 'exit' to quit.") while True: user_input = input("> ") if user_input.strip().lower() == "exit": break messages.append({"role": "user", "content": user_input}) stream = client.chat.completions.create( model="qwen3-32b", messages=messages, stream=True, max_tokens=800, ) reply = "" for chunk in stream: delta = chunk.choices[0].delta.content or "" print(delta, end="", flush=True) reply += delta print() if reply: messages.append({"role": "assistant", "content": reply}) ``` ## 3. 実行する キーを export してスクリプトを実行します。メッセージを入力して Enter を押すと、返信がリアルタイムに表示されます。終了するには exit と入力してください。 ```bash export KILN_API_KEY="sk-bk-..." python chat.py ``` **expected output** ```text Streaming chat CLI. Type 'exit' to quit. > Say hello in five words. Hello there, nice meeting you! > exit ``` ## 結果を確認する メッセージを送信し、返信が一度に表示されるのではなく単語単位で表示されることを確認します。続けてフォローアップ(例:「一行で要約して」)を送信し、返信が最初のターンを参照していることを確認してください。messages リストが会話履歴を保持している証拠です。返信が空行になった場合は、モデルがテキストを書く前に reasoning で max_tokens の上限を使い切っています(finish_reason "length")。chat.py の max_tokens を 800 より大きく(例:1600)してから、もう一度質問してください。 ## 次のステップ - [ストリーミング](https://kiln.bricksum.com/docs/ja/streaming) — SSE イベント形式、keepalive コメント、最終チャンクに cost が追加される仕組み - [ツール呼び出し、最初から最後まで](https://kiln.bricksum.com/docs/ja/cookbook/tool-calling) — 同じクライアントに、会話中に呼び出せるツールを追加する メモ このページのスニペットは 2026-09-21 に openai 3.16.2 (Python 3.14.7) の環境で Kiln API に対して実行し、動作を確認しています。 未確認の項目: 自動スニペット検証ツールはこの対話型スクリプトに入力を渡せないため、上記と同じインタープリタ・SDK バージョンで gpt-oss-120b に対して手動実行して確認しました。スクリプトは現在 qwen3-32b を使っており、このモデルではまだ実行していません。