3.9 KiB
模型流式参数诊断
小型内置动作的参数流仍受 16384 字符保护。超限时关闭输出流、丢弃不完整参数,不执行该次动作;一次新响应重试和可用备用端点耗尽后,只结束当前任务,不进入共享的模型暂停。批次仍遵循“失败即停止”、人工暂停和取消设置。网络故障、认证错误和最终验收保留各自的恢复规则。
请求关联
每个模型请求尝试沿用现有 llm_diagnostic 记录,不另建日志数据库。
| 字段 / 请求头 | 含义 |
|---|---|
request_id / X-Client-Request-Id |
同一次恢复循环内保持稳定的逻辑请求编号;切换备用调用或恢复暂停后可能建立新的逻辑请求 |
attempt_id / X-Client-Attempt-Id |
本次客户端尝试编号;重试时变化,previous_attempt_id 关联前次尝试 |
client_*_id_matches |
实际发送的请求头是否与本地编号一致;调用方已指定的头保留原值 |
server_request_id |
首个有效的 X-Oneapi-Request-Id、X-Request-Id 或 Request-Id,按此前后顺序选择 |
response_x_request_id |
响应中的原始 X-Request-Id,不推定它来自模型上游 |
error_request_id |
SDK 异常带回的编号,不覆盖已经从响应头读取的编号 |
response_id |
SDK 实际返回的 Responses 响应编号 |
编号只接收有长度限制的可打印白名单字符。请求头不控制会话亲和性,不替换 thread-id / session-id。网关自身的重试应使用独立编号或序号,不能假装是一次新的客户端尝试。
参数指纹 v1
tool_observation_layer=langchain_tool_call_chunks 明确表示客户端观测的是 SDK 转换后的参数片段,不是原始 SSE 帧。每工具记录实际可得的 call_id、chunk_index、工具名,以及:
argument_chars:参数片段的 Unicode 字符数之和。argument_bytes/argument_sha256:按原顺序连接片段后,其 UTF-8 字节长度和 SHA256;不解析、重排参数 JSON,也不规范化空白或 Unicode。argument_deltas:非空参数片段数,不能直接与网关原始事件数比较。argument_prefixes:每 4096 字节的累计 SHA256,最多保留前 16 个。可以在分片大小不同、上游预读或中途取消时比较相同字节位置。argument_encoding_valid:遇到不能编码为 UTF-8 的片段时为 false,当前总字节数和总哈希留空,避免伪造可比结果;诊断本身不改变执行流程。
最多记录 64 个工具;超过时设置 tool_stats_truncated=true,总参数字符计数仍继续。诊断不保留参数正文。哈希仅证明已收到的字节前缀,不能证明输出完整或动作成功;完整性仍由响应终止状态和解析校验决定。
跨三端优先使用 response_id + call_id 关联。LangChain 的 chunk_index 可能因文本或推理子块不同于原始 output_index,缺失编号时不能按数组位置猜测。正常的 arguments.done、output_item.done、response.completed 快照不重复计入参数;自定义工具转换、非空初始参数或协议异常需要先核对 SDK 映射,不能仅凭跨层哈希不同认定某一端重复发送。
历史日志没有保存的原始帧无法由新增诊断恢复。HTTP 200 只说明响应头已到达;客户端保护后出现的 499 或 Broken pipe 也不能证明最初原因。网关写入本机下游 writer 成功不等于客户端已消费或执行。
离线验证
tests/unit/test_llm_stream_guard.py 验证保护、有限重试、相同/不同备用端点,以及不会创建或清除其他请求的全局暂停。tests/unit/test_request_diagnostics.py 验证请求编号、超时重试、响应头及单次参数计数。tests/unit/test_argument_fingerprint.py 验证不同分片、中文和 emoji、固定字节前缀、有界统计与异常编码。这些测试不调用真实模型或设备。