Importing chat history

Bring conversation history from another AI provider into an identity's memory. Upload a provider export archive; Atamaia detects the format, scrubs it, and you review before anything is written. The SPA wizard lives at System → Import; everything it does is also plain REST.

This is a one-shot pipeline, not a sync. It moves text, once, through a review gate you control.

Supported sources

Parsers are structural — the archive's shape is detected, and an unknown format fails loudly rather than mis-parsing:

Provider What their export gives you
ChatGPT (OpenAI) ZIP with conversations.json (tree structure)
Claude (Anthropic) A manifest (anthropic.json) listing several ZIPs — conversations-000.zip is the chat history, projects-000.zip carries projects + docs, memories-000.zip carries claude.ai's memory. Download links expire in ~24 hours and may work only once
Google Gemini Google Takeout archive
Grok (xAI) Export ZIP (attachments are anonymous blobs; text imports fine)

Export from the provider first. Every provider makes this slower than it should be — ChatGPT queues the export and emails a link days later; Anthropic's links are single-use. Start the export before you start anything else.

The pipeline

  1. Upload — the archive (ZIP), up to 600 MB. Parsing runs detached: the endpoint returns immediately and you poll status until ReadyForReview, Committed, or Failed.
  2. Parse and scrub — automatic. The archive is normalised to one internal conversation shape and scanned for secrets (API keys, JWTs, private-key blocks, credential assignments) and email addresses. Flagged content is shown as masked excerpts — the flag never contains the secret itself; you see where it was and decide.
  3. Review — the point of the feature. Conversation by conversation: read what was parsed, include or exclude it. Nothing has been written yet.
  4. Commit — approved conversations become memories on the target identity; approved facts and preferences land in the chosen project's fact store. Commit is permanent and writes permanent memories — discarding the import afterwards does not undo it (delete via the normal memory surfaces instead).

Imported memory carries provenance Reported — relayed from an external source, not asserted — so downstream weighting can tell imported content from native memory. Transcripts are truncated at 4,000 characters with an explicit marker rather than embedded verbatim; a summary is preferred over a raw transcript wherever one exists.

API

All endpoints require the ImportData permission. Responses use ApiEnvelope<T>.

Method Path Summary Responses
GET /api/import List imports, newest first (paged). 200 PagedResultOfImportDto
DELETE /api/import/{id} Discard a staged import. Nothing was written, so nothing is undone. 200
GET /api/import/{id} One import's status. 200 ImportDto
POST /api/import/{id}/commit Commit approved conversations as permanent memories (provenance Reported) and approved facts into the project store. The request may retarget the destination identity — the last moment to choose whose memory this becomes. 200 ImportDto
GET /api/import/{id}/conversations/{conversationId} One parsed conversation in full. 200 ImportConversationDetailDto
GET /api/import/{id}/review The review set: parsed conversations awaiting include/exclude decisions. Nothing has been written yet. 200 ImportReviewDto
PATCH /api/import/{id}/review Apply include/exclude decisions to a staged import. 200 ImportReviewDto
POST /api/import/upload Upload a provider export archive (ZIP, up to 600 MB) and start the parse-and-scrub pipeline. Parsing runs detached — poll GET /api/import/{id} until ReadyForReview, Committed or Failed. 200 ImportDto
The identity (or its steward) guards every write: only the identity itself can decide whose memory an import becomes. identityId may be set at upload and again at commit — commit is the last moment.

Limits

  • One archive per import; a multi-year export is easily hundreds of MB, hence the 600 MB cap.
  • Media does not import. Every provider makes pictures harder to keep than words — ChatGPT omits generated images entirely, Gemini's Takeout separates them from their conversations, Grok ships nameless blobs. Text only, for now.
  • Provider schemas drift. A change breaks a parser loudly (with a fixture next to it), not silently.

The open way out

Export speaks the same openness: one call returns an identity's memory as Konshus AI Memory Portability Standard v0.1 JSON, and a chat session as a Data Transfer Initiative AI Conversation History document. Memory that lives in open formats stops caring which provider's schema changed this month.

Last updated