agentleFS
GoogleKnown publishergoogle/adk-samples/core/python/rag-agent-search/AGENTS.md

adk-samples / rag-agent-search

AGENTS.md11k starsChanged 45 days agoApache-2.0View on GitHub

A clone-and-study RAG agent grounded on Agent Platform Search (Discovery Engine). Drop documents in a GCS bucket and a managed Data Connector ingests, chunks, embeds, and indexes them — the agent answers over that data store with almost no ingestion code. The interesting part is not the agent (a thin wrapper around one search tool); it's the Terraform + data-connector plumbing. - The user wants a RAG agent without building/maintaining an ingestion pipeline (the managed connector handles chunking + embeddings).…

  • Reads credentials

1 other project uses a version of this.

Adopted by

Steady: 0 new projects took it in the last 4 weeks, none the 4 weeks before.thin data

Week of Sep 13: 0 new projectsWeek of Sep 20: 0 new projectsWeek of Sep 27: 0 new projectsWeek of Oct 4: 0 new projectsWeek of Oct 11: 0 new projectsWeek of Oct 18: 0 new projectsWeek of Oct 25: 0 new projectsWeek of Nov 1: 0 new projects
Sep 2026Oct 2026Nov 2026
New projects taking a version of this file each week, over the 8 weeks our latest run read: only 0 in all, so this is a hint, not a trend.

Most recently taken up by

Who's talking about google/adk-samples

The biggest 5 of 32 mentions linking to the repository that our crawl found. Each line is their own headline.

See all 32

Talked about on GitHub, Bluesky, Hacker News and Stack Overflow (32 times).

On GitHub · 23

18 more on GitHub

On Bluesky · 4

The file

We split this AGENTS.md into the rules it gives an agent

2 rules. About 0 are common, 0 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈0

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Minimum Score: not enforced — custom_response_quality graded 1–5 (aim ≥ 4)

    line 23
  2. Very specific:

    The data store ID and collection are auto-generated: After make setup-infra, copy the data_store_id and data_store_collection Terraform …

    line 114

≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
AGENTS.md

RAG Agent — Agent Platform Search

Intent

A clone-and-study RAG agent grounded on Agent Platform Search (Discovery Engine). Drop documents in a GCS bucket and a managed Data Connector ingests, chunks, embeds, and indexes them — the agent answers over that data store with almost no ingestion code. The interesting part is not the agent (a thin wrapper around one search tool); it's the Terraform + data-connector plumbing.

When To Use

  • The user wants a RAG agent without building/maintaining an ingestion pipeline (the managed connector handles chunking + embeddings).
  • Source documents are unstructured files (PDF/HTML/TXT) in Cloud Storage.
  • The user wants a Discovery Engine grounding example with reproducible Terraform.

Eval

  • Scenarios Path: tests/eval/datasets/ (config: tests/eval/eval_config.yaml)
  • Minimum Score: not enforced — custom_response_quality graded 1–5 (aim ≥ 4)

End-to-end flow

docs uploaded to GCS bucket
   -> GCS Data Connector (setUpDataConnectorV2, data_schema="content")
   -> auto-created Discovery Engine data store (managed ingest + embeddings)
   -> agent queries it at runtime via VertexAiSearchTool(data_store_id=data_store_path)

You never write chunking/embedding code: the Data Connector ingests and indexes unstructured files for you. The price is a fiddly control plane (auto-generated IDs, collection placement, LRO polling) — which is exactly what the Terraform and the scripts/ wrappers exist to tame.

Most interesting files to study (in order)

Terraform + data connector (the bulk of the logic)

  1. infra/terraform/agent_platform_search.tf — the heart of the recipe. Shows the whole pattern: a google_storage_bucket for docs, a null_resource.data_connector whose create/destroy local-exec provisioners shell out to Python scripts, a data "external" "data_store_id" source that reads back the auto-generated data store, and a google_discovery_engine_search_engine built on top. Note how the search engine's collection_id and data_store_ids come from the data.external result, not hard-coded values.
  2. infra/terraform/scripts/setup_data_connector.py — what the create provisioner runs. Idempotent (checks getDataConnector first), then calls setUpDataConnectorV2 with a collectionId, an entity named documents, and schema-specific params (content → CONTENT_REQUIRED). Then polls the long-running operation. This is the canonical "create a managed GCS→Search ingestion connector via the REST API" recipe.
  3. infra/terraform/scripts/get_data_store_id.py — solves the auto-generated ID problem. The connector creates a data store whose ID and collection you don't choose. This script reads the connector and parses the data store's full resource name to return BOTH data_store_id and collection_id as JSON, which Terraform consumes through the data.external data source. Study this together with file #1 to see the Terraform↔script handshake.
  4. infra/terraform/datastore_outputs.tf — the bridge between infra and the running agent. Exposes data_store_id, data_store_collection, and a ready-to-paste data_store_path. You copy these into .env so the agent targets the right (auto-generated) data store.
  5. infra/terraform/scripts/delete_data_connector.py — the destroy-time provisioner. Deletes the whole collection (and its data store) so terraform destroy is clean. Good example of wiring teardown into a null_resource's when = destroy provisioner via self.triggers.
  6. infra/terraform/scripts/start_connector_run.py — a standalone helper (not wired into Terraform) that triggers an immediate ImportDocuments run (reconciliationMode: FULL) and prints a console URL. Use it to force a sync instead of waiting for the periodic refresh.

Terraform config & providers

  1. infra/terraform/apis.tf & providers.tf — enables the required services (note discoveryengine.googleapis.com and the vertex_sa service identity) and declares providers. Note the billing_override aliased provider with user_project_override = true, used by the search engine for Discovery Engine quota attribution.
  2. infra/terraform/variables.tf & agent_platform_search_variables.tf & vars/env.tfvars — the knobs: project_id, project_name (drives resource naming), region, data_store_region (default global), data_connector_refresh_interval, and data_connector_data_schema.

Agent (thin layer — read last)

  1. app/agent.py — how the runtime consumes the infra. Loads .env, builds data_store_path from DATA_STORE_REGION / DATA_STORE_COLLECTION / DATA_STORE_ID env vars and hands it to create_search_tool. The agent itself is a single Agent with one tool.
  2. app/retrievers.py — create_search_tool() returns a real VertexAiSearchTool bound to the data store, or a mock function when INTEGRATION_TEST=TRUE. The seam that lets tests run without live Search.

Data handling

  • Ingestion is fully managed. The GCS Data Connector (data_schema = "content") ingests unstructured files (PDF, HTML, TXT, …) — one document per file, IDs derived from the file URI — and Discovery Engine handles chunking/embeddings/indexing. No pipeline code in this recipe.
  • Docs bucket: ${project_id}-${project_name}-docs. Drop files here; the connector syncs them on its data_connector_refresh_interval (default daily, 86400s), or run start_connector_run.py to sync immediately.
  • Other schemas are supported by setup_data_connector.py (document/NDJSON, csv, custom) via the --data-schema flag / data_connector_data_schema variable.
  • Sample docs: sample_data/ ships a small fictional knowledge base; make upload-sample-data && make ingest loads it so you can query right away.

Gotchas / things to know

  • The data store ID and collection are auto-generated. After make setup-infra, copy the data_store_id and data_store_collection Terraform outputs into .env — the defaults in .env.example / agent.py may not match what the connector created.
  • The data store lives in <project_name>-collection, not default_collection. That's why get_data_store_id.py resolves the real collection from the API instead of assuming a value.
  • make setup-infra shells out to uv run scripts from Terraform provisioners, so uv must be installed on the machine running terraform apply.
  • Tests need credentials. tests/integration/test_agent.py makes a live Gemini call and is skipped without ADC; the retriever is mocked via INTEGRATION_TEST=TRUE (set automatically by make test).
  • Provisioner runs are not auto-retried by Terraform — connector setup polls its own LRO; re-running apply is safe because the script is idempotent.

Where to run things

Makefile targets: make setup-infra (provision), make install, make playground (local ADK web UI), make test, make lint. Eval lives under tests/eval/ (eval_config.yaml + datasets/).

Reuse (copy as-is)

  • infra/terraform/ is self-contained (it provisions the datastore only) — copy the whole directory, including scripts/, into another project. Set project_id in vars/env.tfvars (and optionally project_name, which drives every resource name). The only host requirement is uv on the machine running terraform apply (provisioners call the PEP-723 scripts via uv run).
  • There is no code coupling to app/: the agent reaches the datastore purely through the DATA_STORE_REGION / DATA_STORE_COLLECTION / DATA_STORE_ID env vars, which you populate from the Terraform outputs.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.