この投稿は、Devpost での Gemini Live Agent Challenge ハッカソンへの提出の一部として書かれました。 #GeminiLiveAgentChallenge
これを生み出した問題
私の祖母はスマートフォンを持っています。彼女にはブロードバンド接続があります。彼女はオンラインで列車の切符を予約することができません。
これは技術アクセスの問題ではありません。彼女にはハードウェアと接続があります。彼女ができないのは、ウェブサイトのナビゲートです。彼女はドロップダウンメニューを理解していません。フォームラベルの小さな文字を読むことはできません。「Enter OTP」が何を意味するのかも分かりません。何か問題が生じると、彼女は自分で解釈できないエラーメッセージを見て、電話をより若い人に渡します。
彼女は決して一人ではありません。政府のデータによれば、インドの高齢者の85%は自力でデジタルサービスを利用できません。世界全体で9億人を超える人々が同じ状況にあります。インドは年金をオンライン化し、Aadhaar(アーダー)をデジタル化し、列車予約をウェブのみとし、請求支払いをポータルへ移行しました。インターフェースは作られました。これらのサービスを最も必要とする人々が取り残されました。
私は、インターフェースを方程式から完全に排除する何かを作りたいと思いました。より簡素なインターフェースではなく、チュートリアルでもありません。ユーザーが必要とするものを話すと、コンピューターが残りを処理するシステムです。
そのプロジェクトはSAHAYとなりました。
SAHAY が行うこと
SAHAY は、ユーザーの言語で話を聞き取ります。ヒンディー語、マラヤラム語、タミル語、テルグ語、英語、または 24 言語のサポートのいずれか。実際の Chromium ブラウザを開き、正しいウェブサイトを見つけ、ページを移動し、フォームを埋め、ボタンをクリックし、結果を読み上げます。
ユーザーは「Amazon par earbuds dikhao 1000 rupaye se kam」と言い、SAHAY は 価格フィルター付きの検索で Amazon を開き、結果を読み上げ、価格付きの上位候補を報告します。ヒンディー語で。なぜなら、それがユーザーが話した言語だからです。
ユーザーは「自分の Aadhaar カードをダウンロード」と言い、SAHAY は UIDAI ポータルへ移動し、Aadhaar 番号を尋ね、それを確認のため1桁ずつ読み上げ、入力し、OTP フローを進めます。
ログイン、支払い、またはフォーム送信の前に、SAHAY は停止して許可を求めます。ユーザーは音声で、またはボタンをクリックして確認します。パスワードや CAPTCHA の場合、ユーザーはブラウザ画面をクリックして直接操作できます。
三つのエージェントアーキテクチャ
SAHAY は、それぞれのタスクを完了するために連携する3つの独立した Gemini エージェントを実行します。
エージェント1: プランナー
プランナーは、GenAI SDK を介して Google 検索をグラウンドする Gemini 2.5 Flash 上で動作します。ユーザーが望むものを説明すると、プランナーはリアルタイムでインターネットを検索して正しいウェブサイトを見つけます。ハードコーディングされた URL を使いません。既知のポータルの静的リストにも依存しません。検索して結果を読み取り、正しい目的地を特定します。
これは、ウェブサイトが変わるため重要です。UIDAI のダウンロードページは過去1年で URL を二度変更しました。政府ポータルは予告なしにナビゲーションを再構成します。先月のハードコーディングされた URL は、今日 404 になる可能性があります。プランナーは計画を作成する前に、現在の状態を常に調査します。
ターゲットを見つけた後、プランナーは、各ページで何を見るべきかのステップバイステップの指示、各ページで確認すべき点の視覚的説明、機微データを含むステップに関するフラグを備えた、構造化された実行計画を作成します。
プランナーは、Google 検索のグラウンドを同じエージェント内の他のツールと組み合わせることができないため、別個の ADK エージェントです。この制約がアーキテクチャを形作りました。結局、研究と実行を明確に分離する正しい設計であることが分かりました。
from google import genai
from google.genai import types
client = genai.Client(vertexai=True)
response = await client.aio.models.generate_content(
model="gemini-2.5-flash",
contents=task_prompt,
config=types.GenerateContentConfig(
tools=[types.Tool(google_search=types.GoogleSearch())],
temperature=0.2,
),
)
エージェント2: ブラウザ
ブラウザエージェントは、Gemini の Computer Use モデル(gemini-2.5-computer-use-preview-10-2025)上で動作します。プランナーから計画を受け取り、それを段階的に実行します。
実行ループは次のように機能します:
- 現在のブラウザ状態のスクリーンショットを Playwright で取得します。
- 現在の計画の手順と一緒にスクリーンショットを Computer Use モデルへ送信します。
- モデルはスクリーンショットを視覚的に分析し、クリックする場所やタイプする文字の座標を返します。
- Playwright が実際のブラウザに対して操作を実行します。
- 新しいスクリーンショットを取得します。
- タスクが完了するまで繰り返します。
ブラウザエージェントは HTML を読みません。ページレイアウトを理解するために CSS セレクタを使用しません。ウェブサイトの API を呼び出すこともありません。人が画面を見るのと同じようにスクリーンショットを見て、次に何をするべきかを決定します。つまり、サイト固有の設定なしで、どんなウェブサイトでも動作します。
Computer Use モデルは正規化された座標(0 から 999)を出力します。SAHAY はこれを 1440x900 のビューポート上の実際のピクセル位置に変換します。
actual_x = int(normalized_x / 1000 * 1440)
actual_y = int(normalized_y / 1000 * 900)
await page.mouse.click(actual_x, actual_y)
ブラウザエージェントは ADK の ComputerUseToolset に包まれており、スクリーンショットとアクションのループを管理し、座標変換を処理します。
エージェント3: 音声
ボイスエージェントは Gemini 2.5 Flash Native Audio を Live API を介して実行します。双方向のオーディオストリーミングを通じて、ユーザーとの通信をすべて処理します。
ユーザーのマイク音声は、ブラウザの AudioWorklet を用いて取得され、PCM 16ビット、16kHz のモノラルに変換され、WebSocket 経由で FastAPI バックエンドへストリーミングされます。バックエンドはこの音声を Live API セッションへ転送します。Gemini が音声で応答すると、それが同じ WebSocket を通じてブラウザへストリーミング再生されます。
ボイスエージェントはユーザーの言語を自動的に検出し、同じ言語で応答します。ユーザーが英語で開始し、その途中でヒンディー語に切り替えた場合、応答はヒンディー語で返ってきます。言語選択メニューはありません。設定も不要です。
機微な入力( Aadhaar 番号や電話番号など)については、ボイスエージェントは聞き取った内容を繰り返し、データをブラウザーエージェントへ渡す前に明示的な確認を待ちます。これにより、誤って聞き取った桁の問題が原因で全体のフローが黙って失敗するのを防ぎます。
voice_agent = Agent(
name="sahay_voice_agent",
model="gemini-live-2.5-flash-native-audio",
instruction=VOICE_INSTRUCTION,
tools=[plan_task, browser_action, stop_task, rollback],
)
Google Cloud Services
SAHAY は本番環境で Google Cloud の3つのサービスを使用しています。
Vertex AI はすべての Gemini モデルエンドポイントをホストします。ボイスエージェントは Vertex AI 経由で Live API に接続します。プランナーエージェントは Google 検索の grounding を Vertex AI 経由で Gemini Flash を呼び出します。コンピュータ利用モデルは API キーを使用して Gemini API を直接呼び出します。
Cloud Firestore はタスクのログ、セッション状態、およびワークフローの録画を保存します。各タスクには、タスクの説明、取られた各ステップ、重要な瞬間のスクリーンショット、最終結果、タイムスタンプを含むドキュメントが作成されます。これは監査証跡として機能し、以前に記録されたパスに従うことで繰り返しタスクをより高速に実行できるワークフロー再生機能も提供します。
Cloud Run はコンテナ化されたアプリケーションをホストします。Dockerfile はコンテナ内に Playwright と Chromium をインストールするため、ブラウザ自動化がクラウド環境で動作します。デプロイ用スクリプトと Terraform の設定が全デプロイメントプロセスを自動化します。
What Made This Hard
Google CAPTCHA. SAHAY の最初のバージョンは直接 Google を検索するためにヘッドレス Chromium を使用していました。数回の検索の後、Google は CAPTCHA を表示し、エージェントは検証ページで行き詰まり、ランダムにクリックして手順を無駄にしました。検索を Planner Agent へ Google Search grounding API 経由で移行することで、この問題を完全に解消しました。ブラウザはもう Google Search に触れません。
Bot detection. IRCTC、MakeMyTrip、そしていくつかの銀行ポータルは Playwright を検知してページのロードを拒否します。ステルスフラグと偽装したユーザーエージェントは一部サイトには効果がありましたが、全サイトには効果がありませんでした。解決策はスマートなブラウザ選択システムの構築でした。SAHAY はターゲット URL とタスクの説明を分析し、ヘッドレス Chromium(高速で、ほとんどのサイトで動作)を使用するか、ヘッド付きのブラウザウィンドウ(遅いが保護されたサイトでのボット検知を回避)を使用するかを自動的に決定します。この判断はタスクごとに自動的に行われます。
The Computer Use model finishing early. The ADK runner's run_async() generator exits when the model returns a text response without a function call. The model would sometimes describe what it sees on screen instead of clicking on it, which would end the task prematurely after two or three steps. The fix was a continuation loop that detects when the model exits without reporting completion, re-prompts it with "You have not finished the task. Take an action.", and resumes execution. This loop runs up to three times before giving up.
Voice number accuracy. The Live API voice model occasionally mishears digits. "9895" becomes "9985". For an Aadhaar number, a single wrong digit means the download fails and the user does not understand why. The repeat-back-and-confirm pattern solved this. It adds a few seconds to each interaction but prevents silent failures that would destroy user trust.
The Stack
| Component | Technology |
|---|---|
| Agent framework | Google ADK |
| Voice model | Gemini 2.5 Flash Native Audio (Live API) |
| Browser model | Gemini 2.5 Computer Use |
| Planner model | Gemini 2.5 Flash + Google Search |
| Browser automation | Playwright (Chromium) |
| Backend | FastAPI + WebSocket |
| Frontend | Vanilla JavaScript |
| Database | Google Cloud Firestore |
| Hosting | Google Cloud Run |
| IaC | Terraform |
What I Would Do Differently
視覚情報のみを用いるアプローチは普遍性という点で適切なアーキテクチャ設計ですが、速度という点では不適切です。すべての操作にはフルスクリーンショットの取得、Gemini API への往復、座標の解析が必要です。ナビゲーション決定には視覚的理解を、正確なフォーム入力には DOM セレクタを用いるハイブリッドアプローチは、はるかに高速になるでしょう。
3エージェントアーキテクチャは境界で遅延を導入します。プランナーは調査と計画の作成に5〜15秒を要します。この間、ブラウザは待機状態となり、ユーザーは沈黙のまま待ちます。プランナーが作業中の間にターゲット URL を事前取得しておくと、知覚される遅延を半分に削減できます。
継続ループは、Computer Use モデルがタスク完了を示す方法自体の根本的な問題に対する回避策です。より良いアプローチは、モデルのプロンプトを微調整して、常に関数呼び出しまたは明示的な完了メッセージで終了するようにし、単なるテキスト説明で終わらないようにすることです。
Source Code
The full source code is available at:
github.com/Sherin-SEF-AI/Sahay-Voice-First-Digital-Navigator
Sherin Joseph Roy が DeepMost AI の製品部門責任者として作成しました。
このプロジェクトは、Gemini Live Agent Challenge ハッカソン、UI Navigator トラックのために作成されました。







