💾 导入与导出
OPL 数据空间提供聊天历史备份与恢复工具,也支持从其他平台迁移会话。
进入导入与导出
- 点击侧边栏左下角的个人名称或头像。
- 在菜单中选择设置。
- 打开数据控制标签页。
- 使用 Import Chats 或 Export Chats 按钮。
导出聊天
点击 Export Chats 可将全部会话下载为 JSON 文件。该备份包含:
- 所有聊天消息及其元数据
- 每段会话所使用的模型信息
- 时间戳与会话结构
定期备份
建议定期导出聊天记录,尤其是在重大升级或迁移前。
导入聊天
点击 Import Chats,选择用于恢复会话的 JSON 文件。 OPL 数据空间支持导入以下来源:
- OPL 数据空间导出:原生 JSON 格式
- ChatGPT 导出:自动识别并转换 OpenAI ChatGPT 导出格式
- DeepSider Markdown 导出:导入时自动转换
- XSimple Markdown 导出:导入时自动转换
- 自定义 JSON:任何符合下文结构要求的 JSON 文件
导入行为
- 导入的聊天会追加到现有会话中,不会覆盖原有内容
- 每个导入聊天都会获得新的唯一 ID,因此重复导入同一文 件会产生副本
- ChatGPT 导出格式会被自动检测并转换
- 对于 DeepSider、XSimple 等 Markdown 导入器,请在导入界面选择匹配的来源,以便 OPL 数据空间使用正确转换器
聊天导入 JSON 结构
导入文件必须是一个聊天对象数组。支持两种格式:标准格式( OPL 数据空间导出所用)与旧版格式。
标准格式(推荐)
数组中的每个对象应包含一个 chat 键,内部存放会话数据:
[
{
"chat": {
"title": "我的会话",
"models": ["llama3.2"],
"history": {
"currentId": "message-id-2",
"messages": {
"message-id-1": {
"id": "message-id-1",
"parentId": null,
"childrenIds": ["message-id-2"],
"role": "user",
"content": "你好,最近怎么样?",
"timestamp": 1700000000
},
"message-id-2": {
"id": "message-id-2",
"parentId": "message-id-1",
"childrenIds": [],
"role": "assistant",
"content": "我很好,谢谢!",
"model": "llama3.2",
"done": true,
"timestamp": 1700000005
}
}
}
},
"meta": {
"tags": ["greeting"]
},
"pinned": false,
"folder_id": null,
"created_at": 1700000000,
"updated_at": 1700000005
}
]旧版格式
如果数组中的对象没有 chat 键,则整个对象会被视为聊天数据本身,并自动包装为 { "chat": <object> }:
[
{
"title": "我的会话",
"models": ["llama3.2"],
"history": {
"currentId": "message-id-2",
"messages": {
"message-id-1": {
"id": "message-id-1",
"parentId": null,
"childrenIds": ["message-id-2"],
"role": "user",
"content": "你好!"
},
"message-id-2": {
"id": "message-id-2",
"parentId": "message-id-1",
"childrenIds": [],
"role": "assistant",
"content": "你好!",
"model": "llama3.2",
"done": true
}
}
}
}
]字段说明
顶层聊天对象(标准格式)
| 字段 | 类型 | 必需 | 说明 |
|---|---|---|---|
chat | object | ✅ | 会话数据,见下方 Chat Data |
meta | object | ❌ | 元数据,例如 tags(字符串数组);默认 {} |
pinned | boolean | ❌ | 是否置顶;默认 false |
folder_id | string | null | ❌ | 目标文件夹 ID;默认 null |
created_at | integer | null | ❌ | 会话创建时间的 Unix 秒级时间戳 |
updated_at | integer | null | ❌ | 会话最后更新时间的 Unix 秒级时间戳 |
Chat Data 对象
| 字段 | 类型 | 必需 | 说明 |
|---|---|---|---|
title | string | ❌ | 会话标题;默认 "New Chat" |
models | string[] | ❌ | 会话中用到的模型标识列表 |
history | object | ✅ | 消息树,见下方 History |
options | object | ❌ | 聊天级选项或参数 |
History 对象
| 字段 | 类型 | 必需 | 说明 |
|---|---|---|---|
currentId | string | ✅ | 当前活跃分支最后一条消息的 ID |
messages | object | ✅ | 消息 ID 到消息对象的映射,见下方 Message |
Message 对象
| 字段 | 类型 | 必需 | 说明 |
|---|---|---|---|
id | string | ✅ | 消息唯一标识 |
parentId | string | null | ✅ | 父消息 ID;首条消息为 null |
childrenIds | string[] | ✅ | 子消息 ID 数组;最后一条消息通常为 [] |
role | string | ✅ | "user" 或 "assistant" |
content | string | ✅ | 消息文本,支持 Markdown |
model | string | ❌ | 模型标识,通常用于 assistant 消息 |
done | boolean | ❌ | 响应是否完成 |
timestamp | integer | ❌ | 消息的 Unix 秒级时间戳 |
context | string | null | ❌ | 附加上下文 |
消息树结构
消息采用树结构而不是扁平列表。每条消息通过 parentId 指向父节点,并通过 childrenIds 指向子节点。这使 OPL 数据空间可以支持分支会话,例如编辑消息后生成另一条回复。history.currentId 指向当前活跃分支的最后一条消息。
ChatGPT 导出格式
当数组中首个对象包含 mapping 键时, OPL 数据空间会自动识别为 ChatGPT 导出格式。你无需手动转换,直接导入即可。
最小可用示例
最小合法导入文件如下:
[
{
"title": "快速聊天",
"history": {
"currentId": "msg-1",
"messages": {
"msg-1": {
"id": "msg-1",
"parentId": null,
"childrenIds": [],
"role": "user",
"content": "你好!"
}
}
}
}
]该示例使用旧版格式(没有 chat 外层包装),且仅包含一条用户消息。