nikkie-ftnextの日記

イベントレポートや読書メモを発信

Agent Development Kitの Session 〜Web UIからexportして、CLIで再開する〜

はじめに

七尾百合子さん、お誕生日 141日目 おめでとうございます! nikkieです。

Yesterday I Learnedから素振りします。

目次

Web UIからsessionをexportして、CLIで再開する

過去に作った refine-loop agent1 を使います (google-adk==1.9.0)

Web UIからexportして、adk run --resumeに渡すと

% adk run refine-loop --resume ~/Downloads/session-96776dc3-fb1a-4c77-aa36-fc6978fd2f71.json
[user]: こんにちは
[human_as_agent]: いえーい!ビビッといっくよーー!!
[critique_agent]: This sentence is not formal at all. It uses slang ("いえーい!") and informal speech patterns ("ビビッといっくよーー!!").

<省略>

[human_as_agent]: 開始いたします。
[critique_agent]: No major issues found.

[user]: 

再開できました!
Web UIのSessionがCLIで再現されて、user入力が待ち受けられました。

ADKのSession

ここに来て Session の存在をようやく認識しました。

google.github.io

Sessionは個々の会話をトラックできるオブジェクト。
GeminiやClaude、GPTでの一連のチャットに対応するのがSessionと捉えています。

ADKの勉強会の資料より

Runner -> SessionService と Session が管理されているんですね。

では、API serverでは? ー レスポンスはSessionにあらず

興味を持ったので実験しました。
参考:https://google.github.io/adk-docs/get-started/testing/

サーバはrefine-loop/ディレクトリがあるところで.を指定して起動2

% uvx --from git+https://github.com/google/adk-python adk api_server .   

クライアントはsessionを作ってから、メッセージを送ります3

% curl -XPOST http://localhost:8000/apps/refine-loop/users/nikkie/sessions/session1 
{"id":"session1","appName":"refine-loop","userId":"nikkie","state":{},"events":[],"lastUpdateTime":1754398542.980897}

% curl --json '{"appName": "refine-loop", "userId": "nikkie", "sessionId": "session1", "newMessage": {"role": "user", "parts": [{"text": "こんにちは"}]}}' http://localhost:8000/run

POST /runの返り値はこんな形でした。
Sessionとは別です

ですが、Sessionを取得する口のレスポンスはadk run --resumeで読み込めました!

% curl http://localhost:8000/apps/refine-loop/users/nikkie/sessions/session1 > api_session.json

% adk run refine-loop --resume api_session.json

ドキュメントに当たりつつ、機を見てソースコードの海にガッツリ飛び込みたいですね

終わりに

adk run --resumeを知っての興味に基づき手を動かしました

adk webから保存したセッションやadk api_serverの返り値も読み込めるか

  • adk run --save_sessionと、adk webのExportはどちらもSessionをJSONファイルに保存する
    • adk run --resumeできる
    • adk api_serverGET /apps/{app_name}/users/{user_id}/sessions/{session_id}もSessionを保存
  • adk api_serverPOST /runのレスポンスはSessionとは異なる形(宿題事項)

  1. 1.9.0でバグが入ったようで、PyPIには未リリースのリポジトリ最新のコードを使っています。ref: https://github.com/google/adk-python/issues/2233#issuecomment-3145069462
  2. /docsも参考にしました