ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Operit Markdown 聊天记录导入导出格式完全指南:基于 HTML 注释的对话交换协议

Operit Markdown 聊天记录导入导出格式完全指南:基于 HTML 注释的对话交换协议 AI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆【免费下载链接】OperitThe most powerful AI agent and AI chat software on Android/Operit是一款Android上能力最为强大、发展最久的AI Agent项目地址https://gitcode.com/gh_mirrors/op/Operit点击查看免费下载本文档系统讲解 OperitAndroid 上的 AI Agent 与 AI 聊天应用所采用的 Markdown 聊天记录导入/导出格式。该格式以简洁的 HTML 注释承载元数据让用户无需编写复杂 JSON 即可手工编写对话记录并支持通过 Zip 压缩包批量迁移多个对话。读完本文你将掌握 chat-info / msg 注释的完整语法、默认值规则、格式自动检测逻辑以及导入导出在源码层的实现原理能够自行编写、校验并批量迁移 Operit 聊天记录。为什么选择「HTML 注释 Markdown」格式在导入/导出聊天记录的场景中最常见的做法是导出为结构化 JSON。但 Operit 面向的是「人可以直接阅读、甚至可以手工编写」的交换格式因此采用了基于 HTML 注释的简洁解析模式。简单易写使用keyvalue键值对注释存储元数据无需编写复杂 JSON大量缺省只需指定必要信息其余字段自动生成精准分割基于注释分割消息消息内容纯净不受正文干扰批量支持通过 Zip 压缩包支持多对话一次性导入/导出。该设计理念在格式协议文档中定义为“新版 Markdown 格式聊天记录导入规范”并在导入示例文件中给出了可直接使用的完整样例。关键约定每个 Markdown 文件对应一个独立对话。不再支持在单个文件中使用---分割多个对话---出现时会被视为正文内容的一部分。单文件基本结构一个合法的导入文件包含三个部分chat-info全局元数据注释、若干条msg消息注释、以及紧随其后的消息正文。以下示例取自 chat_import_markdown_example.md!-- chat-info: titlePython 编程讨论, group编程技术 -- # Python 编程讨论 !-- msg: user -- ## User 如何在 Python 中读取 JSON 文件 !-- msg: ai, modelgpt-4 -- ## Assistant *Model: gpt-4* 在 Python 中读取 JSON 文件很简单可以使用内置的 json 模块 python import json # 方法1读取 JSON 文件 with open(data.json, r, encodingutf-8) as f: data json.load(f)关键要点json.load()用于从文件对象读取json.loads()用于从字符串读取 User如果 JSON 文件很大怎么办可以看出文件开头可选的 # 标题、每条消息前的 ## User / ## Assistant 装饰标题在导入时都会被自动忽略或按装饰处理真正驱动解析的是注释标记。 ## chat-info全局元数据注释 文件头部包含 chat-info 注释用于描述整个对话的元信息。 **格式** html !-- chat-info: keyvalue, keyvalue --支持字段均可选字段说明缺省值title对话标题Imported from Markdowncreated创建时间当前导入时间id唯一标识符自动生成 UUIDgroup分组名称从 Markdown 导入示例!-- chat-info: titlePython 学习笔记, group编程 --在源码 MarkdownConverter.kt 中chat-info的解析逻辑位于主解析循环开头命中!-- chat-info:前缀后调用parseSimpleProperties提取键值对其中title与created会被实际消费分别覆盖标题与创建时间created字符串通过parseDate按多种格式尝试解析如ISO_LOCAL_DATE_TIME、yyyy-MM-dd HH:mm:ss等见dateFormatters列表。其余字段如id、group在导入端并不覆盖内部值——id一律重新生成UUID.randomUUID()group统一取本地化字符串markdown_import_from即“从 Markdown 导入”。msg消息元数据注释每条消息以msg注释开头声明角色及可选的模型、时间戳信息。格式!-- msg: role, keyvalue... --支持简写可以直接写角色名无需role前缀。!-- msg: user --等同于!-- msg: roleuser --!-- msg: ai --等同于!-- msg: roleai --支持字段字段说明缺省值role角色 (user/ai)usermodel模型名称markdowntimestamp时间戳自动顺序生成示例!-- msg: user -- !-- msg: ai, modelgpt-4 -- !-- msg: user, timestamp1700000000000 --源码层面的解析细节MarkdownConverter.kt属性按逗号或分号分割keyvalue形式存入映射没有等号的项如简写角色user整体作为 key、值为空字符串存入——这为角色简写提供了统一的数据结构基础角色识别由parseRole完成除user/ai/assistant英文关键字外还支持本地化字符串如中文“用户/助手/系统/模型”取自R.string.message_role_user、R.string.role_assistant等并且会先剔除 emoji 与特殊符号再比对system被映射为usermodel被映射为ai无法识别时返回null此时才回退到默认角色usermodel缺省为字符串markdowntimestamp缺省时按baseTimestamp messageIndex * 100L自动顺序生成保证消息时间戳单调递增显式给出则直接使用。消息内容与装饰标题处理紧跟在msg注释后的内容即为消息正文。若注释后紧接着出现## User或## Assistant形式的标题导入时会自动将该行忽略作为视觉装饰。源码中通过justStartedMessage标志实现该逻辑MarkdownConverter.kt在刚解析完一条msg注释后若遇到以##开头的行且该行经parseRole可识别为角色文本则跳过注释后的空行同样被跳过此后所有非注释行按行追加进当前消息内容直至下一条msg注释出现。也就是说正文中的任何 Markdown 语法代码块、列表、加粗、嵌套标题等都会原样保留导入端不会做内容改写消息内容“纯净”地取自注释之间的区间。格式自动检测如何识别 Markdown 导入文件Operit 的导入流程并不要求用户手动声明格式而是由 ChatFormatDetector.kt 自动判定强匹配内容中任意一行以!-- chat-info:或!-- msg:开头直接判定为 Markdown 格式弱匹配同时满足「存在#开头的 Markdown 标题」与「存在## User|Assistant|AI|System|Model|用户|助手|系统|模型这类整行对话标记」时也判定为 Markdown检测顺序为 Markdown → CSV → JSON含 ChatGPT / Operit / Claude / 通用 JSON 细分→ 纯文本见detectFormat与detectFormatByExtension.md/.markdown扩展名直接映射为 MARKDOWN。导入端的分发逻辑位于 ChatHistoryManager.kt检测结果为ChatFormat.MARKDOWN时实例化MarkdownConverter(context)执行转换转换失败会抛出携带本地化提示文案的ConversionException。导出实现导入格式的镜像Operit 导出 Markdown 时MarkdownExporter.kt生成的产物与导入规范完全互操作头部写入一行chat-info依次携带id、title、created、updated与可选的group同时保留一段 YAML Front Mattertitle/created/updated/group/messages计数用于兼容旧版解析器与提升可读性——导入端 MarkdownConverter.kt 也确实兼容解析旧版 YAML Front Matter每条消息输出!-- msg: role, model..., timestamp... --角色用简写形式模型非markdown时才写出时间戳总是写出随后附上## User/## Assistant装饰标题与*Model: xxx*视觉元信息便于人类阅读消息正文原样写出。由此导出文件可直接作为导入文件使用形成闭合的“导出 → 手工编辑 → 再导入”工作流。Zip 批量导入/导出当对话数量较多时Operit 通过 Zip 压缩包统一管理。导出选择 Markdown 导出多对话时系统生成chat_backup_时间戳.zip。包内每个对话对应一个.md文件文件名为对话标题非法文件名字符\ / : * ? |会被替换为下划线重名文件自动追加(1)、(2)等序号避免覆盖见 ChatHistoryManager.kt使用ZipOutputStream逐条写入。导入将多个符合规范的.md文件打包为.zip后一次性导入系统使用ZipInputStream自动解压并逐个读取包内所有.md文件每个文件被导入为一个独立对话。常见问题Q: 可以在一个文件中混合不同的对话吗A:不再支持。每个对话必须保存为单独的.md文件在单个文件中使用---分隔会被当作正文内容的一部分。源码 MarkdownConverter.kt 中splitConversations直接返回整个文件内容注释明确说明“不再支持通过---分割对话整个文件视为一个对话”。Q: 我可以手动编写这种格式吗A:可以。只需确保文件扩展名为.md且包含!-- msg: ... --注释即可。其余字段均可省略靠缺省值兜底。Q: 为什么我的文件无法导入A:请依次检查文件是否包含!-- msg: ... --注释这是格式检测与消息解析的前提如果是 Zip 包请确保包内是.md文件而不是嵌套压缩包或其他格式确认没有在单个文件中用---尝试分割多个对话。兼容性与边界说明旧版兼容导入端仍支持 YAML Front Matter 头部title:、created:键值可平滑迁移旧格式文件角色映射system角色在导入时被映射为usermodel被映射为ai说明当前对话模型以双角色user/ai为主本地化角色识别与导入分组的文案均走资源字符串values/strings.xml及values-en、values-ro等多语言副本意味着非英文角色名也可被识别格式边界ChatFormat枚举中还包含 OPERIT原生 JSON、CHATGPT、CHATBOX、CLAUDE、GENERIC_JSON、CSV、PLAIN_TEXT 等格式见 ChatFormat.ktMarkdown 只是导入生态中的一环Claude 格式目前回退到通用 JSON 转换器处理。掌握以上规范后你既可以手工编写或程序化生成 Operit 可识别的 Markdown 对话文件也能理解导出产物的每个字段来源实现跨设备、跨工具的聊天记录无损迁移。赞分享AI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆【免费下载链接】OperitThe most powerful AI agent and AI chat software on Android/Operit是一款Android上能力最为强大、发展最久的AI Agent项目地址https://gitcode.com/gh_mirrors/op/Operit点击查看免费下载相关推荐Operit 新版 Markdown 聊天记录导入/导出格式全指南基于 HTML 注释的轻量对话交换协议Operit 新版 Markdown 聊天记录导入/导出格式全指南基于 HTML 注释的轻量对话交换协议 本指南系统讲解 OperitAndroid 端 AAI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆GUI 自动化Operit 聊天记录按会话选择导出从全量导出到多选归档的交互设计与实现Operit 聊天记录按会话选择导出从全量导出到多选归档的交互设计与实现 本文以 Operit 的「设置 数据备份与恢复 聊天记录」导出功能为对象系统讲解其AI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆GUI 自动化微信聊天记录永久保存指南3种格式轻松导出你的珍贵对话微信聊天记录永久保存指南3种格式轻松导出你的珍贵对话 还在担心重要的微信对话会丢失吗想要永久保存那些珍贵的聊天记录吗现在通过这款强大的微信消息管理工具上一篇Chat LangChain 生产环境上线清单下一篇终极指南如何快速掌握Clean Code PHP编码规范提升团队协作效率创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表