Tuesday, April 28, 2026

Connecting Copilot Studio to Snowflake: Why Agent Architecture Matters More Than the Connector

Connecting Copilot Studio to Snowflake isn’t the hard part. (ok well its more complex than most, but not impossible)

The hard part is doing it well.

It’s tempting to wire up a connector, let the agent generate SQL, and hope the model figures things out. Sometimes that works. Often, it doesn’t. You end up with inconsistent responses, brittle queries, and a growing collection of 422 errors that all trace back to the same root cause: the architecture was never designed for how agents actually reason.


Copilot Studio Meets Snowflake: A Working Log on Agent Strategy

This post is about implementing an agent strategy for accessing Snowflake data in Copilot Studio — not just wiring up a connector and hoping the SQL gods are merciful.

There are three valid patterns to compare, and they're easy to conflate even though they behave very differently in production:

  1. Direct SQL connector — the Copilot agent generates SQL and sends it through the Snowflake connector.

  2. Cortex Analyst (direct API call) — Copilot calls Cortex Analyst, which generates SQL from a semantic model.

  3. Snowflake Data Agent (Cortex Agent) — Copilot calls a Snowflake Cortex Agent, which orchestrates Analyst, Cortex Search, and any custom tools you've wired up.

The shorthand: A is “Copilot writes SQL.” B is “Snowflake writes SQL from a semantic model.” C is “Snowflake runs an agent that decides what to do, and one of those things might be writing SQL.”

The architecture choice matters because it shapes user experience: response consistency, how well ambiguous questions get handled, and how often the assistant “wanders” into creatively-wrong SQL. Picking the right pattern measurably reduces 422 errors and keeps answers grounded enough that your users stop emailing you screenshots at 9pm.

This is a working log. Practical, architecture-focused, reusable. No winner crowned — just trade-offs surfaced, with real evaluation data to back them up.


Who this post is for

  • Copilot Studio builders deciding between “simple now” and “scalable later”
  • Data platform teams supporting Snowflake-backed agent scenarios
  • Architects balancing reliability, governance, and how fast they can ship without regretting it in Q3

The three patterns, in detail

Option A — Standard SQL connector

  1. User asks a question in Copilot Studio

  2. Agent generates SQL

  3. Snowflake connector executes it

  4. Agent summarizes the results

The agent does the thinking. Snowflake just runs what it's told.

How it's wired: Option A uses the native Snowflake connector in Power Platform. The connector is purpose-built to execute SQL — that's its design. The Copilot Studio agent generates a query string and hands it to the connector's “Execute query” action. There's no middleware, no custom code, no semantic layer between the agent and Snowflake. That's the appeal: zero plumbing. It's also exactly why this option is the most fragile — every column name and join the agent guesses has to land perfectly, because nothing downstream is going to catch it.

Option B — Cortex Analyst (direct API call)

  1. User asks a question in Copilot Studio

  2. The flow calls the Cortex Analyst REST API with a semantic model

  3. Analyst generates SQL grounded in the semantic YAML, executes it, returns results

  4. Copilot summarizes the response

Snowflake does the text-to-SQL. Copilot still owns the conversation, the synthesis, and any orchestration.

How it's wired: Option B uses a Power Automate Agent Flow that calls a Snowflake stored procedure:

CALL COPILOT_DEMO.PUBLIC.CALL_CORTEX_FOOTBALL_AGENT('<prompt>');

The procedure wraps the Cortex Analyst invocation on the Snowflake side. The flow takes the user's natural-language prompt, passes it to the procedure, and returns the result back to Copilot Studio. Why this design: Cortex Analyst's REST API isn't directly exposed as a first-class action in the Power Platform connector catalog. Wrapping the call in a stored procedure means the standard Snowflake connector can invoke it, and the heavy lifting — semantic-model lookup, SQL generation, execution — stays inside Snowflake where it belongs. The Agent Flow is essentially a thin pipe: prompt in, grounded result out.

Option C — Snowflake Data Agent (Cortex Agent)

  1. User asks a question in Copilot Studio

  2. The flow calls a Snowflake Cortex Agent

  3. The Agent decides which tools to use — Analyst for structured data, Cortex Search for unstructured, custom tools for the rest — and runs a multi-step plan if needed

  4. Copilot returns the grounded response text

How it's wired: Option C calls a custom HTTP endpoint instead of going through a Power Platform connector:

POST https://[instance].azurewebsites.net/api/ask



The endpoint is a lightweight Azure Web App that proxies between Copilot Studio and the Cortex Agent's REST API. Why this design: the Cortex Agent API needs request signing, authentication handling, and — critically — conversation state across multi-step reasoning. Doing all of that inside Copilot Studio's connector framework gets messy fast. Centralizing it in an Azure-hosted middleware means Copilot Studio just makes a clean HTTP POST with the prompt, and everything else (auth, agent session management, tool orchestration, response shaping) is handled server-side. 

Bonus: the same /api/ask endpoint can be reused by Teams bots, web apps, or anything else that can speak HTTP — so the Agent investment isn't locked to Copilot Studio.

The semantic model: shared between B and C

This is the bit most teams overlook on day one and pay for later.

Heads up: Options B and C share the same semantic model. Both Cortex Analyst (Option B) and the Snowflake Data Agent (Option C) read from the same semantic YAML and the same set of business-friendly views. The Agent in Option C uses Analyst as one of its tools — so any improvement to the semantic model lifts both options at once.

The practical implication: invest in defining metrics, dimensions, and join paths once, adopt B today, graduate to C later — and you don't redo that work. Option A doesn't benefit from the semantic model at all because it generates SQL straight off the raw schema. Which is exactly why it's the most fragile of the three.

The semantic views are doing real work for B and C:

  1. Reducing join ambiguity (no more “which customer_id did you mean?”)

  2. Presenting business-friendly metrics and names instead of raw column salad

  3. Making text-to-SQL repeatable across paraphrased prompts

  4. Lowering schema and column hallucination risk

If your Cortex answers feel mediocre, the semantic model is usually where to look first.

Real-world scenario

  • Domain: football ticketing analytics

  • Why this scenario: heavy joins, repeated aggregations, and the kind of natural-language ambiguity that exposes weak text-to-SQL fast

  • Evaluation prompt set: 30 natural-language questions imported from CSV using Agent Evaluation in Copilot Studio.

  1. Same Snowflake environment and connector auth model

  2. Same dataset and schema

  3. Same 30-prompt evaluation set

  4. Same evaluation process in Copilot Studio

  5. Options B and C used the same semantic model

Out of scope (so nobody emails me about it): large-scale performance benchmarking, multi-language testing, and unstructured search. All earmarked for the next iteration.

Results: 30 questions, three patterns

PatternSuccess rate422 errorsOther errors
A: Direct SQL Connector54% (16/30)14 (all failures)0
B: Cortex Analyst64% (19/30)110 (accuracy)
C: Cortex Agent67% (20/30)010 (accuracy)

A few things jump out from the numbers.

Option A failed loudly. Every single failure was a 422 — the agent generated SQL that didn't line up with the database schema. Wrong table names, wrong column names, joins that don't exist. From a user's perspective: “the assistant is broken.”

Option B nearly eliminated 422s. The semantic model did its job — Analyst grounded SQL generation against curated views, so structural errors collapsed from 14 down to 1. The remaining failures shifted to accuracy problems: the query ran fine, but the answer didn't quite match what the user meant. That's a much better failure mode — you're now arguing about interpretation, not whether the agent can speak SQL.

Option C eliminated 422s entirely and edged accuracy up. The Cortex Agent's tool routing handled a few prompts that Analyst alone couldn't, which produced the 3-point lift. The remaining failures are all accuracy-related — the same class as Option B — which suggests the next round of improvement should target the semantic model and prompt rubric, not the orchestration pattern.

The headline insight: the semantic model didn't just lift accuracy, it eliminated the failure mode that made Option A feel unreliable. Going from 14 → 1 → 0 structural errors changes the user's perception of trust far more than the success-rate jump suggests.

Pros and cons, side by side

Option A — Standard SQL Connector

Pros

  • Fastest path to a working demo
  • Lowest latency (one hop, no extra services)
  • No new Snowflake objects required
  • No Cortex credits in the bill
  • Full transparency — the agent's prompt is the whole story

Cons

  • Highest hallucination risk on table and column names
  • 422 errors when generated SQL is malformed (in our test: every failure was one of these)
  • Inconsistent answers across rephrased questions
  • No semantic layer means no shared definition of “active customer,” “revenue,” etc.
  • Logic is trapped inside the Copilot agent — not reusable elsewhere
  • Multi-step questions tend to fall apart

Option B — Cortex Analyst

Pros

  • Semantic model enforces business metric definitions
  • Noticeably better text-to-SQL accuracy than agent-generated SQL
  • Near-elimination of 422 errors (1 of 11 failures in our test)
  • More consistent across paraphrased prompts
  • Governance and definitions live in version-controlled YAML
  • Predictable single-purpose surface — easy to reason about

Cons

  • Single-shot only — no tool routing, no follow-up reasoning
  • No native unstructured/document search
  • Requires building and maintaining the semantic model (real work, not a wizard click)
  • Copilot still owns response synthesis, so you're still prompt-engineering
  • Cortex consumption shows up on the Snowflake bill
  • Questions that need more than one query won't land

Option C — Snowflake Data Agent (Cortex Agent)

Pros

  • Multi-tool orchestration: Analyst + Cortex Search + custom tools in one place
  • Handles multi-step questions and follow-ups without bespoke flow logic
  • Zero structural (422) errors in our test
  • Blends structured and unstructured answers naturally
  • Conversation logic is centralized and reusable across surfaces (Copilot, Teams, web, Snowflake Intelligence)
  • Best end-user feel for ambiguous prompts — fewer “did you mean…” iterations

Cons

  • Most setup of the three (semantic model, agent config, tool definitions, permissions)
  • Two layers of orchestration means two layers of debugging when something goes sideways
  • Highest latency — more hops, sometimes multi-step plans
  • Highest Snowflake-side cost (Agent + Analyst + Search credits stack)
  • Less direct control from Copilot Studio over how individual questions are handled
  • Capability surface is still evolving — expect changes

When to pick which

A gut-check guide, not a verdict:

SituationLean toward
Demo or POC, narrow schema, predictable usersA
One well-defined analytics domain, repeat business questions, need consistent metricsB
Mixed structured + unstructured, multi-step questions, multiple consuming surfacesC
Heavy governance needs and a dedicated data platform teamB or C
“We need this working by Friday”A, then plan the migration

Wrapping up

A few takeaways from the build:

  • The semantic model is the leverage point. Going from no semantic layer (A) to a curated one (B) cut structural errors by 93%. That's a bigger user-experience win than the 10-point accuracy bump.

  • B and C share infrastructure. If you build the semantic model right, the migration from B to C is mostly orchestration plumbing — not a rewrite.

  • C earns its setup cost when prompts get messy. On well-shaped questions, B and C are close. On ambiguous, multi-step, or mixed structured/unstructured questions, the Agent's tool routing pulls ahead.

  • Accuracy errors are a different conversation. Once you eliminate 422s, the remaining gap is about how well your semantic model represents the business — not the orchestration pattern.

  • The integration mechanism scales with the architecture. Connector → stored procedure via Agent Flow → Azure-hosted HTTP middleware. Each step adds capability, and each step adds something else to debug when things break.

Microsoft recently shipped Snowflake as a knowledge source for Copilot Studio (public preview, with GA reached on May 19, 2025). Makers point Copilot Studio at specific Snowflake tables, and the platform handles the schema awareness, query generation, joins, and filters in the background — no SQL written by hand, no semantic YAML required to get started, and the data never leaves Snowflake. Auth is OAuth via Microsoft Entra ID, so governance stays clean.

Why this matters for the three patterns above: the knowledge-source path effectively gives the agent schema grounding for free. That's the single biggest factor that made Option A unreliable in our test — the agent was guessing column names against a raw schema with no help. With Snowflake-as-knowledge plugged in, that guesswork shrinks dramatically, and the lift compounds with whatever pattern you pick on top.

So if I were starting a Copilot-on-Snowflake build today, I'd wire up Snowflake as a knowledge source first — it's the lowest-friction way to raise the floor on accuracy across every option — and then layer Cortex Analyst (B) or the Cortex Agent (C) on top as the workload demands more semantic depth or multi-tool reasoning. The semantic model is still where the long-term leverage lives; the knowledge source just gets you closer to "useful" on day one.

Useful resources


Sunday, March 1, 2026

Analyze Copilot Credit Use in PowerBI

Build a Multi-Environment Copilot Credits Dashboard in Power BI



If you’re managing AI workloads across the Power Platform—AI Builder, Copilot Studio agents, Power Apps, or Power Automate—you’ve probably asked the same question many teams are asking today: where are all these credits going?

It’s a fair question (driven by customer interest). Copilot Credits are the universal currency for AI consumption across Microsoft’s ecosystem, and as adoption grows, visibility becomes essential. Not just for cost management, but for understanding which environments, models, and workloads are actually driving usage.

Summary: Managing Copilot Credits Across Power Platform with Power BI

As AI adoption accelerates across the Microsoft ecosystem, Copilot Credits have become the universal currency for AI consumption across Power Platform, AI Builder, Copilot Studio agents, Power Apps, and Power Automate. A fair and increasingly common question is: where are our Copilot Credits actually going?

Microsoft provides essential guidance and reporting through the Power Platform Admin Center, AI Builder consumption reports, and Copilot Studio capacity views. These tools establish licensing rules, capacity limits, and governance guardrails. However, once organizations operate across multiple Power Platform environments—Dev, Test, Production, regional, or business‑unit‑specific—credit consumption becomes fragmented. Usage data lives inside Dataverse tables in each environment, making it difficult to understand trends, compare environments, or explain spend to finance and leadership.

To address this gap, this project introduces a practical Power BI dashboard that aggregates Copilot Credit consumption across multiple Power Platform environments into a single, consolidated view. It is not a commercial reporting solution and does not replace Microsoft’s official reports. Instead, it provides operational visibility into how credits are actually consumed over time.

What the Dashboard Does

The Power BI dashboard connects to multiple Dataverse environments using parameterized Power Query functions, aggregates AI consumption events into combined tables, and tags each record with its source environment. It extracts Copilot Credit usage from JSON payloads stored in the msdyn_eventdata field, enabling credit consumption to be summed, filtered, and visualized like any other metric.

Key capabilities include:

  • Multi‑environment aggregation into a single dataset
  • Consumption breakdown by source (Copilot Studio agents, APIs, Power Apps, Power Automate)
  • AI model drill‑down to identify which AI Builder or generative AI functions drive usage
  • Time‑based analysis with proper date intelligence for month‑over‑month trends and running totals
  • Cost and capacity tracking using gauges and KPI cards
  • Interactive filtering by environment, AI source, model, and date range

The dashboard is organized into three pages:

  1. Executive Summary – high‑level KPIs, trends, and top consumers for leadership and finance
  2. Consumption Analysis – detailed matrices and decomposition trees for technical teams
  3. Cost & Capacity – budget tracking, running totals, and monthly breakdowns




Technical Highlights

Building a multi‑environment model required addressing several common Dataverse challenges:

  • Composite keys were introduced to avoid duplicate ID conflicts across environments (for example, combining msdyn_aimodelid with EnvironmentName)
  • JSON parsing logic extracts Copilot Credit values from event payloads
  • Date normalization converts text‑based processing timestamps into proper date fields for time intelligence
  • Centralized data model supports clean relationships and accurate aggregation

Licensing Context: AI Builder Credits Transition

In October 2025, Microsoft announced the progressive end of AI Builder credits, with Copilot Credits becoming the long‑term consumption model for AI workloads. Key milestones include:

End of AI Builder credits | Microsoft Learn

  • November 1, 2025: New customers can no longer purchase AI Builder capacity add‑ons
  • November 1, 2026: Seeded AI Builder credits are removed from premium licenses

AI Builder features remain fully supported, but AI Builder credits are retired over time, with Copilot Credits required for continued usage. There is no automatic conversion of AI Builder credits to Copilot Credits. This transition further reinforces why clear visibility into Copilot Credit consumption is critical, especially across complex, multi‑environment deployments.

Why This Matters

As Copilot usage scales, credit consumption patterns are rarely obvious. A single busy Copilot Studio agent or API‑driven workflow can consume meaningful credits at scale, and costs quickly move from IT discussions to finance and leadership conversations. Without consolidated visibility, organizations are often reactive—discovering spikes only after invoices arrive.

This dashboard provides a reusable, extensible starting point for understanding Copilot Credit usage. It complements Microsoft’s official tools by answering different questions: Which environments drive spend? Which AI models consume the most credits? When and why did usage spike?

Getting Started

The quickest path is to grab the Power BI template from the GitHub repo:

👉 https://github.com/jbaart37/Copilot-Credits-Dashboard

The repository includes everything you need to get up and running quickly:

  • Copilot AI Credits v1.pbit
    A ready‑to‑use Power BI template. Open it, enter your Power Platform environment URL(s), and start exploring Copilot Credit usage.

  • SETUP_GUIDE.md
    Step‑by‑step instructions covering both the template path and a full manual build.

  • DAX_CALCULATIONS.md
    All measures and calculated columns used for credit extraction, aggregation, and trend analysis.

  • DATA_MODEL.md
    Details on entity relationships, composite keys, and schema design for multi‑environment reporting.

  • VISUALS_GUIDE.md
    Page layouts, visual specifications, and design guidance used in the dashboard.

If you want the fastest setup, download the .pbit file, open it in Power BI Desktop, enter your environment URL(s) when prompted, and you’re done. The template already includes all queries, relationships, calculated columns, measures, and visuals.

If you prefer to build everything from scratch—or want to understand how the pieces fit together—the setup guide walks through creating the parameterized queries, composite keys, JSON parsing logic, and date handling step by step.


Wrapping Up

This project started as a way to answer a simple question:

How are we actually using Copilot Credits across our environments?

It turned into a practical Power BI template that can be reused, extended, or completely reworked to fit different organizations and governance models.

If you’re already tracking AI consumption through the Power Platform Admin Center reports, this approach gives you more flexibility and deeper operational insight.
If you’re not tracking it at all, this is a solid place to start.

Whether you download the template and get running in minutes or follow the setup guide to understand every design decision, the goal is the same: better visibility into AI spend—and fewer surprises when the bill arrives.

👉 https://github.com/jbaart37/Copilot-Credits-Dashboard


Useful Resources

Thursday, January 1, 2026

CORA Voice Agent: Using AI to Help Humans Sound More Human

Happy New Year all — I spent a bit of time over the holidays building something I’d been meaning to explore for a while, and figured it was worth sharing.

Customer service AI usually shows up in one of two forms:

  1. a chatbot that answers questions correctly but with the emotional range of a parking meter, or

  2. a demo that works great until someone speaks slightly faster than expected.

The CORA Voice Agent project sits between low-code and pro-code. It’s not trying to replace human agents, and it’s definitely not trying to win a “most autonomous AI” contest. Instead, it explores a more practical question: What if AI could help humans get better at customer conversations, in real time, using voice?

This project was built as a learning journey first, but one that intentionally lands on a real, usable solution — delivered in two parts:
  • six-module training workshop that walks through the architecture and build-out step by step - using easily deployed Azure components. 
  • GitHub repository you can fork, break, improve, or deploy using GitHub Actions and Azure Developer CLI

CORA isn't a new industry acronym to learn or standard to follow.

CORA stands for Customer-Oriented Response Agent, she’s the name we gave our AI training application! 🤖

CORA even has personality with over 100 voice tones (in Edge browser) and 6 selectable persona moods to simulate customer emotional state for broad training experiences.



Module 1: Solution Overview

In Module One, we take a step back and compare low-code tools such as Copilot Studio with Azure-based solutions, exploring when it makes sense to reach for more advanced features without making things harder than they need to be. It’s a look at how Azure OpenAI and Microsoft Foundry can be combined to support real-time voice interaction and scoring.

You’ll walk through the core components, how they talk to each other, and why certain architectural choices were made. Think of it as the “map before the hike” — helpful context before you start provisioning things and wondering why nothing works yet.


Module 2: Infrastructure Setup

Here’s where the cloud work begins. This module focuses on standing up the required Azure infrastructure using Azure Developer CLI (azd).

Container Apps, storage, identities, telemetry — the usual cast of characters — but wired together with repeatability in mind. The goal isn’t just to get something running once, it’s to make sure you can tear it down, redeploy it, and still remember how it works the next day.


Module 3: Application Deployment

Now the voice agent starts to feel real.

This module walks through deploying the Flask-based application, containerizing it, and getting it running in Azure Container Apps. It also introduces how real-time voice flows move between the browser, the backend, and Azure services.

At this point, you’re no longer just reading diagrams. You’re deploying something that listens, responds, and occasionally surprises you — usually right before you check the logs.


Module 4: Azure OpenAI and Microsoft Foundry Integration

This is where the intelligence layer comes into focus.

You’ll configure a Microsoft Foundry project, deploy models, and wire them into the conversation flow. The emphasis here isn’t “look how smart the model is,” but rather how it’s used — scoring interactions based on tone, clarity, and empathy rather than just correctness.

It’s less about generating perfect answers and more about evaluating how those answers sound when spoken aloud by a human agent.


Module 5: Analytics Dashboard

Voice interactions are interesting. Metrics make them useful.

This module introduces a lightweight analytics dashboard built with Chart.js and Azure Table Storage. It visualizes conversation scores over time, helping surface patterns that are easy to miss when you’re just listening to recordings.

Nothing flashy. Just enough insight to answer questions like:

  • Are agents improving?

  • Are certain scenarios harder than others?

  • Is the AI being too generous… or too harsh?


Module 6: Advanced Topics (Optional, but Encouraged)

The final module is intentionally open-ended. Monitoring, observability, and production considerations all show up here, along with ideas for extending the system beyond the workshop.

If you’re the kind of person who can’t leave a project alone once it’s “done,” this section will feel very familiar.


The Repository: From Learning Exercise to Something You Can Actually Use

The training workshop is paired with a GitHub repository that mirrors exactly what you build across the modules. This isn’t reference code meant to be admired from a distance. It’s meant to be forked, modified, and occasionally broken while you figure out how the pieces fit together.

At a technical level, the repository brings together a fairly opinionated but approachable stack:

  • Python + Flask for the core web application

  • WebSockets to support real-time voice interaction

  • Web Speech API for speech recognition and speech synthesis

  • Azure OpenAI for language understanding and response generation

  • Microsoft Foundry for model orchestration and agent configuration

  • Azure Container Apps for scalable, managed runtime

  • Azure Storage (Tables) for lightweight analytics persistence

  • Chart.js for visualizing interaction metrics

  • Azure Developer CLI (azd) to glue infrastructure and app deployment together

The result is a system that feels modern without being overly abstracted. You can see where data flows, where models are called, and where decisions are made — which is exactly what you want when you’re learning or experimenting.

The repo includes:

  • The full Flask application used throughout the training

  • Infrastructure templates aligned with the workshop architecture

  • Predefined SDK usage for Azure OpenAI and Foundry to reduce setup friction

  • GitHub Actions workflows that automate Azure deployment end to end

One of the deliberate design choices here was local development first. You can run the app locally, iterate quickly, and only push to Azure when it’s ready. When you do, azd handles the heavy lifting — provisioning resources, wiring identities, and keeping environments consistent.

From there, GitHub workflows step in to make things repeatable. Whether you’re testing changes, sharing improvements, or just tired of clicking through the portal, the automation is there when you want it — and out of the way when you don’t.

The goal isn’t to enforce a single deployment path. It’s to give you options without adding complexity for complexity’s sake.


Why Share This at All?

This project didn’t start as a demo idea or a “let’s build something cool” exercise. It grew out of real customer conversations — questions around voice AI, agent coaching, and whether modern AI tooling could support human agents without getting in their way.

Voice AI is easy to demo and surprisingly hard to do well. Once you add humans into the loop — especially in customer service — things like tone, pacing, empathy, and consistency matter just as much as accuracy. That’s where the curiosity turned into experimentation, and eventually into something worth sharing.

Rather than keep the learning internal, this felt like a good opportunity to:

  • Document what worked (and what didn’t)

  • Show how Azure OpenAI and Microsoft Foundry behave in a real voice scenario

  • Share an approach that others can adapt, extend, or completely rethink

CORA is an open learning project — part experiment, part reference, and a practical starting point for anyone curious about:

  • Real-time voice agents beyond scripted demos

  • Coaching and scoring human interactions, not replacing them

  • Azure OpenAI and Microsoft Foundry in practical, hands-on scenarios

  • Balancing local development flexibility with cloud-scale automation

If someone forks the repo, learns something new, or walks away with a better mental model of how voice AI can support humans instead of replacing them — then the project has already succeeded.


Wrapping It Up

If you’re curious to see how this all comes together, the full training modules and deployment walkthrough are available on GitHub Pages. You can move through each module at your own pace, save your progress along the way, and if you make it to the end, there’s even a certificate of achievement waiting for you — mostly as proof that you survived a real-world voice AI build without losing your sanity.

👉 https://jbaart37.github.io/Cora-Voice-Agent-Training/

If reading site pages isn’t your thing and you’d rather learn by breaking code, you can jump straight into the repository. Clone it, run it locally, or use the included GitHub workflows to deploy everything into Azure with minimal technical acrobatics.

👉 https://github.com/jbaart37/Cora-Voice-Agent-Training

Whether you follow the training step by step or dive directly into the code, the goal is the same: learn by building, explore what’s possible with voice AI and human-in-the-loop systems, and hopefully come away with a few ideas of your own.

Sunday, November 16, 2025

Copilot - Graph Connectors vs Custom Agent Connectors with ServiceNow

 You started using Copilot and your organization is interested in agent solutions to address purpose built agent solutions to help with organizational data for specific use cases. Ever been confused on which agent model to use, or which connector would be the best for your scenario ? 


This is where intentional architecture matters.

Microsoft offers a wide variety of tools and choices, which can feel overwhelming at first, but ultimately enables better response accuracy, richer agent experiences, and more efficient cost management.

End users are becoming more comfortable with AI-powered search and retrieval solutions, while technical teams are eager to move further into custom-built experiences. Enter Copilot Studio — a low-code platform that makes agent development accessible and fast. However, ease of use can sometimes create blind spots, leading to architectural missteps if foundational planning isn’t addressed early.

Before jumping in, consider a few key questions:

  • Is your Power Platform governed correctly and supported with ALM-ready environments?

  • Do you truly need a Custom Engine agent or custom connectors, or would a Microsoft Graph connector meet the requirement more efficiently?

  • Are users already licensed for M365 Copilot, and could leveraging Graph connectors help manage cost while still delivering secure data access?

I frequently see the excitement around Copilot Studio spark immediate building — which is great — but without proper planning, this can quickly introduce unnecessary cost, confusion for end users, and complex licensing gaps between fully licensed and pay-as-you-go users.

In this post, we’ll explore connector strategies along with the architectural considerations you should validate before building your first agent. We’ll compare these decisions through the lens of the ServiceNow ecosystem, which is equally robust and full of solution design possibilities.

Real world scenario with ServiceNow:

To set the stage: your organization is using M365 Copilot Chat — adoption may be growing, but not yet universal. You know valuable insights live inside ServiceNow, across Knowledge Bases, tickets and incidents, and service catalogs. The natural next step is figuring out how to bring that value into Copilot experiences — intentionally. 

As a builder, you’re aware there’s no shortage of paths to take — and one of your primary starting points lives right inside the M365 Admin Center under Copilot, where you can configure access, licensing, and foundational settings.

And naturally, curiosity leads you to explore Copilot Studio—an exciting space full of possibilities, but also one that can quickly increase confusion if the roadmap isn’t clear.


You might be wondering: Why are there three different Graph connector options, and how do they compare to the ServiceNow connectors available in Copilot Studio?

To clarify this, we’ll walk through Graph Connector–based agents vs. Custom Connector–based agents, which will make it easier to understand the purpose and value of each Graph connector type.

Graph Connector – Integrates ServiceNow data into Microsoft 365 Copilot experiences (e.g., search, summarization, answers) by indexing ServiceNow content through Microsoft Graph. This enables enterprise search-driven intelligence without requiring direct API calls during each interaction.

Custom Connector – Enables a custom agent to call ServiceNow APIs in real time, supporting workflow actions, transactional operations, and deeper conversational logic. Because it executes API calls on demand during each interaction, it does not rely on Graph indexing and requires consistent API availability and performance.

Both approaches are secure, but they rely on different permission models and can drive different cost implications depending on how data is accessed and used. The three Graph connector options help accommodate these varying permission scopes and governance requirements.


Comparison - M365 Copilot with Graph connector vs Custom Agent connector

Lets start with Knowledge Base research.

Using M365 Copilot Chat with Graph connector enabled - lets search for any articles related to Apple products.


The same prompt leveraging a Copilot Studio agent with custom connector and API call. (Demonstrated using Copilot Studio test pane to review the connector steps and the generative orchestration enabled through the agent configuration)


While both approaches provide helpful responses, there are some key differences. The Studio agent calls the connector and directly queries the ServiceNow API, generating a more condensed set of responses. In contrast, the M365 Copilot Chat experience leverages Graph index data and generative orchestration to provide richer, more detailed answers within the conversation while also including reference links to the ServiceNow source.

In practice, even though this difference may not be immediately obvious, the user experience can be quite similar. For many scenarios—such as retrieving knowledge base articles—direct API calls aren’t always necessary. Using the Graph connector to index ServiceNow data can be more responsive and cost-effective, requiring only configuration of the connector without the need to build a fully interactive agent.

Using Graph-indexed data can optimize the experience when the source content is relatively static and not constantly changing. Knowledge base articles or reference materials are ideal candidates for this approach. In contrast, tickets, incidents, or catalog items tend to be more dynamic, frequently updated, or require additional user interaction to reach the correct information. In these cases, direct API queries via a custom connector or Studio agent may provide more accurate and timely responses.

Additionally, ticket or incident data may require different user permissions to ensure that critical or sensitive information isn’t inadvertently shared across the organization. Proper access controls and governance are essential when exposing dynamic or confidential data through either Graph-indexed solutions or custom connectors.

Topic integration for advanced scenarios like ServiceNow Catalogs

Where Copilot Studio agents truly shine is in their flexibility—for example, when working with catalog knowledge in ServiceNow. While catalogs can be accessed through both Graph-indexed data and custom connectors, the combination of Topics and Tools in Studio allows for a more intuitive and interactive end-user experience. This approach enables users to navigate complex catalogs more naturally and complete tasks with fewer steps.

In this example, the end user may not know which catalogs or catalog items are available through M365 Copilot Chat. Studio agents, with their flexible combination of Topics and Tools, can surface relevant options more intuitively, guiding users to the right catalog items without requiring prior knowledge of what’s available.

Copilot Chat typically responds with a list of items, requiring the user to read through the options to determine which catalog or topic is most appropriate. This is an example where a more targeted or extensive prompt could produce a more direct answer, helping the user reach the desired information faster and with less effort.

A custom-built agent in Copilot Studio can be designed to deliver a more intuitive sequence, guiding users efficiently and aligning responses more closely with their specific needs using generative orchestration.

Using a Topic to steer the conversation to the appropriate tool (GetCatalogs):

The end user is asked what information (catalog) are they interested in.


Once the catalog is selected - the topic calls an additional tool (GetCatalogItems) to gather the inventory and provide links to each catalog item.

To support an intuitive user flow, the agent is structured and designed in the following way:





The Topic guides the conversation flow between the ServiceNow connector tools and generative orchestration, while instructions define how the final output should be formatted for the end user. In this example, variable management (Set Variable Value Expression) is also leveraged to dynamically present the available catalog list directly within the agent’s chat experience, creating a more interactive and personalized workflow.

When working with multiple catalogs and large, detailed inventories, an interactive agent experience can significantly improve user satisfaction by helping users navigate options more efficiently and reach the right information with less friction.


Cost comparison - M365 Copilot with Graph connector vs Custom Agent connector

When using M365 Copilot with a Graph connector, licensing is straightforward — Copilot is priced at $30 per user per month, and Graph-based queries are included in that cost. For organizations with active M365 Copilot adoption, this becomes a predictable, all-inclusive experience.

In contrast, Copilot Studio agents that rely on custom connectors call external APIs (such as ServiceNow) during each conversation. Users who do not have an M365 Copilot license will consume pay-as-you-go (PAYG) credits, introducing variable usage-based costs. This can be very cost-effective at low usage but may scale significantly in high-volume scenarios.


Example Cost Model (at time of writing)

Copilot Studio is billed using Copilot Credits, the universal currency for agent execution.

Rate Options
Prepaid Pack: 25,000 credits for $200/month
PAYG: $0.01 per credit
Estimated Credit Use (ServiceNow-integrated agent)
Generative response: 2 credits
External API call (ServiceNow): 5 credits per call
Assume ~3 API actions per conversation → (3 × 5) + 2 = 17 credits per conversation

Sample Monthly Scenario

2,000 conversations × 17 credits = 34,000 credits / month

ComponentCost
Prepaid 25,000-credit pack$200
Remaining 9,000 credits (PAYG @ $0.01)$90
Total Estimated Monthly Cost~$290

Take a look at the agent usage estimator for more detail: Microsoft agent usage estimator

Closing

In short, choosing between Graph connectors and custom connectors in Copilot Studio isn’t just a technical decision — it’s a strategic one. Graph connectors let you securely bring ServiceNow data into Microsoft 365 Copilot experiences, while custom connectors unlock direct API-driven workflows, richer dialogues, and real-time actions. Each has its own security, permission, and cost trade-offs — and Microsoft’s three Graph connector variants give you flexibility to align with your governance and usage model. From a cost standpoint, leveraging existing M365 Copilot licenses can be very efficient, but building in Studio with custom connectors may introduce pay-as-you-go consumption for non-licensed users,  that needs to be managed carefully.

If you want to dive deeper, here are a few great resources:


Stay tuned - in the next article I will walk through Topic building in the canvas editor, vs Code View - and the nuances between Power FX and YAML formatting when building agents in Copilot Studio.

Connecting Copilot Studio to Snowflake: Why Agent Architecture Matters More Than the Connector

Connecting Copilot Studio to Snowflake isn’t the hard part. (ok well its more complex than most, but not impossible) The hard part is doing ...