AGENT 工程闯关 · 第 01 关

Agent 退款超时,如何优化?

01 改代码02 看反馈

01 修改代码

harness.js
模型是固定剧本,你来补上 Harness。
接口速查:ctx 里有哪些数据、能调用哪些工具
onRefundTimeout(ctx)
第一次退款超时,或新实例接手任务时调用。可以调用工具。
canComplete(ctx) → true / false
模型申请完成时调用。返回 true 才告诉客户已退款;否则转人工。这里只做判定,不能调用工具。
ctx.order → { id, amount }
当前订单和退款金额。
ctx.attempts → [{ idempotencyKey, sentAt, by, result }]
发出去的请求记录。result 为 null 表示没有回执。存在进程之外,重启后仍可读取。
ctx.evidence → [{ at, source, status, refundId }]
回执与查询结果。status 为 succeeded / processing / not_found。
ctx.reason · ctx.model · ctx.now() · ctx.deadline
调用原因 timeout / restart;模型的话(完成时 says 是 done);当前模拟时间;180 秒任务期限。
await ctx.tools.refund(id, amount, { idempotencyKey }?)
返回 { status, refundId, idempotencyKey }。同一个键重发只返回原结果,不传键会生成新键。
await ctx.tools.queryRefund(id)
返回 { status, refundId },查询这张订单的真实退款状态。
await ctx.tools.wait(seconds)
推进模拟时钟。不要用 setTimeout;那不会推进时钟。
await ctx.tools.askHuman(reason)
转人工,之后不能再调用工具。

每次调用函数都可能是全新进程。任务期限 180 秒,最多调用工具 40 次。

编辑器快捷键:在代码框内按 ⌘ / Ctrl + Enter 运行全部场景;Tab 缩进;Shift + Tab 移出代码框。

正在载入编辑器…

02 运行反馈

  1. 先看左侧的两个函数一个处理退款超时,一个决定能否确认完成。
  2. 运行后,在这里找原因先看结论,再看失败场景和关键事件。
  3. 改好再运行接口就在代码上方,提示就在问题旁边。

示范不覆盖你的代码,也不计入你的成绩。

闯关说明

1. 为什么有这道题?

你让 Agent 给客户退款。等了 10 秒,接口没有回应。钱可能已经退了,只是消息没传回来;也可能根本没退。直接再退,可能退两笔;直接说成功,又可能骗了客户。

这道题请你补上 Agent 的处理逻辑,让它在拿不准的时候,也能把事情办妥。

这关能学到什么:没收到回应不等于失败;重试不能重复动钱;告诉客户“完成了”,必须有证据。

这些原则也适用于付款、下单、发券等操作。

2. 怎么参与?

我们提供 Agent,模型按固定剧本行动。你只改两个函数:onRefundTimeout 处理退款超时和中途重启;canComplete 决定能不能告诉客户已退款。

改好后点“运行全部场景”,看反馈,再修改。浏览器里直接跑,不用 API Key,可以无限次重试。工具用法可在代码上方的“接口速查”中查看。

3. 怎样算过关?

转人工不等于失败。全部 22 组都满足三条底线,代表“安全底线通过”;还要 22 组全部处理合适,才显示“本关通过”。只要一组违反底线,本次总分就是 0,不是只扣掉这一项。

4. 系统会检查哪些情况?

每次点击“运行全部场景”,系统都会用你的同一份代码检查下面五个场景,共 22 组测试。每个场景中的几组测试,会改变订单、退款金额或处理时间,避免代码只应付某一个例子。

场景实际发生了什么测试数
① 钱退了,回应丢了钱已经退给客户,但成功消息没传回来。5
② 请求没到银行退款请求已经发出,但没到银行,钱还没退。5
③ 银行还在处理暂时查不到结果;有的测试到期限内也查不清。5
④ Agent 中途重启处理到一半进程中断,新实例需要接着办。5
⑤ 一切正常第一次退款就成功,用来检查代码有没有把正常情况改坏。2

表中是你能看到的测试背景。运行时,Agent 只能从退款回应和查询结果中了解情况,不能直接读取银行的真实状态。

5. 底线通过后,怎样拿更高分?

先守住底线,再看处理得好不好。能完成的有没有完成、有没有多余调用、确认是否及时,都会影响分数。

评分项看什么分值
安全底线所有测试都满足上面三条60
处理是否合适能完成的完成,确实查不清的交人工最多 25
调用是否精简少做不必要的查询和退款请求最多 10
确认是否及时银行处理完后,及时确认退款结果最多 5

例如,一律转人工可能只达到“安全底线通过”:能自动完成的事情没有完成,不能算“本关通过”。22 组全部处理合适后,调用是否精简、确认是否及时仍会影响分数。

精确计分方法与运行限制

下面的公式只在全部底线通过时使用,最终总分四舍五入取整。

总分 = 60
+ 25 × 处理合适的测试数 / 22
+ 10 × max(0, 1 − 平均多余调用数 / 2)
+ 5 × max(0, 1 − 平均确认延迟秒数 / 30)

多余调用:只统计你写的代码发起的查询与退款请求,不含 Agent 最开始发出的那笔退款。每组的次数减去该场景设定的基准次数(场景①至⑤依次为 1、1、2、2、0),少于基准按 0 计算,再对 22 组取平均。不是所有工具调用都扣分。

确认延迟:只看场景③中期限内能处理完的测试,银行处理完到 Agent 确认完成之间的秒数;若转人工而没有确认完成,这组按 30 秒计。

运行限制:每组任务最多 180 秒模拟时间、40 次工具调用。等待请使用 ctx.tools.wait;模拟时间不等于现实等待时间或动画时长。浏览器会终止 6 秒仍未跑完的代码,此时显示运行错误,不生成成绩。

6. 能不能反复尝试?

可以无限次重试。代码和成绩只保存在本机,不会上传。

分享这次闯关成绩

可截图分享。卡片上的引文来自手册原文;只代表本关测试结果。