Skip to content

[codex] add agent harness v0 with replay eval - #11

Open
RCF-117 wants to merge 4 commits into
kaikkd:mainfrom
RCF-117:codex/agent-harness-v0
Open

[codex] add agent harness v0 with replay eval#11
RCF-117 wants to merge 4 commits into
kaikkd:mainfrom
RCF-117:codex/agent-harness-v0

Conversation

@RCF-117

@RCF-117 RCF-117 commented Jul 3, 2026

Copy link
Copy Markdown

背景

当前项目已有 LLM workflow、POI/交通/行程校验等后端能力,但这些能力主要散落在 workflow/service 层,还没有统一的 agent tool layer。为了后续支持 tool calling、memory、eval/replay 和更稳定的 agent 编排,本次新增一个 backend-only 的 Agent Harness v0。

这个改动不替换现有 /plan/stream 行为,也不改前端协议,主要是为后续 agent 化提供可测试、可观测、可回放的基础设施。

说明:此分支基于前序 route_sort_day 工具分支继续开发。如果前一个 route sort PR 尚未合并,本 PR 的 diff 里可能会包含前序提交;待前序 PR 合并后,本 PR 的实际审阅范围会收敛到 harness/eval 相关代码。

本次新增

1. Agent 通用协议

新增 backend/app/agent/schemas.py,定义统一的 harness 数据结构:

  • ToolCall
  • ToolResult
  • ToolWarning
  • ToolContext
  • ToolSpec
  • ToolTraceEntry
  • HarnessRequest
  • HarnessRunResult

所有工具统一通过 ToolCall(name, args) 调用,并返回结构化 ToolResult,包含 ok / data / warnings / degraded / error

2. Tool Registry

新增 backend/app/agent/registry.py,提供工具注册与统一调用入口。

目前注册的工具包括:

  • parse_user_intent
  • estimate_visit_duration
  • compute_transit
  • route_sort_day
  • validate_itinerary

未知工具和工具异常都会被包装成结构化错误,方便 agent runner 记录和降级处理。

3. Harness Tool Adapters

新增 backend/app/tools/harness_tools.py,把现有后端能力包装成统一 tool:

  • parse_user_intent_tool:封装现有 intent parser
  • estimate_visit_duration_tool:封装默认停留时间规则
  • compute_transit_tool:封装现有交通估算/降级逻辑
  • route_sort_day_tool:接入已有顺路排序工具
  • validate_itinerary_tool:校验缺坐标、重复 POI、时间顺序、日程结构完整性等

其中 validate_itinerary 会优先使用 stop 的显式 slot 判断早餐/午餐/晚餐/景点/酒店,避免仅依赖 category=eat 导致三餐误判。

4. Deterministic Runner v0

新增 backend/app/agent/runner.py,提供固定流程 harness:

parse_user_intent
-> route_sort_day
-> compute_transit
-> validate_itinerary

它不会调用 LLM,适合离线测试、回归测试和调试 tool trace。

5. LLM-planned Harness Runner

新增:

  • backend/app/agent/planner.py
  • backend/app/agent/live_runner.py
  • backend/app/agent/recorder.py

LLMToolPlanner 会调用现有 llm.stream_chat(...) 生成 tool plan,但执行阶段仍由本地 runner 注入可信参数,避免模型幻觉参数或传入空 stops。

同时 v0 会强制补齐最小工具链:

parse_user_intent
route_sort_day
compute_transit
validate_itinerary

也就是说,LLM 可以参与规划,但不会完全控制执行。

6. Replay Recording & Eval

新增 evals/travel_plan_eval.py 和 replay fixtures:

  • evals/fixtures/travel_plan_replay.jsonl
  • evals/fixtures/agent_harness_live.jsonl

每次 live harness 可以记录:

  • request
  • planner raw response
  • planner tool calls
  • tool trace
  • intermediate state
  • warnings
  • degraded 状态

评估脚本支持旧 workflow days 格式,也支持新的 agent harness record 格式。

当前指标包括:

  • compliance rate
  • degradation rate
  • average stop count
  • missing coordinate rate
  • tool warning count

测试

新增测试覆盖:

  • tool registry 注册、查询、调用和未知工具错误
  • P0 tool adapters
  • deterministic runner trace
  • LLM planner JSON 解析、未知工具过滤、必需工具补齐
  • live harness JSONL recording
  • eval replay metrics

默认测试不会调用 API。只有显式设置:

ITRAVEL_RUN_LIVE_LLM_TEST=1

才会运行 live LLM 测试并记录 replay 数据。

本地验证结果:

81 passed, 1 skipped, 1 warning

设计边界

本次没有:

  • 替换现有 /plan/stream
  • 改前端协议
  • 引入 LangGraph
  • 做完全自主 agent loop
  • 强依赖 function calling
  • 接入非官方小红书/携程接口
  • 移除现有 workflow fallback

目标是先建立轻量、可测试、可回放的 agent harness v0,为后续 tool calling、memory、POI grounding 和 eval 体系打基础。

@RCF-117
RCF-117 marked this pull request as ready for review July 7, 2026 07:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant