pChronicle 命令行设计与使用指南¶
本文介绍
pchronicle的公共命令行。当前安装版本的pchronicle --help是该版本可用参数的 准确信息来源。
pchronicle 用于浏览、查询、交换和服务 Agent Run Dataset。它既适合人在终端中探索,
也适合 shell、CI 和 Agent 发起受资源上限保护的只读分析。
按任务查找命令¶
- 先体验产品:
pchronicle onboard query使用临时示例数据,不需要 Dataset 路径。 - 检查 Dataset: 先用
list/ls和stats overview,再编写 SQL。 - 定位 Run 或文本: 使用
find --run-id、--session-id或--match。 - 提出可复现问题: 使用
query --sql或query --file,并显式设置输出与资源上限。 - 提供历史服务: 先完成只读查询,再阅读服务指南使用
serve。
第一次使用可以复制:
pchronicle onboard query
pchronicle list ./trajectory-data
pchronicle query ./trajectory-data --sql 'SELECT COUNT(*) FROM dataset.runs'
后两条命令要求你已有 Dataset;如果还没有数据,完成 onboard query 后继续阅读Dataset 入门。
如果你第一次使用 pChronicle,可以从这里开始:
1. Intro¶
pChronicle¶
pchronicle 围绕 Dataset 提供一组组合式命令。读取命令可以浏览、定位和分析 Run;交换命令负责
导入和导出;agent 与 serve 分别提供交互分析和本地服务入口。
Dataset¶
Dataset 就是 path。 pChronicle 打开这条 path 作为轨迹存储。它可以写成:
- 本地目录或文件(
./local/path); - 对象存储中的 URI 前缀(
s3://bucket/prefix); - 解析到上述位置的 dataset pin(
@name)。
Dataset 内部可以保存一种或多种受支持的运行数据格式。pChronicle 负责发现和规范化这些数据;用户只需要 向命令提供 Dataset,不需要先理解内部文件、分片、投影或版本布局。
每条读取命令都会使用一个内部一致的数据视图。命令开始后底层数据发生变化,不会改变该命令已经产生的结果。
@NAME 明确表示一个 dataset pin。裸字符串始终按路径或 URI 解释:
这种区分可以避免同名目录出现或消失时,命令突然解析到不同位置。
命令总览¶
pchronicle
├── onboard [SECTION] [DATASET]
├── dataset|ds pin|unpin|list|show|set|rename
├── list|ls [DATASET]
├── stats [DATASET]
├── stats overview|agents|models|tools [DATASET]
├── find [DATASET]
├── query [DATASET]
├── import --from SOURCE --to DATASET
├── sync --from DIRECTORY [--mirror DIRECTORY] [--to DIRECTORY]
├── export --from DATASET --to TARGET
├── agent codex|claude [DATASET]
└── serve DATASET...
2. Commands¶
每节依次给出命令原型、一到两个代表性例子和必要说明。方括号表示可选参数,竖线表示互斥选择。
公共参数¶
| 参数 | 默认值 | 用途 |
|---|---|---|
-c, --config FILE |
平台配置目录 | 使用另一份用户配置文件 |
--log-level error|warn|info|debug |
info |
控制 stderr 诊断详细度;serve 同时用它过滤 Warehouse tracing(pchronicle.serve) |
-h, --help |
— | 查看当前层级帮助 |
-V, --version |
— | 查看版本 |
更多细节随各命令说明给出;任何层级都可以使用 --help 查看本机版本的准确语法。
2.1 onboard¶
通过内建示例或自己的 Dataset 体验 pChronicle 工作流。SECTION 可以是 basics、all、concepts、
inspect、analyze、query、formats、find、exchange 或 serve,默认为 basics:列表、汇总和一个 SQL 问题。all 保留完整进阶课程。
交互式终端会在章节之间暂停;pipe、重定向或 --no-pause 输出连续 Markdown。
完整引导还会演示统一的 FTS/JSONB find 表达式、Storyline Lance 导入导出以及只读 Web/API
边界;使用 pchronicle onboard find DATASET 可以直接查看检索语法。
2.2 dataset(pin)¶
pchronicle dataset pin default ./trajectory-data
pchronicle dataset show default
pchronicle dataset pin local ./trajectory-data
pchronicle dataset pin prod s3://bucket/evals
pchronicle dataset pin secure s3://bucket/evals --ak "$AWS_ACCESS_KEY_ID" --sk "$AWS_SECRET_ACCESS_KEY"
pchronicle dataset pin minio s3://bucket/evals --endpoint http://127.0.0.1:9000 --region us-west-2 --ak 123 --sk 123
pchronicle dataset pin regional s3://bucket/evals --region us-west-2
pchronicle dataset pin team catalog://127.0.0.1:8081 --ak USER_AK --sk USER_SK
pchronicle dataset set prod s3://new-bucket/evals
pchronicle dataset list
pchronicle stats @prod
default 是保留 pin:省略 Dataset 参数时使用,必须是本地目录。
其他 pin 只改用户配置,不移动或删除 Dataset。名称使用小写字母、数字、点、下划线和连字符,并以小写字母开头;codex/claude/claude-code 保留。
用户配置(-c / PCHRONICLE_CONFIG)使用 [pins.<name>]:
[pins.default]
uri = "/abs/path/to/warehouse"
[pins.prod]
uri = "s3://bucket/evals"
endpoint = "http://127.0.0.1:9000"
region = "us-west-2"
access_key = "..."
secret_key = "..."
旧键(如 default_warehouse、aliases)会被拒绝。dataset list 还会显示内置 @codex / @claude / @claude-code。
S3 凭证用 --ak/--sk 写在同一 pin 表中,不会被 dataset list / dataset show 打印。
catalog://127.0.0.1:PORT pin 是 Directory locator:@team/prod 换票打开 path,
@team 列出可访问 Datasets。详见 RFC-0013。
2.3 list¶
pchronicle list [DATASET] [--sources] [--physical] [--format auto|table|json] [--errors report|strict]
[--max-files N] [--max-entries N]
pchronicle list
pchronicle list @prod --sources --physical --format json --errors strict
pchronicle list @prod --sources --format json
list(ls)列出当前路径的一层 children,体验对齐 shell ls。若某一子目录是 Dataset
(含 chronicle.manifest 或其它叶子标记),同时显示类型和轨迹数。--sources 会
打开该路径并打印 Snapshot 成员(query 会合成的虚拟 dataset)。--physical 增加大小、
修改时间和存储版本信息。还可以用 --max-files 和 --max-entries 限制发现范围。
--errors report 会报告坏数据项并继续;strict 遇到第一个坏数据项即失败。
2.4 stats¶
pchronicle stats [DATASET] [--format auto|table|json] [--errors report|strict] [--timeout 30s]
[--max-files N] [--max-entries N]
结果包含 Dataset 的 ready、degraded 或 error 状态,各类数据计数、counts_complete,以及
canonical Event Store 的 Storyline projection 状态。还可以用 --max-files 和 --max-entries
限制检查范围。stats 不会创建、同步或修复 projection。
报告型子命令(原 analysis)挂在同一入口下:
pchronicle stats <overview|agents|models|tools> [DATASET]
[--format auto|table|jsonl|csv|tsv]
[--limit 100] [--max-output-bytes 8MiB] [--timeout 30s]
| 报告 | 内容 |
|---|---|
overview |
数据可用性,以及 Run、Step、Agent、Model、tool call 总览 |
agents |
按 Agent identity 和 version 聚合 |
models |
区分 Run 声明的 model 和实际观察到的 Step model |
tools |
按 normalized function name 聚合,并报告 duration coverage |
内建报告用于常见、稳定的统计。需要任意筛选、join 或聚合时使用 query。
2.5 find¶
pchronicle find [DATASET]
(--run-id ID|--document-id ID|--session-id ID|--match EXPRESSION)
[--source PATH] [--step-id N] [--match EXPRESSION ...]
[--format auto|table|json] [--max-results N]
pchronicle find @prod --session-id session-42
pchronicle find ./dataset \
--source nested/source.json \
--session-id session-42 --step-id 7
pchronicle find ./dataset \
--match "timeout" --match "retry" --format json
pchronicle find ./dataset \
--match '$.tags=important' --match '$.priority=2' --format json
外部 ID 不保证在整个 Dataset 内唯一。没有 --source 时,同一个 ID 可以返回多个候选;结果中的
source_path 可以供下一次查询消除歧义。--match 是统一检索表达式:普通关键词搜索 Storyline
Step 内容并使用 FTS/Jieba 索引,#system(prompt) 等形式可以限定字段,AND、OR、NOT 用于
组合条件;$.path=value(或 #json("$.path")=value)按 JSONPath 对 JSONB 列做精确值匹配。仅
JSON 表达式当前搜索 Run 级 JSONB,和文本混合时搜索 Step 级 JSONB。可以重复 --match 要求所有表达式
同时满足;显式使用 #json.metrics(...) 时即使没有文本条件也会检索 Step 级 JSONB。CLI 与 Web
共用该表达式、报告的 search.scope 和 snapshot_id;Web UI 可以对返回字段做高亮和截取,
不改变命中集合。使用 --format 和 --max-results 控制结果形式和数量。每条结果还包含有界的 preview
摘要,便于在继续查询前判断候选是否正确。
JSON 输出还会报告 search.mode(fts、json、fts+json 或 identity)、search.scope(steps 或 runs)
以及 FTS 可用性和分词器元数据。
当前语法见 Query Model。
RFC-0012 是已接受的决策记录;与已安装
CLI 不一致时以 CLI 为准。
2.6 query¶
pchronicle query [DATASET|--mount NAME=DATASET ...] (--sql SQL|--file FILE_OR_STDIN)
[--format auto|table|jsonl|csv] [--output PATH_OR_STDOUT]
[--max-output-rows N] [--max-output-bytes BYTES] [--timeout 30s]
pchronicle query ./dataset \
--sql 'SELECT COUNT(*) AS runs FROM dataset.runs'
pchronicle query \
--mount live=./live \
--mount archive=@archive \
--sql 'SELECT * FROM live.runs
UNION ALL
SELECT * FROM archive.runs'
--file 从文件读取 SQL,--file - 从 stdin 读取;--format、--output、输出上限和 --timeout
控制执行结果。一条命令只接受一条只读 statement,DDL、DML、COPY 和多语句会被拒绝。使用
--mount 后没有隐式 dataset schema,SQL 必须使用 mount 名。
2.7 import¶
pchronicle import -f|--from SOURCE -t|--to NEW_DATASET
[-i|--input-format FORMAT] [-o|--output-format preserve|storyline|compact-jsonl]
[--replace] [--append] [--on-duplicate suffix|skip] [--yes]
[--resume] [--wal-dir DIR] [--reset]
[--column NAME=JSON_PATH]... [--max-input-bytes BYTES]
pchronicle import \
-f input.json -t ./imported -i atif
pchronicle import \
-f ./corpus \
-t s3://bucket/normalized \
-o storyline
pchronicle import \
-f more.json -t ./normalized --append --on-duplicate skip
pchronicle import \
-f rebuilt.json -t ./normalized --replace --yes
pchronicle import \
-f s3://bucket/corpus -t s3://bucket/out -o storyline --resume
pchronicle import \
-f ./jsonl-root -t ./records.lance \
-o compact-jsonl \
--column id=$.event.id --column timestamp=$.event.time \
--column model=$.payload.model
长参数分别是 --from、--to、--input-format 和 --output-format。短 option 始终只有一个字符,
因此格式参数使用 -i 和 -o,而不是 -if 和 -of。文件和目录默认自动识别输入格式;stdin
必须显式指定 -i。preserve 保留文件边界和相对路径,storyline 合并为 normalized Store;
对象存储目标必须使用 storyline。
长时间 Storyline import 会在 ./.pchronicle-import-wal/<job_id>/ 写入本地 checkpoint WAL
(job.json、done.jsonl、failed.jsonl)。同一 --from/--to 指纹下使用 --resume 可跳过
已标记 done/failed 的源;--wal-dir 覆盖 WAL 根目录;--reset 会先删除该 job 的 WAL。
decode 与可跳过的 commit 失败会写入 WAL 与 import.log,进程继续处理其余源。
| Format | Import | Export |
|---|---|---|
atif |
是 | 是 |
actf |
是 | 是 |
openai-messages |
是 | 是 |
storyline |
是 | 是 |
codex |
是 | 否 |
claude-code |
是 | 否 |
compact-jsonl |
是 | 是 |
Codex 和 Claude Code session 是 decode-only 输入格式。默认创建要求目标不存在。--append 要求目标是已有 Storyline Dataset;
重复 document_id 默认增加 #N 后缀,也可用 --on-duplicate skip 跳过。--replace 会先将完整导入
写入临时路径,再将旧本地 Dataset rename 到备份路径、将新 Dataset rename 到正式路径,确认新路径
发布后才删除备份;因此必须交互确认或传入 --yes。对象存储 Dataset 的 replace 会先清空目标前缀再写入(非原子)。
Compact JSONL 是记录存储,不会转换或推断轨迹语义。指定
--input-format compact-jsonl 或 --output-format compact-jsonl 均会选择该格式。输入必须是本地
.json、.jsonl 或 .ndjson 文件或目录树;JSON object 和 array 都会被接受,每个 JSON 文档
会成为一条 record,数组会完整保留。缺失或无效的 id 和 timestamp 会获得稳定的
source_filename#line_number 值,默认路径分别为 $.id 和 $.timestamp。--column id=PATH 与
--column timestamp=PATH 用于覆盖默认路径,其他 --column NAME=PATH 会增加 nullable JSONB
投影列。Compact import 支持本地 create 和经确认的 replace,不支持 stdin、对象存储目标或
append。
2.8 sync¶
pchronicle sync --from DIRECTORY
[--mirror DIRECTORY] [--to DIRECTORY]
[--input-format FORMAT] [--suggested-format FORMAT]
[--column NAME=JSON_PATH]...
[--interval DURATION] [--once]
sync 是常驻轮询器:监听源目录下的 .json、.jsonl 和 .ndjson,将变更合并到 pending
池,并按 --interval 做整树 snapshot 重建。--mirror 与 --to 至少提供一个,也可同时提供:
--mirror:把源树按 Compact JSONL 规则写入 Compact Lance Dataset(record-level;可用--column)。每个成功批次原子替换该目标。--to:把源轨迹转换为 Storyline Lance Dataset(可用--input-format/--suggested-format)。
一个批次内启用的目标全部成功后才清理 pending;失败会保留变更并指数退避重试。--once
只执行一次初始批次后退出。本地目标必须位于源目录之外。
若 --input-format compact-jsonl,只能配合 --mirror(不能与 --to 同用):每个成功批次
重新扫描整个目录,并原子替换 --mirror 指向的 Compact Lance 快照。
2.9 drop¶
drop 永久删除本地 Dataset 目录或对象存储前缀。默认要求交互确认,--yes 可跳过确认;命令会
拒绝删除文件系统根目录或整个对象存储 bucket。
2.10 export¶
pchronicle export -f|--from DATASET -t|--to TARGET -o|--output-format FORMAT
[--source PATH] [--run-id ID|--document-id ID|--session-id ID] [--where EXPRESSION]
[--strict] [--overwrite] [--max-trajectories N] [--max-output-bytes BYTES] [--timeout 30s]
pchronicle export \
-f ./imported -t restored.json -o atif
pchronicle export \
-f ./imported \
-t - -o actf --session-id session-42 --strict
长参数分别是 --from、--to 和 --output-format。过滤条件包括 --source、--run-id、
--document-id、--session-id 和 --where;--to - 直接写 stdout。--strict 要求转换保留
原始 exchange document,失败时不产生部分输出。文件和对象存储输出默认 create-only,只有显式
--overwrite 才允许原子替换。
导出 Compact JSONL 时使用 --output-format compact-jsonl,目标必须是本地目录,且不支持
--source、ID 过滤或 --where,以保持原始 JSONL 文件的目录边界与字节内容。
2.11 agent¶
pchronicle agent <codex|claude> [DATASET]
[--ask QUESTION|--ask-file FILE_OR_STDIN] [--no-overview] [--dry-run]
默认先执行有界 status 和紧凑的 stats overview,再进入提问;--no-overview 只跳过
overview。问题也可以通过 --ask-file 从文件或 stdin 读取,--dry-run 用于预览启动内容。
Agent 注入是行为引导,不是 filesystem、network 或 tool permission 沙箱。
2.12 serve¶
pchronicle serve ./trajectory-data
pchronicle serve --listen 127.0.0.1:8080 train=./train eval=./eval
pchronicle serve --catalog-config catalog.toml --listen 127.0.0.1:8081
监听地址只允许 loopback。命名挂载提供稳定的 SQL 别名。
--open 打开 Web UI,--home-link TEXT=PATH 增加同源导航链接。
--catalog-config 启用 Directory 和数据操作认证,不能与位置参数挂载同时使用。
通过 pchronicle serve catalog 配置 Dataset 和用户授权,存储凭证按后端与 worker
隔离。启动就绪 JSON 包含 warehouse_endpoint。
刷新先构建新 Snapshot 再切换读者,失败时保留旧视图。数据写入使用 CLI import。
日志写入 stderr,--log-level 控制详细程度。失败 API 响应包含 code、message
和 request_id,内部错误细节保留在服务日志。
Catalog 管理¶
Directory ACL 文件包含用户、datasets(libraries)和 grants。配置文件不存在时,管理命令会自动创建。
pchronicle serve catalog issue --catalog-config FILE NAME
pchronicle serve catalog grant --catalog-config FILE NAME DATASET...
pchronicle serve catalog revoke --catalog-config FILE NAME DATASET...
pchronicle serve catalog dataset add --catalog-config FILE NAME --uri URI
[--endpoint URL] [--region REGION] [--access-key KEY] [--secret-key KEY]
pchronicle serve catalog dataset remove --catalog-config FILE NAME...
pchronicle serve catalog dataset list --catalog-config FILE
issue 生成用户 AK/SK 并只显示一次 secret;dataset add 只登记 URI 与可选后端存储凭据,
不创建或删除对象存储数据;grant/revoke 增减该用户可打开的 library 名称(v1 是库成员关系,
不是细粒度 --permission 标志)。
公共输出与退出状态¶
stdout 只包含命令结果、导出内容或 readiness JSON;stderr 包含 Dataset 版本 metadata、warning、
进度和错误。--log-level error 可以关闭成功诊断,但不会改变 stdout 或退出码。
auto 在 TTY 中为 dataset list、list/ls、stats、find 选择 table,为 query、stats reports 选择 table;
相同命令在 pipe 中分别选择 JSON 和 JSONL。脚本中建议显式指定格式。
| Exit code | 含义 |
|---|---|
| 0 | 命令按所选 error policy 完成 |
| 1 | 未分类内部错误 |
| 2 | 参数、输入或操作不合法 |
| 3 | 配置、Dataset、数据项或实体不存在 |
| 4 | create-only 目标或身份冲突 |
| 5 | 行数、字节数、文件数或队列资源超限 |
| 6 | timeout 或外部依赖暂时不可用 |
错误第一行带稳定 code,例如 error[invalid_request]: --timeout must be greater than zero。
--log-level debug 会增加脱敏后的原因链。颜色根据 TTY 和 NO_COLOR 自动决定,机器格式不含 ANSI。
3. Examples¶
从本地文件开始¶
pchronicle dataset pin local ./trajectory-data
pchronicle dataset pin default @local
pchronicle import \
-f ./training.json \
-t ./trajectory-data/training \
-i openai-messages
pchronicle list
pchronicle stats
pchronicle stats overview
比较线上和归档 Dataset¶
pchronicle dataset pin live s3://bucket/live
pchronicle dataset pin archive s3://bucket/archive
pchronicle query \
--mount live=@live \
--mount archive=@archive \
--sql 'SELECT model_name, COUNT(*) AS steps
FROM (
SELECT model_name FROM live.steps
UNION ALL
SELECT model_name FROM archive.steps
)
GROUP BY model_name
ORDER BY steps DESC'
找到并严格导出一条 Run¶
pchronicle find @prod --session-id session-42 --format json
pchronicle export \
-f @prod \
-t session-42.actf.json \
-o actf \
--source nested/source.json \
--session-id session-42 \
--strict
在 CI 中使用¶
pchronicle \
-c ./ci-config.toml \
--log-level error \
status ./fixtures \
--format json > status.json
pchronicle \
-c ./ci-config.toml \
--log-level error \
query ./fixtures \
--file checks.sql \
--format jsonl > checks.jsonl
定位后再写 SQL 见 发现并查询,交换见 导入与导出,只读服务见 本地服务 Dataset。 Snapshot 构造见 Snapshot 设计。
请求执行诊断¶
Requests 标签页展示当前浏览器标签页会话中的近期 API 请求的 request ID、HTTP 结果、执行阶段和耗时。
左下角 Local / profile 上方的状态提示可打开该页。选择请求或输入 request ID,即可在请求
尚未结束时查看进度。Worker 排队、启动和执行分别计时;目录浏览与 Runs 查询报告各自的
执行阶段。pending 表示尚未开始,skipped 表示未使用该阶段。阶段描述应用操作,并非
逐条 DNS、TCP 或 S3 请求。目录返回 200 但仍在后台刷新时,会显示相应提示。
GET /api/requests/{request_id}(也支持 /api/v1)返回实时快照:
request_id、method、path、state、elapsed_ms、status、error、note、
phases(name、state、elapsed_ms),以及可选的嵌套 worker 快照。
该接口由前置服务直接处理,不等待业务 worker。
追踪需要显式开启:原请求和诊断查询必须携带同一个随机生成的 32 位十六进制
x-pchronicle-observer 请求头;原请求可通过 x-request-id 指定 ID,以便完成前查询。
UI 自动生成这两个请求头。Observer token 是私有查询凭证,不替代 catalog 身份认证,
其他 token 无法访问该记录。服务端最多保留 512 条记录、最长 10 分钟,仅保存在内存中,
重启即清空。记录不存在、过期或无权访问时均返回 404。UI 保留最近 40 条,每秒查询未完成
请求;诊断连接失败会单独提示,可手动重试。记录不包含查询参数、请求体或凭据;内部错误
详情仍需通过 request ID 在服务端日志中定位。