2026年11月5日、PythonだけでWebアプリを作れるフレームワークStreamlitの1.67.0が公開されました。10月の1.66系から、およそ3週間での新しい版です。
GitHubのリリースノートには、22の新機能、61の不具合の修正、22のそのほかの変更が並んでいます。初心者にも嬉しいのは、カードを格子状に並べるst.gridと、選択や入力を必須にできるrequired引数でしょう。
ほかにも、キャッシュの大きさに上限を設けるmax_sizeや、AIのエージェントからアプリを操作するための仕組みも加わりました。今回は、1.66.1と1.67.0で同じアプリを動かしながら、何が変わったのかを見ていきます。
まずは前回からの流れを確認しよう¶
Streamlitは、上から順に書いたPythonのスクリプトが、そのままWebの画面になるフレームワークです。データの集計結果を、グラフや表でさっと共有したいときによく使われます。
前回の1.66では、Python 3.15に対応し、3.10のサポートを終えていました。その内容は、こちらで紹介しています。【関連記事】Streamlit 1.66がリリース
PyPIの記録によると、1.67.0が必要とするPythonも、1.66と同じく3.11以上です。Streamlitそのものの使い方は、こちらで紹介しています。【関連記事】PythonのStreamlitとは?
1.67で何が変わったのかを整理しよう¶
続いて、1.67.0の主な新機能を表にまとめます。内容は、StreamlitのGitHubにある1.67.0のリリースノートにもとづいています。
| 分類 | 主な変更 |
|---|---|
| レイアウト | 画面の幅に合わせてカードを並べるst.grid |
| 入力の部品 | selectbox、text_area、date_input、time_inputなどにrequired引数 |
| キャッシュ | st.cache_dataに、関数ごとの大きさの上限max_size |
| 見た目 | 既定のライトとダークのテーマの色を更新 |
| エージェント | アプリをHTTPで操作するエージェントAPIと、MCPのエンドポイント |
| そのほか | selectboxのicon引数、st.dialogのピクセル幅指定など |
リリースノートには、互換性を壊す変更という見出しはありませんでした。依存ライブラリでは、Pillow 13を使えるようになっています。
Pillow 13については、こちらで紹介しました。【関連記事】Pillow 13.0がリリース
カードを格子状に並べるst.grid¶
まずは、新しいレイアウトの部品st.gridから見ていきましょう。docstring、つまり関数に付いている説明文によると、st.gridは、カードや数値の一覧、ギャラリーなどを並べるための、画面の幅に合わせて並び方が変わる格子です。
これまでは、st.columnsで列を作り、順番に部品を割り振る必要がありました。st.gridでは、中に置いた部品が、そのまま1つずつのマスになります。
果物の値段を並べてみた¶
実際に、4つの果物の値段を2列で並べ、その下に買いたい果物を選ぶ欄を置いたアプリを作ってみました。
import streamlit as st
st.title("果物の値段")
prices = {"りんご": 120, "みかん": 80, "ぶどう": 300, "もも": 250}
# 画面の幅に合わせて、2列で並べる
with st.grid(2):
for name, price in prices.items():
st.metric(name, f"{price}円")
fruit = st.selectbox("買いたい果物", list(prices), index=None, required=True)
st.write("選んだもの:", fruit)
このアプリを、ブラウザを使わずにアプリを動かせるテスト用の仕組みAppTestで、1.66.1と1.67.0のそれぞれで動かしました。手元のPython 3.11で実行した結果です。
Streamlit 1.66.1
例外: module 'streamlit' has no attribute 'grid'
Streamlit 1.67.0
metric: ['りんご', 'みかん', 'ぶどう', 'もも']
selectbox: None
選んだあと: 選んだもの: ぶどう
1.66.1では、st.gridがまだないので、AttributeErrorになりました。1.67.0では、4つの値段がそれぞれマスとして並び、ぶどうを選ぶと、その結果が表示されています。
列の数の決め方¶
docstringによると、st.gridの最初の引数columnsには、"auto"か、1から24までの整数を渡せます。既定の"auto"では、min_column_widthという最小の幅をもとに、入るだけの列数で並べてくれます。
整数を渡した場合も、既定ではマスが狭くなりすぎると、自動で列を減らして折り返します。スマートフォンのような狭い画面でも、カードがつぶれずに並ぶのが嬉しいところです。
選ばないと先へ進めないrequired引数¶
続いて、入力の部品に加わったrequired引数です。リリースノートによると、st.selectbox、st.text_area、st.date_input、st.time_input、st.datetime_inputに、required引数が加わりました。
手元で、1.66.1と1.67.0の引数の一覧を確かめると、selectboxやtext_areaなどのrequiredは、1.67.0にだけありました。
docstringに書かれた動き¶
selectboxのdocstringによると、required=Trueにすると、何も選んでいない状態、つまりNoneのまま送信できなくなります。フォームの中では、利用者が何かを選ぶまで、送信が止められると書かれています。
また、一度選んだあとは、別のものに変えることはできても、空に戻すことはできません。先ほどのアプリでも、index=Noneと組み合わせて、最初は何も選ばれていない状態にしていました。
注意したい点¶
docstringには、required=Trueは、部品の初期値を変えないとも書かれています。何も指定しなければ、selectboxは最初の選択肢が選ばれた状態で始まります。
つまり、選ぶまで待ってほしいなら、index=Noneも一緒に指定する必要があります。先ほどの実行結果でも、最初のselectboxの値はNoneでした。
キャッシュの大きさに上限を設けるmax_size¶
3つ目は、キャッシュの新機能です。st.cache_dataは、関数の結果を取っておき、同じ引数で呼ばれたら計算し直さずに使い回す仕組みです。
docstringによると、新しいmax_size引数で、その関数のキャッシュがメモリ上で使う大きさに、上限を設けられるようになりました。数値ならバイト数、文字列なら"500MB"のように単位を付けて書きます。
上限を超えると、古いものから捨てられる¶
上限を超えそうになると、最近使われていないものから順に捨てられると説明されています。実際に、およそ600バイトのデータを返す関数に、1KBの上限を付けて試しました。
import streamlit as st
calls = st.session_state.setdefault("calls", [])
@st.cache_data(max_size="1KB")
def load(name):
calls.append(name)
return "x" * 600 # およそ600バイトのデータ
for name in ["a", "b", "a"]:
load(name)
st.write("実際に計算した回数:", len(calls), calls)
a、b、aの順に呼んだときに、実際に計算した回数を比べた結果です。
| 条件 | 実際に計算した回数 |
|---|---|
| 1.66.1でmax_sizeを指定 | 引数がないというTypeErrorで動かない |
| 1.67.0で上限なし | 2回(2回目のaはキャッシュを使った) |
| 1.67.0でmax_size="1KB" | 3回(bを入れたときにaが捨てられ、計算し直した) |
1KBには600バイトのデータが1つしか入らないので、bを入れたときにaが追い出されたわけです。大きなデータを扱うアプリで、メモリを使いすぎないように調整できます。
リリースノートには、アプリ全体のキャッシュの予算を決めるserver.maxCacheDataSizeという設定も加わったと書かれています。
AppTestで、ブラウザなしに動きを確かめる¶
今回の動作確認では、AppTestという仕組みを使いました。AppTestは、ブラウザを開かずに、Pythonのコードからアプリを動かして結果を確かめられる、Streamlitのテスト用の機能です。
使ったコード¶
先ほどの果物のアプリを確かめたコードは、次のとおりです。selectboxでぶどうを選んだあと、もう一度アプリを動かして、表示を確かめています。
from streamlit.testing.v1 import AppTest
at = AppTest.from_file("app.py").run()
print("metric:", [m.label for m in at.metric])
print("selectbox:", at.selectbox[0].value)
at.selectbox[0].select("ぶどう").run()
print("選んだあと:", at.markdown[-1].value)
画面を手で操作しなくても、選んだときの動きを確かめられるので、新しい版に上げたときの確認にも便利です。リリースノートの不具合の修正にも、AppTestでデータエディターやファイルのアップロードを扱えるようにする項目が並んでいます。
pytestと組み合わせれば、こうした確認を自動のテストにできます。【関連記事】pytest入門|Pythonでテストを書く基本
AIのエージェントからアプリを操作する仕組み¶
リリースノートには、AIの時代らしい新機能も並んでいます。アプリをHTTPで操作するためのエージェントAPIと、MCPのエンドポイントの追加です。
MCPは、Model Context Protocolの略で、AIのアシスタントが外部の道具やデータにつながるための決まりごとです。リリースノートの項目名からは、エージェントがStreamlitのアプリを読み取ったり操作したりできるようにする仕組みだとわかります。
ただし、リリースノートには項目名が並んでいるだけで、詳しい使い方までは書かれていません。使ってみたい方は、公式ドキュメントで最新の情報を確かめてください。
上げる前にやっておきたいこと¶
最後に、Streamlitを1.67.0へ上げる前に確かめておきたいことを整理します。
| 順番 | 確認すること |
|---|---|
| 1 | 既定のテーマの色が変わったので、見た目が意図どおりか確かめる |
| 2 | st.columnsで並べていたカードを、st.gridに置き換えられないか考える |
| 3 | 必須にしたい入力欄に、requiredとindex=Noneを付ける |
| 4 | 大きなデータを扱うキャッシュに、max_sizeを付ける |
リリースノートによると、既定のライトとダークのテーマの色や、画面の背景の扱いも更新されています。スクリーンショットを使った説明書などがある場合は、撮り直しが必要かもしれません。
私は10年ほどエンジニアとして開発に関わってきましたが、社内向けの集計アプリで、選択欄を選び忘れたまま実行されて、全件の重い集計が走ってしまったことがあります。required引数のように、入力の段階で止めてくれる仕組みは、こうした事故を防いでくれます。
PythonだけでWeb画面を作れるほかのツールの動きは、NiceGUIの記事でも紹介しています。【関連記事】NiceGUI 4.0がリリース
まとめ¶
2026年11月5日、Streamlit 1.67.0が公開されました。カードを格子状に並べるst.grid、選択や入力を必須にするrequired引数、キャッシュの大きさに上限を設けるmax_sizeなど、22の新機能が加わっています。
どれも、すぐに使える便利な機能です。上げたら、まずはst.gridでカードを並べるところから試してみてください。
ここまでお読みいただきありがとうございました。