# RecordGod AI assistant — honest assessment & plan (2026-06-24) OpenRouter key stored in the vault (`openrouter_api_key` + `openrouter_model`), reachable like every other credential. This doc is the "durry and a short black" think: what's genuinely dope, what's hype, what breaks things, and how to build it so it only helps. ## The one-paragraph honest take The LLM is a **commodity** — anyone can call OpenRouter. The moat is that RecordGod can **ground** the model in proprietary, structured, *vectorised* data: the full Discogs mirror, the live cross-store market intelligence in DealGod (pgvector lives there, reached via the DealGod API — **RecordGod-db itself has no pgvector**), real sales and stock. A WooCommerce plugin with a chatbot is a toy; "talk to your shop, and it answers with *your* numbers and *the market's* numbers, then drafts the copy/newsletter/price for you to approve" is a product. **So the sell isn't "AI" — it's "AI that can't lie to you because it's reading the database, and can't break anything because it can only propose."** ## The non-negotiable architecture: tools, not free SQL The exciting line — "it can run actual Postgres queries for the exact info it needs" — is right in spirit and a foot-gun in the literal. The safe, equally-powerful pattern is a **tool-calling agent**: the model picks from a set of vetted, parameterised functions; *our* code runs the query. The model never sees a raw `psql` prompt. - **Phase 1 — fixed read tools (safest, ~90% of the value).** `stock_query`, `release_lookup`, `market_value`(DealGod API), `semantic_search`(DealGod pgvector API), `sales_summary`, `customer_wants`, `catalog_health`. The model composes them; results are real rows, so it summarises rather than hallucinates. - **Phase 2 — constrained text-to-SQL for power questions.** Only against a **read-only role**, over a curated set of **VIEWS** (not raw tables), with the generated SQL parsed (reject anything not a single `SELECT`), a forced `LIMIT`, and a `statement_timeout`. Even then, the fixed tools answer most real questions more reliably. - **Never — free SQL execution.** One `UPDATE`/`DELETE`/`DROP` from a hallucination or an injected instruction and the shop is down. Not happening. ## Writes: propose, never commit RecordGod is *already* the right shape for this — intake **stages**, publish is a separate non-destructive step. The AI just becomes another stager/proposer. Every write-flavoured capability lands in a **review queue** a human approves; nothing the agent does is live without a click. - `propose_price(sku, price, reason)` → a `proposals` row → human applies. - `propose_intake(...)` → `staged` inventory (already non-destructive). - `draft_newsletter` / `draft_product_copy` / `draft_wantlist_emails` → text only, human sends. ## The dope things, honestly rated **Tier A — genuine value, low risk, ship first:** 1. **Ask-your-data.** "DnB 12-inches under $10 not sold in 90 days?" → tools → a table. Huge for a shop owner. Semantic angle (DealGod pgvector): "records with a *vibe* like this one," not just keyword. 2. **Product copy / hype spiels.** Feed the model the *real* artist/label/year/tracklist/condition + DealGod rarity → a punchy description or social caption, grounded in facts. The killer low-risk content win. 3. **Newsletters.** "New techno arrivals + 3 staff picks" → query new stock → draft HTML → human reviews → send via the existing mailer. Draft-only. 4. **Stock-hygiene assistant.** Surface Heal-sweep gaps, flag below-market/mispriced items (DealGod median), find dupes. Read + propose. 5. **Intake helper.** "Box of these" → describe → semantic search the Discogs mirror → propose matches → human confirms → stage. Pairs with the intake we built. **Tier B — valuable, needs the propose-gate:** 6. **Auto-pricing suggestions** (propose, not apply) using DealGod cross-store median × condition. 7. **Wantlist matching** — "these 4 customers want what just arrived" → draft the notify emails. **Tier C — flashy, lower ROI / higher risk:** 8. **Autonomous "site maintenance"** = write access. Honest answer: don't. Keep it propose + human-apply. Full autonomy is exactly where it breaks shit. 9. **Free text-to-SQL on master.** Great demo, real foot-gun; covered better by fixed tools + Phase-2 read-only views. ## Guardrails (so it only helps) | Risk | Guardrail | |---|---| | Destructive writes | Agent gets a **read-only DB role**; all writes are **propose → human apply** | | Bad/expensive SQL (Phase 2) | read-only role · curated VIEWS only · parse-and-reject non-SELECT · forced LIMIT · `statement_timeout` | | Tool abuse | hard **allowlist** of tools; no shell, no file write, no arbitrary HTTP | | Hallucination | answers are **grounded** in returned rows; "AI draft — review" label on all output | | Prompt injection (notes, customer msgs, web text are untrusted) | untrusted text can't trigger a write — the human gate absorbs it | | Cost creep | per-call **cost + token log** (`ai_log`), daily **budget cap**, cheap models for bulk | | PII leakage | customer tools return **de-identified** data unless a task needs more (matches DealGod privacy posture) | | Over-trust | every agent action is **logged and reversible**; proposals show their reasoning + source rows | ## Model routing (OpenRouter's real advantage) Route per task, don't pick one model: - **Bulk / tool-calling / SQL reasoning** → DeepSeek V3 or Gemini 2.5 Flash (fast, dirt cheap, plenty smart). - **Nuanced copy / newsletters** → Gemini Flash or a mid model; hype spiels don't need a frontier model. - **Hard multi-step analysis** → route up to a stronger model (incl. Claude via OpenRouter) for that call only. Store a default in `openrouter_model`; let specific tools override. ## Build phases - **Phase 0 (done):** Connect page stores `openrouter_api_key` + `openrouter_model`; test button shows usage. - **Phase 1:** `app/ai_routes.py` agent loop + the 7 read tools + `draft_*` tools. One `/admin` "Ask RecordGod" panel (chat box → grounded answer + the tool trace). `ai_log` table (prompt, tools, tokens, cost, user, ts). Everything read/draft. **This is the demo that sells.** - **Phase 2:** `proposals` review queue + propose tools (price/intake/wantlist). Constrained text-to-SQL over read-only VIEWS for power users. - **Phase 3:** Scheduled agent jobs (weekly newsletter draft, daily mispriced-stock report) — still draft/propose. ## Honest bottom line Worth building, and a real differentiator — **because of the data, not the model.** Start with read + draft (Phase 1): all upside, no blast radius, and it's the version you can put in a sales demo. Add propose-and-apply only behind the review queue. Keep the agent read-only and human-gated and it can't break the shop — it can only make it faster to run. Links: [[openrouter-llm-backend]], [[recordgod-engine]], [[recordgod-intake-three-source]].