The exact provider input stays together. Product annotations stay in properties.
const gen = keeps.generation({
model, input, userId, sessionId,
properties: { feature: "canvas" }
});Keeps connects generation inputs, every output asset, exact product actions, customer annotations, and what the media itself contains. Compare models, workflows, and user cohorts with the evidence in view.
Python + TypeScript server SDKs · thumbnails only · fail-open capture


latency ✓
request status ✓
provider spend ✓
ANSWERED BY KEEPSwhat people created →
which assets they acted on →
which themes over-indexed →
A generation request is only context. The useful unit is each output asset: the image, video, or audio that can be downloaded, remixed, approved, reported, or used as a source later.
Keeps records those observations once, enriches bounded thumbnails, and lets every analysis point back to counts and representative assets. It does not invent a universal quality score.
Every output gets its own stable external ID, timeline, media metadata, product actions, visual description, and vector. A click on one output never gets smeared across its siblings.
The exact provider input stays together. Product annotations stay in properties.
const gen = keeps.generation({
model, input, userId, sessionId,
properties: { feature: "canvas" }
});Register zero, one, or many outputs. URLs are fetch references, never identity.
gen.complete({ assets: [{
externalId: "render_a", url,
mediaType: "image"
}] });Use the verbs your application already owns, attached to the exact asset.
keeps.track("downloaded", {
asset: "render_a",
userId, sessionId
});Filter assets by time, model, action, workflow, user context, or semantic meaning. Open an asset for exact generation, sibling, source, and action context.
Text and asset-neighbor search use multimodal embeddings. Identity still uses only a Keeps ID or stable customer external ID.
Ask which themes over-index among downloads, how action rates differ by model, or what one user cohort creates—with denominators and examples.
Notebooks keep an inspectable analysis plan and rerun it against current Postgres data whenever they open.
CLI and MCP diagnostics share the same scoped APIs. No browser capture, provider wrappers, or arbitrary model-generated SQL.
Bounded queues, short timeouts, jittered retries, and a bounded flush. Capture failures never change customer generation behavior.
Asset joins use a Keeps ID or one stable external ID. URLs, hashes, prompts, and vectors never guess identity.
Semantic labels, comparisons, and charts are transparent query results. Full-resolution media remains customer-owned; Keeps stores thumbnails only.
Capture generations and actions today. Ask the first media-native question against your own rows.