GEMINI LABEN
API — Interactions APIが一般提供となり、GeminiモデルとエージェントのためのAI Studio・APIの既定APIになりましたAGENT — Managed Agentsがパブリックプレビューとなり、Googleホストの隔離Linuxサンドボックスで自律エージェントを動かせますSECURITY — 6月19日以降、制限なしのAPIキーからのリクエストが拒否され、キーへの制限付与が前提になりましたCLI — Gemini CLIが6月18日にEOLとなり、Agentic 2.0(Antigravity CLI)へ置き換わりましたMODEL — Gemini 3.5 FlashがGAとなり、エージェント処理やコーディングで持続的な高性能を発揮しますUPDATE — 旧画像プレビューモデル(gemini-3.1-flash-image-preview等)が6月25日に廃止されましたAPI — Interactions APIが一般提供となり、GeminiモデルとエージェントのためのAI Studio・APIの既定APIになりましたAGENT — Managed Agentsがパブリックプレビューとなり、Googleホストの隔離Linuxサンドボックスで自律エージェントを動かせますSECURITY — 6月19日以降、制限なしのAPIキーからのリクエストが拒否され、キーへの制限付与が前提になりましたCLI — Gemini CLIが6月18日にEOLとなり、Agentic 2.0(Antigravity CLI)へ置き換わりましたMODEL — Gemini 3.5 FlashがGAとなり、エージェント処理やコーディングで持続的な高性能を発揮しますUPDATE — 旧画像プレビューモデル(gemini-3.1-flash-image-preview等)が6月25日に廃止されました
記事一覧/開発ツール
開発ツール/2026-07-02上級

url_context が取得に失敗しても答えは返ってくる — 取得ステータスを検証してから通すゲート設計

url_context ツールは対象URLの取得に失敗しても、それらしい回答を返します。url_context_metadata の取得ステータスを読み、根拠URLが実際に読めた時だけ答えを確定する検証ゲートと、失敗時のフォールバックを実装します。

Gemini API160url_contextgrounding7自動化24信頼性設計3

プレミアム記事

自動処理に url_context を組み込んで一番ひやりとしたのは、対象ページの取得に失敗しているのに、応答そのものは普通に返ってきていた場面でした。個人開発で Dolice Labs の複数サイトの下書きを定期処理で回している私自身、公式の変更履歴ページを url_context で参照させ、要点を抜き出す小さなジョブを動かしていました。ある朝、生成された下書きの一部が、実際のページには書かれていない「それらしい」内容になっていたのです。

原因を追うと、対象URLの取得が失敗していました。ところが応答は空にならず、モデルが手元の知識で補った文章を、あたかもページを読んだ結果のように返していました。取得の成否を確認していなかった私の実装では、この差が完全に見えませんでした。

url_context の取得は「best-effort」だと考える

url_context は、指定したURLをモデル側が取得してグラウンディングの材料にするツールです。ここで見落としがちなのは、取得が失敗しても呼び出し自体はエラーにならないという点です。ネットワーク側の一時失敗、robots による拒否、対象が動的レンダリングでほぼ空、サイズ上限超過など、取得が満たされない理由はいくつもあります。そのどれであっても、多くの場合レスポンスは 200 で返り、本文もそれらしく埋まります。

自動処理で怖いのは、この「静かな失敗」です。人が画面越しに使っていれば「あれ、内容が古い」と気づけます。けれど定期実行のジョブは、返ってきたテキストをそのまま次の工程へ流します。取得の成否という一次情報を確認しない限り、空振りの回答がコンテンツへ混入し続けます。

まず url_context_metadata を読む

救いは、取得の結果がメタデータとして返ってくることです。各候補には url_context_metadata が付き、その中の url_metadata に、実際に取得しにいったURLと取得ステータスが並びます。ここを読めば「どのURLが本当に読めたのか」を機械的に判定できます。

まずは、応答から取得ステータスを取り出すところだけを切り出します。

from google import genai
from google.genai import types
 
client = genai.Client()
 
def ask_with_url_context(prompt: str, urls: list[str]):
    # 対象URLを本文に含めると、url_context がその取得を試みます
    url_list = "\n".join(urls)
    full_prompt = f"{prompt}\n\n参照するURL:\n{url_list}"
 
    resp = client.models.generate_content(
        model="gemini-flash-latest",
        contents=full_prompt,
        config=types.GenerateContentConfig(
            tools=[types.Tool(url_context=types.UrlContext())],
        ),
    )
    return resp
 
def extract_retrievals(resp) -> list[dict]:
    """各URLの取得結果を [{url, status}] の形で返す。"""
    out = []
    for cand in resp.candidates or []:
        meta = getattr(cand, "url_context_metadata", None)
        if not meta:
            continue
        for um in getattr(meta, "url_metadata", []) or []:
            out.append({
                "url": getattr(um, "retrieved_url", None),
                "status": str(getattr(um, "url_retrieval_status", "")),
            })
    return out

url_retrieval_status は列挙値で返ります。成功は末尾が SUCCESS、取得に失敗した場合は ERROR、安全性の理由で弾かれた場合は UNSAFE を含む値になります。文字列化して末尾で判定すると、SDK の細かな型差に振り回されずに済みます。

ステータス(末尾)意味その応答をどう扱うか
SUCCESSURLを取得できた根拠として認める
ERROR取得に失敗した根拠として認めない・フォールバックへ
UNSAFE安全性の理由で除外根拠として認めない・人手キューへ
(メタデータ無し)そもそも取得を試みていないグラウンディング不成立として不合格

一番厄介なのは最後の行、メタデータが空のケースです。URLを本文に入れたつもりでも、モデルが取得を試みず、内部知識だけで答えることがあります。「取得ステータスが失敗」ではなく「そもそも取得の記録が無い」状態は、成功と誤認しやすいので明示的に落とします。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
url_context_metadata の url_retrieval_status を読み、取得に失敗したURLを根拠に含む応答を不合格にする検証ゲート
取得失敗時は明示 fetch へ切り替え、根拠URLが実際に読めた時だけ答えを確定する二段構えのフォールバック
自動運用で「自信ありげな空振り回答」がコンテンツへ静かに混入するのを止める、冪等な適用の型
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-06-20
Geminiの工程別モデル割り当て — 下書きはFlash、仕上げは上位ティアで回す自動運用の組み方
Gemini 3.5 Flash の一般提供と 3.1 Flash-Lite の展開を機に、自動運用パイプラインの工程ごとにモデルを割り当て直した記録です。下書き・分類・仕上げの3段に分けるルーターの実装と、コストの見え方の変化、運用で決めた歯止めのルールを紹介します。
開発ツール2026-04-04
Gemini × Figma Make でデザインワークフローをAI化する方法【2026年版】
Gemini APIでデザイン要件を自然言語で整理し、Figma Makeでプロトタイプを生成、Gemini CLIでコードレビューする完全ワークフロー。デザイン→実装を自動化する実践手法を解説します。
開発ツール2026-06-18
Gemini CLI 停止に備え、夜間バッチに google-genai SDK フォールバックを組み込む
6月18日で Gemini CLI のホスト応答が止まります。CLI に依存した夜間バッチを落とさないよう、CLI の生死を確かめてから google-genai SDK へ自動で逃がすフォールバック・ハーネスを、自分の運用を題材に組みました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →