{"filename":"snowflake-cortex-ai-cursorrules-prompt-file.mdc","content":"---\ndescription: \"Cursor rules for Snowflake Cortex AI Functions (AI_COMPLETE, AI_CLASSIFY, AI_EXTRACT, etc.) and Cortex Search for RAG applications.\"\nglobs: **/*\nalwaysApply: false\n---\n// Snowflake Cortex AI\n// Expert guidance for Cortex AI Functions and Cortex Search (hybrid vector+keyword search)\n\nYou are an expert in Snowflake Cortex — the AI layer of Snowflake including Cortex AI Functions (SQL-callable LLM/ML functions) and Cortex Search (managed hybrid search for RAG applications). All processing runs inside Snowflake with no data leaving the platform.\n\n// ═══════════════════════════════════════════\n// CORTEX AI FUNCTIONS\n// ═══════════════════════════════════════════\n\n// Available Functions (use these names — they are the current versions):\n// AI_COMPLETE       — General-purpose LLM completion (text, images, documents).\n// AI_CLASSIFY       — Classify text/images into user-defined categories (multi-label supported).\n// AI_FILTER         — Returns TRUE/FALSE for text/image input. Use in WHERE clauses.\n// AI_AGG            — Aggregate insights across rows of text (no context window limit).\n// AI_EMBED          — Generate embedding vectors (similarity search, clustering).\n// AI_EXTRACT        — Extract structured info from text, images, or documents.\n// AI_SENTIMENT      — Sentiment score from text (-1 to 1).\n// AI_SUMMARIZE_AGG  — Summarize across rows (no context window limit).\n// AI_SIMILARITY     — Embedding similarity between two inputs.\n// AI_TRANSCRIBE     — Transcribe audio/video from stages.\n// AI_PARSE_DOCUMENT — OCR or text+layout extraction from documents in stages.\n// AI_REDACT         — Redact PII from text.\n// AI_TRANSLATE      — Translate between supported languages.\n\n// Helper Functions:\n// TO_FILE('@stage', 'filename')  — File reference for document processing.\n// AI_COUNT_TOKENS(model, text)   — Check token count before calling a model.\n// PROMPT('template {0}', arg)    — Build prompt objects for AI_COMPLETE.\n// TRY_COMPLETE                   — Returns NULL on failure instead of error.\n\n// AI_COMPLETE — The Primary Function\n// Models: claude-4-opus, claude-4-sonnet, claude-sonnet-4-5, claude-opus-4-5, claude-haiku-4-5,\n//         gemini-3-pro, llama3.1-70b, llama3.1-8b, llama3.3-70b, mistral-large2, mistral-small2, deepseek-r1\n\n// Text completion:\nSELECT AI_COMPLETE(MODEL => 'claude-4-sonnet', PROMPT => 'Summarize: ' || review_text) FROM reviews;\n\n// Document processing:\nSELECT AI_COMPLETE(\n  MODEL => 'claude-4-sonnet',\n  PROMPT => PROMPT('Extract the invoice total from {0}', TO_FILE('@docs', 'invoice.pdf'))\n);\n\n// Structured JSON output:\nSELECT AI_COMPLETE(MODEL => 'claude-4-sonnet',\n  PROMPT => 'Extract name, email, company as JSON: ' || raw_text)::VARIANT AS extracted FROM contacts;\n\n// AI_CLASSIFY:\nSELECT AI_CLASSIFY(ticket_text, ['billing', 'technical', 'account', 'other']) AS category FROM tickets;\n// Multi-label: AI_CLASSIFY(input, categories, {'output_mode': 'multi'})\n\n// AI_FILTER (natural-language WHERE):\nSELECT * FROM reviews WHERE AI_FILTER(review_text, 'mentions product quality issues');\n\n// AI_AGG (cross-row aggregation):\nSELECT AI_AGG(feedback_text, 'What are the top 3 themes?') FROM customer_feedback;\n\n// AI_EXTRACT (entity extraction):\nSELECT AI_EXTRACT(email_body, 'meeting date', 'attendees', 'action items') FROM emails;\n\n// AI_SENTIMENT: SELECT review_text, AI_SENTIMENT(review_text) AS sentiment FROM product_reviews;\n// AI_EMBED:     SELECT AI_EMBED(description) AS embedding FROM products;\n// AI_PARSE_DOCUMENT: SELECT AI_PARSE_DOCUMENT(TO_FILE('@docs', 'contract.pdf'), MODE => 'LAYOUT');\n// AI_TRANSCRIBE:     SELECT AI_TRANSCRIBE(TO_FILE('@media', 'recording.mp3')) AS transcript;\n// AI_REDACT:         SELECT AI_REDACT(customer_notes) AS redacted FROM support_cases;\n\n// Privileges: USE AI FUNCTIONS account privilege + SNOWFLAKE.CORTEX_USER database role (both granted to PUBLIC by default).\n\n// ═══════════════════════════════════════════\n// CORTEX SEARCH — Hybrid Vector + Keyword Search\n// ═══════════════════════════════════════════\n\n// Fully managed search combining vector (semantic) and keyword (lexical) search.\n// Use cases: RAG for LLM chatbots, enterprise search, AI-powered Q&A.\n\n// Single-index (simplest):\nCREATE OR REPLACE CORTEX SEARCH SERVICE my_search\n  ON transcript_text\n  ATTRIBUTES region, agent_id\n  WAREHOUSE = my_wh\n  TARGET_LAG = '1 day'\n  EMBEDDING_MODEL = 'snowflake-arctic-embed-l-v2.0'\n  AS (SELECT transcript_text, region, agent_id FROM support_transcripts);\n\n// Multi-index (text + vector on multiple columns):\nCREATE OR REPLACE CORTEX SEARCH SERVICE my_multi_search\n  TEXT INDEXES transcript_text, summary\n  VECTOR INDEXES transcript_text (model='snowflake-arctic-embed-l-v2.0')\n  ATTRIBUTES region\n  WAREHOUSE = my_wh\n  TARGET_LAG = '1 hour'\n  AS (SELECT transcript_text, summary, region FROM support_transcripts);\n\n// Key Parameters: ON (single-index column), TEXT INDEXES, VECTOR INDEXES, ATTRIBUTES (filter columns),\n// TARGET_LAG (freshness), EMBEDDING_MODEL, PRIMARY KEY (optimized incremental refresh).\n\n// Query — Python API (recommended for apps):\nfrom snowflake.core import Root\nroot = Root(session)\nservice = root.databases[\"db\"].schemas[\"schema\"].cortex_search_services[\"my_search\"]\nresp = service.search(\n    query=\"internet connection issues\",\n    columns=[\"transcript_text\", \"region\"],\n    filter={\"@eq\": {\"region\": \"North America\"}},\n    limit=5\n)\n\n// Query — REST API:\n// POST /api/v2/databases/<db>/schemas/<schema>/cortex-search-services/<service>:query\n// Body: {\"query\": \"...\", \"columns\": [...], \"filter\": {...}, \"limit\": N}\n\n// Filter syntax:\n// {\"@eq\": {\"region\": \"NA\"}}, {\"@contains\": {\"tags\": \"urgent\"}}, {\"@gte\": {\"score\": 0.8}}\n// {\"@and\": [f1, f2]}, {\"@or\": [f1, f2]}, {\"@not\": f}\n\n// Scoring config — adjust text vs vector vs reranker weights:\nresp = service.search(query=\"billing dispute\", columns=[\"transcript_text\"],\n    scoring_config={\"weights\": {\"texts\": 0.3, \"vectors\": 0.5, \"reranker\": 0.2}}, limit=10)\n\n// RAG Pattern: 1) Search for context, 2) Pass to AI_COMPLETE:\n//   results = service.search(query=question, columns=[\"content\"], limit=5)\n//   SELECT AI_COMPLETE(MODEL=>'claude-4-sonnet', PROMPT=>'Answer from context: '||context||' Q: '||question);\n\n// Best Practices\n- Use AI_CLASSIFY for classification (cheaper than AI_COMPLETE).\n- Check token counts with AI_COUNT_TOKENS before large batch jobs.\n- Set PRIMARY KEY on Cortex Search for optimized incremental refresh.\n- Use ATTRIBUTES for filterable columns. Use SEARCH_PREVIEW for testing, Python/REST for production.\n- Use dedicated warehouse (no larger than MEDIUM) per search service.\n\n// Anti-Patterns\n- Do NOT use old function names (COMPLETE, CLASSIFY_TEXT, etc.) — use AI_* versions.\n- Do NOT pass entire tables through AI_COMPLETE row-by-row without cost estimation.\n- Do NOT hardcode model names without considering regional availability.\n"}