https://blog.mocobeta.dev/posts/feed.xml

ChatKitの会話履歴の構造

2025-12-08

ChatKitでは,会話履歴をThreadという単位で管理しています。(ややこしいですが,以前のエントリで少し触れたAgents SDKのSessionとは別物です。)

ChatKitを使いこなすには,このThreadのデータ構造と,またThreadの管理を担うStoreを理解することが一番大事といってもよいと思います。

ドキュメントはこちら: Threads and items

主要なデータ構造

会話履歴に登場する主要なデータタイプは,ThreadMetadata, ThreadItem, Attachmentの3つだけです。

ThreadMetadataが一つの会話を表し,ThreadItemが会話の中の一つ一つの発話やアクションを表します。ThreadItemはユーザーの発話,アシスタントの応答の他,内部で行われるツール実行など,会話の中で発生するありとあらゆるアクションを表します(そのため実態はUnion typeになっている)。また,Attachmentが添付ファイルを表します。

ものすごく雑なクラス図を書くとこう。

ChatKit Thread Class Diagram

また,これらを保存・管理するリポジトリに相当するクラスがStoreです。

AttachmentThreadMetadata とが関連づけられていないように見えますが,実際直接は関連づけられていなくて,ThreadMetadataの中のひとつのThreadItemを介して関連づける形になっています。認識が間違っていなければ,昨日のエントリで触れたThreadItemConverterが,Attachmentから新しいThreadItemを作るという処理をしている,はず。

Threadの永続化について

RDBMSかドキュメントデータベースのいずれもストレージに使えそうです。

ChatKitのexampleリポジトリには,MemoryStore(インメモリストア)しか実装例がないのですが,Microsoft謹製のagent-frameworkというリポジトリに,SQLiteをバックエンドにした簡易なStoreの実装があります。RDBのテーブル設計はこちらを起点にすると良さそう。

python/samples/demos/chatkit-integration/store.py


これは Agents SDK+αのTipsを一人で書いていくアドカレ Advent Calendar 2025の8日目の記事です。