Streamlit v1.43.0〜1.44.0で個人的に気になったアップデートまとめ

## この記事について
Pythonで手軽にフロントエンドを作れるライブラリ「Streamlit」を、久しぶりに触れてみました。その中で特に気になった新機能があったので、いくつかピックアップしてご紹介します。


## Streamlitのリリースノートを見てみる
記事執筆時点（4/5）の最新バージョンは`v1.44.0`のようでした。
https://docs.streamlit.io/develop/quick-reference/release-notes/2025
今回は1.44.0のアップデートを2つ、1.43.0のアップデート（2025/3/4）を1つ取り上げてみたいと思います。

:::note info
前提 実行環境は[uv](https://docs.astral.sh/uv/)を使っています。uvがインストールされていることを前提に以下記載しています。詳しくは公式ページをご覧ください。

### ざっくり導入手順
#### プロジェクトを作成
```terminal
uv init
```
#### インストール対象のライブラリを追加
```terminal
uv add streamlit
```
#### 仮想環境が自動的に作成されるのでactivate
```terminal
. .venv/bin/activate
```
#### 実際にライブラリをインストール
```terminal
uv sync
```
:::
### ①`st.chat_input`がファイル入力を受け付けるようになった（v1.43.0）
> 📁 Announcing the option to accept files with st.chat_input!

https://docs.streamlit.io/develop/api-reference/chat/st.chat_input

従来、ファイルアップロードをできるUIを作るには、`st.file_uploader`を使う必要がありましたが、
`st.chat_input`において、`accept_file`をTrueにすることで、ファイルアップロード用のUIを表示できるようになりました。（以下参照）
`file_type`を指定することで、アップロードすることのできる拡張子を指定することができます。

このアップデートで、マルチモーダルなチャットUIの構築がさらに手軽になった印象です。

```python
prompt = st.chat_input(
    "メッセージとファイルを入力してください",
    accept_file=True,
    file_type=["jpg", "jpeg", "png"]
)
```
![スクリーンショット 2025-04-05 17.00.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/129d88e3-1285-454f-ad1e-31afeb70f18a.png)


とても雑な作りですがこんなAIとマルチモーダルに対話するUIが簡単に作れました。詳細なコードの解説はここでは割愛しますが、入力されたプロンプトから質問のtextとアップロードされたfileを抽出し、それをAmazon Bedrockの[ConverseAPI](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/conversation-inference.html)に渡す形で作っています。（作成にあたっては一部[こちら](https://qiita.com/y-mae/items/5ee26638e52d86079963)を参照しました）

（イメージ）
```python
if prompt:
    question = prompt["text"]
    files = prompt["files"]
    
    if files:
        uploaded_file = files[0]
        .....
        # bedrockのAPIを呼び出す処理（question,uploaded_fileを引数で渡してあげる）
```


::: note info
chat_inputを使って入力されたpromptの中身をターミナルに出力して確認してみると、以下のような形式になっています。
```terminal
ChatInputValue(text='説明して', files=[UploadedFile(file_id='XXXX', name='0000096860.pdf', type='application/pdf', size=2031020, _file_urls=file_id: "XXXXX"
upload_url: "XXXXXXXXXX"
delete_url: "XXXXXXXXX"
)])
```
:::


![スクリーンショット 2025-04-05 16.51.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/e411d821-9a70-40a1-b33e-1cb334f96ba0.png)




### ②エラーの内容を、Google検索やChatGPTで質問できるようになった（v1.44.0）
>🤖 st.exception includes links to open Google or ChatGPT with the contents of the exception. This includes uncaught exceptions displayed in the app.

エラー内容を、ChatGPTやGoogleで検索できるようになりました。
簡単な例ではありますが、Pythonコードを書きエラーを発生させてみます。
```python
import streamlit as st

st.title("📌 Streamlit v1.44.0新機能")

try:
    x = 1 / 0  # わざとゼロ除算してみる
except Exception as e:
    st.exception(e)

```

```terminal
$ streamlit run app.py
```
でローカル（`localhost:8501`）でアプリをstreamlitで立ち上げ、ブラウザを確認してみます。
ゼロ除算をしているのでこのコードは当然エラーになります。
エラー画面に注目すると、`Ask Google` `Ask ChatGPT`というリンクが表示されています。
![スクリーンショット 2025-04-05 13.52.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/7a573938-d821-4372-86c5-03bc8c8cacfb.png)

実際に各リンクを押してみると、`Ask Google`の方はエラー内容を自動的に検索ボックスに入れて検索、`Ask ChatGPT`の方ではエラー内容自動的にチャットに入力し、ChatGPT内で質問が走るようになっていました。
![スクリーンショット 2025-04-05 13.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/1a2e1310-9837-441a-b8b5-d418b293c1e1.png)
![スクリーンショット 2025-04-05 13.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/5083b6cb-d503-482c-9b20-3ec81a84da13.png)

開発をしていてエラーに直面した際、エラー内容をいちいちペタペタ貼って検索するのは面倒ではあるので、その手間を省いてくれる点で役立ちそうです。

:::note warn
Ask ChatGPTの方に関しては、エラー内容がそのままチャットに入力→送信されるので、プロジェクト固有の情報が入っているソースコードなどで利用する際は、安全性はしっかりと確認した上で利用した方がいいかもしれません。
:::


### ③ユーザーのlocaleを取得できるようになった（v.1.44.0）
>🗺️ You can access the user's locale through st.context (#10563).

> st.context provides a read-only interface to access headers and cookies for the current user session.

`st.context`を使うことで、ユーザーのlocale（言語設定）を取得できるようになりました。これにより、アプリ側で表示言語を切り替えるといった多言語対応がより実現しやすくなりそうです。

こちらも簡単なコードではありますが試してみます。
```python
import streamlit as st

context = st.context
locale = context.locale
st.write(locale)

if locale == "ja":
    st.write("こんにちは")
else:
    st.write("Hello!")

```
![スクリーンショット 2025-04-05 14.24.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/87a8d45d-fca9-4dcd-bcd7-cf24b1f65da7.png)

ユーザーのロケールを正しく取得していることがわかりました。

::: note info
他にも以下のような情報が取得できるようです。
![スクリーンショット 2025-04-05 14.18.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/bf034f1c-addf-4e86-a7e6-491ecbbaf235.png)

:::


## まとめ・所感
簡単ではありましたが、今回はstreamlitの機能をいくつかピックアップして紹介してみました。
最近では[OIDCによるユーザー認証が追加されたり（v1.42.0〜）](https://docs.streamlit.io/develop/concepts/connections/authentication)と、開発者にとって便利な機能が続々と追加されているStreamlitですが、今回取り上げた機能は「劇的な変化」ではないものの、あると嬉しい便利機能がしっかりと詰まっていると感じました。今後のアップデートも引き続き追っていきたいと思います。

## おまけ
https://docs.streamlit.io/develop/tutorials/chat-and-llm-apps/build-conversational-apps

Streamlitを使ったLLMチャットアプリの作り方が解説されている公式チュートリアルです。興味がある方はこちらもぜひチェックしてみてください。