> ## Documentation Index
> Fetch the complete documentation index at: https://ophel.app/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 对话导出 — Markdown、JSON、资源打包与附件保留

> 将 AI 对话导出为 Markdown、JSON、纯文本或 zip 资源包，按平台保留图片、附件、代码产物、Deep Research 报告和思维链。

export const ShortcutLegend = ({lang = "en"}) => {
  const isZh = lang === "zh";
  return <div className="ophel-shortcut-legend" role="note">
      <div className="ophel-shortcut-legend-title">
        {isZh ? "跨平台按键说明" : "Cross-platform key mapping"}
      </div>
      <div className="ophel-shortcut-legend-body">
        {isZh ? <>
            文档中的快捷键会同时显示 Windows/Linux 与 Mac 写法：
            <code>Ctrl</code> 对应 <code>Command</code>，
            <code>Alt</code> 对应 <code>Option</code>。唯一例外是提示词发送，
            <code>Ctrl+Enter</code> 在 Mac 上也使用 <code>Ctrl+Enter</code>。
          </> : <>
            Shortcuts show both Windows/Linux and Mac keys: <code>Ctrl</code> maps
            to <code>Command</code>, and <code>Alt</code> maps to
            <code>Option</code>. Prompt submit is the only exception:
            <code>Ctrl+Enter</code> remains <code>Ctrl+Enter</code> on Mac.
          </>}
      </div>
    </div>;
};

export const Shortcut = ({combo, mac, sameOnMac = false}) => {
  const keyLabels = {
    arrowup: {
      win: "Up",
      mac: "↑"
    },
    arrowdown: {
      win: "Down",
      mac: "↓"
    },
    arrowleft: {
      win: "Left",
      mac: "←"
    },
    arrowright: {
      win: "Right",
      mac: "→"
    },
    up: {
      win: "Up",
      mac: "↑"
    },
    down: {
      win: "Down",
      mac: "↓"
    },
    left: {
      win: "Left",
      mac: "←"
    },
    right: {
      win: "Right",
      mac: "→"
    },
    esc: {
      win: "Esc",
      mac: "Esc"
    },
    escape: {
      win: "Esc",
      mac: "Esc"
    },
    enter: {
      win: "Enter",
      mac: "Enter"
    },
    shift: {
      win: "Shift",
      mac: "⇧"
    },
    backslash: {
      win: "\\",
      mac: "\\"
    }
  };
  const modifierLabels = {
    ctrl: {
      win: "Ctrl",
      mac: "⌘"
    },
    control: {
      win: "Ctrl",
      mac: "⌘"
    },
    cmd: {
      win: "Ctrl",
      mac: "⌘"
    },
    command: {
      win: "Ctrl",
      mac: "⌘"
    },
    alt: {
      win: "Alt",
      mac: "⌥"
    },
    option: {
      win: "Alt",
      mac: "⌥"
    },
    shift: {
      win: "Shift",
      mac: "⇧"
    }
  };
  const normalizeToken = token => String(token || "").trim();
  const formatKey = (token, platform) => {
    const normalized = normalizeToken(token);
    const key = normalized.toLowerCase();
    const mapped = keyLabels[key];
    if (mapped) return mapped[platform];
    if (normalized.length === 1) return normalized.toUpperCase();
    return normalized;
  };
  const formatCombo = (value, platform) => String(value || "").split("+").map(normalizeToken).filter(Boolean).map(token => {
    const mapped = modifierLabels[token.toLowerCase()];
    return mapped ? mapped[platform] : formatKey(token, platform);
  }).join(platform === "mac" ? "" : "+");
  const windowsLabel = formatCombo(combo, "win");
  const macLabel = sameOnMac ? windowsLabel : mac || formatCombo(combo, "mac");
  const title = windowsLabel === macLabel ? windowsLabel : `Windows/Linux: ${windowsLabel}; Mac: ${macLabel}`;
  return <span className="ophel-shortcut" title={title}>
      <code>{windowsLabel}</code>
      {windowsLabel !== macLabel && <>
          <span className="ophel-shortcut-separator"> / </span>
          <code>{macLabel}</code>
        </>}
    </span>;
};

export const Icon = ({src, alt}) => <img src={typeof window !== "undefined" && typeof src === "string" && src.startsWith("/images/icons/") && (window.location.pathname === "/docs" || window.location.pathname.startsWith("/docs/")) ? `/docs${src}` : src} alt={alt} width="18" height="18" style={{
  display: "inline-block",
  verticalAlign: "-0.2em",
  margin: "0 0.15em"
}} />;

Ophel 可以导出任何 AI 对话，不仅保留文本，还能保留图片、上传文件、AI 生成的资源、代码产物和推理链——具体取决于平台暴露了什么内容。你可以自由控制输出格式、包含内容和打包方式。

## 如何导出

| 方式     | 说明                                                                                                                                                                                                                                                                                                                                                  |
| ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 浮动快捷按钮 | 点击 <Icon src="/docs/images/icons/tools.svg" alt="工具箱图标" /> 工具箱图标，再点 <Icon src="/docs/images/icons/export.svg" alt="导出图标" /> **导出**，保存为 <Icon src="/docs/images/icons/markdown.svg" alt="Markdown 文件图标" /> Markdown                                                                                                                                                 |
| 快捷键    | <Shortcut combo="ctrl+shift+e" /> 导出当前对话为 <Icon src="/docs/images/icons/markdown.svg" alt="Markdown 文件图标" /> Markdown                                                                                                                                                                                                                                    |
| 会话标签页  | 点击会话行右侧的 <Icon src="/docs/images/icons/more-horizontal.svg" alt="三个点菜单图标" /> 三点菜单，选择 <Icon src="/docs/images/icons/export.svg" alt="导出图标" /> **导出**，再选择 <Icon src="/docs/images/icons/markdown.svg" alt="Markdown 文件图标" /> Markdown、<Icon src="/docs/images/icons/json-file.svg" alt="JSON 文件图标" /> JSON 或 <Icon src="/docs/images/icons/txt-file.svg" alt="TXT 文件图标" /> TXT |
| 分段导出   | 点击会话行的三点菜单，选择 **导出片段...**，可选择并导出对话的特定部分                                                                                                                                                                                                                                                                                                             |

触发导出后，会显示全屏进度遮罩，阻止误操作。Ophel 依次完成加载历史、提取内容、打包资源、保存文件、恢复页面状态。

## 导出格式

| 格式                                                                                  | 保留内容                                  | 适合场景                      |
| ----------------------------------------------------------------------------------- | ------------------------------------- | ------------------------- |
| <Icon src="/docs/images/icons/markdown.svg" alt="Markdown 文件图标" /> Markdown (`.md`)      | 发言人标签、标题、列表、代码块和图片引用                  | 笔记、知识库、文档整理和再次发给 AI       |
| <Icon src="/docs/images/icons/zip-file.svg" alt="Zip 资源包图标" /> Markdown zip 资源包 (`.zip`) | Markdown 文件，以及 `assets/` 中的图片、附件和生成产物 | 包含文件、图片、Canvas 代码或文档产物的对话 |
| <Icon src="/docs/images/icons/json-file.svg" alt="JSON 文件图标" /> JSON (`.json`)           | 带角色、时间戳、模型元数据和正文的结构化消息                | 程序处理、索引和长期归档              |
| <Icon src="/docs/images/icons/txt-file.svg" alt="TXT 文件图标" /> 纯文本 (`.txt`)               | 不带 Markdown 格式的干净文本记录                 | 文本编辑器、全文检索和轻量归档           |

也可以点击 <Icon src="/docs/images/icons/tools.svg" alt="工具箱图标" /> **工具箱** → <Icon src="/docs/images/icons/copy.svg" alt="复制 Markdown 图标" /> **复制 Markdown**，将整个对话以 Markdown 格式复制到剪贴板，无需保存文件。

## 分段导出

分段导出允许你选择并导出对话的特定部分，而非整个对话线程。适用于长对话中只需要某些章节，或希望将不同主题分离为独立文件的场景。

### 如何使用分段导出

<Steps>
  <Step title="打开分段导出对话框">
    在会话标签页中，点击任意会话行的 <Icon src="/docs/images/icons/more-horizontal.svg" alt="三个点菜单图标" /> 三点菜单，选择 **导出片段...**
  </Step>

  <Step title="选择片段">
    Ophel 会根据用户提问自动检测对话片段。你可以：

    * 使用搜索框查找特定片段
    * 点击复选框单独选择片段
    * 使用范围选择（如"1-3, 8"）一次选择多个片段
    * 点击 **选择可见** 选择所有匹配搜索的片段
    * 点击 **反选可见** 翻转当前选择
  </Step>

  <Step title="选择导出模式">
    选择三种输出模式之一：

    * **ZIP（每片段一个 Markdown）** — 每个选中片段成为 zip 包内的独立 `.md` 文件
    * **合并 Markdown** — 所有选中片段合并为单个 `.md` 文件
    * **复制 Markdown** — 将合并后的 Markdown 直接复制到剪贴板
  </Step>

  <Step title="导出">
    点击 **导出选中** 下载或复制你的选择。
  </Step>
</Steps>

### 片段检测

Ophel 将每个用户提问视为新片段的起点。一个片段包括：

* 用户的问题
* AI 的完整回复
* 下一个顶层用户问题之前的任何嵌套往返交流

每个片段显示预览和元数据：用户消息数、AI 消息数和大约字符数。

## 打包模式

在 **设置 → 功能 → 导出 → 打包模式** 中选择 Markdown 导出时如何处理资源文件：

| 模式             | 行为                                |
| -------------- | --------------------------------- |
| **仅 Markdown** | 导出单个 `.md` 文件，图片和附件以文字引用或外部链接形式出现 |
| **Zip 资源包**    | 将 Markdown 文件与所有资源打包为 `.zip` 归档   |

选择 zip 模式后，导出时直接下载压缩包而非独立的 Markdown 文件。

### Zip 包目录结构

```
对话标题.zip
├── 对话标题.md
└── assets/
    ├── images/       ← AI 生成的图片和内嵌图片
    ├── files/        ← 用户上传的附件（PDF、文档等）
    └── documents/    ← 导出的产物（Claude 文档、Gemini Canvas 代码）
```

Markdown 文件内的所有引用使用稳定的相对路径，解压到任何文件夹都能正常显示。

## 各平台导出能力

每个 AI 平台暴露的内容类型不同。下表展示 Ophel 在各平台可以保留的内容：

| 平台                    | 用户附件 | AI 生成图片 | 思维链 | 产物与报告                      |
| --------------------- | :--: | :-----: | :-: | -------------------------- |
| **ChatGPT**           |   ✅  |    ✅    |  —  | Deep Research 报告           |
| **Gemini**            |   ✅  |    ✅    |  ✅  | Canvas 代码、Deep Research 报告 |
| **Gemini Enterprise** |   ✅  |    ✅    |  ✅  | Canvas 代码、Deep Research 报告 |
| **AI Studio**         |   ✅  |    —    |  —  | —                          |
| **Claude**            |   ✅  |    —    |  ✅  | 文档产物                       |
| **Grok**              |   ✅  |    ✅    |  —  | —                          |
| **DeepSeek**          |   ✅  |    —    |  —  | —                          |
| **Doubao**            |   ✅  |    ✅    |  —  | —                          |
| **Kimi**              |   ✅  |    —    |  ✅  | 共享页导出                      |
| **Qwen Studio**       |   ✅  |    ✅    |  ✅  | —                          |
| **Qianwen**           |   ✅  |    ✅    |  —  | —                          |
| **Yuanbao**           |   ✅  |    ✅    |  ✅  | —                          |
| **Z.ai**              |   ✅  |    —    |  ✅  | —                          |
| **ChatGLM**           |   ✅  |    ✅    |  ✅  | —                          |
| **ima**               |   ✅  |    ✅    |  ✅  | —                          |

<Note>
  以上表格反映的是 Ophel 基于各平台当前页面结构可提取的内容。如果平台 DOM
  结构改版，部分能力可能需要适配更新。
</Note>

## 平台特有导出说明

### ChatGPT

* **AI 生成图片** — 仅包含图片的 AI 回复会被纳入 Markdown 和 zip 导出。
* **Deep Research 报告** — 导出时包含报告标题和链接；zip 模式下链接文件保留在 `assets/files/` 目录。
* **用户附件** — 用户提示中上传的图片和链接文件在 zip 模式下打包保留。

### Gemini / Gemini Enterprise

* **Canvas 代码产物** — 导出时自动打开 Canvas 产物，切换到代码标签页，将生成的代码纳入 Markdown 输出。当 Canvas 面板打开时，工具栏会直接显示 **复制 Markdown** 和 **下载 Markdown** 按钮，无需打开完整导出对话框即可快速导出代码。
* **Deep Research 导出** — 覆盖自有对话、对话分享页和报告分享页。导出时自动展开关闭的报告面板，完成后恢复原始状态。
* **Deep Research 报告操作** — 当 Deep Research 报告面板打开时，工具栏新增 **复制 Markdown** 和 **下载 Markdown** 按钮，仅导出当前报告，不影响常规对话导出。

### Claude

* **文档产物** — Markdown 文档产物在 zip 包中导出为链接文件，存放在 `assets/documents/` 目录。
* **思维链** — 启用"导出时包含思维链"后，展开的 Claude 思考块会被包含。
* **附件** — 用户提示中的图片和链接文件在 zip 模式下打包保留，文本与产物链接保持原始回复顺序。

### Kimi

* **共享页导出** — 支持从 Kimi 分享页导出对话、提取大纲和滚动导航。
* **思维链** — 启用"导出时包含思维链"后，可见的思考内容会被包含。
* **用户图片** — 上传的图片在 Markdown 和 zip 导出中保留。

### Deep Research 报告导出（Gemini）

Gemini Deep Research 报告的导出独立于常规对话导出：

* 当报告面板打开时，大纲标签页显示 **对话 / 文档** 源切换器，可独立浏览报告大纲。
* 报告面板工具栏提供 **复制 Markdown** 和 **下载 Markdown** 按钮，仅导出报告内容。
* 执行完整对话导出时，Ophel 会自动展开关闭的报告面板，提取内容后恢复原状。

## 导出设置

在 **设置 → 功能 → 导出** 中配置：

| 设置项       | 说明                   | 默认值        |
| --------- | -------------------- | ---------- |
| 打包模式      | 仅 Markdown 或 zip 资源包 | 仅 Markdown |
| 自定义用户名称   | 导出内容中替代"用户"的名称       | （空）        |
| 自定义 AI 名称 | 导出内容中替代 AI 名称的文字     | （空）        |
| 文件名包含时间戳  | 在导出文件名中添加时间戳后缀       | 关闭         |
| 包含思维链     | 导出支持推理展开的平台的思考过程     | 开启         |

## 复制 Markdown

点击 <Icon src="/docs/images/icons/tools.svg" alt="工具箱图标" /> **工具箱** → <Icon src="/docs/images/icons/copy.svg" alt="复制 Markdown 图标" /> **复制 Markdown**，整个对话以 Markdown 格式复制到剪贴板。当你只需要把内容粘贴到笔记、邮件或另一个 AI 对话中时，比导出文件更方便快捷。

## 分享页导出

Ophel 支持从大部分平台的分享页面导出对话。分享页的浏览器标签标题和导出文件名会使用页面标题（当对话标题未在分享页暴露时）。各平台分享页支持情况：

* **Gemini** — 自有对话、对话分享页和报告分享页
* **Kimi** — 分享页对话（含图片和文件标签）
* **Doubao** — `/thread/` 路径下的分享链接
* **Z.ai** — 对话页和分享页
* **ChatGLM** — 分享页（含思考内容）
* **Qwen Studio** — 常规页和分享页（含思考详情）
