ChatKitでファイルアップロード機能を実装する
前回はAgents SDKでファイルを解析するエージェントを作りました。ファイルを扱うにはやっぱりGUIがほしいので,ChatKitでファイルアップロードのインタフェースを実装してみます。
ChatKitのUIにファイルアップロード機能をつける
ChatKitでの添付ファイルの取り扱い方法全般のドキュメントはこちら: Accept rich user input
やることはけっこう多いのですが,とても雑に要約すると,
- ChatKitのフロントエンドでファイルアップロードを有効にする。Direct uploadとTwo-phase uploadの2つの戦略がある。詳細はこちら。
- バックエンドで添付ファイルのアップロード処理を実装する。Direct uploadとTwo-phase uploadで処理シーケンスが異なりますが,本質的にやることは同じ。
- 添付ファイルのコンテンツを受け取って,ファイルストレージに保存する
- 添付ファイルのメタデータ(
Attachmentオブジェクト)を作成してChatKitのStoreに保存する
- 添付ファイルの削除処理を実装する
- ファイルストレージからファイルのコンテンツを削除する
- ChatKitの
Storeからメタデータ(Attachmentオブジェクト)を削除する
- 添付ファイルをエージェントが利用できるようにResposes APIのインプットに変換する
- 画像ファイルのプレビュー表示を実装する
という流れになります。
とりあえず手を動かす
ここで作ったチャットUIにファイルアップロード機能を追加していきます。
フロントエンド
アップロード戦略にDirect uploadを使う場合,chatkitの初期化コードを2箇所変更します。
;
これで,チャットUIのメッセージ入力欄にファイルアップロードの「+」ボタンが表示されるようになります。

バックエンド
最低限必要なのは,
- AttachmentStoreの実装
- Storeの実装
- アップロードエンドポイントの実装
- ThreadItemConverterの実装
の4つです。
なお今回はDirect upload戦略を使うのですが,Two-phase upload戦略の実装例は agent-framework リポジトリの python/samples/demos/chatkit-integration/attachment_store.pyとpython/samples/demos/chatkit-integration/store.pyとpython/samples/demos/chatkit-integration/app.pyが参考になると思います。
AttachmentStoreの実装
AttachmentStore を継承したクラスを作ります。AttachmentStoreは添付ファイルのコンテンツを扱うクラスです。
以下はOpenAI Filesにファイルコンテンツをアップロードする例ですが,ストレージはもちろんローカルストレージでもS3のようなオブジェクトストレージでも何でもOKです。
# file_attachment_store.py
=
=
"""添付ファイルのコンテンツとメタデータを削除する。"""
# 基底クラスのAtachmentStoreでabstractmethodなので,オーバーライドする
# OpenAI Filesからファイルを削除する
= await
# メタデータも削除する
await
pass
"""OpenAI Filesにファイルをアップロードする"""
= await
=
return
Storeの実装
Store(を継承したクラス)に,添付ファイルのメタデータを保存・取得・削除するメソッドを追加実装します。インメモリストアなのであれですが,雰囲気は伝わると思います。
# memory_store.py
"""Simple in-memory store compatible with the ChatKit Store interface."""
: =
: = # 添付ファイルのメタデータを保存する辞書
# 省略。実装は以下参照。
# https://github.com/openai/openai-chatkit-advanced-samples/blob/main/examples/cat-lounge/backend/app/memory_store.py
# Do not use in production.
=
# Do not use in production.
=
return
# Do not use in production.
アップロードエンドポイントの実装
Direct uploadのアップロードエンドポイントのパスは,フロントエンドで指定した uploadUrl と一致させる必要があります。
# main.py
...
= await
=
# ファイルコンテンツを保存(ここではOpenAI Filesにアップロード)
= await
=
# 添付ファイルのメタデータを作成
=
=
# メタデータをStoreに保存
await
=
return
エラーハンドリングやトランザクションどうするんだ,などいろいろ気になることはありますが,デモなのでテクニカルな詳細には目をつぶっておきます。
動作確認
ここまでで,ファイルアップロードと削除が動作するようになるので,起動して確認してみます。
# フロントエンド
# バックエンド
ファイルをアップロードしたところ。

アップロード成功時のサーバーのログ
画像の右上に小さく出ている「✘」を押すと削除されます。
ファイル削除成功時のサーバーのログ
ここまででやっと,ChatKitでのファイルアップロードと削除が動作するようになりました!
これで終わりではなく,アップロードしたファイルをエージェントが解釈可能な入力にするためには,もう一手間が必要です。長くなったので続きはまたあした。
これは Agents SDK+αのTipsを一人で書いていくアドカレ Advent Calendar 2025の6日目の記事です。