GCP News - 2026-10-13

2026-10-13
最終更新: 2026-10-14 14:49:50 JST

AI による概要

7 記事

この日は 7 件で、BigQuery の時系列予測モデルの刷新、Looker のデータアプリ、そしてエージェント開発キットの多言語化が中心でした。BigQuery では TimesFM 3.0 がプレビューで登場しました。Google Research が開発した 3 億 3,000 万パラメータの基盤モデルで、BigQuery SQL の中で多変量の時系列予測をネイティブに扱えるようにするものです。これまで AI.FORECAST を支えてきた TimesFM 2.0 / 2.5 は単変量の予測に限られ、1 本の時系列の履歴だけから将来値を予測していましたが、現実の予測問題は天候・プロモーション・祝日といった外部要因と関連する対象が相互に影響する多変量であることがほとんどです。TimesFM 3.0 は GIFT-Eval・FEV-Bench・TIME という 3 つの主要な公開リーダーボードすべてで 1 位となり、共変量と多変量の予測タスクで既存の基盤モデルを上回るゼロショット精度を達成しています。AI.FORECAST による単変量予測と AI.DETECT_ANOMALIES による異常検知についても、モデルを指定するだけで既存のワークフローがそのまま精度向上の恩恵を受けられるドロップイン置き換えとして使えます。あわせてリリースノートでは、自然言語の指示に基づいて非構造データを意味的に集約する BigQuery の AI.AGG 関数が一般提供となったこと、そして Cloud Billing の spend cap 予算が一部のサービスで一般提供となったことが告知されました。spend cap はコスト管理の仕組みで、対象サービスの見積もり支出が設定した予算額を超えると、そのプロジェクト内での新しいリクエストが一時停止され、上限が解除されるまでそれ以上の利用コストが発生しなくなります。手動で解除するか、翌月の開始時に自動で解除されます。総額の見積もりコストでアラートと上限を発動するため実際のコストが請求レポートに現れるより早く機能しますが、即時ではないため超過分は通常どおり請求されます。BI では、Looker Data Apps がプレビューで発表されました。多くのダッシュボードが定型のキャンバスと固定のチャートライブラリしか提供せず、分析が別システムへ移る CSV エクスポートに終わってしまう、あるいは思い描いたエグゼクティブ向け資料や顧客向けポータルを既存のグリッドタイルでは組めないという課題に対するもので、従来はカスタムアプリケーションを作るしかありませんでした。AI によって試作は一晩でできるようになりましたが、統制されたデータへのアクセス・行レベルセキュリティ・インフラの持ち主・セキュリティレビューを通す道筋がないままでは、LLM が書いたツールは本番に出られない試作にとどまります。Looker Data Apps は、エージェントが生成するアプリケーションの速さと、既存の Looker のガバナンスフレームワークによる統制・セキュリティ・信頼性を組み合わせ、平易な言葉で必要なものを説明すると、エージェントが Looker 内にネイティブにホストされる本番品質のアプリケーションとして構築します。エージェント開発では、Agent Development Kit (ADK) が Python・Go・TypeScript・Java・Kotlin の 5 言語に対応しました。エージェントが Cloud Run 上の高並行な Go マイクロサービスとして動いたり、ブラウザータブ内で Chrome のオンデバイスモデルを呼び出したりする一方、多くのエージェントフレームワークは Python 前提のスタックを想定しており、エージェントのためだけに Python サービスを立てるか、自分の言語でオーケストレーションを自作するかという選択を強いていました。ADK の各言語版はそれぞれのランタイムと型システムに合わせて作られながら、統一されたアーキテクチャを共有しオープンプロトコルで相互運用します。5 言語すべてに Model Context Protocol クライアントが含まれるため、MCP サーバーとして公開したカスタムツールはどの言語からも呼び出せ、マルチエージェント構成では Agent2Agent (A2A) プロトコルにより異なる言語やフレームワークで書かれたエージェントが HTTP 越しに相互運用できます。データサイエンスでは、Data Agent Kit が紹介されました。コーディングエージェント向けのプラグイン、または Visual Studio Code ベースの IDE 向け拡張機能として Google Cloud のデータを扱えるようにするもので、データサービスにつなぐ MCP ツールと、データスタックの扱い方やベストプラクティスを Markdown で与えるスキルをエージェントに提供し、IDE 内からデータベースのクエリから Airflow パイプラインのデプロイまでを行えます。記事では、Cloud Storage の生の取引ログを Spark で BigQuery へ取り込み、過去の不正データでモデルを学習させ、新しいレコードをスコアリングして日次実行をスケジュールするまでを Antigravity IDE 上のエージェントで組み立てる流れが示されました。信頼性では、オライリーから『Site Reliability Engineering: How Google Runs Production Systems』が出版されてから 10 年を迎えるのにあわせ、全面的に書き直した第 2 版が発表されました。初版の頃は多くの組織が初期のクラウド移行やモノリスからの脱却を始めた段階でしたが、現在は高速かつグローバルな規模でソフトウェアを届けるなかで、クラウド基盤の採用ではなく膨大な複雑さのもとで高い信頼性を保つことが課題になっており、AI・マイクロサービス・マルチクラウド・サーバーレス・プラットフォームエンジニアリングによる変化を踏まえた指針が示されます。セキュリティでは、Mandiant の Agentic Vulnerability Discovery Harness (AVDH) が紹介されました。AI の敵対的な不正使用によってデータ窃盗や恐喝のリスクが増し、ソースコードが流出すると攻撃側は AI ツールでマシンスピードで攻めてくるという前提のもと、分析プロセスの構造化・懐疑的な検証ステップ・ドメイン固有の人間の専門知識をパイプラインに直接組み込むことで実効性を高めたフレームワークです。運用 10 か月の成果として、企業のリポジトリが窃取されたインシデント対応調査でわずか 2 日間に 100 件を超える真陽性の深刻な脆弱性を発見したこと、数千万行規模の環境を分析して数千のパイプラインを実行し数万の検出結果を生成していること、広く使われている Web 拡張機能やオープンソースプロジェクトで CVE-2026-13242 や CVE-2026-55803 を含む 12 件の CVE が既に割り当てられさらに 12 件が開示手続き中であること、標的型攻撃シミュレーションでクライアントの Web アプリケーションのソースコードを処理したところ初期アクセスにつながる RCE 脆弱性がすぐに見つかったことが挙げられています。CodeMender の継続的スキャンと併用して 2 層の防御戦略を組むこともできるとされ、これまで社内で運用してきたポイントインタイムのアーキテクチャの詳細が初めて公開されました。

主要トピック
  • BigQuery: TimesFM 3.0 がプレビュー、3.3 億パラメータで多変量の時系列予測を SQL 内でネイティブに、3 つの公開リーダーボードで 1 位

  • BigQuery: 自然言語の指示で非構造データを意味的に集約する AI.AGG 関数が GA

  • コスト管理: Cloud Billing の spend cap 予算が一部サービスで GA、見積もり支出が予算を超えると新規リクエストを一時停止

  • BI: Looker Data Apps がプレビュー、エージェント生成の速さと Looker のガバナンス・行レベルセキュリティを組み合わせた本番品質アプリ

  • エージェント開発: ADK が Python・Go・TypeScript・Java・Kotlin の 5 言語に対応、全言語に MCP クライアントと A2A による相互運用

  • データサイエンス: Data Agent Kit で MCP ツールと Markdown のスキルをエージェントに提供、IDE 内からクエリから Airflow デプロイまで

  • 信頼性: Google SRE 本の第 2 版を発表、AI・マイクロサービス・マルチクラウド・サーバーレス時代の指針に全面改訂

  • セキュリティ: Mandiant の AVDH を公開、インシデント対応で 2 日間に 100 件超の真陽性を発見、12 件の CVE が既に採番 (CVE-2026-13242、CVE-2026-55803 など)

AI (Claude Opus 5) が生成 · 2026-10-14 21:37:28 JST

Google Cloud Release Notes

October 13, 2026

詳細を表示

BigQuery

Feature

The AI.AGG function is generally available (GA). You can use this function to semantically aggregate unstructured input data based on natural language instructions.

Cloud Billing

Feature

Spend cap budgets are now generally available for a limited set of services

For eligible services, you can configure a spend cap budget to automatically pause usage when your estimated spend exceeds the budget amount you set. You can manage spend cap budgets in the Budgets page in the Google Cloud console and using the Cloud Billing Budget API.

Spend caps are a cost control mechanism. A spend cap is enforced when usage costs exceed your budget target amount. When enforced, any new request to the eligible services, within the specified project, are paused and no further usage costs are accrued until the spend cap is lifted. You can manually lift an enforced spend cap, or wait until the start of the next month when the spend cap is automatically lifted.

Spend caps use gross, estimated costs to trigger the alerts and caps, enforcing a cap much faster than the actual costs are processed and appear on billing reports. Even though faster than reports, the enforcement of spend caps isn't instant and any cost overages are billed as normal.

More information about spend cap budgets

For managing spend cap budgets in the Google Cloud console, see:

For managing spend cap budgets using the Cloud Billing Budget API, see:

Cloud SDK

Breaking

589.0.0 (2026-10-13)

Breaking Changes

  • (Google Cloud CLI) Deprecated the skaffold component in Google Cloud CLI. The component will be removed from Google Cloud CLI releases after January 15, 2027. A portion of gcloud components install skaffold attempts now return an error. Please install Skaffold following the instructions at https://skaffold.dev/docs/install/.

Google Cloud CLI

  • Updated Linux and Windows bundled Python to install cryptography 46.0.7 from the official PyPI wheels instead of custom builds.
  • Updated the Alpine-based Docker images (:alpine, :VERSION-alpine) to use a bundled Python and no longer include a system python3.
  • Updated bundled Python to 3.14.8 on Linux and Windows, and in the Alpine-based Docker images. This updates the OpenSSL that Python uses for TLS to 3.5.9.

AlloyDB

  • Added --enable-express flag to gcloud beta alloydb clusters create|update.

Apigee

  • Promoted gcloud apigee apis delete to GA. The command deletes an API proxy and all of its revisions. Every command in gcloud apigee apis now serves GA.
  • Fixed an issue where gcloud apigee apis import --from-template discarded a template's endpoints and targets whenever the template referenced a feature. A template that declared its own topology and used features only for policies compiled to a proxy with no ProxyEndpoint, and the import failed. A template's endpoints and targets now seed the proxy, and features are applied on top of them.

App Engine

  • Fixed an issue where gcloud beta app migrate-to-run dropped the Serverless VPC Access connector for deployed versions.
  • Fixed an issue where gcloud beta app migrate-to-run mapped App Engine Flexible instance_ip_mode to Cloud Run ingress.
  • Fixed an issue where gcloud beta app migrate-to-run did not route all egress through Direct VPC for internal-only App Engine Flexible apps.

App Lifecycle Manager

  • Hid the deprecated gcloud beta saas-runtime command group. Existing commands continue to work and print a deprecation warning. Use gcloud beta app-lifecycle-manager instead.

Beyondcorp

  • Deprecated gcloud beta beyondcorp app command group.

BigLake

  • Added --service-directory-name flag to gcloud biglake delta-sharing catalogs update.

BigQuery

  • Added support for Azure Data Lake Storage URIs (abfs:// and abfss://) in inline external table definitions (--external_table_definition).
  • Added --dataplex_entry_group flag to bq mk --transfer_config and bq update --transfer_config to allow integration with Dataplex Entry Groups.
  • Added support to filter Transfer Configs by Dataplex Entry Group using --filter="metadata_destination.dataplex_configuration:*" for bq ls --transfer_config.

Cloud Alerting

  • Promoted gcloud monitoring alerts command group to GA.

Cloud Composer

  • Updated gcloud composer environments storage dags export, gcloud composer environments storage data export, gcloud composer environments storage plugins export, gcloud beta composer environments storage dags export, gcloud beta composer environments storage data export, and gcloud beta composer environments storage plugins export to skip, with a warning, objects that would be written outside of the local --destination directory.

Cloud DNS

  • Added gcloud beta dns outbound-endpoints command group.
  • Added --outbound-endpoints flag to gcloud beta dns managed-zones and gcloud beta dns policies.

Cloud Firestore

  • Promoted gcloud firestore change-streams commands to GA.

Cloud Storage

  • Added server-side hash validation by default for resumable uploads in gcloud storage cp, gcloud storage mv, and gcloud storage rsync. To disable this behavior, run gcloud config set storage/enable_server_side_hash_validation False.

Compute Engine

  • Optimized gcloud compute instance-groups managed list-instances by passing --limit and --page-size to the backend API and terminating page fetching early when the limit is reached.
  • Added CMEK_ENCRYPTION option to --local-ssd-encryption-mode flag of gcloud beta compute instances create to encrypt Local SSDs with customer-managed encryption keys.
  • Fixed gcloud beta compute disk-types list returning no results when --zones or --regions is specified. Deprecated NAME positional argument and --regexp flag of this command. Use --filter instead.
  • Promoted loadBalancingScheme value EXTERNAL_PASSTHROUGH to GA in import and export schemas for gcloud compute backend-services.
  • Promoted IPAddresses and loadBalancingScheme value EXTERNAL_PASSTHROUGH to GA in import and export schemas for gcloud compute forwarding-rules.
  • Promoted gcloud compute advice capacity to GA.
  • Promoted gcloud compute advice capacity-history to GA.

Database Migration

  • Updated --ssl-flags flag documentation and parsing for gcloud database-migration connection-profiles commands to support custom delimiter syntax (^DELIM^) for values containing commas (e.g. server_certificate_dn).
  • Added --dbm-port flag to gcloud database-migration connection-profiles create sqlserver and gcloud database-migration connection-profiles update commands to specify the Database Mirroring (DBM) port for SQL Server Distributed Availability Group (DAG) migrations.
  • Added --sqlserver-dag-source-ag and --sqlserver-dag-linked-server flags to gcloud database-migration migration-jobs create and gcloud database-migration migration-jobs update commands to configure SQL Server Distributed Availability Group (DAG) migrations.

Device Run

  • Removed gcloud beta device-run sessions submit xctest. The command remains available in the alpha release track.

GKE Hub

  • Added --prioritized flag to gcloud beta container fleet rolloutsequences upgrade and gcloud beta container hub rolloutsequences upgrade.

Kubernetes Engine

  • Added --wiz-sensor-api-key-secret-uri, --wiz-sensor-proxy-secret-uri, and --wiz-sensor-registry-secret-uri flags to gcloud container clusters create, create-auto, and update commands to configure Wiz Sensor.

Looker

  • Fixed gcloud looker instances update --linked-lsp-project-number sending an empty update mask and failing.

Oracle Database

  • Added update command to the following gcloud oracle-database command groups to support adding, updating, removing, and clearing labels using --update-labels, --remove-labels, and --clear-labels flags:
    • gcloud oracle-database cloud-exadata-infrastructures update
    • gcloud oracle-database cloud-vm-clusters update
    • gcloud oracle-database db-systems update
    • gcloud oracle-database exascale-db-storage-vaults update
    • gcloud oracle-database goldengate-connections update
    • gcloud oracle-database goldengate-connection-assignments update
    • gcloud oracle-database goldengate-deployments update
    • gcloud oracle-database odb-networks odb-subnets update

Workbench

  • Fixed --nic-type flag choices in gcloud workbench instances create to use VIRTIO_NET instead of VIRTIGO_NET.

Subscribe to these release notes at https://groups.google.com/forum/#!forum/google-cloud-sdk-announce.

Gemini Enterprise

Feature

Gemini Enterprise: Gemini 4 Argon is available in AlphaEvolve

AlphaEvolve experiments can generate candidate programs with Gemini 4 Argon in the global, us, and eu regions. To use it, specify gemini-4-argon in the models field of generationSettings. Gemini 3.8 Flash remains the default model.

For more information, see Supported models and AlphaEvolve limitations.

Managed Service for Apache Airflow

Feature

Development mode environments and Environment hibernation are now generally available (GA).

You can now create Managed Airflow (Gen 3) environments with Airflow 3 in development mode to test and develop DAGs before publishing them to production. You can hibernate development mode environments when you no longer need them. Hibernation reduces most environment costs to zero.

Google Cloud Blog

Introducing TimesFM 3.0 with multivariate time-series forecasting in BigQuery

詳細を表示

Overview

Since introducing zero-shot time-series forecasting in BigQuery with AI.FORECAST — initially powered by TimesFM 2.0 and later upgraded to TimesFM 2.5 — you have been able to generate forecasts directly in SQL without training or managing custom models. However, up until TimesFM 2.5, these foundation models were limited to univariate forecasting, predicting future values from the history of a single time series alone. In practice, most real-world forecasting problems are multivariate, where related targets and external drivers like weather, promotions, and holidays jointly shape future outcomes.

Today, we are thrilled to announce the preview of TimesFM 3.0 in BigQuery. Developed by Google Research, TimesFM 3.0 is a 330-million parameter state-of-the-art foundation model designed to unlock native multivariate time-series forecasting directly inside BigQuery SQL. TimesFM 3.0 ranks #1 across all three major public time-series leaderboards — GIFT-Eval, FEV-Bench, and TIME — achieving top zero-shot accuracy on both covariate and multivariate forecasting tasks compared to existing foundation models.

Alongside its new multivariate capabilities, TimesFM 3.0 also serves as a drop-in upgrade for univariate forecasting via AI.FORECAST and anomaly detection via AI.DETECT_ANOMALIES. Existing workflows can immediately benefit from higher benchmark accuracy simply by specifying model => 'TimesFM 3.0'.

What’s new: Multivariate foundation modeling

With TimesFM 3.0, BigQuery brings enterprise-grade multivariate modeling into familiar SQL workflows via AI.FORECAST:

Capability

TimesFM 2.0 / 2.5

TimesFM 3.0

Forecasting scope

Univariate only

Univariate and multivariate

Target columns

Single target

Single or multiple targets

Covariate columns with past-only values

Not supported

Supported

Covariate columns with past and future values

Not supported

Supported

Multivariate forecasting with BigQuery SQL

To see how these capabilities work together, let’s forecast daily commuter (subscriber_trips) and leisure (casual_trips) bike rides over a seven-day horizon using the NYC Citi Bike public dataset (bigquery-public-data.new_york.citibike_trips).

BigQuery uses a single-table input format for multivariate forecasting that combines two sets of rows:

  • Historical observation rows: timestamps between start time (2016-01-01) and the forecast cutoff date (2016-06-01), fully populated with target metrics, past covariates, and known future covariates

  • Future horizon rows: timestamps across the seven-day forecast horizon (2016-06-01 to 2016-06-07) populated with known future covariates, while target columns and past-only covariates are set to NULL

code_block
<ListValue: [StructValue([('code', "WITH data AS (\r\n SELECT\r\n DATE(starttime) AS date,\r\n IF(MIN(starttime) < '2016-06-01', COUNTIF(usertype = 'Subscriber'), NULL) AS subscriber_trips,\r\n IF(MIN(starttime) < '2016-06-01', COUNTIF(usertype = 'Customer'), NULL) AS casual_trips,\r\n IF(MIN(starttime) < '2016-06-01', AVG(tripduration / 60.0), NULL) AS avg_duration_min,\r\n IF(EXTRACT(DAYOFWEEK FROM MIN(starttime)) IN (1, 7), 1.0, 0.0) AS is_weekend\r\n FROM `bigquery-public-data.new_york.citibike_trips`\r\n WHERE starttime >= '2016-01-01' AND starttime < '2016-06-08'\r\n GROUP BY date\r\n)\r\nSELECT\r\n *\r\nFROM\r\n AI.FORECAST(\r\n TABLE data,\r\n MODEL => 'TimesFM 3.0',\r\n TIMESTAMP_COL => 'date',\r\n TARGET_COLS => ['subscriber_trips', 'casual_trips'],\r\n PAST_COVARIATE_COLS => ['avg_duration_min'],\r\n FUTURE_COVARIATE_COLS => ['is_weekend']\r\n );"), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f67f2e45a50>)])]>

This query highlights the three multivariate dimensions supported in TimesFM 3.0:

  1. Forecasting correlated targets (target_cols) Instead of running separate models for each rider segment, passing TARGET_COLS => ['subscriber_trips', 'casual_trips'] forecasts both metrics jointly in a single call. TimesFM 3.0 captures the cross-series dynamics between commuter and casual riders — such as shared weather sensitivity and diverging weekend ridership patterns.

  2. Using past covariates (past_covariate_cols) Some signals can only be observed historically and are not known in advance, such as average ride duration (avg_duration_min), historical foot traffic, or unplanned service disruptions. Passing PAST_COVARIATE_COLS => ['avg_duration_min'] (with future horizon rows set to NULL) gives the model historical context to distinguish temporary shocks from underlying trends without requiring future values for that feature.

  3. Using future covariates (future_covariate_cols) Other external drivers are known ahead of time across both the historical window and the forecast horizon — such as weekends (is_weekend), holidays, or scheduled promotions. Passing FUTURE_COVARIATE_COLS => ['is_weekend'] (populated across all rows through 2016-06-07) allows TimesFM 3.0 to condition its seven-day predictions directly on upcoming calendar events.

Understanding the output

The function returns structured predictions for each target column specified in target_cols. For each column in target_cols, AI.FORECAST returns a struct containing the point forecast (value) and the lower and upper prediction interval bounds:

date

subscriber_
trips.value

subscriber_trips.prediction_
interval_lower_bound

subscriber_trips.prediction_
interval_upper_bound

casual_trips.value

casual_trips.prediction_
interval_lower_bound

casual_trips.prediction_
interval_upper_bound

time_series_type

confidence_level

ai_forecast_status

2016-06-01 00:00:00 UTC

44699.64

32590.76

55723.44

4581.32

1727.91

9189.31

forecast

0.95

 

2016-06-02 00:00:00 UTC

44611.75

30413.05

57209.19

4647.17

1466.23

10273.55

forecast

0.95

 

2016-06-03 00:00:00 UTC

41379.15

26218.65

54940.09

5341.36

1568.23

11805.86

forecast

0.95

 

2016-06-04 00:00:00 UTC

30164.34

14266.43

45075.92

9097.74

2558.27

18452.52

forecast

0.95

 

2016-06-05 00:00:00 UTC

26727.27

10101.44

42239.33

8398.50

1692.15

17768.99

forecast

0.95

 

2016-06-06 00:00:00 UTC

36713.84

19493.00

52679.59

4723.08

400.08

11710.73

forecast

0.95

 

2016-06-07 00:00:00 UTC

39749.97

22157.42

56119.86

4180.97

95.70

10845.74

forecast

0.95

 

TimesFM 3.0 in BigQuery Conversational Analytics

You can also run multivariate forecasts using natural language in BigQuery Conversational Analytics. On the same bigquery-public-data.new_york.citibike_trips dataset, you can simply ask "Forecast both daily subscriber and casual trips for June 1–7, 2016 using two month historical data, with average trip duration as a past covariate and weekend indicator as a future covariate." Conversational Analytics automatically generates and executes the underlying AI.FORECAST query with TimesFM 3.0, returning a summary of the results, interactive forecast charts with prediction intervals for each target, and key forecast insights.

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="timesfm_3_in_ca_2" src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/timesfm_3_in_ca_2.gif" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>Multivariate forecasting with TimesFM 3.0 in BigQuery Conversational Analytics, generating 7-day predictions, interactive charts, and insights from a natural-language prompt.</p></figcaption>
  
</figure>


  </div>
</div>

Summary and next steps

With native multivariate support in TimesFM 3.0, BigQuery brings state-of-the-art foundation model forecasting to complex, interconnected enterprise datasets without requiring data movement, custom feature engineering pipelines, or dedicated model hosting infrastructure.

To start forecasting with TimesFM 3.0 in BigQuery:

  • Read the Google Research blog post to learn more about the TimesFM 3.0 model architecture and capabilities.

  • Explore the BigQuery TimesFM documentation.

  • Follow the step-by-step multivariate forecasting tutorial.

  • Try AI.FORECAST with `model => 'TimesFM 3.0'` directly in the BigQuery Studio SQL workspace.

  • Try AI.DETECT_ANOMALIES with `model => 'TimesFM 3.0'` for univariate time series anomaly detection in BigQuery.

  • Try AI.EVALUATE with `model => 'TimesFM 3.0'` for univariate time series evaluation in BigQuery.

Trusted Data Apps for the Agentic Data Cloud, powered by Looker

詳細を表示

As a business intelligence user, this probably sounds familiar: Most dashboards only provide you with a standardized canvas and a fixed library of charts, and the “analysis” consists of a CSV export that takes you to another system. Or sometimes it's designing the dashboard that’s the challenge: You can picture the executive briefing, the customer-facing portal, or the interactive explainer that you want, but can’t assemble it out of the available grid tiles.

Either way, the solution has always been to build a custom application. The advent of AI has sped up the process — a working prototype now takes an afternoon — but the excitement of that first demo fades fast. Without access to governed data, row-level security, an infrastructure owner, or a clear path through security review, a tool written by an LLM is simply a prototype that can never go to production.

Today, to bridge this gap, we are announcing Looker Data Apps (in preview) — pairing the speed of agent-generated applications with the governance, security, and trust of your existing Looker governance framework. Describe what you need in plain language, and the agent builds it as a real, production-grade application hosted natively inside Looker!

What is a data app?

A data app is a bespoke, interactive web application generated by an AI agent and hosted natively within Looker. While dashboards provide top-down visibility, data apps serve as an active system of action designed around a specific operational workflow. A data app:

  • Goes beyond standard grid tiles with pixel-perfect, bespoke layouts configured for a specific operational role or job-to-be-done.

  • Enables business users to input parameters, test scenarios, run live simulations, and update underlying records.

  • Connects end-to-end business processes by connecting data analysis to business execution tasks like updating source records or dispatching events to tools like Salesforce and Jira.

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="1" src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/1_SS6pcLF.gif" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>Build pixel-perfect interfaces using AI developer tools like Claude Code or Antigravity CLI, grounded directly by Looker’s semantic layer.</p></figcaption>
  
</figure>


  </div>
</div>

Expanding your semantic layer into an application platform

Data apps do not replace dashboards; they expand the boundaries of what you can build on top of your existing dashboards and semantic layer.

  • Dashboards excel at aggregate visibility and passive reporting. Data apps handle active execution, letting users modify parameters and trigger downstream business tasks.

  • Dashboards provide consistency using standardized chart libraries. Data apps deliver broad flexibility, unlocking custom web components and specialized interactions.

  • Data apps are grounded in governed data to ensure accuracy. Whether users are reviewing a KPI dashboard or adjusting budgets in a data app, all logic is governed centrally with the LookML semantic layer to eliminate metric discrepancies and hallucinations.

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="2" src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/2_dLheVUo.gif" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>Transform analysis into action with customizable, multi-page web app experiences and embedded operational workflows.</p></figcaption>
  
</figure>


  </div>
</div>

Built for enterprise scale

We designed Looker Data Apps for demanding, governed enterprises. 

  • Every measure is grounded in the semantic layer. Every app you build directly inherits your existing semantic models, row-level security, and access controls. Calculations stay consistent across the enterprise, and built-in query inspection lets teams audit every line of generated SQL to eliminate metric hallucinations.

  • Zero-code by default. Deploy agent-generated React applications directly inside Looker with no code. Or users can use LLMs like Claude Code and Antigravity CLI to build interactive apps and deploy them as data apps in minutes.

  • No runtime token costs. LLM tokens are only consumed when you’re designing or generating the app. After that, every end-user interaction runs on native Looker APIs and models. Put a data app in front of 50 people or 5,000 and the marginal cost doesn't change.

  • As easy as embedding a dashboard. You can deploy your data apps into external portals using the same workflows you use to embed a dashboard. No new pipelines, no custom application code, no second permission models.

From prototype to production in minutes

The days of having to choose between basic dashboards and investing valuable engineering time to build bespoke systems are coming to an end. Instead of letting prototypes stall in sandboxes due to compliance and security barriers, Looker Data Apps allows teams to deploy governed, production-grade tools in minutes.

Looker Data Apps are now in preview. Get started today.

10 Years of the SRE book: Announcing the second edition of "Site Reliability Engineering”

詳細を表示

A decade ago, Google released Site Reliability Engineering: How Google Runs Production Systems with O'Reilly Media. What began as a collection of our practices for managing large-scale infrastructure became a bestselling book, and inspired many organizations to adopt the reliability practices it outlined: applying software engineering to operations to build systems that are scalable, reliable, and sustainable.

Over the past ten years, computing landscapes have undergone profound shifts. AI, microservices, multi-cloud deployments, serverless paradigms, and platform engineering have all reshaped how we build and operate software. To mark the 10th anniversary of the book's release, we are excited to announce the completely rewritten second edition of the Google SRE book, reflecting a decade of lessons learned both inside Google and across the broader industry, to offer fresh guidance tailored for today's operational challenges.

<figure class="article-image--wrap-small
  
  ">

  
  
    
    <img alt="SRE Book 2e Front Cover" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/SRE_Book_2e_Front_Cover.max-1000x1000.jpg" />
    
    </a>
  
</figure>







  <h3><b>Why update the book?</b></h3><p>When we published the first edition, many organizations were focused on early cloud migrations and just starting to transition from monolithic architectures. Today, with organizations delivering software at a high velocity and at global scale, the challenge is no longer adopting cloud infrastructure, but maintaining high reliability in the face of the immense complexity.</p><p>Modern production environments operate under constant change. System boundaries are more complex, dependencies are deep, and failure modes are more complex and damaging than ever before. The explosion of resource-intensive workloads like generative AI has changed the economics and operational requirements of infrastructure management.</p><p>Writing this second edition required us to take a step back and evaluate what it takes to successfully implement SRE today.</p><h3><b>A decade of evolution: How SRE practices have progressed</b></h3><p>The second edition takes a deep dive into how foundational site reliability engineering practices have matured over the last ten years, shifting from manual, task-specific work toward automated, platform-wide capabilities. Consider, for example:</p><p><b>SLOs and error budgets:</b> In 2016, teams relied on basic availability metrics and manual error budget policies. Today, practices have matured into user-centric, multi-tiered SLOs with dynamic burn-rate alerting and automated policy enforcement.</p><p><b>Monitoring and observability:</b> Early setups centered on static dashboards, basic logs, and manual alert triage. Modern observability leverages OpenTelemetry, distributed tracing, and automated anomaly correlation to find root causes quickly.</p><p><b>Automation and platforms:</b> Operations have shifted from writing custom scripts for isolated tasks to using declarative infrastructure as code, internal developer platforms, and resilient, self-healing systems.</p><p><b>Reliability testing:</b> Rather than relying solely on scheduled game days and synthetic load tests, modern engineering embeds continuous resilience checks, automated pipeline testing, and live production canary verification.</p><p><b>Capacity and resource management:</b> Manual provisioning and static forecasting have been replaced by dynamic auto-scaling, cloud FinOps alignment, and dedicated cost and cluster optimization for GPU and TPU workloads.</p><p><b>Organizational models:</b> SRE has expanded beyond dedicated teams assigned to specific applications. Today's organizations use hybrid models, platform engineering integrations, and reliability champions embedded across product teams.</p><h3><b>SRE in the age of AI</b></h3><p>Then there’s the dual relationship between SRE and artificial Intelligence: how SRE supports AI infrastructure, and how SRE teams use AI to enhance operational reliability.</p><p>Running large language models (LLMs) and foundation models introduces novel reliability challenges. The book outlines methodologies for operating AI infrastructure at scale:</p><ul><li>Managing massive GPU and TPU hardware cluster reliability and network topologies</li><li>Monitoring non-deterministic outputs and latency characteristics unique to AI</li><li>Ensuring pipeline reliability for continuous model training, fine-tuning, and data processing</li></ul><p>AI is also rapidly becoming a force multiplier for reliability engineers. The second edition shares practical frameworks for enhancing human operational efficiency:</p><ul><li>Using generative AI tools to assist in real-time incident triage and postmortem generation</li><li>Interrogating complex system telemetry using natural language queries</li><li>Using predictive machine learning models to identify resource bottlenecks before outages occur</li></ul><h3><b>What hasn’t changed? The importance of culture</b></h3><p>While technologies and architectures continuously evolve, the core principles of SRE remain intact, and are key to establishing a reliability-focused culture. Accordingly, the second edition re-emphasizes and expands upon the human elements of system engineering, and how to get there.</p><p>Whether you’re new to the field, a practitioner, an engineering manager, or a technology executive, the rewritten second edition of <i>Site Reliability Engineering</i> serves as your definitive roadmap for the next era of production systems.</p><p>You can order your copy today in physical format (see <a href="https://www.google.com/books/edition/_/iXnw0QEACAAJ?kptab=getbook">Google Books</a>) or digital format from <a href="https://www.oreilly.com/library/view/site-reliability-engineering/9798341607675/">O'Reilly</a>.</p>
</div>

Agentic data science with the Data Agent Kit

詳細を表示

Imagine your compliance team notices that payments are taking longer than expected to clear. They suspect fraud, and you’re the data scientist helping figure out which transactions to investigate first. Assembling that shortlist requires ingesting and cleaning raw transaction logs, training a model on past fraud, scoring new records, and scheduling the pipeline to run daily. Here’s how you can build that workflow end to end with an agent, using the Data Agent Kit inside the Antigravity IDE.

Introducing the Data Agent Kit

Data Agent Kit helps you work with Google Cloud data through a plugin for coding agents or an extension for Visual Studio Code-based IDEs. It brings two significant additions to the workflow:

  • Help for your agent: MCP tools connect your agent to data services. Skills are Markdown files that give it instructions and best practices for working with your data stack

  • Tools in your IDE: work with Google’s Agentic Data Cloud, from querying databases to deploying an Airflow pipeline, without leaving your editor

Loading the data

Let’s start with the raw transaction logs in Google Cloud Storage. You can ask the agent to create a notebook that loads them into BigQuery using Spark:

code_block
<ListValue: [StructValue([('code', 'Create a PySpark notebook to ingest JSON transaction logs from gs://financials-clearing-raw/ into the BigQuery table transactions.raw_transactions.'), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f67f2780d50>)])]>

The agent generates a Jupyter notebook that loads the JSON logs into a BigQuery table named raw_transactions. You can open the notebook, review the code, and run it using a preconfigured Spark Serverless runtime from the IDE.

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="1_spark_runtime" src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/1_spark_runtime.gif" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>Running a generated PySpark notebook</p></figcaption>
  
</figure>


  </div>
</div>

After the notebook runs, you can open the raw_transactions table with the Data Agent Kit. The extension allows you to browse the table and inspect its metadata right from the IDE.

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="2_raw_table_ide" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/2_raw_table_ide.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>Inspecting a BigQuery table in the IDE</p></figcaption>
  
</figure>


  </div>
</div>

The records are now in BigQuery, but they aren’t ready for model training yet. First, we’ll handle duplicate and incomplete records, then join the remaining records with info about who sent and received each payment.

Cleaning it up

Let’s put the cleanup logic into a dbt project so we can run it on each new batch of data. We’ll also test that each transaction appears only once. Prompt the agent:

code_block
<ListValue: [StructValue([('code', 'Create a dbt project in dbt_project/ for the BigQuery dataset transactions.\r\n\r\nDeduplicate raw_transactions by transaction_id in staging. Separate records with null IDs into invalid_transactions. Join valid records with dim_payers and dim_payees to create enriched_transactions, preserving the is_fraud label. Add a transaction uniqueness test.'), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f67f2782f90>)])]>

The agent generates a dbt project with SQL models for cleaning and enriching the data. Take a look at the generated code to check how it handles duplicates and joins reference tables. Then run dbt build in the terminal. This builds the staging and enriched tables in BigQuery, along with a separate table for records with missing transaction IDs. dbt also runs the uniqueness test.

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="3_dbt_build" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/3_dbt_build.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>Validating dbt models in the integrated terminal</p></figcaption>
  
</figure>


  </div>
</div>

We also keep the is_fraud column, which indicates whether a past transaction was fraudulent. We’ll train the model on records with known labels and use it to score new transactions, where we’re unsure yet whether fraud occurred.

Building the review queue

With the data prepared, let’s ask the agent to create a training notebook using a Random Forest classifier running on Spark Serverless.

code_block
<ListValue: [StructValue([('code', 'Create a PySpark notebook to train a RandomForestClassifier\r\non table transactions.enriched_transactions.\r\n\r\nPredict is_fraud, training only on records where the label\r\nis not null. Encode categorical features, scale amounts,\r\nand evaluate the model using ROC AUC. Save the evaluated model to gs://models/fraud_model.'), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f67f27802d0>)])]>

Review and run the notebook, then check its evaluation output to see how well the model separates fraudulent transactions from legitimate ones. You can also use the Data Agent Kit extension to verify that the trained model artifacts were saved to Google Cloud Storage.

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--medium
  
  
    h-c-grid__col
    
    h-c-grid__col--4 h-c-grid__col--offset-4
    
  ">

  
  
    
    <img alt="4_trained_model_gcs" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/4_trained_model_gcs.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>Verifying the trained model artifacts in Google Cloud Storage</p></figcaption>
  
</figure>


  </div>
</div>

Now we can use the saved model to score transactions that don’t have an is_fraud value yet:

code_block
<ListValue: [StructValue([('code', 'Create a batch inference notebook that loads the saved model from gs://my_models/fraud_model and scores records in transactions.enriched_transactions where is_fraud is null.\r\n\r\nWrite transactions with a fraud probability score >= 0.50 to the Spanner table SparkEvalFraudReviewQueue, in the instance cymbal-fraud, database fraud-db.'), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f67f27801d0>)])]>

In this example, the inference notebook scores the unlabeled transactions in BigQuery and sends those with an estimated fraud probability of 50% or higher to the Spanner review queue. The flagged records help the team decide where to investigate, but they still need to determine whether fraud occurred.

Look at how the inference notebook filters and writes flagged records, then run it. Once it finishes, query the Spanner table in the IDE to inspect the results.

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="5_spanner_results" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/5_spanner_results.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>Querying flagged transactions in the Spanner table</p></figcaption>
  
</figure>


  </div>
</div>

This table is the list we set out to build. The compliance team can now start reviewing transactions, and we have a workflow that gets records from raw logs into the queue.

So far, we have been kicking off each step ourselves. We can now connect them so the workflow runs automatically each day.

Running it again tomorrow

Each day we will load the latest logs, apply the dbt transformations, and score unlabeled transactions using the saved model. We’ll use the Managed Service for Apache Airflow to run these steps in order. Ask the agent: 

code_block
<ListValue: [StructValue([('code', 'Create an orchestration pipeline named fraud_analysis_pipeline that runs ingestion, the dbt project, and batch inference in that order.\r\n\r\nSchedule it daily at midnight. Use Spark Serverless for the notebooks, including the Spanner connector for inference, and gs://YOUR_ARTIFACT_BUCKET for artifact storage.'), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f67f2781110>)])]>

The agent generates a YAML pipeline definition and deployment configuration. The pipeline definition sets the schedule and dependencies between steps. Meanwhile, the deployment configuration specifies the Airflow environment where it will run.

Data Agent Kit then turns the definition into an Airflow DAG, which you can explore as an interactive graph in the IDE. Open the pipeline under “Orchestration Pipelines” and click a task to inspect it. For notebook tasks, you can follow the link straight back to the code.

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="6_pipeline_config" src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/6_pipeline_config.gif" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>Inspecting a data pipeline</p></figcaption>
  
</figure>


  </div>
</div>

With the Airflow environment configured, click “Run pipeline” in the canvas. Data Agent Kit packages the notebooks and dbt project, deploys the DAG, and triggers a run. Open the pipeline’s execution history to follow its progress. You can also select individual tasks to inspect their status, duration, and logs.

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="7_airflow_logs" src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/7_airflow_logs.gif" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>Kicking off an Airflow DAG and inspecting the logs</p></figcaption>
  
</figure>


  </div>
</div>

Airflow will run the pipeline every day, taking new batches of data from raw logs to the review queue. The compliance team can now focus on flagged transactions, and you’ve automated the work of getting those records to them!

Try it yourself

If you are ready to try this for yourself, we have designed a codelab that walks you through the full setup so you can build and run this workflow. You can also read our documentation or check out the skills and tools in the open-source repository on GitHub.

Related Article

    <div class="uni-related-article-tout__content-wrapper">
      <div class="uni-related-article-tout__image-wrapper">
        <div class="uni-related-article-tout__image"></div>
      </div>
      <div class="uni-related-article-tout__content">
        <h4 class="uni-related-article-tout__header h-has-bottom-margin">Agentic analytics with the Data Agent Kit</h4>
        <p class="uni-related-article-tout__body">Data Agent Kit is a set of MCP servers and agent skills that helps data developers run data workflows from their IDEs. It’s available bot...</p>
        <div class="cta module-cta h-c-copy  uni-related-article-tout__cta muted">
          <span class="nowrap">Read Article
            <svg class="icon h-c-icon" xmlns="http://www.w3.org/2000/svg">
              <use xlink:href="#mi-arrow-forward" xmlns:xlink="http://www.w3.org/1999/xlink"></use>
            </svg>
          </span>
        </div>
      </div>
    </div>
  </div>
</a>

One Agent Development Kit, five languages

詳細を表示

When we talk about agents, that doesn't necessarily mean we're talking about Python. In today's modern ecosystem, an agent might run as a high-concurrency Go microservice on Cloud Run, or live inside a browser tab calling Chrome's on-device model. Yet many agent frameworks assume a Python-only stack. That assumption forces teams to either spin up a Python service just for their agent workloads, or to build agent orchestration logic from scratch in their own language.

Google's Agent Development Kit (ADK) removes that trade-off with coverage for Python, Go, TypeScript, Java, and Kotlin. Each version of the ADK is built from the ground up for its own runtime and type system, while sharing a unified architecture with interoperability through open protocols.

A shared foundation

Picking a language doesn't lock in your architecture: all five support the same open protocols. ADK includes a Model Context Protocol client in every language, so a custom tool exposed as an MCP server can be called from any of them immediately.

For multi-agent systems, ADK supports the Agent2Agent (A2A) protocol, allowing an agent to communicate with a remote agent over HTTP. Through A2A, agents written in different languages or frameworks are interoperable.

Starting agent-first

To get started, run the one-time setup command to check your Google Cloud authentication, install the CLI, and then set up first-party ADK skills in coding agents like Antigravity, Claude Code, or Codex:

code_block
<ListValue: [StructValue([('code', 'uvx google-agents-cli setup'), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f1d11efdf50>)])]>

Then, run the scaffold command to generate a working project with A2A endpoints and deployment config for Cloud Run, Gemini Enterprise Agent Runtime, or Google Kubernetes Engine (GKE):

code_block
<ListValue: [StructValue([('code', '# Scaffold an ADK project (use --agent adk for Python or --agent adk_go for Go)\r\nagents-cli scaffold create my-go-agent \\\r\n --agent adk_go \\\r\n --deployment-target cloud_run \\\r\n --region us-central1'), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f1d11efe290>)])]>

Both the ADK for Python and ADK for Kotlin repositories also ship agent builder skills in their source trees, and the adk.dev/llms.txt resource gives any coding agent on-demand API documentation across all five languages.

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="one-agent-development-kit-five-languages-architecture" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/one-agent-development-kit-five-languages-a.max-1000x1000.jpg" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>Coding-agent skills scaffold your project while MCP and A2A connect all five language runtimes.</p></figcaption>
  
</figure>


  </div>
</div>

Hands-on view of each ADK

The clearest way to feel the difference between the five languages is to define the same weather tool in each one and see how its design fits the runtime.

Python

In ADK for Python, you don't need a decorator or a schema builder class. You pass a plain Python function into the tools parameter, and ADK inspects its signature, type hints, and docstring at startup to automatically construct the tool declaration and Pydantic parameter schema:

code_block
<ListValue: [StructValue([('code', 'from google.adk.agents.llm_agent import Agent\r\n\r\n\r\ndef get_weather(city: str) -> dict:\r\n """Retrieves the current weather report for a specified city.\r\n\r\n Args:\r\n city (str): The name of the city for which to retrieve the weather report.\r\n """\r\n return {"status": "success", "report": f"Sunny and 72F in {city}."}\r\n\r\n\r\nroot_agent = Agent(\r\n name="weather_agent",\r\n model="gemini-3.8-flash",\r\n instruction="Answer questions about the weather in a city.",\r\n tools=[get_weather],\r\n)'), ('language', 'lang-py'), ('caption', <wagtail.rich_text.RichText object at 0x7f1d1188bc90>)])]>

Beyond fast prototyping, Python is ADK's reference implementation, shipping the broadest set of Google Cloud integrations (BigQuery, Spanner, Bigtable) and model adapters (Gemini, Anthropic, OpenAI, LiteLLM). Paired with the adk eval or agents-cli eval run commands, its evaluation tooling scores agent trajectories against golden datasets in continuous integration (CI) to test the whole system end to end, even when your production service runs in another language.

Go

While Python leads in experimentation and evaluation, ADK for Go hits the sweet spot for production backend engineering.

A Go tool function takes the agent.Context configuration and a strongly typed input struct. The functiontool.New function uses Go generics to infer both the input and output schemas from your struct tags:

code_block
<ListValue: [StructValue([('code', 'type GetWeatherArgs struct {\r\n\tCity string `json:"city" jsonschema:"The city to look up weather for."`\r\n}\r\n\r\ntype GetWeatherResult struct {\r\n\tReport string `json:"report"`\r\n}\r\n\r\nfunc getWeather(_ agent.Context, args GetWeatherArgs) (GetWeatherResult, error) {\r\n\treturn GetWeatherResult{Report: "Sunny and 72F in " + args.City}, nil\r\n}\r\n\r\nweatherTool, err := functiontool.New(functiontool.Config{\r\n\tName: "get_weather",\r\n\tDescription: "Retrieves the current weather report for a city.",\r\n}, getWeather)'), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f1d1188a010>)])]>

Because the functiontool.New function is generic over your handler's signature, the Go compiler verifies that your function matches the expected contract before your binary ever runs.

Go was also the first language after Python to ship the ADK 2.0 Graph Workflow runtime. When you need deterministic control flow alongside LLM reasoning, the workflow.New function wires agents and plain Go functions into a directed graph with conditional routing and parallel steps:

code_block
<ListValue: [StructValue([('code', 'ag, err := workflowagent.New("order_pipeline", []workflow.Edge{\r\n\t{From: workflow.Start, To: triageNode},\r\n\t{From: triageNode, To: fulfillNode, Route: workflow.StringRoute("fulfill")},\r\n\t{From: fulfillNode, To: notifyNode},\r\n})'), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f1d1188a450>)])]>

Where Go really stands out is in production on Cloud Run and GKE. A compiled Go agent packages onto a roughly 2 MiB Google distroless static base image, with no language VM or heavy dependency tree. A static Go binary binds to its port as soon as the container starts, skipping the module imports of dynamic languages and the JAR unpacking and JIT warmup of JVM services.

After it's running, Go's concurrency model fits agent workloads naturally. Each goroutine starts with a 2 KB stack and minimal scheduling overhead, so a single instance can multiplex thousands of concurrent streaming requests and tool calls. ADK for Go also includes built-in A2A server handlers and OpenTelemetry tracing out of the box.

TypeScript

TypeScript erases type annotations when compiling to JavaScript, so runtime reflection isn't an option. Instead, ADK for TypeScript pairs with Zod. You pass a z.object(...) schema to the FunctionTool function, and TypeScript statically infers the parameter types of your execute callback from that single declaration:

code_block
<ListValue: [StructValue([('code', 'import { FunctionTool, LlmAgent } from "@google/adk";\r\nimport { z } from "zod";\r\n\r\nconst getWeatherTool = new FunctionTool({\r\n name: "get_weather",\r\n description: "Retrieves the current weather report for a city.",\r\n parameters: z.object({\r\n city: z.string().describe("The name of the city."),\r\n }),\r\n execute: async ({ city }) => {\r\n return { status: "success", report: `Sunny and 72F in ${city}.` };\r\n },\r\n});\r\n\r\nexport const rootAgent = new LlmAgent({\r\n name: "weather_agent",\r\n model: "gemini-3.8-flash",\r\n instruction: "Answer questions about the weather in a city.",\r\n tools: [getWeatherTool],\r\n});'), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f1d11889f90>)])]>

Your runtime input validation, the JSON Schema sent to the model, and your IDE autocomplete inside the execute callback all flow from one source of truth.

TypeScript also runs on the ADK 2.0 Graph Workflow engine and ships a standalone browser bundle. Beyond Node.js services, you can run an ADK agent directly in a browser tab using WebMCP for page-level tools and Chrome's on-device Prompt API.

Java

ADK for Java snaps right in for teams who have standardized on Maven, Gradle, and Spring Boot. You add @Schema annotations to method parameters and assemble agents by using a fluent LlmAgent.builder() API:

code_block
<ListValue: [StructValue([('code', 'public class WeatherTools {\r\n public static Map<String, String> getWeather(\r\n @Schema(name = "city", description = "The name of the city")\r\n String city) {\r\n return Map.of("status", "success", "report", "Sunny and 72F in " + city);\r\n }\r\n}\r\n\r\nLlmAgent agent = LlmAgent.builder()\r\n .name("weather_agent")\r\n .model("gemini-3.8-flash")\r\n .instruction("Answer questions about the weather in a city.")\r\n .tools(FunctionTool.create(WeatherTools.class, "getWeather"))\r\n .build();'), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f1d1188b3d0>)])]>

At runtime, the runner streams agent events reactively through RxJava. For local testing and existing JVM apps, ADK for Java ships a Maven Dev UI plugin alongside first-party bridges for Spring AI and LangChain4j.

Kotlin

ADK for Kotlin takes a strong stance on build-time safety. Its Kotlin Symbol Processing (KSP) compiler plugin reads @Tool and @Param annotations at build time and emits the tool schema directly into bytecode:

code_block
<ListValue: [StructValue([('code', 'class WeatherTools {\r\n @Tool(\r\n name = "get_weather",\r\n description = "Retrieves the current weather report for a city.",\r\n )\r\n suspend fun getWeather(\r\n @Param("The name of the city.") city: String\r\n ): Map<String, String> = mapOf("status" to "success", "report" to "Sunny and 72F in $city")\r\n}\r\n\r\nval agent = LlmAgent(\r\n model = Gemini("gemini-3.8-flash"),\r\n name = "weather_agent",\r\n instruction = Instruction("Answer questions about the weather in a city."),\r\n tools = WeatherTools().generatedTools(),\r\n)'), ('language', ''), ('caption', <wagtail.rich_text.RichText object at 0x7f1d1188b8d0>)])]>

If a tool signature uses an unsupported type or declares a default value on a non-nullable parameter, your Gradle build fails immediately instead of breaking in production. Because the .generatedTools() function uses zero runtime reflection, it survives Android R8 shrinking.

That zero-reflection design makes it possible to run the entire agent loop locally on Android. It offers JVM server support, including a Spring AI bridge and experimental ADK 2.0 graph workflows. On-device, ADK for Kotlin integrates with LiteRT-LM for tool calling and ML Kit (Gemini Nano) for text generation. It also works with Room and AppSearch for local state, and Android AppFunctions for OS-level actions, all without requiring a network connection.

Choice without compromise

Having five native languages in ADK means you don't have to pick a single runtime for your entire organization. Because every version of ADK speaks MCP and A2A, each component of your system can use the language that fits it best.

What languages have you used to build agents with Google's ADK? Let me know what stack you're running on X, LinkedIn, or Bluesky.

Google Cloud Japan Blog

エージェント型ソースコード レビューで敵対的 AI に先手を打つ

詳細を表示
執筆者: Alex Tselevich, Michael Maturi

はじめに

AI の敵対的な不正使用により、データ窃盗や恐喝事案のリスクが増大しています。独自のソースコードが流出した際、防御者が脆弱性の特定とパッチ適用に奔走する一方で、攻撃者は AI ツールを使用してマシンスピードで攻撃を仕掛けてくるためです。

Mandiant は、分析プロセスの構造化、懐疑的な視点による検証ステップの徹底、そしてドメイン固有の人間の専門知識をパイプラインに直接組み込むことで、その実効性を飛躍的に向上させました。AI モデルと、人間の専門家が主導する高度に構造化されたオーケストレーション レイヤを組み合わせることで、防御者が攻撃者よりも先に攻撃できるようになります。

現在、Mandiant は Agentic Vulnerability Discovery Harness(AVDH)を使用して、プロアクティブなレビュー、ペネトレーション テスト、レッドチーム オペレーション、インシデント対応業務において、コードを迅速に分析し、エクスプロイト パスを検出しています。このフレームワークは、マルチエージェント オーケストレーションと最前線の専門知識を組み合わせることで、日常的な脆弱性の発見と検証を強化し、人間がその能力を最大限に発揮できる作業に専念できるようにします。

防御者が同様のアプローチを自社環境に実装できるよう、Mandiant は、これまで社内で運用してきたポイントインタイム アーキテクチャの詳細を初めて公開します。AVDH を CodeMender の継続的なスキャンと併用して、2 層の防御戦略を構築することもできます。

実際の成果

AVDH を使用して 10 か月になりますが、大きな効果を実感しています。企業のリポジトリが窃取された最近のインシデント対応調査において、このハーネスはわずか 2 日間で 100 件を超える真陽性の深刻な脆弱性を発見しました。これは、手動レビューに要する時間のわずか数分の 1 で成果を上げたことになります。

これにより、Mandiant が大規模に脆弱性を発見するスピードが大幅に向上しました。Mandiant は、数千万行のコードにわたる環境を分析し、数千のパイプラインを実行して数万の検出結果を生成するために、このツールを使用しています。この迅速な分析により、広く利用されているウェブ拡張機能やオープンソース プロジェクトにおいて、CVE 採番の対象となる脆弱性が数十件特定されました。その結果、CVE-2026-13242 や CVE-2026-55803 を含む 12 件の CVE がすでに割り当てられており、さらに 12 件についても現在、開示手続きが進められています。

迅速かつ広範囲で高精度なスキャンは、AVDH の主なメリットの一つですが、標的型攻撃シミュレーションの実施中には、戦力増強の役割も果たしました。最近、あるクライアントのウェブ アプリケーションのソースコードをこのハーネスで処理したところ、初期アクセスを可能にするリモートコード実行(RCE)の脆弱性がすぐに見つかりました。

AVDH は、強固な防御網をかいくぐり、複雑なエクスプロイト チェーンを加速させるうえで、極めて有用であることが繰り返し実証されています。

パイプラインの設計

ハーネスは、大規模言語モデル(LLM)をサイバーセキュリティに活用するうえで不可欠なツールとなっています。これにより、モデルの予測不可能性の多くが軽減され、コード分析の有効性が劇的に向上します。

ハーネスのプログラム制御されたインフラストラクチャは、目標の完遂に向けて、エージェントを厳密に決定論的な手法でオーケストレートします。AVDH では、Google Agent Development Kit(ADK)を使用しました。これは、最も一般的なエージェント オーケストレーション パターンを実装し、カスタム統合やサードパーティ統合を柔軟に構成できる LLM フレームワークです。このアプローチは、Google Antigravity で利用可能になったエージェント オーケストレーション機能と整合しています。この機能は、ビルダーがエージェント ワークフローを制御および管理するための集中型ワークスペースを提供します。

あらゆるソフトウェア分野で脆弱性の発見と修正に携わってきた、数十年にわたる最前線での経験を活かし、コンサルタントが日々実践している実績ある手法を基盤として AVDH を構築しました。AVDH は、ソフトウェア開発のウォーターフォール方式のように、専門のエージェントをパイプライン内で順次連携させます。これは、1 つのフェーズが完了してから次のフェーズを開始するという仕組みです。このパイプラインにより、優先順位とリスク評価が付与された検出結果リストが生成され、人間の専門家がレビューできるようになります。

現場のセキュリティ専門家が組織のコンテキストを頼りにするのと同様に、エージェント ハーネスも、アセット インベントリ、ソフトウェア部品構成表(SBOM)、アーキテクチャ ドキュメント、脅威インテリジェンスといった豊富な環境データを必要とします。このコンテキスト データを、専門家の知見を凝縮したナレッジベースにフィードすることで、エージェントは関連するスキル、言語ルール、脆弱性パターンを動的に選択し、詳細な分析を行えるようになります。

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="Sequential vulnerability discovery methodology" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Figure_1_Sequential_vulnerability_discover.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>図 1: 脆弱性を順次検出する手法</p></figcaption>
  
</figure>


  </div>
</div>

脅威モデリング

AI を使用してコード セキュリティ分析を行う際の重要な最初のステップは、対象のコードベースの脅威モデルを確立することです。ソフトウェア アーキテクチャは千差万別であり、脅威モデルがなければ、攻撃ベクトル、ビジネス ロジック、到達可能性といった重要なコンテキストを見失うおそれがあります。

従来のソースコード レビュー エンジンが画一的なパターン マッチング ルールに依存するのに対し、LLM には、標準権限ユーザーがアクセスできるコード、管理者限定のコード、あるいはまったく実行されないコードを識別できるという明確な優位性があります。

パイプラインは、探索エージェントをディスパッチして、ターゲット コードベースの主な目的を特定することから始まります。このエージェントは、ソフトウェア ドメイン(ウェブやデスクトップ アプリケーションなど)を判別し、検出されたドキュメントを確認します。また、スキャンから除外すべきディレクトリ(単体テストを含むものなど)にフラグを立て、スペシャリスト探索サブエージェントをディスパッチします。

スペシャリスト探索サブエージェントは、認証、認可、ルーティング、その他のドメイン固有のカテゴリなど、それぞれの専門分野を掘り下げます。これらの出力は、脅威モデル合成エージェントに渡され、検出結果が一貫性のある脅威モデルへと集約されます。

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="Codebase reconnaissance workflow diagram" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Figure_2_Codebase_reconnaissance_workflow_.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>図 2: コードベースの偵察ワークフロー図</p></figcaption>
  
</figure>


  </div>
</div>

この段階の分析が完了すると、次の工程に進む前の検証用として、脅威モデルのテキスト情報と図解の両方がコンサルタントに提示されます。この承認ゲートにより、パイプラインの残りの部分が正確な基盤に基づいて動作することが保証されます。

図 3 は、ハーネスによって生成されたビジュアル脅威モデルのレイアウト例であり、どのアプリケーション コンポーネントが公開され、それらがどのように接続されているかを示しています。

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="Visual representation of a threat model for a sample codebase" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Figure_3a.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>図 3: サンプル コードベースの脅威モデルの視覚的表現</p></figcaption>
  
</figure>


  </div>
</div>

エントリ ポイントの検出

脅威モデルを確立した段階で、並列化された検出エージェントをデプロイして、スコープ内のすべてのファイルを分析します。これらのエージェントは、軽量な Gemini Flash Lite モデルを活用してコードを大規模に処理することで、HTTP ルートやプロセス間通信(IPC)リスナー、その他のドメイン固有の攻撃ベクトルといった、アプリケーションの重要なエントリ ポイントを抽出します。同時に、これらの特定されたエントリ ポイントにネストされている、ユーザー入力の特定可能なすべてのソースを分離して抽出します。

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="Entry point discovery workflow diagram" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Figure_4_Entry_point_discovery_workflow_di.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>図 4: エントリ ポイント検出ワークフロー図</p></figcaption>
  
</figure>


  </div>
</div>

コンテキストの拡充

分析対象のエントリ ポイントが選択されると、ハーネスはそれぞれを専用の拡充エージェントに割り当てます。エンタープライズ アプリケーションでは、エントリ ポイントを個別に分析するだけでは不十分なことがほとんどです。というのも、サニタイザー、権限、ルーティング条件といった重要なコンポーネントは、高度に分散していることが多いからです。

さらに、脆弱性は、ネストされた関数呼び出し、複数のホップ、最初のソースから離れたファイルの奥深くに隠れていることがよくあります。このギャップを埋めるために、拡充エージェントはコードベースを探索し、割り当てられたエントリ ポイントのコンテキストに関連するコードを集約します。この集約されたデータを評価し、エントリ ポイントに対して、アクセス制御エージェントやデータフロー分析エージェント、あるいはその両方によるさらなる分析が必要かどうかを判断します。

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="Context enrichment workflow diagram" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Figure_5_Context_enrichment_workflow_diagr.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>図 5: コンテキストの拡充ワークフロー図</p></figcaption>
  
</figure>


  </div>
</div>

Hypothesis Generation

効果的なコード分析ができるかどうかは、制御フローとデータフローという 2 つの主要な特性をいかに把握できるかにかかっています。制御フローがタスクと命令の実行順序を規定するのに対し、データフローはアプリケーション全体で情報がどのように移動し、変換されるかを追跡します。

AVDH はこれらの重要なタスクを、アクセス制御エージェントとデータフロー分析エージェントにそれぞれ委任します。

この段階では、これらのエージェントは最小限の自己検証を行います。主な目的は、広範なブレインストーミングです。生成される膨大な数の仮説を管理するために、このクリエイティブ プロセスは、コンサルタントが構成した信頼度フィルタによって制御されます。

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="Hypothesis generation gating diagram" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Figure_6_Hypothesis_generation_gating_diag.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>図 6: 仮説生成のゲーティング図</p></figcaption>
  
</figure>


  </div>
</div>

アクセス制御エージェントは、ターゲットとなるエントリ ポイントに適用されている保護機能を評価し、アプリケーション ユーザーに対する全体的なアクセス性を判定します。その主な目的は、セキュリティの前提条件を検証し、特権機能が制限されているか、権限のないユーザーに誤って公開されていないかを確認することです。この分析により、チェックの未実施や誤った ID に対する検証といった欠陥が浮き彫りになります。これには、認可の欠落、権限昇格、クロスサイト リクエスト フォージェリ(CSRF)などが含まれます。

一方、データフロー分析エージェントは、最初の入力ポイントからアプリケーション全体にわたるユーザー入力の流れを追跡します。具体的には、ネストされた関数呼び出し、サニタイザー変換、データベースなどのストレージ境界を通過するデータをトレースします。

エージェントの目標は、このユーザー提供データが危険な「シンク」(悪意のある入力が行われて害を及ぼす可能性がある関数)に到達するかどうかを判断することです。この詳細なトレースにより、SQL インジェクション、クロスサイト スクリプティング(XSS)、コマンド インジェクション、パス トラバーサルなどの脆弱性クラスが明らかになります。

仮説の検証

ターゲット コードベースの仮説が生成されると、ハーネスは新しいエージェント セットをディスパッチして仮説を検証します。LLM では、Temperature パラメータが出力の変動性とランダム性を左右します。Temperature が低いと予測可能で安定した回答が得られる一方で、値が高いと毎回大きく異なる結果が生成されるようになります。

ハーネスではこの特性を活かし、高い Temperature 設定で構成された複数の 検証エージェントをディスパッチして各仮説を評価します。それと並行して、1 つの検証合成エージェントが、これらのエージェントの判定を処理して最終的な決定を下します。Temperature を高く設定することで、予測可能な期待どおりの回答にとどまらず、より幅広い可能性を検証できるようになります。最終的に、この Temperature 設定によって、最終判断を下すエージェントには、より豊富で包括的なコンテキストがもたらされます。

合成エージェントは、検証エージェントによる推論内容と判定結果を評価し、仮説が Mandiant の厳格な品質基準を満たしているか、また全体的な脅威モデルと整合しているかを判断します。その結果、次の 3 つのいずれかの結論に至ります。

  • 確認済みの検出結果: 仮説は妥当であり、検証エージェントによって個別に実証されています。

  • 反証された仮説: 検証エージェントが、欠陥の妥当性を否定する重大な矛盾証拠を明らかにしました。

  • 却下された仮説: 仮説が確立された脅威モデルと整合しないか、脆弱性として認められません。

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="Hypothesis validation workflow diagram" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Figure_7_Hypothesis_validation_workflow_di.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>図 7: 仮説検証のワークフロー図</p></figcaption>
  
</figure>


  </div>
</div>

人間による専門的知見

専門家による検証

ハーネスが確認済みの検出結果を重複排除し、リスク評価を行った後、人間の専門家による厳格なレビューを行い、分析を継続します。Mandiant は、エクスプロイトを動的に再現し、概念実証(POC)コードを実行することで、AI の想定が正確であるか、また攻撃パスを阻害する未知の補完的コントロールが存在しないかを確認し、デュー デリジェンスを徹底しています。

検証が完了すると、コンサルタントは AI が生成した検出結果を自身の専門的な分析と統合し、正式な開示に向けた準備を整えます。逆に、この動的テストフェーズをクリアできなかった検出結果は破棄されます。

同様の脆弱性発見ハーネスの実装を検討しているネットワーク防御担当者の方には、検出結果を手動で検証することをおすすめします。

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="Human-in-the-loop handover diagram" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Figure_8_Human-in-the-loop_handover_diagra.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>図 8: 人間参加型ハンドオーバーの図</p></figcaption>
  
</figure>


  </div>
</div>

蒸留された知識

人間参加型の検証によって、確認された検出結果の偽陽性を効果的に最小限に抑えることはできますが、依然として偽陰性への対処も必要です。

AI エージェントが脆弱性を見逃していないかどうかを判断するために、Mandiant の専門知識を分析パイプラインに直接注入するルールベースのアプローチを設計しました。これは、スキル エンジニアリングのコンセプトと同様に、コンサルタントの集合知から抽出された高度に専門化されたプロンプトを使用します。

この人間の知性を AI 主導の分析に直接統合することで、結果の精度が大幅に向上します。このナレッジ システムのモジュール性とスケーラビリティを維持するため、ソフトウェア ドメインを最上位とし、その下に言語、フレームワーク、脆弱性という 3 つの主要なルールカテゴリを配した階層構造を採用しました。

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="Agentic rule system hierarchy" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Figure_9_Agentic_rule_system_hierarchy.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>図 9: エージェント ルール システムの階層</p></figcaption>
  
</figure>


  </div>
</div>

フレームワークと言語のルールはパイプライン全体に適用され、対象のコードベースで採用されている特定のテクノロジーに関するコンサルタントの知見をエージェントに提供します。これらのルールは、一般的なエントリ ポイントの定義パターンや固有の攻撃対象領域といった重要な詳細を網羅しており、脅威モデリングに不可欠なコンテキスト情報も併せて提供します。

対照的に、脆弱性ルールはパイプラインの最終段階でのみ適用され、特定の種類の脆弱性をどのように検出し、検証し、リスク評価すべきかを厳密に定めています。この構造化されたシステムにより、分析パイプライン全体に Mandiant の専門的知見が反映されます。しかもそれは、保守性と高度なモジュール性を備えた形で実現されています。

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="Methodology rule application diagram" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Methodology_rule_application_diagram.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>図 10: 方法論のルール適用図</p></figcaption>
  
</figure>


  </div>
</div>

成果の測定

エージェントによるコード分析パイプラインを維持し、継続的に改善するには、正確なベンチマークと評価が不可欠です。Mandiant は、オーケストレーション ハーネスのパフォーマンスを測定するための厳格な社内手法を開発しました。これにより、プロンプトの調整やルールの更新が、品質の劣化を招くことなく、データに裏付けられた改善を常に確実にもたらすようにしています。

コード分析パイプラインの進捗と有効性を評価するために、同様のベンチマーク システムを実装することをおすすめします。

ベンチマークの目標

公開されているコード脆弱性データセットは存在するものの、トレーニング データの汚染は、LLM を評価するうえでの大きな課題となっています。最新のフロンティア モデルは、すでにこれらの公開リポジトリを学習に取り込んでいる可能性があるため、モデルが脆弱性を真に推論しているのか、それとも記憶した解決策を単に呼び出しているだけなのかを判断することはほぼ不可能です。

高忠実度の評価を確保するために、Mandiant は独自の合成コードベースのスイートを開発しました。これらのカスタム ベンチマークは、ソフトウェア ドメイン、プログラミング言語、脆弱性の深さ、そして従来のモノリスから最新のマイクロサービスに至るアーキテクチャまで、多岐にわたる分野を網羅しています。

特筆すべきは、Mandiant のセキュリティ コンサルタントが、注入されたすべての脆弱性を手動で検証し、実際に到達可能で動的に悪用可能であることを担保している点です。ハーネスとその基盤となるプロンプトをチューニングする際には、厳格なレビュー プロセスを徹底し、AI がこれらのベンチマーク コードベースに過学習するのを能動的に防止しています。

ベンチマークの採点

Mandiant の採点プロセスでは、AI による評価と、専門家による人間参加型のレビューを組み合わせています。ハーネスがベンチマーク ディレクトリを分析すると、出力は専用の採点エージェントに渡されます。この採点エージェントは、パイプラインの検出結果をグラウンド トゥルース データセットと照らし合わせて評価します。そこでは、曖昧な意味的類似性に頼るのではなく、脆弱性の正確な一致を厳格に求めます。

その後、採点パイプラインは分岐してエッジケースを処理します。

  • 偽陽性のトリアージ: グラウンド トゥルースにマッピングされないハーネスの検出結果は、セカンダリ エージェントにルーティングされ、偽陽性か正当な脆弱性かが確定的に分類されます。

  • 重複の解消: パイプラインが単一のグラウンド トゥルースの問題にマッピングされる複数の検出結果を生成した場合、別のエージェントがそのクラスタを分析し、検出結果が重複しているかどうかを判定します。

最後に、人間の専門家が採点済みデータを手動で確認することで、AI による判定の精度を検証します。Mandiant は、ハーネスのメジャー リリースごとに、複数のドメインとアーキテクチャにわたってこの厳格なテストサイクルを実施しています。その際、LLM 固有の非決定性を考慮し、結果を平均化することで精度の安定を図っています。

フレームワークと言語のルールはパイプライン全体に適用され、対象のコードベースで採用されている特定のテクノロジーに関するコンサルタントの知見をエージェントに提供します。これらのルールは、一般的なエントリ ポイントの定義パターンや固有の攻撃対象領域といった重要な詳細を網羅しており、脅威モデリングに不可欠なコンテキスト情報も併せて提供します。

対照的に、脆弱性ルールはパイプラインの最終段階でのみ適用され、特定の種類の脆弱性をどのように検出し、検証し、リスク評価すべきかを厳密に定めています。この構造化されたシステムにより、分析パイプライン全体に Mandiant の専門的知見が反映されます。しかもそれは、保守性と高度なモジュール性を備えた形で実現されています。

<div class="article-module h-c-page">
  <div class="h-c-grid">


<figure class="article-image--large
  
  
    h-c-grid__col
    h-c-grid__col--6 h-c-grid__col--offset-3
    
    
  ">

  
  
    
    <img alt="Benchmarking process diagram" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Figure_11_Benchmarking_process_diagram.max-1000x1000.png" />
    
    </a>
  
    <figcaption class="article-image__caption "><p>図 11: ベンチマーク プロセスの図</p></figcaption>
  
</figure>


  </div>
</div>

まとめ

ソフトウェア開発パイプラインのセキュリティ確保は、現代の企業防衛における極めて重要な課題となっています。Mandiant の継続的な調査により、防御者は敵対的 AI の急速な能力向上への対応において、極めて困難な課題に直面していることが明らかになっています。

こうした新たな脅威に対抗するには、コード パイプラインの保護が最新の防御戦略における不可欠な要素でなければなりません。手動によるソースコード レビューでは AI のスピードに追いつけず、従来のスキャン エンジンでは、最新のソフトウェアに潜む広範な脆弱性を常に見逃してしまいます。

しかし、このハーネスの成功は、防御者が敵対的 AI に対して再び優位に立てることを実証しています。専門家が定義したハーネスにフロンティア モデルを組み込むことで、防御者は定型的な脆弱性の検出を自動化できます。

こうした定型的な検出結果を処理することで、ソースコードの可視性はスケーラブルな防御へと進化します。これにより、コンサルタントなどの防御者は単純作業から解放され、複雑な欠陥の分析に完全に専念できるようになります。このハーネスを構築し、改良を重ねるなかで確信したのは、AI の真価は、人間の専門知識を何倍にも高めるマルチプライヤーとして活用したときにこそ発揮されるということです。

Mandiant のツールは、スポット的な評価や、プロアクティブで詳細な脆弱性調査を目的として構築されました。一方で、最近のブログ投稿では、CodeMender が AI による継続的なモニタリングをソフトウェア開発と脆弱性管理に提供し、このツールをいかに補完するかについて解説しています。これらの機能をすぐにデプロイして活用したい組織のために、Google AI Threat Defense は常時稼働のプラットフォームを提供しています。これには CodeMender のコードスキャンと修復機能が含まれており、システムの分析、脅威の優先順位付け、脆弱性へのパッチ適用、そして新たな攻撃の継続的な監視を可能にします。標的を絞った深層分析を行う AVDH と、CodeMender による継続的なスキャンを組み合わせることで、2 層構造の防御戦略を実現します。このアプローチでは、複雑な攻撃チェーンに対してスポット的な修復を活用しながら、開発ライフサイクル全体にわたって継続的な可視性を維持します。

実際の環境でのパイプライン構築とデプロイの詳細にご興味はありませんか?2026 年 9 月 15 日~16 日にワシントン D.C. で開催されるサイバー防御サミットにぜひご参加ください。Mandiant は「How Mandiant Orchestrates Gemini to Find Zero-Days Before Adversaries」(Mandiant が Gemini をオーケストレートして、敵対者よりも先にゼロデイを見つける方法)というプレゼンテーションを行います。ライブデモの実演、エージェント ワークフローの導入から得られた知見の共有、AI による攻防能力の未来についての議論などをお届けします。サミットには、こちらからご登録ください。

- Google Threat Intelligence Group