はじめに
七尾百合子さん、お誕生日 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 の存在をようやく認識しました。
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_serverのGET /apps/{app_name}/users/{user_id}/sessions/{session_id}もSessionを保存
adk api_serverのPOST /runのレスポンスはSessionとは異なる形(宿題事項)