Skip to main content

导入与导出 Run

Import 和 export 位于互操作边界。Import 可以创建、追加或替换 Dataset;export 从已有 Dataset 读取完整 Run。 Import 与 export 均接受 ATIF、ACTF、OpenAI Messages、Storyline JSON 和记录级 Compact JSONL。 Import 还接受仅解码的 Codex(codex)与 Claude Code(claude-code)会话 JSONL; export 拒绝这两种格式。

Compact JSONL 每行保留一个 JSON object,不赋予轨迹语义。使用 --input-format compact-jsonl--output-format compact-jsonl--column 映射与 snapshot sync 限制见命令参考。缺少可用 id 的记录会生成稳定的 source_filename#line_number;export 按原始输入字节保留记录。compact import 成功后还会在 dataset 根写入 leaf chronicle.manifest,便于后续 discovery 不必仅为分类打开 Lance (RFC-0015)。

导入到新 Dataset

pchronicle import --from input.json \
--to ./imported --input-format atif

默认 --mode create 会拒绝已有目标。--mode append 用于已有 Storyline Dataset;重复 document_id 默认增加 #N 后缀,也可用 --on-duplicate skip 跳过。--mode replace 会先 把完整导入写入临时路径,确认后以 rename 事务替换已有的本地 Dataset,最后才删除旧数据;要求 交互确认或 --yes。已有对象存储 Dataset 当前不支持原地 replace。普通文件可以自动识别。目录输入会递归扫描 .json.jsonl.ndjson 文件;默认输出会保留其相对 路径。未指定 --input-format 时按文件分别探测类型;无法识别为运行数据格式的 JSON 会跳过并警告:

pchronicle import --from ./corpus --to ./imported
pchronicle import --from ./codex-sessions --to ./codex-ds --input-format codex
pchronicle import --from ./claude-sessions --to ./claude-ds --input-format claude-code

默认输出逐字节保留输入文件。若要把所有解码后的输入规范化并 squash 成输出根目录下的 一个 Storyline Lance Store:

pchronicle import --from ./corpus --to ./normalized \
--output-format storyline

经过验证且非空的 canonical Event Store 会在 JSON 扫描前被识别,并始终创建 Storyline Lance:

pchronicle import --from ./run/events.lance --to ./run/storyline

此模式接受本地和 object-store URI,不修改源,支持 create 或经确认的 replace(不支持 append)。JSON 结果报告 format: "events"output_format: "storyline-lance"fact_rows,不包含 input_bytes。canonical events 不接受显式 --output-format preserve 或 JSON exchange --input-format

squash 后,Dataset 所有规范化表中的 _file_ 都是 .

pchronicle query ./normalized \
--sql 'SELECT _file_, COUNT(*) AS runs FROM dataset.runs GROUP BY _file_'

Storyline 输出中的 document_id 全局唯一;冲突时会确定性地增加 #N 后缀,append 也可用 --on-duplicate skip 跳过。成功的 Storyline Store 不把来源路径保存为可查询信息。需要保留 文件边界时应使用 preserve 输出。

ATIF .jsonl.ndjson 输入会逐条解码其中的非空记录。递归扫描目录时会跳过软链接; 若 --from 显式指定一个指向普通文件的软链接,则仍按单文件导入。只有所有输入和所选 存储输出都成功后才会原子发布完整输出目录。单文件 preserve 导入会使用 trajectories.atif.jsonl/trajectories.atif.ndjson,确保后续查询仍按行式容器读取。stdin 必须 是有限且格式明确的输入:

cat input.json | pchronicle import --from - \
--to ./imported --input-format openai-messages

导入后检查新边界:

pchronicle stats ./imported
pchronicle stats overview ./imported

导出完整 Run

pchronicle export --from ./imported \
--to restored.json --output-format atif

需要时使用文件路径与外部 ID 缩小导出范围:

pchronicle export --from ./imported --to one.json --output-format actf \
--source source.json --session-id session-42 --strict

目标格式无法保留原交换文档时,--strict 会失败。输出文件默认 create-only,覆盖必须显式 请求。

Import/export 不是存储迁移协议,任意 SQL row 也不是可导出的完整 Run。精确参数见 pchronicle 命令参考。格式契约见 运行数据格式,层次边界见 数据契约与 Revision