# Canonical Record v1

canonical record 是产品数据生成链路的中间元数据格式。它不是最终训练、评测或展示格式。

## 示例

```json
{
  "record_id": "gen_aabbccdd_000001",
  "source": {
    "type": "generated",
    "request_id": "aabbccdd",
    "timestamp": 1755567930500
  },
  "turn": {
    "query": "本轮 query",
    "timestamp": 1755567930500
  },
  "prev_session": [
    {
      "query": "前一轮 query",
      "tts": "前一轮 tts",
      "timestamp": 1755567870500
    }
  ],
  "context": {},
  "label": {
    "dataset_label": "数据集或专题名称",
    "target": "Agent(tag=\"xxx\")",
    "target_type": "agent"
  },
  "dimensions": {
    "complex": false
  },
  "meta": {
    "case_name": "case名称",
    "notes": ""
  }
}
```

## 校验重点

- `turn.query` 必须有值。
- 当前轮 `turn` 不包含 `tts`。
- `prev_session` 最多 10 轮，且按时间从早到晚。
- 相邻轮时间间隔超过 5 分钟时给 warning。
- `label.target` 必须有值。
- `target_type` 只能是 `agent`、`function` 或 `unknown`。
- `dimensions.complex` 必须是布尔值，表示当前 query 是否为复杂任务；它是独立维度，不写入 `label.target`。

## 默认导出

执行 portable `export_dataset_records.py` 时，默认产物包括：

- `records.jsonl`：canonical records，一行一条紧凑 JSON。
- `records.csv`：同事流转表格，字段为 `request_id,timestamp,query,prev_session,context,label,是否迁移Function,function`。

`records.csv` 中的 `prev_session` 和 `context` 是紧凑 JSON 字符串；`prev_session` 中的 `timestamp` 按历史表格习惯输出为字符串。`function` 列会把复杂度和监督标签组合成两行，例如 `complex=false\nAgent(tag="地图导航")`。

如果已有 `records.jsonl` 或 `records.json`，只需要补表格，可以执行 portable `export_dataset_table.py` 或等价工具；默认仍输出到同目录的 `records.csv`。

## 派生格式

训练和评测格式都从 canonical records 转换，不由模型手写：

- `training.jsonl`：每行 `{"system": "...", "instruction": "...", "output": "..."}`，由 `export_training_jsonl.py` 生成；`output` 会输出 `complex=true/false` 加监督标签两行。
- `eval_planning.csv`：字段为 `request_id,newPrompt,query,类别真实标签,code标签,complex`，由 `export_planning_eval_csv.py` 生成；`newPrompt` 会包上 `<|im_start|>system/user/assistant` chat template；`complex` 列来自 `dimensions.complex`，按评测表习惯输出 `TRUE/FALSE`，不是固定默认值。

`instruction` 和 `newPrompt` 使用同一套 prompt 主体，默认包含 `[知识注入]`、`[系统状态]`、`[对话历史]`、`[当前query]`、`[function]`。历史轮次默认最多取 5 轮，且相邻时间间隔不超过 5 分钟。

格式约束：

- `[知识注入]` 必须是多行 JSON 块，默认只输出 `location` 和 `rag` 两个字段。
- `[当前query]` 下一行必须带 `用户:` 前缀。
- `[function]` 后必须保留换行；评测 `newPrompt` 中随后才是 `<|im_end|>`。
- 不要在 `[function]` 下追加 `def Agent(...)`、`def Skill(...)` 等函数签名说明。
