已合并
[Feature]Add AgentHint feature for agent inference #692
[Feature]Add AgentHint feature for agent inference #692
已合并
zengwei创建于 19 天前
zengwei
zengwei
19 天前

1. 合入背景

本 PR 为 Agent 推理引入 AgentHint 特性,允许客户端通过请求体中的 agent_hint 字段传递会话管理、KV 缓存控制和上下文编辑等提示信息。核心变更包括:新增 AgentHintInfo 等 Pydantic 数据模型用于解析和规范化客户端输入;新增 block_offset_translator 模块将消息级索引转换为 PagedAttention 块坐标;在请求验证、分发和调度链路中集成 agent_hint 的解析与块偏移附加逻辑,使调度器能够感知会话亲和性和上下文编辑意图。
关联 ISSUE:#463

2. 修改内容

  • 新增 agent_hint.py 数据模型模块:定义 AgentHintInfo、CacheControl、ContextEdit、ContextManagement 等 Pydantic 模型,以及 parse_agent_hint() 解析函数和 _resolve_session_ids() 会话 ID 规范化逻辑,支持从请求体与 HTTP 头中联合解析 session 标识
  • 新增 block_offset_translator.py 块偏移转换模块:实现 BaseBlockOffsetCalculator 抽象基类及 Dsv4BlockOffsetCalculator / StandardBlockOffsetCalculator 两个模型族计算器,通过 attach_block_offsets() 将 CacheControl.msg_offset 和 ContextEdit.start/end 转换为 PagedAttention 的 block_offset、intra_block_offset、token_offset 坐标
  • 修改请求验证逻辑以支持 session-targeted 编辑:在 inference_server.py 中新增 _has_session_target_edit() 辅助函数,将 _validate_openai_request 的空消息列表校验拆分为两种错误信息,允许存在 session 目标编辑时消息列表为空
  • 在请求分发链路中集成 agent_hint 解析:在 dispatch.py 的 __create_request_info 中调用 ensure_minimum_messages_for_session_edits() 和 parse_agent_hint(),将解析结果注入 RequestInfo.agent_hint_info 字段
  • 在调度策略中集成块偏移附加:在 kv_cache_affinity.py 的 KvCacheAffinityPolicy 中于消息编码后调用 attach_block_offsets(),并在 TokenizerManager 中暴露 is_dsv4 属性以支持 tokenizer 类型判定

3. 资料变更

对原有功能资料不涉及变更

4. 接口变更

对原有接口功能不涉及变更

5. 测试结果

测试场景1

  • 环境:A3 8卡,qwen3-235B
  • 测试内容:对比开关AgentHint,测试JiuwenSwarm Agent,先启动session 1,然后offload session 1的KVC,接着启动多个session 2-N,回到session 1,prefetch session 1的KVC,最后在session 1上进行1次新请求推理
  • 测试结果
指标 AgentHint OFF AgentHint ON ON 相对 OFF
首 Token 延迟 (TTFT) 11,623.54 ms 2,054.92 ms 降低 9,568.62 ms (82.32%)
每 Token 生成时间 (TPOT) 36.47 ms 35.51 ms 降低 0.96 ms (2.63%)
请求端到端延迟 (Request E2E) 35,483.35 ms 5,871.63 ms 降低 29,511.72 ms (71.90%)
Prompt tokens 66,196 53,243 减少 12,953 (19.46%)
Cached tokens 5,504 51,968 增加 46,464
请求级 KVC 命中率 8.33% 97.61% 提升 89.29 个百分点
需要重新 prefill 的 tokens 60,602 1,275 减少 59,327 (97.90%)

测试场景2

  • 环境:A3 8卡,deepseek v4 flash
  • 测试内容:并发启动10个session,每个session结束后,开启AgentHint场景进行主动evict
  • 关闭AgentHint时的结果
指标 数值
有效请求数 10
TTFT 均值 8.0323s
TTFT P50 6.8542s
TTFT P90 10.7152s
TPOT 均值 0.2209s/token
TPOT P50 0.2298s/token
TPOT P90 0.2743s/token
  • 开启AgentHint+主动evict结果
指标 数值
有效请求数 10
TTFT 均值 5.5182s
TTFT P50 3.3983s
TTFT P90 14.4788s
TPOT 均值 0.2106s/token
TPOT P50 0.2038s/token
TPOT P90 0.2459s/token

6. CheckList

PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]

[x] 代码注释完备

[x] 正确记录维测日志

[x] 是否有UT用例

[x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题

likedislike
Pull Request已成功合入, 合并人@tobking
(感谢 zengwei 的贡献)
atomgit-bot
atomgit-bot
19 天前 评论:

变更摘要

本 PR 为 Agent 推理引入 AgentHint 特性,允许客户端通过请求体中的 agent_hint 字段传递会话管理、KV 缓存控制和上下文编辑等提示信息。核心变更包括:新增 AgentHintInfo 等 Pydantic 数据模型用于解析和规范化客户端输入;新增 block_offset_translator 模块将消息级索引转换为 PagedAttention 块坐标;在请求验证、分发和调度链路中集成 agent_hint 的解析与块偏移附加逻辑,使调度器能够感知会话亲和性和上下文编辑意图。

主要改动

  • 新增 agent_hint.py 数据模型模块:定义 AgentHintInfoCacheControlContextEditContextManagement 等 Pydantic 模型,以及 parse_agent_hint() 解析函数和 _resolve_session_ids() 会话 ID 规范化逻辑,支持从请求体与 HTTP 头中联合解析 session 标识
  • 新增 block_offset_translator.py 块偏移转换模块:实现 BaseBlockOffsetCalculator 抽象基类及 Dsv4BlockOffsetCalculator / StandardBlockOffsetCalculator 两个模型族计算器,通过 attach_block_offsets()CacheControl.msg_offsetContextEdit.start/end 转换为 PagedAttention 的 block_offsetintra_block_offsettoken_offset 坐标
  • 修改请求验证逻辑以支持 session-targeted 编辑:在 inference_server.py 中新增 _has_session_target_edit() 辅助函数,将 _validate_openai_request 的空消息列表校验拆分为两种错误信息,允许存在 session 目标编辑时消息列表为空
  • 在请求分发链路中集成 agent_hint 解析:在 dispatch.py__create_request_info 中调用 ensure_minimum_messages_for_session_edits()parse_agent_hint(),将解析结果注入 RequestInfo.agent_hint_info 字段
  • 在调度策略中集成块偏移附加:在 kv_cache_affinity.pyKvCacheAffinityPolicy 中于消息编码后调用 attach_block_offsets(),并在 TokenizerManager 中暴露 is_dsv4 属性以支持 tokenizer 类型判定
likedislike
atomgit-bot
atomgit-bot
19 天前 评论:

代码审查

Now let me write the closing summary.


审查总结

审查覆盖范围

已逐一审查全部 6 个变更文件:

文件 审查结论
motor/coordinator/api_server/inference_server.py 发现 2 个问题 (P2×1, P3×1)
motor/coordinator/domain/agent_hint.py 发现 2 个问题 (P3×2)
motor/coordinator/domain/block_offset_translator.py 发现 1 个问题 (P2×1)
motor/coordinator/models/request.py 无问题
motor/coordinator/router/dispatch.py 无问题
motor/coordinator/scheduler/policy/kv_cache_affinity.py 发现 1 个问题 (P3×1)

按优先级统计

  • P0: 0
  • P1: 0
  • P2: 2
    • _has_session_target_edit 未检查 manage_request,导致校验绕过与消息注入逻辑不一致,可能让空 messages 到达下游 apply_chat_template 引发崩溃
    • block_offset_translator.pycompute_edit_block_offset_prefix_diff_block_offset 缺少 block_size ≤ 0 防护,配置异常时 ZeroDivisionError
  • P3: 4
    • _parse_cache_control 日志范围写错 ([0, n] 应为 [1, n])
    • 未使用的导入 model_validatorSelf
    • _validate_openai_request 错误消息不准确 ("non-empty array" 实际仅检查非 list)
    • TokenizerManager.is_dsv4 属性无外部调用方,死代码

整体风险评估

该 PR 新增 1780 行代码实现 AgentHint 特性,整体代码质量较高,解析与校验逻辑健壮,边界处理较完善。发现的 2 个 P2 问题均为边界场景(manage_request 校验缺口、配置异常时的除零保护),触发概率较低但影响可达请求级崩溃,建议在合入前修复。P3 问题均为代码整洁性改进,不影响功能正确性。

类型 数量
🔴 阻塞 0
🟡 建议 2

💬 仅评论

likedislike
Xxiangjie10成员
19 天前 添加了label:pr-audit-failed
xiangjie10成员
19 天前 评论:
🔍 PR 规范审计未通过,以下项目需要修正:
  • PR 未关联里程碑或 Issue
  • PR 新增代码 1780 行超过 1000 行,且标题未标注"反合"
  • ⚠️ PR 代码变更未包含测试用例(变更文件路径中均不包含 test 或 ut),请确认已经备注原因!

请修正后重新提交,或联系仓库管理员。

likedislike
ascend-robotascend-robot成员
19 天前 添加了label:ascend-cla/yes
此处折叠了235条消息 查看更多
tobkingtobking成员
14 天前 解决了最后一个问题
jason lyu
jason lyu成员
14 天前 评论:

/approve

likedislike
ascend-robotascend-robot成员
14 天前 添加了label:approvedlgtm
tobkingtobking成员
14 天前 关闭了关联的issue
tobkingtobking成员
14 天前 合入了pull request