Character bundle imports
Use POST /v1/imports when you want one reviewable object that can publish a
character and, when present, a prior conversation history.
If you only need to create a character, POST /v1/characters is still the
shortest path. Use /v1/imports when your app wants a single package for voice
samples, authored personality, optional identity image, and optional transcript
migration.
For the full production-shaped route that combines bundle import, transcript extraction, identity image registration, playable-character graph, NPC graph, chat, relationship evidence, and score opt-in, see Full developer E2E path.
Two modes
transcript_migration is accepted for migration-only clients, but most apps
should use hybrid because a transcript is strongest when paired with authored
voice and identity anchors.
Fresh-start import
identity_image.source_url must be a direct, publicly fetchable https image
URL. If LoreOS cannot fetch it, the character can still publish, but the
identity_image result in the commit response will contain a safe error and the
portrait will not be registered.
Then commit:
The commit response includes the import summary plus a commit object:
For authoring_only, data.commit.session_id is null; start a session with
POST /v1/sessions.
Transcript migration import
The import stages the transcript into a sandbox session and starts extraction in
Temporal by default. The create response includes temporal_workflow_id and
temporal_task_queue when extraction_mode is background, which is the
default. Poll until status is ready:
GET /v1/imports/{import_id} returns pollable progress:
phase moves through queued, extracting, embedding, and ready.
last_heartbeat_at should keep advancing while a long extraction is still
alive, even if completed_checkpoints has not changed yet. If the workflow
fails, status becomes failed and last_error contains the safe error
summary. A ready import may still carry non-fatal extraction_summary.errors;
show those as review warnings, then inspect the preview before commit. Use
extraction_mode: "none" only for tests or custom review flows where you want
to stage the transcript without running extractors yet.
The preview returns authored-character readiness plus staged ledger counts such
as world-model claims, canon facts, counterpart beliefs, NPCs, and relational
state rows. Transcript imports may also include supporting_cast_candidates:
reviewable NPC candidates projected from repeated extracted person signals, with
candidate, review_recommended, or auto_promoted status. These candidates
remain planning-only until commit and later developer/user review; they are not
raw graph imports or user-visible facts. The preview does not expose prompts,
raw extractor traces, or private engine internals.
After commit, review the materialized supporting cast through the Character World APIs:
Use promote when a candidate should become explicit developer-promoted cast.
Use dismiss when LoreOS should retain the row for audit and duplicate
avoidance but stop using it in planner context. Use request-review to keep a
candidate visible in the review queue without making a final decision. You can
also PATCH /v1/characters/{slug}/npcs/{npc_ref} or PUT the NPC relationship
after promotion to refine role, voice, stance, visibility tier, and relationship
graph details.
If the import or a later Story Room run produces life-event candidates, agenda state, or offscreen-life state, inspect and review those through the same Character World surface:
These endpoints are redacted projections. They exclude raw prompts, provider payloads, raw extractor inputs, private agenda payloads, and raw offscreen scene transcripts.
Commit when the preview is acceptable:
If the accepted-memory write path is disabled in the current environment, commit
returns 503 import_commit_disabled. Keep polling or inspecting the preview is
not enough to fix that state; an operator must enable import commits for that
environment. This protects staging extraction from accidentally publishing
external memory before the write policy is enabled.
The commit response includes:
data.import: the pollable import row after commit.data.commit.character: the published character slug and status.data.commit.session_id: the new LoreOS session carrying the imported relationship state.data.commit.import_batch_id: the deletion handle for imported memory rows.data.commit.claims_written,data.commit.canon_written,data.commit.beliefs_written,data.commit.npcs_written, andrelational_state_set: counts of committed extracted state.data.identity_image: the registered identity asset, or a safe per-image error if the provided URL could not be fetched.
Review and deletion
PATCH /v1/imports/{import_id}/review-items/{item_id} records a review decision
for UI and audit. In the first release, commit applies the staged accepted
ledgers as a batch; item-level pruning is not yet a hard filter for every
extractor output.
DELETE /v1/imports/{import_id} soft-deletes the import row. If the import was
committed, LoreOS also deletes rows stamped with the returned import_batch_id.
Safety model
- The raw transcript is not stored in the
v1_character_importsrow. - Transcript turns are replayed into a sandbox staging session.
- Imported memory is stamped as external provenance and starts with conservative trust. It can inform planning, but it is not treated as verified user consent or a speakable fact by default.
- Identity images are registered from public image URLs after the character is published. For uploads or ongoing image management, use the visual asset APIs.