The platform
What both products stand on
AI Answers reads your pages. Safety Vision reads your cameras. From the ingest queue down, they are the same system — the same tenancy, the same tokens, the same insistence on evidence.
Ingestion and indexing
Everything both products know starts here. For AI Answers that is your website, rendered with Playwright so client-side content is read like any other page. For Safety Vision it is the alarm frames your VMS already writes, read from your own bucket. Neither pipeline holds work in memory — a deploy can kill the process mid-run and the queue survives it.
- JavaScript rendering, tables and PDFs preserved
- Fingerprinted re-crawls: changed pages re-embedded, deleted pages removed
- CMS ping to re-index a single page on publish
- Frames read cross-account by role or key pair
- /services
- changed → re-embedded
- /faq
- 304 → skipped
- /pricing-2023
- 404 → removed
- /blog/*
- 3 new → indexed
Control and guardrails
Neither product is allowed to be a black box you hope behaves. Answers pass forty-three guardrail rules, four of them locked. Competitor-only questions are refused before a model is called at all. On the safety side, zones decide which rules apply where, and advisory mode lets you watch a rule before it starts alerting anyone.
- Per-page rules to exclude or boost any URL
- Pinned answers for wording you must control exactly
- Confidence floor: hand over rather than guess
- Advisory mode and grace zones for safety rules
- competitor_only
- refuse before LLM
- brand_negative
- blocked on output
- confidence < floor
- hand over
- pinned_answer
- verbatim
Measurement
Quality that is not measured drifts. Upload your own prompt sheet and grade the whole set, then diff this run against the last to see which prompts moved and why. Safety incidents are counted only once a reviewer has closed them, and precision is always reported next to coverage so a flattering number cannot hide a detector that stopped firing.
- Prompt suites imported from xlsx or csv
- Run-versus-run diff with per-prompt movement
- Reviewer agreement tracked as its own measure
- Pipeline health and failures on the same screen
- failures
- 22 → 3
- graded runs
- 8
- counting rule
- closed incidents only
- precision
- reported with coverage
Integration
One script tag before the closing body tag installs the widget. Everything the widget does is also available over the public API with per-site tokens, domain whitelists and a scope boundary that is actually enforced — a chat key cannot post safety alarms, and one site's token cannot write into another's.
- Per-website and per-site API tokens, revealed once
- Domain whitelists per token
- Webhooks on incident opened and resolved
- Integration docs generated from your own configuration
- POST /v1/query
- scope: chat
- POST /v1/safety/alarms
- scope: safety
- POST /v1/pages/refresh
- re-index one page
- wrong scope
- wrong_key_scope
Tenancy and security
Each client gets its own database and its own vector collection — answers, evidence images and incidents are never stored alongside another client's. Products are enabled per client with separate flags, so buying one does not expose the other. Bring your own model key and the usage lands on your bill instead of ours.
- Database and vector collection per client
- Roles, co-owners and invites, re-read on every request
- Per-product feature flags
- Your own OpenAI, Anthropic, Gemini, Azure or Groq key
- database
- one per client
- vector collection
- one per client
- features.aiChat
- on
- features.safetyVision
- per contract
Start with the product you need first
They are flagged and billed separately. Adding the second one later costs you a setting, not a migration.