跳到主要内容

💾 导入与导出

OPL 数据空间提供聊天历史备份与恢复工具,也支持从其他平台迁移会话。

进入导入与导出

  1. 点击侧边栏左下角的个人名称或头像。
  2. 在菜单中选择设置
  3. 打开数据控制标签页。
  4. 使用 Import ChatsExport Chats 按钮。

导出聊天

点击 Export Chats 可将全部会话下载为 JSON 文件。该备份包含:

  • 所有聊天消息及其元数据
  • 每段会话所使用的模型信息
  • 时间戳与会话结构
定期备份

建议定期导出聊天记录,尤其是在重大升级或迁移前。

导入聊天

点击 Import Chats,选择用于恢复会话的 JSON 文件。 OPL 数据空间支持导入以下来源:

  • OPL 数据空间导出:原生 JSON 格式
  • ChatGPT 导出:自动识别并转换 OpenAI ChatGPT 导出格式
  • DeepSider Markdown 导出:导入时自动转换
  • XSimple Markdown 导出:导入时自动转换
  • 自定义 JSON:任何符合下文结构要求的 JSON 文件

导入行为

  • 导入的聊天会追加到现有会话中,不会覆盖原有内容
  • 每个导入聊天都会获得新的唯一 ID,因此重复导入同一文件会产生副本
  • ChatGPT 导出格式会被自动检测并转换
  • 对于 DeepSiderXSimple 等 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
        }
      }
    }
  }
]

字段说明

顶层聊天对象(标准格式)

字段类型必需说明
chatobject会话数据,见下方 Chat Data
metaobject元数据,例如 tags(字符串数组);默认 {}
pinnedboolean是否置顶;默认 false
folder_idstring | null目标文件夹 ID;默认 null
created_atinteger | null会话创建时间的 Unix 秒级时间戳
updated_atinteger | null会话最后更新时间的 Unix 秒级时间戳

Chat Data 对象

字段类型必需说明
titlestring会话标题;默认 "New Chat"
modelsstring[]会话中用到的模型标识列表
historyobject消息树,见下方 History
optionsobject聊天级选项或参数

History 对象

字段类型必需说明
currentIdstring当前活跃分支最后一条消息的 ID
messagesobject消息 ID 到消息对象的映射,见下方 Message

Message 对象

字段类型必需说明
idstring消息唯一标识
parentIdstring | null父消息 ID;首条消息为 null
childrenIdsstring[]子消息 ID 数组;最后一条消息通常为 []
rolestring"user""assistant"
contentstring消息文本,支持 Markdown
modelstring模型标识,通常用于 assistant 消息
doneboolean响应是否完成
timestampinteger消息的 Unix 秒级时间戳
contextstring | 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 外层包装),且仅包含一条用户消息。

FAQ

问:导入聊天会覆盖现有会话吗?
答: 不会。导入内容会与现有会话并存。

问:可以导入 Claude、Gemini 或其他平台的聊天吗?
答: 目前没有内建转换器。你需要先将导出文件转换为上文所述 JSON 结构,关键是正确构建 parentId / childrenIds 关系。

问:内建的非 JSON 导入器有哪些?
答: 当前内建的 Markdown 转换器包括 DeepSiderXSimple

问:导入文件大小有限制吗?
答: 没有硬编码上限,但超大文件会耗时更久。实际限制取决于服务器配置和可用内存。

问:如果导入同一个文件两次会怎样?
答: 每次导入都会生成带有新 ID 的聊天,因此会出现重复会话。

问:支持哪些消息角色?
答: 当前导入支持 "user""assistant"。系统消息通常通过模型配置提供,而不是直接存储在聊天历史中。