dataflows-save-as-authoring-cli

Assess and execute Power BI dataflow Gen1 to Gen2.1 save-as upgrades via CLI.

Updated Jul 14, 2026
One-click install
npx skills add https://github.com/9vantage/skills-for-fabric-clone --skill dataflows-save-as-authoring-cli-9vantage
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: dataflows-save-as-authoring-cli
Source: https://github.com/9vantage/skills-for-fabric-clone/tree/main/plugins/fabric-authoring/skills/dataflows-save-as-authoring-cli
Command: npx skills add https://github.com/9vantage/skills-for-fabric-clone --skill dataflows-save-as-authoring-cli-9vantage

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes references (resource) components.

What problem does it solve? Migrating Power BI Gen1 dataflows to Gen2.1 CI/CD format is risky without knowing which dataflows are safe to upgrade. This Skill scans workspaces or entire tenants for Gen1 dataflows, evaluates seven risk signals (BYOSA storage, DirectQuery, linked entities, ownership, and more), and executes guarded save-as operations through the saveAsNativeArtifact API. ## Core Features & Use Cases - Gen1 Discovery: Scan a single workspace or the entire tenant (Admin API) to inventory dataflows and classify them by generation using the Power BI REST API. - Readiness Assessment: Evaluate seven risk signals per dataflow and produce a Save-As Readiness Snapshot in both markdown and JSON, classifying each dataflow as Safe, Manual followups, or Blocked. - Guarded Save-As Execution: Invoke the saveAsNativeArtifact API with correct API audiences, file-based request bodies, ownership checks, and idempotency safeguards to create upgraded Gen2.1 copies while preserving the original Gen1 dataflow. - Use Case: A Fabric administrator needs to modernize 50 Gen1 dataflows across a tenant. The Skill scans all workspaces, flags three dataflows blocked by BYOSA storage and DirectQuery, and saves the remaining safe dataflows as Gen2.1 copies in topological order. ## Quick Start Ask the assistant to scan a named workspace for Gen1 dataflows and produce a save-as readiness snapshot before upgrading them to Gen2.1.

Frequently Asked Questions about dataflows-save-as-authoring-cli

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I migrate a Power BI Gen1 dataflow to Gen2?

Use the saveAsNativeArtifact API via az rest to create an upgraded Gen2.1 CI/CD copy while preserving the original Gen1 dataflow. First run a readiness scan to check risk signals like BYOSA storage and DirectQuery, then POST to the saveAsNativeArtifact endpoint with a file-based JSON body.

How to find all Gen1 dataflows in a Power BI workspace or tenant?

Call the Power BI REST API dataflows endpoint and filter on the generation property, where generation equals 1 indicates Gen1. For tenant-wide discovery, use the Admin API dataflows endpoint and treat dataflows with a non-null modelUrl as Gen1.

What blocks a dataflow save-as to Gen2.1 CI/CD?

Three blockers prevent save-as: BYOSA custom ADLS Gen2 storage detected via modelUrl, DirectQuery partitions which Gen2 CI/CD does not support, and insufficient permissions where the caller is not the dataflow owner or a workspace Contributor.

Why does saveAsNativeArtifact return saveAsRequest is a required parameter?

This error occurs when the JSON body is passed inline to az rest, which wraps the payload in an extra envelope on some platforms. Write the request body to a file and pass it with --body @file.json instead.

Does saveAsNativeArtifact delete the original Gen1 dataflow?

No, saveAsNativeArtifact creates a new Gen2.1 copy and preserves the original Gen1 dataflow. The Gen1 artifact should only be deleted after post-save-as validation passes and the user explicitly approves deletion.

Is saveAsNativeArtifact safe to retry after a failed batch run?

No, the API is not idempotent and creates a new artifact on every call, so retries produce duplicate copies. Check whether a Gen2 artifact with the intended name already exists before calling, or use a unique timestamped displayName per run.