Skip to content
>GLB_
Go back

Where Agents Schema fits in a dbt → Snowflake → Looker pipeline

// data engineering · dbt

TL;DR

Agents Schema is not a new step in your build. It’s a CI sidecar that reads the artifacts your pipeline already produces (manifest.json, *.lkml, semantic view names) and writes them as metadata tables into an AGENTS schema in the same warehouse. Worth it if agents query Snowflake directly. Mostly noise if everyone consumes data through Looker.

The problem

A question that keeps coming up in dbt circles goes roughly like this:

Our process is: build dbt SQL models (including semantic views via the dbt Semantic View package, as an experiment), surface the tables/views/semantic views in Snowflake, then generate the LookML files from Snowflake. Where would Agents Schema fit, and what are the trade-offs?

The confusion is understandable. Agents Schema touches all three layers — dbt, the warehouse, the BI semantic layer — so it’s easy to read it as a replacement for one of them. It isn’t. It replaces none of them.

What I tried

I read the README, the SPEC and the setup guides, and mapped each stage of that pipeline to what the project actually ships.

What it is, in one sentence

Agents need context that table schemas don’t carry — what a table is for, who owns it, what produced it, how it relates to other tables. Agents Schema puts that context in the warehouse itself, in a standard AGENTS schema, so anything that can run SQL can find it. The project describes itself as closest in spirit to information_schema, but extensible across providers.

The mapping

Agents Schema fit map for a dbt → Snowflake → Looker pipeline

Pipeline stageAgents Schema jobWhat lands in AGENTS
1. dbt modelsagents-schema-dbt.yml (reads target/manifest.json)DBT_MODEL, DBT_COLUMN, DBT_DEPENDENCY
2. Semantic views in Snowflakeagents-schema-snowflake-semantic.ymlpointer rows in ROOT (semantic_view/<fqn>)
3. LookMLagents-schema-looker.yml (parses *.lkml)LOOKML_VIEW, LOOKML_DIMENSION, LOOKML_MEASURE, LOOKML_EXPLORE

The build path doesn’t change. The sync jobs run beside it.

Wiring it up

Every workflow authenticates with a single GitHub Actions secret, WAREHOUSE_CREDENTIALS. For Snowflake, the dbt setup guide recommends key-pair auth:

type: snowflake
account: abc123
user: AGENTS_SCHEMA_BOT
warehouse: COMPUTE_WH
database: ANALYTICS
role: TRANSFORMER
private_key_pem: |
  -----BEGIN ENCRYPTED PRIVATE KEY-----
  ...
  -----END ENCRYPTED PRIVATE KEY-----
private_key_passphrase: your-passphrase

Then one workflow file covering all three stages:

name: Agents Schema

on:
  workflow_dispatch:
  push:
    branches: [main]

jobs:
  agents-schema-dbt:
    uses: dbt-labs/agents_schema/.github/workflows/agents-schema-dbt.yml@v0
    with:
      dbt-project-dir: dbt_project
    secrets:
      WAREHOUSE_CREDENTIALS: ${{ secrets.WAREHOUSE_CREDENTIALS }}

  agents-schema-snowflake-semantic:
    uses: dbt-labs/agents_schema/.github/workflows/agents-schema-snowflake-semantic.yml@v0
    with:
      semantic-views: |
        ANALYTICS.FINANCE.REVENUE
    secrets:
      WAREHOUSE_CREDENTIALS: ${{ secrets.WAREHOUSE_CREDENTIALS }}

  agents-schema-looker:
    uses: dbt-labs/agents_schema/.github/workflows/agents-schema-looker.yml@v0
    with:
      lookml-dir: lookml
    secrets:
      WAREHOUSE_CREDENTIALS: ${{ secrets.WAREHOUSE_CREDENTIALS }}

Two gotchas from the docs:

What an agent sees

Discovery starts at ROOT, the provider registry:

SELECT provider, key
FROM AGENTS.ROOT
ORDER BY provider, key;

Semantic view pointers:

SELECT key, content
FROM AGENTS.ROOT
WHERE provider = 'snowflake_semantic'
  AND key LIKE 'semantic_view/%';

And the interesting one for this pipeline — tracing a LookML view back to the dbt model behind it. This is the cross-source query from the SPEC:

SELECT
  v.name AS lookml_view,
  v.sql_table_name,
  m.unique_id AS dbt_model_id,
  m.name AS dbt_model,
  m.schema_name,
  m.description AS dbt_description
FROM AGENTS.LOOKML_VIEW v
LEFT JOIN AGENTS.DBT_MODEL m
  ON LOWER(v.sql_table_name) LIKE '%' || LOWER(m.schema_name) || '.' || LOWER(m.name) || '%';

The SPEC is upfront that this join is heuristic, since sql_table_name is free-form LookML text. When LookML is generated from Snowflake objects, sql_table_name should be clean fully qualified names, so the heuristic has a better chance of matching than in hand-written LookML.

What actually worked

The answer to “where does it fit” is: after each stage, not between them. Here’s the trade-off sheet.

Pros

Cons

Decision heuristic

If…Then
Agents query Snowflake directly and need to discover what exists across dbt, semantic views and LookMLAdd it
All consumption goes through Looker (and its own AI features)Skip it
The only agent use case is writing dbt codeSkip it; use dbt artifacts / dbt MCP
You depend on semantic views being fully describedWait — pointer-only today

Key takeaways

References


26 Sep 2026 · #dbt #snowflake #agents

GLB_


Share this post:

Related Posts


Previous Post
Debugging AWS Glue Job Bookmarks Not Working as Expected
Next Post
Why Athena Returns No Rows on Partitioned Tables (and How to Fix It)