- Python
Gradioとは|使い方・API呼び出し・Spaces公開をPythonで実演
結論
Gradioは、Pythonの関数に数行でWeb画面とAPIを付けるライブラリです。HTMLやJavaScriptを書かずに動きます。
この記事でわかること
- Interface・Blocks・ChatInterfaceの最小コード3本
- APIの呼び方2通りとエラー原文12種の直し方
- Spaces公開の条件とStreamlitとの違い表7観点
関数を部品(入力欄・出力欄)で包み、launch() すると、画面とAPIが同時にできます。
flowchart TD
A[Pythonの関数] --> B[Interface・Blocks<br>ChatInterface]
B --> C[launch]
C --> D[画面]
C --> E[API<br>client・curl]
C --> F[公開<br>share・Spaces]
やりたいことごとの書き方です。
| やりたいこと | 書き方 | 詳しくは |
|---|---|---|
| 関数に画面を付ける | gr.Interface(fn, inputs, outputs) |
Interface |
| 部品の配置を自由に決める | with gr.Blocks() as demo: |
Blocks |
| チャット画面を作る | gr.ChatInterface(fn) |
ChatInterface |
| Python から呼ぶ | Client(url).predict(..., api_name="/関数名") |
API として呼ぶ |
| パスワードをかける | launch(auth=("user", "pass")) |
認証 |
| 一時的に外へ公開 | launch(share=True)(1週間で失効) |
share |
| ずっと公開しておく | Hugging Face Spaces(gradio deploy) |
Spaces |
| 同時に処理する数を増やす | .click(..., concurrency_limit=3) |
キュー |
確認環境:Ubuntu 24.04・Python 3.11.15・Gradio 6.30.0(2026年10月8日公開の PyPI 最新版)・gradio_client 2.7.2・FastAPI 0.143.3・Streamlit 1.66.0・Chromium(Playwright で操作)。venv に pip で入れ、この記事のアプリをすべて起動して、ブラウザでの操作結果・gradio_client と curl の応答・エラー文を確かめています。share・Spaces・OAuth・環境変数は Gradio 公式ガイド(GitHub の guides)、Spaces の条件と料金は Hugging Face の公式ドキュメントと料金ページ、Streamlit の実行モデルは Streamlit の公式ドキュメントで確かめました(確認日 2026年10月17日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Gradioとは|使い方・API呼び出し・Spaces公開をPythonで実演」
Gradioとは
Gradio(グラディオ)は、機械学習のモデルや API、ふつうの Python の関数に、Web の画面を付けるオープンソースの Python ライブラリです。 公式のクイックスタートは「JavaScript・CSS・Web ホスティングの経験は要らない」と説明しています。公式は、Gradio アプリを置く場所として最もよく使われているのが Hugging Face Spaces だと紹介しています。
| 項目 | 内容 |
|---|---|
| 読み方 | グラディオ |
| 最新版 | 6.30.0(2026年10月17日時点の PyPI) |
| 対応 Python | 3.10 以上(PyPI の Requires-Python は >=3.10) |
| ライセンス | Apache-2.0 |
| サーバー部分 | FastAPI・uvicorn |
| 部品の数 | 30 以上(gr.Textbox・gr.Image・gr.Chatbot など) |
| 既定の URL | http://127.0.0.1:7860 |
Gradioでできること
- 関数の入力と出力に部品を割り当てるだけで、入力欄・ボタン・出力欄のある画面ができる
- 画像・音声・動画・表・グラフ・チャットの部品が最初から入っている
- 画面と同時に API が自動でできる。Python(
gradio_client)・JavaScript(@gradio/client)・curl から呼べる share=Trueで、手元の PC で動かしたまま外部から見られる URL を発行できる- Hugging Face Spaces に置くと、URL を固定して公開できる
mcp_server=Trueで、関数を MCP(AI エージェントが外部の道具を呼ぶための規格)のツールとして公開できる
画面の作り方は3種類
1gr.Interface
関数1つに、入力と出力の部品を指定するだけの高水準のクラスです。モデルのデモや小さな道具に向きます。
2gr.Blocks
部品の並び(行・列・タブ)と、どのボタンでどの関数を呼ぶかを自分で書く低水準のクラスです。複数の処理をつなぐ画面に向きます。
3gr.ChatInterface
「メッセージと履歴を受け取り、返事を返す関数」からチャット画面を作るクラスです。LLM のチャットボットに向きます。
Gradioのインストール(pip・venv)
公式は、仮想環境(venv)に pip で入れる形を勧めています。
python3 -m venv .venv
source .venv/bin/activate # Windows は .venv\Scripts\activate
pip install --upgrade gradio
python -c "import gradio; print(gradio.__version__)"
6.30.0
依存も含めて、venv 全体の大きさは 494MB でした(Linux・Python 3.11 で gradio だけを入れた場合)。venv の作り方は、関連記事「Python venvの使い方|仮想環境の作成・有効化・削除をOS別にコピペ」で扱っています。uv を使うときは uv add gradio です。関連記事「uvの使い方|pip・venvからの移行とチーム開発での使い方」で扱っています。
入った版と依存を確かめる(gradio environment)
gradio environment
Gradio Environment Information:
------------------------------
Operating System: Linux
gradio version: 6.30.0
gradio_client version: 2.7.2
------------------------------------------------
gradio dependencies in your environment:
anyio: 4.15.1
audioop-lts is not installed.
brotli: 1.2.0
fastapi: 0.143.3
gradio-client: 2.7.2
...
Python 3.9 では Gradio 4 系が入る
Python 3.9 以下で pip install gradio を実行すると、エラーにならずに Gradio 4.44.1 が入ります。 Gradio 5.0.0 以降は Python 3.10 以上が条件だからです。Python 3.9 向けに版を指定して取得すると、次のように止まりました。
ERROR: Ignored the following versions that require a different python version: 5.0.0 Requires-Python >=3.10; ... 6.30.0 Requires-Python >=3.10; ...
ERROR: No matching distribution found for gradio==6.30.0
4 系と 6 系では書き方が違う所が多いので、ネットの記事のコードが動かないときは、まず python --version と gradio.__version__ を確かめます。
Gradioの使い方① Interface(最小コード)
公式のクイックスタートと同じ形の、名前と回数を受け取ってあいさつを返すアプリです。
# interface_app.py
import gradio as gr
def greet(name, intensity):
return "Hello, " + name + "!" * int(intensity)
demo = gr.Interface(
fn=greet,
inputs=["text", "slider"],
outputs=["text"],
)
demo.launch(server_port=26301) # 省略すると 7860 番
python interface_app.py
* Running on local URL: http://127.0.0.1:26301
* To create a public link, set `share=True` in `launch()`.
ブラウザで開き、Playwright で操作して確かめた結果です。
| 確かめたこと | 結果 |
|---|---|
| 画面の部品 | 入力欄 name、スライダー intensity(0〜100)、出力欄 output |
| ボタン | Clear・Submit・Flag |
| 画面の下(フッター) | Runs・Use via API・Built with Gradio・Settings |
| name に RJC、intensity に 3 で Submit | 出力欄に Hello, RJC!!! |
inputs の部品の数は関数の引数の数に、outputs の数は戻り値の数に合わせます。 "text" のような文字列でも、gr.Textbox(label="名前") のようなインスタンスでも指定できます。インスタンスにすると、ラベル・初期値・範囲などを細かく決められます。
demo = gr.Interface(
fn=greet,
inputs=[gr.Textbox(label="名前"), gr.Slider(1, 10, value=3, step=1, label="回数")],
outputs=gr.Textbox(label="あいさつ"),
title="あいさつ",
examples=[["RJC", 3], ["Gradio", 5]],
)
よく使う部品
| 部品 | 文字列での指定 | 関数が受け取る値 |
|---|---|---|
gr.Textbox |
"text"・"textbox" |
str |
gr.Number |
"number" |
float(precision=0 で丸めて int) |
gr.Slider |
"slider" |
float |
gr.Checkbox |
"checkbox" |
bool |
gr.Dropdown |
"dropdown" |
選ばれた値 |
gr.Image |
"image" |
numpy 配列(type="pil" で PIL、"filepath" でパス) |
gr.File |
"file" |
ファイルのパス |
gr.Dataframe |
"dataframe" |
pandas の DataFrame |
gr.Chatbot |
― | 会話の履歴(リスト) |
gr.Image(type="pil") で受け取った画像は、Pillow の関数でそのまま加工できます。
保存するたびに再読み込みする(ホットリロード)
python の代わりに gradio コマンドで起動すると、ファイルを保存するたびにアプリが読み込み直されます。
gradio reload_app.py
返事の頭を v1: から v2: に書き換えて保存したときのログです。止めずに API を呼ぶと、v2: x が返りました。
Watching: '…/app'
Watching demo: demo
* Running on local URL: http://127.0.0.1:26307
* To create a public link, set `share=True` in `launch()`.
Changes detected in: …/app/reload_app.py
ホットリロードは、ファイルの中の demo という名前の変数を探します。別の名前にしたときは gradio app.py --demo-name 変数名 と指定します。
Gradioの使い方② Blocks(レイアウトとイベント)
Blocks では、with の中に部品を並べ、ボタンなどのイベントに関数を結びます。足し算と文字数を数える2つの処理を持つアプリです。
# blocks_app.py
import gradio as gr
def add(a, b):
if a is None or b is None:
raise gr.Error("数値を2つ入れてください")
return a + b
def count_chars(text):
return len(text), text.upper()
with gr.Blocks(title="Blocks の例") as demo:
gr.Markdown("## 足し算と文字数")
with gr.Row(): # 横に並べる
a = gr.Number(label="a")
b = gr.Number(label="b")
total = gr.Number(label="a + b")
gr.Button("足す").click(add, inputs=[a, b], outputs=total, api_name="add")
with gr.Tab("文字数"): # タブ
t = gr.Textbox(label="文章")
n = gr.Number(label="文字数")
up = gr.Textbox(label="大文字")
t.change(count_chars, inputs=t, outputs=[n, up], api_name="count")
demo.launch(server_port=26302)
ブラウザで a に 12、b に 30 を入れて「足す」を押すと、a + b の欄に 42 が出ました。a を空にして押すと、画面の右上に「Error」の通知が出て、gr.Error に渡した「数値を2つ入れてください」が表示されました。
| 書き方 | 意味 |
|---|---|
with gr.Row():・with gr.Column(): |
中の部品を横・縦に並べる |
with gr.Tab("名前"): |
タブを作る |
ボタン.click(fn, inputs, outputs) |
押したときに fn を呼ぶ |
入力欄.change(...)・.submit(...) |
値が変わったとき・Enter のときに呼ぶ |
demo.load(fn, None, 出力) |
画面を開いたときに呼ぶ |
api_name="add" |
API の名前を決める(省略すると関数名) |
raise gr.Error("文") |
処理を止めて、画面に通知を出す |
gr.Warning("文")・gr.Info("文") |
処理を続けたまま通知を出す |
関数の戻り値をタプルで返すと、outputs のリストの順に入ります。 上の count_chars は、文字数と大文字の2つの欄を一度に更新しています。
Gradio 6 で変わった書き方
以前の版の記事のコードを 6.30.0 で動かすと、次のように止まります。どれも手元で出た原文です。
| 以前の書き方 | 6.30.0 で出たもの | 直し方 |
|---|---|---|
gr.inputs.Slider(1, 10) |
AttributeError: module 'gradio' has no attribute 'inputs' |
gr.Slider(1, 10) |
gr.Interface(..., allow_flagging="never") |
TypeError: ... unexpected keyword argument 'allow_flagging' |
flagging_mode="never" |
gr.ChatInterface(fn, type="messages") |
TypeError: ChatInterface.__init__() got an unexpected keyword argument 'type' |
type を消す |
gr.Chatbot(type="tuples") |
TypeError: Chatbot.__init__() got an unexpected keyword argument 'type' |
type を消す |
gr.Blocks(theme=..., css=...) |
UserWarning: The parameters have been moved from the Blocks constructor to the launch() method in Gradio 6.0: theme, css. |
demo.launch(theme=..., css=...) |
Gradioの使い方③ ChatInterface(チャットボット)
gr.ChatInterface に渡す関数は、最新のメッセージ(message)と、それまでの履歴(history)をこの順に受け取ります。 yield で少しずつ返すと、文字が流れるように表示されます(ストリーミング)。
# chat_app.py
import time
import gradio as gr
def slow_echo(message, history):
turns = len([h for h in history if h["role"] == "assistant"])
reply = f"{turns + 1}回目の返事:{message}"
for i in range(len(reply)):
time.sleep(0.05)
yield reply[: i + 1]
gr.ChatInterface(fn=slow_echo, title="エコーボット").launch(server_port=26303)
ブラウザで「こんにちは」「Gradio」と続けて送ると、1回目の返事:こんにちは、2回目の返事:Gradio と返りました。2回目は履歴に1回目の返事が入っているため、数が増えています。
history の中身(Gradio 6)
関数に届いた history を print した結果です。content は文字列ではなく、type と text を持つ辞書のリストです。
HISTORY []
HISTORY [{'role': 'user', 'metadata': None, 'content': [{'text': '一つ目', 'type': 'text'}], 'options': None}, {'role': 'assistant', 'metadata': None, 'content': [{'text': 'ok:一つ目', 'type': 'text'}], 'options': None}]
h["content"] を文字列として扱うコードは、この形に合わせて h["content"][0]["text"] のように取り出します。role が user・assistant なので、LLM の API に渡すメッセージの形に近い構造です。
OpenAI 互換の API を持つサーバー(Ollama など)があれば、公式ガイドにある gr.load_chat で1行でチャット画面を作れます(pip install openai が要ります)。
import gradio as gr
gr.load_chat("http://localhost:11434/v1/", model="llama3.2", token="***").launch()
fn の中で LLM の API を呼ぶ書き方は、関連記事「Claude API Python入門|Anthropic SDKコピペレシピ集」で扱っています。検索した文書を使って答えさせる形は、関連記事「RAGの作り方|Pythonで動かす最小構成と精度の上げ方」で扱っています。
GradioをAPIとして呼ぶ(gradio_client・curl)
Gradio のアプリは、起動した時点で API にもなっています。 画面の下の「Use via API」から、呼び方の説明ページが開きます。
API の名前は関数名になる
Gradio 6.30.0 では、API の名前(api_name)を省略すると関数名がそのまま使われます。 ネットでよく見る api_name="/predict" で呼ぶと、次のエラーになりました。
ValueError: Cannot find a function with `api_name`: /predict.
| アプリ | 自動で付いた名前 |
|---|---|
gr.Interface(fn=greet, ...) |
/greet |
gr.ChatInterface(fn=slow_echo) |
/slow_echo |
gr.Interface(lambda s: ..., ...) |
/lambda |
Blocks の .click(..., api_name="add") |
/add |
gr.Interface(..., api_name="reverse") |
/reverse |
名前は view_api() で確かめられます。
gradio_client(Python)で呼ぶ
gradio_client は gradio を入れると一緒に入ります。呼ぶ側だけなら pip install gradio_client で入ります。
from gradio_client import Client
c = Client("http://127.0.0.1:26301/")
c.view_api()
print(c.predict(name="RJC", intensity=3, api_name="/greet"))
b = Client("http://127.0.0.1:26302/", verbose=False)
print(b.predict(12, 30, api_name="/add"))
print(b.predict("gradio", api_name="/count"))
try:
b.predict(None, 30, api_name="/add")
except Exception as e:
print(type(e).__module__ + "." + type(e).__name__, ":", e)
Loaded as API: http://127.0.0.1:26301/
Client.predict() Usage Info
---------------------------
Named API endpoints: 1
- predict(name, intensity, api_name="/greet") -> output
Parameters:
- [Textbox] name: str (required)
- [Slider] intensity: float (not required, defaults to: 0)
Returns:
- [Textbox] output: str
Hello, RJC!!!
42
(6, 'GRADIO')
gradio_client.exceptions.AppError : 数値を2つ入れてください
- 出力が2つ以上ある処理(
/count)は、タプルで返る gr.Errorで止めた処理は、AppErrorとして同じ文が届く
ストリーミングするチャットは、submit() で受け取ると途中の結果も取れます。
ch = Client("http://127.0.0.1:26303/", verbose=False)
job = ch.submit("こんにちは", api_name="/slow_echo")
outs = list(job)
print(len(outs), "partial outputs; first:", repr(outs[0]), "last:", repr(outs[-1]))
print("result:", job.result())
12 partial outputs; first: '1' last: '1回目の返事:こんにちは'
result: 1回目の返事:こんにちは
12文字の返事が、1文字ずつ12回に分かれて届きました。API で呼ぶと履歴は空から始まるため、何回呼んでも「1回目」です。
curl で呼ぶ(POST と GET の2回)
curl では、POST で処理を頼んで event_id を受け取り、GET でその結果を受け取る、の2段階です。Gradio 6.30.0 では URL の前に /gradio_api が付きます。
curl -X POST http://127.0.0.1:26301/gradio_api/call/greet \
-H "Content-Type: application/json" -d '{"data": ["RJC", 3]}'
{"event_id":"2874bd929b2d4fd081408406aba8c861"}
curl -N http://127.0.0.1:26301/gradio_api/call/greet/2874bd929b2d4fd081408406aba8c861
event: complete
data: ["Hello, RJC!!!"]
data には、入力の部品の順に値を並べます。結果は SSE(Server-Sent Events。サーバーから続けて送る形式)で届き、ストリーミングのチャットでは途中の結果が event: generating として続きます。
event: generating
data: ["1", null]
event: generating
data: ["1回", null]
| 送ったもの | 返ったもの |
|---|---|
/call/greet(/gradio_api なし) |
HTTP 404 |
存在しない名前 /gradio_api/call/nothing |
Internal Server Error(HTTP 500) |
gr.Error で止まる入力 |
event: error と data: {"error": "数値を2つ入れてください", ...}(日本語は \u で表記) |
スライダーに "abc" |
event: error と data: {"error": null} |
API の一覧は GET /gradio_api/info で JSON として取れます。中には Python・JavaScript・curl の呼び出し例(code_snippets)も入っていました。
既存の FastAPI に組み込む
すでに FastAPI のアプリがあるときは、gr.mount_gradio_app で好きなパスの下に置けます。
from fastapi import FastAPI
import gradio as gr
import uvicorn
app = FastAPI()
@app.get("/health")
def health():
return {"status": "ok"}
demo = gr.Interface(lambda s: s[::-1], "text", "text", api_name="reverse")
app = gr.mount_gradio_app(app, demo, path="/gradio")
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=26308)
$ curl http://127.0.0.1:26308/health
{"status":"ok"}
$ curl -o /dev/null -w '%{http_code}\n' http://127.0.0.1:26308/gradio/
200
(/gradio/gradio_api/call/reverse に "Gradio" を送ると)
event: complete
data: ["oidarG"]
FastAPI 自体の書き方は、関連記事「FastAPI入門|uvで作るCRUD API完成コードと実行結果」で扱っています。
Gradioの公開・認証・キュー
share=True:一時的な公開 URL
demo.launch(share=True)
公式ガイドでは、https://07ff8706ab.gradio.live のような URL が発行され、リンクは1週間で失効します。Gradio の share サーバーは手元のサーバーへの中継だけで、送られたデータを保存しないと書かれています。一方で、URL を知っている人は誰でも使えるため、認証と組み合わせることが勧められています。
share は frpc という中継用のプログラムをダウンロードして使います。外部への接続が制限された環境では、エラーで止まらずに次の文が出て、手元の URL だけで起動しました。
Could not create share link. Missing file: ~/.cache/huggingface/gradio/frpc/frpc_linux_amd64_v0.3.
Please check your internet connection. This can happen if your antivirus software blocks the download of this file. You can install manually by following these steps:
1. Download this file: https://cdn-media.huggingface.co/frpc-gradio-0.3/frpc_linux_amd64
2. Rename the downloaded file to: frpc_linux_amd64_v0.3
3. Move the file to this location: ~/.cache/huggingface/gradio/frpc
会社のネットワークでこの文が出たときは、プロキシやセキュリティ製品が huggingface.co への接続を止めていないかを確かめます。社外へ出さずに同じ LAN の人に見せたいときは、server_name="0.0.0.0" で起動します(既定は 127.0.0.1 で、自分の PC からしか開けません)。
auth:パスワード認証
import gradio as gr
def whoami(request: gr.Request):
return f"ログイン中:{request.username}"
with gr.Blocks() as demo:
m = gr.Markdown()
gr.Button("ログアウト", link="/logout")
demo.load(whoami, None, m)
demo.launch(auth=[("admin", "pass1234"), ("guest", "guest5678")])
起動すると、画面の前に「username」「password」「Login」だけのログイン画面が出ます。curl と gradio_client で確かめた結果です。
| 操作 | 結果 |
|---|---|
| ログインせずに API を呼ぶ | HTTP 401 {"detail":{"error":"Not authenticated","auth_message":null}} |
違うパスワードで /login に POST |
HTTP 400 {"detail":"Incorrect credentials."}(画面では「Incorrect Credentials」) |
正しいパスワードで /login に POST |
HTTP 200 {"success":true} と Cookie 2つ |
| ログイン後に画面を開く | 「ログイン中:admin」 |
/logout を開く |
HTTP 302 で / へ。そのあとの API は 401 |
Client(url, auth=("admin", "pass1234")) |
「ログイン中:admin」が返る |
Client(url)(auth なし) |
AuthenticationError : Could not load ... as credentials were not provided. Please login. |
auth には、ユーザー名とパスワードを受け取って True・False を返す関数も渡せます。公式ガイドは、組み込みの認証は基本的なアクセス制限で、多要素認証・回数制限・ロックアウトのような機能は無いと書いています。Hugging Face のアカウントでログインさせる gr.LoginButton(Spaces で hf_oauth: true)や、FastAPI に組み込んで Google などの OAuth を使う方法もあります。
キュー:同時に処理する数
Gradio のイベントは、既定で1件ずつ順番に処理されます(concurrency_limit の既定は 1)。 2秒かかる関数に、3件の依頼を同時に送って比べました。
import time
import gradio as gr
def slow_a(x):
time.sleep(2)
return x
def slow_b(x):
time.sleep(2)
return x
with gr.Blocks() as demo:
i = gr.Textbox(); o1 = gr.Textbox(); o2 = gr.Textbox()
gr.Button("既定").click(slow_a, i, o1, api_name="default_limit")
gr.Button("3並列").click(slow_b, i, o2, api_name="limit3", concurrency_limit=3)
demo.queue(max_size=20).launch()
同じ関数を2つのボタンに結ぶと、キューも1つにまとまります。 最初は1つの関数 slow を両方のボタンに結んでいたため、concurrency_limit=3 の側も 6.1 秒かかりました。ソースでは、concurrency_id を指定しないと関数ごとに ID が決まり、同じ ID のイベントは小さい方の上限に従います。別々に並列にしたいときは、関数を分けるか、concurrency_id を明示します。
| 設定 | 既定値(6.30.0) | 意味 |
|---|---|---|
concurrency_limit(イベントごと) |
1 | 同時に動かす数。None で上限なし |
concurrency_id |
関数ごとに自動 | 同じ ID のイベントで上限を共有する |
queue(default_concurrency_limit=) |
1 | アプリ全体の既定の上限 |
queue(max_size=) |
None(上限なし) |
待てる件数。超えると 503 |
launch(max_threads=) |
40 | 同期関数を動かすスレッドの数 |
外部の API を呼ぶだけの関数のように、同時に動かしても問題が無い処理は concurrency_limit=None にできます。GPU を使う処理は、GPU の数に合わせて concurrency_id で上限を共有させる形が公式ガイドの例です。
よく使う launch() の引数と環境変数
| 引数 | 環境変数 | 既定値 |
|---|---|---|
server_port |
GRADIO_SERVER_PORT |
7860(使用中なら次の番号を試す) |
server_name |
GRADIO_SERVER_NAME |
127.0.0.1 |
share |
GRADIO_SHARE |
False(Colab では自動で True) |
root_path |
GRADIO_ROOT_PATH |
""(nginx の配下に置くときに使う) |
mcp_server |
GRADIO_MCP_SERVER |
無効 |
analytics_enabled(Blocks 側) |
GRADIO_ANALYTICS_ENABLED |
True |
GRADIO_ANALYTICS_ENABLED は、Gradio の利用状況(動かしている環境・使っている部品など)を Gradio 側へ送る設定です。公式ガイドでは、アプリを使う人の情報は送らないと書かれています。止めるときは GRADIO_ANALYTICS_ENABLED=False です。
Hugging Face Spacesに公開する手順
Hugging Face Spaces は、Gradio のアプリを URL を固定して公開できる Hugging Face のホスティングです。 ただし、2026年10月17日時点の公式ドキュメントでは、Gradio と Docker の Space は計算資源を使うため、作成に有料プラン(個人は PRO、組織は Team か Enterprise)が要ると書かれています。無料の個人アカウントは、ZeroGPU 上で動く Gradio の Space を2つまで置けます。
| 項目 | 内容(2026年10月17日時点) |
|---|---|
| PRO の料金 | 月 9 ドル |
| 既定のハードウェア(CPU Basic) | 2 vCPU・メモリ 16GB・時間料金なし |
| ディスク | 50GB(再起動で消える) |
| 次の段(CPU Upgrade) | 8 vCPU・32GB・1時間 0.03 ドル |
| GPU(例) | Nvidia T4 small 1時間 0.40 ドル・A10G small 1.00 ドル |
| 使われていないとき | 無料のハードウェアでは一定時間でスリープ |
| Python の既定 | 3.10(README の python_version で変更) |
Space を作る
huggingface.co の Spaces で「Create new Space」を押し、名前・ライセンス・公開範囲(public・protected・private)を決めて、SDK に「Gradio」を選びます。Space は Git のリポジトリとして作られます。
app.py と requirements.txt を置く
リポジトリの直下に app.py(Gradio のコード)と requirements.txt(gradio 以外の依存)を置きます。依存は Spaces 側が自動で入れます。
README.md の先頭の YAML を確かめる
sdk: gradio・sdk_version・app_file: app.py などを書きます。OAuth を使うときは hf_oauth: true を足します。
API キーは Secrets に入れる
Space の Settings で、API キーやトークンは Secrets、公開してよい設定値は Variables に入れます。どちらもアプリからは環境変数として os.getenv("名前") で読めます。コードに直接書きません。
push するか gradio deploy で上げる
git push するたびに Space が作り直されて再起動します。アプリのフォルダで gradio deploy を実行すると、CLI が必要な情報を聞いたうえで、フォルダのファイルを上げて起動します(.gitignore は守られます)。
README.md の先頭は、たとえば次の形です。
---
title: Greeting Demo
sdk: gradio
sdk_version: 6.30.0
app_file: app.py
python_version: "3.11"
---
gradio deploy --help の出力です。6.30.0 では、Spaces のほか Google Cloud Run も選べます。
Usage: gradio deploy [OPTIONS]
Deploy a Gradio app to Spaces or Google Cloud Run. Must be called within the
directory you would like to deploy.
╭─ Options ────────────────────────────────────────────────────────────────────╮
│ --title <str> Spaces app title │
│ --app-file <str> File containing the Gradio app │
│ --provider <str> Deployment provider (spaces or gcloud) │
│ [default: spaces] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────╯
公開した Space の Gradio アプリは、https://ユーザー名-space名.hf.space の URL で開け、gradio_client や curl からも同じように呼べます。非公開の Space を呼ぶときは、Authorization: Bearer $HF_TOKEN のヘッダー(gradio_client では token=)を付けます。
GradioとStreamlitの違い
どちらも Python だけで Web の画面を作るライブラリです。大きな違いは、操作されたときに何が動くかです。同じ「名前を入れてあいさつを返す」アプリで、入力を3回変えたときの実行回数を数えました。
| 数えたもの | Gradio 6.30.0 | Streamlit 1.66.0 |
|---|---|---|
| スクリプト全体が動いた回数 | 1回(起動時だけ) | 4回(最初の表示+入力3回) |
| 関数が呼ばれた回数 | 1回(Submit を押したときだけ) | ―(関数ではなくスクリプトが動く) |
Streamlit の公式ドキュメントにも、画面を更新する必要があるたびに Python のスクリプト全体を上から再実行する、と書かれています。
| 観点 | Gradio | Streamlit |
|---|---|---|
| 書き方の中心 | 関数と、入力・出力の部品を結ぶ | スクリプトを上から順に書く |
| 操作されたとき | イベントに結んだ関数だけが動く | スクリプト全体が上から動き直す |
| 起動 | python app.py・gradio app.py |
streamlit run app.py |
| 既定の待ち受け | 127.0.0.1:7860 |
0.0.0.0:8501(同じ LAN から見える) |
| API | 関数ごとに自動でできる | 画面の表示が中心 |
| チャット | gr.ChatInterface |
st.chat_input・st.chat_message |
| 主な公開先 | Hugging Face Spaces・share リンク | Streamlit Community Cloud |
どちらを選ぶかの判断表
| 作りたいもの | 選ぶもの | 理由 |
|---|---|---|
| モデルや関数のデモを人に試してもらう | Gradio | 関数1つに画面が付き、share ですぐ見せられる |
| 画面と同時に API としても使いたい | Gradio | API が自動ででき、gradio_client で呼べる |
| LLM のチャットボット | Gradio | ChatInterface とストリーミングが最初からある |
| Hugging Face Spaces で公開したい | Gradio | Spaces の SDK として選べる |
| グラフや表を並べたデータの画面 | Streamlit | 上から書くだけで、表示の順がそのまま画面になる |
| 画面の状態を細かく作り込みたい | どちらも可 | Gradio は Blocks、Streamlit は Session State で扱う |
Gradioでよくあるエラーと直し方
この記事のアプリを動かしたときに、実際に出た文です。
| 出た文(原文) | 原因 | 直し方 |
|---|---|---|
OSError: Cannot find empty port in range: 26301-26301. |
そのポートを別のプロセスが使っている | 別の番号を server_port に指定するか、使っているプロセスを止める |
ValueError: Cannot find a function with `api_name`: /predict. |
API の名前が関数名になっている | view_api() で名前を見て、/greet のように指定する |
AppError : The upstream Gradio app has raised an exception but has not enabled verbose error reporting. To enable, set show_error=True in launch(). |
関数の中で例外が出た。既定では中身を返さない | launch(show_error=True) か、gr.Error で文を返す |
data: {"error": null}(curl) |
同上(show_error=True にすると "division by zero" が返った) |
同上。サーバー側のログに Traceback が出ている |
ComponentProcessingError: Could not preprocess input component at index 1 (a `slider` component) ... |
部品が受け取れない型の値を送った(スライダーに文字) | view_api() の型(float など)に合わせる |
{"detail":"Queue is full. Max size is 1 and size is 1."}(HTTP 503) |
待ちの件数が max_size を超えた |
max_size を増やすか、concurrency_limit を上げる |
QueueError : Queue is full! Please try again. |
同上(gradio_client 側の文) | 同上 |
{"detail":{"error":"Not authenticated","auth_message":null}}(HTTP 401) |
auth 付きのアプリにログインせずに呼んだ |
Client(url, auth=(ユーザー, パスワード)) |
ValueError : Could not login to http://127.0.0.1:26304/. |
gradio_client に渡したパスワードが違う | ユーザー名とパスワードを確かめる |
Could not create share link. Missing file: ...frpc_linux_amd64_v0.3. |
share 用の frpc を取得できない | ネットワークの制限を確かめるか、表示された手順で手動で置く |
UserWarning: Expected maximum 1 arguments for function ..., received 2. |
inputs の数が関数の引数より多い |
引数の数と inputs の数をそろえる |
AttributeError: module 'gradio' has no attribute 'inputs' |
Gradio 3 系の書き方 | gr.Slider などの部品を直接使う |
ポートが使われているときの調べ方は、関連記事「Address already in useの解決方法【Windows・Mac・Linux】」で扱っています。
画面が開けないときの確かめ方
- 別の PC から開けない:既定は
127.0.0.1で待ち受けるため。server_name="0.0.0.0"かGRADIO_SERVER_NAME=0.0.0.0にする - ログインしても画面に戻される:公式ガイドでは、認証には Cookie が要り、Safari や Chrome のシークレットモードの既定の設定では動かないことがあると書かれている
- nginx の配下(
/app/など)に置くと画面が崩れる:root_pathかGRADIO_ROOT_PATHに、そのパスを指定する - 画面は動くのに API が呼べない:
/gradio_apiを付け忘れている(付けないと 404)
よくある質問
Q. Gradioとは何ですか? A. Python の関数に、数行で Web の画面と API を付けるオープンソースのライブラリです。機械学習のモデルや LLM のデモ、社内向けの小さな道具に使われます。「Gradioとは」の節に、できることと3種類の作り方をまとめています。
Q. Gradioの使い方は?
A. pip install gradio で入れ、gr.Interface(fn=関数, inputs=..., outputs=...) を作って launch() します。ブラウザで http://127.0.0.1:7860 を開くと画面が出ます。Interface・Blocks・ChatInterface の節に、動かしたコードと結果を載せています。
Q. Gradio は無料ですか? 商用で使えますか? A. ライブラリは Apache-2.0 で、無料で使えます。Hugging Face Spaces で公開する場合は、2026年10月17日時点で Gradio の Space の作成に有料プラン(PRO は月9ドル)が要り、無料の個人アカウントは ZeroGPU 上の Gradio の Space を2つまでです。
Q. Gradio の ChatInterface でチャットボットを作るには?
A. message と history を受け取って返事を返す関数を書き、gr.ChatInterface(fn=関数).launch() とします。yield で返すとストリーミングになります。Gradio 6 では history の content が辞書のリストになっています。
Q. Gradio と Streamlit の違いは? A. Gradio は操作されたときに結んだ関数だけを動かし、API も自動でできます。Streamlit は操作のたびにスクリプト全体を上から動かし直します。違いの表と判断表を「GradioとStreamlitの違い」の節に載せています。
まとめ
- Gradio は、Python の関数に画面と API を付けるライブラリ。最新は 6.30.0 で、Python 3.10 以上が条件(3.9 では 4.44.1 が入る)。
- 作り方は、関数1つの
gr.Interface、配置とイベントを書くgr.Blocks、チャットのgr.ChatInterfaceの3種類。 - API の名前は関数名(
/greet)。gradio_client のpredict、または curl の/gradio_api/call/名前に POST → GET で呼べる。 share=Trueのリンクは1週間で失効。authでパスワードをかけられる。- イベントは既定で1件ずつ処理される。同じ関数を結んだイベントはキューを共有する。
- Spaces の Gradio アプリの作成は、2026年10月17日時点で有料プランが条件(無料の個人は ZeroGPU で2つまで)。
参考・出典
確認日はいずれも 2026年10月17日です。
- Gradio「Quickstart」:https://www.gradio.app/guides/quickstart
- Gradio「Sharing Your App」:https://www.gradio.app/guides/sharing-your-app
- Gradio「Queuing」:https://www.gradio.app/guides/queuing
- Gradio「Environment Variables」:https://www.gradio.app/guides/environment-variables
- Gradio「How to Create a Chatbot with Gradio」:https://www.gradio.app/guides/creating-a-chatbot-fast
- Gradio「Getting Started with the Python Client」:https://www.gradio.app/guides/getting-started-with-the-python-client
- Gradio「Querying Gradio Apps with Curl」:https://www.gradio.app/guides/querying-gradio-apps-with-curl
- Gradio「API Page」:https://www.gradio.app/guides/view-api-page
- Gradio「Alerts」:https://www.gradio.app/guides/alerts
- GitHub「gradio-app/gradio」:https://github.com/gradio-app/gradio
- PyPI「gradio」:https://pypi.org/project/gradio/
- Hugging Face「Spaces Overview」:https://huggingface.co/docs/hub/spaces-overview
- Hugging Face「Gradio Spaces」:https://huggingface.co/docs/hub/spaces-sdks-gradio
- Hugging Face「Spaces Configuration Reference」:https://huggingface.co/docs/hub/spaces-config-reference
- Hugging Face「Pricing」:https://huggingface.co/pricing
- Streamlit「Basic concepts of Streamlit」:https://docs.streamlit.io/get-started/fundamentals/main-concepts
- Streamlit「Run your Streamlit app」:https://docs.streamlit.io/develop/concepts/architecture/run-your-app
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Gradioとは|使い方・API呼び出し・Spaces公開をPythonで実演」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。