<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Tsubasa Kanno</title>
    <description>The latest articles on Forem by Tsubasa Kanno (@tsubasa_tech).</description>
    <link>https://forem.com/tsubasa_tech</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2070831%2F23d09b26-d96e-4ae8-b223-2886d617e257.jpg</url>
      <title>Forem: Tsubasa Kanno</title>
      <link>https://forem.com/tsubasa_tech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tsubasa_tech"/>
    <language>en</language>
    <item>
      <title>Supercharge Cortex Code CLI - A Practical Guide to Skills, SubAgents, Hooks and MCP</title>
      <dc:creator>Tsubasa Kanno</dc:creator>
      <pubDate>Tue, 31 Mar 2026 16:25:40 +0000</pubDate>
      <link>https://forem.com/tsubasa_tech/supercharge-cortex-code-cli-a-practical-guide-to-skills-subagents-hooks-and-mcp-lc8</link>
      <guid>https://forem.com/tsubasa_tech/supercharge-cortex-code-cli-a-practical-guide-to-skills-subagents-hooks-and-mcp-lc8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I was originally a &lt;strong&gt;Cursor&lt;/strong&gt; user for AI-assisted coding. But as someone who works with Snowflake data and features daily, I realized how powerful it is to have an &lt;strong&gt;AI agent that natively connects to Snowflake's data, functions, and catalog — living right in your terminal&lt;/strong&gt;. That's when I made &lt;strong&gt;Cortex Code CLI&lt;/strong&gt; (CoCo CLI for short) my primary tool.&lt;/p&gt;

&lt;p&gt;As I used CoCo CLI more, I wanted an agent that could work more autonomously. CoCo CLI offers extensive customization capabilities, and I've gone deep — defining 7 custom skills, 5 custom subagents, quality-check hooks with Slack notifications, and MCP integrations with external tools. The result has been a dramatic improvement in my day-to-day productivity.&lt;/p&gt;

&lt;p&gt;This article won't cover CoCo CLI basics or installation — for those, check out the &lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;. Instead, I'll dive into the &lt;strong&gt;4 extensibility features (Skills, SubAgents, Hooks, MCP)&lt;/strong&gt; and &lt;strong&gt;AGENTS.md&lt;/strong&gt;, sharing tips from the &lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;official docs&lt;/a&gt; combined with practical insights from my own experience.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This article contains many opinions based on my personal experience. This is not an official Snowflake statement, and customization methods or best practices may change with future updates.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Big Picture of CoCo CLI Extensibility
&lt;/h2&gt;

&lt;p&gt;CoCo CLI customization breaks down into two categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AGENTS.md&lt;/strong&gt; — A Markdown file placed at the project root that communicates project-specific rules and constraints to the agent (&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code" rel="noopener noreferrer"&gt;Official docs: Cortex Code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4 Extensibility Features&lt;/strong&gt; — Mechanisms documented on the &lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;official Extensibility page&lt;/a&gt; that extend the agent's capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffe69xvm5sx8szxnoenl5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffe69xvm5sx8szxnoenl5.png" alt="CoCo CLI Extensibility Overview" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's a summary of each feature's role:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AGENTS.md&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Communicate project-specific rules &amp;amp; constraints&lt;/td&gt;
&lt;td&gt;Project&lt;/td&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skills&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inject domain-specific expertise &amp;amp; workflows&lt;/td&gt;
&lt;td&gt;Project / Global&lt;/td&gt;
&lt;td&gt;YAML frontmatter + Markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SubAgents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Delegate tasks to independent specialized agents&lt;/td&gt;
&lt;td&gt;Project / Global&lt;/td&gt;
&lt;td&gt;YAML frontmatter + Markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Intercept lifecycle events for custom control&lt;/td&gt;
&lt;td&gt;Project / Global&lt;/td&gt;
&lt;td&gt;JSON + Shell scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add external tool &amp;amp; service integrations&lt;/td&gt;
&lt;td&gt;Global&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Let's explore each feature in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  AGENTS.md — Injecting Project Rules
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AGENTS.md&lt;/strong&gt; is a Markdown file placed at the project root that communicates project-specific rules and coding conventions to the CoCo CLI agent. (&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code" rel="noopener noreferrer"&gt;Official docs: Cortex Code&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;AGENTS.md is separate from the 4 extensibility features (Skills, SubAgents, Hooks, MCP) on the &lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;Extensibility page&lt;/a&gt;. While extensibility features extend the agent's &lt;strong&gt;capabilities&lt;/strong&gt;, AGENTS.md defines the agent's &lt;strong&gt;behavioral guidelines&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Location&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Project root directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Format&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free-form Markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Loading&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto-loaded at session start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Effect&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Improves agent response quality &amp;amp; consistency&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Basic Usage
&lt;/h3&gt;

&lt;p&gt;Simply create an &lt;code&gt;AGENTS.md&lt;/code&gt; file in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project Rules&lt;/span&gt;

&lt;span class="gu"&gt;## Coding Standards&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Follow Black formatter for Python code style
&lt;span class="p"&gt;-&lt;/span&gt; Always include type hints
&lt;span class="p"&gt;-&lt;/span&gt; Use Google-style docstrings

&lt;span class="gu"&gt;## Snowflake-Specific Rules&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Write SQL in uppercase
&lt;span class="p"&gt;-&lt;/span&gt; Use full paths for table names: &lt;span class="sb"&gt;`DB.SCHEMA.TABLE`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Use &lt;span class="sb"&gt;`MY_WH`&lt;/span&gt; warehouse

&lt;span class="gu"&gt;## Testing&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Run tests with pytest: &lt;span class="sb"&gt;`pytest tests/ -v`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Maintain 80%+ coverage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Adding AGENTS.md dramatically improves agent responses. For team development, documenting coding standards and project rules in AGENTS.md ensures consistent AI-assisted quality across all team members.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Effective AGENTS.md Structure
&lt;/h3&gt;

&lt;p&gt;Here's the structure pattern I use in practice:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project Overview&lt;/span&gt;
(Brief description of purpose and architecture)

&lt;span class="gh"&gt;# Directory Structure&lt;/span&gt;
(Key directories and file roles)

&lt;span class="gh"&gt;# Tech Stack&lt;/span&gt;
(Languages, frameworks, tools)

&lt;span class="gh"&gt;# Coding Standards (Do)&lt;/span&gt;
(Style guide, naming conventions, comment policy)

&lt;span class="gh"&gt;# Don'ts&lt;/span&gt;
(Secrets handling, destructive SQL prohibition, direct production access ban)

&lt;span class="gh"&gt;# Snowflake-Specific Settings&lt;/span&gt;
(Connection info, default warehouse/role, naming conventions)

&lt;span class="gh"&gt;# Testing &amp;amp; Quality&lt;/span&gt;
(Test commands, lint commands, CI/CD notes)

&lt;span class="gh"&gt;# Custom Skills &amp;amp; SubAgents Guide&lt;/span&gt;
(Names and purposes of custom skills/subagents used in the project)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  TIPS: Making AGENTS.md Work Effectively
&lt;/h3&gt;

&lt;p&gt;AGENTS.md can also be placed at &lt;code&gt;.cortex/AGENTS.md&lt;/code&gt; or in subdirectories, and you can use multiple files. However, keep these points in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AGENTS.md is an Instruction at the start of task execution.&lt;/strong&gt; Writing too many rules tends to dilute compliance. &lt;strong&gt;Focus on high-priority items and keep it concise.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explicit Do / Don't sections are effective.&lt;/strong&gt; Clearly separating "what to do" from "what not to do" improves the agent's decision accuracy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Include directory structure.&lt;/strong&gt; Documenting your project's folder structure helps the agent choose appropriate file locations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a custom skills/subagents guide.&lt;/strong&gt; Listing names, purposes, and invocation methods of your custom skills/subagents helps the agent use them at the right time.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: AGENTS.md is just an Instruction — there's no guarantee the agent will always follow it. For higher compliance rates, clear and concise writing is key. To &lt;strong&gt;enforce&lt;/strong&gt; rules, consider using &lt;strong&gt;Hooks&lt;/strong&gt; (e.g., PreToolUse to block dangerous operations).&lt;/p&gt;

&lt;p&gt;Since CoCo CLI is natively integrated with Snowflake, leveraging &lt;strong&gt;Snowflake governance features&lt;/strong&gt; like RBAC (roles), masking policies, and Row Access Policies for data access control is highly effective. Rather than writing "don't directly modify production tables" in AGENTS.md, simply restricting write permissions via roles is far more reliable. Soft guidelines in AGENTS.md, hard enforcement via Hooks and Snowflake governance — this separation is another strength of CoCo CLI.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Skills — Injecting Domain Knowledge
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;Official docs: Extensibility - Skills&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Skills&lt;/strong&gt; are Markdown files that define domain-specific expertise and workflows, injected into the agent's context when needed. For example, "demo environment setup procedures," "periodic report creation workflows," or "PoC documentation templates" — by defining frequently-used business workflows as skills, you eliminate the need to instruct from scratch every time.&lt;/p&gt;

&lt;p&gt;There are &lt;strong&gt;2 ways&lt;/strong&gt; to invoke skills:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Explicit invocation&lt;/strong&gt; — Use the &lt;code&gt;$skill-name&lt;/code&gt; prefix to directly specify a skill&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic activation&lt;/strong&gt; — The agent matches your question against skill &lt;code&gt;description&lt;/code&gt; fields and auto-loads relevant skills&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Many built-in skills have a &lt;code&gt;[REQUIRED]&lt;/code&gt; tag, causing them to activate automatically when questions hit their domain. For instance, simply typing "I want to create a Dynamic Table pipeline" automatically loads the &lt;code&gt;dynamic-tables&lt;/code&gt; skill with specialized guidance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feppzqn3wxv8i44g0df2y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feppzqn3wxv8i44g0df2y.png" alt="Skills Invocation Flow" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Skill Locations
&lt;/h3&gt;

&lt;p&gt;Skills are loaded from multiple locations (highest to lowest priority). (&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;Official docs: Extensibility&lt;/a&gt;)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Project&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.cortex/skills/&lt;/code&gt; or &lt;code&gt;.claude/skills/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Project-specific&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;~/.snowflake/cortex/skills/&lt;/code&gt; or &lt;code&gt;~/.claude/skills/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;User-specific&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.snowflake/cortex/skills/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shared across all projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Session&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Added temporarily during session&lt;/td&gt;
&lt;td&gt;Disappears when session ends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Remote&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloned from Git repository&lt;/td&gt;
&lt;td&gt;Cached&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bundled&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built into CoCo CLI&lt;/td&gt;
&lt;td&gt;Official Snowflake skills&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Custom skill creation directories are also documented as &lt;code&gt;.cortex/commands/&lt;/code&gt; or &lt;code&gt;.claude/commands/&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating SKILL.md
&lt;/h3&gt;

&lt;p&gt;Skills are Markdown files named &lt;code&gt;SKILL.md&lt;/code&gt; with YAML frontmatter at the top:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-custom-skill&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Description&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;this&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;skill&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(shown&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;skill&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;listings)"&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;snowflake_sql_execute&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;snowflake_object_search&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;web_search&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="c1"&gt;# Purpose&lt;/span&gt;
&lt;span class="s"&gt;(What this skill does)&lt;/span&gt;

&lt;span class="c1"&gt;# Prerequisites&lt;/span&gt;
&lt;span class="s"&gt;(Required environment/data for execution)&lt;/span&gt;

&lt;span class="c1"&gt;# Workflow&lt;/span&gt;
&lt;span class="na"&gt;1. Step 1&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;...&lt;/span&gt;
&lt;span class="na"&gt;2. Step 2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;...&lt;/span&gt;
&lt;span class="na"&gt;3. Step 3&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;# Output&lt;/span&gt;
&lt;span class="s"&gt;(Expected deliverables)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Frontmatter&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unique identifier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Skill description (shown in &lt;code&gt;/skill list&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Tools to enable when skill is active&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  CLI Commands
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cortex skill list
cortex skill add /path/to/.cortex/skills/my-skill
cortex skill add https://github.com/org/my-skills.git
cortex skill remove /path/to/.cortex/skills/my-skill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Invoking Skills in a Session
&lt;/h3&gt;

&lt;p&gt;There are two main approaches — &lt;strong&gt;explicit invocation&lt;/strong&gt; and &lt;strong&gt;automatic activation&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skill listing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Type &lt;code&gt;/skill&lt;/code&gt; or &lt;code&gt;$&lt;/code&gt; in session&lt;/td&gt;
&lt;td&gt;Shows available skill candidates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Explicit invocation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$skill-name instruction&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Loads the specified skill and executes the task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto-activation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Just ask your question normally&lt;/td&gt;
&lt;td&gt;Agent auto-selects skills matching the &lt;code&gt;description&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$demo&lt;/span&gt;&lt;span class="nt"&gt;-builder&lt;/span&gt; Set up a demo environment
&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="nt"&gt;-review&lt;/span&gt; Review @src/app.py following &lt;span class="nv"&gt;$security&lt;/span&gt;&lt;span class="nt"&gt;-guidelines&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For auto-activation, you don't need to specify skill names. Many built-in skills have &lt;code&gt;[REQUIRED]&lt;/code&gt; tags and automatically load when relevant domain questions are asked.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; I want to create a Streamlit app
→ developing-with-streamlit skill auto-activates

&amp;gt; Analyze my costs
→ cost-intelligence skill auto-activates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Use &lt;code&gt;cortex skill list&lt;/code&gt; from outside a session to check available skills. Before creating custom skills, explore what's already built-in.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Built-in Skills
&lt;/h3&gt;

&lt;p&gt;CoCo CLI ships with &lt;strong&gt;33 built-in skills&lt;/strong&gt; covering major Snowflake capabilities (as of v1.0.45). From data engineering to governance, ML, and cost analysis — everything is ready out of the box, making it one of CoCo CLI's biggest strengths.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Skills&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Foundation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dynamic-tables&lt;/code&gt;, &lt;code&gt;iceberg&lt;/code&gt;, &lt;code&gt;lineage&lt;/code&gt;, &lt;code&gt;data-quality&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Development&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;developing-with-streamlit&lt;/code&gt;, &lt;code&gt;build-react-app&lt;/code&gt;, &lt;code&gt;snowpark-python&lt;/code&gt;, &lt;code&gt;snowpark-connect&lt;/code&gt;, &lt;code&gt;snowflake-notebooks&lt;/code&gt;, &lt;code&gt;dbt-projects-on-snowflake&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI / ML&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cortex-agent&lt;/code&gt;, &lt;code&gt;cortex-ai-functions&lt;/code&gt;, &lt;code&gt;semantic-view&lt;/code&gt;, &lt;code&gt;machine-learning&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Governance / Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;data-governance&lt;/code&gt;, &lt;code&gt;trust-center&lt;/code&gt;, &lt;code&gt;network-security&lt;/code&gt;, &lt;code&gt;key-and-secret-management&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operations / Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cost-intelligence&lt;/code&gt;, &lt;code&gt;workload-performance-analysis&lt;/code&gt;, &lt;code&gt;organization-management&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Sharing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;data-cleanrooms&lt;/code&gt;, &lt;code&gt;declarative-sharing&lt;/code&gt;, &lt;code&gt;internal-marketplace-org-listing&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;deploy-to-spcs&lt;/code&gt;, &lt;code&gt;integrations&lt;/code&gt;, &lt;code&gt;openflow&lt;/code&gt;, &lt;code&gt;snowflake-postgres&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Migration / Admin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;snowconvert-assessment&lt;/code&gt;, &lt;code&gt;dcm&lt;/code&gt;, &lt;code&gt;dashboard&lt;/code&gt;, &lt;code&gt;skill-development&lt;/code&gt;, &lt;code&gt;cortex-code-guide&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Built-in skills may change with CoCo CLI version updates. The above list is as of v1.0.45. Check the latest with &lt;code&gt;cortex skill list&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Practical Example: Demo Environment Builder Skill
&lt;/h3&gt;

&lt;p&gt;Here's an example skill for building customer demo environments:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo-builder&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Build&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;clean&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;up&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Snowflake&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;demo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;environments"&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;snowflake_sql_execute&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;snowflake_object_search&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;web_search&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="c1"&gt;# Demo Builder Skill&lt;/span&gt;

&lt;span class="c1"&gt;## Goal&lt;/span&gt;
&lt;span class="s"&gt;Build and manage Snowflake demo environments tailored to&lt;/span&gt;
&lt;span class="s"&gt;customer use cases, in a reproducible manner.&lt;/span&gt;

&lt;span class="c1"&gt;## Workflow&lt;/span&gt;
&lt;span class="c1"&gt;### Phase 1: Requirements&lt;/span&gt;
&lt;span class="s"&gt;Confirm demo theme, target features, and required datasets.&lt;/span&gt;

&lt;span class="c1"&gt;### Phase 2: Environment Setup&lt;/span&gt;
&lt;span class="s"&gt;Create DB/schema/warehouse, load sample data,&lt;/span&gt;
&lt;span class="s"&gt;deploy Streamlit apps as needed.&lt;/span&gt;

&lt;span class="c1"&gt;### Phase 3: Verification&lt;/span&gt;
&lt;span class="s"&gt;Test all queries/apps and create demo scenarios.&lt;/span&gt;

&lt;span class="c1"&gt;### Phase 4: Cleanup&lt;/span&gt;
&lt;span class="s"&gt;Generate scripts to safely tear down the environment post-demo.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;With this skill defined, simply invoking &lt;code&gt;$demo-builder Set up a Cortex AI demo&lt;/code&gt; kicks off the entire workflow automatically.&lt;/p&gt;
&lt;h2&gt;
  
  
  SubAgents — Specialized Agent Delegation
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;Official docs: Extensibility - Subagents&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SubAgents&lt;/strong&gt; are independent, specialized AI agents that operate separately from the main agent. Each can have its own model, tools, and prompts, with parallel execution support.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Independence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Operates in separate context from main agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Specialization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Specify optimal model and tools per task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parallel execution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Up to 50 concurrent agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Worktree Isolation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Isolate changes using Git worktrees&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Built-in SubAgents
&lt;/h3&gt;

&lt;p&gt;CoCo CLI includes these built-in subagent types: (&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;Official docs: Extensibility&lt;/a&gt;)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;general-purpose&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full tool access, general-purpose agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;explore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Codebase exploration specialist (&lt;code&gt;quick&lt;/code&gt; / &lt;code&gt;medium&lt;/code&gt; / &lt;code&gt;very thorough&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implementation planning &amp;amp; design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feedback&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Structured feedback collection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Creating Custom SubAgents
&lt;/h3&gt;

&lt;p&gt;SubAgents are defined as &lt;code&gt;.md&lt;/code&gt; files:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Project&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.cortex/agents/&amp;lt;name&amp;gt;.md&lt;/code&gt; or &lt;code&gt;.claude/agents/&amp;lt;name&amp;gt;.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.snowflake/cortex/agents/&amp;lt;name&amp;gt;.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude/agents/&amp;lt;name&amp;gt;.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Agent Definition Example
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;critic-reviewer&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Performs&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;critical&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;review&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;quality&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;best&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;practices&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;perspective"&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Read&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Grep&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Glob&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Bash&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openai-gpt-5.2&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="c1"&gt;# Critic Reviewer Agent&lt;/span&gt;

&lt;span class="s"&gt;You are a senior software engineer performing code reviews.&lt;/span&gt;

&lt;span class="c1"&gt;## Review Criteria&lt;/span&gt;
&lt;span class="s"&gt;1. Code readability &amp;amp; maintainability&lt;/span&gt;
&lt;span class="s"&gt;2. Performance bottlenecks&lt;/span&gt;
&lt;span class="s"&gt;3. Security concerns&lt;/span&gt;
&lt;span class="s"&gt;4. Error handling adequacy&lt;/span&gt;

&lt;span class="c1"&gt;## Output Format&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;🔴 Critical&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Must fix&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;🟡 Warning&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Recommended fix&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;🟢 Info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Room for improvement&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Model Selection — The Greatest Strength of SubAgents
&lt;/h3&gt;

&lt;p&gt;Custom subagents let you specify a model per agent via the &lt;code&gt;model&lt;/code&gt; field. This is SubAgents' greatest strength.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-opus-4-6&lt;/span&gt;     &lt;span class="c1"&gt;# For high-accuracy tasks&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-sonnet-4-6&lt;/span&gt;   &lt;span class="c1"&gt;# For lightweight, fast tasks&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openai-gpt-5.2&lt;/span&gt;      &lt;span class="c1"&gt;# Leverage different model perspectives&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auto&lt;/span&gt;                &lt;span class="c1"&gt;# Cost-optimized auto-selection&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;TIPS: Cross-model diversity improves quality&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When your main agent uses &lt;code&gt;claude-opus-4-6&lt;/code&gt;, deliberately assigning &lt;code&gt;openai-gpt-5.2&lt;/code&gt; to your review subagent enables critical review from a different model's perspective. A different model family can catch blind spots and mistakes that the same model tends to miss.&lt;/p&gt;

&lt;p&gt;Meanwhile, for simpler tasks like knowledge curation or log summarization, assigning a lightweight model like &lt;code&gt;claude-sonnet-4-6&lt;/code&gt; keeps costs down while boosting overall throughput.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Model Selection Strategy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Main agent&lt;/td&gt;
&lt;td&gt;High-accuracy model (&lt;code&gt;claude-opus-4-6&lt;/code&gt;, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critical review&lt;/td&gt;
&lt;td&gt;Deliberately use a different model family (&lt;code&gt;openai-gpt-5.2&lt;/code&gt;, etc.) for diverse perspectives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Knowledge curation / summarization&lt;/td&gt;
&lt;td&gt;Lightweight model (&lt;code&gt;claude-sonnet-4-6&lt;/code&gt;, etc.) for cost efficiency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exploration / research&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;auto&lt;/code&gt; for cost optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Session-wide model can also be overridden via the &lt;code&gt;CORTEX_AGENT_MODEL&lt;/code&gt; environment variable. (&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/settings" rel="noopener noreferrer"&gt;Official docs: Settings&lt;/a&gt;)&lt;/p&gt;
&lt;h3&gt;
  
  
  Invocation
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Auto-delegation (agent decides)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Search all &lt;span class="nb"&gt;test &lt;/span&gt;files under src/

&lt;span class="c"&gt;# Explicit specification&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Use the Explore agent to find all SQL files

&lt;span class="c"&gt;# Parallel execution&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; In parallel, search &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;test &lt;/span&gt;files and check config files

&lt;span class="c"&gt;# Background execution&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Run a background agent to refactor the code

&lt;span class="c"&gt;# Worktree Isolation (runs in an isolated git branch)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Implement feature X with worktree isolation

&lt;span class="c"&gt;# Agent management&lt;/span&gt;
/agents                    &lt;span class="c"&gt;# Agent list (Ctrl-B also works)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Get the output from agent abc1234
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;kill &lt;/span&gt;agent abc1234
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Resume agent abc1234 and &lt;span class="k"&gt;continue &lt;/span&gt;from where it left off
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Practical Example: Specialized Agent Configuration
&lt;/h3&gt;

&lt;p&gt;Here's my setup with purpose-specific agents:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;critic-reviewer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openai-gpt-5.2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Critical review using a different model from main&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;research-analyst&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Web research &amp;amp; document analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;code-implementer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Complex code implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;qa-validator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Test design &amp;amp; execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;knowledge-curator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Knowledge organization &amp;amp; documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Hooks — Lifecycle Control
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;Official docs: Extensibility - Hooks&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Hooks&lt;/strong&gt; execute custom logic at key lifecycle points in CoCo CLI.&lt;/p&gt;

&lt;p&gt;Personally, I consider Hooks the most important of the four extensibility features. As AI agents evolve, we'll increasingly delegate tasks asynchronously. But this creates common pain points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unaware&lt;/strong&gt; — The agent finishes work, but the user doesn't notice and leaves it idle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stuck&lt;/strong&gt; — The agent is waiting for user input, but the user doesn't realize it's blocked&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settling&lt;/strong&gt; — The agent produces low-quality output and completes without improvement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hooks address these challenges. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send &lt;strong&gt;Slack notifications&lt;/strong&gt; on &lt;code&gt;Notification&lt;/code&gt; events so you never miss an input request or completion&lt;/li&gt;
&lt;li&gt;Run &lt;strong&gt;quality checks&lt;/strong&gt; on &lt;code&gt;Stop&lt;/code&gt; events and force the agent to continue if results don't meet standards&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Hooks have many configuration options and may require some trial-and-error to get the behavior you want. But they're incredibly powerful — I personally receive Slack notifications to issue next instructions and use quality-check hooks to force the agent to self-review and elevate output quality, achieving a truly "set it and forget it" workflow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v0wef5mm7k05axu147q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v0wef5mm7k05axu147q.png" alt="Hooks Lifecycle Sequence" width="800" height="751"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuration File Locations
&lt;/h3&gt;

&lt;p&gt;Hooks are configured in the following locations (highest to lowest priority):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Local&lt;/strong&gt; (highest)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.cortex/settings.local.json&lt;/code&gt; or &lt;code&gt;.claude/settings.local.json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Project&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.cortex/settings.json&lt;/code&gt; or &lt;code&gt;.claude/settings.json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude/settings.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.snowflake/cortex/hooks.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Available Events
&lt;/h3&gt;

&lt;p&gt;The 11 hook events defined in official docs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Timing&lt;/th&gt;
&lt;th&gt;Can Block?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PreToolUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Before tool execution&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PostToolUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;After successful tool execution&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PermissionRequest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;When permission is needed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UserPromptSubmit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;When user submits prompt&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SessionStart&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;When session starts&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SessionEnd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;When session ends&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PreCompact&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Before context compaction&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Stop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;When agent response completes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SubagentStop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;When subagent completes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Notification&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;On notification (e.g., waiting for user input)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Setup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;During initialization&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Hook Types
&lt;/h3&gt;

&lt;p&gt;Two types of hooks are available: (&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;Official docs: Extensibility&lt;/a&gt;)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;command&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Execute shell commands&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bash /path/to/script.sh&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prompt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Evaluate natural language prompt via LLM&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Is this command safe? $ARGUMENTS&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Exit Code Semantics
&lt;/h3&gt;

&lt;p&gt;Hook script exit codes control CoCo CLI behavior:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Exit Code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;Process stdout JSON and continue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Block&lt;/td&gt;
&lt;td&gt;stderr / JSON &lt;code&gt;reason&lt;/code&gt; sent to agent; operation blocked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Other&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Error&lt;/td&gt;
&lt;td&gt;Non-blocking. stderr shown only in verbose mode; execution continues&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Configuration Format
&lt;/h3&gt;

&lt;p&gt;Example &lt;code&gt;hooks.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Stop"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bash /path/to/hooks/quality_review.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PreToolUse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bash /path/to/hooks/validate_bash.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Matcher Patterns
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;matcher&lt;/code&gt; field narrows which tools trigger hooks. Regex is supported.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Bash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bash only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Edit|Write&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Edit or Write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mcp__.*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All MCP tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Notebook.*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NotebookEdit, NotebookExecute, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Hook Input (stdin)
&lt;/h3&gt;

&lt;p&gt;Hook scripts receive JSON via stdin:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"session_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hook_event_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Stop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cwd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Users/my-project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"transcript_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/transcript.jsonl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool_input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ls -la"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Available Environment Variables
&lt;/h3&gt;

&lt;p&gt;These environment variables are available within hook scripts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CORTEX_PROJECT_DIR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Project directory path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CORTEX_CODE_REMOTE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;"true"&lt;/code&gt; in web context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CORTEX_ENV_FILE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Persistent environment file path&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Example 1: Quality Review Hook (Stop Event)
&lt;/h3&gt;

&lt;p&gt;A hook that performs LLM-based quality checks when the agent tries to complete a task, blocking and continuing work if quality is insufficient:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# quality_review_on_stop.sh&lt;/span&gt;

&lt;span class="nv"&gt;INPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Infinite loop prevention (critical!)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.stop_hook_active'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nv"&gt;TRANSCRIPT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.transcript_path'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Get recent interactions and run LLM quality check&lt;/span&gt;
&lt;span class="nv"&gt;REVIEW_RESULT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;snow sql &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"
  SELECT SNOWFLAKE.CORTEX.COMPLETE(
    'claude-sonnet-4-6',
    'Rate the task completion from 1-10: ...'
  )
"&lt;/span&gt; &lt;span class="nt"&gt;--connection&lt;/span&gt; MY_CONN&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;SCORE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REVIEW_RESULT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.score'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SCORE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-lt&lt;/span&gt; 7 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Quality score below threshold (&lt;/span&gt;&lt;span class="nv"&gt;$SCORE&lt;/span&gt;&lt;span class="s2"&gt;/10). Please improve."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
  &lt;span class="nb"&gt;exit &lt;/span&gt;2  &lt;span class="c"&gt;# Block → agent continues working&lt;/span&gt;
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;0  &lt;span class="c"&gt;# Allow → agent stops&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Critical: Infinite loop prevention in Stop Hooks is mandatory.&lt;/strong&gt; When a Stop Hook returns block (exit 2), the agent continues working and the Stop event fires again. Always pass through with &lt;code&gt;exit 0&lt;/code&gt; when the &lt;code&gt;stop_hook_active&lt;/code&gt; flag is &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Example 2: Slack Notification Hook (Notification Event)
&lt;/h3&gt;

&lt;p&gt;A hook that sends Slack notifications when the agent is waiting for user input:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# notify_slack_on_notification.sh&lt;/span&gt;

&lt;span class="nv"&gt;INPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;MESSAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.message // "Waiting for input"'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SLACK_WEBHOOK_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;🔔 Cortex Code: &lt;/span&gt;&lt;span class="nv"&gt;$MESSAGE&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;

&lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  MCP — External Tool Integration
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;Official docs: Extensibility - MCP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; is an open standard protocol for connecting external tools and services to AI agents. The key point here is that &lt;strong&gt;CoCo CLI itself functions as an MCP client&lt;/strong&gt;. This means you can add any publicly available MCP server to give your agent new capabilities.&lt;/p&gt;

&lt;p&gt;For example, draw.io MCP for diagrams, GitHub MCP for PR operations, Context7 MCP for latest library documentation — the possibilities are vast. MCP servers are growing daily, so definitely explore &lt;a href="https://github.com/modelcontextprotocol/servers" rel="noopener noreferrer"&gt;MCP servers&lt;/a&gt; and &lt;a href="https://mcp.so/" rel="noopener noreferrer"&gt;mcp.so&lt;/a&gt; to find servers that fit your workflow.&lt;/p&gt;
&lt;h3&gt;
  
  
  Transport Types
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Communication&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stdio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Local tools, CLI wrappers&lt;/td&gt;
&lt;td&gt;Subprocess (stdin/stdout)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Web services, APIs&lt;/td&gt;
&lt;td&gt;HTTP requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Real-time services&lt;/td&gt;
&lt;td&gt;Server-Sent Events&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OAuth authentication is supported for HTTP servers. Tokens are stored in &lt;code&gt;~/.snowflake/cortex/mcp_oauth/&lt;/code&gt; and auto-refreshed.&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuration File
&lt;/h3&gt;

&lt;p&gt;MCP server configuration goes in &lt;code&gt;~/.snowflake/cortex/mcp.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"drawio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@drawio/mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-github"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"GITHUB_PERSONAL_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${GITHUB_TOKEN}"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Environment Variable Expansion
&lt;/h3&gt;

&lt;p&gt;Both &lt;code&gt;${VAR}&lt;/code&gt; and &lt;code&gt;$VAR&lt;/code&gt; syntax are supported for environment variable expansion in configuration files. (&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;Official docs: Extensibility&lt;/a&gt;)&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer ${MY_API_TOKEN}"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Never hardcode API keys in &lt;code&gt;mcp.json&lt;/code&gt;. Set them as environment variables in &lt;code&gt;~/.bashrc&lt;/code&gt; or &lt;code&gt;~/.zshrc&lt;/code&gt; like &lt;code&gt;export MY_API_TOKEN="your_token_here"&lt;/code&gt; — this is the officially recommended approach.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  CLI Commands
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cortex mcp add drawio npx &lt;span class="nt"&gt;-y&lt;/span&gt; @drawio/mcp
cortex mcp add my-api https://api.example.com &lt;span class="nt"&gt;--type&lt;/span&gt; http
cortex mcp add my-server npx my-mcp-server &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;secret
cortex mcp add my-server https://api.example.com &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer token"&lt;/span&gt;
cortex mcp list
cortex mcp get drawio
cortex mcp remove drawio
cortex mcp start drawio    &lt;span class="c"&gt;# Connection test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Tool Naming Convention
&lt;/h3&gt;

&lt;p&gt;MCP tools are namespaced for agent access:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mcp__{server-name}__{tool-name}

e.g.: mcp__drawio__open_drawio_xml
      mcp__github__create_pull_request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Session Management
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/mcp    &lt;span class="c"&gt;# Open MCP status viewer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Practical Example: draw.io MCP
&lt;/h3&gt;

&lt;p&gt;Adding the draw.io MCP server lets you instruct the agent to "create an architecture diagram for this design" and it generates the diagram in the draw.io editor.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cortex mcp add drawio npx &lt;span class="nt"&gt;-y&lt;/span&gt; @drawio/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Usage in session:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Create an architecture diagram for this system in draw.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Putting It All Together
&lt;/h2&gt;

&lt;p&gt;The AGENTS.md and 4 extensibility features become even more powerful when combined. Here's a workflow pattern I use daily.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pattern: AI-Assisted Development Workflow
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgeil468rpbnmpjz5aibd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgeil468rpbnmpjz5aibd.png" alt="AI-Assisted Development Workflow" width="800" height="885"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By combining these features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AGENTS.md&lt;/strong&gt; always applies project-specific rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt; standardize repetitive workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SubAgents&lt;/strong&gt; process specialized tasks in parallel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; connects to external tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; automate quality checks and notifications on task completion&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This creates a truly integrated workflow.&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuration File Overview
&lt;/h3&gt;

&lt;p&gt;Here's a partial extract of my CoCo CLI configuration structure — the actual setup has many more files, but these are the key ones. (&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/settings" rel="noopener noreferrer"&gt;Official docs: Settings&lt;/a&gt;)&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.snowflake/cortex/
├── settings.json           # Main settings (theme, env vars, hooks)
├── mcp.json                # MCP server config
├── hooks.json              # Global hooks
├── permissions.json        # Permission settings
├── hooks/                  # Hook scripts
│   ├── quality_review_on_stop.sh
│   ├── notify_slack_on_stop.sh
│   └── ...
├── agents/                 # Custom SubAgents
│   ├── critic-reviewer.md
│   ├── research-analyst.md
│   └── ...
├── skills/                 # Global Skills
│   ├── demo-builder/SKILL.md
│   ├── competitive-analysis/SKILL.md
│   └── ...
├── memory/                 # Persistent memory
└── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Cortex Code CLI is not just an AI coding assistant — by leveraging &lt;strong&gt;AGENTS.md&lt;/strong&gt; for project rules and the &lt;strong&gt;4 extensibility features (Skills, SubAgents, Hooks, MCP)&lt;/strong&gt;, you can build a powerful AI development environment tailored to your workflow.&lt;/p&gt;

&lt;p&gt;Personally, shifting from Cursor to CoCo CLI has been transformative. Being able to use customized agents while natively connected to Snowflake data and functions has dramatically improved my daily productivity. Here's what I find most valuable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skills for workflow standardization&lt;/strong&gt;: Defining repetitive workflows like demo setup and documentation as skills eliminates starting from scratch every time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SubAgents for parallel execution&lt;/strong&gt;: Running research tasks in parallel dramatically reduces processing time for complex tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks for quality gates &amp;amp; notifications&lt;/strong&gt;: Auto-executing quality checks on task completion via Stop Hook and forcing continued work when quality is insufficient has been incredibly effective for raising output quality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP for external tool integration&lt;/strong&gt;: Calling external tools like draw.io and GitHub directly from the agent dramatically reduces context-switching overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CoCo CLI's customization features will continue to evolve. I encourage you to dive into customization and build your own AI development environment!&lt;/p&gt;
&lt;h3&gt;
  
  
  Reference Links
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Document&lt;/th&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cortex Code CLI official&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli" rel="noopener noreferrer"&gt;https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extensibility (Skills, SubAgents, Hooks, MCP)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;https://docs.snowflake.com/en/user-guide/cortex-code/extensibility&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Settings (Configuration &amp;amp; Priority)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/settings" rel="noopener noreferrer"&gt;https://docs.snowflake.com/en/user-guide/cortex-code/settings&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/security" rel="noopener noreferrer"&gt;https://docs.snowflake.com/en/user-guide/cortex-code/security&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I share Snowflake What's New updates on X. Follow for the latest insights:&lt;/p&gt;
&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20260401) Initial post&lt;/p&gt;
&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://zenn.dev/snowflakejp/articles/46369359327022" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fzenn%2Fimage%2Fupload%2Fs--31dxnOpd--%2Fc_fit%252Cg_north_west%252Cl_text%3Anotosansjp-medium.otf_55%3ACortex%252520Code%252520CLI%252520%2525E5%2525AE%25259F%2525E8%2525B7%2525B5%2525E3%252582%2525AB%2525E3%252582%2525B9%2525E3%252582%2525BF%2525E3%252583%25259E%2525E3%252582%2525A4%2525E3%252582%2525BA%2525E3%252582%2525AC%2525E3%252582%2525A4%2525E3%252583%252589%252Cw_1010%252Cx_90%252Cy_100%2Fg_south_west%252Cl_text%3Anotosansjp-medium.otf_34%3Atsubasa%252Cx_220%252Cy_108%2Fbo_3px_solid_rgb%3Ad6e3ed%252Cg_south_west%252Ch_90%252Cl_fetch%3AaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzQ0ZmE2OGQyM2YuanBlZw%3D%3D%252Cr_20%252Cw_90%252Cx_92%252Cy_102%2Fco_rgb%3A6e7b85%252Cg_south_west%252Cl_text%3Anotosansjp-medium.otf_30%3ASnowflake%252520Japan%252Cx_220%252Cy_160%2Fbo_4px_solid_white%252Cg_south_west%252Ch_50%252Cl_fetch%3AaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2RkODMzYmYwZDcuanBlZw%3D%3D%252Cr_max%252Cw_50%252Cx_139%252Cy_84%2Fv1627283836%2Fdefault%2Fog-base-w1200-v2.png%3F_a%3DBACAGSGT" height="630" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://zenn.dev/snowflakejp/articles/46369359327022" rel="noopener noreferrer" class="c-link"&gt;
            Cortex Code CLI 実践カスタマイズガイド
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.zenn.studio%2Fimages%2Flogo-transparent.png" width="315" height="315"&gt;
          zenn.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>snowflake</category>
      <category>agents</category>
      <category>llm</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Snowflake Data UI Guide - Choose the Right Tool for Every Analytics Use Case</title>
      <dc:creator>Tsubasa Kanno</dc:creator>
      <pubDate>Sun, 15 Feb 2026 05:54:49 +0000</pubDate>
      <link>https://forem.com/tsubasa_tech/snowflake-data-ui-guide-choose-the-right-tool-for-every-analytics-use-case-1n8d</link>
      <guid>https://forem.com/tsubasa_tech/snowflake-data-ui-guide-choose-the-right-tool-for-every-analytics-use-case-1n8d</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;It's been about two years since I joined Snowflake, and the transformation I've witnessed in data analytics UI has been nothing short of remarkable. Back in early 2024, when it came to working with data in Snowflake, your options were essentially &lt;strong&gt;Snowsight worksheets and dashboards&lt;/strong&gt;, plus &lt;strong&gt;third-party BI tools&lt;/strong&gt;. Streamlit in Snowflake (hereafter referred to as SiS) and Snowpark Container Services (hereafter referred to as SPCS) had just launched but weren't yet mainstream.&lt;/p&gt;

&lt;p&gt;Fast forward to today, and the landscape looks completely different. &lt;strong&gt;Snowflake Intelligence&lt;/strong&gt;, &lt;strong&gt;Snowflake Workspaces&lt;/strong&gt;, &lt;strong&gt;Snowflake Notebooks&lt;/strong&gt;, &lt;strong&gt;Snowflake Managed MCP Server&lt;/strong&gt;, &lt;strong&gt;Cortex Code&lt;/strong&gt;, &lt;strong&gt;Vercel v0 integration&lt;/strong&gt; - the list of new options keeps growing. In my daily conversations with customers, one question has become increasingly common: &lt;em&gt;"With all these tools available, which one should we use?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's exactly what this article aims to answer. I'll provide a &lt;strong&gt;comprehensive overview of every UI option&lt;/strong&gt; for working with data in Snowflake, covering their strengths, limitations, target users, and ideal use cases. Whether you're a business user, data analyst, data scientist, or developer, I hope this guide helps you find the right tool for your needs!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note (2026/2/5)&lt;/strong&gt;: Some features mentioned in this article are still in development or Public Preview. They may be significantly updated in the future.&lt;/p&gt;

&lt;p&gt;Note: This article represents my personal views and not those of Snowflake. The tool evaluations and use case classifications are based on my personal experience and may vary depending on your organization and project requirements. Please treat this as one perspective.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Evolution of Snowflake's Data UI
&lt;/h2&gt;

&lt;p&gt;As I mentioned, in early 2024, worksheets, dashboards, and BI tools were the primary ways to interact with Snowflake data. In just two years, this has diversified dramatically. &lt;strong&gt;Workspaces&lt;/strong&gt; has evolved worksheets into a full IDE experience. &lt;strong&gt;Intelligence&lt;/strong&gt; enables business users to query data using natural language without writing SQL. &lt;strong&gt;Notebooks&lt;/strong&gt; brings data science workflows entirely within Snowflake. And with &lt;strong&gt;SiS Container Runtime&lt;/strong&gt;, you can now run lightweight dashboards at a fraction of the cost. On the AI front, Copilot has evolved into &lt;strong&gt;Cortex Code&lt;/strong&gt;, and &lt;strong&gt;MCP Server&lt;/strong&gt; enables AI Agent integration with Snowflake data.&lt;/p&gt;

&lt;p&gt;Behind this evolution are two major trends: &lt;strong&gt;democratization of data access&lt;/strong&gt; and &lt;strong&gt;AI-native analytics experiences&lt;/strong&gt;. Data utilization, once dominated by data engineers and analysts, is now extending to business users - with AI serving as the bridge.&lt;/p&gt;

&lt;h2&gt;
  
  
  UI Options at a Glance
&lt;/h2&gt;

&lt;p&gt;Here's a categorized overview of every UI option available for working with data in Snowflake.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Primary Users&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Snowflake Native UI (Analytics)&lt;/td&gt;
&lt;td&gt;Snowflake Workspaces&lt;/td&gt;
&lt;td&gt;Data Engineers, Data Analysts, Data Scientists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Snowflake Intelligence&lt;/td&gt;
&lt;td&gt;Business Users, Data Analysts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Snowflake Notebooks&lt;/td&gt;
&lt;td&gt;Data Scientists, ML Engineers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snowflake Native UI (Apps)&lt;/td&gt;
&lt;td&gt;SiS&lt;/td&gt;
&lt;td&gt;Data Analysts, Data Scientists → Business Users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Native Apps&lt;/td&gt;
&lt;td&gt;App Developers, ISVs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;SPCS&lt;/td&gt;
&lt;td&gt;ML Engineers, App Developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI-Assisted Development&lt;/td&gt;
&lt;td&gt;Cortex Code in Snowsight&lt;/td&gt;
&lt;td&gt;Data Engineers, Data Analysts, Data Scientists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Cortex Code CLI&lt;/td&gt;
&lt;td&gt;Developers, Data Engineers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Vercel v0 Integration&lt;/td&gt;
&lt;td&gt;Developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Agent / MCP Integration&lt;/td&gt;
&lt;td&gt;Snowflake Managed MCP Server&lt;/td&gt;
&lt;td&gt;Developers, AI Agent Users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;OSS Snowflake MCP Server&lt;/td&gt;
&lt;td&gt;Developers, AI Agent Users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Programmatic Access&lt;/td&gt;
&lt;td&gt;Snowflake CLI&lt;/td&gt;
&lt;td&gt;Developers, DevOps Engineers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Snowpark Python SDK&lt;/td&gt;
&lt;td&gt;Data Engineers, Data Scientists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;SQL API and Connectors&lt;/td&gt;
&lt;td&gt;Developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-Party Integration&lt;/td&gt;
&lt;td&gt;BI Tools (Tableau, Power BI, etc.)&lt;/td&gt;
&lt;td&gt;Data Analysts, Business Users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Custom Applications&lt;/td&gt;
&lt;td&gt;Developers → Business Users&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Let's dive into each category in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snowflake Native UI (Analytics)
&lt;/h2&gt;

&lt;p&gt;Tools available within Snowsight for analyzing and exploring data using SQL or natural language.&lt;/p&gt;

&lt;h3&gt;
  
  
  Snowflake Workspaces
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
Snowflake Workspaces is an &lt;strong&gt;integrated development environment (IDE)&lt;/strong&gt; available within Snowsight. GA since September 2025, it represents a significant evolution from the traditional worksheet experience. Originally focused on SQL editing, Workspaces now supports &lt;strong&gt;Notebooks running directly within the environment&lt;/strong&gt;, unifying SQL and Python/Notebook development. &lt;strong&gt;Shared Workspaces&lt;/strong&gt; became GA in January 2026 for team collaboration, and &lt;strong&gt;Notebooks in Workspaces&lt;/strong&gt; went GA in February 2026.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQL execution, Notebooks, dbt projects, data preview, object management, Git integration, Cortex Code AI assistance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data Engineers, Data Analysts, Data Scientists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Workspaces: GA (2025/9), Shared Workspaces: GA (2026/1), Notebooks in Workspaces: GA (2026/2)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero-setup: start working immediately&lt;/li&gt;
&lt;li&gt;Unified environment for SQL, Python (Notebooks), and dbt&lt;/li&gt;
&lt;li&gt;Cortex Code AI assistance for natural language code generation and editing&lt;/li&gt;
&lt;li&gt;Git integration for version control&lt;/li&gt;
&lt;li&gt;Shared Workspaces for team collaboration&lt;/li&gt;
&lt;li&gt;Role-based access control (RBAC) for easy permission management&lt;/li&gt;
&lt;li&gt;Parallel query execution from a single file&lt;/li&gt;
&lt;li&gt;Share pre-built queries with your team so anyone can run them anytime and view the latest data in tabular format&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not suited for advanced visualizations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best Use Cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ad-hoc SQL / Python analysis&lt;/li&gt;
&lt;li&gt;Data pipeline development and debugging&lt;/li&gt;
&lt;li&gt;dbt project development and execution&lt;/li&gt;
&lt;li&gt;ML model prototyping (via Notebooks)&lt;/li&gt;
&lt;li&gt;Schema design and data modeling&lt;/li&gt;
&lt;li&gt;Team collaboration&lt;/li&gt;
&lt;li&gt;Sharing standardized queries for day-to-day data monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo8i351571976x7kqf5nz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo8i351571976x7kqf5nz.png" alt="Snowflake Workspaces" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Snowflake Intelligence
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
Snowflake Intelligence is an &lt;strong&gt;AI-native analytics platform that lets you ask questions about your data in natural language&lt;/strong&gt;. Business users can perform data analysis directly without specialized SQL knowledge. Under the hood, &lt;strong&gt;Cortex Agents serve as the core AI orchestrator&lt;/strong&gt;, combining the following tools to fulfill requests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cortex Analyst&lt;/strong&gt;: Text2SQL analysis on structured data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cortex Search&lt;/strong&gt;: Hybrid search (vector search + keyword search + semantic reranking) on unstructured data (documents, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Tools&lt;/strong&gt;: User-defined Stored Procedures and UDFs (User Defined Functions)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cortex Agents interpret user requests, select the appropriate tools, execute them, and generate responses - delivering an agentic analytics experience.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Natural language Q&amp;amp;A, automatic chart generation, insight surfacing, custom tool execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Business Users, Data Analysts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GA (2025/11)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Highlight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Semantic Models / Semantic Views for high-accuracy answers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No SQL required - analyze data with natural language&lt;/li&gt;
&lt;li&gt;Fully contained within Snowflake for security&lt;/li&gt;
&lt;li&gt;Easy to scale across the entire organization&lt;/li&gt;
&lt;li&gt;Semantic Models unify business terminology and data lineage&lt;/li&gt;
&lt;li&gt;Cross-analyze structured and unstructured data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires upfront preparation of Semantic Models / Semantic Views&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best Use Cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;KPI reporting for executives&lt;/li&gt;
&lt;li&gt;Self-service analytics for sales/marketing teams&lt;/li&gt;
&lt;li&gt;Instant answers to recurring business questions&lt;/li&gt;
&lt;li&gt;Analysis combining internal documents and data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw7z24hdpdhr0n0mszet1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw7z24hdpdhr0n0mszet1.png" alt="Snowflake Intelligence" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Snowflake Notebooks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
Snowflake Notebooks is a &lt;strong&gt;Jupyter-style notebook environment available within Snowsight&lt;/strong&gt;. It supports interactive analysis combining Python, SQL, and Markdown, and you can create Streamlit-powered visualizations directly within cells. GA since November 2024.&lt;/p&gt;

&lt;p&gt;Two runtime options are available:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Characteristics&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Warehouse Runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Runs kernels on a warehouse. Fast startup, ideal for standard SQL analysis and Python processing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Container Runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Runs on Snowpark Container Services (SPCS). GPU support and flexible package management via &lt;code&gt;pip&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python/SQL execution, Streamlit visualizations, collaborative editing, Git integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data Scientists, ML Engineers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GA (2024/11)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete data science environment within Snowflake&lt;/li&gt;
&lt;li&gt;Python libraries (pandas, matplotlib, scikit-learn, etc.) available&lt;/li&gt;
&lt;li&gt;Create interactive Streamlit visualizations directly in cells&lt;/li&gt;
&lt;li&gt;Cortex Code AI assistance for natural language code generation and editing&lt;/li&gt;
&lt;li&gt;Easy documentation of analysis processes&lt;/li&gt;
&lt;li&gt;Built for team collaboration&lt;/li&gt;
&lt;li&gt;Snowpark ML integration for ML workflows&lt;/li&gt;
&lt;li&gt;Container Runtime enables deep learning and large-scale ML with GPU (PyTorch, TensorFlow pre-installed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some feature differences compared to local Jupyter Notebooks&lt;/li&gt;
&lt;li&gt;Container Runtime requires External Access Integration setup for external packages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best Use Cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exploratory Data Analysis (EDA)&lt;/li&gt;
&lt;li&gt;ML model prototyping&lt;/li&gt;
&lt;li&gt;Deep learning model training and inference with GPU (Container Runtime)&lt;/li&gt;
&lt;li&gt;Creating and sharing analysis reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs96cyeak55vl3ciziclv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs96cyeak55vl3ciziclv.png" alt="Snowflake Notebooks" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Snowflake Native UI (Apps)
&lt;/h2&gt;

&lt;p&gt;Tools for building and running business-user-facing applications, accessible from Snowsight. Typically, developers build the apps and business users consume them.&lt;/p&gt;
&lt;h3&gt;
  
  
  Streamlit in Snowflake (SiS)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
SiS is a &lt;strong&gt;service for developing and deploying web applications using Python&lt;/strong&gt;. You can rapidly build data apps without any frontend knowledge. Apps are created, edited, and run directly from Snowsight, with full integration into Snowflake's authentication and authorization.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python web app development, Snowflake auth integration, Cortex AI integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data Analysts, Data Scientists → Business Users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GA (AWS/Azure: 2024/1, GCP: 2024/5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Highlight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Streamlit's simplicity + Snowflake's security&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;End-to-end app development using only Python&lt;/li&gt;
&lt;li&gt;Full integration with Snowflake authentication and authorization&lt;/li&gt;
&lt;li&gt;Rapidly build custom analytics tools for business users&lt;/li&gt;
&lt;li&gt;Easy to integrate AI capabilities (chat, summarization, classification, etc.) via Cortex AI&lt;/li&gt;
&lt;li&gt;Cortex Code AI-assisted coding in the Snowsight editor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limited flexibility for highly custom UI designs&lt;/li&gt;
&lt;li&gt;For cost optimization or flexible package management, consider Container Runtime below&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best Use Cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom analytics dashboards and visualization apps for teams&lt;/li&gt;
&lt;li&gt;Data entry and update applications&lt;/li&gt;
&lt;li&gt;AI/ML model demo apps&lt;/li&gt;
&lt;li&gt;Internal self-service analytics tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fskppba4u6kc5hvymc14o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fskppba4u6kc5hvymc14o.png" alt="Streamlit in Snowflake" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  SiS Container Runtime (Preview)
&lt;/h4&gt;

&lt;p&gt;Traditional SiS uses Warehouse Runtime, but a &lt;strong&gt;Container Runtime&lt;/strong&gt; option is now also available (currently in Preview). Container Runtime executes app code on SPCS while queries run on a separate warehouse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The development experience is identical to standard SiS&lt;/strong&gt;. You write and deploy code in the same Snowsight SiS editor, and Cortex Code AI-assisted coding is fully available. You can create, edit, and run apps without worrying about the underlying runtime differences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Benefits of Container Runtime&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Separated App and Query Execution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;App code runs on a compute pool, queries on a warehouse. Optimize each resource independently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lightweight Resource Options&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Run on compute pools cheaper than warehouses (e.g., &lt;code&gt;CPU_X64_XS&lt;/code&gt; at 0.06 credits/hour)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Shared Instance Efficiency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All users share a single instance. Second user onward connects instantly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full Cache Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@st.cache_data&lt;/code&gt; caches are shared across users, reducing query execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flexible Package Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Install any package from PyPI, use the latest Streamlit version&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is especially impactful for always-on dashboards and lightweight visualization apps from a cost perspective. If you need &lt;strong&gt;a team dashboard that runs continuously within Snowflake&lt;/strong&gt;, SiS Container Runtime is a compelling choice - low cost and built entirely in Python.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For a deep dive into SiS Container Runtime, check out my previous article: &lt;a href="https://dev.to/tsubasa_tech/sis-container-runtime-run-streamlit-apps-at-a-fraction-of-the-cost-2mn8"&gt;SiS Container Runtime - Run Streamlit Apps at a Fraction of the Cost&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Snowflake Native Apps
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
Snowflake Native Apps is a &lt;strong&gt;framework for developing and distributing packaged applications on Snowflake&lt;/strong&gt;. Multiple distribution methods are available: public distribution via Snowflake Marketplace, direct distribution to specific accounts via Private Listing, and distribution to non-Snowflake customers via Reader Accounts. Apps can use SiS for the UI or build custom frontends with SPCS.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;App packaging, Marketplace / Private Listing / Reader Account distribution, version management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;App Developers, ISVs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GA (2024/1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Highlight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Combine data sharing and apps for distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distribute apps and data as a package&lt;/li&gt;
&lt;li&gt;Consumers use apps + data without copying data&lt;/li&gt;
&lt;li&gt;Continuous update delivery&lt;/li&gt;
&lt;li&gt;Monetization via Marketplace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Relatively steep learning curve&lt;/li&gt;
&lt;li&gt;Primarily for ISVs and data providers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best Use Cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commercial application distribution&lt;/li&gt;
&lt;li&gt;Data Product offerings&lt;/li&gt;
&lt;li&gt;Cross-organization solution sharing&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Snowpark Container Services (SPCS)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
SPCS is a &lt;strong&gt;fully managed service for running containerized applications on Snowflake&lt;/strong&gt;. The core value proposition is &lt;strong&gt;"bringing compute to the data, rather than moving data to the compute."&lt;/strong&gt; Deploy Docker images and run ML inference or custom applications with GPU/CPU resources - all within Snowflake. Available on AWS, Azure, and GCP.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Container execution, GPU support, ML model serving, batch jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ML Engineers, App Developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GA (AWS: 2024/8, Azure: 2025/2, GCP: 2025/8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Highlight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Any programming language or framework&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data never leaves Snowflake&lt;/strong&gt;: Meets security and compliance requirements&lt;/li&gt;
&lt;li&gt;Any programming language or library (Docker-compatible)&lt;/li&gt;
&lt;li&gt;GPU support for ML model inference and private LLM execution&lt;/li&gt;
&lt;li&gt;No Kubernetes knowledge required for container operations&lt;/li&gt;
&lt;li&gt;Inherits Snowflake's security, governance, and access controls&lt;/li&gt;
&lt;li&gt;Can serve as the backend for Native Apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires containerization knowledge&lt;/li&gt;
&lt;li&gt;More setup effort compared to SiS&lt;/li&gt;
&lt;li&gt;External internet access disabled by default (requires External Access Integration)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to choose SiS vs. SPCS&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple dashboards and visualization apps → &lt;strong&gt;SiS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Custom apps, ML inference, batch processing, non-Python languages → &lt;strong&gt;SPCS&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best Use Cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ML model inference endpoints (including private LLM execution)&lt;/li&gt;
&lt;li&gt;Batch data processing with sensitive data&lt;/li&gt;
&lt;li&gt;Applications requiring custom runtimes&lt;/li&gt;
&lt;li&gt;Migrating existing Docker apps to Snowflake&lt;/li&gt;
&lt;li&gt;Native Apps backend&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  AI-Assisted Development
&lt;/h2&gt;

&lt;p&gt;Tools that leverage AI to accelerate data and app development.&lt;/p&gt;
&lt;h3&gt;
  
  
  Cortex Code
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
Cortex Code, released in February 2026, is a &lt;strong&gt;Snowflake-native AI coding agent&lt;/strong&gt; - a truly &lt;strong&gt;revolutionary next-generation coding agent that transforms the Snowflake development experience&lt;/strong&gt;. It is positioned as the successor to Snowflake Copilot, significantly expanding and evolving Copilot's capabilities. If you've been using Copilot, Cortex Code is your upgrade path.&lt;/p&gt;

&lt;p&gt;It enables complex tasks in data engineering, analytics, machine learning, and agent development through natural language. What sets it apart is its deep understanding of Snowflake's data, compute, governance, and operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Available in two forms&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Form&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cortex Code in Snowsight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI coding assistance within Snowsight&lt;/td&gt;
&lt;td&gt;Near GA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cortex Code CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use from your local terminal, VS Code, Cursor, and other editors&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code generation with awareness of your Snowflake data context&lt;/li&gt;
&lt;li&gt;Accelerates data pipeline, analytics, and AI app development&lt;/li&gt;
&lt;li&gt;Enterprise-grade security and governance&lt;/li&gt;
&lt;li&gt;Integrates into existing development workflows (local IDE)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is a developer-oriented tool - generated code should be reviewed by technical users before use&lt;/li&gt;
&lt;li&gt;Cortex Code CLI requires environment setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best Use Cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL query authoring and optimization&lt;/li&gt;
&lt;li&gt;Data pipeline construction&lt;/li&gt;
&lt;li&gt;Cortex Agents development and tuning&lt;/li&gt;
&lt;li&gt;Day-to-day data development task acceleration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy284m3ubobcfobexuchh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy284m3ubobcfobexuchh.png" alt="Cortex Code" width="800" height="816"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Vercel v0 Integration
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Note&lt;/strong&gt;: Vercel v0 integration was announced in November 2025 but is still under development as of this article (February 2026) and is not yet available to general users. The information below is based on the announcement and specifications may change at GA.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
The &lt;strong&gt;Vercel v0 integration&lt;/strong&gt;, announced in November 2025, will enable generating and deploying Next.js applications powered by Snowflake data using natural language. v0 is Vercel's AI assistant for full-stack application development. Generated apps are deployed on SPCS.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Natural language data querying, app generation, deployment to Snowflake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Under Development (Coming Soon)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;SiS vs. Vercel v0 Integration&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Streamlit in Snowflake (SiS)&lt;/th&gt;
&lt;th&gt;Vercel v0 Integration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;TypeScript / JavaScript (Next.js)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data Analysts, Data Scientists&lt;/td&gt;
&lt;td&gt;Frontend / Full-stack Developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App Nature&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dynamic web apps from data analysis (Python-first)&lt;/td&gt;
&lt;td&gt;Production-grade native web apps from the start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UI Flexibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Streamlit components&lt;/td&gt;
&lt;td&gt;React-based, highly customizable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deploy Target&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Snowflake (Warehouse / Container Runtime)&lt;/td&gt;
&lt;td&gt;SPCS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SiS is ideal for data analysts and scientists who want to quickly turn their analyses into interactive apps using Python. Vercel v0 integration is for frontend developers who want to build production-quality native web apps from the start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capabilities&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ask questions about data&lt;/strong&gt;: Query schemas, table structures, and data content in natural language&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate applications&lt;/strong&gt;: Create Next.js apps for data visualization, dashboards, internal tools, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy to Snowflake&lt;/strong&gt;: Deploy generated apps on SPCS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;:&lt;br&gt;
Vercel's "Secure Vibe Coding Architecture" ensures application and auth layers are managed by Vercel while compute and data stay within Snowflake. Data never leaves Snowflake, and existing security policies and access controls apply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Use Cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sales pipeline dashboards&lt;/li&gt;
&lt;li&gt;Inventory monitoring tools&lt;/li&gt;
&lt;li&gt;Customer analytics applications&lt;/li&gt;
&lt;li&gt;Financial reporting interfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Official blog: &lt;a href="https://vercel.com/blog/build-and-deploy-data-applications-on-snowflake-with-v0" rel="noopener noreferrer"&gt;Build and deploy data applications on Snowflake with v0&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  AI Agent / MCP Integration
&lt;/h2&gt;

&lt;p&gt;Interfaces for accessing Snowflake data and capabilities from AI Agents.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Who should consider MCP?&lt;/strong&gt; If you're already using AI Agents like Claude Desktop, Cursor, or GitHub Copilot and want to &lt;strong&gt;add Snowflake to your AI ecosystem&lt;/strong&gt;, this is for you. MCP (Model Context Protocol) - often called the "USB-C for AI" - provides unified access to Snowflake data from multiple AI tools with a single configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Key Value of MCP Integration&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reduced Integration Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No need for individual connectors per AI tool - unified access via MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Less Context Switching&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Access Snowflake data directly within your AI assistant without interrupting workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Existing Governance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Leverage Snowflake's RBAC and security model as-is&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Future Investment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MCP is becoming the de facto standard for agent communication&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Snowflake Managed MCP Server
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
Snowflake Managed MCP Server is an &lt;strong&gt;MCP server hosted and managed by Snowflake&lt;/strong&gt;. Configure it from Snowsight and connect MCP Clients like Claude Desktop or Cursor to Snowflake capabilities. GA since November 2025.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cortex Search / Analyst / Agents connectivity, SQL execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developers, AI Agent Users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GA (2025/11)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy setup (configure from Snowsight, ~15-25 minutes)&lt;/li&gt;
&lt;li&gt;Operates within Snowflake's security model&lt;/li&gt;
&lt;li&gt;Seamless integration with Cortex features (Analyst / Search / Agents)&lt;/li&gt;
&lt;li&gt;Officially supported, no infrastructure management required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires separate MCP Client setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best Use Cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access Snowflake data from Claude Desktop / Cursor and other MCP Clients&lt;/li&gt;
&lt;li&gt;Automated data analysis via AI Agents&lt;/li&gt;
&lt;li&gt;RAG application backends&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  OSS Snowflake MCP Server
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
An &lt;strong&gt;open-source MCP Server&lt;/strong&gt; published by Snowflake Labs on &lt;a href="https://github.com/Snowflake-Labs/mcp" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Runs locally and connects with MCP Clients.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cortex Search / Analyst / Agents, SQL execution, object management, Semantic View queries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developers, AI Agent Users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Highlight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fine-grained permission control, local execution, early access to new features&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fine-grained SQL execution permissions (e.g., allow SELECT only)&lt;/li&gt;
&lt;li&gt;Flexible customization in local environments&lt;/li&gt;
&lt;li&gt;Early access to the latest features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires local setup and management&lt;/li&gt;
&lt;li&gt;Community support (not officially supported)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best Use Cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Snowflake data analysis in development environments&lt;/li&gt;
&lt;li&gt;Ad-hoc analysis from IDEs like Cursor&lt;/li&gt;
&lt;li&gt;AI Agent integration PoCs&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;For a deep dive into using the Snowflake MCP Server with Cursor, check out my previous article: &lt;a href="https://dev.to/tsubasa_tech/unlock-advanced-data-analytics-in-cursor-with-snowflake-mcp-server-2flb"&gt;Unlock Advanced Data Analytics in Cursor with Snowflake MCP Server&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Programmatic Access
&lt;/h2&gt;

&lt;p&gt;Tools for connecting to Snowflake via command line or code for development and operations.&lt;/p&gt;
&lt;h3&gt;
  
  
  Snowflake CLI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
Snowflake CLI is &lt;strong&gt;Snowflake's official open-source command-line interface&lt;/strong&gt;. Positioned as the successor to SnowSQL, it includes SnowSQL's capabilities plus integrated development and deployment features for Snowpark apps, Streamlit apps, Native Apps, and more. Snowflake recommends migrating from SnowSQL to Snowflake CLI.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQL execution, Snowpark / Streamlit / Native Apps deployment, Git integration, automation scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developers, DevOps Engineers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Highlight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open source, modern development workflow support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD pipeline integration&lt;/li&gt;
&lt;li&gt;Deploy Snowpark, Streamlit, and Native Apps from the command line&lt;/li&gt;
&lt;li&gt;Open source with community-driven extensions&lt;/li&gt;
&lt;li&gt;Usable from SSH-connected servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No GUI - not ideal for visual data exploration&lt;/li&gt;
&lt;li&gt;Some command syntax differences when migrating from SnowSQL&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;If you're currently using SnowSQL, refer to the &lt;a href="https://docs.snowflake.com/en/user-guide/snowsql-migrate" rel="noopener noreferrer"&gt;official migration guide&lt;/a&gt; to plan your transition to Snowflake CLI.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Snowpark Python SDK
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
A Python SDK for natively interacting with Snowflake. Provides intuitive data manipulation through the DataFrame API.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DataFrame API, UDF/UDTF/UDAF creation, ML integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data Engineers, Data Scientists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Highlight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Write in Python, execute server-side (pushdown)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pandas-like interface&lt;/li&gt;
&lt;li&gt;Performance gains through Snowflake-side pushdown execution&lt;/li&gt;
&lt;li&gt;Snowpark ML integration for machine learning workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some advanced SQL features require direct SQL&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  SQL API and Connectors
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
Snowflake provides a REST API and drivers/connectors for various programming languages, enabling applications to connect to Snowflake for data operations.&lt;/p&gt;
&lt;h4&gt;
  
  
  SQL REST API
&lt;/h4&gt;

&lt;p&gt;The Snowflake SQL REST API (&lt;code&gt;/api/v2/statements&lt;/code&gt;) enables SQL execution via HTTP requests.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /api/v2/statements&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Execute SQL statements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /api/v2/statements/&amp;lt;handle&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check execution status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /api/v2/statements/&amp;lt;handle&amp;gt;/cancel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cancel execution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Authentication supports OAuth and JWT (key-pair authentication).&lt;/p&gt;
&lt;h4&gt;
  
  
  Drivers / Connectors
&lt;/h4&gt;

&lt;p&gt;A comprehensive set of drivers and connectors for various programming languages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Drivers / Connectors&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database Drivers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JDBC, ODBC, Go, .NET, Node.js, PHP PDO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Python Ecosystem&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Snowflake Connector for Python, Snowpark, Snowpark ML, SQLAlchemy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Snowflake Connector for Kafka, Snowflake Connector for Spark&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQL execution, data operations, multi-language support, system integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Highlight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Broad language support: Java, Python, Node.js, Go, .NET, ODBC, JDBC, and more&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;REST API vs. Connectors&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;SQL REST API&lt;/th&gt;
&lt;th&gt;Drivers / Connectors&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access Method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP requests&lt;/td&gt;
&lt;td&gt;Library-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lightweight integrations, async processing, serverless environments&lt;/td&gt;
&lt;td&gt;High-volume data processing, complex workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Session Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stateless&lt;/td&gt;
&lt;td&gt;Auto-managed by connector&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy integration into existing applications&lt;/li&gt;
&lt;li&gt;Fits microservice architectures well&lt;/li&gt;
&lt;li&gt;Broad programming language support&lt;/li&gt;
&lt;li&gt;REST API works in serverless environments (AWS Lambda, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST API is best for lightweight operations; connectors recommended for high-volume data processing&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Third-Party Integration
&lt;/h2&gt;

&lt;p&gt;Methods for connecting to Snowflake from external tools and applications.&lt;/p&gt;
&lt;h3&gt;
  
  
  BI Tools
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
Connect to Snowflake from existing BI tools like Tableau, Power BI, Looker, Sigma, ThoughtSpot, and others for visualization.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Representative Tools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tableau, Power BI, Looker, Sigma, ThoughtSpot, Metabase, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data Analysts, Business Users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Highlight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rich visualizations, leverage existing skills&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extensive visualization capabilities&lt;/li&gt;
&lt;li&gt;Leverage existing BI skills and expertise&lt;/li&gt;
&lt;li&gt;Integrate with tools already in your organization&lt;/li&gt;
&lt;li&gt;Enterprise-grade features (scheduling, permissions, distribution, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Additional BI tool licensing costs&lt;/li&gt;
&lt;li&gt;Data freshness concerns with extract mode&lt;/li&gt;
&lt;li&gt;Some tools may lag in supporting latest Snowflake features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best Use Cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Executive dashboards&lt;/li&gt;
&lt;li&gt;Scheduled report distribution&lt;/li&gt;
&lt;li&gt;Complex visualizations&lt;/li&gt;
&lt;li&gt;Large-scale BI deployments&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Custom Applications
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
Build custom applications using Snowflake Connectors or SQL API.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tech Stack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;React, Vue.js, Flask, Django, or any framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developers → Business Users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Highlight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complete customization control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full control over UI/UX&lt;/li&gt;
&lt;li&gt;Deep integration with existing systems&lt;/li&gt;
&lt;li&gt;Custom business logic implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons / Considerations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security design is your responsibility&lt;/li&gt;
&lt;li&gt;Authentication and authorization must be implemented&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Use Case-Based Selection Guide
&lt;/h2&gt;

&lt;p&gt;For those asking &lt;em&gt;"So which one should I actually use?"&lt;/em&gt; - here's a practical selection guide.&lt;/p&gt;
&lt;h3&gt;
  
  
  Recommended Tools by User Type
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User Type&lt;/th&gt;
&lt;th&gt;Recommended Tool&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Business User&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Snowflake Intelligence&lt;/td&gt;
&lt;td&gt;No SQL required - analyze with natural language. Cortex Agents combine tools to answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Analyst&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Workspaces&lt;/td&gt;
&lt;td&gt;Flexible analysis with SQL / Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Scientist&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Snowflake Notebooks&lt;/td&gt;
&lt;td&gt;Interactive analysis with Python + SQL + Streamlit. GPU via Container Runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Engineer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Workspaces + Snowflake CLI&lt;/td&gt;
&lt;td&gt;SQL / Notebooks / dbt development, CI/CD integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App Developer (Python)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SiS&lt;/td&gt;
&lt;td&gt;Rapid app development in Python. Container Runtime for cost optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App Developer (Custom)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SPCS&lt;/td&gt;
&lt;td&gt;Any language/framework, GPU, data stays in Snowflake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Agent User&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Snowflake Managed MCP Server&lt;/td&gt;
&lt;td&gt;Connect existing AI Agents (Claude Desktop, Cursor, etc.) to Snowflake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full-Stack Developer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vercel v0 Integration (Coming Soon)&lt;/td&gt;
&lt;td&gt;Generate Next.js apps with natural language, deploy to SPCS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Recommended Tools by Use Case
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Recommended Tool&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ad-hoc SQL / Python analysis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Workspaces&lt;/td&gt;
&lt;td&gt;Notebooks also available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Natural language analytics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Intelligence&lt;/td&gt;
&lt;td&gt;Cortex Agents + Analyst / Search / Custom Tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exploratory Data Analysis (EDA)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Notebooks (Warehouse Runtime)&lt;/td&gt;
&lt;td&gt;Python + SQL + Streamlit visualizations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deep learning / Large-scale ML&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Notebooks (Container Runtime)&lt;/td&gt;
&lt;td&gt;GPU available, PyTorch / TensorFlow pre-installed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Team dashboards / KPI monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SiS (Container Runtime)&lt;/td&gt;
&lt;td&gt;Low-cost always-on, shared caching, Python-only development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom app development&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SiS (Warehouse Runtime)&lt;/td&gt;
&lt;td&gt;Rapid development, Snowflake auth integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ML model inference / LLM execution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SPCS&lt;/td&gt;
&lt;td&gt;GPU support, data stays in Snowflake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App distribution / monetization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native Apps&lt;/td&gt;
&lt;td&gt;Marketplace / Private Listing / Reader Account distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Agent integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Snowflake Managed MCP Server&lt;/td&gt;
&lt;td&gt;Easy setup, officially supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Agent integration (custom)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OSS Snowflake MCP Server&lt;/td&gt;
&lt;td&gt;Fine-grained permissions, local execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advanced visualizations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BI Tools (Tableau, Power BI, etc.)&lt;/td&gt;
&lt;td&gt;Proven enterprise features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;dbt project development&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Workspaces&lt;/td&gt;
&lt;td&gt;dbt Projects on Snowflake integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CI/CD / automation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Snowflake CLI&lt;/td&gt;
&lt;td&gt;Automate Snowpark / SiS / Native Apps deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Cortex Code AI Assistance&lt;/strong&gt;: Workspaces, Notebooks, and SiS all support Cortex Code for AI-assisted coding. Generate and edit code with natural language to dramatically boost development productivity. For local IDEs (VS Code, Cursor, etc.), Cortex Code CLI is also available.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Key Decision Factors
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SQL / Python skills&lt;/strong&gt;: Proficient → Workspaces / Notebooks. Not proficient → Intelligence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need dashboards / visualizations?&lt;/strong&gt; Simple ones → SiS (Container Runtime) at low cost. Advanced → BI tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customization needs&lt;/strong&gt;: High → SiS / SPCS / custom development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU required?&lt;/strong&gt; → Notebooks (Container Runtime) or SPCS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can data leave Snowflake?&lt;/strong&gt; No → Snowflake native UI (SiS / SPCS / Notebooks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Existing tools&lt;/strong&gt;: Already have BI tools → connect them to Snowflake. Already using AI Agents → connect via MCP Server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale of deployment&lt;/strong&gt;: Organization-wide → Intelligence. Team-level → Intelligence / SiS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI strategy&lt;/strong&gt;: Heavy AI Agent use → MCP Server. Development assistance → Cortex Code. App generation → Vercel v0 (coming soon)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Snowflake's data UI has diversified remarkably in just two years. While the abundance of options can feel overwhelming, it also means &lt;strong&gt;you can now choose the tool that's truly optimal for your organization and use case&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Personally, I find the most value in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Snowflake Intelligence for data democratization&lt;/strong&gt;: Business users who can't write SQL can now query data directly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snowflake Managed MCP Server for AI Agent integration&lt;/strong&gt;: Analyze data without leaving your development tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SiS simplicity with Container Runtime&lt;/strong&gt;: Build custom dashboards and analytics tools in Python alone, with Container Runtime enabling low-cost always-on operation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cortex Code / Vercel v0 integration potential&lt;/strong&gt;: AI-assisted development dramatically accelerating data and app development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The analytics experience is evolving from static reports to &lt;strong&gt;interactive conversations with data, gaining insights alongside AI&lt;/strong&gt;. I hope this guide helps you find the right tools to accelerate your data journey!&lt;/p&gt;
&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I share Snowflake What's New updates on X. Follow for the latest insights:&lt;/p&gt;
&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20260205) Initial post&lt;/p&gt;
&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://zenn.dev/snowflakejp/articles/be0c2053116787" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fzenn%2Fimage%2Fupload%2Fs--eAeDE7xV--%2Fc_fit%252Cg_north_west%252Cl_text%3Anotosansjp-medium.otf_55%3ASnowflake%252520%2525E3%252583%252587%2525E3%252583%2525BC%2525E3%252582%2525BF%2525E6%2525B4%2525BB%2525E7%252594%2525A8%252520UI%252520%2525E3%252582%2525AC%2525E3%252582%2525A4%2525E3%252583%252589%252520-%252520%2525E6%25259C%252580%2525E9%252581%2525A9%2525E3%252581%2525AA%2525E3%252583%252584%2525E3%252583%2525BC%2525E3%252583%2525AB%2525E9%252581%2525B8%2525E6%25258A%25259E%2525E3%252581%2525A7%2525E5%252588%252586%2525E6%25259E%252590%2525E4%2525BD%252593%2525E9%2525A8%252593%2525E3%252582%252592%2525E5%252590%252591%2525E4%2525B8%25258A%2525E3%252581%252595%2525E3%252581%25259B%2525E3%252582%25258B%252Cw_1010%252Cx_90%252Cy_100%2Fg_south_west%252Cl_text%3Anotosansjp-medium.otf_34%3Atsubasa%252Cx_220%252Cy_108%2Fbo_3px_solid_rgb%3Ad6e3ed%252Cg_south_west%252Ch_90%252Cl_fetch%3AaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzQ0ZmE2OGQyM2YuanBlZw%3D%3D%252Cr_20%252Cw_90%252Cx_92%252Cy_102%2Fco_rgb%3A6e7b85%252Cg_south_west%252Cl_text%3Anotosansjp-medium.otf_30%3ASnowflake%252520Japan%252Cx_220%252Cy_160%2Fbo_4px_solid_white%252Cg_south_west%252Ch_50%252Cl_fetch%3AaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2RkODMzYmYwZDcuanBlZw%3D%3D%252Cr_max%252Cw_50%252Cx_139%252Cy_84%2Fv1627283836%2Fdefault%2Fog-base-w1200-v2.png%3F_a%3DBACAGSGT" height="630" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://zenn.dev/snowflakejp/articles/be0c2053116787" rel="noopener noreferrer" class="c-link"&gt;
            Snowflake データ活用 UI ガイド - 最適なツール選択で分析体験を向上させる
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.zenn.studio%2Fimages%2Flogo-transparent.png" width="315" height="315"&gt;
          zenn.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>snowflake</category>
      <category>ai</category>
      <category>sql</category>
      <category>python</category>
    </item>
    <item>
      <title>Revolutionize Your Search with Snowflake Cortex Search Multi-Index and Index-Specific Boosts</title>
      <dc:creator>Tsubasa Kanno</dc:creator>
      <pubDate>Mon, 12 Jan 2026 03:52:54 +0000</pubDate>
      <link>https://forem.com/tsubasa_tech/revolutionize-your-search-with-snowflake-cortex-search-multi-index-and-index-specific-boosts-4ogn</link>
      <guid>https://forem.com/tsubasa_tech/revolutionize-your-search-with-snowflake-cortex-search-multi-index-and-index-specific-boosts-4ogn</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Snowflake's Cortex Search just received a major upgrade with &lt;strong&gt;Multi-Index&lt;/strong&gt; and &lt;strong&gt;Index-Specific Boosts&lt;/strong&gt;! These powerful features dramatically enhance search flexibility and precision, enabling scenarios like "exact match on product codes while semantic search on descriptions."&lt;/p&gt;

&lt;p&gt;In this article, I'll walk you through these new features using hands-on examples with dummy data in Snowsight, demonstrating their value and practical implementation.&lt;/p&gt;

&lt;p&gt;For a comprehensive overview of Cortex Search fundamentals, check out the &lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-search/cortex-search-overview" rel="noopener noreferrer"&gt;official Snowflake documentation&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note (2026/1/12)&lt;/strong&gt;: Cortex Search Multi-Index is currently in Public Preview. Features may be significantly updated in the future.&lt;/p&gt;

&lt;p&gt;Note: A &lt;strong&gt;Custom Embedding (BYO Embed: Bring Your Own Embedding)&lt;/strong&gt; feature was also released alongside these features, but is not covered in this article.&lt;/p&gt;

&lt;p&gt;Note: This article represents my personal views and not those of Snowflake.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Cortex Search Quick Recap
&lt;/h2&gt;

&lt;p&gt;Let me briefly explain what &lt;strong&gt;Cortex Search&lt;/strong&gt; is. Cortex Search is a &lt;strong&gt;fully-managed enterprise search service&lt;/strong&gt; provided by Snowflake.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid Search&lt;/strong&gt;: Combines vector search (semantic similarity) with keyword search (lexical similarity) for high-precision results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Embedding Generation&lt;/strong&gt;: Automatically and regularly vectorizes text data to enable semantic search capabilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fully Managed&lt;/strong&gt;: No infrastructure management or tuning required - ready to use immediately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snowflake Native&lt;/strong&gt;: Complete integration with Snowflake's data governance and security features&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Multi-Index?
&lt;/h2&gt;

&lt;p&gt;Multi-Index enables you to &lt;strong&gt;create separate indexes for multiple columns with different characteristics, and combine them during search&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Previously, Cortex Search was primarily designed for searching a single column. However, real-world business scenarios often require searching across multiple fields like "product code," "product name," and "product description." With Multi-Index, you can integrate these into a single search service and apply the most appropriate search method for each field's characteristics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-Index Use Cases
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-field Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search across product codes, names, and descriptions with different characteristics simultaneously&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Field-specific Search Logic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apply strict keyword matching to product codes while using semantic search for descriptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Precise Result Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Adjust the importance of each field to achieve optimal search results for your business requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What are Index-Specific Boosts?
&lt;/h2&gt;

&lt;p&gt;Index-Specific Boosts enable you to &lt;strong&gt;adjust the weights of individual columns within the same index type in Multi-Index searches&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example, if you have &lt;code&gt;product_code&lt;/code&gt; and &lt;code&gt;product_name&lt;/code&gt; as TEXT INDEXes, even when searching with the same keyword, the optimal results differ depending on whether you want to prioritize "matches in product code" or "matches in product name." Index-Specific Boosts let you flexibly control this balance per search query.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;weights&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search type weighting&lt;/td&gt;
&lt;td&gt;Adjusts the overall balance between keyword search (texts), vector search (vectors), and reranker scores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;text_boosts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TEXT INDEX weighting&lt;/td&gt;
&lt;td&gt;Adjusts individual column weights within TEXT INDEXes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;vector_boosts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VECTOR INDEX weighting&lt;/td&gt;
&lt;td&gt;Adjusts individual column weights within VECTOR INDEXes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Official documentation: &lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-search/cortex-search-customize-scoring#index-specific-boosts" rel="noopener noreferrer"&gt;Customizing Cortex Search scoring - Index-specific boosts&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Business Value and Benefits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Transforming Search Experience
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Previous Limitation&lt;/th&gt;
&lt;th&gt;Multi-Index &amp;amp; Index-Specific Boosts Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Limited to single-field search&lt;/td&gt;
&lt;td&gt;Cross-field integrated search now possible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same search logic applied to all fields&lt;/td&gt;
&lt;td&gt;Apply optimal search methods (keyword/semantic) per field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difficult to customize search results&lt;/td&gt;
&lt;td&gt;Flexible ranking adjustments with Index-Specific Boosts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hybrid search balance was automatic&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Customize each field's contribution per search query&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Expected Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;E-commerce Product Search&lt;/strong&gt; — Prioritize exact matches on SKUs and product codes while supporting semantic search on product descriptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal Knowledge Search&lt;/strong&gt; — Balance strict matching on document titles with semantic search on document bodies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer Support&lt;/strong&gt; — Apply different weights to FAQ titles and bodies to deliver results that better match user intent&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cortex Search Integration Scenarios
&lt;/h3&gt;

&lt;p&gt;Cortex Search maximizes its value when combined with various Snowflake features beyond standalone use.&lt;/p&gt;

&lt;h4&gt;
  
  
  AI Agent Context
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Snowflake Managed MCP Server&lt;/strong&gt; — When AI Agents access data within Snowflake, they can search and retrieve enterprise-specific domain knowledge through Cortex Search. Multi-Index enables flexible searching across both structured and unstructured data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snowflake Intelligence&lt;/strong&gt; — Cortex Search serves as the foundation for searching relevant documents and knowledge to generate more accurate responses to natural language queries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Data App Context
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Streamlit in Snowflake&lt;/strong&gt; — Easily build user-friendly search interfaces by calling Cortex Search within Streamlit apps. With Index-Specific Boosts, you can dynamically control search weighting from the application layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Biggest Value I See
&lt;/h3&gt;

&lt;p&gt;Personally, I find tremendous value in &lt;strong&gt;"being able to flexibly control the balance between exact match and fuzzy search for multiple fields per search query."&lt;/strong&gt; Previously, you could only search with a uniform balance across the entire search service, but by combining Multi-Index with Index-Specific Boosts, you can now dynamically change search behavior based on user intent and business requirements.&lt;/p&gt;

&lt;p&gt;Furthermore, I believe enterprise search will serve as a &lt;strong&gt;core component for complementing enterprise-specific domain knowledge in RAG and AI Agent applications&lt;/strong&gt;. In other words, improvements in search flexibility and precision directly translate to improvements in RAG response quality and AI Agent decision accuracy. In this sense, Multi-Index and Index-Specific Boosts represent a significant update that contributes to elevating enterprise AI adoption overall, not just a mere search feature improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Important Considerations
&lt;/h2&gt;

&lt;p&gt;Please keep the following points in mind when using Multi-Index:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Consideration&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Creating and maintaining multiple indexes may increase compute and storage costs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search performance may be affected by the number and configuration of indexes, so proper design is important&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Query results under 1 million rows are recommended for optimal performance (contact Snowflake if exceeding 1 million rows)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Official documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-search/cortex-search-overview#label-cortex-multi-index-search" rel="noopener noreferrer"&gt;Cortex Search Multi-index Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-search/query-cortex-search-service#multi-index-queries" rel="noopener noreferrer"&gt;Query Multi-index Cortex Search Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-search/cortex-search-customize-scoring#label-cortex-search-index-boosts" rel="noopener noreferrer"&gt;Index-specific Boosts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hands-on Tutorial
&lt;/h2&gt;

&lt;p&gt;Let's try out Multi-Index and Index-Specific Boosts! We'll use dummy product catalog data to create a Cortex Search service in Snowsight and verify the behavior with SQL queries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo Scenario
&lt;/h3&gt;

&lt;p&gt;For this demo, we'll simulate an e-commerce product search scenario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;product_code&lt;/strong&gt;: Product code (exact match is critical, like SKUs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;product_name&lt;/strong&gt;: Product name (balance between exact match and keyword matching)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;description&lt;/strong&gt;: Product description (semantic fuzzy search is effective)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll create a Multi-Index on these three fields and experience how search results change when we adjust each field's importance based on the search context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Prepare Demo Data
&lt;/h3&gt;

&lt;p&gt;First, let's create a table and insert sample data in Snowsight's SQL Worksheets. Run the following query (feel free to use your own data if available):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Create demo database and schema&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;cortex_search_demo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;cortex_search_demo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;multi_index_demo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;cortex_search_demo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;multi_index_demo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Create warehouse (you can use your existing warehouse)&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;WAREHOUSE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;cortex_search_wh&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt;
   &lt;span class="n"&gt;WAREHOUSE_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'X-SMALL'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Create product catalog table&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;product_catalog&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;product_id&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;product_code&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;product_name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Insert sample data (fictional products)&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;product_catalog&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'CBP-16-X9-PRO'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'CloudBook Pro 16 X9'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'The latest 16-inch professional laptop featuring the X9 processor. Known for high-performance graphics processing and extended battery life. Ideal for video editing and CAD work.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Laptop'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3988&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'CBP-14-X7'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'CloudBook Pro 14 X7'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Compact 14-inch model with X7 processor. Lightweight 1.2kg design perfect for mobile workers.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Laptop'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2488&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'CBA-15-X5'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'CloudBook Air 15 X5'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Amazingly thin and light 15-inch large-screen laptop. Handles everything from daily use to creative work.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Laptop'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1988&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'PPD-13-Z4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'PixelPad Pro 13 Z4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Top-tier tablet with Z4 chip. Perfect for illustration and design work when paired with a stylus pen.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Tablet'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2188&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'ODK-24-X9'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'OmniDesk 24 X9'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Beautiful all-in-one desktop with 4.5K display. Ideal for home and office use. Quiet design for comfortable extended work sessions.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Desktop'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1988&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'TNB-X1-G12'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'TechNova Business X1 Gen12'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Lightweight business laptop. A proven model that balances durability and portability. Packed with security features.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Laptop'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2980&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'FXP-11-HYBRID'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'FlexPad 11 Hybrid'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'The definitive 2-in-1 device. Flexible enough to use as both a tablet and laptop. Recommended for frequent travelers.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Tablet'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1768&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'VNS-15-CREATOR'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'VisionStudio 15 Creator Edition'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'High-performance laptop for creators. 4K OLED display ideal for video production. Runs video editing software smoothly.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Laptop'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3298&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Verify data&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;product_catalog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh04lgeuekmeyagcmpic5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh04lgeuekmeyagcmpic5.png" alt=" " width="800" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verify that the table is created and data is inserted in Snowsight.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create Cortex Search Service with Multi-Index
&lt;/h3&gt;

&lt;p&gt;Next, let's create a Cortex Search service with indexes on multiple columns.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;: As of January 2026, &lt;strong&gt;Snowsight's GUI does not support creating Multi-Index Cortex Search services&lt;/strong&gt;. You must use SQL to create Multi-Index services.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Run the following query in Snowflake SQL Worksheets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Create Cortex Search Service with Multi-Index&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="n"&gt;CORTEX&lt;/span&gt; &lt;span class="k"&gt;SEARCH&lt;/span&gt; &lt;span class="n"&gt;SERVICE&lt;/span&gt; &lt;span class="n"&gt;product_multi_search&lt;/span&gt;
    &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="n"&gt;INDEXES&lt;/span&gt; &lt;span class="n"&gt;product_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;product_name&lt;/span&gt;
    &lt;span class="n"&gt;VECTOR&lt;/span&gt; &lt;span class="n"&gt;INDEXES&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'voyage-multilingual-2'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ATTRIBUTES&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;
    &lt;span class="n"&gt;WAREHOUSE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cortex_search_wh&lt;/span&gt;
    &lt;span class="n"&gt;TARGET_LAG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'1 hour'&lt;/span&gt;
    &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;SELECT&lt;/span&gt;
            &lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;product_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;product_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;price&lt;/span&gt;
        &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;product_catalog&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Multi-Index uses &lt;code&gt;TEXT INDEXES&lt;/code&gt; and &lt;code&gt;VECTOR INDEXES&lt;/code&gt; to create indexes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TEXT INDEXES&lt;/strong&gt;: Indexes for keyword (lexical) search. Suitable for fields like &lt;code&gt;product_code&lt;/code&gt; or &lt;code&gt;product_name&lt;/code&gt; where exact match or keyword matching is important.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VECTOR INDEXES&lt;/strong&gt;: Indexes for vector (semantic) search. Suitable for fields like &lt;code&gt;description&lt;/code&gt; where semantic similarity search is important. We explicitly specify the &lt;code&gt;voyage-multilingual-2&lt;/code&gt; model for better multilingual performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: When creating a Multi-Index service, &lt;strong&gt;you must specify at least one column in VECTOR INDEXES&lt;/strong&gt;. Omitting VECTOR INDEXES will result in an error.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;SQL Reference: &lt;a href="https://docs.snowflake.com/en/sql-reference/sql/create-cortex-search" rel="noopener noreferrer"&gt;CREATE CORTEX SEARCH SERVICE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6e63v20y33vua7nzzvkf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6e63v20y33vua7nzzvkf.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verify that the service is created in AI Studio's Cortex Search list view or via &lt;code&gt;SHOW CORTEX SEARCH SERVICES;&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Testing Multi-Index Search and Index-Specific Boosts
&lt;/h3&gt;

&lt;p&gt;This is where Multi-Index and Index-Specific Boosts really shine!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;: As of January 2026, the Playground does not support Index-Specific Boosts, so &lt;strong&gt;we'll execute searches via SQL queries&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When querying a Multi-Index service, you can use the &lt;code&gt;multi_index_query&lt;/code&gt; parameter to &lt;strong&gt;explicitly specify which index receives which query&lt;/strong&gt;. Additionally, the &lt;code&gt;scoring_config&lt;/code&gt; &lt;code&gt;weights&lt;/code&gt; parameter lets you &lt;strong&gt;adjust the weight balance between keyword search (texts) and vector search (vectors)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Official documentation: &lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-search/query-cortex-search-service#multi-index-queries" rel="noopener noreferrer"&gt;Query a Cortex Search Service - Multi-index queries&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Demo Scenario Explanation
&lt;/h4&gt;

&lt;p&gt;The key point of Multi-Index is that you can &lt;strong&gt;send different appropriate queries to each index&lt;/strong&gt;. Similar to the official documentation examples, you send keyword-matching strings to TEXT INDEX and semantic queries to VECTOR INDEX.&lt;/p&gt;

&lt;p&gt;For this demo, we'll verify the following scenario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TEXT INDEX (product_name)&lt;/strong&gt; receives the keyword "CloudBook" → Products with "CloudBook" in the name get keyword matches&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VECTOR INDEX (description)&lt;/strong&gt; receives the semantic query "a PC that's safe to use while traveling" → Products with semantically related descriptions get matches&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product Name&lt;/th&gt;
&lt;th&gt;TEXT Match&lt;/th&gt;
&lt;th&gt;VECTOR Match&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudBook Air 15 X5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓ (contains "CloudBook" in name)&lt;/td&gt;
&lt;td&gt;△ (no mention of security)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudBook Pro 14 X7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓ (contains "CloudBook" in name)&lt;/td&gt;
&lt;td&gt;△ (no mention of security)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TechNova Business X1 Gen12&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓ ("Packed with security features" → semantically related to "safe")&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By changing &lt;code&gt;weights&lt;/code&gt;, you can control which type of match is prioritized.&lt;/p&gt;

&lt;h4&gt;
  
  
  Case 1: Prioritize Keyword Search (texts)
&lt;/h4&gt;

&lt;p&gt;By increasing the &lt;code&gt;texts&lt;/code&gt; weight, &lt;strong&gt;products with "CloudBook" in their names appear at the top&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Prioritize keyword search: set texts weight high&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'product_name'&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;product_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FLATTEN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PARSE_JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;SNOWFLAKE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CORTEX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SEARCH_PREVIEW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'cortex_search_demo.multi_index_demo.product_multi_search'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'{
            "multi_index_query": {
                "product_name": [{"text": "CloudBook"}],
                "description": [{"text": "a PC that is safe to use while traveling"}]
            },
            "scoring_config": {
                "weights": {
                    "texts": 5,
                    "vectors": 1,
                    "reranker": 1
                }
            },
            "columns": ["product_name", "description"],
            "limit": 5
        }'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="s1"&gt;'results'&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1073lvw2889ds5kwpsm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1073lvw2889ds5kwpsm.png" alt=" " width="800" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verify that CloudBook series products appear at the top. This is because the product names contain the keyword "CloudBook." Of course, vector search results are also factored in, albeit with lower weight.&lt;/p&gt;

&lt;h4&gt;
  
  
  Case 2: Prioritize Vector Search (vectors)
&lt;/h4&gt;

&lt;p&gt;By increasing the &lt;code&gt;vectors&lt;/code&gt; weight, &lt;strong&gt;products with descriptions semantically related to "a PC that's safe to use while traveling" appear at the top&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Prioritize vector search: set vectors weight high&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'product_name'&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;product_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FLATTEN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PARSE_JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;SNOWFLAKE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CORTEX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SEARCH_PREVIEW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'cortex_search_demo.multi_index_demo.product_multi_search'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'{
            "multi_index_query": {
                "product_name": [{"text": "CloudBook"}],
                "description": [{"text": "a PC that is safe to use while traveling"}]
            },
            "scoring_config": {
                "weights": {
                    "texts": 1,
                    "vectors": 5,
                    "reranker": 1
                }
            },
            "columns": ["product_name", "description"],
            "limit": 5
        }'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="s1"&gt;'results'&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F93l7nnbxv44l1q9ooyxz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F93l7nnbxv44l1q9ooyxz.png" alt=" " width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verify that "TechNova Business X1 Gen12" appears at the top. Its description mentions "Packed with security features," which semantically matches the query "safe to use while traveling."&lt;/p&gt;

&lt;h4&gt;
  
  
  Case 3: Query Only VECTOR INDEX
&lt;/h4&gt;

&lt;p&gt;With &lt;code&gt;multi_index_query&lt;/code&gt;, you can also &lt;strong&gt;target only specific indexes&lt;/strong&gt;. When searching only the VECTOR INDEX without TEXT INDEX, you get results based purely on semantic relevance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Query only VECTOR INDEX (description)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'product_name'&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;product_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FLATTEN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PARSE_JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;SNOWFLAKE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CORTEX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SEARCH_PREVIEW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'cortex_search_demo.multi_index_demo.product_multi_search'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'{
            "multi_index_query": {
                "description": [{"text": "high-spec PC ideal for creative video production"}]
            },
            "columns": ["product_name", "description"],
            "limit": 3
        }'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="s1"&gt;'results'&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiskivfqqg5vdrrlsamo4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiskivfqqg5vdrrlsamo4.png" alt=" " width="800" height="115"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verify that products with descriptions mentioning "video editing," "video production," or "creator" (like VisionStudio 15 Creator Edition) appear at the top.&lt;/p&gt;

&lt;h4&gt;
  
  
  Case 4: Using Index-Specific Boosts (text_boosts)
&lt;/h4&gt;

&lt;p&gt;With &lt;code&gt;text_boosts&lt;/code&gt;, you can &lt;strong&gt;adjust the weight of each column within TEXT INDEXes individually&lt;/strong&gt;. In this demo, we have &lt;code&gt;product_code&lt;/code&gt; and &lt;code&gt;product_name&lt;/code&gt; defined as TEXT INDEXes, so even when searching with the same keyword "Pro," you can control whether to prioritize matches in product code or product name.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;code&gt;multi_index_query&lt;/code&gt; &lt;strong&gt;requires at least one VECTOR INDEX to be specified&lt;/strong&gt;. TEXT INDEX-only queries will result in an error.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- text_boosts: prioritize product_name matches over product_code&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'product_code'&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;product_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'product_name'&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;product_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FLATTEN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PARSE_JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;SNOWFLAKE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CORTEX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SEARCH_PREVIEW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'cortex_search_demo.multi_index_demo.product_multi_search'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'{
            "multi_index_query": {
                "product_code": [{"text": "Pro"}],
                "product_name": [{"text": "Pro"}],
                "description": [{"text": "high-performance laptop"}]
            },
            "scoring_config": {
                "weights": {
                    "texts": 5,
                    "vectors": 1,
                    "reranker": 1
                },
                "functions": {
                    "text_boosts": [
                        {"column": "product_code", "weight": 1},
                        {"column": "product_name", "weight": 3}
                    ]
                }
            },
            "columns": ["product_code", "product_name", "description"],
            "limit": 5
        }'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="s1"&gt;'results'&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1l8s99u64l4o9javm5wt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1l8s99u64l4o9javm5wt.png" alt=" " width="800" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The keyword "Pro" appears in both product codes (CBP-16-X9-&lt;strong&gt;PRO&lt;/strong&gt;) and product names (CloudBook &lt;strong&gt;Pro&lt;/strong&gt; 16 X9, PixelPad &lt;strong&gt;Pro&lt;/strong&gt; 13 Z4, etc.), but since we've weighted &lt;code&gt;product_name&lt;/code&gt; higher, products with "Pro" in their names are prioritized.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: When using &lt;code&gt;text_boosts&lt;/code&gt;, you &lt;strong&gt;must specify weights for all columns defined as TEXT INDEXes&lt;/strong&gt;. Specifying only some columns will result in an error. The same applies to &lt;code&gt;vector_boosts&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Search Results Comparison Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;Configuration&lt;/th&gt;
&lt;th&gt;Expected Top Products&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Case 1&lt;/td&gt;
&lt;td&gt;Prioritize texts&lt;/td&gt;
&lt;td&gt;CloudBook series&lt;/td&gt;
&lt;td&gt;"CloudBook" keyword matches in product name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Case 2&lt;/td&gt;
&lt;td&gt;Prioritize vectors&lt;/td&gt;
&lt;td&gt;TechNova Business X1 Gen12&lt;/td&gt;
&lt;td&gt;"security features" semantically matches "safe to use while traveling"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Case 3&lt;/td&gt;
&lt;td&gt;description only&lt;/td&gt;
&lt;td&gt;VisionStudio 15 Creator Edition&lt;/td&gt;
&lt;td&gt;"video production" related descriptions semantically match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Case 4&lt;/td&gt;
&lt;td&gt;text_boosts with product_name priority&lt;/td&gt;
&lt;td&gt;Products with "Pro" in name&lt;/td&gt;
&lt;td&gt;text_boosts sets product_name weight higher&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As you can see, &lt;strong&gt;by sending different queries to TEXT INDEX and VECTOR INDEX, adjusting the weight balance with &lt;code&gt;weights&lt;/code&gt;, fine-tuning individual column weights with &lt;code&gt;text_boosts&lt;/code&gt;/&lt;code&gt;vector_boosts&lt;/code&gt;, and targeting specific indexes, you can flexibly control search results&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;How was it? Cortex Search's &lt;strong&gt;Multi-Index&lt;/strong&gt; and &lt;strong&gt;Index-Specific Boosts&lt;/strong&gt; enable flexible cross-field search and fine-grained weight adjustments based on search context.&lt;/p&gt;

&lt;p&gt;I see significant value in the following points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Search Flexibility&lt;/strong&gt;: Integrate and search across fields with different characteristics like product codes, names, and descriptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Search Control&lt;/strong&gt;: Change boost values per search to switch between exact-match focus ↔ fuzzy-search focus&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business Requirement Alignment&lt;/strong&gt;: Deliver optimal search experiences across various scenarios including e-commerce, internal knowledge bases, and customer support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Agent Accuracy Improvement&lt;/strong&gt;: Enhanced search flexibility and precision directly improves RAG response quality and AI Agent decision accuracy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In an era where AI Agents are increasingly adopted within enterprises, &lt;strong&gt;enterprise search becomes a core component for complementing domain knowledge&lt;/strong&gt;. Multi-Index and Index-Specific Boosts represent a significant update that contributes to elevating enterprise AI adoption overall, not just a mere search feature improvement.&lt;/p&gt;

&lt;p&gt;If you're considering RAG application development or enterprise search system implementation, I highly encourage you to leverage this Multi-Index feature. Snowflake's AI capabilities continue to evolve as the &lt;strong&gt;"AI platform for enterprise data"&lt;/strong&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I share Snowflake What's New updates on X. Follow for the latest insights:&lt;/p&gt;

&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20260112) Initial post&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/snowflakejp/articles/334e112057725c" rel="noopener noreferrer"&gt;https://zenn.dev/snowflakejp/articles/334e112057725c&lt;/a&gt;&lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>vectordatabase</category>
      <category>rag</category>
      <category>agents</category>
    </item>
    <item>
      <title>SiS Container Runtime - Run Streamlit Apps at a Fraction of the Cost</title>
      <dc:creator>Tsubasa Kanno</dc:creator>
      <pubDate>Tue, 23 Dec 2025 12:09:04 +0000</pubDate>
      <link>https://forem.com/tsubasa_tech/sis-container-runtime-run-streamlit-apps-at-a-fraction-of-the-cost-2mn8</link>
      <guid>https://forem.com/tsubasa_tech/sis-container-runtime-run-streamlit-apps-at-a-fraction-of-the-cost-2mn8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hey everyone! Quick off-topic confession: I've recently gotten into collecting Topps trading cards - MLB and NBA mostly. There's something incredibly satisfying about pulling a rare rookie card after opening a bunch of packs. It's become my new stress-relief hobby and honestly, my happiness levels are through the roof! 🏀⚾ Anyway, back to the tech stuff...&lt;/p&gt;

&lt;p&gt;It's finally here! &lt;strong&gt;Container Runtime&lt;/strong&gt; for Streamlit in Snowflake (SiS) is now available in Public Preview!&lt;/p&gt;

&lt;p&gt;Previously, SiS used warehouses as the runtime environment. While warehouses are optimized for query execution and work great for data-heavy analytical apps, they were often overkill for many applications. Running a simple visualization app shouldn't require spinning up a full warehouse - and I know many of you felt the same way about the cost implications.&lt;/p&gt;

&lt;p&gt;Container Runtime changes everything. It allows you to allocate smaller, more appropriate resources and separates app execution from query execution. This is a game-changer for cost optimization.&lt;/p&gt;

&lt;p&gt;In this article, I'll walk you through SiS Container Runtime - from its core concepts and differences from Warehouse Runtime, to costs, considerations, package management, and a hands-on tutorial building a simple data visualization app.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note (2025/12/23)&lt;/strong&gt;: SiS Container Runtime is currently in Public Preview. Features may be significantly updated in the future.&lt;/p&gt;

&lt;p&gt;Note: This article represents my personal views and not those of Snowflake.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is SiS Container Runtime?
&lt;/h2&gt;

&lt;p&gt;SiS Container Runtime is a &lt;strong&gt;new runtime environment&lt;/strong&gt; for running Streamlit apps on Snowflake. Unlike the traditional Warehouse Runtime, it takes a container-based approach, executing app code on a &lt;strong&gt;compute pool&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Long-running Service&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apps run as persistent services where all users accessing the same app share a single instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fast Startup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Users connect to an already-running app, resulting in faster access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PyPI Package Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Install packages from PyPI using &lt;code&gt;pyproject.toml&lt;/code&gt; or &lt;code&gt;requirements.txt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latest Streamlit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use Streamlit 1.49+ (including &lt;code&gt;streamlit-nightly&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full Cache Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Leverage Streamlit's caching features across user sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/developer-guide/streamlit/app-development/runtime-environments" rel="noopener noreferrer"&gt;Runtime environments for Streamlit apps (Snowflake Documentation)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Warehouse Runtime vs Container Runtime
&lt;/h2&gt;

&lt;p&gt;Here's a comprehensive comparison of the two runtime environments:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Warehouse Runtime&lt;/th&gt;
&lt;th&gt;Container Runtime&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compute&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;App code and internal queries run on warehouse&lt;/td&gt;
&lt;td&gt;App code runs on compute pool node, internal queries run on warehouse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Base Image&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Linux in Python stored procedure&lt;/td&gt;
&lt;td&gt;Linux in Snowpark container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Python Version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.9, 3.10, 3.11&lt;/td&gt;
&lt;td&gt;3.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Streamlit Version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.22+ (select from Snowflake-provided versions)&lt;/td&gt;
&lt;td&gt;1.49+ (any PyPI version, including &lt;code&gt;streamlit-nightly&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dependency Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;environment.yml&lt;/code&gt; from Snowflake Conda channel&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pyproject.toml&lt;/code&gt; or &lt;code&gt;requirements.txt&lt;/code&gt; from PyPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version Pinning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;=&lt;/code&gt; operator, &lt;code&gt;*&lt;/code&gt; wildcard&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;==&lt;/code&gt; operator, &lt;code&gt;&amp;lt;, &amp;lt;=, &amp;gt;=, &amp;gt;&lt;/code&gt; with comma-separated lists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entry Point Location&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Root of source directory&lt;/td&gt;
&lt;td&gt;Root or subdirectory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Streamlit Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Temporary individual instance per user session&lt;/td&gt;
&lt;td&gt;Persistent shared instance for all user sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Caching&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No cross-session caching&lt;/td&gt;
&lt;td&gt;Full Streamlit caching support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Startup Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Slower (on-demand app creation per user)&lt;/td&gt;
&lt;td&gt;Faster per user (but slower initial deployment)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Value of Container Runtime
&lt;/h2&gt;

&lt;p&gt;The true value of Container Runtime lies in &lt;strong&gt;resource optimization&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Separation of App and Query Execution
&lt;/h3&gt;

&lt;p&gt;With Warehouse Runtime, both app code and queries ran on the same warehouse. This meant warehouse resources were consumed even for simple UI rendering.&lt;/p&gt;

&lt;p&gt;Container Runtime separates these concerns: &lt;strong&gt;app code runs on a compute pool&lt;/strong&gt; while &lt;strong&gt;queries run on a warehouse&lt;/strong&gt;. You can now allocate minimal compute pool resources for app execution and appropriately-sized warehouses for query execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Lightweight Resource Options
&lt;/h3&gt;

&lt;p&gt;Compute pools offer &lt;strong&gt;more affordable options&lt;/strong&gt; than warehouses. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gen1 XS Warehouse: &lt;strong&gt;1 credit/hour&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Compute Pool &lt;code&gt;CPU_X64_XS&lt;/code&gt;: &lt;strong&gt;0.06 credits/hour&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's approximately &lt;strong&gt;1/16th the cost&lt;/strong&gt;! For lightweight visualization apps, this difference is significant.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Shared Instance Efficiency
&lt;/h3&gt;

&lt;p&gt;With Warehouse Runtime, each user got their own app instance. Container Runtime &lt;strong&gt;shares a single instance across all users&lt;/strong&gt;. The second user onward connects instantly to an already-running app, improving perceived performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Cross-Session Caching
&lt;/h3&gt;

&lt;p&gt;With Warehouse Runtime, Streamlit's &lt;code&gt;@st.cache_data&lt;/code&gt; and &lt;code&gt;@st.cache_resource&lt;/code&gt; decorators only cached within individual sessions. If User A cached a query result, User B would still execute the query again.&lt;/p&gt;

&lt;p&gt;With Container Runtime, &lt;strong&gt;caches are shared across users&lt;/strong&gt;. When User A caches a query result, User B can reuse that cache, reducing query execution and improving both performance and cost efficiency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost Considerations
&lt;/h2&gt;

&lt;p&gt;Container Runtime involves two types of resources:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Compute Pool
&lt;/h3&gt;

&lt;p&gt;Compute pools are &lt;strong&gt;billed per node&lt;/strong&gt;. Costs vary by node size (Instance Family), but options cheaper than the smallest warehouse (XS) are available.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Streamlit runs as a single process, so multiple CPUs don't provide much benefit. Choose the smallest node size that meets your memory requirements to optimize costs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Recommended compute pool settings:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INSTANCE_FAMILY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Small sizes like &lt;code&gt;CPU_X64_XS&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Streamlit is single-process, start small&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MIN_NODES&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number of different apps to run simultaneously&lt;/td&gt;
&lt;td&gt;Each app uses one node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MAX_NODES&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Higher than &lt;code&gt;MIN_NODES&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Prevent node shortages when adding new apps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Query Warehouse
&lt;/h3&gt;

&lt;p&gt;The warehouse for internal queries uses traditional &lt;strong&gt;credit-based billing&lt;/strong&gt;. Choose an appropriate size based on query complexity and data volume.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/developer-guide/snowpark-container-services/working-with-compute-pool" rel="noopener noreferrer"&gt;Working with compute pools (Snowflake Documentation)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Important Considerations
&lt;/h2&gt;

&lt;p&gt;Here are some things to keep in mind when using Container Runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Python Version Compatibility
&lt;/h3&gt;

&lt;p&gt;Container Runtime currently supports &lt;strong&gt;Python 3.11 only&lt;/strong&gt;. Ensure your app and all dependencies are compatible with Python 3.11.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;_snowflake&lt;/code&gt; Module Not Supported
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;_snowflake&lt;/code&gt; module available in Warehouse Runtime is &lt;strong&gt;not available&lt;/strong&gt; in Container Runtime. Use native Python libraries like Snowflake Python Connector instead.&lt;/p&gt;

&lt;p&gt;For example, to get the active session (commonly used in SiS), change your import:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# NG: Not available in Container Runtime
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;_snowflake&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_active_session&lt;/span&gt;

&lt;span class="c1"&gt;# OK: Use this instead
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;snowflake.snowpark.context&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_active_session&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Shared Resources
&lt;/h3&gt;

&lt;p&gt;All users share disk, compute, and memory resources in Container Runtime. Design your app with &lt;strong&gt;efficient resource usage&lt;/strong&gt; in mind.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Deployment Time
&lt;/h3&gt;

&lt;p&gt;Container Runtime requires container startup during initial deployment, which may take &lt;strong&gt;longer than Warehouse Runtime&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. External Access Integration
&lt;/h3&gt;

&lt;p&gt;Installing packages from external package indexes like PyPI requires &lt;strong&gt;External Access Integration&lt;/strong&gt; configuration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/developer-guide/streamlit/features/external-access" rel="noopener noreferrer"&gt;External access integrations (Snowflake Documentation)&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Sleep Timer and Compute Pool Auto-Stop
&lt;/h3&gt;

&lt;p&gt;Warehouse Runtime includes a &lt;strong&gt;sleep timer&lt;/strong&gt; feature that automatically stops apps after a period of inactivity. Container Runtime &lt;strong&gt;does not currently support this feature&lt;/strong&gt;. Additionally, compute pools &lt;strong&gt;don't auto-stop&lt;/strong&gt; when app sessions end.&lt;/p&gt;

&lt;p&gt;To minimize costs, consider setting up a Task to stop compute pools during off-hours:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Example: Stop compute pool daily at 10 PM&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="n"&gt;TASK&lt;/span&gt; &lt;span class="n"&gt;STOP_STREAMLIT_POOL_TASK&lt;/span&gt;
    &lt;span class="n"&gt;WAREHOUSE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SIS_QUERY_WH&lt;/span&gt;
    &lt;span class="n"&gt;SCHEDULE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'USING CRON 0 22 * * * America/New_York'&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
    &lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="n"&gt;COMPUTE&lt;/span&gt; &lt;span class="n"&gt;POOL&lt;/span&gt; &lt;span class="n"&gt;STREAMLIT_POOL&lt;/span&gt; &lt;span class="n"&gt;STOP&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That said, compute pools are very affordable, so running them continuously has limited cost impact. Choose the approach that fits your operational style.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing Dependencies
&lt;/h2&gt;

&lt;p&gt;Container Runtime uses &lt;strong&gt;&lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;requirements.txt&lt;/code&gt;&lt;/strong&gt; instead of &lt;code&gt;environment.yml&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  requirements.txt Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;streamlit==1.41.0
pandas&amp;gt;=2.0.0
plotly&amp;gt;=5.18.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  pyproject.toml Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[project]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"my-streamlit-app"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1.0.0"&lt;/span&gt;

&lt;span class="nn"&gt;[project.dependencies]&lt;/span&gt;
&lt;span class="py"&gt;streamlit&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="py"&gt;"=&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.41&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="py"&gt;pandas&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="py"&gt;"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="py"&gt;plotly&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="py"&gt;"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;5.18&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Warehouse Runtime uses &lt;code&gt;=&lt;/code&gt; for version pinning, while Container Runtime uses &lt;code&gt;==&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Warehouse Runtime&lt;/th&gt;
&lt;th&gt;Container Runtime&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Config File&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;environment.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pyproject.toml&lt;/code&gt; or &lt;code&gt;requirements.txt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Package Source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Snowflake Conda channel&lt;/td&gt;
&lt;td&gt;PyPI or other external indexes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version Pinning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;==&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Range Specification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;*&lt;/code&gt; wildcard&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;, &amp;lt;=, &amp;gt;=, &amp;gt;, !=&lt;/code&gt; with comma-separated lists&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/developer-guide/streamlit/app-development/dependency-management" rel="noopener noreferrer"&gt;Dependency management for Streamlit apps (Snowflake Documentation)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hands-on: Building a Sales Dashboard
&lt;/h2&gt;

&lt;p&gt;Let's build a simple data visualization app using SiS Container Runtime!&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Snowflake account (AWS, Azure, or GCP commercial region)&lt;/li&gt;
&lt;li&gt;Role with the following privileges:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Privilege&lt;/th&gt;
&lt;th&gt;Object&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;USAGE&lt;/td&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Database where you create the app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CREATE STREAMLIT, USAGE&lt;/td&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;Schema where you create the app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USAGE&lt;/td&gt;
&lt;td&gt;Warehouse&lt;/td&gt;
&lt;td&gt;Warehouse for query execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USAGE&lt;/td&gt;
&lt;td&gt;Compute pool&lt;/td&gt;
&lt;td&gt;Compute pool for app execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CREATE COMPUTE POOL&lt;/td&gt;
&lt;td&gt;Account&lt;/td&gt;
&lt;td&gt;If creating a new compute pool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CREATE INTEGRATION&lt;/td&gt;
&lt;td&gt;Account&lt;/td&gt;
&lt;td&gt;If creating a new External Access Integration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/developer-guide/streamlit/getting-started/overview#label-streamlit-prereqs" rel="noopener noreferrer"&gt;Privileges required to create and use a Streamlit app (Snowflake Documentation)&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Set Up the Environment
&lt;/h3&gt;

&lt;p&gt;Let's run the following SQL in Snowsight SQL Worksheets to set up our demo environment!&lt;/p&gt;

&lt;p&gt;First, create the database, schema, and stage for source code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Create database and schema&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;SIS_CONTAINER_DB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;SIS_CONTAINER_DB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Create stage for source code&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="n"&gt;STAGE&lt;/span&gt; &lt;span class="n"&gt;SIS_CONTAINER_DB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_STAGE&lt;/span&gt;
  &lt;span class="n"&gt;ENCRYPTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;TYPE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'SNOWFLAKE_SSE'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;DIRECTORY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ENABLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Create sample data table&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;SIS_CONTAINER_DB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SALES_DATA&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;SALE_DATE&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;PRODUCT&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;REGION&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;SALES_AMOUNT&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Insert sample data&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;SIS_CONTAINER_DB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SALES_DATA&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-01-01'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'East'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-01-01'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product B'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'East'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-01-01'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'West'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-01-02'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product B'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'West'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-01-02'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'East'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1100&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-01-03'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product B'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'East'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-01-03'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'West'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;950&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-01-04'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product B'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'West'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1400&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-01-04'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'East'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1050&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-01-05'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product B'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'East'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1600&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Create Compute Pool
&lt;/h3&gt;

&lt;p&gt;Create a compute pool to run app code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Create compute pool&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;COMPUTE&lt;/span&gt; &lt;span class="n"&gt;POOL&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;STREAMLIT_POOL&lt;/span&gt;
    &lt;span class="n"&gt;MIN_NODES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;MAX_NODES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
    &lt;span class="n"&gt;INSTANCE_FAMILY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CPU_X64_XS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Check compute pool status&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;COMPUTE&lt;/span&gt; &lt;span class="n"&gt;POOLS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;DESCRIBE&lt;/span&gt; &lt;span class="n"&gt;COMPUTE&lt;/span&gt; &lt;span class="n"&gt;POOL&lt;/span&gt; &lt;span class="n"&gt;STREAMLIT_POOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Compute pool startup may take a few minutes. Wait until &lt;code&gt;SHOW COMPUTE POOLS&lt;/code&gt; shows &lt;code&gt;state&lt;/code&gt; as &lt;code&gt;ACTIVE&lt;/code&gt; or &lt;code&gt;IDLE&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1pwyu6eag6sg43hxe3wq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1pwyu6eag6sg43hxe3wq.png" alt=" " width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Create External Access Integration
&lt;/h3&gt;

&lt;p&gt;Create an External Access Integration to allow package installation from PyPI.&lt;/p&gt;

&lt;p&gt;Snowflake provides a default network rule &lt;strong&gt;&lt;code&gt;snowflake.external_access.pypi_rule&lt;/code&gt;&lt;/strong&gt; for PyPI access, so you don't need to create your own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Create External Access Integration (using Snowflake-managed PyPI network rule)&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;EXTERNAL&lt;/span&gt; &lt;span class="k"&gt;ACCESS&lt;/span&gt; &lt;span class="n"&gt;INTEGRATION&lt;/span&gt; &lt;span class="n"&gt;PYPI_ACCESS_INTEGRATION&lt;/span&gt;
    &lt;span class="n"&gt;ALLOWED_NETWORK_RULES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snowflake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;external_access&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pypi_rule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ENABLED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/developer-guide/external-network-access/external-network-access-examples" rel="noopener noreferrer"&gt;External network access examples (Snowflake Documentation)&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Prepare Application Files
&lt;/h3&gt;

&lt;p&gt;Create these two files and upload them to the stage.&lt;/p&gt;

&lt;h4&gt;
  
  
  streamlit_app.py
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;streamlit&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;snowflake.snowpark.context&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_active_session&lt;/span&gt;

&lt;span class="c1"&gt;# Page configuration
&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_page_config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wide&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Get Snowflake session
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_active_session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Title
&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📊 Sales Dashboard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A simple sales visualization app running on Container Runtime.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Load data
&lt;/span&gt;&lt;span class="nd"&gt;@st.cache_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;load_data&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT * FROM SALES_DATA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_pandas&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Sidebar filters
&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sidebar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Filter Settings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;selected_products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sidebar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;multiselect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Select Products&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PRODUCT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PRODUCT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;selected_regions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sidebar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;multiselect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Select Regions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;REGION&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;REGION&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Filter data
&lt;/span&gt;&lt;span class="n"&gt;filtered_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PRODUCT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;isin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;selected_products&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;REGION&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;isin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;selected_regions&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Display metrics
&lt;/span&gt;&lt;span class="n"&gt;col1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;col1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total Sales&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;filtered_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SALES_AMOUNT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;col2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Transaction Count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filtered_df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;col3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Average Sale&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;filtered_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SALES_AMOUNT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Charts
&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subheader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Daily Sales Trend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;daily_sales&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filtered_df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SALE_DATE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SALES_AMOUNT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;reset_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;line_chart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;daily_sales&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SALE_DATE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SALES_AMOUNT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subheader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sales by Product&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;product_sales&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filtered_df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PRODUCT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SALES_AMOUNT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;reset_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bar_chart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product_sales&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PRODUCT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SALES_AMOUNT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Data table
&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subheader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Detailed Data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filtered_df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;use_container_width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Footer
&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🚀 Powered by Streamlit in Snowflake Container Runtime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  requirements.txt
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;streamlit&amp;gt;=1.41.0
pandas&amp;gt;=2.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Upload Files to Stage
&lt;/h3&gt;

&lt;p&gt;Upload the files via Snowsight UI or use PUT commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Upload via SnowSQL or local environment&lt;/span&gt;
&lt;span class="n"&gt;PUT&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;///&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;streamlit_app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;SIS_CONTAINER_DB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_STAGE&lt;/span&gt; &lt;span class="n"&gt;AUTO_COMPRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;FALSE&lt;/span&gt; &lt;span class="n"&gt;OVERWRITE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;PUT&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;///&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;SIS_CONTAINER_DB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_STAGE&lt;/span&gt; &lt;span class="n"&gt;AUTO_COMPRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;FALSE&lt;/span&gt; &lt;span class="n"&gt;OVERWRITE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Verify stage contents&lt;/span&gt;
&lt;span class="n"&gt;LIST&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;SIS_CONTAINER_DB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_STAGE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fait6028vmjfendqfu92s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fait6028vmjfendqfu92s.png" alt=" " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Create Streamlit App
&lt;/h3&gt;

&lt;p&gt;Create the Streamlit app with Container Runtime:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Create query warehouse (skip if using existing warehouse)&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;WAREHOUSE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;SIS_QUERY_WH&lt;/span&gt;
    &lt;span class="n"&gt;WAREHOUSE_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'XSMALL'&lt;/span&gt;
    &lt;span class="n"&gt;AUTO_SUSPEND&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
    &lt;span class="n"&gt;AUTO_RESUME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Create Streamlit app&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="n"&gt;STREAMLIT&lt;/span&gt; &lt;span class="n"&gt;SIS_CONTAINER_DB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SALES_DASHBOARD_APP&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="s1"&gt;'@SIS_CONTAINER_DB.APP_SCHEMA.APP_STAGE'&lt;/span&gt;
    &lt;span class="n"&gt;MAIN_FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'streamlit_app.py'&lt;/span&gt;
    &lt;span class="n"&gt;QUERY_WAREHOUSE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SIS_QUERY_WH&lt;/span&gt;
    &lt;span class="n"&gt;RUNTIME_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'SYSTEM$ST_CONTAINER_RUNTIME_PY3_11'&lt;/span&gt;
    &lt;span class="n"&gt;COMPUTE_POOL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;STREAMLIT_POOL&lt;/span&gt;
    &lt;span class="n"&gt;EXTERNAL_ACCESS_INTEGRATIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PYPI_ACCESS_INTEGRATION&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key CREATE STREAMLIT Parameters
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FROM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stage path containing source code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MAIN_FILE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Entry point Python file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;QUERY_WAREHOUSE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Warehouse for query execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RUNTIME_NAME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Specify &lt;code&gt;SYSTEM$ST_CONTAINER_RUNTIME_PY3_11&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COMPUTE_POOL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Compute pool for app code execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EXTERNAL_ACCESS_INTEGRATIONS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;External access integration (for PyPI access)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 7: Run the App
&lt;/h3&gt;

&lt;p&gt;In Snowsight, click 'Streamlit' in the left pane and select your &lt;code&gt;SALES_DASHBOARD_APP&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6k25fj10kreebhmbvujb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6k25fj10kreebhmbvujb.png" alt=" " width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fey3xs6ia3xselddl5ltq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fey3xs6ia3xselddl5ltq.png" alt=" " width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffa3b1vnhqwfzjdklejpl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffa3b1vnhqwfzjdklejpl.png" alt=" " width="736" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your app is running! 🎉 You've successfully deployed a Streamlit app on Container Runtime!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Initial startup may take a few minutes for container initialization and package installation. Subsequent startups will be faster due to caching.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Migration Checklist
&lt;/h2&gt;

&lt;p&gt;When migrating existing Warehouse Runtime apps to Container Runtime, use this checklist:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Python 3.11 Compatibility&lt;/td&gt;
&lt;td&gt;Verify app and all dependencies work with Python 3.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;_snowflake&lt;/code&gt; Module Usage&lt;/td&gt;
&lt;td&gt;Replace with &lt;code&gt;snowflake.snowpark.context&lt;/code&gt; etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;environment.yml&lt;/code&gt; Conversion&lt;/td&gt;
&lt;td&gt;Convert to &lt;code&gt;requirements.txt&lt;/code&gt; or &lt;code&gt;pyproject.toml&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version Specification Syntax&lt;/td&gt;
&lt;td&gt;Change &lt;code&gt;=&lt;/code&gt; to &lt;code&gt;==&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt; to &lt;code&gt;&amp;gt;=&lt;/code&gt; etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute Pool Creation&lt;/td&gt;
&lt;td&gt;Create appropriately-sized compute pool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External Access Integration&lt;/td&gt;
&lt;td&gt;Create if PyPI access is needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/developer-guide/streamlit/migrations-and-upgrades/runtime-migration" rel="noopener noreferrer"&gt;Migrate to a container runtime (Snowflake Documentation)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;SiS Container Runtime is a long-awaited feature that &lt;strong&gt;separates app execution from query execution&lt;/strong&gt; and enables &lt;strong&gt;lightweight resource allocation for apps&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The days of spinning up a warehouse just to run a simple visualization app are over! Container Runtime shines in use cases like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always-on Dashboards&lt;/strong&gt;: Dashboards with frequent multi-user access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight Visualization Apps&lt;/strong&gt;: Simple apps without heavy analytical processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache-Leveraging Apps&lt;/strong&gt;: Apps that cache and reuse query results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While still in Public Preview, I encourage you to try this new feature and make your Snowflake app development more efficient!&lt;/p&gt;

&lt;p&gt;I'm excited to explore more ideas using SiS Container Runtime and will share useful apps I create in future blog posts. Stay tuned!&lt;/p&gt;

&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I share Snowflake What's New updates on X. Follow for the latest insights:&lt;/p&gt;

&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20251223) Initial post&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/snowflakejp/articles/abe3379e6e44cd" rel="noopener noreferrer"&gt;https://zenn.dev/snowflakejp/articles/abe3379e6e44cd&lt;/a&gt;&lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>streamlit</category>
      <category>container</category>
      <category>python</category>
    </item>
    <item>
      <title>Auto-Generate Snowflake Semantic Views with AI - A Developer's Fast-Track to Cortex Analyst</title>
      <dc:creator>Tsubasa Kanno</dc:creator>
      <pubDate>Thu, 09 Oct 2025 12:53:00 +0000</pubDate>
      <link>https://forem.com/tsubasa_tech/auto-generate-snowflake-semantic-views-with-ai-a-developers-fast-track-to-cortex-analyst-44bp</link>
      <guid>https://forem.com/tsubasa_tech/auto-generate-snowflake-semantic-views-with-ai-a-developers-fast-track-to-cortex-analyst-44bp</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst" rel="noopener noreferrer"&gt;&lt;strong&gt;Cortex Analyst&lt;/strong&gt;&lt;/a&gt; is one of Snowflake's most exciting features, enabling revolutionary natural language data analysis. Business users who don't usually write queries can simply ask "What are the top 10 products by sales last month?" and get instant insights without SQL - true &lt;strong&gt;data democratization&lt;/strong&gt; in action!&lt;/p&gt;

&lt;p&gt;However, for Cortex Analyst to reach its full potential, you need a well-structured &lt;strong&gt;semantic layer&lt;/strong&gt; as the foundation. Snowflake offers &lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst/semantic-model-spec" rel="noopener noreferrer"&gt;Semantic Models&lt;/a&gt; or &lt;a href="https://docs.snowflake.com/en/user-guide/views-semantic/overview" rel="noopener noreferrer"&gt;Semantic Views&lt;/a&gt; to accomplish this, but creating semantic layers requires time and effort: understanding table structures, defining business logic, setting appropriate descriptions and synonyms, and more.&lt;/p&gt;

&lt;p&gt;If you're thinking "I want to use Cortex Analyst, but setting up the semantic layer is taking forever..." - you're in the right place! Today I'm introducing a &lt;strong&gt;stored procedure that auto-generates semantic views using AI&lt;/strong&gt;. This tool lets you quickly create a baseline semantic view from existing tables, giving you a fast start toward delivering analytics environments to business users.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This stored procedure is designed to &lt;strong&gt;assist with initial semantic view creation&lt;/strong&gt;. We recommend customizing the generated views according to your business requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: At the June 2025 Snowflake Summit, an official semantic layer auto-generation feature was announced. This stored procedure serves as a &lt;strong&gt;stopgap solution until the official feature is released&lt;/strong&gt;. When the official feature launches, I'll write about it as well!&lt;/p&gt;

&lt;p&gt;Note: This article represents my personal views and not those of Snowflake.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is a Semantic View?
&lt;/h2&gt;

&lt;p&gt;A semantic view is a Snowflake schema-level object that adds &lt;strong&gt;business context&lt;/strong&gt; to physical database tables. It maps technical column names (e.g., &lt;code&gt;amt_ttl_pre_dsc&lt;/code&gt;) to business-friendly concepts (e.g., "Total Sales", "Sales Amount") with detailed descriptions (e.g., "Total sales value for stores in the metropolitan area"), bridging the gap between data and business.&lt;/p&gt;

&lt;p&gt;Even more importantly, semantic views &lt;strong&gt;help AI correctly understand database structure and business logic&lt;/strong&gt;. Cortex Analyst can generate high-precision SQL queries from natural language questions precisely because of the semantic layer. Through synonyms and detailed descriptions, AI learns to understand that "last month's sales", "total sales", and "sales amount" all refer to the same concept, enabling it to select the right tables and columns for accurate query generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Components of a Semantic View
&lt;/h3&gt;

&lt;p&gt;Semantic views consist of these elements:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Element&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Facts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Primarily numeric fact data (row-level attributes)&lt;/td&gt;
&lt;td&gt;Sales quantity, unit price, amount, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Category and attribute data (analysis axes)&lt;/td&gt;
&lt;td&gt;Product name, customer ID, date, region, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aggregated indicators (business KPIs)&lt;/td&gt;
&lt;td&gt;Total sales, average unit price, sales growth rate, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each element can be defined with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Synonyms&lt;/strong&gt;: Business aliases and natural phrasings (e.g., "sales" → "revenue", "sales amount")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comment&lt;/strong&gt;: Business explanations including units, ranges, and other details&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Semantic Views Matter
&lt;/h3&gt;

&lt;p&gt;Semantic views provide these key values:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Improved Cortex Analyst Accuracy&lt;/strong&gt;: Serves as the foundation for AI to understand natural language and generate accurate SQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent Business Definitions&lt;/strong&gt;: Unified business metrics across the entire organization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Democratization&lt;/strong&gt;: Enables non-technical users to access data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For more details, see the &lt;a href="https://docs.snowflake.com/en/user-guide/views-semantic/overview" rel="noopener noreferrer"&gt;official Snowflake documentation - Semantic View Overview&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: For information about Semantic Models (YAML format), see the &lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst/semantic-model-spec" rel="noopener noreferrer"&gt;Cortex Analyst Semantic Model Documentation&lt;/a&gt;. This article focuses on the newer Semantic Views feature.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Challenges in Creating Semantic Layers
&lt;/h2&gt;

&lt;p&gt;Creating semantic layers manually involves these tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understanding table structure (table definitions, column names, data types, sample data review)&lt;/li&gt;
&lt;li&gt;Classifying Facts, Dimensions, and Metrics&lt;/li&gt;
&lt;li&gt;Identifying business-relevant synonyms actually used in the field&lt;/li&gt;
&lt;li&gt;Considering appropriate descriptions (Comments) for each element&lt;/li&gt;
&lt;li&gt;Defining the structure in SQL syntax&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For large tables or multiple tables, this process takes considerable time. However, spending too much time on preparation delays the delivery of analytics environments to business users - having a quality baseline to start with is extremely valuable!&lt;/p&gt;

&lt;h2&gt;
  
  
  AI-Powered Auto-Generation Stored Procedure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;GENERATE_SEMANTIC_VIEW&lt;/code&gt; stored procedure I'm introducing auto-generates semantic views through these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Retrieve Table Information&lt;/strong&gt;: Get column info, data types, and comments using &lt;code&gt;DESCRIBE TABLE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyze Sample Data&lt;/strong&gt;: Infer actual usage and data characteristics from the first 5 rows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Generated SQL&lt;/strong&gt;: LLM via AI_COMPLETE function (like claude-sonnet-4-5) generates semantic view DDL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create Semantic View&lt;/strong&gt;: Execute the generated SQL&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fully Automated&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatically classifies Facts, Dimensions, and Metrics by just specifying table name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rich Synonyms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Infers actual usage from sample data to generate natural business-relevant synonyms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Detailed Descriptions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto-generates Comments with business meaning for each element&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Customizable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Specify which LLM model to use (default: claude-sonnet-4-5)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Stored Procedure Code
&lt;/h3&gt;

&lt;p&gt;The complete code for the &lt;code&gt;GENERATE_SEMANTIC_VIEW&lt;/code&gt; stored procedure is provided below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;GENERATE_SEMANTIC_VIEW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;SOURCE_DATABASE&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;-- Source database name&lt;/span&gt;
    &lt;span class="n"&gt;SOURCE_SCHEMA&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;-- Source schema name&lt;/span&gt;
    &lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;-- Source table name&lt;/span&gt;
    &lt;span class="n"&gt;TARGET_DATABASE&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;-- Target database name&lt;/span&gt;
    &lt;span class="n"&gt;TARGET_SCHEMA&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;-- Target schema name&lt;/span&gt;
    &lt;span class="n"&gt;TARGET_VIEW_NAME&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;-- Semantic view name to create&lt;/span&gt;
    &lt;span class="n"&gt;LLM_MODEL&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'claude-sonnet-4-5'&lt;/span&gt; &lt;span class="c1"&gt;-- LLM model to use&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;
&lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="k"&gt;SQL&lt;/span&gt;
&lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;CALLER&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;DECLARE&lt;/span&gt;
    &lt;span class="c1"&gt;-- Table information&lt;/span&gt;
    &lt;span class="n"&gt;column_info&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;sample_data_json&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;table_comment&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;-- AI generation results&lt;/span&gt;
    &lt;span class="n"&gt;ai_response&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;-- Final SQL&lt;/span&gt;
    &lt;span class="n"&gt;create_view_sql&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="c1"&gt;-- ================================================================================&lt;/span&gt;
    &lt;span class="c1"&gt;-- STEP 1: Retrieve table information&lt;/span&gt;
    &lt;span class="c1"&gt;-- ================================================================================&lt;/span&gt;

    &lt;span class="c1"&gt;-- Get column information (using DESCRIBE TABLE)&lt;/span&gt;
    &lt;span class="k"&gt;DECLARE&lt;/span&gt;
        &lt;span class="n"&gt;describe_sql&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="n"&gt;RESULTSET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;BEGIN&lt;/span&gt;
        &lt;span class="n"&gt;describe_sql&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'DESCRIBE TABLE '&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_DATABASE&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_SCHEMA&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;IMMEDIATE&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;describe_sql&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;-- Get information from results&lt;/span&gt;
        &lt;span class="c1"&gt;-- $1: Column name, $2: Data type, $10: Comment&lt;/span&gt;
        &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;LISTAGG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;':'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;CASE&lt;/span&gt; &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'('&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;')'&lt;/span&gt; &lt;span class="k"&gt;ELSE&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;', '&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;column_info&lt;/span&gt;
        &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RESULT_SCAN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LAST_QUERY_ID&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;

    &lt;span class="n"&gt;EXCEPTION&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;OTHER&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
            &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="s1"&gt;'Error: Could not retrieve table information - '&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_DATABASE&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_SCHEMA&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'. Error: '&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;SQLERRM&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;-- Error check&lt;/span&gt;
    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column_info&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;LENGTH&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;column_info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
        &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="s1"&gt;'Error: Column information is empty - '&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_DATABASE&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_SCHEMA&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;-- Get table comment&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;table_comment&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;INFORMATION_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TABLES&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;TABLE_CATALOG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_DATABASE&lt;/span&gt;
      &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;TABLE_SCHEMA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_SCHEMA&lt;/span&gt;
      &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="k"&gt;TABLE_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;-- Get sample data (first 5 rows)&lt;/span&gt;
    &lt;span class="k"&gt;DECLARE&lt;/span&gt;
        &lt;span class="n"&gt;sample_sql&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;sample_rs&lt;/span&gt; &lt;span class="n"&gt;RESULTSET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;BEGIN&lt;/span&gt;
        &lt;span class="n"&gt;sample_sql&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'SELECT * FROM '&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_DATABASE&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_SCHEMA&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;' LIMIT 5'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;sample_rs&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;IMMEDIATE&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sample_sql&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;-- Get sample data in JSON format&lt;/span&gt;
        &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;TO_VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ARRAY_AGG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OBJECT_CONSTRUCT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;sample_data_json&lt;/span&gt;
        &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RESULT_SCAN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LAST_QUERY_ID&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;

    &lt;span class="n"&gt;EXCEPTION&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;OTHER&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
            &lt;span class="n"&gt;sample_data_json&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Sample data unavailable'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;-- ================================================================================&lt;/span&gt;
    &lt;span class="c1"&gt;-- STEP 2: Generate complete Semantic View definition with AI&lt;/span&gt;
    &lt;span class="c1"&gt;-- ================================================================================&lt;/span&gt;

    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;SNOWFLAKE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CORTEX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COMPLETE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;LLM_MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s1"&gt;'[IMPORTANT] Generate a Snowflake semantic view using the information below.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;★ DO NOT use any column names that do not exist ★'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;[TABLE INFORMATION]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;Table: '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_DATABASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;Alias: '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;Table Comment: '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;COALESCE&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;table_comment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'None'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;[EXISTING COLUMNS (Use ONLY these)]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;column_info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;[SAMPLE DATA (For understanding data usage)]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;SUBSTRING&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;sample_data_json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;[SQL TO GENERATE]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;CREATE OR REPLACE SEMANTIC VIEW '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;TARGET_DATABASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;TARGET_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;TARGET_VIEW_NAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  TABLES ('&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;    '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;' AS '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_DATABASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;      WITH SYNONYMS (&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;alias1&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;alias2&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;alias3&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;alias4&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;      COMMENT = &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;Detailed table description&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  )'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  FACTS ('&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;    '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.fact_name AS existing_column_name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;      WITH SYNONYMS (&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;alias1&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;alias2&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;      COMMENT = &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;Detailed column description&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  )'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  DIMENSIONS ('&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;    '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.dim_name AS existing_column_name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;      WITH SYNONYMS (&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;alias1&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;alias2&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;      COMMENT = &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;Detailed column description&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  )'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  METRICS ('&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;    '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SOURCE_TABLE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.metric_name AS SUM(existing_column_name)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;      WITH SYNONYMS (&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;alias1&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;alias2&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;      COMMENT = &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;Detailed column description&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  )'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;  COMMENT = &lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;Detailed semantic view description&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;[ABSOLUTE RULES]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;★★★ MOST IMPORTANT ★★★ Use ONLY column names from the above list'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;0. Omit Primary Key:'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Do not write PRIMARY KEY clause'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Primary key constraints do not function in Snowflake and are optional'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;1. Column Name Usage:'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Column names used on the right side of AS must also exist in the list'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Example OK: YEAR(TRANSACTION_DATE) ← only if TRANSACTION_DATE exists'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Example NG: YEAR(ORDER_DATE) ← if ORDER_DATE does not exist'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;2. FACTS (Numeric Data):'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Quantity, amount, price, score, rate - numeric type columns'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Include both simple column references and calculated formulas'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Example (simple): QUANTITY, PRICE, AMOUNT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Example (calculated): revenue AS QUANTITY * UNIT_PRICE, discount_amount AS TOTAL_PRICE * 0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;3. DIMENSIONS (Attribute Data):'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - IDs, names, dates, categories, statuses'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Do not overlap with FACTS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;4. No Duplicate Names: All table.name combinations on the left must be unique'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;5. Date Derivative Naming: original_column_name_year, original_column_name_month'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;6. Rich Synonyms (Critical for Cortex Analyst to understand user requests):'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Tables: 4-5 business-relevant aliases'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Each DIMENSION, FACT, METRIC: 2-3 natural aliases'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Infer appropriate synonyms from sample data actual usage'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Example: sales amount → "total sales", "sales total", "revenue"'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Example: product ID → "product code", "item number", "SKU"'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;7. Rich COMMENTS:'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Generate specific descriptions from sample data'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Include business meaning'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Specify units and ranges'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;8. Utilize Sample Data:'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Understand actual usage from sample data content'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Generate more concrete, practical synonyms'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - Reflect data characteristics (range, units, etc.) in COMMENTS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;9. Generate Abundant FACTS and DIMENSIONS:'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - FACTS: Around 5-10 (simple columns + calculated formulas)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - DIMENSIONS: Around 5-15 (original columns + date derivatives)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;   - METRICS: Around 4-8 (various aggregation patterns)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;10. Output: SQL syntax only (no ```, no explanatory text)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;Output only the CREATE SEMANTIC VIEW statement:'&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;ai_response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;-- Debug: Verify AI response length&lt;/span&gt;
    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;ai_response&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;LENGTH&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;ai_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
        &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="s1"&gt;'Error: AI_COMPLETE returned an empty response. Column info: '&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;SUBSTRING&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;column_info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;-- Remove unnecessary characters&lt;/span&gt;
    &lt;span class="n"&gt;create_view_sql&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ai_response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;create_view_sql&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;create_view_sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'```sql'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;create_view_sql&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;create_view_sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'```'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;create_view_sql&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;create_view_sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'"'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;create_view_sql&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;create_view_sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Revised:'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;create_view_sql&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;create_view_sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Modifications:'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;create_view_sql&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;create_view_sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'**'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;create_view_sql&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;TRIM&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;create_view_sql&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;-- Final verification: Check SQL statement is not empty&lt;/span&gt;
    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;create_view_sql&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;LENGTH&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;create_view_sql&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
        &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="s1"&gt;'Error: Generated SQL is empty or too short. AI response: '&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;SUBSTRING&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;ai_response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;-- ================================================================================&lt;/span&gt;
    &lt;span class="c1"&gt;-- STEP 4: Create semantic view&lt;/span&gt;
    &lt;span class="c1"&gt;-- ================================================================================&lt;/span&gt;

    &lt;span class="k"&gt;BEGIN&lt;/span&gt;
        &lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;IMMEDIATE&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;create_view_sql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="s1"&gt;'Semantic view '&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;TARGET_DATABASE&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;TARGET_SCHEMA&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;TARGET_VIEW_NAME&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;' created successfully. SQL: '&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;create_view_sql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;EXCEPTION&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;OTHER&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
            &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="s1"&gt;'Error: '&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;SQLERRM&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;' -- Generated SQL: '&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;SUBSTRING&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;create_view_sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- ================================================================================&lt;/span&gt;
&lt;span class="c1"&gt;-- Usage Example&lt;/span&gt;
&lt;span class="c1"&gt;-- ================================================================================&lt;/span&gt;

&lt;span class="cm"&gt;/*
-- Basic usage
CALL GENERATE_SEMANTIC_VIEW(
    '&amp;lt;source_database&amp;gt;',
    '&amp;lt;source_schema&amp;gt;',
    '&amp;lt;source_table&amp;gt;',
    '&amp;lt;target_database&amp;gt;',
    '&amp;lt;target_schema&amp;gt;',
    '&amp;lt;semantic_view_name&amp;gt;',
    '&amp;lt;LLM_model_name&amp;gt;'
);

-- Verify created semantic view
DESCRIBE SEMANTIC VIEW &amp;lt;target_database&amp;gt;.&amp;lt;target_schema&amp;gt;.&amp;lt;semantic_view_name&amp;gt;;
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You can copy and paste this stored procedure directly into your Snowflake environment for immediate use.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How to Use
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;To use this stored procedure, you'll need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Snowflake account&lt;/li&gt;
&lt;li&gt;An environment where Cortex LLM is available (&lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cross-region-inference" rel="noopener noreferrer"&gt;cross-region inference&lt;/a&gt; makes this available in most regions)&lt;/li&gt;
&lt;li&gt;Permissions to create semantic views&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Basic Usage Example
&lt;/h3&gt;

&lt;p&gt;Here's how to generate a semantic view from the &lt;code&gt;SALES_DATABASE.PUBLIC.ORDERS&lt;/code&gt; table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Call the stored procedure&lt;/span&gt;
&lt;span class="k"&gt;CALL&lt;/span&gt; &lt;span class="n"&gt;GENERATE_SEMANTIC_VIEW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'SALES_DATABASE'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;-- Source database&lt;/span&gt;
    &lt;span class="s1"&gt;'PUBLIC'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                   &lt;span class="c1"&gt;-- Source schema&lt;/span&gt;
    &lt;span class="s1"&gt;'ORDERS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                   &lt;span class="c1"&gt;-- Source table&lt;/span&gt;
    &lt;span class="s1"&gt;'ANALYTICS_DATABASE'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;-- Target database&lt;/span&gt;
    &lt;span class="s1"&gt;'SEMANTIC'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;-- Target schema&lt;/span&gt;
    &lt;span class="s1"&gt;'ORDERS_SEMANTIC_VIEW'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;-- Semantic view name&lt;/span&gt;
    &lt;span class="s1"&gt;'claude-sonnet-4-5'&lt;/span&gt;         &lt;span class="c1"&gt;-- LLM model (optional)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Verify the created semantic view&lt;/span&gt;
&lt;span class="k"&gt;DESCRIBE&lt;/span&gt; &lt;span class="n"&gt;SEMANTIC&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;ANALYTICS_DATABASE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SEMANTIC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ORDERS_SEMANTIC_VIEW&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example Generated Semantic View
&lt;/h3&gt;

&lt;p&gt;For example, given this table structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Sample table&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ORDER_ID&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;CUSTOMER_ID&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ORDER_DATE&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;PRODUCT_NAME&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QUANTITY&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;UNIT_PRICE&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;TOTAL_AMOUNT&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The stored procedure auto-generates a semantic view like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="n"&gt;SEMANTIC&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;ANALYTICS_DATABASE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SEMANTIC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ORDERS_SEMANTIC_VIEW&lt;/span&gt;
  &lt;span class="n"&gt;TABLES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;SALES_DATABASE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;PUBLIC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ORDERS&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Order Table'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Sales Data'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Purchase History'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Transactions'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Table managing customer order information'&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;FACTS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;QUANTITY&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Qty'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Amount Ordered'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Number of Items'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Quantity of products ordered'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unit_price&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;UNIT_PRICE&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Item Price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product Price'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Price per product unit'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_amount&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;TOTAL_AMOUNT&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Total'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Order Amount'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Purchase Total'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Total order amount'&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;DIMENSIONS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;ORDER_ID&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Order Number'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Transaction ID'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Order Ref'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Unique identifier for the order'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;CUSTOMER_ID&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Client ID'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Customer Number'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Account ID'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Customer identifier'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_date&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;ORDER_DATE&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Purchase Date'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Transaction Date'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Date Ordered'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Date the order was placed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;product_name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;PRODUCT_NAME&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Item Name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Item'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Name of the ordered product'&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;METRICS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_sales&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TOTAL_AMOUNT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Total Revenue'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Sales Total'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Revenue'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Total sales amount for all orders'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;avg_order_amount&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TOTAL_AMOUNT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Average Order Value'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'AOV'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Avg Purchase'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Average amount per order'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_orders&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Order Count'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Number of Orders'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Total Transactions'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Total number of orders'&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Semantic view for order data analysis'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use Case 1: Fast Start
&lt;/h3&gt;

&lt;p&gt;When introducing Cortex Analyst to a new project, use this stored procedure to quickly generate semantic views for key tables. Then customize only the necessary parts according to business requirements and add relationships between tables - &lt;strong&gt;several times faster than building from scratch&lt;/strong&gt;, helping you set up your semantic layer efficiently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Case 2: Data Catalog
&lt;/h3&gt;

&lt;p&gt;Generated semantic views contain rich synonyms and comments, making them excellent &lt;strong&gt;table documentation&lt;/strong&gt;. They serve as reference material for new team members learning the table structure or can be loaded into AI Agents as an AI-oriented data catalog.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Case 3: POC (Proof of Concept)
&lt;/h3&gt;

&lt;p&gt;For POCs validating Cortex Analyst's effectiveness, you often don't want to spend much time creating semantic layers. This stored procedure lets you &lt;strong&gt;build a demo environment in minutes&lt;/strong&gt; and immediately experience Cortex Analyst's value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Customization Tips
&lt;/h2&gt;

&lt;p&gt;While auto-generated semantic views may work as-is, customizing these points will achieve even more accurate query generation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You can customize semantic views not just through SQL commands (ALTER SEMANTIC VIEW), but also &lt;strong&gt;via GUI in Snowsight's AI/ML Studio&lt;/strong&gt;. AI/ML Studio lets you visually confirm the semantic view structure while intuitively adding synonyms, editing comments, and adding new Metrics.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Adding/Modifying Synonyms
&lt;/h3&gt;

&lt;p&gt;Add industry-specific terms and internal company terminology to help Cortex Analyst better understand users' natural language:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Example: Add industry terms&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="n"&gt;SEMANTIC&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;ORDERS_SEMANTIC_VIEW&lt;/span&gt; 
&lt;span class="k"&gt;MODIFY&lt;/span&gt; &lt;span class="n"&gt;DIMENSION&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;product_name&lt;/span&gt; 
  &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SKU'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Item Code'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Barcode'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Adding Complex Calculated Metrics
&lt;/h3&gt;

&lt;p&gt;Add advanced calculation formulas according to business logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Example: Add profit margin&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="n"&gt;SEMANTIC&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;ORDERS_SEMANTIC_VIEW&lt;/span&gt; 
&lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="n"&gt;METRIC&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;profit_margin&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TOTAL_AMOUNT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;COST&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TOTAL_AMOUNT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Margin'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Profit Rate'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Return Rate'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Profit ratio relative to sales'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Integrating Multiple Tables into a Semantic View
&lt;/h3&gt;

&lt;p&gt;To analyze across multiple tables, integrate individually generated semantic views and define relationships between tables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Example: Create semantic view containing both ORDERS and CUSTOMERS tables&lt;/span&gt;
&lt;span class="c1"&gt;-- First, generate semantic views for each table individually,&lt;/span&gt;
&lt;span class="c1"&gt;-- Then integrate into a new semantic view&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="n"&gt;SEMANTIC&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;SALES_ANALYSIS_VIEW&lt;/span&gt;
  &lt;span class="n"&gt;TABLES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;SALES_DATABASE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;PUBLIC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ORDERS&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Orders'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Sales Data'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;CUSTOMERS&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;SALES_DATABASE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;PUBLIC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CUSTOMERS&lt;/span&gt;
      &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SYNONYMS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Customers'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Client Info'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;RELATIONSHIPS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CUSTOMER_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CUSTOMERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CUSTOMER_ID&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;-- Facts, Dimensions, Metrics omitted&lt;/span&gt;
  &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For detailed customization options, see the &lt;a href="https://docs.snowflake.com/en/user-guide/views-semantic/sql" rel="noopener noreferrer"&gt;official Snowflake documentation - Using SQL commands to create and manage semantic views&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration with Cortex Analyst
&lt;/h2&gt;

&lt;p&gt;Generated semantic views are immediately usable with Cortex Analyst.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifying in Snowsight
&lt;/h3&gt;

&lt;p&gt;After creating your semantic view, verify it works right away in &lt;strong&gt;Snowsight's AI/ML Studio Cortex Analyst playground&lt;/strong&gt;. For implementation, Snowflake offers various options including calling from Snowflake Intelligence, calling from Cortex Agents, or configuring as a tool in Snowflake MCP Server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Important Notes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tool Limitations
&lt;/h3&gt;

&lt;p&gt;This stored procedure has the following constraint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single Table Only&lt;/strong&gt;: This tool &lt;strong&gt;generates semantic views from a single table only&lt;/strong&gt;. To create semantic views combining multiple tables, first generate views for each table individually, then manually add relationships between tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Generated Semantic View Quality
&lt;/h3&gt;

&lt;p&gt;As this uses AI auto-generation, please note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not Perfect&lt;/strong&gt;: Always review and customize generated semantic views according to business requirements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sample Data Dependency&lt;/strong&gt;: Generated synonyms and descriptions vary based on sample data content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex Logic&lt;/strong&gt;: Advanced business logic requires manual additions and modifications&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This AI auto-generation stored procedure is a tool that &lt;strong&gt;dramatically accelerates the initial stages of semantic view creation&lt;/strong&gt;. While semantic layer preparation is essential for Cortex Analyst to deliver "natural language data analysis" - that ideal world - it would be a shame if this necessary work becomes a barrier that delays your start!&lt;/p&gt;

&lt;p&gt;Using this stored procedure, you can generate baseline semantic views in seconds, then customize necessary parts from there. As a result, you can &lt;strong&gt;deliver analytics environments to business departments in a much shorter timeframe&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Take the first step toward realizing data democratization and empowering business users to extract insights from data themselves - I hope this tool helps you get there!&lt;/p&gt;

&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I share Snowflake What's New updates on X. Follow for the latest insights:&lt;/p&gt;

&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20251009) Initial post&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/tsubasa_tech/articles/ce732d628a9bee" rel="noopener noreferrer"&gt;https://zenn.dev/tsubasa_tech/articles/ce732d628a9bee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>llm</category>
      <category>semanticlayer</category>
      <category>sql</category>
    </item>
    <item>
      <title>Unlock Advanced Data Analytics in Cursor with Snowflake MCP Server</title>
      <dc:creator>Tsubasa Kanno</dc:creator>
      <pubDate>Mon, 01 Sep 2025 11:00:03 +0000</pubDate>
      <link>https://forem.com/tsubasa_tech/unlock-advanced-data-analytics-in-cursor-with-snowflake-mcp-server-2flb</link>
      <guid>https://forem.com/tsubasa_tech/unlock-advanced-data-analytics-in-cursor-with-snowflake-mcp-server-2flb</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The AI agent revolution in development is truly gaining momentum! The &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;, a standardized protocol from Anthropic, now enables seamless connections between LLMs and various tools and APIs. And exciting news - Snowflake has released their official &lt;strong&gt;&lt;a href="https://github.com/Snowflake-Labs/mcp" rel="noopener noreferrer"&gt;MCP Server&lt;/a&gt;&lt;/strong&gt; as open source!&lt;/p&gt;

&lt;p&gt;While Cortex Search and Cortex Analyst were previously available as individual features, the recent addition of &lt;strong&gt;SQL execution capabilities&lt;/strong&gt; means you can now access Snowflake's analytics environment directly from MCP clients (like Cursor or Claude Desktop). &lt;strong&gt;Simply give natural language instructions to your AI agent and complete your data analysis&lt;/strong&gt; - this is a game-changer for developers!&lt;/p&gt;

&lt;p&gt;In this article, I'll walk you through setting up and using the Snowflake-Labs MCP Server with Cursor, explore the analytics possibilities it unlocks, and discuss when to use it versus Snowflake Intelligence. If you're an engineer looking to analyze Snowflake data more efficiently, this guide is for you!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Tools provided by Snowflake-Labs are positioned as community tools and are not officially supported by Snowflake Inc.&lt;/p&gt;

&lt;p&gt;Note: This article represents my personal views and not those of Snowflake.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is Snowflake MCP Server?
&lt;/h2&gt;

&lt;p&gt;Snowflake MCP Server is an &lt;strong&gt;official OSS tool&lt;/strong&gt; that integrates various Snowflake features into the MCP ecosystem. By connecting with MCP clients (Cursor, Claude Desktop, fast-agent, etc.), you can operate Snowflake's powerful data analytics capabilities through AI agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;p&gt;The current Snowflake MCP Server supports these capabilities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature Category&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cortex Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search unstructured data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cortex Analyst&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Analyze structured data using semantic models (including Semantic Views)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQL Execution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Execute LLM-generated SQL queries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Object Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Create, drop, and update databases, schemas, tables, views, warehouses, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Technical Characteristics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Execution&lt;/strong&gt;: Current version runs locally, initiated by the MCP client&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible Permission Management&lt;/strong&gt;: Fine-grained control over SQL execution permissions (e.g., allowing only SELECT statements)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Service Support&lt;/strong&gt;: Configure multiple Cortex Search / Cortex Analyst services simultaneously&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Choosing Between Snowflake Intelligence and MCP Server
&lt;/h2&gt;

&lt;p&gt;If you're familiar with Snowflake, you might wonder: "We already have &lt;strong&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/snowflake-intelligence" rel="noopener noreferrer"&gt;Snowflake Intelligence&lt;/a&gt;&lt;/strong&gt; - how should I choose between them?" Here's my perspective:&lt;/p&gt;

&lt;h3&gt;
  
  
  When Snowflake Intelligence is Better
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Business users, analysts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web browser-based GUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Main Use Cases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise data analysis app deployment, report creation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advantages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Easy setup, intuitive GUI operation. All environments managed by Snowflake for enhanced security&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Easy organization-wide rollout&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When Snowflake MCP Server is Better
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Engineers, developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Development tools like Cursor, Claude Desktop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Main Use Cases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ad-hoc data analysis during development, CI/CD integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advantages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Integrates with development workflow, analyze data alongside code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Individual or team-level usage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In essence: &lt;strong&gt;Choose Intelligence for easy enterprise-wide natural language analysis app deployment&lt;/strong&gt;, and &lt;strong&gt;MCP Server for integrating Snowflake analytics into engineering MCP clients&lt;/strong&gt;. When in doubt, start with the easier-to-adopt Snowflake Intelligence to clarify business expectations, then consider MCP Server as needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up with Cursor
&lt;/h2&gt;

&lt;p&gt;Let's set up the Snowflake MCP Server with Cursor! I'll demonstrate the convenient approach using &lt;strong&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/programmatic-access-tokens" rel="noopener noreferrer"&gt;PAT (Programmatic Access Token)&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Prerequisites
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Installing uvx
&lt;/h4&gt;

&lt;p&gt;To run Snowflake MCP Server, you need &lt;strong&gt;uvx&lt;/strong&gt;, the execution command for the &lt;strong&gt;uv&lt;/strong&gt; Python package management tool. If you haven't installed it yet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For macOS/Linux&lt;/span&gt;
curl &lt;span class="nt"&gt;-LsSf&lt;/span&gt; https://astral.sh/uv/install.sh | sh

&lt;span class="c"&gt;# Or install with pipx&lt;/span&gt;
pipx &lt;span class="nb"&gt;install &lt;/span&gt;uv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, verify success with &lt;code&gt;uvx --version&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: uvx is a tool for running Python packages in isolated environments. See &lt;a href="https://docs.astral.sh/uv/" rel="noopener noreferrer"&gt;uv's official documentation&lt;/a&gt; for details.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Generating a PAT
&lt;/h4&gt;

&lt;p&gt;Log into Snowsight and generate a PAT following these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click your profile icon in the bottom left and select &lt;strong&gt;Settings&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;Authentication&lt;/strong&gt; section&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Generate New Token&lt;/strong&gt; button&lt;/li&gt;
&lt;li&gt;Set the token name and expiration&lt;/li&gt;
&lt;li&gt;Select required permissions (role)&lt;/li&gt;
&lt;li&gt;Copy the generated token&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fucc9vnvpebgoh0moqo2e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fucc9vnvpebgoh0moqo2e.png" alt="PAT Generation Screenshot" width="588" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: When generating a PAT, select a role with access to Cortex Search / Cortex Analyst services and the tables you'll analyze.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: By default, using a PAT requires a network policy to be configured. Without a network policy setup, PAT authentication may fail. For detailed PAT requirements and configuration, please refer to the &lt;a href="https://docs.snowflake.com/en/user-guide/programmatic-access-tokens" rel="noopener noreferrer"&gt;official Snowflake documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Preparing Cortex Search / Cortex Analyst
&lt;/h4&gt;

&lt;p&gt;If you plan to use Cortex Search or Cortex Analyst with Snowflake MCP Server, you need to prepare these in advance:&lt;/p&gt;

&lt;h5&gt;
  
  
  For Cortex Search
&lt;/h5&gt;

&lt;p&gt;You need to create a &lt;strong&gt;Cortex Search Service&lt;/strong&gt; beforehand. Cortex Search Service makes unstructured data (documents, logs, text data, etc.) searchable.&lt;/p&gt;

&lt;p&gt;For creation instructions, see the &lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-search/cortex-search-overview" rel="noopener noreferrer"&gt;Cortex Search official documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h5&gt;
  
  
  For Cortex Analyst
&lt;/h5&gt;

&lt;p&gt;You need to create a &lt;strong&gt;Semantic Model&lt;/strong&gt; or &lt;strong&gt;Semantic View&lt;/strong&gt; beforehand. These add business context to structured data, enabling natural language query generation (Text2SQL).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating Semantic Models (YAML format): &lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst/semantic-model-spec" rel="noopener noreferrer"&gt;Cortex Analyst Semantic Model Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Creating Semantic Views: &lt;a href="https://docs.snowflake.com/en/user-guide/views-semantic/overview" rel="noopener noreferrer"&gt;Semantic View Official Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Creating Cortex Search Services, Semantic Models, or Semantic Views requires appropriate permissions. After creation, verify that the role specified in your PAT can access them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Creating the Service Configuration File
&lt;/h4&gt;

&lt;p&gt;Next, create a &lt;code&gt;tools_config.yaml&lt;/code&gt; file defining Cortex services and SQL permissions. A &lt;a href="https://github.com/Snowflake-Labs/mcp/blob/main/services/configuration.yaml" rel="noopener noreferrer"&gt;template is available on GitHub&lt;/a&gt; for reference.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The configuration file format may be updated in the future, so always check the &lt;a href="https://github.com/Snowflake-Labs/mcp/blob/main/services/configuration.yaml" rel="noopener noreferrer"&gt;latest template&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's an example configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Cortex Search Service configuration&lt;/span&gt;
&lt;span class="na"&gt;search_services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;service_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Your&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Cortex&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Search&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Service&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Snowflake&amp;gt;"&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="s"&gt;"&amp;lt;Detailed description of your Cortex Search Service&amp;gt;"&lt;/span&gt;
    &lt;span class="na"&gt;database_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Database&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;containing&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Cortex&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Search&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Service&amp;gt;"&lt;/span&gt;
    &lt;span class="na"&gt;schema_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Schema&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;containing&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Cortex&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Search&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Service&amp;gt;"&lt;/span&gt;
    &lt;span class="na"&gt;columns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
    &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;

&lt;span class="c1"&gt;# Cortex Analyst Service configuration&lt;/span&gt;
&lt;span class="na"&gt;analyst_services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;service_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Custom&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;your&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;view&amp;gt;"&lt;/span&gt;
    &lt;span class="na"&gt;semantic_model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Full&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;view&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Snowflake&amp;gt;"&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="s"&gt;"&amp;lt;Detailed description of your semantic model or semantic view&amp;gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# SQL execution permission settings&lt;/span&gt;
&lt;span class="na"&gt;sql_statement_permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# - All: True           # Uncomment this line to allow all SQL statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Alter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;          &lt;span class="c1"&gt;# Whether to allow ALTER statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;        &lt;span class="c1"&gt;# Whether to allow COMMAND statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Comment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;        &lt;span class="c1"&gt;# Whether to allow COMMENT statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Commit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;         &lt;span class="c1"&gt;# Whether to allow COMMIT statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Create&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;         &lt;span class="c1"&gt;# Whether to allow CREATE statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Delete&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;         &lt;span class="c1"&gt;# Whether to allow DELETE statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Describe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;True&lt;/span&gt;        &lt;span class="c1"&gt;# Whether to allow DESCRIBE statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Drop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;           &lt;span class="c1"&gt;# Whether to allow DROP statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Insert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;         &lt;span class="c1"&gt;# Whether to allow INSERT statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Merge&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;          &lt;span class="c1"&gt;# Whether to allow MERGE statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Rollback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;       &lt;span class="c1"&gt;# Whether to allow ROLLBACK statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Select&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;True&lt;/span&gt;          &lt;span class="c1"&gt;# Whether to allow SELECT statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Transaction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;    &lt;span class="c1"&gt;# Whether to allow TRANSACTION statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;TruncateTable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;  &lt;span class="c1"&gt;# Whether to allow TRUNCATE TABLE statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Unknown&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;        &lt;span class="c1"&gt;# Whether to allow undefined SQL statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Update&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;         &lt;span class="c1"&gt;# Whether to allow UPDATE statements&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Use&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;True&lt;/span&gt;             &lt;span class="c1"&gt;# Whether to allow USE statements&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cursor interprets this configuration file to utilize various tools. Therefore, provide as much detail as possible in descriptions to help the AI Agent call the appropriate tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Configuring Cursor MCP
&lt;/h3&gt;

&lt;p&gt;Configure MCP in Cursor. Open MCP&amp;amp;Integrations settings in Cursor, click "New MCP Server" to open the &lt;code&gt;mcp.json&lt;/code&gt; editor:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhb6m7qxvoc39ljrug83a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhb6m7qxvoc39ljrug83a.png" alt="Cursor MCP Settings Screenshot" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alternatively, you can directly edit the configuration file (&lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mcp-server-snowflake"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--from"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"git+https://github.com/Snowflake-Labs/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"mcp-server-snowflake"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--service-config-file"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;Full path to your tools_config.yaml&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--account"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;Your Snowflake account identifier&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;Your Snowflake username&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;Your PAT created earlier&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: For the &lt;code&gt;--account&lt;/code&gt; parameter, if your Snowflake account identifier contains underscores like "ORGNAME-AAA_BBB_CCC", change them to hyphens like "ORGNAME-AAA-BBB-CCC".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Set the PAT you generated earlier for the &lt;code&gt;--password&lt;/code&gt; parameter. While regular passwords work, using PATs is recommended for security.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Verifying Connection
&lt;/h3&gt;

&lt;p&gt;After configuration, click the MCP Server button you created in Cursor's MCP Server settings to start it. When successfully connected, a green indicator lights up on the MCP Server icon, and Snowflake features become available in Cursor's chat interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0d6kmaufx00vcd53jjc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0d6kmaufx00vcd53jjc.png" alt="Connection Success Screenshot" width="797" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Examples
&lt;/h2&gt;

&lt;p&gt;Let's explore data analysis using Snowflake MCP Server from Cursor!&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 1: Natural Language Data Exploration
&lt;/h3&gt;

&lt;p&gt;Type this in Cursor's chat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;List all Snowflake databases.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MCP Server automatically generates and executes appropriate SQL, returning results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SNOWFLAKE Database List

1. SALES
Database managing customer sales data

2. CUSTOMER
Database managing customer information
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI Agent generates and executes appropriate SQL within your Snowflake role's permissions and the SQL statements allowed in your &lt;code&gt;tools_config.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 2: Searching Unstructured Data with Cortex Search
&lt;/h3&gt;

&lt;p&gt;When searching for specific information from internal documents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Summarize the operations manual.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The configured Cortex Search Service is automatically called, returning relevant information:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📚 RetailCorp Operations Manual Summary
🏢 Company Philosophy
Mission: "Delivering exceptional customer experiences through innovation and quality"
Core Values:
Customer-first approach
Operational excellence
Sustainable growth
Employee empowerment
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example 3: Complex Analysis Queries
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Analyze monthly sales trends for H2 2024 and identify variation factors.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cortex Analyst interprets the semantic model or semantic view, generates appropriate SQL queries, and Cursor's AI Agent executes them, returning results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📊 H2 2024 Sales Analysis Report

📈 Monthly Sales Trends
Month       Sales ($)   MoM Change  Features
July        152,435     -       H2 Start
August      248,291     +62.8%      Peak month
September   201,762     -18.8%      High level maintained
October     149,698     -25.8%      Sales decline
November    145,386     -2.9%       Lowest month
December    292,847     +101.3%     Holiday surge
Total       1,190,419   -       H2 Total

🔍 Key Variation Factors
1. Seasonal Factors
August: Back-to-school season peak
High-volume sales of electronics and premium products
Product lineup generating $75K per SKU

December: Holiday shopping season
Sales more than doubled from previous month
December 16 ($107,145) and 24 ($106,221) were exceptional days
Black Friday and Cyber Monday impact
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Permission Configuration Guidelines
&lt;/h3&gt;

&lt;p&gt;Enable secure operations with different permission settings for development and production environments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Development&lt;/strong&gt;: Allow &lt;code&gt;Select&lt;/code&gt;, &lt;code&gt;Describe&lt;/code&gt;, &lt;code&gt;Use&lt;/code&gt;, &lt;code&gt;Create&lt;/code&gt;, &lt;code&gt;Insert&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production&lt;/strong&gt;: Allow only &lt;code&gt;Select&lt;/code&gt;, &lt;code&gt;Describe&lt;/code&gt;, &lt;code&gt;Use&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Admin&lt;/strong&gt;: Set &lt;code&gt;All: True&lt;/code&gt; as needed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Snowflake MCP Server is a &lt;strong&gt;revolutionary tool that significantly enhances the developer experience&lt;/strong&gt;. It delivers particular value through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Development Flow Integration&lt;/strong&gt;: Analyze data without leaving Cursor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Natural Language Operations&lt;/strong&gt;: Execute complex analysis tasks with natural language instructions to AI Agents without writing SQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Execution Environment&lt;/strong&gt;: Safe usage through granular permission controls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Having tried it myself, I find it incredibly convenient to complete everything within Cursor without switching tools when wondering "What was that table structure?" or "I need to check sales trends for this period."&lt;/p&gt;

&lt;p&gt;While Snowflake Intelligence is a powerful tool for promoting organization-wide data utilization, MCP Server integrated with daily development tools offers different value for engineers and data scientists. By choosing the right tool for each use case, we can achieve more efficient data utilization.&lt;/p&gt;

&lt;p&gt;Give Snowflake MCP Server a try today!&lt;/p&gt;

&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I share Snowflake What's New updates on X. Follow for the latest insights:&lt;/p&gt;

&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20250901) Initial post&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/tsubasa_tech/articles/70ab5fb2b5ed99" rel="noopener noreferrer"&gt;https://zenn.dev/tsubasa_tech/articles/70ab5fb2b5ed99&lt;/a&gt;&lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>cursor</category>
      <category>mcp</category>
      <category>llm</category>
    </item>
    <item>
      <title>Snowflake AI_TRANSCRIBE - Transform Audio to Insights with SQL in Seconds</title>
      <dc:creator>Tsubasa Kanno</dc:creator>
      <pubDate>Sun, 10 Aug 2025 10:37:14 +0000</pubDate>
      <link>https://forem.com/tsubasa_tech/snowflake-aitranscribe-transform-audio-to-insights-with-sql-in-seconds-21j6</link>
      <guid>https://forem.com/tsubasa_tech/snowflake-aitranscribe-transform-audio-to-insights-with-sql-in-seconds-21j6</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Snowflake's unstructured data analytics has taken another leap forward! After expanding Cortex AI capabilities for images and documents throughout 2025, we can now work with &lt;strong&gt;audio data&lt;/strong&gt; directly from SQL!&lt;/p&gt;

&lt;p&gt;The new &lt;strong&gt;&lt;a href="https://docs.snowflake.com/en/sql-reference/functions/ai_transcribe" rel="noopener noreferrer"&gt;AI_TRANSCRIBE function&lt;/a&gt;&lt;/strong&gt;, released in Public Preview as part of Snowflake Cortex AISQL, transforms how we handle audio data. Customer support calls, meeting recordings, interviews - all these previously hard-to-leverage audio assets can now be transcribed with a single SQL query and combined with other AISQL functions for advanced analytics.&lt;/p&gt;

&lt;p&gt;With support for images, documents, and now audio - the three major unstructured data formats - &lt;strong&gt;Snowflake has dramatically expanded the possibilities for business data analytics&lt;/strong&gt;. Let's explore how AI_TRANSCRIBE works, its practical applications, and I'll even share a voice-enabled AI chatbot built with Streamlit in Snowflake!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: AI_TRANSCRIBE is currently in Public Preview, so features may undergo significant updates in the future.&lt;/p&gt;

&lt;p&gt;Note: This article represents my personal views and not those of Snowflake.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is AI_TRANSCRIBE?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/sql-reference/functions/ai_transcribe" rel="noopener noreferrer"&gt;AI_TRANSCRIBE&lt;/a&gt; is Snowflake Cortex AISQL's audio-to-text transcription function. Previously, leveraging audio data required external services or third-party packages, but AI_TRANSCRIBE enables &lt;strong&gt;direct audio transcription within SQL queries&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQL Native&lt;/strong&gt;: Call directly from SQL like other AISQL functions for simple integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-language Support&lt;/strong&gt;: Supports numerous languages including English, Spanish, French, German, Chinese, and many more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speaker Identification&lt;/strong&gt;: Distinguishes and labels multiple speakers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timestamp Generation&lt;/strong&gt;: Provides timestamps at word or speaker level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Processing&lt;/strong&gt;: All data processing occurs within Snowflake's secure environment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Part of the Cortex AISQL Family
&lt;/h3&gt;

&lt;p&gt;AI_TRANSCRIBE becomes even more powerful when combined with existing Cortex AISQL functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI_SENTIMENT&lt;/strong&gt;: Analyze sentiment in transcribed audio&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI_CLASSIFY&lt;/strong&gt;: Automatically categorize audio content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI_COMPLETE&lt;/strong&gt;: Summarize or answer questions about audio content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI_AGG&lt;/strong&gt;: Extract insights from grouped audio data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI_EMBED&lt;/strong&gt;: Vectorize audio transcripts for similarity search&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Basic Usage
&lt;/h2&gt;

&lt;p&gt;The basic syntax for AI_TRANSCRIBE is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;AI_TRANSCRIBE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;audio_file&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;options&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Parameters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;audio_file&lt;/strong&gt;: FILE type object representing the audio file. Use &lt;code&gt;TO_FILE&lt;/code&gt; function to create a reference to staged files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;options&lt;/strong&gt;: Optional OBJECT type with the following fields:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;timestamp_granularity&lt;/code&gt;: Specifies timestamp granularity&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"word"&lt;/code&gt;: Timestamps for each word&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"speaker"&lt;/code&gt;: Timestamps and labels for each speaker&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example 1: Simple Text Transcription
&lt;/h3&gt;

&lt;p&gt;The simplest use case is converting audio to text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Convert audio file to text&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;AI_TRANSCRIBE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;TO_FILE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'@audio_stage'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'customer_call_001.wav'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"audio_duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;19.08&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hi, I'd like to inquire about the product I purchased last week. The packaging was damaged when it arrived, and I'd like to request an exchange if possible. Could you help me with this? Thank you."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Processing time for this 19-second audio file was approximately 2 seconds - impressively fast for analytics scenarios!&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 2: Word-Level Timestamps
&lt;/h3&gt;

&lt;p&gt;For detailed analysis, add word-level timestamps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Transcribe with word-level timestamps&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;AI_TRANSCRIBE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;TO_FILE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'@audio_stage'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'meeting_recording.wav'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'timestamp_granularity'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'word'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"audio_duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;19.08&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"segments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.254&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.993&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hi"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.434&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.254&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"I'd"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.514&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.434&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"like"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;more&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;segments&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hi I'd like to inquire about the product..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example 3: Speaker Identification
&lt;/h3&gt;

&lt;p&gt;For meetings or interviews with multiple speakers, use speaker identification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Transcribe with speaker identification&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;AI_TRANSCRIBE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;TO_FILE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'@audio_stage'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'interview_2025.mp3'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'timestamp_granularity'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'speaker'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"audio_duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;16.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"segments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;8.461&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"speaker_label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SPEAKER_00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.511&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Good morning, thank you for joining us today. My name is Sarah."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;15.153&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"speaker_label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SPEAKER_01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;9.048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Thank you for having me. I'm John, pleased to be here."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Good morning, thank you for joining us today. My name is Sarah. Thank you for having me. I'm John, pleased to be here."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Supported Languages and Formats
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Supported Languages
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/sql-reference/functions/ai_transcribe#usage-notes" rel="noopener noreferrer"&gt;AI_TRANSCRIBE supports an extensive list of languages&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;English, Spanish, French, German&lt;/li&gt;
&lt;li&gt;Mandarin Chinese, Cantonese&lt;/li&gt;
&lt;li&gt;Japanese, Korean&lt;/li&gt;
&lt;li&gt;Arabic, Bulgarian, Catalan&lt;/li&gt;
&lt;li&gt;Czech, Dutch, Greek&lt;/li&gt;
&lt;li&gt;Hungarian, Indonesian, Italian&lt;/li&gt;
&lt;li&gt;Latvian, Polish, Portuguese&lt;/li&gt;
&lt;li&gt;Romanian, Russian, Serbian&lt;/li&gt;
&lt;li&gt;Slovenian, Swedish, Thai&lt;/li&gt;
&lt;li&gt;Turkish, Ukrainian&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Supported Audio Formats
&lt;/h3&gt;

&lt;p&gt;Major audio formats are supported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MP3&lt;/strong&gt;: Most common audio format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WAV&lt;/strong&gt;: Uncompressed high-quality audio&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FLAC&lt;/strong&gt;: Lossless compressed audio&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ogg&lt;/strong&gt;: Open-source format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebM&lt;/strong&gt;: Web standard format&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations and Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical Limitations
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limitation&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maximum File Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;700MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maximum Duration (without timestamps)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;120 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maximum Duration (with timestamps)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;60 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Concurrent Processing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Depends on account compute resources&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Usage Considerations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audio Quality Impact&lt;/strong&gt;: Background noise or poor audio quality may reduce transcription accuracy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical Terminology&lt;/strong&gt;: Industry-specific terms or proper nouns may not be accurately transcribed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language-Specific Behavior&lt;/strong&gt;: Some languages may have unique behaviors with word-level timestamps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Processing&lt;/strong&gt;: Currently supports batch processing only, not real-time streaming&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Regional Availability
&lt;/h3&gt;

&lt;p&gt;AI_TRANSCRIBE is natively available in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS US West 2 (Oregon)&lt;/li&gt;
&lt;li&gt;AWS US East 1 (N. Virginia)&lt;/li&gt;
&lt;li&gt;AWS EU Central 1 (Frankfurt)&lt;/li&gt;
&lt;li&gt;Azure East US 2 (Virginia)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For other regions&lt;/strong&gt;: Use &lt;strong&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cross-region-inference" rel="noopener noreferrer"&gt;cross-region inference&lt;/a&gt;&lt;/strong&gt; to access AI_TRANSCRIBE functionality with potentially slight latency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Business Use Cases
&lt;/h2&gt;

&lt;p&gt;AI_TRANSCRIBE excels in various business scenarios:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Customer Service Quality Enhancement
&lt;/h3&gt;

&lt;p&gt;Transform call center recordings into actionable insights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment Analysis&lt;/strong&gt;: Use AI_SENTIMENT to analyze professionalism, problem resolution, and wait time perspectives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call Classification&lt;/strong&gt;: Automatically categorize calls as complaints, inquiries, or praise with AI_CLASSIFY&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speaker Separation&lt;/strong&gt;: Analyze operator and customer speech separately for detailed insights&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Dashboards&lt;/strong&gt;: Visualize analysis results for immediate service quality improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Meeting Automation and Action Item Extraction
&lt;/h3&gt;

&lt;p&gt;Transform meeting recordings into productivity tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Meeting Minutes&lt;/strong&gt;: Instantly obtain full text from lengthy meetings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summary Generation&lt;/strong&gt;: Use AI_COMPLETE to create concise meeting summaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action Item Extraction&lt;/strong&gt;: Automatically identify decisions and to-dos for efficient follow-up&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Participant Analysis&lt;/strong&gt;: Track who said what using speaker identification&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Legal and Compliance Automation
&lt;/h3&gt;

&lt;p&gt;Strengthen risk management with transcribed legal conversations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complete Documentation&lt;/strong&gt;: Preserve all contract negotiations and legal discussions as text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance Risk Detection&lt;/strong&gt;: Classify conversation content by risk level using AI_CLASSIFY&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence Preservation&lt;/strong&gt;: Accurately record who said what and when with speaker identification and timestamps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Audit Reports&lt;/strong&gt;: Extract key points and generate audit-ready documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Education and Training Enhancement
&lt;/h3&gt;

&lt;p&gt;Maximize learning effectiveness with transcribed educational content:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lecture Archives&lt;/strong&gt;: Save course content as searchable text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subtitle Creation&lt;/strong&gt;: Add captions to video materials using word-level timestamps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Training Feedback Analysis&lt;/strong&gt;: Identify improvement areas in training methodologies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multilingual Support&lt;/strong&gt;: Transcribe foreign language courses for easier review&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Healthcare Documentation (with proper privacy controls)
&lt;/h3&gt;

&lt;p&gt;Streamline medical documentation workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automated Clinical Notes&lt;/strong&gt;: Generate structured medical records from doctor-patient conversations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EHR Integration&lt;/strong&gt;: Extract relevant information for electronic health records&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multilingual Patient Care&lt;/strong&gt;: Support international patients with transcription and translation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality Assurance&lt;/strong&gt;: Analyze consultation content for healthcare improvement&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building a Voice-Enabled AI Chatbot with Streamlit in Snowflake
&lt;/h2&gt;

&lt;p&gt;Let's build a simple voice-enabled AI chatbot using AI_TRANSCRIBE in Streamlit in Snowflake. Users can ask questions via voice, which gets transcribed and answered by AI (including the newly added OpenAI GPT-5!).&lt;/p&gt;

&lt;h3&gt;
  
  
  Application Overview
&lt;/h3&gt;

&lt;p&gt;This application provides:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Voice Recording&lt;/strong&gt;: Record audio directly from browser and save to stage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio Transcription&lt;/strong&gt;: Convert to text using AI_TRANSCRIBE&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Response Generation&lt;/strong&gt;: Generate answers using AI_COMPLETE&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Environment Requirements
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python Version&lt;/strong&gt;: 3.11 or higher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additional Packages&lt;/strong&gt;: &lt;strong&gt;None required&lt;/strong&gt; (works with standard packages only)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streamlit in Snowflake&lt;/strong&gt;: Environment to create and run applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Regional Verification
&lt;/h4&gt;

&lt;p&gt;Ensure your region supports AI_TRANSCRIBE and AI_COMPLETE functions, or enable cross-region inference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation Steps
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Create a New Streamlit in Snowflake App
&lt;/h4&gt;

&lt;p&gt;Navigate to 'Streamlit' in Snowsight's left pane and click '+ Streamlit' to create a new app.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Paste the Sample Code
&lt;/h4&gt;

&lt;p&gt;Copy and paste the sample code below directly into the app editor. No modifications needed - stage names are automatically configured.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Run the Application
&lt;/h4&gt;

&lt;p&gt;Click the "Run" button to launch the app. The stage will be created automatically on first run.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Use the Application
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Voice Input&lt;/strong&gt;: Click the microphone button to speak&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Selection&lt;/strong&gt;: Choose your preferred AI model from the sidebar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text Input&lt;/strong&gt;: Regular chat input is also available&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Sample Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;streamlit&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;snowflake.snowpark.context&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_active_session&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;snowflake.snowpark.functions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ai_complete&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_file&lt;/span&gt;

&lt;span class="c1"&gt;# Get Snowflake session
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_active_session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Constants
&lt;/span&gt;&lt;span class="n"&gt;STAGE_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AUDIO_TRANSCRIBE_STAGE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Page configuration
&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_page_config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wide&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI Voice Chatbot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Sidebar: Model selection
&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sidebar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;⚙️ Settings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Model options
&lt;/span&gt;&lt;span class="n"&gt;model_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;━━━ 🟢 OpenAI ━━━&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai-gpt-oss-120b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai-gpt-oss-20b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai-gpt-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai-gpt-5-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai-gpt-5-nano&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai-gpt-5-chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai-gpt-4.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai-o4-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;━━━ 🔵 Claude ━━━&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-4-opus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-4-sonnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-3-7-sonnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-3-5-sonnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;━━━ 🦙 Llama ━━━&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama4-maverick&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama4-scout&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama3.3-70b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama3.2-3b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama3.2-1b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama3.1-405b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama3.1-70b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama3.1-8b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama3-70b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama3-8b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;━━━ 🟣 Mistral ━━━&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-large2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mixtral-8x7b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-7b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;━━━ ❄️ Snowflake ━━━&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;snowflake-arctic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;snowflake-llama-3.3-70b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;snowflake-llama-3.1-405b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;━━━ 🔴 Others ━━━&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-r1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reka-core&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reka-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jamba-1.5-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jamba-1.5-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jamba-instruct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-7b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Default model setting
&lt;/span&gt;&lt;span class="n"&gt;default_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama4-maverick&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;default_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model_options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;default_model&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;model_options&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="n"&gt;llm_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sidebar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;radio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Select AI Model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model_options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;default_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;format_func&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;━━━&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  • &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Use next model if separator is selected
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;━━━&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;llm_model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;llm_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama4-maverick&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Stage setup
&lt;/span&gt;&lt;span class="nd"&gt;@st.cache_resource&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setup_stage&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Setup stage for audio file storage&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DESC STAGE &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;STAGE_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
            CREATE STAGE IF NOT EXISTS &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;STAGE_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
            ENCRYPTION = (TYPE = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SNOWFLAKE_SSE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;)
            DIRECTORY = (ENABLE = TRUE)
        &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;setup_stage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize session state
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat_history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract_text_from_transcript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transcript_result&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Extract text from AI_TRANSCRIBE result&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transcript_result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;transcript_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transcript_result&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;transcript_result&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;transcript_result&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_ai_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Clean up AI response&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'"'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_ai_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Generate AI response&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;ai_complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;clean_ai_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;RESPONSE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# Display chat history
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
        &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# Voice input section
&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subheader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Voice Input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;audio_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;audio_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Click the microphone button to speak&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📤 Send Voice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_value&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;use_container_width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;audio_value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Upload audio file
&lt;/span&gt;            &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spinner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🎤 Uploading audio...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;audio_filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;audio_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%Y%m%d_%H%M%S&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.wav&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="n"&gt;audio_stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BytesIO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getvalue&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put_stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;audio_stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;STAGE_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;audio_filename&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;auto_compress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;overwrite&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Transcribe
&lt;/span&gt;            &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spinner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📝 Transcribing audio...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
                    SELECT AI_TRANSCRIBE(
                        TO_FILE(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;STAGE_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;audio_filename&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;)
                    ) as transcript
                &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;transcribed_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extract_text_from_transcript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;TRANSCRIPT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;transcribed_text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="c1"&gt;# Add user message
&lt;/span&gt;                    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;transcribed_text&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
                    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat_history&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;transcribed_text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

                    &lt;span class="c1"&gt;# Generate AI response
&lt;/span&gt;                    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spinner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🤖 AI is generating response...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                        &lt;span class="n"&gt;full_prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat_history&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_ai_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full_prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;llm_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

                    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
                    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat_history&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

                    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rerun&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Transcription failed. Please try again.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error occurred: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Text input
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enter your message...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Add and display user message
&lt;/span&gt;    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat_history&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Generate and display AI response
&lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spinner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🤖 AI is generating response...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;full_prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat_history&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_ai_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full_prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;llm_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat_history&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error occurred: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Clear chat history
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🗑️ Clear Chat History&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat_history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rerun&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Application Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qho81aiuncz9xtd24a1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qho81aiuncz9xtd24a1.png" alt="Voice-enabled AI Chatbot Interface" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F46xzqa9nw1adt3ermx82.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F46xzqa9nw1adt3ermx82.png" alt="Chat interaction with voice input" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation Highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple Implementation&lt;/strong&gt;: No additional packages required, works with standard libraries only&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio Management&lt;/strong&gt;: Store audio data in stages and process with AI_TRANSCRIBE&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multimodal Support&lt;/strong&gt;: Supports both voice and text input&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rich Model Selection&lt;/strong&gt;: Choose from latest models including OpenAI GPT-5&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost Considerations
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/ai-audio#cost-considerations" rel="noopener noreferrer"&gt;AI_TRANSCRIBE pricing&lt;/a&gt; follows the same token-based model as other AISQL functions:&lt;/p&gt;

&lt;h3&gt;
  
  
  Token Consumption and Pricing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;50 tokens per second of audio&lt;/strong&gt;: Consistent across languages and timestamp granularities&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1 hour of audio = 180,000 tokens&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estimated cost&lt;/strong&gt;: At 1.3 credits per million tokens and assuming $3 per credit, &lt;strong&gt;1 hour of audio processing costs approximately $0.117&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a 60-second audio file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;60 seconds × 50 tokens = 3,000 tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Audio files under 1 minute are &lt;strong&gt;billed as 1 minute (3,000 tokens) minimum&lt;/strong&gt;. For processing many short audio files, consider batching them together for cost optimization.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For latest pricing information, refer to the &lt;a href="https://www.snowflake.com/legal-files/CreditConsumptionTable.pdf" rel="noopener noreferrer"&gt;Snowflake Service Consumption Table&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;AI_TRANSCRIBE represents a &lt;strong&gt;breakthrough function that opens the door to audio data analytics&lt;/strong&gt;. Combined with Snowflake's enhanced support for images and documents in 2025, the addition of audio - the third major unstructured data format - truly positions Snowflake as a comprehensive multimodal data platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Benefits
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Unified Data Processing&lt;/strong&gt;: Process all data types including audio within Snowflake&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AISQL Function Integration&lt;/strong&gt;: Combine with sentiment analysis, classification, summarization, and vectorization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Environment&lt;/strong&gt;: No external data movement required, maintaining governance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development Efficiency&lt;/strong&gt;: Build audio analytics pipelines with just SQL, no third-party packages needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From customer service and meeting transcription to healthcare documentation and legal compliance, AI_TRANSCRIBE unlocks valuable insights from previously untapped audio data. Start exploring how this function can transform your business analytics today!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you tried audio analytics in your data workflows? What use cases are you most excited about? Share your experiences in the comments below!&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I share Snowflake What's New updates on X. Follow for the latest insights:&lt;/p&gt;

&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20250810) Initial post&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/tsubasa_tech/articles/65e96e2bd257ec" rel="noopener noreferrer"&gt;https://zenn.dev/tsubasa_tech/articles/65e96e2bd257ec&lt;/a&gt;&lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>sql</category>
      <category>ai</category>
      <category>llm</category>
    </item>
    <item>
      <title>Snowflake AI_SENTIMENT - Industry-Leading Sentiment Analysis with 0.92 Accuracy and Multi-Aspect Support</title>
      <dc:creator>Tsubasa Kanno</dc:creator>
      <pubDate>Sun, 03 Aug 2025 09:48:49 +0000</pubDate>
      <link>https://forem.com/tsubasa_tech/snowflake-aisentiment-industry-leading-sentiment-analysis-with-092-accuracy-and-multi-aspect-49k3</link>
      <guid>https://forem.com/tsubasa_tech/snowflake-aisentiment-industry-leading-sentiment-analysis-with-092-accuracy-and-multi-aspect-49k3</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Snowflake has released the new &lt;strong&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/ai-sentiment" rel="noopener noreferrer"&gt;AI_SENTIMENT function&lt;/a&gt;&lt;/strong&gt; as part of Cortex AISQL, becoming GA on July 25, 2025! This represents a &lt;strong&gt;significant accuracy improvement over the previous ENTITY_SENTIMENT function&lt;/strong&gt;, enabling state-of-the-art sentiment analysis directly from SQL within Snowflake.&lt;/p&gt;

&lt;p&gt;AI_SENTIMENT goes beyond simple "positive/negative" classifications to support &lt;strong&gt;aspect-based sentiment analysis&lt;/strong&gt;. For instance, with restaurant reviews, you can analyze sentiment for specific aspects like "food quality," "pricing," and "service" separately, providing much deeper insights into customer feedback.&lt;/p&gt;

&lt;p&gt;In this article, I'll walk through the practical value and implementation approaches for the AI_SENTIMENT function, including real-world testing results that demonstrate its capabilities across different scenarios.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This article represents my personal views and not those of Snowflake.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is AI_SENTIMENT?
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/ai-sentiment" rel="noopener noreferrer"&gt;AI_SENTIMENT function&lt;/a&gt; is Snowflake Cortex AISQL's latest sentiment analysis function. Compared to the previous ENTITY_SENTIMENT function, it delivers &lt;strong&gt;significantly improved accuracy&lt;/strong&gt; along with &lt;strong&gt;advanced features like mixed sentiment detection&lt;/strong&gt; and &lt;strong&gt;nuanced expression understanding&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Industry-leading accuracy&lt;/strong&gt;: Achieves 0.92 accuracy in aspect-based sentiment analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rich sentiment classification&lt;/strong&gt;: Five-level detailed analysis including positive, negative, neutral, mixed, and unknown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multilingual support&lt;/strong&gt;: Native support for 6 languages including English, French, German, Hindi, Italian, and Portuguese&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aspect-based analysis&lt;/strong&gt;: Simultaneous analysis of up to 10 different aspects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced context understanding&lt;/strong&gt;: Accurately interprets implicit expressions and figurative language&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Benchmark Performance
&lt;/h3&gt;

&lt;p&gt;AI_SENTIMENT demonstrates superior performance compared to major LLMs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Aspect-based sentiment accuracy (ABSA-mix)&lt;/th&gt;
&lt;th&gt;Aspect-based sentiment accuracy (ABSA-multilingual)&lt;/th&gt;
&lt;th&gt;Overall sentiment accuracy&lt;/th&gt;
&lt;th&gt;Overall sentiment accuracy (multilingual)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI_SENTIMENT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.92&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.81&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.83&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.83&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-4-sonnet&lt;/td&gt;
&lt;td&gt;0.84&lt;/td&gt;
&lt;td&gt;0.79&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;0.82&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mistral-large2&lt;/td&gt;
&lt;td&gt;0.83&lt;/td&gt;
&lt;td&gt;0.80&lt;/td&gt;
&lt;td&gt;0.77&lt;/td&gt;
&lt;td&gt;0.78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;openai-gpt-4.1&lt;/td&gt;
&lt;td&gt;0.83&lt;/td&gt;
&lt;td&gt;0.73&lt;/td&gt;
&lt;td&gt;0.80&lt;/td&gt;
&lt;td&gt;0.78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llama4-scout&lt;/td&gt;
&lt;td&gt;0.82&lt;/td&gt;
&lt;td&gt;0.79&lt;/td&gt;
&lt;td&gt;0.71&lt;/td&gt;
&lt;td&gt;0.76&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llama3.3-70b&lt;/td&gt;
&lt;td&gt;0.82&lt;/td&gt;
&lt;td&gt;0.79&lt;/td&gt;
&lt;td&gt;0.71&lt;/td&gt;
&lt;td&gt;0.76&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS DetectSentiment&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;0.62&lt;/td&gt;
&lt;td&gt;0.64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This high accuracy makes AI_SENTIMENT reliable for business-critical sentiment analysis tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Usage
&lt;/h2&gt;

&lt;p&gt;AI_SENTIMENT supports two primary usage patterns:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Overall Sentiment Analysis
&lt;/h3&gt;

&lt;p&gt;The simplest approach analyzes overall text sentiment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;AI_SENTIMENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Text content'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Aspect-Based Sentiment Analysis
&lt;/h3&gt;

&lt;p&gt;Analyze sentiment for specific aspects individually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;AI_SENTIMENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Text content'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Aspect1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Aspect2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can specify up to 10 aspects, with each aspect limited to 30 characters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing with Unsupported Languages
&lt;/h2&gt;

&lt;p&gt;While Japanese isn't officially supported, I tested AI_SENTIMENT's behavior with non-supported languages to understand its capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test: English Aspect Labels
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;AI_SENTIMENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'This restaurant&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;s omelet rice is quite delicious. The eggs were freshly collected this morning. However, it&lt;/span&gt;&lt;span class="se"&gt;''&lt;/span&gt;&lt;span class="s1"&gt;s quite expensive compared to nearby stores.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Taste'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Freshness'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"categories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"overall"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sentiment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mixed"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Freshness"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sentiment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"positive"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Price"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sentiment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"negative"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Taste"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sentiment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"positive"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The results show accurate understanding of the content with proper sentiment classification:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;overall&lt;/strong&gt;: mixed (complex emotions)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freshness&lt;/strong&gt;: positive (freshness praised)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price&lt;/strong&gt;: negative (price criticism)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taste&lt;/strong&gt;: positive (taste praised)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Insights
&lt;/h3&gt;

&lt;p&gt;This testing revealed that for unsupported languages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Content understanding&lt;/strong&gt;: Text content can be understood with reasonable accuracy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aspect constraints&lt;/strong&gt;: Aspects should be specified in supported languages (English, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practical workaround&lt;/strong&gt;: Use English aspect labels even for content in unsupported languages&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Supported Languages
&lt;/h2&gt;

&lt;p&gt;AI_SENTIMENT natively supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;English&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;French&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;German&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hindi&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Italian&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Portuguese&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While other languages aren't officially supported, the testing above shows that content understanding may work for additional languages when using supported-language aspect labels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Business Use Cases
&lt;/h2&gt;

&lt;p&gt;AI_SENTIMENT excels in various business scenarios:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Social Media Monitoring
&lt;/h3&gt;

&lt;p&gt;Monitor brand and product mentions across social platforms, tracking sentiment changes in real-time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Social media analysis&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;post_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_SENTIMENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Brand'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Service'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;sentiment_analysis&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;social_media_posts&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;brand_mention&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;post_date&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Product Review Analysis
&lt;/h3&gt;

&lt;p&gt;Analyze e-commerce reviews across multiple dimensions to identify improvement areas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Product review analysis&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_SENTIMENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Quality'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Delivery'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Customer_Service'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;review_sentiment&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;product_reviews&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;review_date&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2025-01-01'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Customer Support Analysis
&lt;/h3&gt;

&lt;p&gt;Measure customer satisfaction from support tickets and chat logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Customer support sentiment analysis&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;ticket_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;support_category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_SENTIMENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Response_Time'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Solution_Quality'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Agent_Helpfulness'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;support_sentiment&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;support_tickets&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'closed'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Employee Engagement Analysis
&lt;/h3&gt;

&lt;p&gt;Assess organizational health through employee surveys and feedback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Employee satisfaction analysis&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_SENTIMENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feedback_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Work_Environment'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Management'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Career_Growth'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Compensation'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;employee_sentiment&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employee_feedback&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;survey_date&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2025-01-01'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sentiment Classification Details
&lt;/h2&gt;

&lt;p&gt;AI_SENTIMENT returns these sentiment classifications:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Classification&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;positive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clearly positive sentiment&lt;/td&gt;
&lt;td&gt;"Excellent quality product"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;negative&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clearly negative sentiment&lt;/td&gt;
&lt;td&gt;"Completely disappointing experience"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;neutral&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Neutral sentiment&lt;/td&gt;
&lt;td&gt;"Standard product as expected"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;mixed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Both positive and negative elements&lt;/td&gt;
&lt;td&gt;"Good quality but overpriced"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;unknown&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cannot determine sentiment&lt;/td&gt;
&lt;td&gt;When specified aspect doesn't exist&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;mixed&lt;/strong&gt; classification is particularly valuable as it accurately captures complex emotions that contain both positive and negative elements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations and Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical Limitations
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limitation&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context Window&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2,048 tokens (approximately 1,600 words)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maximum Aspects&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Up to 10 aspects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aspect Length&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30 characters maximum per aspect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Supported Languages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6 languages (others not officially supported)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Usage Guidelines
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Long text handling&lt;/strong&gt;: Split content exceeding 2,048 tokens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aspect selection&lt;/strong&gt;: Choose business-relevant aspects carefully, preferably in supported languages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result validation&lt;/strong&gt;: Use AI results as reference; verify critical decisions manually&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost Information
&lt;/h2&gt;

&lt;p&gt;AI_SENTIMENT has a credit consumption rate of &lt;strong&gt;1.6 credits per 1 million tokens&lt;/strong&gt;, making it quite cost-effective for sentiment analysis workloads. For detailed credit consumption information, refer to the &lt;a href="https://www.snowflake.com/legal-files/CreditConsumptionTable.pdf" rel="noopener noreferrer"&gt;Snowflake Credit Consumption Table&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No data movement&lt;/strong&gt;: All processing occurs within Snowflake's secure environment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No infrastructure required&lt;/strong&gt;: No dedicated AI infrastructure setup needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated operations&lt;/strong&gt;: Easy automation through SQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay-per-use&lt;/strong&gt;: Only pay for actual usage, avoiding waste&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;AI_SENTIMENT represents a &lt;strong&gt;breakthrough function that combines sentiment analysis accuracy with business applicability&lt;/strong&gt;. It delivers exceptional value through:&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Advantages
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Industry-leading accuracy&lt;/strong&gt;: 0.92 accuracy in aspect-based sentiment analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex emotion understanding&lt;/strong&gt;: Accurate analysis of mixed sentiments and implicit expressions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQL integration&lt;/strong&gt;: Easy integration into existing data pipelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost efficiency&lt;/strong&gt;: Significant cost savings compared to external services&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Recommendations for Global Usage
&lt;/h3&gt;

&lt;p&gt;Based on testing results, even for unsupported languages, practical usage is possible with these approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use English aspect labels&lt;/strong&gt; (Price, Quality, Service, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content understanding works across languages&lt;/strong&gt; (though not officially supported)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I encourage you to explore AI_SENTIMENT for customer voice analysis, brand monitoring, employee satisfaction surveys, and other business scenarios to enable secure and fast data-driven decision making!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you tried implementing sentiment analysis in your data workflows? Share your experiences in the comments below!&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I share Snowflake What's New updates on X. Follow for the latest insights:&lt;/p&gt;

&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20250803) Initial post&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/tsubasa_tech/articles/972c86d2ac2702" rel="noopener noreferrer"&gt;https://zenn.dev/tsubasa_tech/articles/972c86d2ac2702&lt;/a&gt;&lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>sentiment</category>
      <category>llm</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Snowflake AI_EMBED Function - Your Gateway to Unified Multimodal Vector Search</title>
      <dc:creator>Tsubasa Kanno</dc:creator>
      <pubDate>Sat, 26 Jul 2025 04:50:24 +0000</pubDate>
      <link>https://forem.com/tsubasa_tech/snowflake-aiembed-function-your-gateway-to-unified-multimodal-vector-search-1fb7</link>
      <guid>https://forem.com/tsubasa_tech/snowflake-aiembed-function-your-gateway-to-unified-multimodal-vector-search-1fb7</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I'm excited to share insights about Snowflake's latest &lt;a href="https://docs.snowflake.com/en/sql-reference/functions/ai_embed" rel="noopener noreferrer"&gt;AI_EMBED function&lt;/a&gt;, a revolutionary addition to Cortex AISQL! As the successor to traditional &lt;code&gt;EMBED_TEXT_768&lt;/code&gt; and &lt;code&gt;EMBED_TEXT_1024&lt;/code&gt; functions, AI_EMBED introduces a game-changing capability: &lt;strong&gt;unified vectorization of both text and images using a single function&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Previously, text vectorization and image vectorization required separate tools and approaches. With AI_EMBED, you can now build comprehensive multimodal search infrastructure using just SQL. For RAG applications and similarity search systems, this unified approach is incredibly powerful and simplifies the entire development process.&lt;/p&gt;

&lt;p&gt;If you're building AI applications that need to handle both text and visual content, this feature will transform how you approach multimodal data processing!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note (2025/7/26)&lt;/strong&gt;: AI_EMBED function is currently in public preview, so features may undergo significant updates in the future.&lt;/p&gt;

&lt;p&gt;Note: This article represents my personal views and not those of Snowflake.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Understanding Snowflake Cortex AISQL
&lt;/h2&gt;

&lt;p&gt;Snowflake Cortex AISQL provides a comprehensive set of functions that enable direct AI functionality calls from SQL. A perfect example is the &lt;strong&gt;AI_COMPLETE&lt;/strong&gt; function, which demonstrates the unified approach by processing both text and images using the same function interface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Text processing&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;AI_COMPLETE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'llama4-maverick'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Explain the key features of Snowflake'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Image processing (same function!)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;AI_COMPLETE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'llama4-maverick'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Describe this image'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TO_FILE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'@image_stage'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'dog.jpeg'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdpwxbr102cz3zuzrtnjp.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdpwxbr102cz3zuzrtnjp.jpeg" alt="Image processed by AI_COMPLETE function" width="800" height="799"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Image processed by AI_COMPLETE function (Generated by Google Gemini)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Text processing result&lt;/span&gt;
&lt;span class="nv"&gt;"Snowflake is a cloud-based data warehouse solution with the following key features..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Image processing result&lt;/span&gt;
&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="n"&gt;shows&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;close&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;up&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="s1"&gt;'s face with white fur and large eyes. The dog has its mouth open...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This same unified multimodal processing capability is now available for vectorization through the AI_EMBED function.&lt;/p&gt;

&lt;h2&gt;
  
  
  Previous Vectorization Approaches
&lt;/h2&gt;

&lt;p&gt;To better understand AI_EMBED's value, let's review traditional vectorization methods in Snowflake. Previously available embedding functions included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;EMBED_TEXT_768&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EMBED_TEXT_1024&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For detailed analysis of these functions and their performance characteristics, I covered them extensively in my previous article about &lt;a href="https://zenn.dev/tsubasa_tech/articles/c0a2b8793a5d1f" rel="noopener noreferrer"&gt;Snowflake vectorization options&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The key limitation was that text vectorization used these dedicated functions, while image vectorization required external tools or services, creating a fragmented development experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI_EMBED Function Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Unified Interface
&lt;/h3&gt;

&lt;p&gt;The primary advantage of AI_EMBED is &lt;strong&gt;processing both text and images with the same function&lt;/strong&gt;. This unified approach delivers several benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Learning Curve&lt;/strong&gt;: No need to master multiple functions or methods for different data types&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent Model Interface&lt;/strong&gt;: Same function works across different embedding models&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streamlined Data Governance&lt;/strong&gt;: All vectorization processing happens within Snowflake's secure environment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy Migration&lt;/strong&gt;: Similar syntax to existing embedding functions enables smooth transitions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Available Models
&lt;/h3&gt;

&lt;p&gt;AI_EMBED supports the following models:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Text Models&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;snowflake-arctic-embed-l-v2.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;snowflake-arctic-embed-l-v2.0-8k&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nv-embed-qa-4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;multilingual-e5-large&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;voyage-multilingual-2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Image Model&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;voyage-multimodal-3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: Only &lt;code&gt;voyage-multimodal-3&lt;/code&gt; supports image vectorization. Interestingly, this image model can also process text data effectively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model Characteristics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Understanding model selection is crucial for optimal results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;snowflake-arctic-embed-l-v2.0-8k&lt;/code&gt;&lt;/strong&gt;: Supports up to 8,000 tokens, ideal for technical documents and long articles. This extended context can potentially eliminate chunking preprocessing for certain documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;nv-embed-qa-4&lt;/code&gt;&lt;/strong&gt;: English-only model, not suitable for multilingual environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other models&lt;/strong&gt;: Multilingual support with excellent performance across various languages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose &lt;code&gt;snowflake-arctic-embed-l-v2.0-8k&lt;/code&gt; for long-form content and any model except &lt;code&gt;nv-embed-qa-4&lt;/code&gt; for multilingual applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multimodal Vectorization Value
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Business Value&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Multimodal vectorization delivers substantial business benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Search Accuracy&lt;/strong&gt;: Unified text and image search reveals related content that traditional keyword searches miss&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved Customer Experience&lt;/strong&gt;: Enables intuitive experiences like image-based product search or text-to-image discovery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operational Efficiency&lt;/strong&gt;: Centralized management and search across documents, diagrams, photos, and notes significantly reduces information access time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Business Models&lt;/strong&gt;: Enables previously impossible multimodal search services and recommendation engines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Technical Value&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The technical advantages are equally compelling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Silo Elimination&lt;/strong&gt;: Solves the problem of text and image data managed in separate systems through unified vector space&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Development Costs&lt;/strong&gt;: Single platform approach with Snowflake eliminates system complexity compared to multiple specialized tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Snowflake's cloud-native architecture efficiently handles large-scale multimodal data processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security &amp;amp; Governance&lt;/strong&gt;: Complete data and vectorization processing within Snowflake enables centralized governance management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Business Use Cases
&lt;/h3&gt;

&lt;p&gt;AI_EMBED enables powerful business applications:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Multimodal Search Systems&lt;/strong&gt;&lt;br&gt;
Build e-commerce platforms where customers can search for similar products using both product images and text descriptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Content Management Systems&lt;/strong&gt;&lt;br&gt;
Create enterprise CMS solutions that enable unified search and classification of documents and visual assets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Customer Support Enhancement&lt;/strong&gt;&lt;br&gt;
Develop systems that analyze both inquiry text and attached images to provide comprehensive, context-aware responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. RAG Chatbots&lt;/strong&gt;&lt;br&gt;
Build enterprise chatbots that search across both textual documents and visual content to incorporate domain knowledge into LLM responses.&lt;/p&gt;
&lt;h2&gt;
  
  
  Practical Implementation Examples
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Text Vectorization
&lt;/h3&gt;

&lt;p&gt;Basic text vectorization is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Text vectorization&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;AI_EMBED&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'snowflake-arctic-embed-l-v2.0-8k'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Snowflake Summit 2025 introduced many exciting new features'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Text vectorization result&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;001018&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;002565&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;024353&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;004829&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Image Vectorization
&lt;/h3&gt;

&lt;p&gt;Image vectorization uses the same function with proper file handling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Image vectorization&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;AI_EMBED&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'voyage-multimodal-3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TO_FILE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'@image_stage'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'dog.jpeg'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Image vectorization result&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;015381&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;008240&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;012634&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;024048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Vector Similarity Calculations
&lt;/h2&gt;

&lt;p&gt;AI_EMBED generated vectors work seamlessly with Snowflake's vector similarity functions like cosine similarity. Here are three fundamental patterns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Text-to-Text Similarity&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Text similarity calculation&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;VECTOR_COSINE_SIMILARITY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;AI_EMBED&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'snowflake-arctic-embed-l-v2.0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Beautiful sunny weather today'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;AI_EMBED&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'snowflake-arctic-embed-l-v2.0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Today is blessed with great climate'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;text_similarity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Text similarity result&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8324767643&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Image-to-Image Similarity&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Image similarity calculation&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;VECTOR_COSINE_SIMILARITY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;AI_EMBED&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'voyage-multimodal-3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TO_FILE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'@image_stage'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'cat.jpeg'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="n"&gt;AI_EMBED&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'voyage-multimodal-3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TO_FILE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'@image_stage'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'dog.jpeg'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;image_similarity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Image similarity result&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5069280956&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Cross-Modal Text-to-Image Similarity&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Cross-modal similarity calculation&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;VECTOR_COSINE_SIMILARITY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;AI_EMBED&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'voyage-multimodal-3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Close-up of a dog face with white fur and large eyes'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;AI_EMBED&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'voyage-multimodal-3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TO_FILE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'@image_stage'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'dog.jpeg'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;cross_modal_similarity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Cross-modal similarity result&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;6030817788&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cosine similarity ranges from -1 to 1, with values closer to 1 indicating higher similarity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;AI_EMBED represents a significant advancement in Snowflake's vectorization capabilities. The unified interface for processing both text and images makes developing multimodal AI applications significantly more accessible and efficient.&lt;/p&gt;

&lt;p&gt;Migration from existing EMBED_TEXT_1024 functions is straightforward, enabling gradual application upgrades. As data workloads increasingly involve mixed text and image content, AI_EMBED provides the foundation for building next-generation data utilization platforms efficiently.&lt;/p&gt;

&lt;p&gt;The future of search and AI applications is multimodal, and AI_EMBED positions Snowflake users to capitalize on these emerging opportunities. I encourage you to explore AI_EMBED and discover new possibilities for your business applications!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What multimodal use cases are you most excited to build with AI_EMBED? Share your thoughts in the comments below!&lt;/em&gt; &lt;/p&gt;




&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I share Snowflake What's New updates on X. Follow for the latest insights:&lt;/p&gt;

&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20250726) Initial post&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/tsubasa_tech/articles/e7683605e7d7aa" rel="noopener noreferrer"&gt;https://zenn.dev/tsubasa_tech/articles/e7683605e7d7aa&lt;/a&gt;&lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>vectordatabase</category>
      <category>multimodal</category>
      <category>rag</category>
    </item>
    <item>
      <title>Game-Changing UI Updates Make Snowflake Cortex Search Management Effortless</title>
      <dc:creator>Tsubasa Kanno</dc:creator>
      <pubDate>Mon, 07 Jul 2025 11:26:07 +0000</pubDate>
      <link>https://forem.com/tsubasa_tech/game-changing-ui-updates-make-snowflake-cortex-search-management-effortless-5275</link>
      <guid>https://forem.com/tsubasa_tech/game-changing-ui-updates-make-snowflake-cortex-search-management-effortless-5275</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As we progress through 2025, Snowflake's AI capabilities (Cortex AI) continue to expand dramatically. &lt;strong&gt;Snowflake AI &amp;amp; ML Studio&lt;/strong&gt; has undergone frequent updates, making numerous AI/ML features accessible through intuitive UI interfaces. This evolution truly embodies Snowflake's commitment to usability and simplicity.&lt;/p&gt;

&lt;p&gt;Today I'm excited to share major improvements to &lt;strong&gt;Cortex Search&lt;/strong&gt; management UI within Snowflake AI &amp;amp; ML Studio! While Cortex Search service management was traditionally centered around SQL commands, we can now perform comprehensive management through GUI interfaces. Everything from service overviews and configuration changes to data previews and playground functionality can now be completed entirely within Snowsight.&lt;/p&gt;

&lt;p&gt;This transformation enables everyone from data engineers to AI application developers to leverage Cortex Search more efficiently. I'll walk through these new management UI capabilities with actual screenshots, demonstrating their value and practical usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Cortex Search
&lt;/h2&gt;

&lt;p&gt;Let me briefly explain what &lt;strong&gt;Cortex Search&lt;/strong&gt; is for those new to the technology. Cortex Search is a &lt;strong&gt;fully-managed enterprise search service&lt;/strong&gt; provided by Snowflake.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid Search&lt;/strong&gt;: Combines vector search (semantic similarity) with keyword search (lexical similarity) for high-precision results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Embedding Generation&lt;/strong&gt;: Automatically and regularly vectorizes text data to enable semantic search capabilities
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fully Managed&lt;/strong&gt;: No infrastructure management or tuning required - ready to use immediately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snowflake Native&lt;/strong&gt;: Complete integration with Snowflake's data governance and security features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For detailed usage and implementation examples, check out my previous articles: &lt;a href="https://dev.to/tsubasa_tech/snowflake-cortex-search-for-rag-chat-applications"&gt;"Snowflake Cortex Search for RAG Chat Applications"&lt;/a&gt; and &lt;a href="https://dev.to/tsubasa_tech/enhancing-rag-applications-with-cortex-search-boosts-decays"&gt;"Enhancing RAG Applications with Cortex Search Boosts &amp;amp; Decays"&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note (2025/7/7)&lt;/strong&gt;: Snowflake AI &amp;amp; ML Studio is currently in public preview, so features may undergo significant updates. However, Cortex Search itself is already Generally Available!&lt;/p&gt;

&lt;p&gt;Note: This article represents my personal views and not those of Snowflake.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Cortex Search Management in Snowflake AI &amp;amp; ML Studio
&lt;/h2&gt;

&lt;p&gt;Snowflake AI &amp;amp; ML Studio serves as Snowflake's &lt;strong&gt;GUI-based AI/ML environment&lt;/strong&gt;, and Cortex Search creation capabilities have been available for some time. Recent updates have significantly enhanced Cortex Search management functionality, allowing nearly all tasks necessary for Cortex Search creation and operation to be completed entirely within Snowflake AI &amp;amp; ML Studio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Accessing AI &amp;amp; ML Studio
&lt;/h3&gt;

&lt;p&gt;First, log into Snowsight and click &lt;code&gt;AI &amp;amp; ML&lt;/code&gt; → &lt;code&gt;Studio&lt;/code&gt; from the left navigation pane.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj6bo7l9s6gwl810j5y7w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj6bo7l9s6gwl810j5y7w.png" alt="AI &amp;amp; ML Studio Main Interface" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within Studio, you can manage various AI/ML features including Cortex Search, Cortex Analyst, LLM Playground, and ML function creation through web-based UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revolutionary Cortex Search Management UI
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Since Cortex Search creation screens remain unchanged from previous versions, I'll focus on the management improvements here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Cortex Search Service Overview
&lt;/h3&gt;

&lt;p&gt;When you select Cortex Search from AI &amp;amp; ML Studio, all existing Cortex Search services are displayed in a comprehensive list view.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhztjyquve4bnag2fbzkh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhztjyquve4bnag2fbzkh.png" alt="Cortex Search Service List View" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk2609s3razguoz0jx6b9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk2609s3razguoz0jx6b9.png" alt="Available Actions for Cortex Search Services" width="156" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Information visible at a glance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service names and status indicators&lt;/li&gt;
&lt;li&gt;Database and schema information&lt;/li&gt;
&lt;li&gt;Index creation status&lt;/li&gt;
&lt;li&gt;Index refresh frequency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Executable operations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create new services (&lt;code&gt;Create&lt;/code&gt; button)&lt;/li&gt;
&lt;li&gt;View detailed service information&lt;/li&gt;
&lt;li&gt;Test searches in playground environment&lt;/li&gt;
&lt;li&gt;Manually trigger index updates&lt;/li&gt;
&lt;li&gt;Modify index refresh frequency and warehouse settings&lt;/li&gt;
&lt;li&gt;Pause/resume index creation&lt;/li&gt;
&lt;li&gt;Pause/resume services&lt;/li&gt;
&lt;li&gt;Delete services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Previously, information like this was only accessible through SQL commands such as &lt;code&gt;SHOW CORTEX SEARCH SERVICES;&lt;/code&gt;. Now it's presented in a visually intuitive format. This is particularly valuable since Cortex Search consumes computing resources during index creation - helping avoid situations like "Oops, I've been updating an unused Cortex Search service forever!"&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Service Details and Data Preview
&lt;/h3&gt;

&lt;p&gt;Selecting a specific Cortex Search service reveals detailed configuration information, &lt;strong&gt;actual data previews&lt;/strong&gt;, and &lt;strong&gt;Cortex Search cost information&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1tumhy740oww3qmnqlg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1tumhy740oww3qmnqlg.png" alt="Service Detail View" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuxviwg1q6dkukb78l3rw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuxviwg1q6dkukb78l3rw.png" alt="Data Preview Interface" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funlvs9gsu30drdti45nd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funlvs9gsu30drdti45nd.png" alt="Cost Monitoring Dashboard" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Detailed information displayed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search target column specifications&lt;/li&gt;
&lt;li&gt;Attribute column details&lt;/li&gt;
&lt;li&gt;Last update timestamps&lt;/li&gt;
&lt;li&gt;Warehouse utilization&lt;/li&gt;
&lt;li&gt;Embedding model configurations&lt;/li&gt;
&lt;li&gt;Service query URLs and sample code for Python/API calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actual data preview displays&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cortex Search cost analytics&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's particularly noteworthy is the ability to &lt;strong&gt;examine actual vector data&lt;/strong&gt;. While most managed services typically hide this information, being able to inspect the actual embedded vector data provides incredibly valuable debugging information for AI engineers.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Playground Functionality
&lt;/h3&gt;

&lt;p&gt;One of the most exciting features is the &lt;strong&gt;playground functionality&lt;/strong&gt;, which allows you to test searches in real-time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwv99fs45r3d0aj4w63v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwv99fs45r3d0aj4w63v.png" alt="Cortex Search Playground Interface" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Playground capabilities:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Execute natural language search queries&lt;/li&gt;
&lt;li&gt;Display search result chunks&lt;/li&gt;
&lt;li&gt;Apply attribute-based filtering&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify Boosts &amp;amp; Decays effects&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This empowers developers to validate search quality before implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Business Value and Impact
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dramatic Development and Operations Efficiency Gains
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional Challenge&lt;/th&gt;
&lt;th&gt;New Management UI Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Required memorizing and executing SQL commands&lt;/td&gt;
&lt;td&gt;Intuitive GUI operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difficult to understand service status&lt;/td&gt;
&lt;td&gt;Real-time status displays and dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-consuming search quality verification&lt;/td&gt;
&lt;td&gt;Instant testing via playground&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Challenging to obtain debugging information&lt;/td&gt;
&lt;td&gt;Vector data visualization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Risk of configuration errors&lt;/td&gt;
&lt;td&gt;GUI-guided setup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Enhanced ROI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Development Time Reduction:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decreased service management time&lt;/li&gt;
&lt;li&gt;Reduced search quality testing and validation time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operational Cost Optimization:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time monitoring through GUI enables appropriate resource management&lt;/li&gt;
&lt;li&gt;Pre-testing in playground reduces trial-and-error in production environments&lt;/li&gt;
&lt;li&gt;Eliminated costs from configuration error-induced recreations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Democratizing AI Application Development
&lt;/h3&gt;

&lt;p&gt;Cortex Search management, which previously required SQL expertise, has become more accessible through GUI interfaces. This enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Business users&lt;/strong&gt; to verify search quality and make basic configuration changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application developers&lt;/strong&gt; to more easily integrate enterprise search and RAG chat applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The Cortex Search management UI revolution in Snowflake AI &amp;amp; ML Studio has &lt;strong&gt;dramatically lowered barriers for enterprise search utilization and RAG chat application development&lt;/strong&gt;. Operations that previously required SQL expertise can now be performed through GUI, and the playground functionality makes search quality verification simple and straightforward.&lt;/p&gt;

&lt;p&gt;Key value propositions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Massive development efficiency gains&lt;/strong&gt;: Significant time savings through intuitive GUI operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality improvements&lt;/strong&gt;: Enhanced production search quality through playground pre-testing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced learning costs&lt;/strong&gt;: New engineers can leverage Cortex Search capabilities in minimal time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strengthened governance&lt;/strong&gt;: Unified management within Snowflake's integrated environment maintains security and governance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced visibility&lt;/strong&gt;: Comprehensive information visualization including vector data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For anyone considering RAG application development or enterprise search system implementation, I highly recommend exploring these new management UI capabilities. Snowflake's AI functionality continues evolving as the &lt;strong&gt;"AI platform for enterprise data"&lt;/strong&gt; - advancing both usability and functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I share Snowflake What's New updates on X. Follow for the latest insights:&lt;/p&gt;

&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20250707) Initial post&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/tsubasa_tech/articles/5f6bd4c3b4d03b" rel="noopener noreferrer"&gt;https://zenn.dev/tsubasa_tech/articles/5f6bd4c3b4d03b&lt;/a&gt;&lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>vectordatabase</category>
      <category>nlp</category>
      <category>rag</category>
    </item>
    <item>
      <title>How Snowflake Copilot Inline Transformed My SQL Analysis Experience</title>
      <dc:creator>Tsubasa Kanno</dc:creator>
      <pubDate>Wed, 11 Jun 2025 12:20:16 +0000</pubDate>
      <link>https://forem.com/tsubasa_tech/how-snowflake-copilot-inline-transformed-my-sql-analysis-experience-2j97</link>
      <guid>https://forem.com/tsubasa_tech/how-snowflake-copilot-inline-transformed-my-sql-analysis-experience-2j97</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I recently attended &lt;strong&gt;Snowflake Summit 2025&lt;/strong&gt; in San Francisco for the first time! The Summit featured many notable updates including the Crunchy Data acquisition, the powerful Snowflake Openflow for flexible data ingestion, and significant AI platform advancements. I had meaningful discussions with many customers and partners throughout the event.&lt;/p&gt;

&lt;p&gt;Among the developer experience improvements announced, one particularly exciting update is &lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-copilot-inline" rel="noopener noreferrer"&gt;&lt;strong&gt;Snowflake Copilot Inline&lt;/strong&gt;&lt;/a&gt; - a new feature in Snowflake &lt;strong&gt;Workspaces&lt;/strong&gt;! This feature makes SQL analysis more intuitive and efficient, delivering what truly feels like having an AI pair programming buddy right in your workspace.&lt;/p&gt;

&lt;p&gt;Unlike traditional Snowflake Copilot, which required switching to a dedicated chat interface, Copilot Inline lets you &lt;strong&gt;interact with an AI assistant directly within your SQL code&lt;/strong&gt;. This feels like pair programming with a veteran analyst, where AI supports your code creation - a truly revolutionary feature for SQL analysis.&lt;/p&gt;

&lt;p&gt;In this article, I'll share my hands-on experience with Snowflake Copilot Inline, covering its practical value, specific usage patterns, and optimization tips. If you're interested in boosting SQL analysis productivity, this is for you!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note (2025/6/10)&lt;/strong&gt;: Snowflake Copilot Inline is currently in public preview, so features may undergo significant updates in the future.&lt;/p&gt;

&lt;p&gt;Note: This article represents my personal views and not those of Snowflake.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is Snowflake Copilot Inline?
&lt;/h2&gt;

&lt;p&gt;Snowflake Copilot Inline is an &lt;strong&gt;AI assistant feature that integrates directly into your SQL code&lt;/strong&gt; within Snowflake Workspaces. As an enhanced version of traditional Snowflake Copilot, it offers these key capabilities:&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inline Operations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Call AI assistant with &lt;code&gt;CMD+I&lt;/code&gt; (Mac) or &lt;code&gt;Ctrl+I&lt;/code&gt; (Windows) shortcut directly in SQL files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context Understanding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatically grasps current file content and database/schema information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real-time Suggestions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provides instant SQL query improvements and fixes based on code context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Diff Display&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shows proposed changes in easy-to-read diff format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;One-click Application&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apply suggestions instantly with the Accept button&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Supported Regions
&lt;/h3&gt;

&lt;p&gt;Snowflake Copilot Inline is natively supported in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS US West 2 (Oregon)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS US East 1 (N. Virginia)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For other regions, cross-region inference functionality can be enabled by setting the &lt;code&gt;CORTEX_ENABLED_CROSS_REGION&lt;/code&gt; parameter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Snowflake Workspaces
&lt;/h2&gt;

&lt;p&gt;Before diving into Copilot Inline, let's briefly explore &lt;strong&gt;Snowflake Workspaces&lt;/strong&gt; - the foundation that makes this AI integration possible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/ui-snowsight/workspaces" rel="noopener noreferrer"&gt;Snowflake Workspaces&lt;/a&gt; is an &lt;strong&gt;integrated development environment&lt;/strong&gt; for creating, organizing, and managing code across multiple file types, accessible immediately upon logging into Snowsight. Unlike traditional Worksheets, it offers:&lt;/p&gt;

&lt;h3&gt;
  
  
  Workspaces vs. Traditional Worksheets
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Traditional Worksheets&lt;/th&gt;
&lt;th&gt;Workspaces&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Individual worksheet management&lt;/td&gt;
&lt;td&gt;File/folder-based hierarchical organization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Development Environment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single query execution focus&lt;/td&gt;
&lt;td&gt;IDE-like integrated development environment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Git Integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Git repository synchronization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parallel Execution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One query at a time&lt;/td&gt;
&lt;td&gt;Two simultaneous queries from same SQL file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic history only&lt;/td&gt;
&lt;td&gt;Full Git-based version control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note (2025/6/10)&lt;/strong&gt;: Snowflake Workspaces is currently in public preview, so features may undergo significant updates in the future.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Access Control and Permissions
&lt;/h2&gt;

&lt;p&gt;To use Snowflake Copilot Inline, you need these permissions:&lt;/p&gt;

&lt;h3&gt;
  
  
  Required Permissions
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;COPILOT_USER&lt;/strong&gt; database role&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Role within SNOWFLAKE database&lt;/li&gt;
&lt;li&gt;Granted to PUBLIC role by default&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CORTEX_USER&lt;/strong&gt; database role&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Role within SNOWFLAKE database&lt;/li&gt;
&lt;li&gt;Required for Snowflake AISQL functions&lt;/li&gt;
&lt;li&gt;Granted to PUBLIC role by default&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;claude-3.5-sonnet&lt;/strong&gt; model access&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Must be included in model allowlist&lt;/li&gt;
&lt;li&gt;No RBAC restrictions applied&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Permission Verification
&lt;/h3&gt;

&lt;p&gt;Most users can access the feature with &lt;strong&gt;default settings&lt;/strong&gt;, but if you encounter issues:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Check current permissions&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;GRANTS&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="k"&gt;PUBLIC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Grant permissions if needed (requires ACCOUNTADMIN)&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;ACCOUNTADMIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;SNOWFLAKE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COPILOT_USER&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="k"&gt;PUBLIC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;SNOWFLAKE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CORTEX_USER&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="k"&gt;PUBLIC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Supported Use Cases
&lt;/h2&gt;

&lt;p&gt;Snowflake Copilot Inline excels in these scenarios:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Data Exploration
&lt;/h3&gt;

&lt;p&gt;Query AI about unfamiliar datasets to understand structure and characteristics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;"What tables are in this schema?"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;"Tell me about the structure of the customer table"&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. SQL Query Generation
&lt;/h3&gt;

&lt;p&gt;Convert natural language requests into SQL code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;"Get monthly sales trends for the past year"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;"Show customer purchase frequency ranked by activity"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;"Create sales analysis query excluding outliers"&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Query Optimization
&lt;/h3&gt;

&lt;p&gt;Get improvement suggestions for existing queries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;"Optimize this query for better performance"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;"Rewrite this query for better readability"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;"Suggest efficiency improvements for this SQL"&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Syntax Error Fixes
&lt;/h3&gt;

&lt;p&gt;Quickly resolve SQL syntax issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;"Fix the syntax error in this query"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;"Why isn't this query working?"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;"Correct the JOIN syntax"&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Use Copilot Inline
&lt;/h2&gt;

&lt;p&gt;Operating Snowflake Copilot Inline is refreshingly simple:&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic Workflow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open Workspaces&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to Workspaces in Snowsight&lt;/li&gt;
&lt;li&gt;Create new file or open existing SQL file&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs8zmrw11i4xaagbpsq79.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs8zmrw11i4xaagbpsq79.png" alt="Snowflake Workspaces interface" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Call Copilot Inline&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Position cursor anywhere in your code&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;CMD+I&lt;/code&gt; (Mac) or &lt;code&gt;Ctrl+I&lt;/code&gt; (Windows)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e3ibmvxhi9hkhgj5qcc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e3ibmvxhi9hkhgj5qcc.png" alt="Calling Copilot Inline with keyboard shortcut" width="722" height="90"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Submit Request&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Enter natural language request in message dialog&lt;/li&gt;
&lt;li&gt;Click send icon to submit to AI&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpcygtpq6x0fvwxgh2tyv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpcygtpq6x0fvwxgh2tyv.png" alt="Entering natural language request" width="726" height="88"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Review Suggestions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View AI-generated changes in diff format&lt;/li&gt;
&lt;li&gt;Red: deleted lines, Green: added lines&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apply Changes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accept&lt;/strong&gt;: Apply suggestions to code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reject&lt;/strong&gt;: Decline suggestions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Close&lt;/strong&gt;: End session&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F84v5i7y26xy1so8yx0ye.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F84v5i7y26xy1so8yx0ye.png" alt="Reviewing and applying suggestions" width="735" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Execute Suggested Query&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Run the suggested query to see results&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5i4j6dpbicayp7tunzdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5i4j6dpbicayp7tunzdk.png" alt="Executing the suggested query" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations and Considerations
&lt;/h2&gt;

&lt;p&gt;Snowflake Copilot Inline has these current limitations:&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Limitations
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limitation&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cannot access table data values (metadata only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Response Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complex requests may require several seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;New Object Recognition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3-4 hours needed to recognize newly created tables/schemas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Considers only top 10 most relevant tables and 10 columns each&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Language Support
&lt;/h3&gt;

&lt;p&gt;Supported languages include:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ls4r69kqxd7xkg0uy7e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ls4r69kqxd7xkg0uy7e.png" alt="Supported languages" width="385" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/snowflake-copilot-inline#limitations" rel="noopener noreferrer"&gt;Supported Languages&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Business Value and ROI
&lt;/h2&gt;

&lt;p&gt;Snowflake Copilot Inline delivers significant business impact:&lt;/p&gt;

&lt;h3&gt;
  
  
  Analysis Efficiency Gains
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQL creation time reduction&lt;/strong&gt;: Significant time savings in analysis and development through natural language generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging time reduction&lt;/strong&gt;: AI-powered syntax error detection and fixes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning cost reduction&lt;/strong&gt;: High-quality query creation even for junior developers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Enhanced Data Utilization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accelerated exploratory analysis&lt;/strong&gt;: Faster understanding of new datasets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best practice adoption&lt;/strong&gt;: AI suggests optimized query patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced skill dependency&lt;/strong&gt;: Less reliance on individual SQL expertise&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cost Reduction Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Optimized development resources&lt;/strong&gt;: Freedom from routine query creation tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced training costs&lt;/strong&gt;: Shorter onboarding and training time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality improvement&lt;/strong&gt;: Reduced errors and rework through AI assistance&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Snowflake Copilot Inline is a &lt;strong&gt;game-changing feature that fundamentally transforms SQL analysis experience&lt;/strong&gt;. It delivers exceptional value through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced developer experience&lt;/strong&gt;: Pair programming-like experience with AI assistance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accelerated learning&lt;/strong&gt;: Natural acquisition of best practices through AI suggestions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Massive productivity gains&lt;/strong&gt;: Focus on creative analysis instead of routine coding tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personally, I often find myself thinking "How do I write this query again?" and this feature has been invaluable for quickly fixing syntax without switching screens.&lt;/p&gt;

&lt;p&gt;I highly recommend this feature to everyone involved in SQL analysis and development. Give it a try!&lt;/p&gt;

&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I share Snowflake What's New updates on X. Follow for the latest:&lt;/p&gt;

&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20250611) Initial post&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/tsubasa_tech/articles/eafab909ce2386" rel="noopener noreferrer"&gt;https://zenn.dev/tsubasa_tech/articles/eafab909ce2386&lt;/a&gt;&lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>sql</category>
      <category>llm</category>
      <category>analytics</category>
    </item>
    <item>
      <title>From Data Silos to Data Paradise - Organization Listing Approval Workflows in Snowflake</title>
      <dc:creator>Tsubasa Kanno</dc:creator>
      <pubDate>Sat, 31 May 2025 10:28:50 +0000</pubDate>
      <link>https://forem.com/tsubasa_tech/from-data-silos-to-data-paradise-organization-listing-approval-workflows-in-snowflake-3boj</link>
      <guid>https://forem.com/tsubasa_tech/from-data-silos-to-data-paradise-organization-listing-approval-workflows-in-snowflake-3boj</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;With the upcoming &lt;strong&gt;Snowflake Summit 2025&lt;/strong&gt; starting June 2nd, I'm excited to be heading to San Francisco! If you're attending, I'd love to connect. Unlike my usual focus on generative AI and Streamlit, today I'm diving into an exciting data collaboration update from Snowflake.&lt;/p&gt;

&lt;p&gt;Snowflake provides a platform that supports every data architecture pattern, including the ability to realize the &lt;strong&gt;Data Mesh&lt;/strong&gt; vision – where each organization takes ownership of their data while enabling others to discover and utilize it. However, implementing Data Mesh hasn't been straightforward. Beyond technical hurdles, operational challenges around cross-organizational coordination and access management have made it difficult for many enterprises to achieve this ideal.&lt;/p&gt;

&lt;p&gt;That's where Snowflake's new &lt;a href="https://docs.snowflake.com/en/user-guide/collaboration/listings/organizational/request-approval-workflow" rel="noopener noreferrer"&gt;&lt;strong&gt;Organization Listing approval workflow&lt;/strong&gt;&lt;/a&gt; comes in! This feature makes enterprise data sharing more accessible and secure, enabling organizations to easily implement Data Mesh and enterprise data catalogs on the Snowflake platform.&lt;/p&gt;

&lt;p&gt;In this article, I'll explore the value of Organization Listing approval workflows, their role as enterprise data catalogs, and how simple they are to operate.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This article represents my personal views and not those of Snowflake.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Understanding Organization Listing and Internal Marketplace
&lt;/h2&gt;

&lt;p&gt;Let's first clarify the relationship between Organization Listing and Internal Marketplace, as understanding this connection is crucial to grasping the value of the approval workflow feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Organization Listing?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/collaboration/listings/organizational/org-listing-about" rel="noopener noreferrer"&gt;&lt;strong&gt;Organization Listing&lt;/strong&gt;&lt;/a&gt; is a mechanism for securely sharing data products within a Snowflake organization. It refers to listings (data sharing units) created and managed by data providers.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Internal Marketplace?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/collaboration/listings/organizational/org-listing-about#the-internal-marketplace" rel="noopener noreferrer"&gt;&lt;strong&gt;Internal Marketplace&lt;/strong&gt;&lt;/a&gt; is a curated, secure space for collaborative data sharing within your organization, serving as the platform where Organization Listings are centrally displayed. Key features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Organization-only&lt;/strong&gt;: Similar to the public Snowflake Marketplace, but exclusively for your organization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data catalog functionality&lt;/strong&gt;: Aggregates and organizes data products available within the organization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure access management&lt;/strong&gt;: Managed through account targeting and Role-Based Access Control (RBAC)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-service discovery&lt;/strong&gt;: Enables discovery and utilization of internal resources without navigating external marketplaces&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Two Sides of the Same Coin
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Organization Listing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data products shared within the organization (content)&lt;/td&gt;
&lt;td&gt;Data sharing units created and managed by providers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Internal Marketplace&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Platform where Organization Listings are displayed (location)&lt;/td&gt;
&lt;td&gt;Where data consumers discover and access listings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In essence, &lt;strong&gt;Organization Listing is the "content" and Internal Marketplace is the "platform" that displays and manages it&lt;/strong&gt; – they work together as two sides of the same coin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approval Workflow Overview
&lt;/h2&gt;

&lt;p&gt;The newly added approval workflow feature significantly simplifies access management for Organization Listings. Previously, access permissions had to be configured manually, but this feature enables the following workflow:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Request-Based Access Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data consumers&lt;/strong&gt; can send access requests with one click from Snowsight&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data providers&lt;/strong&gt; receive requests and decide whether to approve or deny them&lt;/li&gt;
&lt;li&gt;Upon approval, access permissions are automatically granted&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Two Approval Methods
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approval Method&lt;/th&gt;
&lt;th&gt;Features&lt;/th&gt;
&lt;th&gt;Use Cases&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Manage within Snowflake&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complete approval flow within Snowsight&lt;/td&gt;
&lt;td&gt;When rapid approval is needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;External management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Email or URL-based approval flow&lt;/td&gt;
&lt;td&gt;When integrating with existing approval processes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3. Flexible Access Control Settings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Organization-wide access&lt;/strong&gt;: Anyone in the organization can access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selected accounts and roles only&lt;/strong&gt;: Only specified accounts and roles can access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval required&lt;/strong&gt;: No one can access without prior approval (default)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Realizing the Data Mesh Vision
&lt;/h2&gt;

&lt;p&gt;The true value of this approval workflow feature lies in its ability to &lt;strong&gt;realistically implement Data Mesh principles&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Promoting Distributed Data Ownership
&lt;/h3&gt;

&lt;p&gt;Traditional data warehouse approaches often had IT departments centrally managing all data. However, with Organization Listing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Each department can take responsibility for their own data&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data domain experts function as data providers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;People who best understand data quality and meaning manage the data&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Self-Service Data Discovery
&lt;/h3&gt;

&lt;p&gt;The approval workflow feature enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data consumers to proactively discover data&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direct interaction with data providers without IT department intermediation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data catalog functionality&lt;/strong&gt; that visualizes organizational data assets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Balancing Governance and Agility
&lt;/h3&gt;

&lt;p&gt;While "strengthening governance" and "accelerating data utilization" have often been seen as opposing forces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Approval flows maintain governance&lt;/strong&gt; while&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple Snowsight operations enable access requests&lt;/strong&gt; and&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dramatically reduce time to data utilization&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Simplicity of Operations
&lt;/h2&gt;

&lt;p&gt;One of the major attractions of the approval workflow feature is its &lt;strong&gt;operational simplicity&lt;/strong&gt;. The Snowsight-based UI allows intuitive operation even for non-technical users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Provider Operations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create Organization Listing in &lt;strong&gt;Provider Studio&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Configure approval workflow in &lt;strong&gt;Access control&lt;/strong&gt; section&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select approval method&lt;/strong&gt; (within Snowflake or external)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specify approvers&lt;/strong&gt; (email addresses or roles)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish&lt;/strong&gt; to complete listing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Configure access control settings in Provider Studio&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ttex9g5o88sffdtf565.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ttex9g5o88sffdtf565.png" alt="Configure access control settings in Provider Studio" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Click "Set up request approval flow" in the "Allow discovery" section&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b6ltr5vkxi08u85g8rd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b6ltr5vkxi08u85g8rd.png" alt="Click " width="545" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Select "Manage requests in Snowflake" to set up managed approval workflow&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz521glvzrxlmx47sd2wj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz521glvzrxlmx47sd2wj.png" alt="Select " width="548" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Complete necessary settings and click "Publish" in the top right to publish the Organization Listing&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fys0dh9azrp17jtv3l5cl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fys0dh9azrp17jtv3l5cl.png" alt="Complete necessary settings and click " width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Consumer Operations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Search and discover&lt;/strong&gt; data in Internal Marketplace&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Request access&lt;/strong&gt; button&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enter access reason&lt;/strong&gt; and submit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receive approval notification&lt;/strong&gt; and immediately start accessing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Search for internally published lists in Internal Marketplace and make access requests&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frl7m1sk935pr7fcwi7as.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frl7m1sk935pr7fcwi7as.png" alt="Search for internally published lists in Internal Marketplace and make access requests" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Submit request with reason for access&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fftee01tzxwgzknvvdn1j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fftee01tzxwgzknvvdn1j.png" alt="Submit request with reason for access" width="541" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Approver Operations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Receive email notification&lt;/strong&gt; or check in Snowsight&lt;/li&gt;
&lt;li&gt;Review request details on &lt;strong&gt;Internal Requests&lt;/strong&gt; page&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make approval/denial decision&lt;/strong&gt; with one click&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access permissions are automatically granted&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Requests are notified to administrators via email&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mwdtmkwlvfqc1zus9j8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mwdtmkwlvfqc1zus9j8.png" alt="Requests are notified to administrators via email" width="588" height="651"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;View current requests in list format in Provider Studio&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsskpbv3sygyluwpp4qdy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsskpbv3sygyluwpp4qdy.png" alt="View current requests in list format in Provider Studio" width="800" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Add approval reason and approve to make the listing available to consumers&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0f7h93xvgyrxt0tbpty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0f7h93xvgyrxt0tbpty.png" alt="Add approval reason and approve to make the listing available to consumers" width="579" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All these operations are &lt;strong&gt;GUI-based&lt;/strong&gt; and require &lt;strong&gt;no SQL knowledge&lt;/strong&gt;. This enables data sharing and utilization even for non-data engineers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Business Scenarios
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scenario 1: Marketing and Sales Department Collaboration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;: Sales department wants to utilize lead information from Marketing department&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Marketing department&lt;/strong&gt; publishes lead data via Organization Listing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sales department&lt;/strong&gt; discovers data in Internal Marketplace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submit access request&lt;/strong&gt; and Marketing department approves&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Begin real-time utilization&lt;/strong&gt; for sales activities&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Scenario 2: Finance and Business Department Reporting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;: Various business departments want to perform custom analysis using financial data&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Finance department&lt;/strong&gt; publishes financial data with approval required on Organization Listing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business departments&lt;/strong&gt; request access as needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finance department judges appropriateness&lt;/strong&gt; and approves/denies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data utilization while maintaining compliance&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Scenario 3: Data Science and Business Team Collaboration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;: Business teams want to utilize analysis results from Data Science teams&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Data Science team&lt;/strong&gt; shares analysis results via Organization Listing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business teams&lt;/strong&gt; discover relevant datasets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rapid approval process&lt;/strong&gt; enables immediate access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accelerated data-driven decision making&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Traditional Challenges and Solutions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional Challenge&lt;/th&gt;
&lt;th&gt;Organization Listing Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unaware of data existence&lt;/td&gt;
&lt;td&gt;Centralized data catalog in Internal Marketplace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex access application process&lt;/td&gt;
&lt;td&gt;One-click application in Snowsight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-consuming approval&lt;/td&gt;
&lt;td&gt;Automated approval workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security concerns&lt;/td&gt;
&lt;td&gt;Approval-based and role-based access control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unknown data quality&lt;/td&gt;
&lt;td&gt;Provider descriptions and metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Snowflake's Organization Listing approval workflow feature is a &lt;strong&gt;game-changer that enables realistic implementation of Data Mesh principles&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;It fundamentally solves traditional enterprise data sharing challenges in these key areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Significantly reduced technical barriers&lt;/strong&gt;: GUI-based intuitive operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Balance of governance and agility&lt;/strong&gt;: Appropriate control through approval flows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promoted cross-organizational data utilization&lt;/strong&gt;: Easy data sharing across account boundaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data catalog functionality&lt;/strong&gt;: Visualization of organization-wide data assets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Data Mesh vision, often considered "idealistic," can now be &lt;strong&gt;realistically and easily&lt;/strong&gt; implemented on Snowflake. For enterprises looking to accelerate data utilization organization-wide, this is undoubtedly a high-value feature.&lt;/p&gt;

&lt;p&gt;I encourage you to leverage this functionality to build a data-driven organizational culture in your own organizations!&lt;/p&gt;

&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I'm sharing updates on Snowflake's What's New on X. I'd be happy if you could follow:&lt;/p&gt;

&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20250531) Initial post&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/tsubasa_tech/articles/15ee58bb9b1bd4" rel="noopener noreferrer"&gt;https://zenn.dev/tsubasa_tech/articles/15ee58bb9b1bd4&lt;/a&gt;&lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>datamesh</category>
      <category>datamanagement</category>
      <category>dwh</category>
    </item>
  </channel>
</rss>
