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
- Upload — the archive (ZIP), up to 600 MB. Parsing runs detached: the endpoint returns immediately and you poll status until
ReadyForReview,Committed, orFailed. - 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.
- Review — the point of the feature. Conversation by conversation: read what was parsed, include or exclude it. Nothing has been written yet.
- 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