☰
Strands Evals v1.2.0 发布解读:OpenInference 多框架追踪支持与技能级评估器实战指南
2026/9/27 6:58:44 网站建设 项目流程
  • 人工智能
  • 大模型
  • AI Agent
  • Agent 框架
  • 多智能体
  • 工具调用
  • MCP 服务

【免费下载链接】harness-sdk

Build an agent harness and control it end-to-end. Open-source SDK for production AI agents in Python & TypeScript - any model, any cloud.

项目地址:https://gitcode.com/GitHub_Trending/sdkpython13/harness-sdk
点击查看免费下载

本文基于strands-agents/evalsv1.2.0 版本发布说明(changelog)撰写,围绕该版本在tracing(追踪)与evaluators(评估器)两大领域的关键更新展开:新增 Claude Agents、OpenAI Agents SDK 的 OpenInference 映射支持、多智能体追踪根 Span 选择修复、bridge_parent_gaps行为变更,以及面向技能型 Agent 的SkillSelectionAccuracyEvaluator。读完本文,你将掌握如何把第三方框架的 OTel 追踪接入 Strands Evals 评估管线、如何利用detect_otel_mapper自动选择映射器,以及如何对带技能(Skills)的 Agent 进行技能选择准确率评估。

版本概览

v1.2.0 发布于 2026-08-21,是一个完全向后兼容(全部条目breaking: false)的版本,共包含 8 项变更,覆盖两个核心领域:

类型领域变更内容作者
feattracing新增 Claude Agents OpenInference 集成测试(PR 353)liramon2
fixtracing多智能体追踪中按最早start_time选择根 Agent Span(PR 371)liramon2
fixtracingbridge_parent_gaps改为返回新 Span 而非原地修改(PR 375)liramon2
feattracingOpenInference 映射器新增 OpenAI Agents SDK 支持(PR 366)liramon2
featevaluators新增面向技能型 Agent 的技能级评估器(PR 330)sangminwoo
fixevaluators降低针对新 session mappers 的集成测试波动(PR 374)liramon2
othercommunity升级 mypy 依赖至<3.0.0(PR 368)Unshure
othercommunity升级opentelemetry-instrumentation-langchain至>=0.40.0,<0.63.0(PR 369)Unshure

其中最具实际价值的更新是OpenInference 映射器对 Claude Agents 与 OpenAI Agents SDK 的双重支持,以及技能级评估器的引入。下面分别深入展开。

OpenInference 映射器:打通第三方 Agent 框架的追踪数据

背景:为什么需要 OpenInference 映射器

Strands Evals 的评估管线以统一的Session对象为核心——它记录 Agent 的执行轨迹(trajectory),是TaskOutput的主要组成部分。但不同 Agent 框架产生的遥测 Span 格式各不相同,评估器无法直接消费。解决方案是session mappers(会话映射器):把原始 Span 转换为评估器可消费的Session格式。

官方文档(trace_providers.mdx)列出了三种内置映射器:

映射器适用场景
StrandsInMemorySessionMapperStrands Harness SDK 内存 Span(本地评估默认)
LangChainOtelSessionMapper使用 OpenTelemetry 插桩的 LangChain 应用
OpenInferenceSessionMapper使用 OpenInference 插桩的应用(如 Arize Phoenix、LlamaIndex)

v1.2.0 的核心工作正是围绕OpenInferenceSessionMapper扩展其可识别的框架范围。OpenInference是一套开源语义约定与插桩库,它钩入 Agent 框架并产出标准化的 OTel Span。v1.2.0 之前该映射器已能处理 Claude Agents(v1.1.1 引入,见 v1.1.1 changelog),本次版本则新增了OpenAI Agents SDK的完整支持,并配套了针对 Claude Agents 的集成测试(PR 353)。

从框架兼容矩阵看(见 framework-agnostic-evaluation 博客),Strands Evals 通过 OpenInference 与 Traceloop 两条第三方插桩路径,覆盖了 Claude Agents SDK、OpenAI Agents SDK、LangChain、Smolagents 等主流框架,实现了"定义一次用例与评估器,任意框架直接评估"的框架无关评估能力。

使用方式:detect_otel_mapper自动选择映射器

官方推荐的用法是让工厂函数detect_otel_mapper自动检测:它检查 Span 的 scope(作用域),识别出是哪个框架产生的追踪,然后返回对应的映射器类。这一机制在 v1.2.0 中直接受益——OpenAI Agents SDK 与 Claude Agents 的 Span 都能被正确识别。

仓库中提供了完整的可运行示例 claude-agents-evaluator.py 与 openai-agents-evaluator.py,核心 task 函数如下:

from strands_evals.mappers import detect_otel_mapper, readable_spans_to_dicts async def task(case: Case) -> dict[str, Any]: telemetry.in_memory_exporter.clear() response = await run_commit_agent(case.input) telemetry.tracer_provider.force_flush() spans = readable_spans_to_dicts(telemetry.in_memory_exporter.get_finished_spans()) session = detect_otel_mapper(spans).map_to_session(spans, session_id=case.session_id) return {"output": response, "trajectory": session}

关键点有三:

  1. 插桩先行:使用ClaudeAgentSDKInstrumentor()或OpenAIAgentsInstrumentor()对 Agent SDK 进行插桩,Span 通过StrandsEvalsTelemetry().setup_in_memory_exporter()在进程内收集;
  2. 映射器自动选择:detect_otel_mapper(spans)检查 Span 的 scope 名称,识别 Claude Agents / OpenAI Agents SDK 追踪并返回OpenInferenceSessionMapper,无需手动指定框架;
  3. TaskOutput 组装:{"output": response, "trajectory": session}即评估管线所需的最小结构。

切换到另一个框架时,只需替换插桩器与 Agent 定义(例如把ClaudeAgentSDKInstrumentor换成OpenAIAgentsInstrumentor,把query换成Runner.run),task 函数、用例、评估器与报告代码完全不变——这正是框架无关评估的实战价值。

多智能体追踪的根 Span 选择修复

v1.2.0 还修复了一个多智能体场景下的追踪质量问题:"select root agent span by earliest start_time in multi-agent traces"(PR 371)。

在多智能体(multi-agent)追踪中,多个 Agent 的 Span 交织在一起,如何确定哪一个是根(root)Agent Span 直接决定追踪树的结构与评估轨迹的完整性。此前根 Span 的确定方式在特定时序下可能选错;本次修复改为按最早start_time选择根 Agent Span,使根 Span 的判定与时序语义一致。该修复意味着:当多个 Agent 并行或嵌套执行时,最早启动的那个 Agent 会话被视为根,其子 Span 正确挂载,从而保证Session映射与后续评估的准确性。

bridge_parent_gaps行为变更:从原地修改到返回新 Span

v1.2.0 对追踪处理函数bridge_parent_gaps做了一个破坏性较小的行为变更(breaking: false,但属于语义调整):

"change bridge_parent_gaps to return new spans instead of mutating in place"(PR 375)

  • 变更前:bridge_parent_gaps直接修改传入的 Span 对象(mutating in place),调用方无法保留原始 Span;
  • 变更后:函数返回新的 Span 对象,原始数据保持不变,调用方可以同时持有原始与桥接后的结果。

从函数命名可以推断其用途:当子 Span 的父 Span 缺失(例如父 Span 因采样或传输被丢弃)时,bridge_parent_gaps会构造桥接 Span 来填补父子关系之间的断层,使追踪树保持连通。改为返回新 Span 后,该函数变得纯函数化,便于组合与测试,也避免了对原始追踪数据的副作用。升级到 v1.2.0 后,如果你的代码调用了bridge_parent_gaps并依赖其原地修改行为,需要改为接收返回值。

技能级评估器:衡量技能型 Agent 的选择质量

定位:评估"选得对不对",而非"做得成不成"

v1.2.0 在 evaluators 领域引入的最大新特性是面向技能型 Agent(skill-equipped agents)的评估器(PR 330),即 SkillSelectionAccuracyEvaluator。

技能(Skill)是 Harness 在运行时提供给 Agent 的指令文件,Agent 自行决定加载哪些技能。SkillSelectionAccuracyEvaluator的作用是:逐条判断 Agent 调用的每个技能是否是恰当的选择,由 Judge 模型基于任务内容与可用技能清单给出二元判定。

官方文档强调它的评分对象是"选择"而非"结果":即使 Harness 拒绝了技能加载(例如技能名无法识别),只要 Agent 提出该请求的决策是合理的,选择仍可得分。这与SkillInstructionFollowingEvaluator(评估是否遵循了技能的步骤)形成互补——前者管"选得对不对",后者管"执行得好不好"。

参数与评分

参数类型默认值说明
versionstr"v0"未提供system_prompt时使用的提示词模板版本
modelModel \| str \| NoneNoneJudge 模型,默认使用 Bedrock 默认 Judge 模型
system_promptstr \| NoneNone自定义 Judge 引导提示词
namestr \| NoneNone报告中的评估器标识,回退到类名

评分系统为二元制,每个被调用的技能产生一条结果:

  • Yes(1.0):调用该技能是恰当的选择;
  • No(0.0):调用该技能不合理,或存在更优的技能选择;
  • not_applicable:一次运行未调用任何技能时产生单条不适用记录,该记录会从平均分中剔除,不会拉低分数。

注意评估级别是SESSION_LEVEL 下的逐技能输出(见 evaluators/index.mdx):加载了 3 个技能就返回 3 条EvaluationOutput,每条包含score、test_pass(score 为 1.0 时为 True)、reason(技能名 + Judge 逐步推理)与label。

实战:完整评估示例

官方文档(skill_selection_accuracy_evaluator.mdx)给出了可直接运行的最小示例:

import asyncio from strands import Agent, AgentSkills, Skill from strands_evals import Case, Experiment from strands_evals.evaluators import SkillSelectionAccuracyEvaluator from strands_evals.mappers import StrandsInMemorySessionMapper from strands_evals.telemetry import StrandsEvalsTelemetry telemetry = StrandsEvalsTelemetry().setup_in_memory_exporter() memory_exporter = telemetry.in_memory_exporter skills = [ Skill( name="pdf-processing", description="Extract text and tables from PDF files.", instructions="Open the PDF, extract each page's text, and return it.", ), Skill( name="spreadsheet-analysis", description="Summarize and analyze spreadsheet data.", instructions="Load the spreadsheet and compute the requested aggregates.", ), ] def user_task_function(case: Case) -> dict: agent = Agent( plugins=[AgentSkills(skills=skills)], trace_attributes={ "gen_ai.conversation.id": case.session_id, "session.id": case.session_id, }, callback_handler=None, ) agent_response = agent(case.input) finished_spans = memory_exporter.get_finished_spans() mapper = StrandsInMemorySessionMapper() session = mapper.map_to_session(finished_spans, session_id=case.session_id) return {"output": str(agent_response), "trajectory": session} test_cases = Case[str, str, ] evaluator = SkillSelectionAccuracyEvaluator() experiment = Experimentstr, str async def main(): report = await experiment.run_evaluations_async(user_task_function) report.run_display() asyncio.run(main())

使用该评估器时有三个必须注意的要点:

  1. Session ID 追踪属性是硬性要求:使用StrandsInMemorySessionMapper时,必须在 Agent 配置中写入gen_ai.conversation.id与session.id追踪属性(如上方trace_attributes),否则不同用例的 Span 会在内存导出器中相互混叠,导致结果串线;
  2. 技能信号识别范围:官方文档说明,技能信号可被识别的来源包括 StrandsAgentSkills插件、Claude Code、Codex、Gemini CLI、OpenHands、Google ADK,以及从磁盘读取SKILL.md的 Agent;
  3. 先验证技能解析再信任分数:如果 Harness 的技能调用与上述来源都不匹配,评估结果会返回空集而非报错。因此官方建议先用strands_evals.extractors中的parse_available_skills(trajectory)验证技能能否被正确解析,再依据分数做决策。

评估器还提供配套的确定性检查SkillInvoked(见 deterministic_evaluators.mdx)与SkillInstructionFollowingEvaluator(见 skill_instruction_following_evaluator.mdx),可组合成"选对 + 执行对"的完整技能评估方案。

集成测试稳定性与社区依赖维护

v1.2.0 还包含两项值得关注的质量改进:

  • 降低集成测试波动(PR 374):针对新的 session mappers(即 v1.1.1 引入的GenericGenAISessionMapper与本次涉及的 OpenAI Agents 映射支持)的集成测试此前存在偶发失败,本次通过调整测试逻辑降低了 flakiness,属于评估基础设施层面的可靠性提升;
  • 社区依赖升级(PR 368、PR 369):mypy 依赖约束从<2.0.0放宽到<3.0.0,opentelemetry-instrumentation-langchain约束更新为>=0.40.0,<0.63.0,均为社区(dependabot)驱动的常规维护,不涉及 API 破坏。

升级与验证建议

升级到 v1.2.0 时,建议按以下顺序验证:

  1. 检查bridge_parent_gaps调用点:若代码依赖其原地修改行为,改为接收新返回值,并确认追踪树结构符合预期;
  2. 验证多智能体追踪:确认多 Agent 场景下根 Span 按最早start_time正确选择,Session映射无异常;
  3. 体验技能评估器:按上文示例为技能型 Agent 配置SkillSelectionAccuracyEvaluator,先用parse_available_skills验证技能解析,再运行实验查看逐技能得分;
  4. 运行跨框架评估:参考 claude-agents-evaluator.py 与 openai-agents-evaluator.py 两个示例,验证 Claude Agents 与 OpenAI Agents SDK 的 OpenInference 追踪均能被detect_otel_mapper正确识别并纳入统一评估管线。

相关资源

  • trace_providers.mdx:远程追踪评估与映射器完整配置
  • skill_selection_accuracy_evaluator.mdx:技能选择准确率评估器文档
  • framework-agnostic-evaluation-strands-evals.mdx:框架无关评估原理与跨框架实战
  • claude-agents-evaluator.py / openai-agents-evaluator.py:可运行的跨框架评估示例
  • 人工智能
  • 大模型
  • AI Agent
  • Agent 框架
  • 多智能体
  • 工具调用
  • MCP 服务

【免费下载链接】harness-sdk

Build an agent harness and control it end-to-end. Open-source SDK for production AI agents in Python & TypeScript - any model, any cloud.

项目地址:https://gitcode.com/GitHub_Trending/sdkpython13/harness-sdk
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询