[object Object]

← back to Designer Wallcoverings

Upgrade all Gemini text calls from deprecated gemini-2.0-flash to gemini-3.5-flash (106 files)

bfe782d286478bedb519f27d1ad18a1f5f0620b6 · 2026-06-23 07:29:04 -0700 · Steve Abrams

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit bfe782d286478bedb519f27d1ad18a1f5f0620b6
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Jun 23 07:29:04 2026 -0700

    Upgrade all Gemini text calls from deprecated gemini-2.0-flash to gemini-3.5-flash (106 files)
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
 CLAUDE.md                                                      |  2 +-
 COMPLETED-PROCESSES.md                                         |  4 ++--
 DW-Agents/dw-agents/agent-ai-expenses/ai-expenses-tracker.ts   |  2 +-
 .../dw-agents/agent-thibaut-updater/thibaut-updater-agent.ts   |  2 +-
 DW-Agents/vendor-command-center/logo-cropper.js                |  2 +-
 DW-Agents/vendor-command-center/server.js                      |  6 +++---
 DW-Agents/vendor-command-center/standardization-worker.js      |  2 +-
 DW-Agents/vendor-command-center/website-scorer.js              |  2 +-
 DW-Programming/CLAUDE.md                                       |  2 +-
 DW-Programming/DW-Duplicate-Recolor-v1.4/lib/geminiAnalyzer.js |  4 ++--
 DW-Programming/ImportNewSkufromURL/CLAUDE.md                   |  2 +-
 .../ImportNewSkufromURL/dwjs-comprehensive-update.ts           |  2 +-
 .../ImportNewSkufromURL/dwjs-interior-design-update.js         |  6 +++---
 .../ImportNewSkufromURL/dwjs-interior-design-update.ts         |  6 +++---
 .../ImportNewSkufromURL/scripts/koroseal-enrichment.ts         |  2 +-
 .../ImportNewSkufromURL/scripts/rwltd-gemini-cron.js           |  2 +-
 DW-Programming/PhillipeRomanoTagger/server.js                  |  6 +++---
 .../ShopifyCalendarNext/scripts/rescan-scheduled-posts.ts      |  2 +-
 .../ShopifyCalendarNext/src/app/api/analyze-product/route.ts   |  2 +-
 .../src/app/api/generate-ai-content/route.ts                   |  2 +-
 DW-Programming/activate-versace-drafts.js                      |  2 +-
 DW-Programming/activate-versace-vi.js                          |  2 +-
 DW-Programming/anna-french-ai-enrich.js                        |  4 ++--
 DW-Programming/china-seas-design-tagger.js                     |  2 +-
 DW-Programming/china-seas-hex-colors.js                        |  2 +-
 DW-Programming/color-batch-cleaner.py                          |  2 +-
 DW-Programming/color-collection-cleaner.js                     |  2 +-
 DW-Programming/enrich-launched-products.py                     |  2 +-
 DW-Programming/fix-blue-collection.js                          |  2 +-
 DW-Programming/gls-gemini-retry.js                             |  2 +-
 DW-Programming/gls-product-cleanup.js                          |  2 +-
 DW-Programming/gls-product-processor.js                        |  2 +-
 DW-Programming/gls-product-updater.js                          |  2 +-
 DW-Programming/gls-retry-failed.js                             |  2 +-
 DW-Programming/hex-color-blitz.js                              |  2 +-
 DW-Programming/hollywood-hex-and-tags.js                       |  2 +-
 DW-Programming/hollywood-hex-extract.js                        |  2 +-
 DW-Programming/interior-design-ai-tagger.js                    |  2 +-
 DW-Programming/interior-design-tagger.js                       |  2 +-
 DW-Programming/maya-romanoff-updater/maya-romanoff-updater.js  |  2 +-
 DW-Programming/maya-romanoff-updater/server.js                 |  2 +-
 .../nextjs-liquid-app/app/api/analyze-image/route.ts           |  2 +-
 DW-Programming/nextjs-liquid-app/app/api/bulk-import/route.ts  |  2 +-
 DW-Programming/phase3-ai-enrich-100.js                         |  6 +++---
 DW-Programming/phase3-ai-enrich-batch.js                       |  2 +-
 DW-Programming/phase3-ai-enrich-batch.py                       |  2 +-
 DW-Programming/phase3-ai-enrich-batch.sh                       |  2 +-
 DW-Programming/phase3-ai-enrich-run.js                         |  2 +-
 DW-Programming/phase3-ai-enrichment.js                         |  2 +-
 DW-Programming/prl-ai-enrich.js                                |  8 ++++----
 DW-Programming/ralph-lauren-fabric-updater-9899.js             |  4 ++--
 DW-Programming/ralph-lauren-fabric-updater-9899.ts             |  4 ++--
 .../room-setting-app/app/api/analyze-pattern/route.ts          |  2 +-
 DW-Programming/room-setting-app/lib/multi-model-generator.ts   | 10 +++++-----
 DW-Programming/zoffany-ai-enrich.js                            |  4 ++--
 ai-enrich-arte-fix.js                                          |  2 +-
 ai-enrich-gaps2.js                                             |  2 +-
 arte-fill-tags.js                                              |  2 +-
 brand-router/server.js                                         |  2 +-
 enrich-arte-fix.js                                             |  2 +-
 enrich-arte-gaps.js                                            |  2 +-
 enrich-arte-puppeteer.js                                       |  2 +-
 enrich-remaining-13.js                                         |  2 +-
 gemini-classify-texture.js                                     |  2 +-
 gemini-enrich-arte.js                                          |  2 +-
 gemini-enrich-arte9.js                                         |  2 +-
 gemini-enrich-gaps.js                                          |  2 +-
 output/us-007-implementation-summary.md                        |  4 ++--
 pending-approval/tres-tintas-designer-descriptions-pilot.md    |  4 ++--
 scripts/US-007-USAGE.md                                        |  4 ++--
 scripts/ai-enrich-arte-gaps.js                                 |  2 +-
 scripts/ai-enrich-gaps.js                                      |  2 +-
 scripts/brand-mckenzie-ai-analysis.ts                          |  2 +-
 scripts/brand-mckenzie-full-scrape.ts                          |  2 +-
 scripts/brand-mckenzie-full-update.ts                          |  2 +-
 scripts/collection-description-writer.js                       |  2 +-
 scripts/enrich-remaining-13.js                                 |  2 +-
 scripts/interior-design-tags.js                                |  2 +-
 scripts/prl-ai-enrich.js                                       |  2 +-
 scripts/ralph/prd-ralph-lauren-fabrics.json                    |  2 +-
 scripts/texture-repeat-classifier.js                           |  4 ++--
 scripts/us-007-ai-product-quality-analyzer.ts                  |  2 +-
 shopify/scripts/arte-dashboard/server.js                       |  4 ++--
 shopify/scripts/bespoke-updater/server.js                      |  2 +-
 shopify/scripts/classify-texture-pattern.js                    |  2 +-
 shopify/scripts/gemini-catalog-tagger.js                       |  2 +-
 shopify/scripts/gemini-tag-engine/index.js                     |  2 +-
 shopify/scripts/import-missing-dwrr.ts                         |  2 +-
 shopify/scripts/interior-design-tagger.js                      |  2 +-
 shopify/scripts/koroseal-batch-cron.js                         |  2 +-
 shopify/scripts/koroseal-complete-update.ts                    |  2 +-
 shopify/scripts/koroseal-enhanced-update.js                    |  4 ++--
 shopify/scripts/koroseal-update.js                             |  2 +-
 shopify/scripts/prl-ai-enrich.js                               |  2 +-
 shopify/scripts/review-dwqw-images-descriptions.ts             |  2 +-
 shopify/scripts/set-texture-repeat-zero.js                     |  2 +-
 shopify/scripts/texture-repeat-fixer.js                        |  2 +-
 shopify/scripts/update-all-malibu-architectural.ts             |  2 +-
 shopify/scripts/update-dwk-full-details.js                     |  2 +-
 shopify/scripts/update-dwk-slow-seo.js                         |  2 +-
 shopify/scripts/update-dwqw-complete.ts                        |  2 +-
 shopify/scripts/update-dwqw-malibu-architectural.ts            |  2 +-
 shopify/scripts/update-dwrr-descriptions-quantities.ts         |  2 +-
 shopify/scripts/update-dwrr-gemini.ts                          |  2 +-
 shopify/scripts/update-koroseal-gemini.ts                      |  2 +-
 shopify/scripts/zoffany-full-monty-20.js                       |  2 +-
 106 files changed, 135 insertions(+), 135 deletions(-)

diff --git a/CLAUDE.md b/CLAUDE.md
index c4862fc5..810ee7c4 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -492,7 +492,7 @@ metafields.push({ namespace: 'dwc', key: 'manufacturer_sku', value: mfrSku, type
 ---
 
 ## Gemini for Image Analysis
-Gemini API keys and endpoints are in the global `/root/.claude/CLAUDE.md`. Use `gemini-2.0-flash` for all image analysis.
+Gemini API keys and endpoints are in the global `/root/.claude/CLAUDE.md`. Use `gemini-3.5-flash` for all image analysis.
 
 ## CRITICAL: Koroseal Product Spreadsheets #memory
 
diff --git a/COMPLETED-PROCESSES.md b/COMPLETED-PROCESSES.md
index c424faa1..8cf425bb 100644
--- a/COMPLETED-PROCESSES.md
+++ b/COMPLETED-PROCESSES.md
@@ -188,8 +188,8 @@ Example: `Travelers Palm Green (T10127) | Architectural Wallcoverings`
 ### Gemini 3.0 Configuration
 ```typescript
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
-const GEMINI_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent';
+const GEMINI_MODEL = 'gemini-3.5-flash';
+const GEMINI_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent';
 ```
 
 ### Shopify Configuration
diff --git a/DW-Agents/dw-agents/agent-ai-expenses/ai-expenses-tracker.ts b/DW-Agents/dw-agents/agent-ai-expenses/ai-expenses-tracker.ts
index 0ccf2545..8c66f2ae 100644
--- a/DW-Agents/dw-agents/agent-ai-expenses/ai-expenses-tracker.ts
+++ b/DW-Agents/dw-agents/agent-ai-expenses/ai-expenses-tracker.ts
@@ -91,7 +91,7 @@ const PRICING = {
     }
   },
   gemini: {
-    'gemini-2.0-flash-exp': {
+    'gemini-3.5-flash': {
       input: 0.00,
       output: 0.00,
       name: 'Gemini 2.0 Flash (Preview)'
diff --git a/DW-Agents/dw-agents/agent-thibaut-updater/thibaut-updater-agent.ts b/DW-Agents/dw-agents/agent-thibaut-updater/thibaut-updater-agent.ts
index 60c86aac..eaec9e2d 100644
--- a/DW-Agents/dw-agents/agent-thibaut-updater/thibaut-updater-agent.ts
+++ b/DW-Agents/dw-agents/agent-thibaut-updater/thibaut-updater-agent.ts
@@ -48,7 +48,7 @@ const PORT = 9902;
 
 // Gemini 3.0 Configuration (MANDATORY - per CLAUDE.md)
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent';
+const GEMINI_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent';
 
 // Middleware
 app.use(express.json());
diff --git a/DW-Agents/vendor-command-center/logo-cropper.js b/DW-Agents/vendor-command-center/logo-cropper.js
index 77babe05..33b4e4f9 100644
--- a/DW-Agents/vendor-command-center/logo-cropper.js
+++ b/DW-Agents/vendor-command-center/logo-cropper.js
@@ -9,7 +9,7 @@ const fs = require('fs');
 const path = require('path');
 
 const GEMINI_KEY = 'REDACTED_GEMINI_KEY';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 
 /**
  * Analyze image for logos at top/bottom using Gemini vision
diff --git a/DW-Agents/vendor-command-center/server.js b/DW-Agents/vendor-command-center/server.js
index 152fc270..eb71f735 100644
--- a/DW-Agents/vendor-command-center/server.js
+++ b/DW-Agents/vendor-command-center/server.js
@@ -948,7 +948,7 @@ app.post('/api/launch-test', async (req, res) => {
     // Helper: Gemini AI description
     async function generateDescription(imageUrl, title) {
       try {
-        const geminiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+        const geminiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
         const geminiBody = {
           contents: [{
             parts: [
@@ -1239,7 +1239,7 @@ app.post('/api/launch-test', async (req, res) => {
         try {
           const idPrompt = `Analyze this wallcovering image. Return ONLY valid JSON:\n{"dominantColor":"single color","hexCode":"#XXXXXX","allColors":["every visible color"],"styles":["1-2 from: Traditional, Contemporary, Art Deco, Mid-Century, Victorian, Baroque, Luxury, Bohemian, Coastal, Tropical, Minimalist"],"patterns":["1-2 from: Damask, Floral, Geometric, Botanical, Textured, Abstract, Stripe, Medallion, Trellis, Toile, Chinoiserie, Scenic"]}`;
           const geminiIdResp = await fetch(
-            `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`,
+            `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`,
             { method: 'POST', headers: { 'Content-Type': 'application/json' },
               body: JSON.stringify({
                 contents: [{ parts: [
@@ -3474,7 +3474,7 @@ app.post('/api/tags/batch-submit', async (req, res) => {
 
           // Call Gemini
           const geminiResp = await fetch(
-            `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+            `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
             {
               method: 'POST',
               headers: { 'Content-Type': 'application/json' },
diff --git a/DW-Agents/vendor-command-center/standardization-worker.js b/DW-Agents/vendor-command-center/standardization-worker.js
index c24d4105..5d7792b7 100644
--- a/DW-Agents/vendor-command-center/standardization-worker.js
+++ b/DW-Agents/vendor-command-center/standardization-worker.js
@@ -17,7 +17,7 @@ const pool = new Pool({
 const SHOPIFY_DOMAIN = 'designer-laboratory-sandbox.myshopify.com';
 const SHOPIFY_TOKEN = process.env.SHOPIFY_ORDERS_TOKEN;
 const GEMINI_API_KEY = 'REDACTED_GEMINI_KEY';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 
 // --- State ---
 let engineState = {
diff --git a/DW-Agents/vendor-command-center/website-scorer.js b/DW-Agents/vendor-command-center/website-scorer.js
index 4b2602d5..1d24954a 100644
--- a/DW-Agents/vendor-command-center/website-scorer.js
+++ b/DW-Agents/vendor-command-center/website-scorer.js
@@ -19,7 +19,7 @@ const http = require('http');
 const { URL } = require('url');
 
 const GEMINI_KEY = 'REDACTED_GEMINI_KEY';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${GEMINI_KEY}`;
 
 // ── HTTP fetch with redirect following ──
diff --git a/DW-Programming/CLAUDE.md b/DW-Programming/CLAUDE.md
index b8f4c316..9e9a94c3 100644
--- a/DW-Programming/CLAUDE.md
+++ b/DW-Programming/CLAUDE.md
@@ -8,7 +8,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
 
 ```typescript
 const GEMINI_API_KEY = process.env.GEMINI_API_KEY  /* 2026-05-05 SCRUB: was hardcoded; rotate via /secrets */;
-const GEMINI_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent';
+const GEMINI_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent';
 
 // Use for: color analysis, style detection, pattern recognition, descriptions
 ```
diff --git a/DW-Programming/DW-Duplicate-Recolor-v1.4/lib/geminiAnalyzer.js b/DW-Programming/DW-Duplicate-Recolor-v1.4/lib/geminiAnalyzer.js
index 82b8cc0b..189580fe 100644
--- a/DW-Programming/DW-Duplicate-Recolor-v1.4/lib/geminiAnalyzer.js
+++ b/DW-Programming/DW-Duplicate-Recolor-v1.4/lib/geminiAnalyzer.js
@@ -141,7 +141,7 @@ For ${wallWidthFt}×${wallHeightFt} wall: ${wallHeightFt > wallWidthFt ? 'NARROW
         }
 
         try {
-            const model = this.gemini.getGenerativeModel({ model: 'gemini-2.0-flash-exp' });
+            const model = this.gemini.getGenerativeModel({ model: 'gemini-3.5-flash' });
 
             const prompt = `Describe what you see in this room image. Include:
 - The wallpaper pattern on the back wall (colors, style, motifs)
@@ -312,7 +312,7 @@ CRITICAL: COMPLETELY EMPTY ROOM - NO furniture, NO sofa, NO decorative objects.
         }
 
         try {
-            const model = this.gemini.getGenerativeModel({ model: 'gemini-2.0-flash-exp' });
+            const model = this.gemini.getGenerativeModel({ model: 'gemini-3.5-flash' });
 
             const prompt = `You are an expert interior designer and wallcovering specialist with deep knowledge of design history, motifs, and styles. Analyze this wallcovering/wallpaper pattern image in extreme detail.
 
diff --git a/DW-Programming/ImportNewSkufromURL/CLAUDE.md b/DW-Programming/ImportNewSkufromURL/CLAUDE.md
index dd4066b0..18406c82 100644
--- a/DW-Programming/ImportNewSkufromURL/CLAUDE.md
+++ b/DW-Programming/ImportNewSkufromURL/CLAUDE.md
@@ -6,7 +6,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
 
 **MANDATORY: Use Gemini 3.0 for ALL image/vision tasks. NEVER use Claude Vision.**
 - **API Key**: `process.env.GEMINI_API_KEY` (was hardcoded — SCRUBBED 2026-05-05)
-- **Model**: `gemini-2.0-flash`
+- **Model**: `gemini-3.5-flash`
 - **Uses**: Color analysis, style detection, pattern recognition, product descriptions
 
 ## 🔴 CRITICAL DATABASE RULE - NEVER VIOLATE THIS
diff --git a/DW-Programming/ImportNewSkufromURL/dwjs-comprehensive-update.ts b/DW-Programming/ImportNewSkufromURL/dwjs-comprehensive-update.ts
index f8417c14..ec22a9d4 100644
--- a/DW-Programming/ImportNewSkufromURL/dwjs-comprehensive-update.ts
+++ b/DW-Programming/ImportNewSkufromURL/dwjs-comprehensive-update.ts
@@ -193,7 +193,7 @@ async function searchYork(mfrSku: string): Promise<{ found: boolean; productUrl?
 async function analyzeImageWithGemini(imageUrl: string): Promise<{ color1: string; color2: string; styles: string[]; patterns: string[] }> {
   try {
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/DW-Programming/ImportNewSkufromURL/dwjs-interior-design-update.js b/DW-Programming/ImportNewSkufromURL/dwjs-interior-design-update.js
index 4de569e6..084377e8 100644
--- a/DW-Programming/ImportNewSkufromURL/dwjs-interior-design-update.js
+++ b/DW-Programming/ImportNewSkufromURL/dwjs-interior-design-update.js
@@ -1,7 +1,7 @@
 /**
  * DWJS Interior Design Tagger + York MFR Lookup
  *
- * Uses Gemini 3.0 (gemini-2.0-flash) for AI vision analysis
+ * Uses Gemini 3.0 (gemini-3.5-flash) for AI vision analysis
  * Interior design terminology for proper color/style tagging
  *
  * Features:
@@ -212,7 +212,7 @@ async function analyzeWithGemini(imageUrl) {
     const imageBase64 = Buffer.from(imageBuffer).toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
@@ -599,7 +599,7 @@ async function main() {
   console.log('\n' + '═'.repeat(70));
   console.log('  DWJS INTERIOR DESIGN TAGGER');
   console.log(`  Range: DWJS-${START_SKU} through DWJS-${END_SKU}`);
-  console.log('  Using: Gemini 3.0 (gemini-2.0-flash) for AI vision');
+  console.log('  Using: Gemini 3.0 (gemini-3.5-flash) for AI vision');
   console.log('═'.repeat(70) + '\n');
 
   // Initialize CSV log file with headers
diff --git a/DW-Programming/ImportNewSkufromURL/dwjs-interior-design-update.ts b/DW-Programming/ImportNewSkufromURL/dwjs-interior-design-update.ts
index 441a81c2..d4cbe470 100644
--- a/DW-Programming/ImportNewSkufromURL/dwjs-interior-design-update.ts
+++ b/DW-Programming/ImportNewSkufromURL/dwjs-interior-design-update.ts
@@ -1,7 +1,7 @@
 /**
  * DWJS Interior Design Tagger + York MFR Lookup
  *
- * Uses Gemini 3.0 (gemini-2.0-flash) for AI vision analysis
+ * Uses Gemini 3.0 (gemini-3.5-flash) for AI vision analysis
  * Interior design terminology for proper color/style tagging
  *
  * Features:
@@ -216,7 +216,7 @@ async function analyzeWithGemini(imageUrl: string): Promise<{
     const imageBase64 = Buffer.from(imageBuffer).toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
@@ -529,7 +529,7 @@ async function main() {
   console.log('\n' + '═'.repeat(70));
   console.log('  DWJS INTERIOR DESIGN TAGGER');
   console.log(`  Range: DWJS-${START_SKU} through DWJS-${END_SKU}`);
-  console.log('  Using: Gemini 3.0 (gemini-2.0-flash) for AI vision');
+  console.log('  Using: Gemini 3.0 (gemini-3.5-flash) for AI vision');
   console.log('═'.repeat(70) + '\n');
 
   const progress = loadProgress();
diff --git a/DW-Programming/ImportNewSkufromURL/scripts/koroseal-enrichment.ts b/DW-Programming/ImportNewSkufromURL/scripts/koroseal-enrichment.ts
index d67d8f64..a64e48a4 100644
--- a/DW-Programming/ImportNewSkufromURL/scripts/koroseal-enrichment.ts
+++ b/DW-Programming/ImportNewSkufromURL/scripts/koroseal-enrichment.ts
@@ -409,7 +409,7 @@ async function analyzeWithGemini(imageUrl: string): Promise<string | null> {
     return new Promise((resolve) => {
       const req = https.request({
         hostname: 'generativelanguage.googleapis.com',
-        path: `/v1/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+        path: `/v1/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
       }, (res) => {
diff --git a/DW-Programming/ImportNewSkufromURL/scripts/rwltd-gemini-cron.js b/DW-Programming/ImportNewSkufromURL/scripts/rwltd-gemini-cron.js
index dc37f9c9..f07c3a9e 100644
--- a/DW-Programming/ImportNewSkufromURL/scripts/rwltd-gemini-cron.js
+++ b/DW-Programming/ImportNewSkufromURL/scripts/rwltd-gemini-cron.js
@@ -34,7 +34,7 @@ function downloadImage(url) {
 async function analyzeWithGemini(imageBase64, patternName) {
   for (let attempt = 0; attempt < 3; attempt++) {
     const res = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/DW-Programming/PhillipeRomanoTagger/server.js b/DW-Programming/PhillipeRomanoTagger/server.js
index 21a26e0c..5494bc37 100644
--- a/DW-Programming/PhillipeRomanoTagger/server.js
+++ b/DW-Programming/PhillipeRomanoTagger/server.js
@@ -310,7 +310,7 @@ async function analyzeImageWithGemini(imageUrl, productTitle, productDescription
     const base64Image = Buffer.from(imageBuffer).toString('base64');
     const mimeType = imageResponse.headers.get('content-type') || 'image/jpeg';
 
-    const model = gemini.getGenerativeModel({ model: 'gemini-2.0-flash' });
+    const model = gemini.getGenerativeModel({ model: 'gemini-3.5-flash' });
 
     // Clean description (remove HTML)
     const cleanDescription = productDescription
@@ -552,7 +552,7 @@ async function generateDescriptionSuggestion(currentDescription, aiAnalysis, pro
   }
 
   try {
-    const model = gemini.getGenerativeModel({ model: 'gemini-2.0-flash' });
+    const model = gemini.getGenerativeModel({ model: 'gemini-3.5-flash' });
 
     // Clean current description
     const cleanDescription = (currentDescription || '')
@@ -609,7 +609,7 @@ async function generateSEOSuggestion(productTitle, aiAnalysis, suggestedTags) {
   }
 
   try {
-    const model = gemini.getGenerativeModel({ model: 'gemini-2.0-flash' });
+    const model = gemini.getGenerativeModel({ model: 'gemini-3.5-flash' });
 
     // Extract short product name (first word or two)
     const shortName = productTitle.split(' - ')[0].split(' ').slice(0, 2).join(' ').slice(0, 15);
diff --git a/DW-Programming/ShopifyCalendarNext/scripts/rescan-scheduled-posts.ts b/DW-Programming/ShopifyCalendarNext/scripts/rescan-scheduled-posts.ts
index 89952ce7..dd7edf1c 100644
--- a/DW-Programming/ShopifyCalendarNext/scripts/rescan-scheduled-posts.ts
+++ b/DW-Programming/ShopifyCalendarNext/scripts/rescan-scheduled-posts.ts
@@ -27,7 +27,7 @@ async function analyzeWithGemini(imageUrl: string, title: string, sku: string =
     const patternName = patternMatch ? patternMatch[1].trim() : title.split(' ').slice(0, 3).join(' ');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/DW-Programming/ShopifyCalendarNext/src/app/api/analyze-product/route.ts b/DW-Programming/ShopifyCalendarNext/src/app/api/analyze-product/route.ts
index 55aafc05..cbaa9721 100644
--- a/DW-Programming/ShopifyCalendarNext/src/app/api/analyze-product/route.ts
+++ b/DW-Programming/ShopifyCalendarNext/src/app/api/analyze-product/route.ts
@@ -78,7 +78,7 @@ Return ONLY valid JSON matching this schema:
 }`;
 
   const geminiRes = await fetch(
-    `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+    `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
     {
       method: 'POST',
       headers: { 'Content-Type': 'application/json' },
diff --git a/DW-Programming/ShopifyCalendarNext/src/app/api/generate-ai-content/route.ts b/DW-Programming/ShopifyCalendarNext/src/app/api/generate-ai-content/route.ts
index 01129f88..9b0b8ab8 100644
--- a/DW-Programming/ShopifyCalendarNext/src/app/api/generate-ai-content/route.ts
+++ b/DW-Programming/ShopifyCalendarNext/src/app/api/generate-ai-content/route.ts
@@ -25,7 +25,7 @@ export async function POST(request: NextRequest) {
 
     // Call Gemini API for analysis
     const geminiResponse = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/DW-Programming/activate-versace-drafts.js b/DW-Programming/activate-versace-drafts.js
index 723012e1..9b7db7e7 100644
--- a/DW-Programming/activate-versace-drafts.js
+++ b/DW-Programming/activate-versace-drafts.js
@@ -10,7 +10,7 @@
 const SHOPIFY_DOMAIN = 'designer-laboratory-sandbox.myshopify.com';
 const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const SILAS_URL = 'http://127.0.0.1:9674/api/validate-activation';
 const PG_CONN = (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified');
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
diff --git a/DW-Programming/activate-versace-vi.js b/DW-Programming/activate-versace-vi.js
index c1d1074a..4b06890e 100644
--- a/DW-Programming/activate-versace-vi.js
+++ b/DW-Programming/activate-versace-vi.js
@@ -18,7 +18,7 @@ const { Client } = require('pg');
 const SHOPIFY_STORE = 'designer-laboratory-sandbox.myshopify.com';
 const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const SILAS_URL = 'http://127.0.0.1:9674/api/validate-activation';
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
 const PG_URI = (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified');
diff --git a/DW-Programming/anna-french-ai-enrich.js b/DW-Programming/anna-french-ai-enrich.js
index 6cc85eff..c95122da 100644
--- a/DW-Programming/anna-french-ai-enrich.js
+++ b/DW-Programming/anna-french-ai-enrich.js
@@ -16,7 +16,7 @@ const https = require('https');
 const http = require('http');
 
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
 
 const pool = new Pool({
@@ -238,7 +238,7 @@ async function main() {
 
   console.log('=== Anna French AI Enrichment (Phase 3) ===');
   console.log(`Started: ${new Date().toLocaleString('en-US', { timeZone: 'America/Los_Angeles' })} PT`);
-  console.log(`Gemini model: gemini-2.0-flash | Delay: ${DELAY_MS}ms`);
+  console.log(`Gemini model: gemini-3.5-flash | Delay: ${DELAY_MS}ms`);
 
   // Get products needing AI enrichment
   let query = `
diff --git a/DW-Programming/china-seas-design-tagger.js b/DW-Programming/china-seas-design-tagger.js
index 92e8b4a9..e52bea81 100644
--- a/DW-Programming/china-seas-design-tagger.js
+++ b/DW-Programming/china-seas-design-tagger.js
@@ -11,7 +11,7 @@ const { Pool } = require('pg');
 
 // --- Config ---
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const SHOPIFY_STORE = 'designer-laboratory-sandbox.myshopify.com';
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
diff --git a/DW-Programming/china-seas-hex-colors.js b/DW-Programming/china-seas-hex-colors.js
index aa610bf1..ee970126 100644
--- a/DW-Programming/china-seas-hex-colors.js
+++ b/DW-Programming/china-seas-hex-colors.js
@@ -14,7 +14,7 @@ const pool = new Pool({
 });
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 const BATCH_SIZE = 50;
 const DELAY_MS = 650; // ~90 RPM to stay under Gemini rate limits
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
diff --git a/DW-Programming/color-batch-cleaner.py b/DW-Programming/color-batch-cleaner.py
index 60ecb4fd..22d06a6b 100644
--- a/DW-Programming/color-batch-cleaner.py
+++ b/DW-Programming/color-batch-cleaner.py
@@ -373,7 +373,7 @@ def phase2(color_name):
         print(f'  Uploaded: {uploaded.name}')
 
         batch_job = client.batches.create(
-            model="gemini-2.0-flash",
+            model="gemini-3.5-flash",
             src=uploaded.name,
             config={"display_name": f"color-clean-{color_name}-{jsonl_path.stem}"}
         )
diff --git a/DW-Programming/color-collection-cleaner.js b/DW-Programming/color-collection-cleaner.js
index e6b3a942..7a83c1f3 100644
--- a/DW-Programming/color-collection-cleaner.js
+++ b/DW-Programming/color-collection-cleaner.js
@@ -183,7 +183,7 @@ function callGemini(geminiBody) {
   return new Promise((resolve, reject) => {
     const gemReq = https.request({
       hostname: 'generativelanguage.googleapis.com',
-      path: `/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`,
+      path: `/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`,
       method: 'POST',
       headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(geminiBody) },
       timeout: 30000,
diff --git a/DW-Programming/enrich-launched-products.py b/DW-Programming/enrich-launched-products.py
index 5f7ada9c..c79c75e9 100644
--- a/DW-Programming/enrich-launched-products.py
+++ b/DW-Programming/enrich-launched-products.py
@@ -7,7 +7,7 @@ Downloads images, sends to Gemini, outputs JSON with descriptions.
 import requests, json, base64, sys, time
 
 GEMINI_KEY = "${GOOGLE_API_KEY}"
-GEMINI_URL = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key={GEMINI_KEY}"
+GEMINI_URL = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key={GEMINI_KEY}"
 
 products = [
     {
diff --git a/DW-Programming/fix-blue-collection.js b/DW-Programming/fix-blue-collection.js
index c3123c7b..249aa76c 100644
--- a/DW-Programming/fix-blue-collection.js
+++ b/DW-Programming/fix-blue-collection.js
@@ -103,7 +103,7 @@ async function analyzeWithGemini(imageUrl) {
 
         const gemReq = https.request({
           hostname: 'generativelanguage.googleapis.com',
-          path: `/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`,
+          path: `/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`,
           method: 'POST',
           headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(geminiBody) },
         }, (gemRes) => {
diff --git a/DW-Programming/gls-gemini-retry.js b/DW-Programming/gls-gemini-retry.js
index b9791b9e..16c5bf86 100644
--- a/DW-Programming/gls-gemini-retry.js
+++ b/DW-Programming/gls-gemini-retry.js
@@ -10,7 +10,7 @@ const sharp = require('sharp');
 const SHOPIFY_STORE = 'designer-laboratory-sandbox.myshopify.com';
 const ACCESS_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 
 const sleep = ms => new Promise(r => setTimeout(r, ms));
 
diff --git a/DW-Programming/gls-product-cleanup.js b/DW-Programming/gls-product-cleanup.js
index d11f6a7e..a0b3ac54 100644
--- a/DW-Programming/gls-product-cleanup.js
+++ b/DW-Programming/gls-product-cleanup.js
@@ -17,7 +17,7 @@ const sharp = require('sharp');
 const SHOPIFY_STORE = 'designer-laboratory-sandbox.myshopify.com';
 const ACCESS_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 const API_VERSION = '2024-01';
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
 
diff --git a/DW-Programming/gls-product-processor.js b/DW-Programming/gls-product-processor.js
index 0fe44625..f101b85e 100644
--- a/DW-Programming/gls-product-processor.js
+++ b/DW-Programming/gls-product-processor.js
@@ -16,7 +16,7 @@ const path = require('path');
 const SHOPIFY_DOMAIN = 'designer-laboratory-sandbox.myshopify.com';
 const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
 
 const TAGS_TO_REMOVE = ['brand vinyl', 'composition vinyl', 'vinyl'];
diff --git a/DW-Programming/gls-product-updater.js b/DW-Programming/gls-product-updater.js
index 20c90923..4a55896b 100644
--- a/DW-Programming/gls-product-updater.js
+++ b/DW-Programming/gls-product-updater.js
@@ -17,7 +17,7 @@ const { execFileSync } = require('child_process');
 const SHOPIFY_API = 'https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-01';
 const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
 
 const DELAY_MS = 1500; // delay between products to respect rate limits
diff --git a/DW-Programming/gls-retry-failed.js b/DW-Programming/gls-retry-failed.js
index 4893e83f..cf28a3b2 100644
--- a/DW-Programming/gls-retry-failed.js
+++ b/DW-Programming/gls-retry-failed.js
@@ -10,7 +10,7 @@ const sharp = require('sharp');
 const SHOPIFY_DOMAIN = 'designer-laboratory-sandbox.myshopify.com';
 const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 
 const TAGS_TO_REMOVE = ['brand vinyl', 'composition vinyl', 'vinyl'];
 const COLOR_PATTERNS = /^(Background Color|Color-|Color |Color$|blue|navy|indigo|cobalt|sky|teal|cerulean|aqua|azure|sapphire|green|olive|sage|mint|forest|emerald|seafoam|lime|kelly|hunter|red|crimson|scarlet|burgundy|maroon|wine|cherry|ruby|vermillion|yellow|gold|golden|mustard|canary|honey|saffron|amber|orange|coral|peach|salmon|tangerine|apricot|rust|copper|terracotta|sienna|purple|violet|plum|lavender|mauve|amethyst|lilac|orchid|magenta|fuchsia|pink|rose|blush|hot pink|dusty pink|brown|chocolate|espresso|mocha|chestnut|umber|tan|khaki|sand|camel|taupe|beige|ecru|buff|fawn|black|onyx|ebony|jet|charcoal|slate|white|ivory|cream|pearl|bone|off-white|eggshell|gray|grey|silver|pewter|ash|stone|graphite|gunmetal|neutral|multi|metallic|bronze|brass|champagne|platinum|rose gold|coffee|auburn|garnet|mahogany|oxblood|red brick|dark red|dark brown|light gray|light beige|lightgray|bluegray|steel|midnight|denim|lemon|celery|fern|moss|thyme|pnk|teal blue aqua|aqua)$/i;
diff --git a/DW-Programming/hex-color-blitz.js b/DW-Programming/hex-color-blitz.js
index 4b5d5266..dbbc6b12 100644
--- a/DW-Programming/hex-color-blitz.js
+++ b/DW-Programming/hex-color-blitz.js
@@ -23,7 +23,7 @@ const pool = new Pool({
 });
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 const BATCH_SIZE = 50;
 const DELAY_MS = 200;  // Reduced — concurrency handles rate pacing
 const CONCURRENCY = 3; // Process 3 images in parallel
diff --git a/DW-Programming/hollywood-hex-and-tags.js b/DW-Programming/hollywood-hex-and-tags.js
index 91675546..eb60dbab 100644
--- a/DW-Programming/hollywood-hex-and-tags.js
+++ b/DW-Programming/hollywood-hex-and-tags.js
@@ -15,7 +15,7 @@ const pool = new Pool({
 });
 
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${GEMINI_API_KEY}`;
 
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
diff --git a/DW-Programming/hollywood-hex-extract.js b/DW-Programming/hollywood-hex-extract.js
index 175ac475..659ceea6 100644
--- a/DW-Programming/hollywood-hex-extract.js
+++ b/DW-Programming/hollywood-hex-extract.js
@@ -2,7 +2,7 @@ const https = require('https');
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const DB_URL = (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified');
 
 // Products to process (11 with images)
diff --git a/DW-Programming/interior-design-ai-tagger.js b/DW-Programming/interior-design-ai-tagger.js
index 6fa93960..21b19653 100644
--- a/DW-Programming/interior-design-ai-tagger.js
+++ b/DW-Programming/interior-design-ai-tagger.js
@@ -24,7 +24,7 @@ const http = require('http');
 
 // ─── Config ───────────────────────────────────────────────────────────────────
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 
 const SHOPIFY_STORE = 'designer-laboratory-sandbox.myshopify.com';
 const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
diff --git a/DW-Programming/interior-design-tagger.js b/DW-Programming/interior-design-tagger.js
index 896ccb1d..35701cbf 100644
--- a/DW-Programming/interior-design-tagger.js
+++ b/DW-Programming/interior-design-tagger.js
@@ -229,7 +229,7 @@ Return ONLY valid JSON (no markdown, no code fences):
           generationConfig: { temperature: 0.1, maxOutputTokens: 500 }
         });
 
-        const url = new URL(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`);
+        const url = new URL(`https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`);
         const greq = https.request({
           hostname: url.hostname,
           path: url.pathname + url.search,
diff --git a/DW-Programming/maya-romanoff-updater/maya-romanoff-updater.js b/DW-Programming/maya-romanoff-updater/maya-romanoff-updater.js
index 0d827ce6..8f1f42d9 100644
--- a/DW-Programming/maya-romanoff-updater/maya-romanoff-updater.js
+++ b/DW-Programming/maya-romanoff-updater/maya-romanoff-updater.js
@@ -97,7 +97,7 @@ async function analyzeWithGemini(imageUrl, productTitle) {
     const imageBase64 = imageBuffer.toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${CONFIG.GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${CONFIG.GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/DW-Programming/maya-romanoff-updater/server.js b/DW-Programming/maya-romanoff-updater/server.js
index a0ce6b1d..31e8b73a 100644
--- a/DW-Programming/maya-romanoff-updater/server.js
+++ b/DW-Programming/maya-romanoff-updater/server.js
@@ -476,7 +476,7 @@ Return ONLY valid JSON (no markdown, no code blocks):
 }`;
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${CONFIG.GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${CONFIG.GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/DW-Programming/nextjs-liquid-app/app/api/analyze-image/route.ts b/DW-Programming/nextjs-liquid-app/app/api/analyze-image/route.ts
index 41654cb4..5acabdce 100644
--- a/DW-Programming/nextjs-liquid-app/app/api/analyze-image/route.ts
+++ b/DW-Programming/nextjs-liquid-app/app/api/analyze-image/route.ts
@@ -64,7 +64,7 @@ Return ONLY valid JSON with no markdown:
       }
 
       const response = await fetch(
-        `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${keys[attempt].key}`,
+        `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${keys[attempt].key}`,
         {
           method: 'POST',
           headers: { 'Content-Type': 'application/json' },
diff --git a/DW-Programming/nextjs-liquid-app/app/api/bulk-import/route.ts b/DW-Programming/nextjs-liquid-app/app/api/bulk-import/route.ts
index 22d80669..9197b818 100644
--- a/DW-Programming/nextjs-liquid-app/app/api/bulk-import/route.ts
+++ b/DW-Programming/nextjs-liquid-app/app/api/bulk-import/route.ts
@@ -137,7 +137,7 @@ async function analyzeWithGemini(imageUrl: string, title: string, imageBase64?:
     }
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/DW-Programming/phase3-ai-enrich-100.js b/DW-Programming/phase3-ai-enrich-100.js
index bbda88d2..79f54a88 100644
--- a/DW-Programming/phase3-ai-enrich-100.js
+++ b/DW-Programming/phase3-ai-enrich-100.js
@@ -15,7 +15,7 @@ const pool = new Pool({
 });
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 const BATCH_LIMIT = 100;
 const RATE_DELAY_MS = 2000; // 2s between requests
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
@@ -251,7 +251,7 @@ async function updateTracking(vendorCode, mfrSku, imageType) {
   await pool.query(`
     UPDATE enrichment_tracking SET
       phase3_ai_at = NOW(),
-      phase3_model = 'gemini-2.0-flash',
+      phase3_model = 'gemini-3.5-flash',
       phase3_image_type = $1,
       last_error = NULL
     WHERE vendor_code = $2 AND mfr_sku = $3
@@ -332,7 +332,7 @@ async function main() {
       totalInputTokens += inputTok;
       totalOutputTokens += outputTok;
       await trackGeminiCall({
-        model: 'gemini-2.0-flash',
+        model: 'gemini-3.5-flash',
         inputTokens: inputTok,
         outputTokens: outputTok,
         task: `phase3-enrich ${p.catalog_table}/${p.mfr_sku}`
diff --git a/DW-Programming/phase3-ai-enrich-batch.js b/DW-Programming/phase3-ai-enrich-batch.js
index 5ad3f19b..db22ad7b 100644
--- a/DW-Programming/phase3-ai-enrich-batch.js
+++ b/DW-Programming/phase3-ai-enrich-batch.js
@@ -14,7 +14,7 @@ const pool = new Pool({
 });
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 const BATCH_LIMIT = 20;
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
 
diff --git a/DW-Programming/phase3-ai-enrich-batch.py b/DW-Programming/phase3-ai-enrich-batch.py
index 5548f6d6..31695985 100644
--- a/DW-Programming/phase3-ai-enrich-batch.py
+++ b/DW-Programming/phase3-ai-enrich-batch.py
@@ -16,7 +16,7 @@ import psycopg2
 
 DB_DSN = "postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 GEMINI_KEY = "${GOOGLE_API_KEY}"
-GEMINI_URL = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key={GEMINI_KEY}"
+GEMINI_URL = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key={GEMINI_KEY}"
 BATCH_SIZE = 20
 
 PT = timezone(timedelta(hours=-7))  # PDT
diff --git a/DW-Programming/phase3-ai-enrich-batch.sh b/DW-Programming/phase3-ai-enrich-batch.sh
index 0d85ee5e..4d11bba7 100644
--- a/DW-Programming/phase3-ai-enrich-batch.sh
+++ b/DW-Programming/phase3-ai-enrich-batch.sh
@@ -4,7 +4,7 @@
 set -euo pipefail
 
 GEMINI_KEY="${GOOGLE_API_KEY}"
-GEMINI_URL="https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}"
+GEMINI_URL="https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}"
 DB="postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 TMPDIR="/tmp/ai-enrich-$$"
 mkdir -p "$TMPDIR"
diff --git a/DW-Programming/phase3-ai-enrich-run.js b/DW-Programming/phase3-ai-enrich-run.js
index 46c1a8ed..db793969 100644
--- a/DW-Programming/phase3-ai-enrich-run.js
+++ b/DW-Programming/phase3-ai-enrich-run.js
@@ -9,7 +9,7 @@ const https = require('https');
 const http = require('http');
 
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 
 const pool = new Pool({
   connectionString: (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified')
diff --git a/DW-Programming/phase3-ai-enrichment.js b/DW-Programming/phase3-ai-enrichment.js
index 13a63e95..ffa2f016 100644
--- a/DW-Programming/phase3-ai-enrichment.js
+++ b/DW-Programming/phase3-ai-enrichment.js
@@ -13,7 +13,7 @@ const pool = new Pool({
 });
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 
 const BATCH_SIZE = 20;
 
diff --git a/DW-Programming/prl-ai-enrich.js b/DW-Programming/prl-ai-enrich.js
index a6edb891..7d880fb5 100644
--- a/DW-Programming/prl-ai-enrich.js
+++ b/DW-Programming/prl-ai-enrich.js
@@ -18,7 +18,7 @@ const https = require('https');
 const http = require('http');
 
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
 
 const pool = new Pool({
@@ -191,10 +191,10 @@ async function enrichProduct(row, retryCount) {
     // Upsert enrichment_tracking
     await pool.query(`
       INSERT INTO enrichment_tracking (vendor_code, mfr_sku, catalog_table, phase3_ai_at, phase3_model)
-      VALUES ('PRL', $1, 'vendor_catalog', NOW(), 'gemini-2.0-flash')
+      VALUES ('PRL', $1, 'vendor_catalog', NOW(), 'gemini-3.5-flash')
       ON CONFLICT (vendor_code, mfr_sku) DO UPDATE SET
         phase3_ai_at = NOW(),
-        phase3_model = 'gemini-2.0-flash',
+        phase3_model = 'gemini-3.5-flash',
         last_error = NULL
     `, [mfr_sku]);
 
@@ -318,7 +318,7 @@ async function main() {
   }
 
   // Slack notification
-  const msg = `✅ *PRL AI Enrichment Complete*\n• Processed: ${stats.total}\n• Success: ${stats.success}\n• Failed: ${stats.failed}\n• Duration: ${duration} min\n• Model: gemini-2.0-flash`;
+  const msg = `✅ *PRL AI Enrichment Complete*\n• Processed: ${stats.total}\n• Success: ${stats.success}\n• Failed: ${stats.failed}\n• Duration: ${duration} min\n• Model: gemini-3.5-flash`;
   await sendSlack(msg);
 
   await pool.end();
diff --git a/DW-Programming/ralph-lauren-fabric-updater-9899.js b/DW-Programming/ralph-lauren-fabric-updater-9899.js
index 1cab74fd..10c78ed3 100644
--- a/DW-Programming/ralph-lauren-fabric-updater-9899.js
+++ b/DW-Programming/ralph-lauren-fabric-updater-9899.js
@@ -25,7 +25,7 @@ const SHOPIFY_TOKEN = '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';
 const API_VERSION = '2024-01';
 // Gemini Configuration (MANDATORY - No Claude Vision)
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 // Authentication credentials
 const AUTH_USER = 'admin';
 const AUTH_PASS = process.env.ADMIN_PASSWORD;
@@ -327,7 +327,7 @@ app.get('/', (req, res) => {
       <li><strong>Title Format:</strong> Pattern Name Color (MFR#) | Ralph Lauren Fabrics</li>
       <li><strong>Data Source:</strong> Designers Guild (designersguild.com)</li>
       <li><strong>MFR# Pattern:</strong> FRL####/## extracted from tags</li>
-      <li><strong>AI Analysis:</strong> Gemini 3.0 (gemini-2.0-flash) for colors/styles</li>
+      <li><strong>AI Analysis:</strong> Gemini 3.0 (gemini-3.5-flash) for colors/styles</li>
       <li><strong>Metafields:</strong> width, length, repeat, Contents, Collection, Cleaning-Code</li>
     </ul>
   </div>
diff --git a/DW-Programming/ralph-lauren-fabric-updater-9899.ts b/DW-Programming/ralph-lauren-fabric-updater-9899.ts
index ea837cb8..3ffe4e69 100644
--- a/DW-Programming/ralph-lauren-fabric-updater-9899.ts
+++ b/DW-Programming/ralph-lauren-fabric-updater-9899.ts
@@ -24,7 +24,7 @@ const API_VERSION = '2024-01';
 
 // Gemini Configuration (MANDATORY - No Claude Vision)
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 
 // Authentication credentials
 const AUTH_USER = 'admin';
@@ -410,7 +410,7 @@ app.get('/', (req, res) => {
       <li><strong>Title Format:</strong> Pattern Name Color (MFR#) | Ralph Lauren Fabrics</li>
       <li><strong>Data Source:</strong> Designers Guild (designersguild.com)</li>
       <li><strong>MFR# Pattern:</strong> FRL####/## extracted from tags</li>
-      <li><strong>AI Analysis:</strong> Gemini 3.0 (gemini-2.0-flash) for colors/styles</li>
+      <li><strong>AI Analysis:</strong> Gemini 3.0 (gemini-3.5-flash) for colors/styles</li>
       <li><strong>Metafields:</strong> width, length, repeat, Contents, Collection, Cleaning-Code</li>
     </ul>
   </div>
diff --git a/DW-Programming/room-setting-app/app/api/analyze-pattern/route.ts b/DW-Programming/room-setting-app/app/api/analyze-pattern/route.ts
index c95289e7..55c3b29a 100644
--- a/DW-Programming/room-setting-app/app/api/analyze-pattern/route.ts
+++ b/DW-Programming/room-setting-app/app/api/analyze-pattern/route.ts
@@ -2,7 +2,7 @@ import { NextRequest, NextResponse } from 'next/server';
 
 // Gemini Vision API for pattern analysis
 const GEMINI_ANALYSIS_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_ANALYSIS_MODEL = 'gemini-2.0-flash';
+const GEMINI_ANALYSIS_MODEL = 'gemini-3.5-flash';
 const GEMINI_ENDPOINT = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_ANALYSIS_MODEL}:generateContent?key=${GEMINI_ANALYSIS_KEY}`;
 
 // CORS headers
diff --git a/DW-Programming/room-setting-app/lib/multi-model-generator.ts b/DW-Programming/room-setting-app/lib/multi-model-generator.ts
index 841fb117..758420b4 100644
--- a/DW-Programming/room-setting-app/lib/multi-model-generator.ts
+++ b/DW-Programming/room-setting-app/lib/multi-model-generator.ts
@@ -4,7 +4,7 @@ import { preTilePattern, WALL_SURFACE_DIRECTIVE } from './gemini-room-generator'
 
 export type ModelProvider = 
   | 'gemini-2.5-flash-image' 
-  | 'gemini-2.0-flash-exp' 
+  | 'gemini-3.5-flash' 
   | 'openai-dall-e-3'
   | 'openai-dall-e-2'
   | 'anthropic-claude-3.5-sonnet'
@@ -420,9 +420,9 @@ export class MultiModelGenerator {
       apiKey: process.env.GEMINI_API_KEY,
     });
 
-    this.configs.set('gemini-2.0-flash-exp', {
+    this.configs.set('gemini-3.5-flash', {
       name: 'Gemini 2.0 Flash Experimental',
-      provider: 'gemini-2.0-flash-exp',
+      provider: 'gemini-3.5-flash',
       supportsImageInput: true,
       supportsImageOutput: true,
       apiKey: process.env.GEMINI_API_KEY,
@@ -525,7 +525,7 @@ export class MultiModelGenerator {
 
       switch (provider) {
         case 'gemini-2.5-flash-image':
-        case 'gemini-2.0-flash-exp':
+        case 'gemini-3.5-flash':
           return await this.generateWithGemini(provider, patternBase64, fullPrompt, patternType, horizontalRepeats, verticalRepeats, onProgress);
         
         case 'huggingface-deepseek-v3':
@@ -906,7 +906,7 @@ Generate the photorealistic room with correctly scaled wallpaper now.`;
     }
 
     const gemini = new GoogleGenerativeAI(config.apiKey);
-    const modelName = provider === 'gemini-2.5-flash-image' ? 'gemini-2.5-flash-image' : 'gemini-2.0-flash-exp';
+    const modelName = provider === 'gemini-2.5-flash-image' ? 'gemini-2.5-flash-image' : 'gemini-3.5-flash';
 
     const model = gemini.getGenerativeModel({
       model: modelName,
diff --git a/DW-Programming/zoffany-ai-enrich.js b/DW-Programming/zoffany-ai-enrich.js
index 3a44465b..5d690bc5 100644
--- a/DW-Programming/zoffany-ai-enrich.js
+++ b/DW-Programming/zoffany-ai-enrich.js
@@ -17,7 +17,7 @@ const https = require('https');
 const http = require('http');
 
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
 
 const pool = new Pool({
@@ -288,7 +288,7 @@ async function main() {
 
   console.log('=== Zoffany AI Enrichment (Phase 3) ===');
   console.log(`Started: ${new Date().toLocaleString('en-US', { timeZone: 'America/Los_Angeles' })} PT`);
-  console.log(`Gemini model: gemini-2.0-flash | Delay: ${DELAY_MS}ms | Limit: ${limit}`);
+  console.log(`Gemini model: gemini-3.5-flash | Delay: ${DELAY_MS}ms | Limit: ${limit}`);
 
   // Get products on Shopify that need re-enrichment (ai_accepted_at IS NULL = bad old data)
   let query = `
diff --git a/ai-enrich-arte-fix.js b/ai-enrich-arte-fix.js
index 680a3083..651819c9 100644
--- a/ai-enrich-arte-fix.js
+++ b/ai-enrich-arte-fix.js
@@ -2,7 +2,7 @@ const https = require('https');
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 
 const PRODUCTS = [
   {id:123,sku:'19433',name:'Horus Desert Sun',img:'https://edge.arte-international.com/media/4960d9f1-bc0a-4bcb-9a82-c09d9e5e7d98/conversions/EssentialsLuxor_Horus_19436_Roomshot_Web_LR-medium-two-thirds.jpg'},
diff --git a/ai-enrich-gaps2.js b/ai-enrich-gaps2.js
index 9ec54f9e..e95d1159 100644
--- a/ai-enrich-gaps2.js
+++ b/ai-enrich-gaps2.js
@@ -3,7 +3,7 @@ const http = require('http');
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 
 const PRODUCTS = [
   {id:123,vendor:'arte',sku:'19433',name:'Horus Desert Sun',img:'https://edge.arte-international.com/media/4960d9f1-bc0a-4bcb-9a82-c09d9e5e7d98/conversions/EssentialsLuxor_Horus_19436_Roomshot_Web_LR-medium-two-thirds.jpg'},
diff --git a/arte-fill-tags.js b/arte-fill-tags.js
index 27bb1266..3b2fb8b7 100644
--- a/arte-fill-tags.js
+++ b/arte-fill-tags.js
@@ -3,7 +3,7 @@ const http = require('http');
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const DB = (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified');
 
 async function geminiAnalyze(imageUrl, patternName) {
diff --git a/brand-router/server.js b/brand-router/server.js
index ca4e1025..64a15d6b 100644
--- a/brand-router/server.js
+++ b/brand-router/server.js
@@ -312,7 +312,7 @@ Return ONLY the description text, nothing else.`;
     const result = await new Promise((resolve, reject) => {
       const geminiReq = https.request({
         hostname: 'generativelanguage.googleapis.com',
-        path: `/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`,
+        path: `/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`,
         method: 'POST',
         headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) }
       }, (geminiRes) => {
diff --git a/enrich-arte-fix.js b/enrich-arte-fix.js
index 5d64ace1..06c210ed 100644
--- a/enrich-arte-fix.js
+++ b/enrich-arte-fix.js
@@ -2,7 +2,7 @@ const https = require('https');
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 const DB_URL = (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified');
 
 const PRODUCTS = [
diff --git a/enrich-arte-gaps.js b/enrich-arte-gaps.js
index 4e736a7f..2225c435 100644
--- a/enrich-arte-gaps.js
+++ b/enrich-arte-gaps.js
@@ -2,7 +2,7 @@ const https = require('https');
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 const pgClient = new Client((process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified'));
 
 const PROMPT = `You are an interior design wallcovering analyst. Analyze this wallcovering product image.
diff --git a/enrich-arte-puppeteer.js b/enrich-arte-puppeteer.js
index dcc87589..3e2d6908 100644
--- a/enrich-arte-puppeteer.js
+++ b/enrich-arte-puppeteer.js
@@ -3,7 +3,7 @@ const https = require('https');
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const PG_URL = (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified');
 
 const ARTE_PRODUCTS = [
diff --git a/enrich-remaining-13.js b/enrich-remaining-13.js
index 17e47e46..76152362 100644
--- a/enrich-remaining-13.js
+++ b/enrich-remaining-13.js
@@ -3,7 +3,7 @@ const http = require('http');
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const PG_URL = (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified');
 
 const PRODUCTS = [
diff --git a/gemini-classify-texture.js b/gemini-classify-texture.js
index f3d31500..600378d8 100644
--- a/gemini-classify-texture.js
+++ b/gemini-classify-texture.js
@@ -4,7 +4,7 @@ const https = require('https');
 const http = require('http');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 const PROMPT = `Is this wallcovering image a repeating pattern or a non-repeating texture? If it's a texture (grasscloth, linen, plain, solid, stucco, metallic, stone, concrete, weave, etc.), respond 'TEXTURE'. If it has a visible repeating pattern (florals, stripes, damask, geometric, medallion, toile, scenic, mural, etc.), respond 'PATTERN'. Respond with only one word: TEXTURE or PATTERN.`;
 
 const db = new Client({ connectionString: (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified') });
diff --git a/gemini-enrich-arte.js b/gemini-enrich-arte.js
index 9bdd8f0f..eb9a58ba 100644
--- a/gemini-enrich-arte.js
+++ b/gemini-enrich-arte.js
@@ -2,7 +2,7 @@ const https = require('https');
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 
 const products = [
   { id: 123, sku: '19433', name: 'Horus Desert Sun', img: 'https://edge.arte-international.com/media/4960d9f1-bc0a-4bcb-9a82-c09d9e5e7d98/conversions/EssentialsLuxor_Horus_19436_Roomshot_Web_LR-medium-two-thirds.jpg' },
diff --git a/gemini-enrich-arte9.js b/gemini-enrich-arte9.js
index fdf49062..72b68a96 100644
--- a/gemini-enrich-arte9.js
+++ b/gemini-enrich-arte9.js
@@ -2,7 +2,7 @@ const https = require('https');
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 
 const db = new Client({ connectionString: (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified') });
 
diff --git a/gemini-enrich-gaps.js b/gemini-enrich-gaps.js
index a8732607..52db8410 100644
--- a/gemini-enrich-gaps.js
+++ b/gemini-enrich-gaps.js
@@ -3,7 +3,7 @@ const http = require('http');
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${GEMINI_KEY}`;
 
 const DB = (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified');
diff --git a/output/us-007-implementation-summary.md b/output/us-007-implementation-summary.md
index 5c55b9c9..53ec0328 100644
--- a/output/us-007-implementation-summary.md
+++ b/output/us-007-implementation-summary.md
@@ -35,7 +35,7 @@ As a quality assurance manager, I want AI analysis performed on updated product
 ## Key Features
 
 ### AI Quality Analysis System
-- **Gemini 3.0 Integration**: Uses gemini-2.0-flash model for fast, accurate analysis
+- **Gemini 3.0 Integration**: Uses gemini-3.5-flash model for fast, accurate analysis
 - **Quality Scoring**: 0-100 score based on completeness and consistency
 - **Completeness Checks**:
   - Title exists and is meaningful
@@ -221,7 +221,7 @@ Generate Quality Summary Report
 ## Technical Notes
 
 - **Gemini API Key**: ${GOOGLE_API_KEY}
-- **Model**: gemini-2.0-flash (fast, cost-effective)
+- **Model**: gemini-3.5-flash (fast, cost-effective)
 - **Temperature**: 0.1 (consistent, deterministic results)
 - **Max Tokens**: 800 (sufficient for detailed analysis)
 - **Rate Limiting**: 1 second delay between API calls
diff --git a/pending-approval/tres-tintas-designer-descriptions-pilot.md b/pending-approval/tres-tintas-designer-descriptions-pilot.md
index aec0e404..857c6b24 100644
--- a/pending-approval/tres-tintas-designer-descriptions-pilot.md
+++ b/pending-approval/tres-tintas-designer-descriptions-pilot.md
@@ -18,7 +18,7 @@ designer-voice description, no doubling). Per product:
 
 1. **Gemini image analysis** (`gemini-3.5-flash`) → precise trade colorways +
    style + motif. Never invents a hue (DW image rule). Replaces the deprecated
-   `gemini-2.0-flash` (now 404).
+   `gemini-3.5-flash` (now 404).
 2. **Backfill EVERY embedded-table spec → its `dw-specs` metafield** so stripping
    the table loses nothing: Width→`custom.width`, Material→`global.Contents`,
    Repeat→`global.repeat`, Weight→`custom.product_weight`, Fire→`custom.fire_rating`,
@@ -72,7 +72,7 @@ Dry run (no writes, default): `node tres-tintas-designer-descriptions.js`
 - **Snippet hardening** (`theme-5.0-duplicate/snippets/product-description-meta.liquid`)
   — 3 case-fallbacks (`weight`/`cleaning`/`country`) so lowercase metafields render
   fleet-wide. Theme change → stage on dev theme → Steve pushes live.
-- **Gemini-2.0 deprecation sweep** — `gemini-2.0-flash` is 404 across the codebase;
+- **Gemini-2.0 deprecation sweep** — `gemini-3.5-flash` is 404 across the codebase;
   worth a separate sweep to `gemini-3.5-flash`.
 - **Wider rollout** — same recipe generalizes to the whole catalog once this pilot
   is reviewed (~145K ≈ $87 Gemini), ramped at the daily cap.
diff --git a/scripts/US-007-USAGE.md b/scripts/US-007-USAGE.md
index 145cbb30..03509a73 100644
--- a/scripts/US-007-USAGE.md
+++ b/scripts/US-007-USAGE.md
@@ -82,9 +82,9 @@ If AI analysis fails:
 ## API Details
 
 ### Gemini 3.0 Configuration
-- **Endpoint**: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent
+- **Endpoint**: https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent
 - **API Key**: ${GOOGLE_API_KEY}
-- **Model**: gemini-2.0-flash
+- **Model**: gemini-3.5-flash
 - **Temperature**: 0.1 (consistent results)
 - **Max Tokens**: 800
 - **Rate Limit**: 1 second between calls
diff --git a/scripts/ai-enrich-arte-gaps.js b/scripts/ai-enrich-arte-gaps.js
index 4eaf9522..d2906d3a 100644
--- a/scripts/ai-enrich-arte-gaps.js
+++ b/scripts/ai-enrich-arte-gaps.js
@@ -8,7 +8,7 @@
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 
 const PROMPT = `You are an interior design product analyst. Analyze this wallcovering product image and return a JSON object with these fields:
 - colors: array of 3-6 dominant colors detected (e.g. ["Charcoal", "Slate Gray", "Ivory"])
diff --git a/scripts/ai-enrich-gaps.js b/scripts/ai-enrich-gaps.js
index 578ae911..d72cfbaa 100644
--- a/scripts/ai-enrich-gaps.js
+++ b/scripts/ai-enrich-gaps.js
@@ -10,7 +10,7 @@
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 
 const PROMPT = `You are an interior design product analyst. Analyze this wallcovering product image and return a JSON object with these fields:
 - colors: array of 3-6 dominant colors detected (e.g. ["Charcoal", "Slate Gray", "Ivory"])
diff --git a/scripts/brand-mckenzie-ai-analysis.ts b/scripts/brand-mckenzie-ai-analysis.ts
index 8335506a..a721bfd2 100644
--- a/scripts/brand-mckenzie-ai-analysis.ts
+++ b/scripts/brand-mckenzie-ai-analysis.ts
@@ -45,7 +45,7 @@ async function imageToBase64(imageUrl: string): Promise<string | null> {
 async function analyzeWithGemini(imageBase64: string, title: string): Promise<AIAnalysis | null> {
   try {
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/scripts/brand-mckenzie-full-scrape.ts b/scripts/brand-mckenzie-full-scrape.ts
index 814ea0ee..1a768e9a 100644
--- a/scripts/brand-mckenzie-full-scrape.ts
+++ b/scripts/brand-mckenzie-full-scrape.ts
@@ -233,7 +233,7 @@ Return ONLY valid JSON:
 }`;
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/scripts/brand-mckenzie-full-update.ts b/scripts/brand-mckenzie-full-update.ts
index f1a4e185..9f1b689e 100644
--- a/scripts/brand-mckenzie-full-update.ts
+++ b/scripts/brand-mckenzie-full-update.ts
@@ -106,7 +106,7 @@ Return ONLY valid JSON with NO markdown:
 }`;
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/scripts/collection-description-writer.js b/scripts/collection-description-writer.js
index 1d90f6c4..3869d4d8 100644
--- a/scripts/collection-description-writer.js
+++ b/scripts/collection-description-writer.js
@@ -11,7 +11,7 @@ const fs = require('fs');
 const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const SHOPIFY_DOMAIN = 'designer-laboratory-sandbox.myshopify.com';
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 
 const INPUT_FILE = '/tmp/needs_descriptions.json';
 const PROGRESS_FILE = '/tmp/collection-desc-progress.json';
diff --git a/scripts/enrich-remaining-13.js b/scripts/enrich-remaining-13.js
index f8f4f238..3bdb4cfe 100644
--- a/scripts/enrich-remaining-13.js
+++ b/scripts/enrich-remaining-13.js
@@ -14,7 +14,7 @@ const pool = new Pool({
 });
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${GEMINI_KEY}`;
 
 const PROMPT = `You are an interior design expert analyzing a wallcovering product image.
diff --git a/scripts/interior-design-tags.js b/scripts/interior-design-tags.js
index f43482da..bf8057cd 100644
--- a/scripts/interior-design-tags.js
+++ b/scripts/interior-design-tags.js
@@ -26,7 +26,7 @@ const http = require('http');
 
 // ─── Config ────────────────────────────────────────────────────────────────────
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 
 const SHOPIFY_DOMAIN = 'designer-laboratory-sandbox.myshopify.com';
 const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
diff --git a/scripts/prl-ai-enrich.js b/scripts/prl-ai-enrich.js
index 02c6b628..f751f822 100644
--- a/scripts/prl-ai-enrich.js
+++ b/scripts/prl-ai-enrich.js
@@ -8,7 +8,7 @@ const https = require('https');
 const { Client } = require('pg');
 
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${GEMINI_KEY}`;
 const BATCH_SIZE = 100;
 const DELAY_MS = 500;
diff --git a/scripts/ralph/prd-ralph-lauren-fabrics.json b/scripts/ralph/prd-ralph-lauren-fabrics.json
index 1d4b8e49..14bc56a8 100644
--- a/scripts/ralph/prd-ralph-lauren-fabrics.json
+++ b/scripts/ralph/prd-ralph-lauren-fabrics.json
@@ -59,7 +59,7 @@
       "title": "Create AI Fabric Analysis Service",
       "description": "As a system, I want to analyze fabric images with Gemini 3.0 to generate accurate color and style tags so that products are properly categorized.",
       "acceptanceCriteria": [
-        "Uses Gemini 3.0 (gemini-2.0-flash) exclusively - NO Claude Vision",
+        "Uses Gemini 3.0 (gemini-3.5-flash) exclusively - NO Claude Vision",
         "API Key: ${GOOGLE_API_KEY}",
         "Analyzes fabric images for dominant colors (max 3 per color family)",
         "Identifies style/period (Traditional, Contemporary, etc.)",
diff --git a/scripts/texture-repeat-classifier.js b/scripts/texture-repeat-classifier.js
index 271daef7..576ebe00 100644
--- a/scripts/texture-repeat-classifier.js
+++ b/scripts/texture-repeat-classifier.js
@@ -11,7 +11,7 @@ const http = require('http');
 
 const pool = new Pool({ connectionString: (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified') });
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
 
 const PROMPT = `Is this wallcovering image a repeating pattern or a non-repeating texture? If it's a texture (grasscloth, linen, plain, solid, stucco, metallic, stone, concrete, weave, velvet, silk, etc.), respond 'TEXTURE'. If it has a visible repeating pattern (florals, stripes, damask, geometric, medallion, toile, scenic, mural, houndstooth, ikat, etc.), respond 'PATTERN'. Respond with only one word: TEXTURE or PATTERN.`;
@@ -83,7 +83,7 @@ async function classifyWithGemini(imageUrl) {
           const text = json.candidates?.[0]?.content?.parts?.[0]?.text?.trim().toUpperCase() || 'UNKNOWN';
           const usage = json.usageMetadata || {};
           trackGeminiCall({
-            model: 'gemini-2.0-flash',
+            model: 'gemini-3.5-flash',
             inputTokens: usage.promptTokenCount || 500,
             outputTokens: usage.candidatesTokenCount || 5,
             task: 'texture-repeat-classifier'
diff --git a/scripts/us-007-ai-product-quality-analyzer.ts b/scripts/us-007-ai-product-quality-analyzer.ts
index a26f778e..a59f97cf 100644
--- a/scripts/us-007-ai-product-quality-analyzer.ts
+++ b/scripts/us-007-ai-product-quality-analyzer.ts
@@ -13,7 +13,7 @@
 import { ManufacturerProductData } from './us-005-fetch-manufacturer-data';
 
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 
 export interface ProductDataComparison {
   productId: number;
diff --git a/shopify/scripts/arte-dashboard/server.js b/shopify/scripts/arte-dashboard/server.js
index 0522c86a..150fce10 100644
--- a/shopify/scripts/arte-dashboard/server.js
+++ b/shopify/scripts/arte-dashboard/server.js
@@ -1624,7 +1624,7 @@ async function analyzeImageWithGemini(imageUrl) {
     const base64 = Buffer.from(imgBuffer).toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
@@ -2577,7 +2577,7 @@ app.post('/api/analyze-image', async (req, res) => {
     const base64 = Buffer.from(imgBuffer).toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/bespoke-updater/server.js b/shopify/scripts/bespoke-updater/server.js
index 2dbe27ac..297c20f3 100644
--- a/shopify/scripts/bespoke-updater/server.js
+++ b/shopify/scripts/bespoke-updater/server.js
@@ -209,7 +209,7 @@ async function analyzeWithGemini(imageUrl, title, sku = '') {
     const patternName = patternMatch ? patternMatch[1].trim() : title.split(' ').slice(0, 3).join(' ');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/classify-texture-pattern.js b/shopify/scripts/classify-texture-pattern.js
index b4f4bfcf..ec4c8e2c 100644
--- a/shopify/scripts/classify-texture-pattern.js
+++ b/shopify/scripts/classify-texture-pattern.js
@@ -8,7 +8,7 @@ const { Pool } = require('pg');
 
 const pool = new Pool({ connectionString: (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified') });
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 
 const PROMPT = `Is this wallcovering image a repeating pattern or a non-repeating texture? If it's a texture (grasscloth, linen, plain, solid, stucco, metallic, stone, concrete, weave, etc.), respond 'TEXTURE'. If it has a visible repeating pattern (florals, stripes, damask, geometric, medallion, toile, animals, scenic, etc.), respond 'PATTERN'. Respond with only one word: TEXTURE or PATTERN.`;
 
diff --git a/shopify/scripts/gemini-catalog-tagger.js b/shopify/scripts/gemini-catalog-tagger.js
index 13eb0db7..1013541a 100644
--- a/shopify/scripts/gemini-catalog-tagger.js
+++ b/shopify/scripts/gemini-catalog-tagger.js
@@ -19,7 +19,7 @@ const fetch = typeof nodeFetch === 'function' ? nodeFetch : nodeFetch.default;
 
 // ── Config ──────────────────────────────────────────────────────────────────
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
 
 const pool = new Pool({
diff --git a/shopify/scripts/gemini-tag-engine/index.js b/shopify/scripts/gemini-tag-engine/index.js
index bb33d4a9..dd9f4ab9 100644
--- a/shopify/scripts/gemini-tag-engine/index.js
+++ b/shopify/scripts/gemini-tag-engine/index.js
@@ -15,7 +15,7 @@ const http = require('http');
 
 // ─── Config ───────────────────────────────────────────────────────────────────
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${GEMINI_API_KEY}`;
 
 const SHOPIFY_STORE = 'designer-laboratory-sandbox.myshopify.com';
diff --git a/shopify/scripts/import-missing-dwrr.ts b/shopify/scripts/import-missing-dwrr.ts
index 30b4d341..db1dd43b 100644
--- a/shopify/scripts/import-missing-dwrr.ts
+++ b/shopify/scripts/import-missing-dwrr.ts
@@ -120,7 +120,7 @@ async function generateDescriptionWithGemini(imageUrl: string, pattern: string,
     const productType = isBorder ? 'wallpaper border' : 'wallpaper';
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/interior-design-tagger.js b/shopify/scripts/interior-design-tagger.js
index d734162e..734c5607 100644
--- a/shopify/scripts/interior-design-tagger.js
+++ b/shopify/scripts/interior-design-tagger.js
@@ -17,7 +17,7 @@ const http = require('http');
 
 // ─── Config ──────────────────────────────────────────────────────────────────
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${GEMINI_KEY}`;
 
 const SHOPIFY_STORE = 'designer-laboratory-sandbox.myshopify.com';
diff --git a/shopify/scripts/koroseal-batch-cron.js b/shopify/scripts/koroseal-batch-cron.js
index 4500c824..664becd1 100644
--- a/shopify/scripts/koroseal-batch-cron.js
+++ b/shopify/scripts/koroseal-batch-cron.js
@@ -186,7 +186,7 @@ async function analyzeWithGemini(imageUrl, title) {
     const base64 = Buffer.from(imageBuffer).toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/koroseal-complete-update.ts b/shopify/scripts/koroseal-complete-update.ts
index 60de2a0f..2fcff05c 100644
--- a/shopify/scripts/koroseal-complete-update.ts
+++ b/shopify/scripts/koroseal-complete-update.ts
@@ -117,7 +117,7 @@ async function analyzeWithGemini(imageUrl: string, title: string): Promise<any>
     const base64Image = Buffer.from(imageBuffer).toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/koroseal-enhanced-update.js b/shopify/scripts/koroseal-enhanced-update.js
index 3fe54358..b6dec060 100644
--- a/shopify/scripts/koroseal-enhanced-update.js
+++ b/shopify/scripts/koroseal-enhanced-update.js
@@ -64,7 +64,7 @@ const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const API_VERSION = '2024-01';
 // Gemini Configuration (MANDATORY - No Claude Vision)
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 // Authentication credentials
 const AUTH_USER = 'admin';
 const AUTH_PASS = process.env.ADMIN_PASSWORD;
@@ -673,7 +673,7 @@ app.get('/', (req, res) => {
       <div style="background: rgba(0,0,0,0.2); padding: 15px; border-radius: 8px;">
         <h4 style="color: #a855f7; margin: 0 0 10px 0;">🤖 AI & Scraping</h4>
         <ul style="margin: 0; padding-left: 20px; line-height: 1.8;">
-          <li><strong>Gemini 3.0:</strong> gemini-2.0-flash for color/style analysis</li>
+          <li><strong>Gemini 3.0:</strong> gemini-3.5-flash for color/style analysis</li>
           <li><strong>Koroseal Scraping:</strong> Pattern name, specs from product pages</li>
           <li><strong>PDF Parsing:</strong> Fact sheets for SKU-specific colors</li>
           <li><strong>Inventory:</strong> 2026 units | Sample: $4.25</li>
diff --git a/shopify/scripts/koroseal-update.js b/shopify/scripts/koroseal-update.js
index 1046ac6b..d9302997 100644
--- a/shopify/scripts/koroseal-update.js
+++ b/shopify/scripts/koroseal-update.js
@@ -128,7 +128,7 @@ async function analyzeWithGemini(imageUrl, title) {
     const base64Image = Buffer.from(imageBuffer).toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/prl-ai-enrich.js b/shopify/scripts/prl-ai-enrich.js
index bf290fd5..b9dffbf5 100644
--- a/shopify/scripts/prl-ai-enrich.js
+++ b/shopify/scripts/prl-ai-enrich.js
@@ -6,7 +6,7 @@
 const https = require('https');
 const { Pool } = require('pg');
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${GEMINI_KEY}`;
 const BATCH_LIMIT = 100;
 const DELAY_MS = 500;
diff --git a/shopify/scripts/review-dwqw-images-descriptions.ts b/shopify/scripts/review-dwqw-images-descriptions.ts
index 0e5ecc12..53154cc3 100644
--- a/shopify/scripts/review-dwqw-images-descriptions.ts
+++ b/shopify/scripts/review-dwqw-images-descriptions.ts
@@ -212,7 +212,7 @@ Return ONLY valid JSON (no markdown, no code blocks):
 }`;
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/set-texture-repeat-zero.js b/shopify/scripts/set-texture-repeat-zero.js
index a3da44b7..bf599a77 100644
--- a/shopify/scripts/set-texture-repeat-zero.js
+++ b/shopify/scripts/set-texture-repeat-zero.js
@@ -17,7 +17,7 @@ const { trackGeminiCall } = require('/root/DW-Agents/shared/gemini-cost-tracker'
 const pool = new Pool({ connectionString: (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified') });
 
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_MODEL = 'gemini-2.0-flash';
+const GEMINI_MODEL = 'gemini-3.5-flash';
 const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${GEMINI_API_KEY}`;
 
 // Texture keyword regex - matches in pattern_name, material, description, ai_description etc.
diff --git a/shopify/scripts/texture-repeat-fixer.js b/shopify/scripts/texture-repeat-fixer.js
index f3377cb5..a56dc4ee 100644
--- a/shopify/scripts/texture-repeat-fixer.js
+++ b/shopify/scripts/texture-repeat-fixer.js
@@ -17,7 +17,7 @@ const http = require('http');
 
 const DB_URL = (process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/dw_unified');
 const GEMINI_API_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`;
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
 
 const TEXTURE_REGEX = /\b(grasscloth|texture[ds]?|linen|stucco|metallic|plain|solid|sisal|weave|burlap|faux\s|jute|suede|cork|hemp|raffia|sand|stone|concrete|plaster|canvas|liner|backing|primer|vinyl\s*texture|mica|pebble|slate|marble|travertine|leather|silk\s*texture|raw\s*silk|shantung|dupioni|chambray|satin\s*weave|twill|herringbone\s*weave|basket\s*weave|matte|brushed|hammered)\b/i;
diff --git a/shopify/scripts/update-all-malibu-architectural.ts b/shopify/scripts/update-all-malibu-architectural.ts
index 3f8e717f..5b5668cd 100644
--- a/shopify/scripts/update-all-malibu-architectural.ts
+++ b/shopify/scripts/update-all-malibu-architectural.ts
@@ -207,7 +207,7 @@ async function analyzeWithGemini(imageUrl: string, productTitle: string): Promis
     const mimeType = imageUrl.includes('.png') ? 'image/png' : 'image/jpeg';
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/update-dwk-full-details.js b/shopify/scripts/update-dwk-full-details.js
index fef5e7c3..458fbc4c 100644
--- a/shopify/scripts/update-dwk-full-details.js
+++ b/shopify/scripts/update-dwk-full-details.js
@@ -153,7 +153,7 @@ async function analyzeWithGemini(imageUrl) {
     const base64 = imgBuffer.toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/update-dwk-slow-seo.js b/shopify/scripts/update-dwk-slow-seo.js
index 32c99bae..3e0903d7 100644
--- a/shopify/scripts/update-dwk-slow-seo.js
+++ b/shopify/scripts/update-dwk-slow-seo.js
@@ -124,7 +124,7 @@ async function analyzeWithGemini(imageUrl) {
     const base64 = imgBuffer.toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/update-dwqw-complete.ts b/shopify/scripts/update-dwqw-complete.ts
index 29d9f819..7ef93499 100644
--- a/shopify/scripts/update-dwqw-complete.ts
+++ b/shopify/scripts/update-dwqw-complete.ts
@@ -99,7 +99,7 @@ Return ONLY valid JSON (no markdown):
 }`;
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/update-dwqw-malibu-architectural.ts b/shopify/scripts/update-dwqw-malibu-architectural.ts
index 39892f84..c9ab5c46 100644
--- a/shopify/scripts/update-dwqw-malibu-architectural.ts
+++ b/shopify/scripts/update-dwqw-malibu-architectural.ts
@@ -157,7 +157,7 @@ async function analyzeWithGemini(imageUrl: string, productTitle: string): Promis
     const mimeType = imageUrl.includes('.png') ? 'image/png' : 'image/jpeg';
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/update-dwrr-descriptions-quantities.ts b/shopify/scripts/update-dwrr-descriptions-quantities.ts
index 6fb07a2f..1f78e25b 100644
--- a/shopify/scripts/update-dwrr-descriptions-quantities.ts
+++ b/shopify/scripts/update-dwrr-descriptions-quantities.ts
@@ -103,7 +103,7 @@ async function generateDescriptionWithGemini(imageUrl: string, pattern: string,
     const base64Image = Buffer.from(imageBuffer).toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/update-dwrr-gemini.ts b/shopify/scripts/update-dwrr-gemini.ts
index 7ecaff22..3f0dccc5 100644
--- a/shopify/scripts/update-dwrr-gemini.ts
+++ b/shopify/scripts/update-dwrr-gemini.ts
@@ -109,7 +109,7 @@ async function analyzeWithGemini(imageUrl: string, spreadsheetColor: string): Pr
     const base64Image = Buffer.from(imageBuffer).toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/update-koroseal-gemini.ts b/shopify/scripts/update-koroseal-gemini.ts
index 64c6ebb6..aa54c412 100644
--- a/shopify/scripts/update-koroseal-gemini.ts
+++ b/shopify/scripts/update-koroseal-gemini.ts
@@ -102,7 +102,7 @@ async function analyzeWithGemini(imageUrl: string, title: string): Promise<Gemin
     const base64Image = Buffer.from(imageBuffer).toString('base64');
 
     const response = await fetch(
-      `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`,
+      `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_API_KEY}`,
       {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
diff --git a/shopify/scripts/zoffany-full-monty-20.js b/shopify/scripts/zoffany-full-monty-20.js
index ce600b95..5ee98127 100644
--- a/shopify/scripts/zoffany-full-monty-20.js
+++ b/shopify/scripts/zoffany-full-monty-20.js
@@ -33,7 +33,7 @@ const SHOPIFY_STORE = 'designer-laboratory-sandbox.myshopify.com';
 const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const API_VERSION = '2024-10';
 const GEMINI_KEY = '${GOOGLE_API_KEY}';
-const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`;
+const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${GEMINI_KEY}`;
 const ROOM_API = 'http://127.0.0.1:3075/api/generate-room';
 const SLACK_WEBHOOK = '${SLACK_WEBHOOK_URL}';
 const SPIN_BASE_DIR = '/root/DW-Agents/spins/zoffany';

← 7fe21a33 Fix grid selector in toolbar updateGridDensity function  ·  back to Designer Wallcoverings  ·  Diagnose + stage revert of broken Approach-B section-inside- de52ba2c →