GradioとOpenAI APIでChatGPTライクなチャットボットを最小コードで作る

公開日:
更新日:
目次

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 に流せます。

chatgpt.py
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 に入れておく前提です。コード内にベタ書きする例も世の中には多いですが、.envexport OPENAI_API_KEY=... で渡したほうが取り回しが楽でした。

実行後、http://127.0.0.1:7860 を開くとChatGPT風のチャット画面が立ち上がります。

Image from Gyazo

ここまでで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-4ogpt-4.1、推論を効かせたいなら gpt-5 系に上げる、という階段にしておくと、コストの跳ね上がりを段階的に把握できます。最新のモデル一覧と料金は公式に置いてあるので、書き換え時はそちらで確認するのが確実です[2]

Chat Completions API と Responses API の使い分け

OpenAIは2025年に Responses API を正式に出して、新規プロジェクトでは Responses を推奨する立場を取っています[3]。会話履歴を previous_response_id でサーバー側に持たせられたり、Web検索やコードインタープリタなどのツールが標準で組み込めるのが Responses 側の利点です。

ただし gr.ChatInterfacehistory は「ローカル側で履歴を辞書リストとして持つ」前提で組まれているので、本記事のような最小チャットボットでは 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 のままで十分という温度感で扱っています。

脚注
  1. ChatInterface - Gradio Docs ↩︎

  2. Models - OpenAI API ↩︎

  3. Migrate to the Responses API - OpenAI API ↩︎