← 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
M CLAUDE.mdM COMPLETED-PROCESSES.mdM DW-Agents/dw-agents/agent-ai-expenses/ai-expenses-tracker.tsM DW-Agents/dw-agents/agent-thibaut-updater/thibaut-updater-agent.tsM DW-Agents/vendor-command-center/logo-cropper.jsM DW-Agents/vendor-command-center/server.jsM DW-Agents/vendor-command-center/standardization-worker.jsM DW-Agents/vendor-command-center/website-scorer.jsM DW-Programming/CLAUDE.mdM DW-Programming/DW-Duplicate-Recolor-v1.4/lib/geminiAnalyzer.jsM DW-Programming/ImportNewSkufromURL/CLAUDE.mdM DW-Programming/ImportNewSkufromURL/dwjs-comprehensive-update.tsM DW-Programming/ImportNewSkufromURL/dwjs-interior-design-update.jsM DW-Programming/ImportNewSkufromURL/dwjs-interior-design-update.tsM DW-Programming/ImportNewSkufromURL/scripts/koroseal-enrichment.tsM DW-Programming/ImportNewSkufromURL/scripts/rwltd-gemini-cron.jsM DW-Programming/PhillipeRomanoTagger/server.jsM DW-Programming/ShopifyCalendarNext/scripts/rescan-scheduled-posts.tsM DW-Programming/ShopifyCalendarNext/src/app/api/analyze-product/route.tsM DW-Programming/ShopifyCalendarNext/src/app/api/generate-ai-content/route.tsM DW-Programming/activate-versace-drafts.jsM DW-Programming/activate-versace-vi.jsM DW-Programming/anna-french-ai-enrich.jsM DW-Programming/china-seas-design-tagger.jsM DW-Programming/china-seas-hex-colors.jsM DW-Programming/color-batch-cleaner.pyM DW-Programming/color-collection-cleaner.jsM DW-Programming/enrich-launched-products.pyM DW-Programming/fix-blue-collection.jsM DW-Programming/gls-gemini-retry.jsM DW-Programming/gls-product-cleanup.jsM DW-Programming/gls-product-processor.jsM DW-Programming/gls-product-updater.jsM DW-Programming/gls-retry-failed.jsM DW-Programming/hex-color-blitz.jsM DW-Programming/hollywood-hex-and-tags.jsM DW-Programming/hollywood-hex-extract.jsM DW-Programming/interior-design-ai-tagger.jsM DW-Programming/interior-design-tagger.jsM DW-Programming/maya-romanoff-updater/maya-romanoff-updater.jsM DW-Programming/maya-romanoff-updater/server.jsM DW-Programming/nextjs-liquid-app/app/api/analyze-image/route.tsM DW-Programming/nextjs-liquid-app/app/api/bulk-import/route.tsM DW-Programming/phase3-ai-enrich-100.jsM DW-Programming/phase3-ai-enrich-batch.jsM DW-Programming/phase3-ai-enrich-batch.pyM DW-Programming/phase3-ai-enrich-batch.shM DW-Programming/phase3-ai-enrich-run.jsM DW-Programming/phase3-ai-enrichment.jsM DW-Programming/prl-ai-enrich.jsM DW-Programming/ralph-lauren-fabric-updater-9899.jsM DW-Programming/ralph-lauren-fabric-updater-9899.tsM DW-Programming/room-setting-app/app/api/analyze-pattern/route.tsM DW-Programming/room-setting-app/lib/multi-model-generator.tsM DW-Programming/zoffany-ai-enrich.jsM ai-enrich-arte-fix.jsM ai-enrich-gaps2.jsM arte-fill-tags.jsM brand-router/server.jsM enrich-arte-fix.jsM enrich-arte-gaps.jsM enrich-arte-puppeteer.jsM enrich-remaining-13.jsM gemini-classify-texture.jsM gemini-enrich-arte.jsM gemini-enrich-arte9.jsM gemini-enrich-gaps.jsM output/us-007-implementation-summary.mdM pending-approval/tres-tintas-designer-descriptions-pilot.mdM scripts/US-007-USAGE.mdM scripts/ai-enrich-arte-gaps.jsM scripts/ai-enrich-gaps.jsM scripts/brand-mckenzie-ai-analysis.tsM scripts/brand-mckenzie-full-scrape.tsM scripts/brand-mckenzie-full-update.tsM scripts/collection-description-writer.jsM scripts/enrich-remaining-13.jsM scripts/interior-design-tags.jsM scripts/prl-ai-enrich.jsM scripts/ralph/prd-ralph-lauren-fabrics.jsonM scripts/texture-repeat-classifier.jsM scripts/us-007-ai-product-quality-analyzer.tsM shopify/scripts/arte-dashboard/server.jsM shopify/scripts/bespoke-updater/server.jsM shopify/scripts/classify-texture-pattern.jsM shopify/scripts/gemini-catalog-tagger.jsM shopify/scripts/gemini-tag-engine/index.jsM shopify/scripts/import-missing-dwrr.tsM shopify/scripts/interior-design-tagger.jsM shopify/scripts/koroseal-batch-cron.jsM shopify/scripts/koroseal-complete-update.tsM shopify/scripts/koroseal-enhanced-update.jsM shopify/scripts/koroseal-update.jsM shopify/scripts/prl-ai-enrich.jsM shopify/scripts/review-dwqw-images-descriptions.tsM shopify/scripts/set-texture-repeat-zero.jsM shopify/scripts/texture-repeat-fixer.jsM shopify/scripts/update-all-malibu-architectural.tsM shopify/scripts/update-dwk-full-details.jsM shopify/scripts/update-dwk-slow-seo.jsM shopify/scripts/update-dwqw-complete.tsM shopify/scripts/update-dwqw-malibu-architectural.tsM shopify/scripts/update-dwrr-descriptions-quantities.tsM shopify/scripts/update-dwrr-gemini.tsM shopify/scripts/update-koroseal-gemini.tsM shopify/scripts/zoffany-full-monty-20.js
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 →