Root carried 15 *_PLAN/_DEEPDIVE/_AUDIT/bridge/handover docs (many describe shipped work). git mv → docs/ (R100, no content change). README.md stays at root. Already *.md-dockerignored, so no image impact — purely navigability. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
6.9 KiB
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 forcedLIMIT, and astatement_timeout. Even then, the fixed tools answer most real questions more reliably. - Never — free SQL execution. One
UPDATE/DELETE/DROPfrom 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)→ aproposalsrow → human applies.propose_intake(...)→stagedinventory (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:
- 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.
- 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.
- Newsletters. "New techno arrivals + 3 staff picks" → query new stock → draft HTML → human reviews → send via the existing mailer. Draft-only.
- Stock-hygiene assistant. Surface Heal-sweep gaps, flag below-market/mispriced items (DealGod median), find dupes. Read + propose.
- 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.pyagent loop + the 7 read tools +draft_*tools. One/admin"Ask RecordGod" panel (chat box → grounded answer + the tool trace).ai_logtable (prompt, tools, tokens, cost, user, ts). Everything read/draft. This is the demo that sells. - Phase 2:
proposalsreview 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.