【調査レポ3】プログラムを終了しても忘れない!Google Antigravity SDKで会話履歴を記憶するエージェントを試してみた

Antigravity SDK入門 AI

前回の記事(調査レポ2)では、GoogleのAIエージェント開発ツールである「Google Antigravity SDK」を使い、AIにWeb検索やファイル保存などの「道具」を使わせる方法(Tool Use)を試しました。

今回は、実用的なAIエージェントを作る上で欠かせない機能である「会話履歴の記憶(永続化/Persistence)」について調べて、実際に簡単なプログラムを動かしてみました!

通常のプログラムでは、一度処理を終了するとAIとの会話内容はすべて消えてしまいます。しかし、Google Antigravity SDKでは「会話ID」と「保存フォルダ」を指定するだけで、次回起動時に過去の会話をすべて思い出して再開することができます。その実装手順と、調べて分かった費用面の注意点をレポートします。

「会話を記憶する(永続化)」仕組み

LINEボットやDiscordボット、業務自動化ツールなどでAIチャットを運用する場合、「ユーザーが昨日話した内容をAIが覚えている」状態を作ることが重要になります。

これまでは、開発者がデータベース(SQL等)を構築し、過去の会話履歴を自分で保存・管理して、AIを呼び出すたびに過去の文脈をプログラム側で組み立て直すという複雑な実装が必要でした。

Google Antigravity SDKでは、これらをSDKが内部で自動で行ってくれます。設定したディレクトリ(フォルダ)に会話データが自動で書き出され、各会話に発行される独自の「会話ID(conversation_id)」をキーにして、前回の状態をそのまま復元できます。

実際に書いて動かしてみたPythonコード

「会話の保存」と「会話の復元」を順番に行う最小限のプログラムコードがこちらです。

import os
import sys
import asyncio
from google.antigravity import Agent, LocalAgentConfig

# .env ファイルから環境変数を自動で読み込む
try:
    from dotenv import load_dotenv
    load_dotenv()
except ImportError:
    pass

async def main():
    # 1. APIキーが正しく設定されているかチェック
    if not os.environ.get("GEMINI_API_KEY"):
        print("エラー: GEMINI_API_KEY が環境変数に設定されていません。")
        sys.exit(1)

    # 会話履歴を保存するフォルダ名(同じフォルダ内に作成されます)
    memory_dir = "./agent_memory"

    # ==========================================
    # 💡 セッション1:最初の会話と「会話ID」の保存
    # ==========================================
    print("--- セッション1:会話の開始 ---")
    config1 = LocalAgentConfig(save_dir=memory_dir)

    async with Agent(config1) as agent:
        # AIにお気に入りの色を教える
        response = await agent.chat("私の好きな色は青です。覚えておいてくださいね。")
        print(f"AIの応答: {await response.text()}\n")
        
        # この会話の「ユニークID」を取得して保存しておく
        saved_id = agent.conversation_id
        print(f"発行された会話ID: {saved_id}\n")

    # ==========================================
    # 💡 セッション2:プログラムを再起動して「会話の復元」
    # ==========================================
    print("--- セッション2:会話の復元と再開 ---")
    
    # さきほど保存した「会話ID」と「保存フォルダ」を指定して構成
    config2 = LocalAgentConfig(
        conversation_id=saved_id,
        save_dir=memory_dir
    )

    async with Agent(config2) as agent:
        # 過去の記憶が引き継がれているか確認する質問をする
        response = await agent.chat("私の好きな色は何でしたっけ?")
        print(f"AIの応答: {await response.text()}\n")

if __name__ == "__main__":
    # 非同期処理の起動トリガー
    asyncio.run(main())

プログラムコードの詳細解説

今回作成したプログラムコードの各ブロックの役割を、上から順番に詳しく解説します。

  • 必要なモジュールのインポート(1〜4行目)
    OSの機能を使う os やシステム制御用の sys、非同期処理を扱うための asyncio といった標準モジュールに加え、Antigravity SDKのコア機能である Agent と設定用の LocalAgentConfig をインポートしています。
  • dotenvによる環境変数のロードと安全対策(6〜11行目)
    セキュリティ対策としてAPIキーを外部ファイルから読み込むための load_dotenv() を呼び出しています。ここで try-except 構文を使って ImportError を無視するように囲んでいるのは、実行環境に python-dotenv ライブラリがインストールされていなくてもプログラム全体が途中でクラッシュするのを防ぐための安全対策です。この対策により、サーバーのシステム環境変数に直接APIキーを設定している環境でもそのまま動作させることができます。
  • main関数の定義とAPIキーチェック(13〜17行目)
    非同期処理を実行するための main() 関数を定義し、最初に GEMINI_API_KEY が正しく読み込まれているかを確認しています。もしキーが見つからない場合は、分かりやすいエラーメッセージを表示して即座に処理を安全に終了(sys.exit(1))させます。
  • セッション1:最初の会話と会話IDの取得(19〜32行目)
    会話の保存先フォルダとして ./agent_memory を指定し、最初の LocalAgentConfig を作成します。async with Agent(config1) as agent: でエージェントを起動し、チャットで「好きな色は青」と教えた後、この会話固有の識別キーである agent.conversation_idsaved_id 変数に保存します。この一連のやり取りの履歴は、指定したフォルダ内に自動的に保存されます。
  • セッション2:会話IDによる前回の記憶の復元(34〜48行目)
    一旦セッション1を終了(エージェントを終了)させた後、今度は conversation_id=saved_idsave_dir=memory_dir を指定して新しい LocalAgentConfig を作成します。再度エージェントを起動して「私の好きな色は何でしたっけ?」と質問すると、SDKが指定したフォルダから過去の履歴データを自動で読み込むため、AIは前回のやり取りを覚えていて正しく「青」と答えることができます。
  • 非同期処理の起動トリガー(50〜52行目)
    プログラムが直接実行された場合にのみ main() 関数が動くように if __name__ == "__main__": の判定を行い、非同期処理のエントリーポイントである asyncio.run(main()) を呼び出してプログラム全体の実行を開始しています。

実際にプログラムを動かす手順

以下のステップで動作を確認できます。

  1. APIキーの設定
    同じフォルダに .env ファイルを作成し、GEMINI_API_KEY="あなたのAPIキー" を事前に設定します。
  2. ファイルの保存
    上記のPythonコードを persistence_demo.py という名前で保存します。
  3. プログラムの実行
    ターミナルで以下のコマンドを実行します。
    python3 persistence_demo.py
  4. 動作とフォルダの確認
    実行が成功すると、「セッション2」でAIが正しく「あなたの好きな色は青です」と答えることが確認できます。また、同じディレクトリ内に agent_memory というフォルダが作成され、中に履歴ファイルが保存されているのを確認できます。

調べて分かった注意点と落とし穴

非常に手軽に永続化を実装できますが、実際に使う上で気をつけるべき「2つの落とし穴」があります。

① 会話が長くなることによるAPI利用料金の肥大化

永続化機能は、過去の会話データを自動でロードしてGemini APIに送信することで記憶を維持しています。そのため、会話の往復回数が増えて履歴が長くなればなるほど、1回の発言に対して「送信する過去のテキスト量(入力トークン数)」がどんどん増えていきます。これが蓄積されると、1回の質問にかかるAPI利用料金が肥大化したり、無料プランでは一瞬でクォータ(利用制限)に達してしまったりする落とし穴があります。実運用する際は、一定回数で履歴を切り捨てる制御などを考慮する必要があります。

② フォルダのアクセス権限(パーミッション)によるエラー

save_dir で指定した場所に対してプログラムを実行するユーザーが「書き込み権限」を持っていない場合、履歴の保存時にエラーが発生してプログラムがクラッシュする原因になります。特に、本番サーバーにデプロイする際や、書き込み制限のあるディレクトリを指定する場合には、権限設定を適切に管理する必要があります。

まとめ

今回は、Google Antigravity SDKの「会話履歴の永続化」機能について調べ、基本的な動かし方をレポートしました。

データベースを介さずに、たった数行のオプション設定だけで過去の記憶を引き継ぐことができるため、チャットボットや長期的な自動化スクリプトの開発効率を大幅に高めてくれる強力な機能だと感じました。履歴の長さによるコスト管理に気を配りつつ、ぜひ便利なエージェント構築に役立ててください!

コメント

タイトルとURLをコピーしました