エージェント・セッションを管理する方法を学習します。
セッションは、ユーザとエージェント間の複数ターン会話のような連続的な実行のコレクションです。
Agno 2.x : Learn : エージェント – エージェント・セッション
作成 : クラスキャット・セールスインフォメーション
作成日時 : 10/21/2025
バージョン : Agno 2.1.9
* 本記事は docs.agno.com の以下のページを独自に翻訳した上で、補足説明を加えてまとめ直しています。スニペットはできる限り日本語を使用しています :
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
Agno 2.x : Learn : エージェント – エージェント・セッション
エージェント・セッションを管理する方法を学習します。
Agent.run() を呼び出す際、ステートレスな単独のエージェントの実行を作成します。
しかし、この会話を継続したい場合、つまり複数ターンの会話を行いたい場合はどうすれば良いでしょう?そこで「セッション」が登場します。セッションは連続的な実行のコレクションです。
実際には、セッションとはユーザとエージェント間の複数ターンの会話です。session_id を使用して、複数の実行にわたる会話履歴と状態を接続できます (関連付けられます)。
核心的なコンセプトは :
- セッション : セッションは、ユーザとエージェント間の複数ターン会話のような連続的な実行のコレクションです。セッションは session_id により識別され、セッションに属するすべての実行、メトリクス、状態、その他のデータを収容します。
- 実行 : エージェントとのすべてのインタラクション (i.e. チャットやターン) は実行 (run) と呼ばれます。実行は run_id により識別され、Agent.run() は呼び出された際に新しい run_id を作成します。
- メッセージ : モデルとエージェント間で送信される個々のメッセージです。メッセージはエージェントとモデル間の通信プロトコルです。
See Session Storage for more details on how sessions are stored.
単一セッション
エージェントにより単一の実行が作成される例を示します。run_id は session_id とともに自動的に生成されます (まだユーザーに関連付けられた session_id を提供していないので)。
from agno.agent import Agent
from agno.models.openai import OpenAIChat
agent = Agent(model=OpenAIChat(id="gpt-5-mini"))
# Run agent and return the response as a variable
response = agent.run("ロボットについての5秒間の短いストーリーを語ってください")
print(response.content)
print(response.run_id)
print(response.session_id)
出力例
壊れかけの配達ロボットが最後の電力で濡れた子猫を温め、静かに光を消した。 0a3e7ef9-9ba5-4584-9ebd-a64a81d20805 fe4a921c-5843-4a7d-9d46-32ed8f547dfb
複数ターンのセッション
エージェントとやり取りしている各ユーザは固有のセッションのセットを取得し、複数のユーザが同じエージェントと同時にやり取りすることができます。
user_id を設定して、ユーザをエージェントとのセッションに接続します。
下記の例では、session_id を設定して、複数のユーザと同時に複数ターンの会話を行う方法を実演します。
- マルチユーザー、マルチセッションの例
multi_user_multi_session.py
from agno.agent import Agent from agno.models.openai import OpenAIChat from agno.db.sqlite import SqliteDb db = SqliteDb(db_file="tmp/data.db") agent = Agent( model=OpenAIChat(id="gpt-5-mini"), db=db, add_history_to_context=True, num_history_runs=3, ) user_1_id = "user_101" user_2_id = "user_102" user_1_session_id = "session_101" user_2_session_id = "session_102" # user 1 とのセッションを開始する agent.print_response( "ロボットについての5秒間の短いストーリーを語ってください。", user_id=user_1_id, session_id=user_1_session_id, ) # user 1 とのセッションを続ける agent.print_response("次にジョークを言ってください。", user_id=user_1_id, session_id=user_1_session_id) # user 2 とのセッションを開始する agent.print_response("量子物理学について教えてください。", user_id=user_2_id, session_id=user_2_session_id) # user 2 とのセッションを続ける agent.print_response("光の速度はどれくらいですか?", user_id=user_2_id, session_id=user_2_session_id) # エージェントに会話の要約を提供するように求めます、 # これは前のメッセージからの履歴を使用します (ただし user 1 だけ) agent.print_response( "私たちの会話の要約を提供してください。", user_id=user_1_id, session_id=user_1_session_id, )
- サンプルを実行します。
ライブラリのインストール
pip install agno openai
キーのエクスポート
export OPENAI_API_KEY=xxx
サンプルの実行
python multi_user_multi_session.py
出力例
┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ ロボットについての5秒間の短いストーリーを語ってください。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (9.7s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 古いロボットが庭の一輪の花を見つけ、そっと水をやった。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 次にジョークを言ってください。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (28.1s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ ロボットが大笑いしてネジが外れた。慌てて「誰か締め直してくれ!」と言った。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 量子物理学について教えてください。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (40.4s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ いいですね。量子物理学(量子力学)は直感に反する性質を持つ小さな世界(原子・分子・電子・光子など)を記述する理論です。まず全体像と主要概念をわ ┃ ┃ かりやすくまとめ、そのあと学習方法や参考資料を提案します。興味のある深さ(入門/数学的な理解/応用中心)を教えていただければ、より具体的に合わ ┃ ┃ せます。 ┃ ┃ ┃ ┃ 概観(簡単な要約) ┃ ┃ - マクロな古典物理と違い、微視的系は確率的に振る舞う。量子状態は確率振幅(波動関数)で表され、測定で確率的に結果が得られる。 ┃ ┃ - 重要な実験や理論:光の量子性(光子)、電子の波動性(電子回折)、エネルギーの離散化(原子のスペクトル)、量子もつれ(遠隔相関)。 ┃ ┃ ┃ ┃ 主要概念(それぞれ短く説明) ┃ ┃ - 波動粒子二重性:光や電子は状況によって波の性質(干渉・回折)と粒子の性質(局在・検出)を示す。 ┃ ┃ - 量子状態と波動関数:系の状態は波動関数 ψ(x,t) などで表され、|ψ|^2 が位置を測ったときの確率密度を与える。 ┃ ┃ - シュレーディンガー方程式:量子力学の基本的時間発展則。簡単な形は iħ ∂ψ/∂t = ┃ ┃ Hψ(Hはハミルトニアン=エネルギー演算子)。これで系の時間変化を決める。 ┃ ┃ - 量子化(離散化):束縛系(原子の電子など)では許されるエネルギーが離散値になる(例:水素原子のエネルギー)。 ┃ ┃ - 演算子と期待値:位置・運動量などは演算子で表現され、観測の平均値は ⟨ψ|Ô|ψ⟩ のように計算する。 ┃ ┃ - 不確定性原理:ハイゼンベルクの関係 Δx · Δp ≥ ħ/2 は位置と運動量の同時精密測定が不可能であることを示す。 ┃ ┃ - 測定問題と波束の収縮:測定によって状態が確率的にある固有状態に「収束」する(古典にはない問題で解釈論争がある)。 ┃ ┃ - ┃ ┃ もつれ(エンタングルメント):複数粒子が非分離な相関を持ち、一方の測定が瞬時に他方の統計に影響を与える。ベルの不等式の実験で局所実在論が否定さ ┃ ┃ れる。 ┃ ┃ - 量子重ね合わせ:系は複数の状態の重ね合わせにある。観測までは複数の可能性が共存する。 ┃ ┃ ┃ ┃ 代表的な実験(理解に役立つ) ┃ ┃ - 二重スリット実験:電子や光子で干渉パターンができ、観測行為がパターンを変える。 ┃ ┃ - シュテルン=ゲルラッハ実験:電子のスピンが離散的な値(上/下)しか取らないことを示す。 ┃ ┃ - ベル実験:量子もつれの非局所性を確認する実験。 ┃ ┃ ┃ ┃ 数学的に必要な基礎 ┃ ┃ - 線形代数(ベクトル、行列、固有値問題) ┃ ┃ - 微分方程式(常微分・偏微分) ┃ ┃ - 複素数、フーリエ変換 ┃ ┃ - (より深入りするなら)作用素論や線型作用素のスペクトル理論 ┃ ┃ ┃ ┃ 基本的な方程式や式(覚えておくと良い) ┃ ┃ - プランクの式:E = hν(光の量子) ┃ ┃ - シュレーディンガー方程式(時間依存型):iħ ∂ψ/∂t = Hψ ┃ ┃ - ハイゼンベルク不確定性:Δx Δp ≥ ħ/2 ┃ ┃ ┃ ┃ 主要な解釈(哲学的・概念的側面) ┃ ┃ - コペンハーゲン解釈:波動関数は知識の記述で、測定で「収縮」する。 ┃ ┃ - 多世界解釈:測定で世界が分岐し、すべての可能性が実現する(波動関数は普遍的に実在)。 ┃ ┃ - ボーム力学(パイロット波):隠れた変数で決定論的に振る舞うモデル(非局所性を含む)。 ┃ ┃ - デコヒーレンス理論:環境との相互作用で重ね合わせが古典的統計へ見えるように失われる(測定問題の一側面を説明)。 ┃ ┃ ┃ ┃ 応用例 ┃ ┃ - 半導体デバイス(トランジスタ、太陽電池) ┃ ┃ - レーザー、原子時計、MRI ┃ ┃ - 量子化学(化学結合の理解、計算化学) ┃ ┃ - 量子情報・量子計算(量子ビット、量子暗号、量子センサー) ┃ ┃ ┃ ┃ 学習の進め方(初心者向けの道筋) ┃ ┃ 1. 古典物理(波動、古典力学、電磁気)の基本を確認。 ┃ ┃ 2. 必要な数学(線形代数・微分方程式・複素数)を復習。 ┃ ┃ 3. 初学向けの概念的本・入門コース(例:ファインマンのQEDや入門書、オンライン講義)で直感を養う。 ┃ ┃ 4. 数学的に厳密な教科書(Griffiths「Introduction to Quantum Mechanics」など)で学ぶ。 ┃ ┃ 5. 例題(粒子井戸、調和振動子、水素原子)を手で解く。 ┃ ┃ 6. 実験的・応用的トピック(量子情報、スペクトロスコピー)へ進む。 ┃ ┃ ┃ ┃ おすすめ教材(日本語・英語混在) ┃ ┃ - 入門向け(一般向け)書籍:Feynman「QED」やGribbin「In Search of Schrödinger's ┃ ┃ Cat」(これらは英語ですが読みやすい)。日本語でも入門書が多くあります。 ┃ ┃ - 大学向け教科書:Griffiths「Introduction to Quantum Mechanics」(英語、演習が豊富)、Shankar、Sakurai(上級)。 ┃ ┃ - オンライン講義:MIT OpenCourseWare(Quantum Physics)、edXやCourseraの量子力学コース。 ┃ ┃ - シミュレーション:PhETの量子実験シミュレータで直感的理解を深める。 ┃ ┃ ┃ ┃ もし始めたいレベルが ┃ ┃ - 全くの初心者なら:概念中心の解説+簡単な二重スリットや光子の話から。 ┃ ┃ - 大学初年度レベル(数学あり)なら:線形代数を整えた上でシュレーディンガー方程式と基本的な解を学ぶ。 ┃ ┃ - 応用(量子情報など)なら:線形代数と量子ビットの表現(ブラ–ケット記法)から入るのがよいです。 ┃ ┃ ┃ ┃ どうしますか?(次の提案) ┃ ┃ - 初心者向けに直感的な説明(図や例を含めて)を続ける。 ┃ ┃ - 具体的なテーマ(シュレーディンガー方程式、量子もつれ、量子コンピュータなど)を深掘りする。 ┃ ┃ - 練習問題(例題と解答)を用意する。 ┃ ┃ 興味・背景(高校物理レベル/大学数学あり/プログラミング可など)を教えてください。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 光の速度はどれくらいですか? ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (12.7s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 真空中の光速は定義上正確に ┃ ┃ c = 299,792,458 m/s ┃ ┃ (約3.00 × 10^8 m/s、299,792.458 km/s)です。 ┃ ┃ ┃ ┃ 補足: ┃ ┃ - この値は1983年以降、メートルが光が真空中を1秒間に進む距離を基に定義されているため「正確」です。 ┃ ┃ - 物質中では屈折率 n により速度が遅くなり、v = c / n になります(例:水では約2.25×10^8 m/s、一般的なガラスでは約2.0×10^8 m/s)。 ┃ ┃ - 相対性理論によれば、情報や質量を持つ物体が真空中で光速を超えることはできません。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 私たちの会話の要約を提供してください。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (10.1s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 会話の要約です。 ┃ ┃ ┃ ┃ - 依頼:5秒間の短いロボットのストーリーを作ってほしい ┃ ┃ 応答:「古いロボットが庭の一輪の花を見つけ、そっと水をやった。」 ┃ ┃ ┃ ┃ - 依頼:ジョークを言ってほしい ┃ ┃ 応答:「ロボットが大笑いしてネジが外れた。慌てて『誰か締め直してくれ!』と言った。」 ┃ ┃ ┃ ┃ - 現在の依頼:これまでの会話の要約を提供すること。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
Info : For session history and management, you need to have a database assigned to the agent. See Storage for more details.
コンテキスト内の履歴
上記の例でのように、add_history_to_context を使用して会話履歴をコンテキストに追加できます。このパラメータは Agent か run() メソッドで指定できます。
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.db.in_memory import InMemoryDb
agent = Agent(model=OpenAIChat(id="gpt-5-mini"), db=InMemoryDb())
agent.print_response("こんにちは、太郎です。初めまして!")
agent.print_response("私の名前は何ですか?", add_history_to_context=True)
出力例
┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ こんにちは、太郎です。初めまして! ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (7.6s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ はじめまして、太郎さん。私はChatGPTです。よろしくお願いします! ┃ ┃ 今日はどんなことをお手伝いしましょうか?(日本語・英語どちらでも大丈夫です) ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 私の名前は何ですか? ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (4.7s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ あなたの名前は太郎さんですね。よろしくお願いします! ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
Learn more in the Context Engineering documentation.
セッション要約
エージェントはセッションの圧縮 (condensed) 表現を保存できます、チャット履歴が長くなり過ぎた際に役立ちます。Agno ではこれを「セッション要約 (Session Summary)」と呼称します。
セッション要約を有効にするには、エージェントで enable_session_summaries=True を設定します。
- セッション要約の例
session_summary.py
from agno.agent import Agent from agno.models.openai import OpenAIChat from agno.db.sqlite import SqliteDb from dotenv import load_dotenv load_dotenv() db = SqliteDb(db_file="tmp/data.db") user_id = "jon_hamm@example.com" session_id = "1001" agent = Agent( model=OpenAIChat(id="gpt-5-nano"), db=db, enable_session_summaries=True, ) agent.print_response( "量子コンピューティングについて教えてください。", stream=True, user_id=user_id, session_id=session_id, ) agent.print_response( "LLM についても知りたいのですが?", stream=True, user_id=user_id, session_id=session_id ) session_summary = agent.get_session_summary(session_id=session_id) print(f"Session summary: {session_summary.summary}")
- サンプルを実行します。
ライブラリのインストール
pip install agno openai
キーのエクスポート
export OPENAI_API_KEY=xxx
サンプルの実行
python session_summary.py
出力例
... Session summary: 量子コンピューティングの基礎と現状(量子ビット/重ね合わせ/もつれ、ゲート、測定、Shor・Grover、量子シミュレーション、NISQ、エラー訂正・スケーリング、主要実装技術)と、 LLM(大規模言語モデル)の基礎と実務活用(Transformerと注意機構、事前学習・微調整・RLHF、プロンプト設計、用途・利点・課題、実務導入の手段と学習リソース)を説明。両トピックについて初心者向けの要点を提供し、深掘りの希望を伺う形で結んだ。
セッション要約のカスタマイズ
エージェントにカスタム session_summary_prompt を提供することで、セッション要約を調整できます。
SessionSummaryManager クラスは、セッション要約を作成して更新するために使用するモデルの処理を担います。これを調整して、要約が作成・更新される方法をパーソナライズできます。
from agno.agent import Agent
from agno.session import SessionSummaryManager
from agno.models.openai import OpenAIChat
from agno.db.sqlite import SqliteDb
# Setup your database
db = SqliteDb(db_file="agno.db")
# Setup your Session Summary Manager, to adjust how summaries are created
session_summary_manager = SessionSummaryManager(
# Select the model used for session summary creation and updates. If not specified, the agent's model is used by default.
model=OpenAIChat(id="gpt-5-mini"),
# You can also overwrite the prompt used for session summary creation
session_summary_prompt="Create a very succinct summary of the following conversation:",
)
# Now provide the adjusted Memory Manager to your Agent
agent = Agent(
db=db,
session_summary_manager=session_summary_manager,
enable_session_summaries=True,
)
セッション履歴
ストレージが有効にされたエージェントは、セッションのメッセージと実行履歴に自動的にアクセスできます。
以下を使用してこれらのメッセージにアクセスできます :
- agent.get_messages_for_session() -> 現在のエージェントに対して、セッションのすべてのメッセージへのアクセスを取得します。
- agent.get_chat_history() -> セッションのすべての一意なメッセージへのアクセスを得ます。
以下の方法でエージェントにチャット履歴へのアクセスを与えることができます :
- add_history_to_context=True と num_history_runs=5 を設定して、エージェントに送信されるすべてのメッセージに最後の 5 回の実行のメッセージを自動的に追加できます。
- read_chat_history=True を設定して、エージェントに get_chat_history() ツールを提供し、チャット履歴全体から任意のメッセージを読めるようにできます。
- 最善のエクスペリエンスのために、add_history_to_context=True, num_history_runs=3 と read_chat_history=True の 3 つすべてを設定することを勧めます。
- read_tool_call_history=True を設定して、エージェントに get_tool_call_history() ツールを提供して、逆時系列でツール呼び出しを読み取ることを可能にできます。
Take a look at this example:
- セッション履歴の例
session_history.py
from agno.db.sqlite import SqliteDb agent = Agent( model=OpenAIChat(id="gpt-5-nano"), db=SqliteDb(db_file="tmp/data.db"), add_history_to_context=True, num_history_runs=3, read_chat_history=True, description="あなたは、常に礼儀正しく、明るく、前向きな態度で応じてくれる、役に立つアシスタントです。", ) agent.print_response("2 文(センテンス)のホラーストーリーを共有してください", stream=True) agent.print_response("私の最初のメッセージは何でしたか?", stream=True)
- サンプルを実行します。
ライブラリのインストール
pip install agno openai
キーのエクスポート
export OPENAI_API_KEY=xxx
サンプルの実行
python session_history.py
出力例
┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 2 文(センテンス)のホラーストーリーを共有してください ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (14.4s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 深夜、枕元の窓がかすかに震え、外の木々が私の呼吸のリズムに合わせてささやく。ふと振り向くと、床には私の影と同じ影が背後で微笑んでいた。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 私の最初のメッセージは何でしたか? ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Tool Calls ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ • get_chat_history(num_chats=1) ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (10.4s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ あなたの最初のメッセージは「2 文(センテンス)のホラーストーリーを共有してください」でした。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
セッション履歴の検索
場合によっては、会話内でコンテキストや連続性を提供するために、複数のセッションからメッセージを取得したい場合があります。
最後の N セッションからのメッセージ取得を有効にするには、以下のフラグを使用する必要があります :
- search_session_history: これを True に設定して、以前のセッションの検索を可能にします。
- num_history_sessions: 検索で含める過去のセッションの数を指定します。下記の例では、最後の 2 セッションだけを含めるために 2 に設定されています。
この数を小さく (2 or 3) 保持することを勧めます、大きい数はモデルのコンテキスト長をいっぱいにし、パフォーマンスの問題につながる可能性があります。
最後の 2 セッションを検索する例が以下です :
# Remove the tmp db file before running the script
import os
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.db.sqlite import SqliteDb
os.remove("tmp/data.db")
db = SqliteDb(db_file="tmp/data.db")
agent = Agent(
model=OpenAIChat(id="gpt-5-mini"),
user_id="user_1",
db=db,
search_session_history=True, # allow searching previous sessions
num_history_sessions=2, # only include the last 2 sessions in the search to avoid context length issues
)
session_1_id = "session_1_id"
session_2_id = "session_2_id"
session_3_id = "session_3_id"
session_4_id = "session_4_id"
session_5_id = "session_5_id"
agent.print_response("南アフリカの首都は何ですか?", session_id=session_1_id)
agent.print_response("中国の首都は何ですか?", session_id=session_2_id)
agent.print_response("フランスの首都は何ですか?", session_id=session_3_id)
agent.print_response("日本のの首都は何ですか?", session_id=session_4_id)
agent.print_response(
"以前の会話では何を話し合いましたか?", session_id=session_5_id
) # It should only include the last 2 sessions
出力例
INFO Successfully created table 'agno_sessions' ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 南アフリカの首都は何ですか? ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (6.0s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 南アフリカには首都が3つあります。 ┃ ┃ - 行政(行政機関・大統領の官邸):プレトリア(Pretoria) ┃ ┃ - 立法(議会):ケープタウン(Cape Town) ┃ ┃ - 司法(最高裁の所在地):ブルームフォンテーン(Bloemfontein) ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 中国の首都は何ですか? ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (4.8s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 中国の首都は北京市(北京、英語: Beijing)です。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ フランスの首都は何ですか? ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (3.5s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ フランスの首都はパリです(Paris)。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 日本のの首都は何ですか? ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (9.0s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 日本の首都は東京(東京都)です。政府の中枢機関や皇居があり、事実上の首都とされています(憲法や法律で明示的に「首都」と規定されているわけではあ ┃ ┃ りません)。 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 以前の会話では何を話し合いましたか? ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Tool Calls ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ • get_previous_session_messages() ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (12.8s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ 前回の会話では次のやり取りをしました: ┃ ┃ ┃ ┃ - 「南アフリカの首都は何ですか?」 ┃ ┃ → 回答:南アフリカには首都が3つあります — 行政府(プレトリア/Pretoria)、立法(ケープタウン/Cape ┃ ┃ Town)、司法(ブルームフォンテーン/Bloemfontein)。 ┃ ┃ ┃ ┃ - 「中国の首都は何ですか?」 ┃ ┃ → 回答:北京市(Beijing)。 ┃ ┃ ┃ ┃ 他に前回の詳細な記録を見たいですか、それとも別の質問がありますか? ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
以上