From omni-analytics
Discover and inspect Omni Analytics models, topics, views, fields, dimensions, measures, and relationships using the Omni CLI. Use this skill whenever someone wants to understand what data is available in Omni, explore their semantic model, find specific fields or views, check how tables join together, see what topics exist, or asks any variant of "what can I query", "what fields are available", "show me the model", "what data do we have", or "how is this data modeled". Also use when you need to understand the Omni model structure before building or modifying anything.
npx claudepluginhub exploreomni/omni-agent-skills --plugin omni-analyticsThis skill uses the workspace's default tool permissions.
Explore and understand an Omni semantic model through the Omni CLI. This is the starting point — understand what exists before building, querying, or modifying anything.
Explores Omni Analytics semantic models, topics, views, fields, dimensions, measures, and relationships via REST API. Useful for discovering available data and model structure before querying or building.
Use when exploring Honeydew semantic layer, discovering entities/fields, setting up workspace and branch context, or querying data. For creating metrics use metric-creation skill. For creating attributes use attribute-creation skill.
Inspects semantic layer views, dimensions, measures, and entities in .view.yml files using airlayer CLI. Useful for exploring available schema before building queries.
Share bugs, ideas, or general feedback.
Explore and understand an Omni semantic model through the Omni CLI. This is the starting point — understand what exists before building, querying, or modifying anything.
Tip: Start with the Shared model — it contains the curated analytics layer.
Configure the Omni CLI:
# Verify the Omni CLI is installed — if not, ask the user to install it
# See: https://github.com/exploreomni/cli#readme
command -v omni >/dev/null || echo "ERROR: Omni CLI is not installed."
# Show available profiles and select the appropriate one
omni config show
# If multiple profiles exist, ask the user which to use, then switch:
omni config use <profile-name>
API keys: Settings > API Keys (Organization Admin) or User Profile > Manage Account > Generate Token (Personal Access Token).
When unsure what operations or flags are available:
omni models --help # List all model operations
omni models <operation> --help # Show flags and positional args
Tip: Use
-o jsonto force structured output for programmatic parsing, or-o humanfor readable tables. The default isauto(human in a TTY, JSON when piped).
Explore top-down: List models → Pick a model → List topics → Inspect a topic → Explore views and fields.
omni models list
Returns models with id, name, connectionId, and modelKind (SCHEMA or SHARED). Use the SHARED model — it contains the curated semantic layer.
To also see active branches on each model:
omni models list --include activeBranches
Each model in the response will include a branches array. Each branch has an id (UUID) and name — use the id as the branchId parameter in other API calls.
Topics are entry points for querying. Each topic defines a base view and the set of joined views available.
omni models list-topics <modelId>
Returns topic names, base views, labels, and descriptions.
Get full detail including all views, dimensions, measures, relationships, and AI context:
omni models get-topic <modelId> <topicName>
The response includes:
base_view_name — the primary tableviews[] — all accessible views, each with dimensions[] and measures[]relationships[] — how views join togetherdefault_filters — filters applied by defaultai_context — instructions for Blobby (Omni's AI)For the full semantic model definition:
# All YAML files
omni models yaml-get <modelId>
# Specific file
omni models yaml-get <modelId> --filename order_items.view
# Regex filter
omni models yaml-get <modelId> --filename '.*sales.*'
# From a branch (branchId is a UUID from the list models response)
omni models yaml-get <modelId> --branchid <branchId>
The mode parameter: combined (default) merges schema + shared model; extension shows only shared model customizations.
Omni has three layers:
When exploring, use the combined view to see everything available.
Views correspond to database tables. Each has dimensions (groupable fields) and measures (aggregations).
Topics join views together into queryable units — curated starting points for analysis. A topic has a base view, joined views, default filters, and AI context.
Relationships define joins: join_from_view, join_to_view, on_sql, relationship_type (one_to_one, many_to_one, one_to_many, many_to_many), and join_type (always_left, inner, full_outer).
Field naming: view_name.field_name with bracket notation for date granularity: orders.created_at[week].
"What data do we have about X?" — List topics → inspect the most relevant one → review views and fields.
"How do these tables relate?" — Inspect the topic's relationships[] — check join_from_view, join_to_view, on_sql, and relationship_type.
"What measures are available for Y?" — Inspect the topic containing view Y → review the measures[] array with aggregate_type and sql definitions.
yaml-getUse this pattern only when normal exploration comes up short — the user names a specific view and it's absent from the yaml-get or get-topic response, or a relationship references a view that doesn't appear. If yaml-get returned what you expected, skip this section.
Why it happens: yaml-get only returns views from currently-loaded schemas. If a schema is offloaded or inactive, its views won't show up. The get-schemas call surfaces all schemas the connection knows about — including offloaded and inactive ones — so it's the right next step before telling the user "not found."
Two-step recovery:
# 1. List every schema (loaded, offloaded, and inactive)
omni models get-schemas <modelId>
# → {"schemas": ["ANALYTICS", "PUBLIC", "STAGING", ...]}
# 2. If the target schema is in the list, load just that schema
omni models yaml-get <modelId> --includeschemas PUBLIC
If the schema isn't in the list at all, this isn't a lazy-load issue — the connection likely doesn't have access or the schema isn't synced. Check with a Connection Admin.
Rules for --includeschemas:
--branchid <id> to yaml-get or --branch-id <id> to get-schemas (the flag names differ per command — this matches the API's underlying casing).Calculation fields in the model use a different format than regular dimensions/measures. The field key is calc_name and the expression property is sql_expression — not name/sql.
Assess the blast radius of a field migration or removal before pushing changes to dbt:
omni-model-builder where the field is removed or renamedomni models content-validator-get <modelId> --branch-id <branchId>
This returns all dashboards and tiles with broken references to the removed field.
omni models yaml-get <modelId> --filename '.*'
Search the response for the field name to find references in other views, topics, and calculated fields.
Do NOT paginate documents and check queries individually — the content validator does this for you in one call.