Summary and claims
A video summary in Fovea is a (videoId, personaId) pair carrying prose paragraphs, an audio transcript, key frames, and the model outputs that produced them. A claim is a hierarchical assertion extracted from a summary, with gloss items that point at world objects (entities, events, types) by id.
This chapter generates a summary against the persona and extracts claims from it.
Queue a summary job
POST /api/videos/summaries/generate enqueues a BullMQ job that
the model service processes:
curl -s -X POST http://localhost:3001/api/videos/summaries/generate \
-H 'Content-Type: application/json' \
--cookie cookies.txt \
-d "{\"videoId\":\"$VIDEO_ID\",\"personaId\":\"$PERSONA_ID\"}"
# {"jobId":"<job-uuid>","status":"queued"}
Poll the job status until it completes:
curl -s "http://localhost:3001/api/jobs/$JOB_ID" --cookie cookies.txt
# {"status":"completed","summaryId":"<summary-uuid>"}
The summary is now available at
GET /api/videos/:videoId/summaries/:personaId. Save the
returned id as SUMMARY_ID.
Extract claims
POST /api/summaries/:summaryId/claims/generate enqueues claim
extraction against the summary text:
curl -s -X POST "http://localhost:3001/api/summaries/$SUMMARY_ID/claims/generate" \
-H 'Content-Type: application/json' \
--cookie cookies.txt \
-d '{}'
# {"jobId":"<job-uuid>","status":"queued"}
When the job completes, the claims live under
GET /api/summaries/:summaryId/claims. Each claim row carries
text, a hierarchical gloss array, an optional parentClaimId
(for sub-claims), and modality flags (audio, video, metadata).
The gloss array carries one entry per token-or-span the extractor
chose to surface. Items of type objectRef carry a world-object
id under content; items of type typeRef carry a type id. The
v0.1.7 import path remaps these ids when the claim crosses a user
boundary so cross-user imports keep their gloss links live.
Add a typed claim relation
A claim relation is a typed edge between two claims. The relation
type is one of the persona's relationTypes. To assert that
claim A causes claim B:
curl -s -X POST \
"http://localhost:3001/api/summaries/$SUMMARY_ID/claims/$CLAIM_A_ID/relations" \
-H 'Content-Type: application/json' \
--cookie cookies.txt \
-d "{\"targetClaimId\":\"$CLAIM_B_ID\",\"relationTypeId\":\"causes\"}"
The route checks ownership of both endpoints (the source claim's summary and the target claim's summary must belong to the requester). See Concepts > Data isolation for the full ownership model.
Next
Continue to Export and import to round-trip this work through JSONL into a second user account.