目次
Pythonで雑にチャットボットのプロトタイプを誰かに見せたいとき、フロントを書きたくなくてGradioに逃げることがあります。OpenAI APIとGradioの組み合わせなら、本当に数十行でChatGPTっぽい画面まで届きました。
gr.ChatInterface の引数仕様もOpenAI APIも入門当時から少し変わっているので、2026年時点で動く最小コードを置き直しておきます。
最小コードでChatGPTライクなUIを作る
Gradioの gr.ChatInterface は、関数1つを渡せばチャット欄つきのWebアプリにしてくれるコンポーネントです。OpenAI APIの戻り値をそのまま返すだけで、ユーザー入力と履歴の管理はGradio側が担ってくれます。
Gradio自体の概要やデプロイ方法は別記事にまとめてあります。
gr.ChatInterface のパラメータ(タイトル変更、サンプル入力、ボタンカスタマイズなど)を詳しく見たい場合はこちら。
コードと動作確認
OpenAIのSDK(openai パッケージ)とGradioをインストールしておきます。
pip install openai gradio
最小構成は次の通りです。type="messages" を指定すると、history がOpenAI APIと同じ {"role": ..., "content": ...} 形式の辞書リストで渡ってくるので、そのまま messages に流せます。
import gradio as gr
from openai import OpenAI
client = OpenAI() # 環境変数 OPENAI_API_KEY を自動で読む
def chatbot_response(message, history):
messages = history + [{"role": "user", "content": message}]
completion = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
)
return completion.choices[0].message.content
app = gr.ChatInterface(chatbot_response, type="messages")
app.launch()
APIキーは環境変数 OPENAI_API_KEY に入れておく前提です。コード内にベタ書きする例も世の中には多いですが、.env や export OPENAI_API_KEY=... で渡したほうが取り回しが楽でした。
実行後、http://127.0.0.1:7860 を開くとChatGPT風のチャット画面が立ち上がります。

ここまでで30行未満。フロント実装が一切要らないのが効きます。
旧型の tuples 形式から移行する場合
Gradio 4系の途中までは history がタプルのリスト([[user, bot], ...])で渡ってきていて、ループでOpenAI形式の辞書に詰め直す必要がありました。古いコードを引きずっている場合、type="messages" への切り替えと同時に詰め直しロジックを消せます[1]。
# 旧: type="tuples"(デフォルトだった頃の書き方)
for user_msg, bot_msg in history:
messages.append({"role": "user", "content": user_msg})
messages.append({"role": "assistant", "content": bot_msg})
# 新: type="messages"
messages = history + [{"role": "user", "content": message}]
新規で書き始めるなら、最初から type="messages" を指定しておけば後から書き換える手間が無くてラクです。
モデル選択とAPIの今
OpenAIのAPIには複数のエンドポイントがあり、2026年時点で何を選ぶかは少し整理が要ります。gpt-3.5-turbo をまだ書き続けている入門記事も多いですが、性能とコストの両面で gpt-4o-mini 以降に乗り換えて困った場面はありません。
モデルは gpt-4o-mini を起点にする
入門用途や軽量チャットボットの定番は gpt-4o-mini です。応答品質が安定していて、gpt-3.5-turbo より安価で速いケースが多く、まず最初に試すモデルとして扱いやすい位置にいます。
精度が足りない場面では gpt-4o や gpt-4.1、推論を効かせたいなら gpt-5 系に上げる、という階段にしておくと、コストの跳ね上がりを段階的に把握できます。最新のモデル一覧と料金は公式に置いてあるので、書き換え時はそちらで確認するのが確実です[2]。
Chat Completions API と Responses API の使い分け
OpenAIは2025年に Responses API を正式に出して、新規プロジェクトでは Responses を推奨する立場を取っています[3]。会話履歴を previous_response_id でサーバー側に持たせられたり、Web検索やコードインタープリタなどのツールが標準で組み込めるのが Responses 側の利点です。
ただし gr.ChatInterface の history は「ローカル側で履歴を辞書リストとして持つ」前提で組まれているので、本記事のような最小チャットボットでは Chat Completions API のままが配線として素直です。Responses API に乗せ替える場合は、previous_response_id を関数の外で保持するか、input に履歴リストを毎回渡す形に組み直す必要があります。
# 参考: Responses API でステートレスに履歴を渡す場合
response = client.responses.create(
model="gpt-4o-mini",
input=messages, # Chat Completions と同じ形式が使える
)
text = response.output_text
新機能(組み込みツール、ステート管理、推論モデル)を活かしたい段階に来たら Responses 側に寄せる、それまでは Chat Completions のままで十分という温度感で扱っています。
