# 附录：自适应奖励payload数据格式说明
本附录面向需要编写复杂奖励脚本的用户，完整说明payload中所有可用字段。
对于大多数奖励脚本，您只需要关注以下字段即可：
- reference_output
- trajectory.root.output
- trajectory.steps（及其中的 type、name、input、output、status）
训练时系统注入到{{payload}}中的数据为JSON字符串，解析后的完整结构如下：
```
payload
├── input: str                              # Agent接收到的用户输入，与数据集中的input字段一致
├── reference_output: str                   # 数据集中的期望输出（标准答案）
└── trajectory: object                      # Agent本次运行的完整轨迹数据
    ├── meta: 轨迹元信息                     # 通常在奖励计算中不直接使用
    │   ├── trajectory_id: str              # 轨迹唯一标识ID，以traj_开头后跟32位十六进制字符
    │   ├── session_id: str?                # 所属会话ID，以sess_开头。同一会话下的多条轨迹共享此ID。可不填
    │   ├── trace_ids: list<str>            # 关联的分布式追踪ID列表，可在"调用链分析"中定位原始日志
    │   ├── trajectory_type: enum           # 轨迹类型：single | multi_agent | async | human_in_loop
    │   ├── parent_trajectory_id: str?      # 父轨迹ID，多Agent协作场景下关联父轨迹。可不填
    │   ├── task_hash: str?                 # 任务输入的哈希值，同一任务的不同采样轨迹共享此哈希。可不填
    │   ├── created_at: int                 # 创建时间戳
    │   ├── updated_at: int                 # 最后更新时间戳
    │   └── tags: dict<str, str>            # 标签字典，常见标签：rollout_id（推演ID）、attempt_seq（重试序号）、mode（数据划分）
    │
    ├── root: Agent任务汇总                  # 奖励代码中最常用的字段，记录本次运行的最终结果汇总
    │   ├── step_id: str                    # 本次运行的唯一标识ID
    │   ├── name: str                       # 智能体或工作流名称
    │   ├── description: str?               # 智能体或工作流描述信息。可不填
    │   ├── input: str                      # 用户发送的原始问题文本
    │   ├── output: str                     # Agent最终返回给用户的回复文本，奖励脚本中最核心的字段
    │   ├── status: enum                    # 运行最终状态：success | failed | cancelled
    │   ├── timestamp: int                  # 开始处理时间戳（毫秒）
    │   ├── duration: int                   # 总耗时（毫秒）
    │   ├── success: bool                   # 运行是否成功完成
    │   ├── error: ErrorInfo?               # 运行失败时的错误信息。可不填
    │   ├── final_reward: float?            # 最终奖励值，所有步骤即时奖励的累加和。可不填
    │   └── summary: ExecutionSummary       # 执行统计汇总，提供快速访问的统计数字，无需遍历steps
    │       ├── llm_stats: LLMStats         # LLM调用统计
    │       │   ├── call_count: int         # LLM调用总次数
    │       │   ├── total_input_tokens: int # 总输入Token数
    │       │   ├── total_output_tokens: int # 总输出Token数
    │       │   ├── total_tokens: int       # 总Token数
    │       │   ├── total_duration: int     # 总LLM耗时（毫秒）
    │       │   └── models_used: list<str>  # 使用的模型列表
    │       ├── tool_stats: ToolStats       # 工具调用统计
    │       │   ├── call_count: int         # 工具调用总次数
    │       │   ├── success_count: int      # 工具调用成功次数
    │       │   └── tools_used: list<str>   # 使用的工具名称列表
    │       └── step_count: int             # 总步骤数
    │
    └── steps: list<Step>                   # 执行步骤列表，按执行顺序排列
        ├── step_id: str                    # 当前步骤的唯一标识ID
        ├── parent_id: str?                 # 父步骤ID，直接归属于root时为root的step_id
        ├── name: str                       # 步骤名称（工作流节点名称或工具名称）
        ├── type: enum                      # 步骤类型：llm | tool | agent | retrieval | memory | planning | handoff | checkpoint
        ├── status: enum                    # 步骤状态：pending | running | success | failed | skipped
        ├── timestamp: int                  # 开始执行时间戳（毫秒）
        ├── duration: int                   # 步骤执行耗时（毫秒）
        ├── input: str?                     # 步骤输入内容（LLM提示词或工具参数，字符串格式）
        ├── output: str?                    # 步骤输出结果（字符串格式）
        ├── reward: float?                  # 该步骤的即时奖励值。可不填
        ├── cumulative_reward: float?       # 从第一步到当前步骤的累计奖励值。可不填
        ├── episode_done: bool?             # 是否结束当前episode，多轮交互中间步骤为false、最后一步为true。可不填
        ├── error: ErrorInfo?               # 步骤执行失败时的错误信息。可不填
        ├── metadata: dict                  # 扩展元数据字典
        │
        ├── llm_call: LLMCall?             # LLM调用详情（仅type="llm"时存在）
        │   ├── call_id: str               # 本次LLM调用的唯一ID
        │   ├── model: str                 # 实际调用的模型名称
        │   ├── messages: list<Message>    # 发送给模型的完整消息列表
        │   │   └── Message                # 每条消息
        │   │       ├── role: enum         # 消息角色：system | user | assistant | tool
        │   │       ├── content: str       # 消息文本内容
        │   │       ├── tool_calls: list<LLMToolCall>?  # 模型发起的工具调用请求，仅role=assistant时存在。可不填
        │   │       │   └── LLMToolCall   # 每项工具调用请求
        │   │       │       ├── call_id: str       # 工具调用唯一ID
        │   │       │       ├── tool_name: str     # 请求调用的工具名称
        │   │       │       └── parameters: dict   # 调用参数字典
        │   │       ├── tool_call_id: str? # 工具调用结果对应的调用ID，仅role=tool时生效，关联assistant消息中tool_calls的call_id。可不填
        │   │       ├── token_ids: list<int>?    # Token ID列表，用于RL训练，奖励脚本一般不需要。可不填
        │   │       └── logprobs: list<TokenLogProb>?  # Token对数概率列表，用于RL训练，奖励脚本一般不需要。可不填
        │   ├── tool_definitions: list<ToolDefinition>?  # 本次调用可使用的工具定义列表。可不填
        │   │   └── ToolDefinition         # 每项工具定义
        │   │       ├── type: str          # 工具类型，当前固定为"function"
        │   │       └── function: FunctionDefinition  # 函数定义
        │   │           ├── name: str              # 工具/函数名称
        │   │           ├── description: str?      # 工具功能描述。可不填
        │   │           └── parameters: dict?      # JSON Schema格式的参数定义。可不填
        │   ├── input_tokens: int          # 输入Token数量
        │   ├── output_tokens: int         # 输出Token数量
        │   ├── duration: int              # LLM调用耗时（毫秒）
        │   ├── ttft: float?               # 首Token响应时间（秒）。可不填
        │   ├── finish_reason: str?        # 停止生成原因，如"stop"正常结束、"length"达到长度限制。可不填
        │   └── params: LLMCallParams?     # 模型调用参数。可不填
        │       ├── temperature: float?    # 可不填
        │       ├── top_p: float?         # 可不填
        │       └── max_tokens: int?      # 可不填
        │
        └── tool_call: ToolCall?           # 工具调用详情（仅type="tool"时存在）
            ├── call_id: str               # 本次工具调用的唯一ID，可关联LLM消息中tool_calls的call_id
            ├── tool_name: str             # 调用的工具名称
            ├── tool_description: str?     # 工具功能描述。可不填
            ├── parameters: dict           # 调用参数字典（结构化格式，可直接按字段读取）
            ├── result: Any?               # 工具执行返回的结果（保留原始数据类型）。可不填
            ├── duration: int              # 工具调用耗时（毫秒）
            └── success: bool              # 工具调用是否执行成功，奖励脚本判断工具执行结果的关键字段
```
表1常用访问路径速查表 
| 想做什么           | 代码写法                                                                                  |
|:---|:---|
| 获取标准答案       | data\["reference_output"\]                                                             |
| 获取Agent最终回复 | data\["trajectory"\]\["root"\]\["output"\]                                             |
| 判断任务是否成功    | data\["trajectory"\]\["root"\]\["success"\]                                          |
| 遍历所有步骤        | for step in data\["trajectory"\]\["steps"\]                                          |
| 筛选工具调用步骤      | if step\["type"\] == "tool"                                                          |
| 获取工具调用名称     | step\["name"\] 或 step\["tool_call"\]\["tool_name"\]                                  |
| 获取工具调用参数      | step\["tool_call"\]\["parameters"\]（dict，直接读字段）或 json.loads(step\["input"\])（str，需解析） |
| 判断工具是否执行成功   | step\["tool_call"\]\["success"\]                                                        |
| 筛选LLM调用步骤      | if step\["type"\] == "llm"                                                            |
| 获取LLM可用的工具列表   | step\["llm_call"\]\["tool_definitions"\]                                            |
| 获取LLM请求调用的工具   | step\["llm_call"\]\["messages"\]中role=assistant的tool_calls                           |
| 获取Token总消耗   | data\["trajectory"\]\["root"\]\["summary"\]\["llm_stats"\]\["total_tokens"\]         |
| 获取已使用的工具列表  | data\["trajectory"\]\["root"\]\["summary"\]\["tool_stats"\]\["tools_used"\]            |
   
表2易混淆字段区分 
| 易混淆项                                  | 区别说明                                                                 |
|:---|:---|
| step.input vs tool_call.parameters  | step.input是**字符串** （需json.loads解析），tool_call.parameters是**字典**（直接读字段）。 |
| step.output vs tool_call.result       | step.output是**字符串** ，tool_call.result保留**原始数据类型**（dict/list等）。       |
| step.duration vs tool_call.duration  | step.duration是步骤级耗时，tool_call.duration是工具调用级耗时，通常数值相同。              |
| step.name vs tool_call.tool_name    | 大致对应，但step.name语义更泛（工作流节点名称），tool_call.tool_name明确是工具名称。              |
| messages\[\].tool_calls vs tool_call | tool_calls是LLM**请求调用** 的工具（输入侧），tool_call是**实际执行**的工具调用结果（输出侧）。     |
| root.output vs steps\[-1\].output     | root.output是Agent最终回复，steps\[-1\].output是最后一步的输出，多数情况一致但语义不同。         |
   
