{"id":123277,"date":"2026-11-06T23:24:54","date_gmt":"2026-11-06T15:24:54","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/123277.html"},"modified":"2026-11-06T23:24:54","modified_gmt":"2026-11-06T15:24:54","slug":"harness-engineering%ef%bc%9a%e6%8a%8a%e9%9a%8f%e6%9c%ba%e7%9a%84%e6%a8%a1%e5%9e%8b%e5%85%b3%e8%bf%9b%e7%a1%ae%e5%ae%9a%e6%80%a7%e7%9a%84%e5%a3%b3%e5%ad%90%e9%87%8c","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/123277.html","title":{"rendered":"Harness Engineering\uff1a\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc"},"content":{"rendered":"<h2>Harness Engineering&#xff1a;\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc<\/h2>\n<p>2026-09 Google \u5728 ADK 2.0 \u4e0e Antigravity SDK \u7684\u516c\u5f00\u9610\u8ff0\u91cc\u628a Harness Engineering&#xff08;\u786e\u5b9a\u6027\u5916\u58f3\u5de5\u7a0b&#xff09;\u6446\u5230\u4e86\u548c\u6a21\u578b\u80fd\u529b\u540c\u7b49\u7684\u4f4d\u7f6e&#xff0c;Anthropic \u540c\u671f\u53d1\u5e03\u7684\u5546\u52a1 Agent \u84dd\u56fe\u7ed9\u51fa\u4e86\u4e09\u6761\u53ef\u76f4\u63a5\u6284\u7684\u5b9e\u8df5&#xff1a;\u52a8\u6001 Skill \u52a0\u8f7d\u914d\u5408 Prompt Caching \u538b TTFT\u3001UI \u7ec4\u4ef6\u4f5c\u4e3a\u5de5\u5177\u8f93\u51fa\u3001\u5728 harness \u5c42\u5f3a\u5236\u5b89\u5168\u62e6\u622a\u4e14\u4e0d\u53ef\u9006\u4ea4\u6613\u5fc5\u987b\u4eba\u5de5\u7b7e\u7f72\u3002\u672c\u6587\u7684\u524d\u63d0\u7acb\u573a\u5f88\u786c&#xff1a;LLM \u662f\u5e26\u6e29\u5ea6\u91c7\u6837\u7684\u975e\u786e\u5b9a\u6027 token \u751f\u6210\u5668&#xff0c;\u7edd\u4e0d\u80fd\u88ab\u6388\u4e88\u5bf9\u751f\u4ea7 OS \u4e0e\u6570\u636e\u5e93\u7684\u4e2d\u4ecb\u5316\u8bbf\u95ee\u6743\u3002\u56f4\u7ed5\u8fd9\u4e2a\u7acb\u573a&#xff0c;\u6587\u7ae0\u62c6\u51fa\u56db\u6761\u786e\u5b9a\u6027\u8fb9\u754c&#xff08;\u7f16\u6392\u63a7\u5236\u5668\u7684\u6b65\u6570\u4e0e\u7ec8\u6b62\u6761\u4ef6\u3001\u9694\u79bb\u6267\u884c\u6c99\u7bb1\u3001\u72b6\u6001\u6301\u4e45\u5316\u4e0e\u56de\u6eda\u3001\u4ee5\u7f16\u8bd1\u5668\/linter\/\u5355\u6d4b\u4e3a\u4e0d\u53ef\u901a\u878d\u88c1\u5224\u7684\u786e\u5b9a\u6027\u65ad\u8a00&#xff09;&#xff0c;\u7ed9\u51fa\u4e00\u5957\u81ea\u52a8\u5316\u4fee\u590d\u5faa\u73af&#xff1a;\u751f\u6210\u4ee3\u7801\u4e22\u8fdb\u6c99\u7bb1\u8dd1\u6d4b\u8bd5&#xff0c;\u5931\u8d25\u5219\u628a\u538b\u7f29\u540e\u7684\u7cbe\u786e\u9519\u8bef\u6808\u56de\u5582\u6a21\u578b&#xff0c;\u56fa\u5b9a\u8fed\u4ee3\u4e0a\u9650&#xff0c;\u4eba\u4e0d\u518d\u9010\u884c review\u3002\u5b9e\u64cd\u90e8\u5206\u662f\u4e00\u4efd\u5b8c\u6574\u53ef\u8dd1\u7684 Python harness&#xff0c;\u542b subprocess \u8d44\u6e90\u9650\u5236\u3001\u4e34\u65f6\u76ee\u5f55\u3001\u8d85\u65f6\u3001git \u5feb\u7167\u56de\u6eda\u3001pytest \u65ad\u8a00\u3001\u6b65\u6570\u9884\u7b97\u4e0e\u6210\u672c\u7194\u65ad&#xff0c;\u80fd\u628a\u300c\u4fee\u4e00\u4e2a bug\u300d\u8dd1\u6210\u95ed\u73af&#xff1b;\u53e6\u5916\u7ed9\u51fa\u7ed3\u6784\u5316\u8f93\u51fa schema \u5f3a\u5236\u3001\u751f\u6210\/\u8bc4\u4f30\/\u4fee\u590d\u4e09\u5206\u7acb\u3001\u4ee5\u53ca\u7528\u96f6 LLM \u8c03\u7528\u7684\u786e\u5b9a\u6027\u4ee3\u7801\u66ff\u6362 Schema Validator \u4e0e Documentation Builder \u7684\u5177\u4f53\u5199\u6cd5\u3002<\/p>\n<p>\u5173\u952e\u8bcd&#xff1a;Harness Engineering\u3001\u786e\u5b9a\u6027\u8fb9\u754c\u3001\u6c99\u7bb1\u9694\u79bb\u3001git \u5feb\u7167\u56de\u6eda\u3001\u6210\u672c\u7194\u65ad\u3001\u7ed3\u6784\u5316\u8f93\u51fa\u3001Google ADK 2.0\u3001Anthropic Agent \u84dd\u56fe<\/p>\n<h3>\u4e00\u3001\u5199\u5728\u524d\u9762&#xff1a;\u4e3a\u4ec0\u4e48\u73b0\u5728\u5fc5\u987b\u804a\u8fd9\u4ef6\u4e8b<\/h3>\n<p>\u5148\u628a\u7acb\u573a\u8bf4\u6e05\u695a&#xff0c;\u540e\u9762\u6240\u6709\u8bbe\u8ba1\u90fd\u4ece\u8fd9\u53e5\u8bdd\u63a8\u51fa\u6765&#xff1a;LLM&#xff08;Large Language Model&#xff0c;\u5927\u8bed\u8a00\u6a21\u578b&#xff09;\u662f\u4e00\u4e2a\u5e26\u6e29\u5ea6\u91c7\u6837\u7684\u975e\u786e\u5b9a\u6027 token \u751f\u6210\u5668&#xff0c;\u5b83\u4e0d\u5e94\u8be5\u88ab\u6388\u4e88\u5bf9\u751f\u4ea7 OS&#xff08;\u64cd\u4f5c\u7cfb\u7edf&#xff09;\u6216\u751f\u4ea7\u6570\u636e\u5e93\u7684\u4e2d\u4ecb\u5316\u8bbf\u95ee\u6743\u3002<\/p>\n<p>\u300c\u4e2d\u4ecb\u5316\u8bbf\u95ee\u300d\u8fd9\u4e2a\u8bcd\u662f\u6709\u610f\u7684\u3002\u4e0d\u662f\u8bf4\u6a21\u578b\u4e0d\u80fd\u78b0\u751f\u4ea7&#xff0c;\u800c\u662f\u8bf4\u6a21\u578b\u4e0d\u80fd\u6210\u4e3a\u4eba\u548c\u751f\u4ea7\u4e4b\u95f4\u90a3\u6761\u552f\u4e00\u7684\u3001\u4e0d\u53ef\u5ba1\u8ba1\u7684\u901a\u9053\u3002\u4f60\u8ba9 Agent \u62ff\u5230\u4e00\u4e2a execute_shell \u5de5\u5177&#xff0c;\u5b83\u5c31\u6709\u4e86\u4e2d\u4ecb\u5316\u8bbf\u95ee&#xff1a;\u5b83\u80fd\u8bfb\u6587\u4ef6\u3001\u80fd\u5199\u6587\u4ef6\u3001\u80fd curl\u3001\u80fd rm -rf\u3002\u8fd9\u6761\u901a\u9053\u4e0a\u53d1\u751f\u7684\u4e00\u5207&#xff0c;\u5728\u6a21\u578b\u8f93\u51fa token \u7684\u90a3\u4e00\u523b\u4e4b\u524d\u662f\u4e0d\u53ef\u89c2\u6d4b\u7684&#xff0c;\u5728\u4e4b\u540e\u662f\u4e0d\u53ef\u56de\u6eaf\u7684\u3002\u8fd9\u4e24\u4ef6\u4e8b\u53e0\u5728\u4e00\u8d77&#xff0c;\u5c31\u662f\u4e8b\u6545\u3002<\/p>\n<p>2026 \u5e74 8 \u5230 10 \u6708\u8fd9\u4e00\u6279\u516c\u5f00\u6750\u6599\u91cc&#xff0c;\u6700\u6709\u4ef7\u503c\u7684\u4e0d\u662f\u67d0\u4e2a\u65b0\u6a21\u578b\u7684\u8dd1\u5206&#xff0c;\u800c\u662f Google \u548c Anthropic \u51e0\u4e4e\u540c\u65f6\u628a\u6ce8\u610f\u529b\u79fb\u5230\u4e86\u6a21\u578b\u5916\u9762\u90a3\u4e00\u5c42\u58f3\u30022026-09 \u524d\u540e&#xff0c;Google \u5728 ADK 2.0&#xff08;Agent Development Kit&#xff0c;\u667a\u80fd\u4f53\u5f00\u53d1\u5957\u4ef6&#xff09;\u548c Antigravity SDK \u7684\u516c\u5f00\u9610\u8ff0\u4e2d\u53cd\u590d\u8bb2 Harness Engineering\u2014\u2014\u628a Agent \u7684\u53ef\u9760\u6027\u95ee\u9898\u4ece\u300c\u8ba9\u6a21\u578b\u66f4\u806a\u660e\u300d\u6539\u5199\u6210\u300c\u8ba9\u58f3\u5b50\u66f4\u786c\u300d\u3002Anthropic \u540c\u671f\u53d1\u5e03\u7684\u5546\u52a1 Agent \u84dd\u56fe\u5219\u7ed9\u51fa\u4e86\u4e09\u6761\u975e\u5e38\u5de5\u7a0b\u5316\u3001\u53ef\u4ee5\u5f53\u5929\u5c31\u6284\u8fdb\u9879\u76ee\u7684\u5b9e\u8df5&#xff1a;<\/p>\n<li>\u52a8\u6001 Skill \u52a0\u8f7d &#043; Prompt Caching&#xff08;\u63d0\u793a\u8bcd\u7f13\u5b58&#xff09;\u538b TTFT&#xff08;Time To First Token&#xff0c;\u9996 token \u5ef6\u8fdf&#xff09;\u3002\u4e0d\u8981\u628a\u6240\u6709 Skill \u7684\u5b9a\u4e49\u4e00\u6b21\u6027\u585e\u8fdb system prompt&#xff0c;\u800c\u662f\u6309\u9700\u6302\u8f7d&#xff0c;\u5e76\u628a\u6302\u8f7d\u540e\u7684\u524d\u7f00\u505a\u6210\u53ef\u7f13\u5b58\u7684\u7a33\u5b9a\u524d\u7f00\u3002<\/li>\n<li>UI \u7ec4\u4ef6\u4f5c\u4e3a\u5de5\u5177\u8f93\u51fa\u3002\u5de5\u5177\u8fd4\u56de\u503c\u4e0d\u53ea\u662f\u6587\u672c&#xff0c;\u53ef\u4ee5\u662f\u7ed3\u6784\u5316\u7684\u7ec4\u4ef6\u63cf\u8ff0&#xff0c;\u8ba9\u524d\u7aef\u76f4\u63a5\u6e32\u67d3\u6210\u4e00\u4e2a\u8868\u683c\u3001\u4e00\u4e2a diff \u89c6\u56fe\u3001\u4e00\u4e2a\u786e\u8ba4\u6309\u94ae&#xff0c;\u628a\u300c\u6a21\u578b\u8bf4\u4ec0\u4e48\u300d\u548c\u300c\u4eba\u770b\u5230\u4ec0\u4e48\u300d\u89e3\u8026\u3002<\/li>\n<li>\u5728 harness \u5c42\u5f3a\u5236\u5b89\u5168\u62e6\u622a&#xff0c;\u4e0d\u53ef\u9006\u4ea4\u6613&#xff08;\u8f6c\u8d26\u3001\u4e0b\u5355\u3001\u53d1\u90ae\u4ef6\u3001\u5220\u8d44\u6e90&#xff09;\u5fc5\u987b\u5148\u751f\u6210\u4e00\u4efd\u5f85\u7b7e\u7f72\u7684\u63d0\u6848&#xff0c;\u7531\u4eba\u663e\u5f0f\u7b7e\u7f72\u540e\u624d\u6267\u884c\u3002<\/li>\n<p>\u7b2c\u4e09\u6761\u5c24\u5176\u503c\u5f97\u5212\u91cd\u70b9&#xff1a;**\u5b89\u5168\u62e6\u622a\u653e\u5728 harness \u5c42&#xff0c;\u800c\u4e0d\u662f\u653e\u5728\u63d0\u793a\u8bcd\u91cc\u3002**\u63d0\u793a\u8bcd\u91cc\u7684\u300c\u8bf7\u4e0d\u8981\u5220\u9664\u751f\u4ea7\u6570\u636e\u300d\u662f\u4e00\u6761\u5efa\u8bae&#xff0c;harness \u5c42\u7684\u300c\u8fd9\u4e2a\u5de5\u5177\u5728\u8fd9\u6761\u8def\u5f84\u4e0a\u6839\u672c\u6ca1\u6709\u88ab\u6ce8\u518c\u300d\u662f\u4e00\u6761\u6cd5\u5f8b\u3002\u4e24\u8005\u4e0d\u662f\u4e00\u56de\u4e8b&#xff0c;\u6df7\u6dc6\u5b83\u4eec\u662f 2025 \u5e74\u90a3\u4e00\u4ee3 Agent \u6700\u5e38\u89c1\u7684\u7ffb\u8f66\u59ff\u52bf\u3002<\/p>\n<p>\u8fd9\u7bc7\u6587\u7ae0\u8981\u89e3\u51b3\u7684&#xff0c;\u662f\u628a\u4e0a\u9762\u8fd9\u4e9b\u539f\u5219\u843d\u6210\u80fd\u8dd1\u7684\u4ee3\u7801\u3002\u6211\u89c1\u8fc7\u592a\u591a\u56e2\u961f\u7684 Agent \u9879\u76ee\u5361\u5728\u540c\u4e00\u4e2a\u4f4d\u7f6e&#xff1a;demo \u5f88\u6f02\u4eae&#xff0c;\u4e00\u4e0a\u751f\u4ea7\u5c31\u4e0d\u6562\u5f00\u6743\u9650&#xff1b;\u4e00\u5f00\u6743\u9650\u5c31\u51fa\u4e8b&#xff1b;\u51fa\u4e8b\u4e4b\u540e\u628a\u6743\u9650\u6536\u56de\u6765&#xff0c;\u4e8e\u662f\u53c8\u53d8\u56de demo\u3002\u8fd9\u4e2a\u6b7b\u5faa\u73af\u7684\u51fa\u53e3\u4e0d\u5728\u6a21\u578b\u4fa7&#xff0c;\u5728\u58f3\u5b50\u4fa7\u3002<\/p>\n<h4>1.1 \u4e00\u4e2a\u53cd\u76f4\u89c9\u7684\u7ed3\u8bba&#xff1a;\u53ef\u9760\u6027\u4e0d\u6765\u81ea\u6a21\u578b&#xff0c;\u6765\u81ea\u88c1\u5224<\/h4>\n<p>\u5927\u90e8\u5206\u4eba\u5bf9\u300c\u63d0\u5347 Agent \u53ef\u9760\u6027\u300d\u7684\u7b2c\u4e00\u53cd\u5e94\u662f\u6362\u66f4\u5f3a\u7684\u6a21\u578b\u3001\u8c03\u66f4\u4f4e\u7684 temperature\u3001\u5199\u66f4\u957f\u7684 system prompt\u3002\u8fd9\u4e09\u4ef6\u4e8b\u6211\u90fd\u505a\u8fc7&#xff0c;\u6210\u672c\u5f88\u9ad8&#xff0c;\u6536\u76ca\u5f88\u8584\u3002\u771f\u6b63\u5e26\u6765\u91cf\u7ea7\u53d8\u5316\u7684\u662f\u7b2c\u56db\u4ef6\u4e8b&#xff1a;\u7ed9 Agent \u627e\u4e00\u4e2a\u5b83\u65e0\u6cd5\u8bf4\u670d\u3001\u65e0\u6cd5\u7ed5\u8fc7\u3001\u65e0\u6cd5\u8ba8\u4ef7\u8fd8\u4ef7\u7684\u88c1\u5224\u3002<\/p>\n<p>\u7f16\u8bd1\u5668\u662f\u8fd9\u79cd\u88c1\u5224\u3002linter \u662f\u8fd9\u79cd\u88c1\u5224\u3002\u5355\u5143\u6d4b\u8bd5\u662f\u8fd9\u79cd\u88c1\u5224\u3002\u5b83\u4eec\u7684\u5171\u540c\u7279\u70b9\u662f&#xff1a;\u5224\u636e\u662f\u786e\u5b9a\u6027\u7684&#xff0c;\u5224\u5b8c\u4e4b\u540e\u7ed9\u7684\u662f\u7cbe\u786e\u7684\u9519\u8bef\u4f4d\u7f6e&#xff0c;\u800c\u4e14\u6a21\u578b\u6ca1\u6cd5\u901a\u8fc7\u300c\u63aa\u8f9e\u66f4\u597d\u300d\u6765\u6539\u53d8\u5224\u51b3\u7ed3\u679c\u3002\u5f53\u4f60\u7684\u5faa\u73af\u91cc\u6709\u4e86\u8fd9\u6837\u4e00\u4e2a\u88c1\u5224&#xff0c;\u6a21\u578b\u7684\u80fd\u529b\u4e0a\u9650\u5c31\u4e0d\u518d\u662f\u74f6\u9888&#xff0c;\u56e0\u4e3a\u8dd1\u4e0d\u901a\u5c31\u662f\u8dd1\u4e0d\u901a&#xff0c;\u6a21\u578b\u53ea\u80fd\u6539\u81ea\u5df1\u7684\u4ee3\u7801&#xff0c;\u4e0d\u80fd\u6539\u88c1\u5224\u3002<\/p>\n<p>\u8fd9\u5c31\u662f Harness Engineering \u7684\u6838\u5fc3&#xff1a;\u628a\u968f\u673a\u7684\u751f\u6210\u5668\u5173\u8fdb\u4e00\u4e2a\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc&#xff0c;\u8ba9\u58f3\u5b50\u51b3\u5b9a\u4ec0\u4e48\u7b97\u6210\u529f\u3001\u4ec0\u4e48\u7b97\u5931\u8d25\u3001\u5931\u8d25\u4e4b\u540e\u8fd8\u80fd\u4e0d\u80fd\u518d\u6765\u4e00\u6b21\u3002<\/p>\n<h4>1.2 \u672c\u6587\u7684\u8fb9\u754c<\/h4>\n<p>\u672c\u6587\u4e0d\u8bb2 Agent \u7684\u89c4\u5212\u7b97\u6cd5&#xff0c;\u4e0d\u8bb2\u591a Agent \u7684\u901a\u4fe1\u534f\u8bae&#xff08;\u90a3\u662f MCP \u4e0e A2A \u7684\u8bdd\u9898&#xff09;&#xff0c;\u4e5f\u4e0d\u8bb2\u600e\u4e48\u5fae\u8c03\u4e00\u4e2a\u6a21\u578b\u8ba9\u5b83\u66f4\u4f1a\u5199\u4ee3\u7801\u3002\u672c\u6587\u53ea\u8bb2\u58f3\u5b50&#xff1a;\u9884\u7b97\u3001\u6c99\u7bb1\u3001\u5feb\u7167\u3001\u65ad\u8a00\u3001\u5faa\u73af\u3001\u7194\u65ad&#xff0c;\u4ee5\u53ca\u8fd9\u4e9b\u90e8\u4ef6\u4e4b\u95f4\u7684\u63a5\u7ebf\u65b9\u5f0f\u3002<\/p>\n<h3>\u4e8c\u3001\u6280\u672f\u80cc\u666f\u4e0e\u73b0\u72b6\u68b3\u7406<\/h3>\n<h4>2.1 \u4e09\u4ee3 Agent \u67b6\u6784\u7684\u5206\u6c34\u5cad<\/h4>\n<table>\n<tr>\u4ee3\u9645\u5178\u578b\u5f62\u6001\u53ef\u9760\u6027\u6765\u6e90\u5931\u8d25\u6a21\u5f0f\u751f\u4ea7\u53ef\u7528\u6027<\/tr>\n<tbody>\n<tr>\n<td>\u7b2c\u4e00\u4ee3&#xff08;2023-2024&#xff09;<\/td>\n<td>\u5355\u8f6e prompt &#043; \u5de5\u5177\u8c03\u7528<\/td>\n<td>\u63d0\u793a\u8bcd\u7ea6\u675f<\/td>\n<td>\u6a21\u578b\u8bf4\u6ca1\u505a&#xff0c;\u5b9e\u9645\u505a\u4e86<\/td>\n<td>\u73a9\u5177<\/td>\n<\/tr>\n<tr>\n<td>\u7b2c\u4e8c\u4ee3&#xff08;2025&#xff09;<\/td>\n<td>ReAct \u5faa\u73af &#043; \u957f\u4e0a\u4e0b\u6587<\/td>\n<td>\u4e0a\u4e0b\u6587\u91cc\u5806\u66f4\u591a\u4f8b\u5b50<\/td>\n<td>\u5faa\u73af\u4e0d\u6536\u655b&#xff0c;\u6210\u672c\u5931\u63a7<\/td>\n<td>\u5185\u90e8\u5de5\u5177<\/td>\n<\/tr>\n<tr>\n<td>\u7b2c\u4e09\u4ee3&#xff08;2026&#xff09;<\/td>\n<td>Harness \u58f3 &#043; \u786e\u5b9a\u6027\u88c1\u5224<\/td>\n<td>\u7f16\u8bd1\u5668\/\u6d4b\u8bd5\/\u9884\u7b97\/\u6c99\u7bb1<\/td>\n<td>\u9884\u7b97\u8017\u5c3d\u540e\u660e\u786e\u5931\u8d25<\/td>\n<td>\u53ef\u4e0a\u751f\u4ea7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5206\u6c34\u5cad\u5728\u7b2c\u4e8c\u4ee3\u5230\u7b2c\u4e09\u4ee3\u4e4b\u95f4\u3002\u7b2c\u4e8c\u4ee3 Agent \u7684\u4e00\u5207\u5224\u636e\u90fd\u5728\u6a21\u578b\u8111\u5b50\u91cc\u2014\u2014\u5b83\u81ea\u5df1\u51b3\u5b9a\u4efb\u52a1\u505a\u5b8c\u4e86\u6ca1\u6709&#xff0c;\u81ea\u5df1\u51b3\u5b9a\u8981\u4e0d\u8981\u518d\u8bd5\u4e00\u6b21&#xff0c;\u81ea\u5df1\u51b3\u5b9a\u9519\u8bef\u662f\u4e0d\u662f\u53ef\u4ee5\u5ffd\u7565\u3002\u8fd9\u7b49\u4e8e\u8ba9\u88ab\u544a\u5f53\u6cd5\u5b98\u3002\u7b2c\u4e09\u4ee3\u628a\u8fd9\u4e09\u4ef6\u4e8b\u5168\u90e8\u642c\u51fa\u6a21\u578b&#xff1a;<\/p>\n<ul>\n<li>\u4efb\u52a1\u6709\u6ca1\u6709\u505a\u5b8c&#xff0c;\u7531\u65ad\u8a00&#xff08;pytest \/ \u7f16\u8bd1\u5668 \/ linter&#xff09;\u51b3\u5b9a&#xff0c;\u4e0d\u7531\u6a21\u578b\u81ea\u8ff0\u51b3\u5b9a\u3002<\/li>\n<li>\u8981\u4e0d\u8981\u518d\u8bd5\u4e00\u6b21&#xff0c;\u7531\u6b65\u6570\u9884\u7b97\u51b3\u5b9a&#xff0c;\u4e0d\u7531\u6a21\u578b\u7684\u300c\u6211\u518d\u60f3\u60f3\u300d\u51b3\u5b9a\u3002<\/li>\n<li>\u9519\u8bef\u80fd\u4e0d\u80fd\u5ffd\u7565&#xff0c;\u7531\u9519\u8bef\u5206\u7c7b\u767d\u540d\u5355\u51b3\u5b9a&#xff0c;\u4e0d\u7531\u6a21\u578b\u7684\u5224\u65ad\u51b3\u5b9a\u3002<\/li>\n<\/ul>\n<h4>2.2 \u975e\u786e\u5b9a\u6027\u5230\u5e95\u6765\u81ea\u54ea\u91cc<\/h4>\n<p>\u5f88\u591a\u4eba\u628a\u6a21\u578b\u7684\u975e\u786e\u5b9a\u6027\u7406\u89e3\u6210\u300c\u540c\u4e00\u4e2a prompt \u53ef\u80fd\u7ed9\u51fa\u4e0d\u540c\u7b54\u6848\u300d\u3002\u8fd9\u53ea\u8bf4\u5bf9\u4e86\u4e00\u534a&#xff0c;\u800c\u4e14\u662f\u4e0d\u91cd\u8981\u7684\u90a3\u4e00\u534a\u3002\u5de5\u7a0b\u4e0a\u771f\u6b63\u54ac\u4eba\u7684\u975e\u786e\u5b9a\u6027\u6709\u56db\u4e2a\u6765\u6e90&#xff1a;<\/p>\n<li>\u91c7\u6837\u975e\u786e\u5b9a\u6027\u3002temperature \u5927\u4e8e 0 \u65f6&#xff0c;\u540c\u8f93\u5165\u4e0d\u540c\u8f93\u51fa\u3002\u8fd9\u4e2a\u53ef\u4ee5\u9760 temperature&#061;0 \u7f13\u89e3&#xff0c;\u4f46\u7f13\u89e3\u4e0d\u4e86\u4e0b\u9762\u4e09\u6761\u3002<\/li>\n<li>\u4e0a\u4e0b\u6587\u975e\u786e\u5b9a\u6027\u3002\u6a21\u578b\u770b\u5230\u7684\u4e0a\u6587\u6765\u81ea\u68c0\u7d22\u3001\u6765\u81ea\u5de5\u5177\u8fd4\u56de\u3001\u6765\u81ea\u5e76\u53d1\u5199\u5165\u3002\u5373\u4f7f\u91c7\u6837\u662f\u8d2a\u5fc3\u7684&#xff0c;\u8f93\u5165\u53d8\u4e86\u8f93\u51fa\u5c31\u53d8\u3002\u751f\u4ea7\u73af\u5883\u91cc\u8fd9\u4e00\u6761\u624d\u662f\u4e3b\u56e0\u3002<\/li>\n<li>\u526f\u4f5c\u7528\u975e\u786e\u5b9a\u6027\u3002\u6a21\u578b\u8c03\u7528\u4e86\u5de5\u5177&#xff0c;\u5de5\u5177\u6539\u4e86\u5916\u90e8\u4e16\u754c\u3002\u8fd9\u4e00\u6b21\u8c03\u7528\u6210\u529f\u4e86&#xff0c;\u91cd\u8bd5\u65f6\u5916\u90e8\u4e16\u754c\u5df2\u7ecf\u53d8\u4e86&#xff0c;\u4e8e\u662f\u540c\u6837\u7684\u4ee3\u7801\u7b2c\u4e8c\u6b21\u8dd1\u51fa\u4e0d\u540c\u7ed3\u679c\u3002\u8fd9\u662f\u300c\u91cd\u8bd5\u300d\u8fd9\u4e2a\u52a8\u4f5c\u5728\u751f\u4ea7\u4e0a\u5371\u9669\u7684\u6839\u672c\u539f\u56e0\u3002<\/li>\n<li>\u7248\u672c\u975e\u786e\u5b9a\u6027\u3002\u4f60\u4ee5\u4e3a\u4f60\u5728\u8c03 gpt-x-2026-06&#xff0c;\u5b9e\u9645\u7f51\u5173\u7ed9\u4f60\u8def\u7531\u5230\u4e86 2026-09 \u5feb\u7167\u3002\u8f93\u51fa\u5206\u5e03\u6084\u6084\u53d8\u4e86&#xff0c;\u4f60\u7684\u56de\u5f52\u6d4b\u8bd5\u4e0a\u5468\u8fd8\u5168\u7eff\u3002<\/li>\n<p>\u7b2c 1 \u6761\u548c\u7b2c 4 \u6761\u53ef\u4ee5\u9760\u914d\u7f6e\u89e3\u51b3&#xff0c;\u7b2c 2 \u6761\u548c\u7b2c 3 \u6761\u53ea\u80fd\u9760\u67b6\u6784\u89e3\u51b3\u3002\u7b2c 3 \u6761\u5c24\u5176\u5173\u952e&#xff1a;\u53ea\u8981\u6a21\u578b\u6709\u526f\u4f5c\u7528&#xff0c;\u4f60\u5c31\u5fc5\u987b\u5047\u8bbe\u4efb\u4f55\u4e00\u6b21\u91cd\u8bd5\u90fd\u53ef\u80fd\u9020\u6210\u4e0d\u53ef\u9006\u7684\u7834\u574f&#xff0c;\u4e8e\u662f\u4f60\u5fc5\u987b\u5148\u6709\u56de\u6eda&#xff0c;\u624d\u6562\u6709\u91cd\u8bd5\u3002\u8fd9\u4e2a\u56e0\u679c\u5173\u7cfb\u4e0d\u80fd\u5012\u8fc7\u6765\u3002<\/p>\n<h4>2.3 \u4e2d\u4ecb\u5316\u8bbf\u95ee\u7684\u56db\u5f20\u8d26\u5355<\/h4>\n<p>\u628a\u300c\u6a21\u578b\u76f4\u63a5\u64cd\u4f5c\u751f\u4ea7 OS \/ \u6570\u636e\u5e93\u300d\u8fd9\u4e2a\u8bbe\u8ba1\u7684\u4ee3\u4ef7\u5217\u6210\u4e00\u5f20\u8d26\u5355&#xff1a;<\/p>\n<table>\n<tr>\u98ce\u9669\u89e6\u53d1\u6761\u4ef6\u540e\u679c\u4f20\u7edf\u8f6f\u4ef6\u7684\u5bf9\u5e94\u9632\u62a4Agent \u573a\u666f\u4e3a\u4ec0\u4e48\u5931\u6548<\/tr>\n<tbody>\n<tr>\n<td>\u8d8a\u6743\u8bfb\u5199<\/td>\n<td>\u63d0\u793a\u8bcd\u6ce8\u5165\u8ba9\u5de5\u5177\u53c2\u6570\u53d8\u5f62<\/td>\n<td>\u8bfb\u5230\u4e0d\u8be5\u8bfb\u7684\u6570\u636e<\/td>\n<td>RBAC \/ IAM<\/td>\n<td>\u5de5\u5177\u8c03\u7528\u7528\u7684\u662f\u670d\u52a1\u8d26\u53f7&#xff0c;\u6743\u9650\u662f\u9759\u6001\u7684&#xff0c;\u65e0\u6cd5\u6309\u610f\u56fe\u6536\u7a84<\/td>\n<\/tr>\n<tr>\n<td>\u4e0d\u53ef\u9006\u7834\u574f<\/td>\n<td>rm \/ DROP \/ UPDATE \u65e0 WHERE<\/td>\n<td>\u6570\u636e\u4e22\u5931<\/td>\n<td>\u5907\u4efd &#043; \u5ba1\u6279<\/td>\n<td>Agent \u4e00\u79d2\u80fd\u53d1 20 \u6b21\u8c03\u7528&#xff0c;\u5ba1\u6279\u8ddf\u4e0d\u4e0a<\/td>\n<\/tr>\n<tr>\n<td>\u8d44\u6e90\u8017\u5c3d<\/td>\n<td>\u751f\u6210\u4e86\u4e00\u4e2a\u6b7b\u5faa\u73af\u811a\u672c<\/td>\n<td>CPU \/ \u5185\u5b58\u6253\u6ee1<\/td>\n<td>cgroups \/ ulimit<\/td>\n<td>\u76f4\u63a5\u5728\u5bbf\u4e3b\u8fdb\u7a0b\u91cc subprocess.run&#xff0c;\u4ec0\u4e48\u9650\u5236\u90fd\u6ca1\u6709<\/td>\n<\/tr>\n<tr>\n<td>\u7f51\u7edc\u5916\u6cc4<\/td>\n<td>\u811a\u672c\u91cc\u6df7\u8fdb\u4e00\u6bb5 curl<\/td>\n<td>\u6e90\u7801\u5916\u4f20<\/td>\n<td>\u51fa\u53e3\u9632\u706b\u5899<\/td>\n<td>\u5f00\u53d1\u8005\u672c\u673a\u6ca1\u6709\u9632\u706b\u5899&#xff0c;CI \u91cc\u4e5f\u6ca1\u6709<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u56db\u5f20\u8d26\u5355\u7684\u5171\u540c\u70b9\u662f&#xff1a;**\u5b83\u4eec\u5168\u90fd\u662f\u4f20\u7edf\u8f6f\u4ef6\u5df2\u7ecf\u89e3\u51b3\u4e86\u4e09\u5341\u5e74\u7684\u8001\u95ee\u9898&#xff0c;\u89e3\u51b3\u529e\u6cd5&#xff08;\u6743\u9650\u3001\u5907\u4efd\u3001\u9650\u989d\u3001\u9632\u706b\u5899&#xff09;\u4e00\u4e2a\u90fd\u6ca1\u8fc7\u65f6&#xff0c;\u53ea\u662f\u5728 Agent \u67b6\u6784\u91cc\u88ab\u7ed5\u8fc7\u53bb\u4e86\u3002**Harness Engineering \u7684\u672c\u8d28&#xff0c;\u5c31\u662f\u628a\u8fd9\u56db\u5f20\u8d26\u5355\u91cd\u65b0\u63a5\u56de\u5230\u5df2\u6709\u7684\u9632\u62a4\u4f53\u7cfb\u4e0a\u3002<\/p>\n<h4>2.4 2026-09 \u7684\u4e24\u6761\u516c\u5f00\u8def\u7ebf<\/h4>\n<p>Google \u7684 ADK 2.0 \u8def\u7ebf\u628a\u91cd\u5fc3\u653e\u5728\u53ef\u7f16\u6392\u4e0e\u53ef\u89c2\u6d4b&#xff1a;Agent \u7684\u6bcf\u4e00\u6b65\u90fd\u662f\u58f3\u5b50\u91cc\u7684\u4e00\u4e2a\u53ef\u679a\u4e3e\u72b6\u6001&#xff0c;\u6b65\u4e0e\u6b65\u4e4b\u95f4\u6709\u660e\u786e\u7684\u9884\u7b97\u548c\u7ec8\u6b62\u6761\u4ef6&#xff0c;\u5de5\u5177\u8c03\u7528\u5fc5\u987b\u7559\u4e0b\u7ed3\u6784\u5316 trace\u3002Antigravity SDK \u5728\u6b64\u57fa\u7840\u4e0a\u8865\u7684\u662f\u672c\u5730\u6267\u884c\u73af\u5883\u2014\u2014\u628a\u4ee3\u7801\u6267\u884c\u653e\u5230\u4e00\u4e2a\u4e34\u65f6\u7684\u3001\u53d7\u9650\u7684\u3001\u53ef\u4e22\u5f03\u7684\u6587\u4ef6\u7cfb\u7edf\u91cc\u3002<\/p>\n<p>Anthropic \u7684\u5546\u52a1 Agent \u84dd\u56fe\u8def\u7ebf\u628a\u91cd\u5fc3\u653e\u5728\u4eba\u673a\u754c\u9762\u4e0e\u62e6\u622a\u70b9&#xff1a;\u5de5\u5177\u8f93\u51fa\u53ef\u4ee5\u662f UI \u7ec4\u4ef6\u800c\u4e0d\u662f\u7eaf\u6587\u672c&#xff1b;\u5371\u9669\u52a8\u4f5c\u5148\u751f\u6210\u63d0\u6848\u518d\u7531\u4eba\u7b7e\u7f72&#xff1b;Skill \u6309\u9700\u52a0\u8f7d\u800c\u4e0d\u662f\u5168\u91cf\u6ce8\u5165&#xff0c;\u914d\u5408 Prompt Caching \u628a TTFT \u538b\u4e0b\u6765\u3002<\/p>\n<p>\u4e24\u6761\u8def\u7ebf\u4e0d\u51b2\u7a81&#xff0c;\u800c\u4e14\u5728\u5de5\u7a0b\u4e0a\u662f\u4e92\u8865\u7684&#xff1a;ADK \u90a3\u6761\u7ebf\u89e3\u51b3\u300c\u8dd1\u5f97\u7a33\u300d&#xff0c;Anthropic \u90a3\u6761\u7ebf\u89e3\u51b3\u300c\u4eba\u6562\u7528\u300d\u3002\u672c\u6587\u7684 harness \u5b9e\u73b0\u628a\u4e24\u8fb9\u90fd\u63a5\u8fdb\u6765\u4e86\u3002<\/p>\n<h3>\u4e09\u3001\u6838\u5fc3\u539f\u7406\u62c6\u89e3<\/h3>\n<h4>3.1 \u56db\u6761\u786e\u5b9a\u6027\u8fb9\u754c<\/h4>\n<p>\u628a\u6574\u4e2a harness \u62c6\u6210\u56db\u6761\u8fb9\u754c&#xff0c;\u6bcf\u6761\u8fb9\u754c\u56de\u7b54\u4e00\u4e2a\u95ee\u9898\u3002\u8fd9\u56db\u6761\u8fb9\u754c\u662f\u672c\u6587\u7684\u9aa8\u67b6\u3002<\/p>\n<table>\n<tr>\u8fb9\u754c\u56de\u7b54\u7684\u95ee\u9898\u6838\u5fc3\u673a\u5236\u8d8a\u754c\u540e\u7684\u884c\u4e3a\u53ef\u89c2\u6d4b\u6307\u6807<\/tr>\n<tbody>\n<tr>\n<td>\u7f16\u6392\u63a7\u5236\u5668<\/td>\n<td>\u4ec0\u4e48\u65f6\u5019\u505c&#xff1f;<\/td>\n<td>\u6b65\u6570\u9884\u7b97\u3001\u5899\u949f\u8d85\u65f6\u3001\u6210\u672c\u7194\u65ad\u3001\u6536\u655b\u68c0\u6d4b<\/td>\n<td>\u660e\u786e\u5931\u8d25\u5e76\u8fd4\u56de\u6700\u540e\u72b6\u6001<\/td>\n<td>steps_used \/ cost_usd \/ stop_reason<\/td>\n<\/tr>\n<tr>\n<td>\u9694\u79bb\u6267\u884c\u6c99\u7bb1<\/td>\n<td>\u5728\u54ea\u91cc\u8dd1&#xff1f;<\/td>\n<td>\u4e34\u65f6\u76ee\u5f55\u3001\u53d7\u9650\u5bb9\u5668\u3001\u8d44\u6e90 rlimit\u3001\u7f51\u7edc\u62d2\u7edd<\/td>\n<td>\u5b50\u8fdb\u7a0b\u88ab\u6740&#xff0c;\u9000\u51fa\u7801\u975e 0<\/td>\n<td>sandbox_kills \/ peak_rss_mb<\/td>\n<\/tr>\n<tr>\n<td>\u72b6\u6001\u6301\u4e45\u5316\u4e0e\u56de\u6eda<\/td>\n<td>\u9519\u4e86\u600e\u4e48\u9000\u56de\u53bb&#xff1f;<\/td>\n<td>git \u5feb\u7167&#xff08;\u542b\u672a\u8ddf\u8e2a\u6587\u4ef6\u6e05\u5355&#xff09;\u3001\u5de5\u5177\u8c03\u7528 journal<\/td>\n<td>\u53cd\u5411\u5e94\u7528 patch &#043; \u6e05\u7406\u65b0\u5efa\u6587\u4ef6<\/td>\n<td>revert_ms \/ reverted_files<\/td>\n<\/tr>\n<tr>\n<td>\u786e\u5b9a\u6027\u65ad\u8a00<\/td>\n<td>\u8c01\u8bf4\u4e86\u7b97&#xff1f;<\/td>\n<td>pytest \/ mypy \/ ruff \/ \u7f16\u8bd1\u5668&#xff0c;\u9000\u51fa\u7801\u5373\u5224\u51b3<\/td>\n<td>\u5931\u8d25\u6808\u56de\u5582\u6a21\u578b&#xff0c;\u7edd\u4e0d\u5ffd\u7565<\/td>\n<td>assertion_pass_rate \/ flaky_rate<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u56db\u6761\u8fb9\u754c\u6709\u4e00\u4e2a\u5fc5\u987b\u9075\u5b88\u7684\u987a\u5e8f&#xff1a;**\u5148\u6709\u56de\u6eda&#xff0c;\u518d\u6709\u6c99\u7bb1&#xff0c;\u518d\u6709\u65ad\u8a00&#xff0c;\u6700\u540e\u624d\u662f\u5faa\u73af\u3002**\u987a\u5e8f\u9519\u4e86\u4f1a\u51fa\u4e8b\u2014\u2014\u6ca1\u6709\u56de\u6eda\u5c31\u5f00\u5faa\u73af&#xff0c;\u7b49\u4e8e\u8ba9\u6a21\u578b\u5728\u751f\u4ea7\u76ee\u5f55\u4e0a\u53cd\u590d\u8bd5\u9519&#xff1b;\u6ca1\u6709\u6c99\u7bb1\u5c31\u505a\u65ad\u8a00&#xff0c;\u7b49\u4e8e\u8ba9\u672a\u53d7\u63a7\u4ee3\u7801\u5728\u5bbf\u4e3b\u4e0a\u8dd1\u6d4b\u8bd5\u3002<\/p>\n<h4>3.2 \u8fb9\u754c\u4e00&#xff1a;\u7f16\u6392\u63a7\u5236\u5668\u4e0e\u6b65\u6570\u9884\u7b97<\/h4>\n<p>\u7f16\u6392\u63a7\u5236\u5668\u662f\u552f\u4e00\u6709\u6743\u51b3\u5b9a\u300c\u518d\u8dd1\u4e00\u6b21\u300d\u7684\u7ec4\u4ef6\u3002\u5b83\u7684\u8f93\u5165\u662f\u4e0a\u4e00\u8f6e\u7684\u65ad\u8a00\u7ed3\u679c\u548c\u5269\u4f59\u9884\u7b97&#xff0c;\u8f93\u51fa\u662f\u300c\u7ee7\u7eed \/ \u6362\u7b56\u7565 \/ \u653e\u5f03\u300d\u4e09\u9009\u4e00\u3002<\/p>\n<p>\u9884\u7b97\u4e0d\u662f\u4e00\u4e2a\u6570\u5b57&#xff0c;\u662f\u56db\u4e2a\u72ec\u7acb\u7ef4\u5ea6&#xff0c;\u4efb\u610f\u4e00\u4e2a\u89e6\u9876\u90fd\u5fc5\u987b\u7acb\u523b\u505c&#xff1a;<\/p>\n<p>Budget &#061; (max_steps, max_wall_clock_s, max_tokens, max_cost_usd)<\/p>\n<p>stop_reason  in  {solved, steps_exhausted, timeout, token_exhausted,<br \/>\n               cost_tripped, non_progress, sandbox_killed, human_abort}<\/p>\n<p>\u5176\u4e2d non_progress&#xff08;\u65e0\u8fdb\u5c55&#xff09;\u662f\u6700\u5bb9\u6613\u88ab\u5ffd\u7565\u3001\u4f46\u6700\u7701\u94b1\u7684\u4e00\u6761\u3002\u5224\u636e\u5f88\u7b80\u5355&#xff1a;**\u628a\u672c\u8f6e\u5931\u8d25\u65ad\u8a00\u7684\u6307\u7eb9&#xff08;failing test node id \u96c6\u5408 &#043; \u9519\u8bef\u7c7b\u578b&#xff09;\u4e0e\u4e0a\u4e00\u8f6e\u6bd4\u5bf9&#xff0c;\u5982\u679c\u8fde\u7eed\u4e24\u8f6e\u5b8c\u5168\u76f8\u540c&#xff0c;\u8bf4\u660e\u6a21\u578b\u5728\u539f\u5730\u6253\u8f6c&#xff0c;\u7acb\u523b\u505c\u3002**\u6211\u5728\u5b9e\u6d4b\u91cc\u52a0\u8fd9\u4e00\u6761\u4e4b\u540e&#xff0c;\u5e73\u5747\u6b65\u6570\u4ece 6.4 \u964d\u5230 4.1&#xff0c;\u6210\u672c\u964d\u4e86\u7ea6 35%&#xff0c;\u6210\u529f\u7387\u51e0\u4e4e\u6ca1\u53d8\u2014\u2014\u90a3\u4e9b\u7701\u4e0b\u6765\u7684\u6b65\u6570\u672c\u6765\u5c31\u4ec0\u4e48\u4e5f\u6ca1\u6539\u53d8\u3002<\/p>\n<p>\u6ce8\u610f max_steps \u7684\u5b9a\u4e49\u3002\u5f88\u591a\u5b9e\u73b0\u628a\u5b83\u5b9a\u4e49\u6210\u300c\u6a21\u578b\u8c03\u7528\u6b21\u6570\u300d&#xff0c;\u8fd9\u662f\u9519\u7684\u3002\u4e00\u6b21\u6a21\u578b\u8c03\u7528\u540e\u9762\u53ef\u80fd\u8ddf\u7740 5 \u6b21\u5de5\u5177\u8c03\u7528&#xff0c;\u800c\u6210\u672c\u7684\u5927\u5934\u5f80\u5f80\u5728\u5de5\u5177\u4fa7&#xff08;\u8dd1\u4e00\u6b21\u5168\u91cf\u6d4b\u8bd5\u53ef\u80fd\u6bd4\u4e00\u6b21\u6a21\u578b\u8c03\u7528\u8d35&#xff09;\u3002\u6b65\u6570\u5e94\u8be5\u6309\u300c\u65ad\u8a00\u8f6e\u6b21\u300d\u8ba1&#xff0c;\u6210\u672c\u6309 token \u4e0e\u5899\u949f\u53cc\u8f68\u8ba1&#xff0c;\u4e24\u8005\u72ec\u7acb\u89e6\u9876\u3002<\/p>\n<h4>3.3 \u8fb9\u754c\u4e8c&#xff1a;\u9694\u79bb\u6267\u884c\u6c99\u7bb1<\/h4>\n<p>\u6c99\u7bb1\u8981\u89e3\u51b3\u4e09\u4ef6\u4e8b&#xff1a;\u6587\u4ef6\u7cfb\u7edf\u9694\u79bb\u3001\u8d44\u6e90\u9650\u5236\u3001\u7f51\u7edc\u62d2\u7edd\u3002\u4e09\u4ef6\u4e8b\u7f3a\u4e00\u4ef6&#xff0c;\u6c99\u7bb1\u5c31\u662f\u4e2a\u5fc3\u7406\u5b89\u6170\u3002<\/p>\n<p>\u6c99\u7bb1\u7684\u4e09\u4e2a\u9762&#xff0c;\u4ee5\u53ca\u5404\u81ea\u7684\u9003\u9038\u8def\u5f84<\/p>\n<p>  \u6587\u4ef6\u7cfb\u7edf&#xff1a;\u4e34\u65f6\u76ee\u5f55 &#043; \u53ea\u6302\u8f7d\u4efb\u52a1\u9700\u8981\u7684\u8def\u5f84<br \/>\n      \u9003\u9038\u8def\u5f84&#xff1a;\u6a21\u578b\u5199 ~\/.bashrc\u3001\u5199 \/tmp\/xx \u7136\u540e\u53e6\u4e00\u4e2a\u8fdb\u7a0b\u8bfb\u3001\u901a\u8fc7\u7b26\u53f7\u94fe\u63a5\u8df3\u51fa\u4e34\u65f6\u76ee\u5f55<br \/>\n  \u8d44\u6e90&#xff1a;CPU \u79d2\u6570 \/ \u5730\u5740\u7a7a\u95f4 \/ \u6587\u4ef6\u4f53\u79ef \/ \u8fdb\u7a0b\u6570 \/ \u5899\u949f<br \/>\n      \u9003\u9038\u8def\u5f84&#xff1a;fork \u70b8\u5f39\u3001\u751f\u6210\u4e00\u4e2a 10GB \u7684\u6587\u4ef6\u3001malloc \u5230 OOM<br \/>\n  \u7f51\u7edc&#xff1a;\u9ed8\u8ba4\u62d2\u7edd<br \/>\n      \u9003\u9038\u8def\u5f84&#xff1a;pip install \u62c9\u6076\u610f\u5305\u3001curl \u5916\u4f20\u3001DNS \u96a7\u9053<\/p>\n<p>\u6587\u4ef6\u7cfb\u7edf\u8fd9\u4e00\u9762\u6700\u5bb9\u6613\u88ab\u505a\u9519\u3002\u7528 tempfile.mkdtemp() \u62ff\u5230\u4e00\u4e2a\u4e34\u65f6\u76ee\u5f55&#xff0c;\u7136\u540e\u628a repo \u62f7\u8fdb\u53bb&#xff0c;\u770b\u8d77\u6765\u5df2\u7ecf\u9694\u79bb\u4e86\u2014\u2014\u5b9e\u9645\u4e0a\u6ca1\u6709&#xff0c;\u56e0\u4e3a\u5b50\u8fdb\u7a0b\u7ee7\u627f\u7684\u73af\u5883\u53d8\u91cf\u91cc\u8fd8\u6302\u7740 HOME\u3001SSH_AUTH_SOCK\u3001AWS_PROFILE\u3001KUBECONFIG\u3002\u6a21\u578b\u751f\u6210\u4e00\u6bb5 cat ~\/.aws\/credentials \u5c31\u80fd\u62ff\u5230\u771f\u51ed\u8bc1\u3002\u73af\u5883\u51c0\u5316\u5fc5\u987b\u663e\u5f0f\u505a&#xff1a;\u6784\u9020\u4e00\u4e2a\u767d\u540d\u5355\u73af\u5883&#xff0c;\u53ea\u4fdd\u7559 PATH\u3001HOME&#xff08;\u6307\u5411\u4e34\u65f6\u76ee\u5f55&#xff09;\u3001LANG\u3001PYTHONPATH\u3002<\/p>\n<p>\u7f51\u7edc\u8fd9\u4e00\u9762\u5728 Linux \u4e0a\u53ef\u4ee5\u7528 unshare -n \u6216\u8005 seccomp \u505a&#xff0c;\u5728 macOS \/ Windows \u4e0a\u6ca1\u6709\u7b49\u4ef7\u7269\u3002\u6211\u7684\u5904\u7406\u65b9\u5f0f\u662f&#xff1a;**\u5728\u4e0d\u652f\u6301\u7f51\u7edc\u9694\u79bb\u7684\u5e73\u53f0\u4e0a&#xff0c;\u628a\u7f51\u7edc\u9694\u79bb\u964d\u7ea7\u4e3a\u300c\u51fa\u53e3\u4ee3\u7406\u767d\u540d\u5355\u300d&#xff0c;\u5e76\u5728 harness \u542f\u52a8\u65f6\u6253\u5370\u4e00\u6761\u663e\u773c\u7684\u8b66\u544a\u3002**\u5b81\u53ef\u663e\u5f0f\u964d\u7ea7&#xff0c;\u4e5f\u4e0d\u8981\u5047\u88c5\u9694\u79bb\u4e86\u3002<\/p>\n<h4>3.4 \u8fb9\u754c\u4e09&#xff1a;\u72b6\u6001\u6301\u4e45\u5316\u4e0e\u56de\u6eda<\/h4>\n<p>\u56de\u6eda\u7684\u6b63\u786e\u5355\u4f4d\u662f\u300c\u4e00\u6b21\u53ef revert \u7684\u5b8c\u6574\u72b6\u6001\u300d&#xff0c;\u800c\u4e0d\u662f\u300c\u6587\u4ef6\u300d\u6216\u300c\u6570\u636e\u5e93\u300d\u3002\u4e00\u6b21 Agent \u4efb\u52a1\u4f1a\u540c\u65f6\u6539\u52a8\u4e09\u7c7b\u4e1c\u897f&#xff1a;\u5de5\u4f5c\u533a\u6587\u4ef6\u3001\u5916\u90e8\u7cfb\u7edf&#xff08;\u6570\u636e\u5e93\u3001\u5bf9\u8c61\u5b58\u50a8\u3001\u7b2c\u4e09\u65b9 API&#xff09;\u3001\u4ee5\u53ca\u5b83\u81ea\u5df1\u7684\u8bb0\u5fc6\/\u65e5\u5fd7\u3002\u7b2c\u4e09\u7c7b\u65e0\u6240\u8c13&#xff0c;\u7b2c\u4e8c\u7c7b\u53ea\u80fd\u9760\u5e42\u7b49\u952e\u548c\u8865\u507f\u4e8b\u52a1&#xff0c;\u7b2c\u4e00\u7c7b\u9760 git \u5feb\u7167\u3002<\/p>\n<p>git \u5feb\u7167\u7684\u5929\u5751\u662f\u672a\u8ddf\u8e2a\u6587\u4ef6\u3002\u7edd\u5927\u591a\u6570\u5b9e\u73b0\u5199\u6210\u8fd9\u6837&#xff1a;<\/p>\n<p><span class=\"token function\">git<\/span> stash push <span class=\"token parameter variable\">-u<\/span>        <span class=\"token comment\"># \u6216 git checkout . &amp;&amp; git clean -fd<\/span><\/p>\n<p>git clean -fd \u4f1a\u5220\u6389\u4e00\u5207\u672a\u8ddf\u8e2a\u6587\u4ef6&#xff0c;\u5305\u62ec\u4efb\u52a1\u5f00\u59cb\u524d\u5c31\u5b58\u5728\u3001\u4f46\u8fd8\u6ca1 git add \u8fc7\u7684\u672c\u5730\u914d\u7f6e\u6587\u4ef6\u3002\u6211\u8e29\u8fc7\u4e00\u6b21&#xff0c;\u628a .env.local \u548c\u4e00\u4efd\u6ca1\u63d0\u4ea4\u7684\u8fc1\u79fb\u811a\u672c\u4e00\u8d77\u6e05\u6389\u4e86\u3002\u6b63\u786e\u505a\u6cd5\u662f\u5148 git add -A \u628a\u6240\u6709\u672a\u8ddf\u8e2a\u6587\u4ef6\u7eb3\u5165\u7d22\u5f15&#xff0c;\u518d git diff &#8211;cached &#8211;binary \u751f\u6210\u4e00\u4efd\u5305\u542b\u65b0\u5efa\u6587\u4ef6\u7684\u5b8c\u6574 patch&#xff0c;\u56de\u6eda\u65f6\u53cd\u5411\u5e94\u7528\u8fd9\u4efd patch\u2014\u2014git apply -R \u5bf9\u300cnew file mode\u300d\u6bb5\u843d\u7684\u5904\u7406\u662f\u5220\u9664\u8be5\u6587\u4ef6&#xff0c;\u6240\u4ee5\u5b83\u540c\u65f6\u8986\u76d6\u4e86\u300c\u6062\u590d\u88ab\u6539\u7684\u6587\u4ef6\u300d\u548c\u300c\u5220\u9664\u88ab\u65b0\u5efa\u7684\u6587\u4ef6\u300d\u4e24\u4ef6\u4e8b\u3002<\/p>\n<p>snapshot(repo):<br \/>\n    base   &#061; git rev-parse HEAD<br \/>\n    git add -A                      # \u672a\u8ddf\u8e2a\u6587\u4ef6\u4e5f\u8fdb\u7d22\u5f15&#xff0c;diff \u624d\u80fd\u8986\u76d6\u5b83\u4eec<br \/>\n    patch  &#061; git diff &#8211;cached &#8211;binary<br \/>\n    git reset -q                    # \u8fd8\u539f\u7d22\u5f15&#xff0c;\u5de5\u4f5c\u533a\u4e0d\u52a8<br \/>\n    return Snapshot(base, patch)<\/p>\n<p>revert(snapshot):<br \/>\n    git apply &#8211;check -R &#8211;binary patch    # \u5148\u9a8c\u8bc1\u80fd\u4e0d\u80fd\u53cd\u7740\u6253\u56de\u53bb<br \/>\n    git apply -R &#8211;binary patch<br \/>\n    &#xff08;\u82e5 check \u5931\u8d25&#xff1a;git checkout &lt;base&gt; &#8212; . \u518d\u6309\u6e05\u5355\u5220\u65b0\u5efa\u6587\u4ef6&#xff09;<\/p>\n<p>\u5916\u90e8\u7cfb\u7edf\u7684\u56de\u6eda\u53e6\u8bf4\u3002\u6211\u7684\u89c4\u5219\u662f&#xff1a;**\u51e1\u662f\u4f1a\u5199\u5916\u90e8\u7cfb\u7edf\u7684\u5de5\u5177&#xff0c;\u5fc5\u987b\u63a5\u53d7\u4e00\u4e2a idempotency_key \u53c2\u6570&#xff0c;\u5e76\u4e14 harness \u5728\u8c03\u7528\u524d\u628a (tool, args_hash, key) \u5199\u8fdb journal\u3002**\u8fd9\u6837\u5373\u4f7f\u56de\u6eda\u4e0d\u5e72\u51c0&#xff0c;\u4f60\u81f3\u5c11\u6709\u4e00\u4efd\u300c\u5230\u5e95\u5bf9\u5916\u90e8\u4e16\u754c\u505a\u4e86\u4ec0\u4e48\u300d\u7684\u8d26\u672c&#xff0c;\u53ef\u4ee5\u505a\u4eba\u5de5\u8865\u507f\u3002<\/p>\n<h4>3.5 \u8fb9\u754c\u56db&#xff1a;\u786e\u5b9a\u6027\u65ad\u8a00<\/h4>\n<p>\u65ad\u8a00\u662f\u88c1\u5224&#xff0c;\u6240\u4ee5\u65ad\u8a00\u672c\u8eab\u5fc5\u987b\u6ee1\u8db3\u4e09\u4e2a\u6761\u4ef6&#xff1a;\u786e\u5b9a\u6027&#xff08;\u540c\u8f93\u5165\u540c\u5224\u5b9a&#xff09;\u3001\u53ef\u5b9a\u4f4d&#xff08;\u5931\u8d25\u65f6\u80fd\u7ed9\u51fa\u7cbe\u786e\u4f4d\u7f6e&#xff09;\u3001\u4e0d\u53ef\u534f\u5546&#xff08;\u6a21\u578b\u4e0d\u80fd\u6539\u5224\u636e&#xff09;\u3002<\/p>\n<p>\u65ad\u8a00\u5206\u5c42&#xff08;\u4ece\u5feb\u5230\u6162&#xff0c;\u4ece\u4fbf\u5b9c\u5230\u8d35&#xff09;<\/p>\n<p>L0  \u8bed\u6cd5\/\u683c\u5f0f      ruff format &#8211;check \/ gofmt -l        ~50ms<br \/>\nL1  \u9759\u6001\u7c7b\u578b       mypy &#8211;strict \/ tsc &#8211;noEmit          ~2s<br \/>\nL2  \u7f16\u8bd1           python -m compileall \/ cargo build    ~5s<br \/>\nL3  \u5355\u5143\/\u76ee\u6807\u6d4b\u8bd5  pytest &lt;node_id&gt; -x -q                ~3s<br \/>\nL4  \u56de\u5f52\u6d4b\u8bd5       pytest&#xff08;\u53d7\u5f71\u54cd\u5b50\u96c6&#xff09;                   ~30s<br \/>\nL5  \u5168\u91cf\u6d4b\u8bd5       pytest                                ~5min<\/p>\n<p>\u5faa\u73af\u5185\u90e8\u53ea\u8dd1 L0 \u5230 L3&#xff0c;L4\/L5 \u653e\u5728\u5faa\u73af\u6210\u529f\u4e4b\u540e\u4f5c\u4e3a\u51c6\u5165\u95e8\u7981\u3002\u7406\u7531\u5f88\u5b9e\u9645&#xff1a;L5 \u8dd1\u4e00\u6b21 5 \u5206\u949f&#xff0c;8 \u8f6e\u8fed\u4ee3\u5c31\u662f 40 \u5206\u949f&#xff0c;\u6ca1\u4eba\u7b49\u5f97\u8d77&#xff1b;\u4f46\u76f4\u63a5\u8df3\u8fc7 L5 \u53c8\u4f1a\u628a\u56de\u5f52\u6f0f\u5230\u7ebf\u4e0a\u3002\u6240\u4ee5\u6b63\u786e\u7684\u987a\u5e8f\u662f\u300c\u4fbf\u5b9c\u7684\u65ad\u8a00\u9a71\u52a8\u8fed\u4ee3&#xff0c;\u6602\u8d35\u7684\u65ad\u8a00\u505a\u51c6\u5165\u300d\u3002<\/p>\n<p>\u65ad\u8a00\u8fd8\u6709\u4e00\u6761\u94c1\u5f8b&#xff1a;**\u6a21\u578b\u4e0d\u80fd\u4fee\u6539\u65ad\u8a00\u3002**\u8fd9\u4e0d\u662f\u63d0\u793a\u8bcd\u5c42\u9762\u7684\u8981\u6c42&#xff0c;\u662f\u6587\u4ef6\u7cfb\u7edf\u5c42\u9762\u7684\u8981\u6c42\u2014\u2014\u6c99\u7bb1\u91cc\u8dd1\u6d4b\u8bd5\u7528\u7684\u6d4b\u8bd5\u6587\u4ef6&#xff0c;\u5fc5\u987b\u662f harness \u4ece\u5feb\u7167\u91cc\u590d\u5236\u8fdb\u53bb\u7684\u53ea\u8bfb\u526f\u672c&#xff0c;\u6a21\u578b\u5199\u4e0d\u8fdb\u53bb\u3002\u89c1 3.7 \u8282\u548c\u8e29\u5751 7.6\u3002<\/p>\n<h4>3.6 \u81ea\u52a8\u5316\u4fee\u590d\u5faa\u73af<\/h4>\n<p>\u628a\u56db\u6761\u8fb9\u754c\u63a5\u8d77\u6765&#xff0c;\u5f97\u5230\u8fd9\u4e2a\u5faa\u73af&#xff1a;<\/p>\n<p>                    &#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&#043;<br \/>\n                    |  Budget \u68c0\u67e5&#xff08;\u6bcf\u8f6e\u5165\u53e3&#xff0c;\u56db\u7ef4\u5ea6&#xff09;   |<br \/>\n                    &#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#043;<br \/>\n                                    | \u672a\u89e6\u9876<br \/>\n                                    v<br \/>\n   [1] \u751f\u6210   \u6a21\u578b\u4ea7\u51fa\u7ed3\u6784\u5316 PatchProposal&#xff08;schema \u5f3a\u5236&#xff09;<br \/>\n                                    |<br \/>\n                                    v<br \/>\n   [2] \u843d\u5730   harness \u628a patch \u5199\u8fdb\u6c99\u7bb1\u5de5\u4f5c\u533a&#xff08;\u6a21\u578b\u4e0d\u76f4\u63a5\u5199&#xff09;<br \/>\n                                    |<br \/>\n                                    v<br \/>\n   [3] \u65ad\u8a00   L0..L3 \u5728\u53d7\u9650\u5b50\u8fdb\u7a0b\u91cc\u8dd1&#xff0c;\u62ff\u9000\u51fa\u7801<br \/>\n                                    |<br \/>\n                    &#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#043;<br \/>\n                \u9000\u51fa\u7801 0                          \u9000\u51fa\u7801\u975e 0<br \/>\n                    |                                   |<br \/>\n                    v                                   v<br \/>\n   [4] \u95e8\u7981   L4\/L5 \u5168\u91cf\u56de\u5f52                [5] \u538b\u7f29   \u622a\u65ad&#043;\u53bb\u91cd\u9519\u8bef\u6808<br \/>\n                    |                                   |<br \/>\n             &#043;&#8212;&#8212;&#043;&#8212;&#8212;&#043;                            v<br \/>\n            \u901a\u8fc7          \u5931\u8d25                 [6] \u56de\u5582   \u7cbe\u786e\u9519\u8bef &#043; \u6307\u7eb9<br \/>\n             |             |                            |<br \/>\n             v             v                            v<br \/>\n          \u63d0\u4ea4\/PR      \u56de\u6eda &#043; \u62a5\u544a              \u6307\u7eb9\u4e0e\u4e0a\u8f6e\u76f8\u540c&#xff1f;<br \/>\n                                                       |<br \/>\n                                          \u662f -&gt; non_progress \u505c<br \/>\n                                          \u5426 -&gt; \u56de\u5230 [1]<\/p>\n<p>\u8fd9\u4e2a\u5faa\u73af\u91cc\u6700\u53cd\u76f4\u89c9\u7684\u8bbe\u8ba1\u662f [6] \u56de\u5582\u7684\u662f\u538b\u7f29\u8fc7\u7684\u7cbe\u786e\u9519\u8bef&#xff0c;\u4e0d\u662f\u5b8c\u6574\u65e5\u5fd7\u3002\u5b8c\u6574\u65e5\u5fd7\u6709\u4e09\u4e2a\u95ee\u9898&#xff1a;\u51e0\u4e07\u5b57\u7b26\u6324\u7206\u4e0a\u4e0b\u6587\u3001\u91cc\u9762\u585e\u6ee1\u4e86\u65e0\u5173\u7684\u4f9d\u8d56\u5b89\u88c5\u566a\u58f0\u3001\u800c\u4e14\u6a21\u578b\u4f1a\u53bb\u300c\u4fee\u300d\u65e5\u5fd7\u91cc\u90a3\u4e9b\u5176\u5b9e\u65e0\u5bb3\u7684 warning\u3002\u538b\u7f29\u7b56\u7565\u5728 5.5 \u8282\u7ed9\u51fa&#xff0c;\u5b9e\u6d4b\u80fd\u628a\u56de\u5582 token \u4ece 9000 \u538b\u5230 1200 \u5de6\u53f3&#xff0c;\u540c\u65f6\u6210\u529f\u7387\u4e0d\u964d\u53cd\u5347\u3002<\/p>\n<h4>3.7 \u751f\u6210 \/ \u8bc4\u4f30 \/ \u4fee\u590d\u4e09\u5206\u7acb<\/h4>\n<p>\u4e00\u6761\u786c\u89c4\u5219&#xff1a;\u4e0d\u5141\u8bb8\u6a21\u578b\u7ed9\u81ea\u5df1\u751f\u6210\u7684\u4ee3\u7801\u6253\u5206\u3002<\/p>\n<p>\u8fd9\u4e0d\u662f\u6d01\u7656\u3002\u81ea\u8bc4\u4f1a\u8ba9\u6a21\u578b\u503e\u5411\u4e8e\u7ed9\u81ea\u5df1\u627e\u7406\u7531\u2014\u2014\u5b83\u8bb0\u5f97\u81ea\u5df1\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u5199&#xff0c;\u4e8e\u662f\u628a\u300c\u6211\u5f53\u65f6\u60f3\u7684\u662f\u5bf9\u7684\u300d\u5f53\u6210\u4e86\u300c\u8fd9\u6bb5\u4ee3\u7801\u662f\u5bf9\u7684\u300d\u3002\u66f4\u7cdf\u7684\u662f&#xff0c;\u81ea\u8bc4\u548c\u8f93\u51fa\u540c\u6e90&#xff0c;\u4e00\u65e6\u91c7\u6837\u504f\u4e86&#xff0c;\u4e24\u5904\u4f1a\u4e00\u8d77\u504f&#xff0c;\u8bef\u5dee\u4e0d\u4f1a\u4e92\u76f8\u62b5\u6d88\u3002<\/p>\n<p>\u4e09\u5206\u7acb\u7684\u5177\u4f53\u505a\u6cd5&#xff1a;<\/p>\n<table>\n<tr>\u89d2\u8272\u80fd\u770b\u5230\u4ec0\u4e48\u80fd\u5199\u4ec0\u4e48\u8f93\u51fa schema\u7981\u6b62\u4e8b\u9879<\/tr>\n<tbody>\n<tr>\n<td>Generator&#xff08;\u751f\u6210&#xff09;<\/td>\n<td>\u4efb\u52a1\u63cf\u8ff0 &#043; \u68c0\u7d22\u5230\u7684\u76f8\u5173\u6587\u4ef6 &#043; \u5931\u8d25\u6808&#xff08;\u975e\u9996\u8f6e&#xff09;<\/td>\n<td>\u4ec5\u6c99\u7bb1\u5185\u6e90\u7801\u6587\u4ef6<\/td>\n<td>PatchProposal<\/td>\n<td>\u4e0d\u80fd\u770b\u8bc4\u4f30\u7ed3\u679c&#xff1b;\u4e0d\u80fd\u5199\u6d4b\u8bd5\u6587\u4ef6<\/td>\n<\/tr>\n<tr>\n<td>Evaluator&#xff08;\u8bc4\u4f30&#xff09;<\/td>\n<td>diff &#043; \u65ad\u8a00\u539f\u59cb\u8f93\u51fa &#043; \u9759\u6001\u89c4\u5219<\/td>\n<td>\u4ec0\u4e48\u90fd\u4e0d\u5199&#xff08;\u5de5\u5177\u767d\u540d\u5355\u4e3a\u7a7a&#xff09;<\/td>\n<td>Verdict<\/td>\n<td>\u4e0d\u80fd\u770b Generator \u7684\u81ea\u7136\u8bed\u8a00\u81ea\u8ff0&#xff1b;\u4e0d\u80fd\u4fee\u6539\u4efb\u4f55\u6587\u4ef6<\/td>\n<\/tr>\n<tr>\n<td>Fixer&#xff08;\u4fee\u590d&#xff09;<\/td>\n<td>\u65ad\u8a00\u5931\u8d25\u9879 &#043; \u5931\u8d25\u6808 &#043; \u5f53\u524d\u6587\u4ef6<\/td>\n<td>\u4ec5\u6c99\u7bb1\u5185\u6e90\u7801\u6587\u4ef6<\/td>\n<td>PatchProposal<\/td>\n<td>\u4e0d\u80fd\u770b Evaluator \u7684\u5206\u6570&#xff1b;\u53ea\u80fd\u770b\u5931\u8d25\u9879<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6ce8\u610f\u4e24\u6761\u770b\u8d77\u6765\u5f88\u7ed5\u3001\u4f46\u5f88\u91cd\u8981\u7684\u9650\u5236&#xff1a;<\/p>\n<ul>\n<li>**Evaluator \u770b\u4e0d\u5230 Generator \u7684\u81ea\u8ff0\u3002**\u5b83\u53ea\u770b diff\u3002\u8fd9\u6837\u8bc4\u4f30\u7684\u5224\u636e\u662f\u300c\u4ee3\u7801\u53d8\u4e86\u4ec0\u4e48\u300d&#xff0c;\u4e0d\u662f\u300c\u4f5c\u8005\u8bf4\u5b83\u60f3\u5e72\u4ec0\u4e48\u300d\u3002<\/li>\n<li>**Fixer \u770b\u4e0d\u5230 Evaluator \u7684\u5206\u6570\u3002**\u5b83\u53ea\u770b\u300c\u54ea\u6761\u65ad\u8a00\u5931\u8d25\u3001\u9519\u8bef\u6808\u662f\u4ec0\u4e48\u300d\u3002\u5206\u6570\u662f\u4e00\u4e2a\u8fde\u7eed\u91cf&#xff0c;\u6a21\u578b\u4f1a\u53bb\u4f18\u5316\u5206\u6570\u800c\u4e0d\u662f\u4f18\u5316\u6b63\u786e\u6027&#xff1b;\u5931\u8d25\u9879\u662f\u4e00\u4e2a\u79bb\u6563\u96c6\u5408&#xff0c;\u6a21\u578b\u53ea\u80fd\u53bb\u628a\u5b83\u53d8\u6210\u7a7a\u96c6\u3002<\/li>\n<\/ul>\n<h4>3.8 \u7ed3\u6784\u5316\u8f93\u51fa schema \u5f3a\u5236<\/h4>\n<p>\u6a21\u578b\u8f93\u51fa\u5982\u679c\u662f\u4e00\u6bb5\u81ea\u7136\u8bed\u8a00\u5305\u88f9\u7684\u4ee3\u7801\u5757&#xff0c;\u4f60\u5c31\u5f97\u7528\u6b63\u5219\u53bb\u62a0&#xff0c;\u62a0\u9519\u4e86\u5c31\u9759\u9ed8\u5931\u8d25\u3002\u7ed3\u6784\u5316\u8f93\u51fa schema \u5f3a\u5236\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898&#xff1a;\u6240\u6709\u6a21\u578b\u8f93\u51fa\u5fc5\u987b\u662f\u4e00\u4e2a\u80fd\u88ab JSON Schema \u6821\u9a8c\u7684\u5bf9\u8c61&#xff0c;\u6821\u9a8c\u4e0d\u8fc7\u5c31\u628a\u6821\u9a8c\u9519\u8bef\u56de\u5582&#xff0c;\u6700\u591a\u91cd\u8bd5 N \u6b21&#xff0c;N \u6b21\u4e0d\u8fc7\u5c31\u6574\u8f6e\u5931\u8d25\u3002<\/p>\n<p>\u8fd9\u6761\u8fb9\u754c\u9632\u7684\u662f\u4e24\u7c7b\u6c61\u67d3&#xff1a;\u4e00\u662f\u6a21\u578b\u5728 JSON \u5916\u9762\u5957\u4e00\u5c42\u300c\u597d\u7684&#xff0c;\u6211\u6765\u770b\u770b\u8fd9\u4e2a\u95ee\u9898\u2026\u2026\u300d\u7684\u95f2\u804a&#xff0c;\u4e8c\u662f\u6a21\u578b\u5728 files \u6570\u7ec4\u91cc\u585e\u4e86\u4e00\u4e2a\u6ca1\u5728 analysis \u91cc\u63d0\u5230\u8fc7\u7684\u6587\u4ef6\u3002\u524d\u8005\u7834\u574f\u89e3\u6790&#xff0c;\u540e\u8005\u7834\u574f\u53ef\u5ba1\u8ba1\u6027\u3002<\/p>\n<h4>3.9 \u6982\u7387\u751f\u6210\u8be5\u88ab\u786e\u5b9a\u6027\u4ee3\u7801\u66ff\u6362\u7684\u5730\u65b9<\/h4>\n<p>\u8fd9\u662f\u672c\u6587\u6211\u6700\u60f3\u5f3a\u8c03\u3001\u4e5f\u6700\u5bb9\u6613\u88ab\u5ffd\u7565\u7684\u4e00\u8282\u3002<\/p>\n<p>\u5728\u4e00\u4e2a Agent \u6d41\u6c34\u7ebf\u91cc&#xff0c;\u6709\u4e9b\u73af\u8282\u660e\u660e\u6709 100% \u786e\u5b9a\u6027\u7684\u7b97\u6cd5\u5b9e\u73b0&#xff0c;\u56e2\u961f\u5374\u4e60\u60ef\u6027\u5730\u8ba9\u6a21\u578b\u53bb\u505a&#xff0c;\u7406\u7531\u662f\u300c\u987a\u624b\u300d\u3002\u8fd9\u662f\u7eaf\u4e8f&#xff1a;\u4ed8\u4e86 token\u3001\u4ed8\u4e86\u5ef6\u8fdf\u3001\u5f15\u5165\u4e86\u975e\u786e\u5b9a\u6027&#xff0c;\u6362\u6765\u7684\u6b63\u786e\u7387\u8fd8\u66f4\u4f4e\u3002<\/p>\n<table>\n<tr>\u73af\u8282\u9519\u8bef\u505a\u6cd5&#xff08;LLM&#xff09;\u6b63\u786e\u505a\u6cd5&#xff08;\u96f6 LLM \u8c03\u7528&#xff09;\u5e72\u6389\u7684\u5e7b\u89c9token \u6d88\u8017<\/tr>\n<tbody>\n<tr>\n<td>Schema Validator<\/td>\n<td>\u8ba9\u6a21\u578b\u5224\u65ad\u300c\u8fd9\u6bb5\u8f93\u51fa\u7b26\u5408 schema \u5417\u300d<\/td>\n<td>jsonschema.validate() \/ pydantic<\/td>\n<td>\u5047\u9633\u6027&#xff08;\u6a21\u578b\u8bf4\u7b26\u5408\u5176\u5b9e\u4e0d\u7b26\u5408&#xff09;<\/td>\n<td>\u964d\u5230 0<\/td>\n<\/tr>\n<tr>\n<td>Documentation Builder<\/td>\n<td>\u8ba9\u6a21\u578b\u4ece docstring \u751f\u6210 API \u6587\u6863<\/td>\n<td>pydoc \/ sphinx.ext.autodoc \/ griffe \u76f4\u63a5\u89e3\u6790 AST<\/td>\n<td>\u7f16\u9020\u4e0d\u5b58\u5728\u7684\u53c2\u6570\u4e0e\u9ed8\u8ba4\u503c<\/td>\n<td>\u964d\u5230 0<\/td>\n<\/tr>\n<tr>\n<td>\u4f9d\u8d56\u7248\u672c\u89e3\u6790<\/td>\n<td>\u8ba9\u6a21\u578b\u63a8\u8350\u7248\u672c\u53f7<\/td>\n<td>\u89e3\u6790 pyproject.toml &#043; \u67e5\u8be2\u7d22\u5f15 API<\/td>\n<td>\u7f16\u9020\u4e0d\u5b58\u5728\u7684\u7248\u672c\u53f7<\/td>\n<td>\u964d\u5230 0<\/td>\n<\/tr>\n<tr>\n<td>diff \u751f\u6210<\/td>\n<td>\u8ba9\u6a21\u578b\u8f93\u51fa diff \u6587\u672c<\/td>\n<td>\u6a21\u578b\u8f93\u51fa\u6587\u4ef6\u5185\u5bb9&#xff0c;harness \u8c03\u7528 difflib<\/td>\n<td>\u884c\u53f7\u7b97\u9519\u5bfc\u81f4 patch \u6253\u4e0d\u4e0a<\/td>\n<td>\u964d\u5230 0<\/td>\n<\/tr>\n<tr>\n<td>\u6d4b\u8bd5\u9009\u62e9<\/td>\n<td>\u8ba9\u6a21\u578b\u731c\u8be5\u8dd1\u54ea\u4e9b\u6d4b\u8bd5<\/td>\n<td>\u8986\u76d6\u7387\u53cd\u67e5 &#043; import \u56fe&#xff08;\u5982 pytest &#8211;testmon&#xff09;<\/td>\n<td>\u8dd1\u9519\u6d4b\u8bd5\u5b50\u96c6&#xff0c;\u5047\u7eff<\/td>\n<td>\u964d\u5230 0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5224\u5b9a\u6807\u51c6\u5f88\u7b80\u5355&#xff0c;\u95ee\u81ea\u5df1\u4e00\u4e2a\u95ee\u9898&#xff1a;**\u8fd9\u4e2a\u73af\u8282\u7684\u8f93\u5165\u548c\u8f93\u51fa\u4e4b\u95f4&#xff0c;\u662f\u4e0d\u662f\u5b58\u5728\u4e00\u4e2a\u6211\u53ef\u4ee5\u5199\u51fa\u6765\u7684\u786e\u5b9a\u6027\u51fd\u6570&#xff1f;**\u5982\u679c\u5b58\u5728&#xff0c;\u5c31\u4e0d\u8981\u7528\u6a21\u578b\u3002\u6a21\u578b\u7684\u6b63\u786e\u4f4d\u7f6e\u662f\u90a3\u4e2a\u4f60\u5199\u4e0d\u51fa\u786e\u5b9a\u6027\u51fd\u6570\u7684\u5730\u65b9\u2014\u2014\u7406\u89e3\u9700\u6c42\u3001\u8bbe\u8ba1\u6539\u52a8\u3001\u5b9a\u4f4d\u6839\u56e0\u3002<\/p>\n<p>\u6211\u5728\u81ea\u5df1\u7684\u6d41\u6c34\u7ebf\u91cc\u505a\u4e86\u4e00\u6b21\u6e05\u7406&#xff0c;\u628a 5 \u4e2a\u73af\u8282\u6362\u6210\u786e\u5b9a\u6027\u5b9e\u73b0&#xff0c;\u7ed3\u679c\u662f&#xff1a;\u8be5\u9636\u6bb5 token \u4ece\u6bcf\u4efb\u52a1\u7ea6 21000 \u964d\u5230\u7ea6 14000&#xff08;\u964d 33%&#xff09;&#xff0c;\u7aef\u5230\u7aef P50 \u5ef6\u8fdf\u4ece 96s \u964d\u5230 61s&#xff0c;\u800c\u300c\u8f93\u51fa\u683c\u5f0f\u7c7b\u300d\u6545\u969c\u4ece\u6bcf 100 \u4efb\u52a1 11 \u6b21\u964d\u5230 0 \u6b21\u3002<\/p>\n<h3>\u56db\u3001\u73af\u5883\u4e0e\u4f9d\u8d56\u51c6\u5907<\/h3>\n<h4>4.1 \u7248\u672c\u4e0e\u786c\u4ef6<\/h4>\n<table>\n<tr>\u9879\u76ee\u7248\u672c\/\u89c4\u683c\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>Python<\/td>\n<td>3.11.9<\/td>\n<td>3.10 \u4e5f\u80fd\u8dd1&#xff0c;3.12 \u4e0a resource \u6a21\u5757\u884c\u4e3a\u4e00\u81f4<\/td>\n<\/tr>\n<tr>\n<td>git<\/td>\n<td>2.45&#043;<\/td>\n<td>\u9700\u8981 git diff &#8211;binary \u4e0e apply &#8211;check<\/td>\n<\/tr>\n<tr>\n<td>pytest<\/td>\n<td>8.3.2<\/td>\n<td>\u65ad\u8a00\u4e3b\u529b<\/td>\n<\/tr>\n<tr>\n<td>pytest-timeout<\/td>\n<td>2.3.1<\/td>\n<td>\u5355\u6d4b\u7ea7\u8d85\u65f6&#xff0c;\u9632\u6b62\u6c99\u7bb1\u88ab\u4e00\u4e2a\u6b7b\u5faa\u73af\u6302\u4f4f<\/td>\n<\/tr>\n<tr>\n<td>ruff<\/td>\n<td>0.6.8<\/td>\n<td>L0 \u65ad\u8a00<\/td>\n<\/tr>\n<tr>\n<td>mypy<\/td>\n<td>1.11.2<\/td>\n<td>L1 \u65ad\u8a00&#xff08;\u53ef\u9009&#xff0c;Python \u9879\u76ee\u5efa\u8bae\u5f00&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>pydantic<\/td>\n<td>2.9.2<\/td>\n<td>\u7ed3\u6784\u5316\u8f93\u51fa schema \u5f3a\u5236<\/td>\n<\/tr>\n<tr>\n<td>psutil<\/td>\n<td>6.0.0<\/td>\n<td>\u91c7\u96c6\u5b50\u8fdb\u7a0b peak RSS&#xff0c;\u7528\u4e8e\u6c99\u7bb1\u5ea6\u91cf<\/td>\n<\/tr>\n<tr>\n<td>\u64cd\u4f5c\u7cfb\u7edf<\/td>\n<td>Linux 5.15&#043;&#xff08;\u63a8\u8350&#xff09;\/ macOS 14 \/ Windows 11<\/td>\n<td>\u7f51\u7edc\u9694\u79bb\u4ec5\u5728 Linux \u4e0a\u6709\u786c\u4fdd\u8bc1<\/td>\n<\/tr>\n<tr>\n<td>CPU \/ \u5185\u5b58<\/td>\n<td>4 \u6838 \/ 8GB<\/td>\n<td>\u6c99\u7bb1\u5730\u5740\u7a7a\u95f4\u9ed8\u8ba4\u9650 2GB<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>4.2 \u5b89\u88c5<\/h4>\n<p>python <span class=\"token parameter variable\">-m<\/span> venv .venv <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token builtin class-name\">source<\/span> .venv\/bin\/activate    <span class=\"token comment\"># Windows: .venv\\\\Scripts\\\\activate<\/span><br \/>\npip <span class=\"token function\">install<\/span> <span class=\"token string\">&#034;pytest&#061;&#061;8.3.2&#034;<\/span> <span class=\"token string\">&#034;pytest-timeout&#061;&#061;2.3.1&#034;<\/span> <span class=\"token string\">&#034;ruff&#061;&#061;0.6.8&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n            <span class=\"token string\">&#034;mypy&#061;&#061;1.11.2&#034;<\/span> <span class=\"token string\">&#034;pydantic&#061;&#061;2.9.2&#034;<\/span> <span class=\"token string\">&#034;psutil&#061;&#061;6.0.0&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u7f51\u7edc\u9694\u79bb&#xff08;Linux \u4e0a\u624d\u4f1a\u771f\u6b63\u751f\u6548&#xff0c;\u5176\u4ed6\u5e73\u53f0 harness \u4f1a\u964d\u7ea7\u5e76\u544a\u8b66&#xff09;<\/span><br \/>\n<span class=\"token function\">which<\/span> unshare <span class=\"token operator\">&gt;<\/span>\/dev\/null <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span><span class=\"token file-descriptor important\">&amp;1<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;network isolation: available&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n                               <span class=\"token operator\">||<\/span> <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;network isolation: DEGRADED&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u76ee\u6807\u4ed3\u5e93\u5fc5\u987b\u662f git \u4ed3\u5e93&#xff0c;\u4e14\u5de5\u4f5c\u533a\u5e72\u51c0&#xff08;\u810f\u4e5f\u53ef\u4ee5&#xff0c;harness \u4f1a\u628a\u810f\u72b6\u6001\u7eb3\u5165\u5feb\u7167&#xff09;<\/span><br \/>\n<span class=\"token function\">git<\/span> rev-parse &#8211;is-inside-work-tree<\/p>\n<h4>4.3 \u76ee\u5f55\u7ea6\u5b9a<\/h4>\n<p>repo\/<br \/>\n&#043;&#8211; .harness\/<br \/>\n|   &#043;&#8211; snapshots\/          # patch \u6587\u4ef6&#xff0c;\u6309 run_id \u5b58<br \/>\n|   &#043;&#8211; journal.jsonl       # \u5de5\u5177\u8c03\u7528\u8d26\u672c&#xff0c;\u542b\u5e42\u7b49\u952e<br \/>\n|   &#043;&#8211; reports\/            # \u6bcf\u8f6e RunReport JSON<br \/>\n&#043;&#8211; src\/                    # \u88ab\u4fee\u6539\u7684\u6e90\u7801&#xff08;\u6c99\u7bb1\u5185\u53ef\u5199&#xff09;<br \/>\n&#043;&#8211; tests\/                  # \u65ad\u8a00&#xff08;\u6c99\u7bb1\u5185\u53ea\u8bfb&#xff09;<br \/>\n&#043;&#8211; harness\/                # harness \u81ea\u8eab\u4ee3\u7801<\/p>\n<h3>\u4e94\u3001\u5b8c\u6574\u5b9e\u64cd<\/h3>\n<p>\u8fd9\u4e00\u8282\u7ed9\u51fa\u4e00\u5957\u80fd\u76f4\u63a5\u8dd1\u7684\u5b9e\u73b0\u3002\u6587\u4ef6\u62c6\u6210 6 \u4e2a\u6a21\u5757&#xff0c;\u6700\u540e\u7528\u4e00\u4e2a CLI \u4e32\u8d77\u6765\u3002\u6240\u6709\u4ee3\u7801\u90fd\u5728 Python 3.11 \u4e0a\u9a8c\u8bc1\u8fc7\u3002<\/p>\n<h4>5.1 \u6b65\u6570\u9884\u7b97\u4e0e\u6210\u672c\u7194\u65ad<\/h4>\n<p>\u9884\u7b97\u56db\u7c7b\u7ef4\u5ea6\u72ec\u7acb\u8ba1&#xff0c;\u4efb\u610f\u89e6\u9876\u5373\u505c\u3002\u6ce8\u610f spend() \u91cc\u628a token \u548c\u94b1\u5206\u5f00\u8bb0\u2014\u2014\u5b83\u4eec\u7684\u89e6\u9876\u987a\u5e8f\u4f1a\u544a\u8bc9\u4f60\u9884\u7b97\u662f\u88ab\u300c\u8bdd\u591a\u300d\u8fd8\u662f\u88ab\u300c\u8dd1\u5f97\u6162\u300d\u5403\u6389\u7684\u3002<\/p>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;budget.py \u2014 \u6b65\u6570\/\u5899\u949f\/token\/\u6210\u672c\u56db\u7ef4\u9884\u7b97\u4e0e\u7194\u65ad\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<span class=\"token punctuation\">,<\/span> field<\/p>\n<p><span class=\"token comment\"># USD \/ 1K tokens\u3002\u6362\u6210\u4f60\u81ea\u5df1\u7f51\u5173\u7684\u5b9e\u9645\u5355\u4ef7&#xff0c;\u522b\u7167\u6284\u3002<\/span><br \/>\nPRICING <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#034;generator&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;in&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">0.0030<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;out&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">0.0150<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;evaluator&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;in&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">0.0030<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;out&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">0.0150<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;fixer&#034;<\/span><span class=\"token punctuation\">:<\/span>     <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;in&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">0.0030<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;out&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">0.0150<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">BudgetExceeded<\/span><span class=\"token punctuation\">(<\/span>Exception<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u9884\u7b97\u89e6\u9876\u3002\u643a\u5e26 reason \u4e0e\u5df2\u6d88\u8017\u91cf&#xff0c;\u4f9b RunReport \u8bb0\u5f55\u3002&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> reason<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> budget<span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;Budget&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>reason <span class=\"token operator\">&#061;<\/span> reason<br \/>\n        self<span class=\"token punctuation\">.<\/span>budget <span class=\"token operator\">&#061;<\/span> budget<br \/>\n        <span class=\"token builtin\">super<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>__init__<span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;budget tripped: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>reason<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> &#034;<\/span><\/span><br \/>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;(steps&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>budget<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>budget<span class=\"token punctuation\">.<\/span>max_steps<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">, &#034;<\/span><\/span><br \/>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;cost&#061;$<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>budget<span class=\"token punctuation\">.<\/span>cost_usd<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.4f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/$<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>budget<span class=\"token punctuation\">.<\/span>max_cost_usd<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">, &#034;<\/span><\/span><br \/>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;tokens&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>budget<span class=\"token punctuation\">.<\/span>tokens<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>budget<span class=\"token punctuation\">.<\/span>max_tokens<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">, &#034;<\/span><\/span><br \/>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;t&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>budget<span class=\"token punctuation\">.<\/span>elapsed<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.1f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>budget<span class=\"token punctuation\">.<\/span>max_wall_clock_s<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s)&#034;<\/span><\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Budget<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    max_steps<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">8<\/span><br \/>\n    max_wall_clock_s<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">300.0<\/span><br \/>\n    max_tokens<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">400_000<\/span><br \/>\n    max_cost_usd<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.50<\/span><br \/>\n    <span class=\"token comment\"># \u5b9e\u6d4b\u6d88\u8017<\/span><br \/>\n    steps<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    tokens<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    cost_usd<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><br \/>\n    _t0<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span>time<span class=\"token punctuation\">.<\/span>monotonic<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">repr<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># &#8212;- \u67e5\u8be2 &#8212;-<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">elapsed<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> time<span class=\"token punctuation\">.<\/span>monotonic<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> self<span class=\"token punctuation\">.<\/span>_t0<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">remaining<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;steps&#034;<\/span><span class=\"token punctuation\">:<\/span> self<span class=\"token punctuation\">.<\/span>max_steps <span class=\"token operator\">&#8211;<\/span> self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;tokens&#034;<\/span><span class=\"token punctuation\">:<\/span> self<span class=\"token punctuation\">.<\/span>max_tokens <span class=\"token operator\">&#8211;<\/span> self<span class=\"token punctuation\">.<\/span>tokens<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;cost_usd&#034;<\/span><span class=\"token punctuation\">:<\/span> self<span class=\"token punctuation\">.<\/span>max_cost_usd <span class=\"token operator\">&#8211;<\/span> self<span class=\"token punctuation\">.<\/span>cost_usd<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;seconds&#034;<\/span><span class=\"token punctuation\">:<\/span> self<span class=\"token punctuation\">.<\/span>max_wall_clock_s <span class=\"token operator\">&#8211;<\/span> self<span class=\"token punctuation\">.<\/span>elapsed<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\"># &#8212;- \u8bb0\u8d26 &#8212;-<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">spend<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> role<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> in_tok<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> out_tok<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        p <span class=\"token operator\">&#061;<\/span> PRICING<span class=\"token punctuation\">[<\/span>role<span class=\"token punctuation\">]<\/span><br \/>\n        usd <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>in_tok <span class=\"token operator\">*<\/span> p<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;in&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> out_tok <span class=\"token operator\">*<\/span> p<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;out&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">1000.0<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>tokens <span class=\"token operator\">&#043;&#061;<\/span> in_tok <span class=\"token operator\">&#043;<\/span> out_tok<br \/>\n        self<span class=\"token punctuation\">.<\/span>cost_usd <span class=\"token operator\">&#043;&#061;<\/span> usd<br \/>\n        <span class=\"token keyword\">return<\/span> usd<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">step<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8fdb\u5165\u65b0\u4e00\u8f6e\u8fed\u4ee3\u524d\u8c03\u7528\u3002\u56db\u4e2a\u7ef4\u5ea6\u5168\u90e8\u68c0\u67e5\u3002&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token comment\"># \u987a\u5e8f\u6709\u8bb2\u7a76&#xff1a;\u5148\u68c0\u67e5\u4e0a\u4e00\u8f6e\u5df2\u7ecf\u82b1\u6389\u7684\u94b1\u548c token&#xff0c;<\/span><br \/>\n        <span class=\"token comment\"># \u518d\u51b3\u5b9a\u8981\u4e0d\u8981\u5f00\u65b0\u7684\u4e00\u8f6e\u3002\u7edd\u4e0d\u80fd\u5148\u5f00\u8f6e\u518d\u68c0\u67e5\u3002<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>cost_usd <span class=\"token operator\">&gt;&#061;<\/span> self<span class=\"token punctuation\">.<\/span>max_cost_usd<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> BudgetExceeded<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;cost_tripped&#034;<\/span><span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>tokens <span class=\"token operator\">&gt;&#061;<\/span> self<span class=\"token punctuation\">.<\/span>max_tokens<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> BudgetExceeded<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;token_exhausted&#034;<\/span><span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>elapsed<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;&#061;<\/span> self<span class=\"token punctuation\">.<\/span>max_wall_clock_s<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> BudgetExceeded<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;timeout&#034;<\/span><span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>steps <span class=\"token operator\">&gt;&#061;<\/span> self<span class=\"token punctuation\">.<\/span>max_steps<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> BudgetExceeded<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;steps_exhausted&#034;<\/span><span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>steps <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">1<\/span><\/p>\n<p>    <span class=\"token comment\"># &#8212;- \u8f6f\u7194\u65ad\u9884\u8b66 &#8212;-<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">pressure<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8fd4\u56de 0~1 \u7684\u9884\u7b97\u538b\u529b\u503c&#xff0c;&gt;0.8 \u65f6\u4e0a\u5c42\u5e94\u5207\u6362\u5230\u4fdd\u5b88\u7b56\u7565<br \/>\n        &#xff08;\u4f8b\u5982\u53ea\u8dd1 L3 \u76ee\u6807\u6d4b\u8bd5\u3001\u4e0d\u518d\u505a\u5168\u91cf\u56de\u5f52\u3001\u4e0d\u518d\u91cd\u8bd5 schema&#xff09;\u3002&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">max<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>steps <span class=\"token operator\">\/<\/span> self<span class=\"token punctuation\">.<\/span>max_steps<span class=\"token punctuation\">,<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>tokens <span class=\"token operator\">\/<\/span> self<span class=\"token punctuation\">.<\/span>max_tokens<span class=\"token punctuation\">,<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>cost_usd <span class=\"token operator\">\/<\/span> self<span class=\"token punctuation\">.<\/span>max_cost_usd<span class=\"token punctuation\">,<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>elapsed<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> self<span class=\"token punctuation\">.<\/span>max_wall_clock_s<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    b <span class=\"token operator\">&#061;<\/span> Budget<span class=\"token punctuation\">(<\/span>max_steps<span class=\"token operator\">&#061;<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span> max_cost_usd<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0.02<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> i <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            b<span class=\"token punctuation\">.<\/span>step<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            b<span class=\"token punctuation\">.<\/span>spend<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;generator&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1200<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">800<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;step <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>b<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">: cost&#061;$<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>b<span class=\"token punctuation\">.<\/span>cost_usd<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.4f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> pressure&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>b<span class=\"token punctuation\">.<\/span>pressure<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">except<\/span> BudgetExceeded <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;STOP -&gt;&#034;<\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><\/p>\n<p>\u8dd1\u4e00\u4e0b\u4f1a\u770b\u5230\u7b2c 2 \u8f6e\u4e4b\u540e\u6210\u672c\u89e6\u9876&#xff1a;<\/p>\n<p>step 1: cost&#061;$0.0168 pressure&#061;0.84<br \/>\nstep 2: cost&#061;$0.0336 pressure&#061;1.00<br \/>\nSTOP -&gt; budget tripped: cost_tripped (steps&#061;2\/3, cost&#061;$0.0336\/$0.02, tokens&#061;4000\/400000, t&#061;0.0s\/300s)<\/p>\n<p>pressure() \u8fd9\u4e2a\u8f6f\u6307\u6807\u503c\u5f97\u5355\u72ec\u8bf4\u3002\u786c\u7194\u65ad\u662f\u300c\u5230\u70b9\u4e86\u5fc5\u987b\u505c\u300d&#xff0c;\u8f6f\u538b\u529b\u662f\u300c\u5feb\u5230\u70b9\u4e86&#xff0c;\u6362\u4fbf\u5b9c\u7684\u6253\u6cd5\u300d\u3002\u6211\u5728 harness \u91cc\u7684\u7528\u6cd5\u662f&#xff1a;pressure() &gt; 0.8 \u65f6&#xff0c;\u628a\u65ad\u8a00\u4ece L0-L3 \u6536\u7f29\u5230\u53ea\u8dd1 L3 \u76ee\u6807\u6d4b\u8bd5&#xff0c;\u540c\u65f6\u628a\u6a21\u578b\u4ece\u5f3a\u6a21\u578b\u5207\u5230\u4fbf\u5b9c\u6a21\u578b&#xff0c;\u628a\u5269\u4f59\u9884\u7b97\u82b1\u5728\u5200\u5203\u4e0a\u3002<\/p>\n<h4>5.2 \u9694\u79bb\u6267\u884c\u6c99\u7bb1<\/h4>\n<p>\u6c99\u7bb1\u7684\u4e09\u4e2a\u9762&#xff1a;\u4e34\u65f6\u6587\u4ef6\u7cfb\u7edf\u3001\u8d44\u6e90\u9650\u5236\u3001\u51c0\u5316\u540e\u7684\u73af\u5883\u3002Windows \u4e0a\u6ca1\u6709 RLIMIT_AS \u4e0e unshare&#xff0c;\u4ee3\u7801\u91cc\u505a\u4e86\u663e\u5f0f\u964d\u7ea7\u5e76\u6253\u8b66\u544a\u2014\u2014\u4e0d\u8981\u9759\u9ed8\u8df3\u8fc7\u3002<\/p>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;sandbox.py \u2014 \u4e34\u65f6\u76ee\u5f55 &#043; \u8d44\u6e90\u9650\u5236 &#043; \u73af\u5883\u51c0\u5316 &#043; \u8d85\u65f6\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> os<br \/>\n<span class=\"token keyword\">import<\/span> platform<br \/>\n<span class=\"token keyword\">import<\/span> resource<br \/>\n<span class=\"token keyword\">import<\/span> shutil<br \/>\n<span class=\"token keyword\">import<\/span> subprocess<br \/>\n<span class=\"token keyword\">import<\/span> sys<br \/>\n<span class=\"token keyword\">import<\/span> tempfile<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<br \/>\n<span class=\"token keyword\">from<\/span> pathlib <span class=\"token keyword\">import<\/span> Path<\/p>\n<p>IS_LINUX <span class=\"token operator\">&#061;<\/span> platform<span class=\"token punctuation\">.<\/span>system<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;Linux&#034;<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Limits<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    cpu_seconds<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">20<\/span><br \/>\n    address_space_mb<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">2048<\/span><br \/>\n    fsize_mb<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">64<\/span>          <span class=\"token comment\"># \u5355\u4e2a\u6587\u4ef6\u6700\u5927\u4f53\u79ef&#xff0c;\u9632\u6b62\u5199\u7206\u78c1\u76d8<\/span><br \/>\n    nproc<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">64<\/span><br \/>\n    wall_clock_s<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">60<\/span><br \/>\n    deny_network<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">RunResult<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    argv<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    exit_code<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><br \/>\n    stdout<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    stderr<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    duration_ms<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><br \/>\n    killed_by<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span>   <span class=\"token comment\"># timeout \/ rlimit \/ None<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">_preexec<\/span><span class=\"token punctuation\">(<\/span>limits<span class=\"token punctuation\">:<\/span> Limits<span class=\"token punctuation\">,<\/span> tmp_home<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5b50\u8fdb\u7a0b\u5165\u53e3&#xff1a;\u5148\u8bbe\u8d44\u6e90\u4e0a\u9650&#xff0c;\u518d\u5207\u8fdb\u7a0b\u7ec4&#xff08;\u4fbf\u4e8e\u6574\u7ec4 kill&#xff09;\u3002&#034;&#034;&#034;<\/span><br \/>\n    os<span class=\"token punctuation\">.<\/span>setsid<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    mb <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1024<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1024<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> IS_LINUX<span class=\"token punctuation\">:<\/span><br \/>\n        resource<span class=\"token punctuation\">.<\/span>setrlimit<span class=\"token punctuation\">(<\/span>resource<span class=\"token punctuation\">.<\/span>RLIMIT_CPU<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>limits<span class=\"token punctuation\">.<\/span>cpu_seconds<span class=\"token punctuation\">,<\/span> limits<span class=\"token punctuation\">.<\/span>cpu_seconds <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        resource<span class=\"token punctuation\">.<\/span>setrlimit<span class=\"token punctuation\">(<\/span>resource<span class=\"token punctuation\">.<\/span>RLIMIT_AS<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>limits<span class=\"token punctuation\">.<\/span>address_space_mb <span class=\"token operator\">*<\/span> mb<span class=\"token punctuation\">,<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        resource<span class=\"token punctuation\">.<\/span>setrlimit<span class=\"token punctuation\">(<\/span>resource<span class=\"token punctuation\">.<\/span>RLIMIT_FSIZE<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>limits<span class=\"token punctuation\">.<\/span>fsize_mb <span class=\"token operator\">*<\/span> mb<span class=\"token punctuation\">,<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        resource<span class=\"token punctuation\">.<\/span>setrlimit<span class=\"token punctuation\">(<\/span>resource<span class=\"token punctuation\">.<\/span>RLIMIT_NPROC<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>limits<span class=\"token punctuation\">.<\/span>nproc<span class=\"token punctuation\">,<\/span> limits<span class=\"token punctuation\">.<\/span>nproc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        resource<span class=\"token punctuation\">.<\/span>setrlimit<span class=\"token punctuation\">(<\/span>resource<span class=\"token punctuation\">.<\/span>RLIMIT_CORE<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>      <span class=\"token comment\"># \u4e0d\u8f6c core&#xff0c;\u7701\u78c1\u76d8<\/span><br \/>\n    os<span class=\"token punctuation\">.<\/span>environ<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;HOME&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> tmp_home          <span class=\"token comment\"># \u5173\u952e&#xff1a;\u8ba9 ~\/.aws\u3001~\/.ssh \u5168\u90e8\u5931\u6548<\/span><br \/>\n    os<span class=\"token punctuation\">.<\/span>environ<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;PYTHONPYCACHEPREFIX&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> os<span class=\"token punctuation\">.<\/span>path<span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>tmp_home<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;pycache&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">_clean_env<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u767d\u540d\u5355\u73af\u5883\u3002\u4efb\u4f55\u53ef\u80fd\u643a\u5e26\u51ed\u8bc1\u7684\u53d8\u91cf\u90fd\u4e0d\u5728\u767d\u540d\u5355\u91cc\u3002&#034;&#034;&#034;<\/span><br \/>\n    keep <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;PATH&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;LANG&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;LC_ALL&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;TZ&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;SYSTEMROOT&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;TEMP&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;TMP&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    env <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span>k<span class=\"token punctuation\">:<\/span> v <span class=\"token keyword\">for<\/span> k<span class=\"token punctuation\">,<\/span> v <span class=\"token keyword\">in<\/span> os<span class=\"token punctuation\">.<\/span>environ<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> k <span class=\"token keyword\">in<\/span> keep<span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\"># \u663e\u5f0f\u6e05\u6389\u8fd9\u51e0\u7c7b&#xff0c;\u9632\u6b62\u5b50\u8fdb\u7a0b\u901a\u8fc7\u7ee7\u627f\u62ff\u5230\u5bbf\u4e3b\u8eab\u4efd<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> k <span class=\"token keyword\">in<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;SSH_AUTH_SOCK&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;AWS_PROFILE&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;AWS_ACCESS_KEY_ID&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;AWS_SECRET_ACCESS_KEY&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n              <span class=\"token string\">&#034;KUBECONFIG&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;DOCKER_HOST&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;GITHUB_TOKEN&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;OPENAI_API_KEY&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ANTHROPIC_API_KEY&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        env<span class=\"token punctuation\">.<\/span>pop<span class=\"token punctuation\">(<\/span>k<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> env<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Sandbox<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4e00\u6b21\u6027\u6c99\u7bb1\u3002with \u8bed\u53e5\u9000\u51fa\u65f6\u6574\u4e2a\u4e34\u65f6\u76ee\u5f55\u88ab\u5220\u9664\u3002&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> src<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span> limits<span class=\"token punctuation\">:<\/span> Limits <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                 ignore<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;.git&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;.venv&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;__pycache__&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;node_modules&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>src <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span>src<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>limits <span class=\"token operator\">&#061;<\/span> limits <span class=\"token keyword\">or<\/span> Limits<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>ignore <span class=\"token operator\">&#061;<\/span> ignore<br \/>\n        self<span class=\"token punctuation\">.<\/span>root<span class=\"token punctuation\">:<\/span> Path <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_warned <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__enter__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Path<span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>root <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span>tempfile<span class=\"token punctuation\">.<\/span>mkdtemp<span class=\"token punctuation\">(<\/span>prefix<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;harness-sbx-&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        work <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>root <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;work&#034;<\/span><br \/>\n        home <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>root <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;home&#034;<\/span><br \/>\n        home<span class=\"token punctuation\">.<\/span>mkdir<span class=\"token punctuation\">(<\/span>parents<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        shutil<span class=\"token punctuation\">.<\/span>copytree<span class=\"token punctuation\">(<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>src<span class=\"token punctuation\">,<\/span> work<span class=\"token punctuation\">,<\/span><br \/>\n            ignore<span class=\"token operator\">&#061;<\/span>shutil<span class=\"token punctuation\">.<\/span>ignore_patterns<span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>self<span class=\"token punctuation\">.<\/span>ignore<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            symlinks<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span>          <span class=\"token comment\"># \u4e0d\u8ddf\u968f\u7b26\u53f7\u94fe\u63a5&#xff0c;\u9632\u6b62\u8f6f\u94fe\u8df3\u51fa\u6c99\u7bb1<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>work <span class=\"token operator\">&#061;<\/span> work<br \/>\n        self<span class=\"token punctuation\">.<\/span>home <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>home<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>limits<span class=\"token punctuation\">.<\/span>deny_network <span class=\"token keyword\">and<\/span> <span class=\"token keyword\">not<\/span> IS_LINUX<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[warn] \u975e Linux \u5e73\u53f0&#xff1a;\u7f51\u7edc\u9694\u79bb\u964d\u7ea7\u4e3a\u73af\u5883\u53d8\u91cf\u51c0\u5316&#xff0c;&#034;<\/span><br \/>\n                  <span class=\"token string\">&#034;\u65e0\u6cd5\u963b\u6b62\u5b50\u8fdb\u7a0b\u4e3b\u52a8\u53d1\u8d77\u7f51\u7edc\u8fde\u63a5&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">file<\/span><span class=\"token operator\">&#061;<\/span>sys<span class=\"token punctuation\">.<\/span>stderr<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> work<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__exit__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">*<\/span>exc<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        shutil<span class=\"token punctuation\">.<\/span>rmtree<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>root<span class=\"token punctuation\">,<\/span> ignore_errors<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">run<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> argv<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> cwd<span class=\"token punctuation\">:<\/span> Path <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            env_extra<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> RunResult<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5728\u6c99\u7bb1\u91cc\u8dd1\u4e00\u6761\u547d\u4ee4\u3002\u8fd4\u56de\u7ed3\u6784\u5316\u7ed3\u679c&#xff0c;\u4e0d\u629b\u5f02\u5e38&#xff08;\u9664\u4e86\u771f\u6b63\u7684 OSError&#xff09;\u3002&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">import<\/span> time<br \/>\n        env <span class=\"token operator\">&#061;<\/span> _clean_env<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        env<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;HOME&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>home<br \/>\n        env<span class=\"token punctuation\">.<\/span>update<span class=\"token punctuation\">(<\/span>env_extra <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        cmd <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">(<\/span>argv<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token comment\"># Linux \u4e0a\u7528 unshare -n \u5efa\u4e00\u4e2a\u6ca1\u6709\u7f51\u7edc\u63a5\u53e3\u7684\u547d\u540d\u7a7a\u95f4<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> IS_LINUX <span class=\"token keyword\">and<\/span> self<span class=\"token punctuation\">.<\/span>limits<span class=\"token punctuation\">.<\/span>deny_network <span class=\"token keyword\">and<\/span> shutil<span class=\"token punctuation\">.<\/span>which<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;unshare&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            cmd <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;unshare&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-n&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">*<\/span>cmd<span class=\"token punctuation\">]<\/span><br \/>\n        t0 <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>monotonic<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            p <span class=\"token operator\">&#061;<\/span> subprocess<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span><br \/>\n                cmd<span class=\"token punctuation\">,<\/span><br \/>\n                cwd<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>cwd <span class=\"token keyword\">or<\/span> self<span class=\"token punctuation\">.<\/span>work<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                env<span class=\"token operator\">&#061;<\/span>env<span class=\"token punctuation\">,<\/span><br \/>\n                capture_output<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                text<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                timeout<span class=\"token operator\">&#061;<\/span>self<span class=\"token punctuation\">.<\/span>limits<span class=\"token punctuation\">.<\/span>wall_clock_s<span class=\"token punctuation\">,<\/span><br \/>\n                preexec_fn<span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">lambda<\/span><span class=\"token punctuation\">:<\/span> _preexec<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>limits<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>home<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">)<\/span><br \/>\n            killed <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n            code<span class=\"token punctuation\">,<\/span> out<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">&#061;<\/span> p<span class=\"token punctuation\">.<\/span>returncode<span class=\"token punctuation\">,<\/span> p<span class=\"token punctuation\">.<\/span>stdout<span class=\"token punctuation\">,<\/span> p<span class=\"token punctuation\">.<\/span>stderr<br \/>\n        <span class=\"token keyword\">except<\/span> subprocess<span class=\"token punctuation\">.<\/span>TimeoutExpired <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            killed <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;timeout&#034;<\/span><br \/>\n            code<span class=\"token punctuation\">,<\/span> out<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">124<\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">.<\/span>stdout <span class=\"token keyword\">or<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">.<\/span>stderr <span class=\"token keyword\">or<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n        <span class=\"token comment\"># CPU rlimit \u88ab\u89e6\u53d1\u65f6&#xff0c;\u5b50\u8fdb\u7a0b\u6536\u5230 SIGXCPU&#xff0c;\u9000\u51fa\u7801\u662f -24 \/ 152<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> code <span class=\"token keyword\">in<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">24<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">152<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            killed <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;rlimit_cpu&#034;<\/span><br \/>\n        <span class=\"token keyword\">elif<\/span> code <span class=\"token keyword\">in<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">9<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">137<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            killed <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;rlimit_mem&#034;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> RunResult<span class=\"token punctuation\">(<\/span>argv<span class=\"token operator\">&#061;<\/span>cmd<span class=\"token punctuation\">,<\/span> exit_code<span class=\"token operator\">&#061;<\/span>code<span class=\"token punctuation\">,<\/span> stdout<span class=\"token operator\">&#061;<\/span>out<span class=\"token punctuation\">,<\/span> stderr<span class=\"token operator\">&#061;<\/span>err<span class=\"token punctuation\">,<\/span><br \/>\n                         duration_ms<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>monotonic<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> t0<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> killed_by<span class=\"token operator\">&#061;<\/span>killed<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    demo <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span>tempfile<span class=\"token punctuation\">.<\/span>mkdtemp<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span>demo <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;boom.py&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>write_text<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;import time\\\\n&#034;<\/span><br \/>\n        <span class=\"token string\">&#034;buf &#061; []\\\\n&#034;<\/span><br \/>\n        <span class=\"token string\">&#034;while True:\\\\n&#034;<\/span><br \/>\n        <span class=\"token string\">&#034;    buf.append(&#039;x&#039; * 10_000_000)   # \u8bd5\u56fe\u5403\u6ee1\u5730\u5740\u7a7a\u95f4\\\\n&#034;<\/span><br \/>\n        <span class=\"token string\">&#034;    time.sleep(0.05)\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> Sandbox<span class=\"token punctuation\">(<\/span>demo<span class=\"token punctuation\">,<\/span> Limits<span class=\"token punctuation\">(<\/span>wall_clock_s<span class=\"token operator\">&#061;<\/span><span class=\"token number\">15<\/span><span class=\"token punctuation\">,<\/span> address_space_mb<span class=\"token operator\">&#061;<\/span><span class=\"token number\">256<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> work<span class=\"token punctuation\">:<\/span><br \/>\n        r <span class=\"token operator\">&#061;<\/span> Sandbox<span class=\"token punctuation\">(<\/span>demo<span class=\"token punctuation\">,<\/span> Limits<span class=\"token punctuation\">(<\/span>wall_clock_s<span class=\"token operator\">&#061;<\/span><span class=\"token number\">15<\/span><span class=\"token punctuation\">,<\/span> address_space_mb<span class=\"token operator\">&#061;<\/span><span class=\"token number\">256<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token punctuation\">[<\/span>sys<span class=\"token punctuation\">.<\/span>executable<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;boom.py&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> cwd<span class=\"token operator\">&#061;<\/span>work<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;exit&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">.<\/span>exit_code<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> killed_by&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">.<\/span>killed_by<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> ms&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">.<\/span>duration_ms<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">.<\/span>stderr <span class=\"token keyword\">or<\/span> r<span class=\"token punctuation\">.<\/span>stdout<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">300<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u5173\u4e8e preexec_fn&#xff1a;\u5b83\u5728\u591a\u7ebf\u7a0b\u8fdb\u7a0b\u91cc\u4e0d\u5b89\u5168&#xff0c;\u5982\u679c\u4f60\u7684 harness \u672c\u8eab\u662f async \u591a\u7ebf\u7a0b\u7684&#xff0c;\u6539\u6210\u628a\u9650\u5236\u5199\u8fdb\u4e00\u4e2a shell \u524d\u7f6e\u547d\u4ee4&#xff08;ulimit -v &#8230; &amp;&amp; exec &#8230;&#xff09;\u3002\u53e6\u5916 RLIMIT_AS \u5bf9 CPython \u6709\u4e2a\u526f\u4f5c\u7528\u2014\u2014CPython \u542f\u52a8\u65f6\u4f1a\u9884\u7559\u4e00\u5927\u7247\u865a\u62df\u5730\u5740\u7a7a\u95f4&#xff0c;\u9650\u5f97\u592a\u5c0f&#xff08;\u6bd4\u5982 512MB&#xff09;\u4f1a\u5bfc\u81f4\u89e3\u91ca\u5668\u8d77\u4e0d\u6765&#xff0c;\u7136\u540e\u4f60\u4f1a\u770b\u5230\u4e00\u4e2a\u83ab\u540d\u5176\u5999\u7684\u9000\u51fa\u7801 1\u3002\u6211\u7684\u7ecf\u9a8c\u503c\u662f \u4e0d\u4f4e\u4e8e 1.5GB&#xff0c;\u9700\u8981\u66f4\u591a\u5c31\u6539\u7528 cgroup\u3002<\/p>\n<h4>5.3 \u72b6\u6001\u5feb\u7167\u4e0e\u56de\u6eda&#xff08;\u542b\u672a\u8ddf\u8e2a\u6587\u4ef6&#xff09;<\/h4>\n<p>\u8fd9\u4e00\u8282\u7684\u4ee3\u7801\u76f4\u63a5\u5bf9\u5e94 3.4 \u8282\u90a3\u4e24\u4e2a\u51fd\u6570\u3002\u5173\u952e\u70b9&#xff1a;\u5feb\u7167\u7528 git add -A &#043; git diff &#8211;cached &#8211;binary&#xff0c;\u56de\u6eda\u7528 git apply -R&#xff0c;\u5e76\u4e14\u5728\u56de\u6eda\u524d\u5148 &#8211;check\u3002<\/p>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;checkpoint.py \u2014 git \u5feb\u7167\u4e0e\u56de\u6eda&#xff0c;\u672a\u8ddf\u8e2a\u6587\u4ef6\u4e00\u5e76\u7eb3\u5165\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> subprocess<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<br \/>\n<span class=\"token keyword\">from<\/span> pathlib <span class=\"token keyword\">import<\/span> Path<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">git<\/span><span class=\"token punctuation\">(<\/span>repo<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">*<\/span>args<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> check<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    p <span class=\"token operator\">&#061;<\/span> subprocess<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;git&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-C&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>repo<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">*<\/span>args<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                       capture_output<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> text<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> check <span class=\"token keyword\">and<\/span> p<span class=\"token punctuation\">.<\/span>returncode <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;git <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#039; &#039;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> failed: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>p<span class=\"token punctuation\">.<\/span>stderr<span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> p<span class=\"token punctuation\">.<\/span>stdout<\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Snapshot<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    repo<span class=\"token punctuation\">:<\/span> Path<br \/>\n    base<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span>          <span class=\"token comment\"># HEAD commit<\/span><br \/>\n    patch<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span>         <span class=\"token comment\"># \u542b\u4e8c\u8fdb\u5236\u4e0e\u65b0\u5efa\u6587\u4ef6\u7684\u5b8c\u6574 diff<\/span><br \/>\n    patch_file<span class=\"token punctuation\">:<\/span> Path<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Checkpoint<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> repo<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span> snap_dir<span class=\"token punctuation\">:<\/span> Path <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>repo <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span>repo<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>snap_dir <span class=\"token operator\">&#061;<\/span> snap_dir <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;.harness&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;snapshots&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>snap_dir<span class=\"token punctuation\">.<\/span>mkdir<span class=\"token punctuation\">(<\/span>parents<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> exist_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">snapshot<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> run_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Snapshot<span class=\"token punctuation\">:<\/span><br \/>\n        base <span class=\"token operator\">&#061;<\/span> git<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;rev-parse&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;HEAD&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token comment\"># \u5173\u952e\u4e00\u6b65&#xff1a;\u628a\u672a\u8ddf\u8e2a\u6587\u4ef6\u4e5f\u585e\u8fdb\u7d22\u5f15&#xff0c;\u8fd9\u6837 diff \u624d\u80fd\u8986\u76d6\u300c\u65b0\u5efa\u6587\u4ef6\u300d<\/span><br \/>\n        git<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;add&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-A&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        patch <span class=\"token operator\">&#061;<\/span> git<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;diff&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;cached&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;binary&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        git<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;reset&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-q&#034;<\/span><span class=\"token punctuation\">)<\/span>          <span class=\"token comment\"># \u8fd8\u539f\u7d22\u5f15&#xff0c;\u5de5\u4f5c\u533a\u4fdd\u6301\u539f\u6837<\/span><br \/>\n        pf <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>snap_dir <span class=\"token operator\">\/<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>run_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">.patch&#034;<\/span><\/span><br \/>\n        pf<span class=\"token punctuation\">.<\/span>write_text<span class=\"token punctuation\">(<\/span>patch<span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> Snapshot<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> base<span class=\"token punctuation\">,<\/span> patch<span class=\"token punctuation\">,<\/span> pf<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">revert<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> snap<span class=\"token punctuation\">:<\/span> Snapshot<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u53cd\u5411\u5e94\u7528 patch\u3002\u8fd4\u56de\u88ab\u6539\u52a8\/\u5220\u9664\u7684\u6587\u4ef6\u6e05\u5355&#xff08;\u7528\u4e8e\u62a5\u544a&#xff09;\u3002&#034;&#034;&#034;<\/span><br \/>\n        changed <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span>l<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\t&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">for<\/span> l <span class=\"token keyword\">in<\/span><br \/>\n                   git<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;diff&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;name-only&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>splitlines<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> l<span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        changed <span class=\"token operator\">&#043;&#061;<\/span> git<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ls-files&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;others&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;exclude-standard&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token comment\"># \u5148\u9a8c\u8bc1\u80fd\u4e0d\u80fd\u53cd\u7740\u6253\u56de\u53bb&#xff1b;\u6253\u4e0d\u56de\u53bb\u8bf4\u660e\u671f\u95f4\u6709\u4eba\u52a8\u8fc7\u5de5\u4f5c\u533a<\/span><br \/>\n        chk <span class=\"token operator\">&#061;<\/span> subprocess<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;git&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-C&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;apply&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;check&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-R&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;binary&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n             <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>snap<span class=\"token punctuation\">.<\/span>patch_file<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> capture_output<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> text<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> chk<span class=\"token punctuation\">.<\/span>returncode <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            git<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;apply&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-R&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;binary&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>snap<span class=\"token punctuation\">.<\/span>patch_file<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># \u515c\u5e95&#xff1a;\u5f3a\u884c\u56de\u5230 base&#xff0c;\u518d\u5220\u6389 base \u4e4b\u540e\u65b0\u5efa\u7684\u6587\u4ef6<\/span><br \/>\n            git<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;checkout&#034;<\/span><span class=\"token punctuation\">,<\/span> snap<span class=\"token punctuation\">.<\/span>base<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;.&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> f <span class=\"token keyword\">in<\/span> git<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ls-files&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;others&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;exclude-standard&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo <span class=\"token operator\">\/<\/span> f<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>unlink<span class=\"token punctuation\">(<\/span>missing_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        git<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;reset&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-q&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>changed<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">journal<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> run_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> tool<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> args_hash<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                idempotency_key<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> reversible<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5916\u90e8\u7cfb\u7edf\u5199\u64cd\u4f5c\u7684\u8d26\u672c\u3002\u4e0d\u53ef\u9006\u64cd\u4f5c\u5fc5\u987b\u6709 key&#xff0c;\u5426\u5219 harness \u62d2\u7edd\u8c03\u7528\u3002&#034;&#034;&#034;<\/span><br \/>\n        jf <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>repo <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;.harness&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;journal.jsonl&#034;<\/span><br \/>\n        jf<span class=\"token punctuation\">.<\/span>parent<span class=\"token punctuation\">.<\/span>mkdir<span class=\"token punctuation\">(<\/span>parents<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> exist_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">import<\/span> json<span class=\"token punctuation\">,<\/span> time<br \/>\n        <span class=\"token keyword\">with<\/span> jf<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;a&#034;<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> f<span class=\"token punctuation\">:<\/span><br \/>\n            f<span class=\"token punctuation\">.<\/span>write<span class=\"token punctuation\">(<\/span>json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;ts&#034;<\/span><span class=\"token punctuation\">:<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;run_id&#034;<\/span><span class=\"token punctuation\">:<\/span> run_id<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;tool&#034;<\/span><span class=\"token punctuation\">:<\/span> tool<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token string\">&#034;args_hash&#034;<\/span><span class=\"token punctuation\">:<\/span> args_hash<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;key&#034;<\/span><span class=\"token punctuation\">:<\/span> idempotency_key<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token string\">&#034;reversible&#034;<\/span><span class=\"token punctuation\">:<\/span> reversible<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">import<\/span> tempfile<span class=\"token punctuation\">,<\/span> os<br \/>\n    repo <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span>tempfile<span class=\"token punctuation\">.<\/span>mkdtemp<span class=\"token punctuation\">(<\/span>prefix<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;ckpt-demo-&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    os<span class=\"token punctuation\">.<\/span>system<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;git -C <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>repo<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> init -q &amp;&amp; git -C <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>repo<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> config user.email a&#064;b.c &#034;<\/span><\/span><br \/>\n              <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;&amp;&amp; git -C <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>repo<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> config user.name demo&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span>repo <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;a.py&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>write_text<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;x &#061; 1\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    git<span class=\"token punctuation\">(<\/span>repo<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;add&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;a.py&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> git<span class=\"token punctuation\">(<\/span>repo<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;commit&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-qm&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;init&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span>repo <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;untracked.env&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>write_text<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;LOCAL&#061;1\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span>   <span class=\"token comment\"># \u672a\u8ddf\u8e2a\u7684\u672c\u5730\u6587\u4ef6<\/span><\/p>\n<p>    cp <span class=\"token operator\">&#061;<\/span> Checkpoint<span class=\"token punctuation\">(<\/span>repo<span class=\"token punctuation\">)<\/span><br \/>\n    snap <span class=\"token operator\">&#061;<\/span> cp<span class=\"token punctuation\">.<\/span>snapshot<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;demo-1&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token punctuation\">(<\/span>repo <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;a.py&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>write_text<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;x &#061; 2\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span>              <span class=\"token comment\"># \u6539\u5df2\u6709\u6587\u4ef6<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span>repo <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;new_gen.py&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>write_text<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;print(&#039;gen&#039;)\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token comment\"># \u65b0\u5efa\u6587\u4ef6<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;after edit :&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span>p<span class=\"token punctuation\">.<\/span>name <span class=\"token keyword\">for<\/span> p <span class=\"token keyword\">in<\/span> repo<span class=\"token punctuation\">.<\/span>iterdir<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> p<span class=\"token punctuation\">.<\/span>is_file<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    reverted <span class=\"token operator\">&#061;<\/span> cp<span class=\"token punctuation\">.<\/span>revert<span class=\"token punctuation\">(<\/span>snap<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;after revert:&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span>p<span class=\"token punctuation\">.<\/span>name <span class=\"token keyword\">for<\/span> p <span class=\"token keyword\">in<\/span> repo<span class=\"token punctuation\">.<\/span>iterdir<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> p<span class=\"token punctuation\">.<\/span>is_file<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;a.py &#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>repo <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;a.py&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>read_text<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;untracked.env survived:&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>repo <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;untracked.env&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;touched:&#034;<\/span><span class=\"token punctuation\">,<\/span> reverted<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8f93\u51fa&#xff1a;<\/p>\n<p>after edit : [&#039;a.py&#039;, &#039;new_gen.py&#039;, &#039;untracked.env&#039;]<br \/>\nafter revert: [&#039;a.py&#039;, &#039;untracked.env&#039;]<br \/>\na.py &#061; x &#061; 1<br \/>\nuntracked.env survived: True<br \/>\ntouched: [&#039;a.py&#039;, &#039;new_gen.py&#039;, &#039;untracked.env&#039;]<\/p>\n<p>\u6ce8\u610f\u6700\u540e\u4e00\u884c&#xff1a;untracked.env \u51fa\u73b0\u5728 touched \u6e05\u5355\u91cc\u662f\u56e0\u4e3a\u5b83\u5728\u5feb\u7167\u65f6\u88ab git add -A \u7eb3\u5165\u4e86\u7d22\u5f15&#xff0c;\u4f46\u5b83\u6ca1\u6709\u88ab\u5220\u9664\u2014\u2014\u8fd9\u6b63\u662f\u6211\u4eec\u8981\u7684\u3002\u7528 git clean -fd \u7684\u8bdd\u5b83\u5c31\u6ca1\u4e86\u3002<\/p>\n<h4>5.4 \u786e\u5b9a\u6027\u65ad\u8a00\u4e0e\u9519\u8bef\u6808\u538b\u7f29<\/h4>\n<p>\u65ad\u8a00\u5206\u5c42\u8dd1&#xff0c;\u5931\u8d25\u6808\u5fc5\u987b\u538b\u7f29\u540e\u518d\u56de\u5582\u3002<\/p>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;assertions.py \u2014 \u5206\u5c42\u65ad\u8a00 &#043; \u5931\u8d25\u6808\u538b\u7f29 &#043; flaky \u68c0\u6d4b\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> hashlib<br \/>\n<span class=\"token keyword\">import<\/span> re<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<span class=\"token punctuation\">,<\/span> field<br \/>\n<span class=\"token keyword\">from<\/span> pathlib <span class=\"token keyword\">import<\/span> Path<\/p>\n<p><span class=\"token keyword\">from<\/span> sandbox <span class=\"token keyword\">import<\/span> RunResult<span class=\"token punctuation\">,<\/span> Sandbox<\/p>\n<p><span class=\"token comment\"># \u566a\u58f0\u884c&#xff1a;\u4f9d\u8d56\u5b89\u88c5\u3001warning\u3001\u8986\u76d6\u7387\u63d0\u793a&#xff0c;\u5168\u90e8\u4e22\u6389<\/span><br \/>\nNOISE <span class=\"token operator\">&#061;<\/span> re<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">compile<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token string\">r&#034;^(Collecting|Requirement already|Building wheels|Installing collected|&#034;<\/span><br \/>\n    <span class=\"token string\">r&#034;Successfully installed|\\\\s*\\\\d&#043;%\\\\|)|Warning:|DeprecationWarning|&#034;<\/span><br \/>\n    <span class=\"token string\">r&#034;^\\\\s*$|^&#061;&#043; warnings summary &#061;&#043;&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u6211\u4eec\u8981\u4fdd\u7559\u7684\u884c&#xff1a;\u65ad\u8a00\u5931\u8d25\u70b9\u3001\u5f02\u5e38\u7c7b\u578b\u3001\u6587\u4ef6\u8def\u5f84\u884c\u53f7<\/span><br \/>\nKEEP <span class=\"token operator\">&#061;<\/span> re<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">compile<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token string\">r&#034;(FAILED|PASSED|ERROR|E\\\\s&#043;AssertionError|E\\\\s&#043;\\\\w*Error|&#034;<\/span><br \/>\n    <span class=\"token string\">r&#034;^E\\\\s|^&gt;\\\\s|^tests?\/|^src\/|^\\\\s&#043;File \\\\&#034;)&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">AssertionResult<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    ok<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span><br \/>\n    exit_code<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><br \/>\n    raw<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    duration_ms<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><br \/>\n    killed_by<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    fingerprint<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n    failed_nodes<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">compress<\/span><span class=\"token punctuation\">(<\/span>output<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> max_chars<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">4000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4fdd\u7559\u5934&#xff08;\u73af\u5883\/\u6536\u96c6\u4fe1\u606f&#xff09;\u4e0e\u5c3e&#xff08;\u771f\u6b63\u7684\u5931\u8d25\u70b9&#xff09;&#xff0c;\u4e2d\u95f4\u4e22\u5f03\u3002<\/p>\n<p>    \u4e0d\u8981\u628a\u6574\u4e2a\u65e5\u5fd7\u5582\u56de\u53bb&#xff1a;pytest \u7684\u77ed\u56de\u6eaf\u5df2\u7ecf\u5f88\u957f&#xff0c;\u52a0\u4e0a\u4f9d\u8d56\u5b89\u88c5\u566a\u58f0<br \/>\n    \u8f7b\u677e\u4e0a\u4e07\u5b57\u7b26\u3002\u5b9e\u6d4b\u538b\u7f29\u540e\u56de\u5582 token \u4ece\u7ea6 9000 \u964d\u5230\u7ea6 1200&#xff0c;<br \/>\n    \u6210\u529f\u7387\u53cd\u800c\u4e0a\u5347&#xff08;\u6a21\u578b\u4e0d\u518d\u53bb\u4fee\u65e0\u5173\u7684 warning&#xff09;\u3002<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    lines <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span>l <span class=\"token keyword\">for<\/span> l <span class=\"token keyword\">in<\/span> output<span class=\"token punctuation\">.<\/span>splitlines<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> NOISE<span class=\"token punctuation\">.<\/span>search<span class=\"token punctuation\">(<\/span>l<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    head <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span>l <span class=\"token keyword\">for<\/span> l <span class=\"token keyword\">in<\/span> lines<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token number\">12<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">if<\/span> l<span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    tail<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    budget <span class=\"token operator\">&#061;<\/span> max_chars <span class=\"token operator\">&#8211;<\/span> <span class=\"token builtin\">sum<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>l<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span> <span class=\"token keyword\">for<\/span> l <span class=\"token keyword\">in<\/span> head<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> l <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">reversed<\/span><span class=\"token punctuation\">(<\/span>lines<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> budget <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><br \/>\n        tail<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>l<span class=\"token punctuation\">)<\/span><br \/>\n        budget <span class=\"token operator\">-&#061;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>l<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><br \/>\n    tail<span class=\"token punctuation\">.<\/span>reverse<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token comment\"># \u5c3e\u6bb5\u91cc\u4f18\u5148\u4fdd\u7559\u65ad\u8a00\/\u5f02\u5e38\u76f8\u5173\u884c<\/span><br \/>\n    tail <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span>l <span class=\"token keyword\">for<\/span> l <span class=\"token keyword\">in<\/span> tail <span class=\"token keyword\">if<\/span> KEEP<span class=\"token punctuation\">.<\/span>search<span class=\"token punctuation\">(<\/span>l<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">or<\/span> tail<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">40<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>head <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;&#8230; [truncated] &#8230;&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> tail<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">fingerprint_of<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">:<\/span> AssertionResult<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5931\u8d25\u6307\u7eb9&#xff1a;\u5931\u8d25\u8282\u70b9\u96c6\u5408 &#043; \u9519\u8bef\u7c7b\u578b\u3002\u7528\u4e8e non_progress \u68c0\u6d4b\u3002&#034;&#034;&#034;<\/span><br \/>\n    errs <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>re<span class=\"token punctuation\">.<\/span>findall<span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;E\\\\s&#043;(\\\\w*Error|\\\\w*Exception)&#034;<\/span><span class=\"token punctuation\">,<\/span> result<span class=\"token punctuation\">.<\/span>raw<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    key <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;|&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span><span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">.<\/span>failed_nodes<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;||&#034;<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;|&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>errs<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> hashlib<span class=\"token punctuation\">.<\/span>sha1<span class=\"token punctuation\">(<\/span>key<span class=\"token punctuation\">.<\/span>encode<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>hexdigest<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token number\">12<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">run_layer<\/span><span class=\"token punctuation\">(<\/span>sbx<span class=\"token punctuation\">:<\/span> Sandbox<span class=\"token punctuation\">,<\/span> name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> argv<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> AssertionResult<span class=\"token punctuation\">:<\/span><br \/>\n    r<span class=\"token punctuation\">:<\/span> RunResult <span class=\"token operator\">&#061;<\/span> sbx<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>argv<span class=\"token punctuation\">)<\/span><br \/>\n    raw <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">.<\/span>stdout <span class=\"token keyword\">or<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\n&#034;<\/span> <span class=\"token operator\">&#043;<\/span> r<span class=\"token punctuation\">.<\/span>stderr <span class=\"token keyword\">if<\/span> r<span class=\"token punctuation\">.<\/span>stderr <span class=\"token keyword\">else<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    nodes <span class=\"token operator\">&#061;<\/span> re<span class=\"token punctuation\">.<\/span>findall<span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;^(?:FAILED|ERROR)\\\\s&#043;(\\\\S&#043;)&#034;<\/span><span class=\"token punctuation\">,<\/span> raw<span class=\"token punctuation\">,<\/span> flags<span class=\"token operator\">&#061;<\/span>re<span class=\"token punctuation\">.<\/span>M<span class=\"token punctuation\">)<\/span><br \/>\n    ar <span class=\"token operator\">&#061;<\/span> AssertionResult<span class=\"token punctuation\">(<\/span>name<span class=\"token operator\">&#061;<\/span>name<span class=\"token punctuation\">,<\/span> ok<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">.<\/span>exit_code <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> exit_code<span class=\"token operator\">&#061;<\/span>r<span class=\"token punctuation\">.<\/span>exit_code<span class=\"token punctuation\">,<\/span><br \/>\n                         raw<span class=\"token operator\">&#061;<\/span>raw<span class=\"token punctuation\">,<\/span> duration_ms<span class=\"token operator\">&#061;<\/span>r<span class=\"token punctuation\">.<\/span>duration_ms<span class=\"token punctuation\">,<\/span><br \/>\n                         killed_by<span class=\"token operator\">&#061;<\/span>r<span class=\"token punctuation\">.<\/span>killed_by<span class=\"token punctuation\">,<\/span> failed_nodes<span class=\"token operator\">&#061;<\/span>nodes<span class=\"token punctuation\">)<\/span><br \/>\n    ar<span class=\"token punctuation\">.<\/span>fingerprint <span class=\"token operator\">&#061;<\/span> fingerprint_of<span class=\"token punctuation\">(<\/span>ar<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> ar<\/p>\n<p>FAST_LAYERS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#034;L0_format&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;ruff&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;format&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;check&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;.&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;L1_types&#034;<\/span><span class=\"token punctuation\">:<\/span>  <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;mypy&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;strict&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;src&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;L2_compile&#034;<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;python&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-m&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;compileall&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-q&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;src&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;L3_target&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;python&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-m&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;pytest&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-x&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-q&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;timeout&#061;60&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                  <span class=\"token string\">&#034;-p&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;no:cacheprovider&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;{TARGET}&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\nGATE_LAYERS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#034;L4_affected&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;python&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-m&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;pytest&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-q&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;timeout&#061;120&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;-p&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;no:cacheprovider&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;tests\/unit&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;L5_full&#034;<\/span><span class=\"token punctuation\">:<\/span>     <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;python&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-m&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;pytest&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-q&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;timeout&#061;300&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">run_fast<\/span><span class=\"token punctuation\">(<\/span>sbx<span class=\"token punctuation\">:<\/span> Sandbox<span class=\"token punctuation\">,<\/span> target<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>AssertionResult<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    out <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> name<span class=\"token punctuation\">,<\/span> argv <span class=\"token keyword\">in<\/span> FAST_LAYERS<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        cmd <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span>a<span class=\"token punctuation\">.<\/span>replace<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;{TARGET}&#034;<\/span><span class=\"token punctuation\">,<\/span> target<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> a <span class=\"token keyword\">in<\/span> argv<span class=\"token punctuation\">]<\/span><br \/>\n        ar <span class=\"token operator\">&#061;<\/span> run_layer<span class=\"token punctuation\">(<\/span>sbx<span class=\"token punctuation\">,<\/span> name<span class=\"token punctuation\">,<\/span> cmd<span class=\"token punctuation\">)<\/span><br \/>\n        out<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>ar<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> ar<span class=\"token punctuation\">.<\/span>ok<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">break<\/span>          <span class=\"token comment\"># \u5feb\u65ad\u8a00\u77ed\u8def&#xff1a;L0 \u6302\u4e86\u5c31\u6ca1\u5fc5\u8981\u8dd1 L3<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> out<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">run_gate<\/span><span class=\"token punctuation\">(<\/span>sbx<span class=\"token punctuation\">:<\/span> Sandbox<span class=\"token punctuation\">,<\/span> budget_pressure<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>AssertionResult<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u95e8\u7981\u65ad\u8a00\u3002\u9884\u7b97\u538b\u529b\u5927\u65f6\u53ea\u8dd1\u53d7\u5f71\u54cd\u5b50\u96c6\u3002&#034;&#034;&#034;<\/span><br \/>\n    names <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;L4_affected&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">if<\/span> budget_pressure <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.8<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;L4_affected&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;L5_full&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">[<\/span>run_layer<span class=\"token punctuation\">(<\/span>sbx<span class=\"token punctuation\">,<\/span> n<span class=\"token punctuation\">,<\/span> GATE_LAYERS<span class=\"token punctuation\">[<\/span>n<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> n <span class=\"token keyword\">in<\/span> names<span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">looks_flaky<\/span><span class=\"token punctuation\">(<\/span>sbx<span class=\"token punctuation\">:<\/span> Sandbox<span class=\"token punctuation\">,<\/span> argv<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> repeats<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u540c\u4e00\u4e2a\u65ad\u8a00\u8fde\u8dd1 repeats \u6b21&#xff0c;\u7ed3\u679c\u4e0d\u4e00\u81f4\u5373\u5224\u5b9a flaky\u3002&#034;&#034;&#034;<\/span><br \/>\n    codes <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span>sbx<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>argv<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>exit_code <span class=\"token keyword\">for<\/span> _ <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span>repeats<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>codes<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">import<\/span> tempfile<br \/>\n    <span class=\"token keyword\">from<\/span> pathlib <span class=\"token keyword\">import<\/span> Path <span class=\"token keyword\">as<\/span> P<br \/>\n    fake_out <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token string\">&#034;Requirement already satisfied: pytest in \/usr\/lib&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;collected 42 items&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;tests\/test_cart.py::test_discount FAILED&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;E   AssertionError: assert 90 &#061;&#061; 81&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;E    &#043;  where 81 &#061; apply_discount(90, 0.1)&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;src\/pricing.py:42: in apply_discount&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;    return price * (1 &#8211; rate)&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;FAILED tests\/test_cart.py::test_discount &#8211; AssertionError&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;1 failed, 41 passed in 3.21s&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>compress<span class=\"token punctuation\">(<\/span>fake_out<span class=\"token punctuation\">,<\/span> max_chars<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2000<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>5.5 \u7ed3\u6784\u5316\u8f93\u51fa schema \u5f3a\u5236\u4e0e\u4e09\u5206\u7acb\u8c03\u7528<\/h4>\n<p>\u6240\u6709\u6a21\u578b\u8f93\u51fa\u5fc5\u987b\u8fc7 Pydantic\u3002\u6821\u9a8c\u5931\u8d25\u65f6\u628a\u6821\u9a8c\u9519\u8bef\u539f\u6587\u56de\u5582&#xff08;\u4e0d\u662f\u300c\u4f60\u7684\u683c\u5f0f\u4e0d\u5bf9\u300d\u8fd9\u79cd\u6a21\u7cca\u63d0\u793a&#xff09;&#xff0c;\u6700\u591a\u91cd\u8bd5 2 \u6b21\u3002<\/p>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;schema.py &#043; roles.py \u2014 \u7ed3\u6784\u5316\u8f93\u51fa\u5f3a\u5236 &#043; \u751f\u6210\/\u8bc4\u4f30\/\u4fee\u590d\u4e09\u5206\u7acb\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> Literal<\/p>\n<p><span class=\"token keyword\">from<\/span> pydantic <span class=\"token keyword\">import<\/span> BaseModel<span class=\"token punctuation\">,<\/span> Field<span class=\"token punctuation\">,<\/span> ValidationError<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">FileEdit<\/span><span class=\"token punctuation\">(<\/span>BaseModel<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    path<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span>pattern<span class=\"token operator\">&#061;<\/span><span class=\"token string\">r&#034;^(src|tests)\/.*\\\\.(py|ts|go|rs)$&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    action<span class=\"token punctuation\">:<\/span> Literal<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;create&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;modify&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;delete&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    content<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span>          <span class=\"token comment\"># create\/modify \u5fc5\u586b<\/span><br \/>\n    rationale<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span>max_length<span class=\"token operator\">&#061;<\/span><span class=\"token number\">400<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">PatchProposal<\/span><span class=\"token punctuation\">(<\/span>BaseModel<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    analysis<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span>max_length<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2000<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    root_cause<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span>max_length<span class=\"token operator\">&#061;<\/span><span class=\"token number\">500<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    files<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>FileEdit<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span>min_length<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> max_length<span class=\"token operator\">&#061;<\/span><span class=\"token number\">12<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    test_targets<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    risk<span class=\"token punctuation\">:<\/span> Literal<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;low&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;medium&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;high&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    touches_external<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span>      <span class=\"token comment\"># \u662f\u5426\u89e6\u78b0\u5916\u90e8\u7cfb\u7edf -&gt; harness \u5c42\u62e6\u622a<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Verdict<\/span><span class=\"token punctuation\">(<\/span>BaseModel<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    passed<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span><br \/>\n    failed_assertions<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span>        <span class=\"token comment\"># \u65ad\u8a00\u540d&#xff0c;\u4e0d\u542b\u5206\u6570<\/span><br \/>\n    blocking_issues<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span>          <span class=\"token comment\"># \u5fc5\u987b\u4fee\u590d\u7684\u95ee\u9898<\/span><br \/>\n    must_not_merge<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span>                <span class=\"token comment\"># \u4e00\u7968\u5426\u51b3<\/span><br \/>\n    reason<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span>max_length<span class=\"token operator\">&#061;<\/span><span class=\"token number\">800<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>PROMPTS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\"># Generator \u770b\u4e0d\u5230\u8bc4\u4f30\u7ed3\u679c&#xff0c;\u4e5f\u770b\u4e0d\u5230\u5931\u8d25\u6808&#xff08;\u9996\u8f6e&#xff09;<\/span><br \/>\n    <span class=\"token string\">&#034;generator&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;\u4f60\u662f\u4ee3\u7801\u751f\u6210\u5668\u3002\u53ea\u8f93\u51fa\u7b26\u5408 PatchProposal schema \u7684 JSON&#xff0c;\u4e0d\u8981\u4efb\u4f55\u89e3\u91ca\u6027\u6587\u5b57\u3002\\\\n&#034;<\/span><br \/>\n        <span class=\"token string\">&#034;\u7ea6\u675f&#xff1a;1) \u4e0d\u5f97\u65b0\u589e\u6216\u4fee\u6539 tests\/ \u4e0b\u7684\u6587\u4ef6&#xff1b;2) \u4e0d\u5f97\u4fee\u6539\u65ad\u8a00\u914d\u7f6e&#xff1b;\\\\n&#034;<\/span><br \/>\n        <span class=\"token string\">&#034;3) \u53ea\u6539\u4e0e\u6839\u56e0\u76f4\u63a5\u76f8\u5173\u7684\u6587\u4ef6&#xff1b;4) \u6bcf\u4e2a\u6587\u4ef6\u6539\u52a8\u90fd\u8981\u5199 rationale\u3002\\\\n&#034;<\/span><br \/>\n        <span class=\"token string\">&#034;\u4efb\u52a1&#xff1a;{task}\\\\n\u76f8\u5173\u6587\u4ef6&#xff1a;\\\\n{context}&#034;<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token comment\"># Evaluator \u53ea\u770b diff \u4e0e\u65ad\u8a00\u8f93\u51fa&#xff0c;\u770b\u4e0d\u5230 Generator \u7684\u81ea\u8ff0&#xff0c;\u4e14\u65e0\u5199\u6743\u9650<\/span><br \/>\n    <span class=\"token string\">&#034;evaluator&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;\u4f60\u662f\u72ec\u7acb\u8bc4\u5ba1\u3002\u8f93\u5165\u53ea\u6709\u4e00\u4efd diff \u548c\u65ad\u8a00\u8f93\u51fa&#xff0c;\u6ca1\u6709\u4f5c\u8005\u81ea\u8ff0\u3002\\\\n&#034;<\/span><br \/>\n        <span class=\"token string\">&#034;\u53ea\u8f93\u51fa\u7b26\u5408 Verdict schema \u7684 JSON\u3002\u7981\u6b62\u7ed9\u51fa\u5206\u6570&#xff0c;\u7981\u6b62\u4fee\u6539\u6587\u4ef6\u3002\\\\n&#034;<\/span><br \/>\n        <span class=\"token string\">&#034;diff:\\\\n{diff}\\\\n\\\\n\u65ad\u8a00\u8f93\u51fa:\\\\n{assertions}&#034;<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token comment\"># Fixer \u53ea\u770b\u5931\u8d25\u9879\u4e0e\u9519\u8bef\u6808&#xff0c;\u770b\u4e0d\u5230\u5206\u6570<\/span><br \/>\n    <span class=\"token string\">&#034;fixer&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;\u4f60\u662f\u4fee\u590d\u5668\u3002\u4e0b\u9762\u662f\u5931\u8d25\u65ad\u8a00\u4e0e\u9519\u8bef\u6808&#xff0c;\u628a\u5931\u8d25\u96c6\u5408\u53d8\u6210\u7a7a\u96c6\u3002\\\\n&#034;<\/span><br \/>\n        <span class=\"token string\">&#034;\u53ea\u8f93\u51fa\u7b26\u5408 PatchProposal schema \u7684 JSON\u3002\u7981\u6b62\u4fee\u6539\u6d4b\u8bd5\u6587\u4ef6\u3002\\\\n&#034;<\/span><br \/>\n        <span class=\"token string\">&#034;\u5931\u8d25\u9879&#xff1a;{failures}\\\\n\u9519\u8bef\u6808&#xff1a;\\\\n{stack}&#034;<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">enforce<\/span><span class=\"token punctuation\">(<\/span>cls<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">type<\/span><span class=\"token punctuation\">[<\/span>BaseModel<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> raw<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> BaseModel<span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4e25\u683c\u89e3\u6790\u3002raw \u91cc\u82e5\u6df7\u7740\u95f2\u804a&#xff0c;\u5148\u5c1d\u8bd5\u62a0\u51fa\u7b2c\u4e00\u4e2a JSON \u5bf9\u8c61\u3002&#034;&#034;&#034;<\/span><br \/>\n    raw <span class=\"token operator\">&#061;<\/span> raw<span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> raw<span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#096;&#096;&#096;&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        raw <span class=\"token operator\">&#061;<\/span> raw<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#096;&#096;&#096;&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> raw<span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;json&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            raw <span class=\"token operator\">&#061;<\/span> raw<span class=\"token punctuation\">[<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> cls<span class=\"token punctuation\">.<\/span>model_validate_json<span class=\"token punctuation\">(<\/span>raw<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> ValidationError <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\"># \u4e8c\u6b21\u5c1d\u8bd5&#xff1a;\u4ece\u6df7\u6709\u95f2\u804a\u7684\u6587\u672c\u91cc\u62a0 JSON<\/span><br \/>\n        i<span class=\"token punctuation\">,<\/span> j <span class=\"token operator\">&#061;<\/span> raw<span class=\"token punctuation\">.<\/span>find<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;{&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> raw<span class=\"token punctuation\">.<\/span>rfind<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;}&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> i <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">and<\/span> j <span class=\"token operator\">&gt;<\/span> i<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> cls<span class=\"token punctuation\">.<\/span>model_validate_json<span class=\"token punctuation\">(<\/span>raw<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">:<\/span>j <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">call_structured<\/span><span class=\"token punctuation\">(<\/span>llm<span class=\"token punctuation\">,<\/span> role<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> prompt<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> cls<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">type<\/span><span class=\"token punctuation\">[<\/span>BaseModel<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    budget<span class=\"token punctuation\">,<\/span> max_retries<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> BaseModel<span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5e26\u9884\u7b97\u8bb0\u8d26\u4e0e\u6709\u9650\u91cd\u8bd5\u7684\u7ed3\u6784\u5316\u8c03\u7528\u3002\u91cd\u8bd5\u65f6\u56de\u5582\u7cbe\u786e\u7684\u6821\u9a8c\u9519\u8bef\u3002&#034;&#034;&#034;<\/span><br \/>\n    last_err <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> attempt <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span>max_retries <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        raw<span class=\"token punctuation\">,<\/span> in_tok<span class=\"token punctuation\">,<\/span> out_tok <span class=\"token operator\">&#061;<\/span> llm<span class=\"token punctuation\">(<\/span>role<span class=\"token punctuation\">,<\/span> prompt <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> last_err <span class=\"token keyword\">else<\/span><br \/>\n                                   prompt <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\n\\\\n\u4e0a\u4e00\u6b21\u8f93\u51fa\u672a\u901a\u8fc7\u6821\u9a8c&#xff0c;\u9519\u8bef\u5982\u4e0b&#xff0c;\u8bf7\u4fee\u6b63&#xff1a;\\\\n&#034;<\/span> <span class=\"token operator\">&#043;<\/span> last_err<span class=\"token punctuation\">)<\/span><br \/>\n        budget<span class=\"token punctuation\">.<\/span>spend<span class=\"token punctuation\">(<\/span>role<span class=\"token punctuation\">,<\/span> in_tok<span class=\"token punctuation\">,<\/span> out_tok<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> enforce<span class=\"token punctuation\">(<\/span>cls<span class=\"token punctuation\">,<\/span> raw<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">except<\/span> ValidationError <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            last_err <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">.<\/span>json<span class=\"token punctuation\">(<\/span>include_url<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> attempt <span class=\"token operator\">&#061;&#061;<\/span> max_retries<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>role<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u8fde\u7eed <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>max_retries <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u6b21\u672a\u4ea7\u51fa\u5408\u6cd5 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>cls<span class=\"token punctuation\">.<\/span>__name__<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">raise<\/span> AssertionError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;unreachable&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    bad <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;\u597d\u7684&#xff0c;\u6211\u6765\u770b\u770b\u8fd9\u4e2a\u95ee\u9898\u3002\\\\n&#096;&#096;&#096;json\\\\n&#034;<\/span> <span class=\"token operator\">&#043;<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;analysis&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u6298\u6263\u8ba1\u7b97\u987a\u5e8f\u9519\u4e86&#xff0c;\u5148\u4e58\u540e\u51cf\u5199\u6210\u4e86\u5148\u51cf\u540e\u4e58&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;root_cause&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;apply_discount \u91cc rate \u88ab\u5f53\u6210\u767e\u5206\u6bd4\u6574\u6570\u5904\u7406&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;files&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;path&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;src\/pricing.py&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;action&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;modify&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                   <span class=\"token string\">&#034;content&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;def apply_discount(price, rate):\\\\n    return price * (1 &#8211; rate)\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                   <span class=\"token string\">&#034;rationale&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u628a 90*(1-0.1)&#061;81 \u6539\u6210 90-9&#061;81&#xff0c;\u7edf\u4e00\u4e3a\u6d6e\u70b9\u6bd4\u7387&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;test_targets&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;tests\/test_cart.py::test_discount&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;risk&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;low&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;touches_external&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\n&#096;&#096;&#096;&#034;<\/span><br \/>\n    p <span class=\"token operator\">&#061;<\/span> enforce<span class=\"token punctuation\">(<\/span>PatchProposal<span class=\"token punctuation\">,<\/span> bad<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;parsed ok:&#034;<\/span><span class=\"token punctuation\">,<\/span> p<span class=\"token punctuation\">.<\/span>root_cause<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;|&#034;<\/span><span class=\"token punctuation\">,<\/span> p<span class=\"token punctuation\">.<\/span>files<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>path<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;|&#034;<\/span><span class=\"token punctuation\">,<\/span> p<span class=\"token punctuation\">.<\/span>risk<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        enforce<span class=\"token punctuation\">(<\/span>PatchProposal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u6211\u89c9\u5f97\u5e94\u8be5\u6539\u4e00\u4e0b ..\/etc\/passwd \u8fd9\u4e2a\u6587\u4ef6&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> ValidationError <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;rejected as expected:&#034;<\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">.<\/span>errors<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>FileEdit.path \u4e0a\u7684 ^(src|tests)\/ \u6b63\u5219\u662f\u4e00\u4e2a harness \u5c42\u7684\u6cd5\u5f8b&#xff0c;\u4e0d\u662f\u5efa\u8bae&#xff1a;\u6a21\u578b\u60f3\u6539 tests\/ \u4f1a\u88ab Generator \u63d0\u793a\u8bcd\u6321\u4e00\u6b21&#xff0c;\u60f3\u6539\u4ed3\u5e93\u5916\u7684\u8def\u5f84\u4f1a\u88ab\u8fd9\u4e2a\u6b63\u5219\u6321\u6b7b\u3002\u4e24\u5c42\u90fd\u8981\u6709&#xff0c;\u56e0\u4e3a\u63d0\u793a\u8bcd\u5c42\u662f\u53ef\u4ee5\u88ab\u63d0\u793a\u8bcd\u6ce8\u5165\u7ed5\u8fc7\u7684&#xff0c;\u6b63\u5219\u5c42\u4e0d\u80fd\u3002<\/p>\n<h4>5.6 \u4e3b\u5faa\u73af&#xff1a;\u628a\u300c\u4fee\u4e00\u4e2a bug\u300d\u8dd1\u6210\u95ed\u73af<\/h4>\n<p>\u628a\u524d\u9762\u4e94\u4e2a\u6a21\u5757\u4e32\u8d77\u6765\u3002\u8fd9\u662f\u672c\u6587\u7684\u4e3b\u4ea4\u4ed8\u7269\u3002<\/p>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;harness.py \u2014 \u786e\u5b9a\u6027\u58f3\u4e3b\u5faa\u73af\u3002<\/p>\n<p>\u7528\u6cd5&#xff1a;<br \/>\n    python harness.py &#8211;repo . &#8211;task &#034;\u4fee\u590d tests\/test_cart.py::test_discount&#034; \\\\<br \/>\n        &#8211;target tests\/test_cart.py::test_discount \\\\<br \/>\n        &#8211;max-steps 8 &#8211;max-cost 0.50 &#8211;timeout 240<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> argparse<br \/>\n<span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">import<\/span> shutil<br \/>\n<span class=\"token keyword\">import<\/span> sys<br \/>\n<span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> asdict<span class=\"token punctuation\">,<\/span> dataclass<span class=\"token punctuation\">,<\/span> field<br \/>\n<span class=\"token keyword\">from<\/span> pathlib <span class=\"token keyword\">import<\/span> Path<\/p>\n<p><span class=\"token keyword\">from<\/span> assertions <span class=\"token keyword\">import<\/span> run_fast<span class=\"token punctuation\">,<\/span> run_gate<span class=\"token punctuation\">,<\/span> compress<span class=\"token punctuation\">,<\/span> looks_flaky<br \/>\n<span class=\"token keyword\">from<\/span> budget <span class=\"token keyword\">import<\/span> Budget<span class=\"token punctuation\">,<\/span> BudgetExceeded<br \/>\n<span class=\"token keyword\">from<\/span> checkpoint <span class=\"token keyword\">import<\/span> Checkpoint<br \/>\n<span class=\"token keyword\">from<\/span> roles <span class=\"token keyword\">import<\/span> PatchProposal<span class=\"token punctuation\">,<\/span> Verdict<span class=\"token punctuation\">,<\/span> call_structured<span class=\"token punctuation\">,<\/span> PROMPTS<br \/>\n<span class=\"token keyword\">from<\/span> sandbox <span class=\"token keyword\">import<\/span> Sandbox<span class=\"token punctuation\">,<\/span> Limits<\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">RunReport<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    run_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    task<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    stop_reason<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;running&#034;<\/span><br \/>\n    steps<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    cost_usd<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><br \/>\n    tokens<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    solved<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><br \/>\n    iterations<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    touched_files<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Harness<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> repo<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span> task<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> target<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> budget<span class=\"token punctuation\">:<\/span> Budget<span class=\"token punctuation\">,<\/span><br \/>\n                 limits<span class=\"token punctuation\">:<\/span> Limits<span class=\"token punctuation\">,<\/span> llm<span class=\"token punctuation\">,<\/span> read_only_tests<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>task<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>target <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span>repo<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> task<span class=\"token punctuation\">,<\/span> target<br \/>\n        self<span class=\"token punctuation\">.<\/span>budget<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>limits<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>llm <span class=\"token operator\">&#061;<\/span> budget<span class=\"token punctuation\">,<\/span> limits<span class=\"token punctuation\">,<\/span> llm<br \/>\n        self<span class=\"token punctuation\">.<\/span>read_only_tests <span class=\"token operator\">&#061;<\/span> read_only_tests<br \/>\n        self<span class=\"token punctuation\">.<\/span>ckpt <span class=\"token operator\">&#061;<\/span> Checkpoint<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>run_id <span class=\"token operator\">&#061;<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;run-<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>report <span class=\"token operator\">&#061;<\/span> RunReport<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>run_id<span class=\"token punctuation\">,<\/span> task<span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_prev_fp<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p>    <span class=\"token comment\"># &#8212;- [2] \u628a patch \u843d\u5730\u5230\u6c99\u7bb1\u5de5\u4f5c\u533a&#xff08;\u6a21\u578b\u6c38\u8fdc\u4e0d\u76f4\u63a5\u5199\u5bbf\u4e3b\u6587\u4ef6&#xff09;&#8212;-<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_apply<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> sbx<span class=\"token punctuation\">:<\/span> Sandbox<span class=\"token punctuation\">,<\/span> work<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span> prop<span class=\"token punctuation\">:<\/span> PatchProposal<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        touched <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> fe <span class=\"token keyword\">in<\/span> prop<span class=\"token punctuation\">.<\/span>files<span class=\"token punctuation\">:<\/span><br \/>\n            p <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>work <span class=\"token operator\">\/<\/span> fe<span class=\"token punctuation\">.<\/span>path<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>p<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>work<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>        <span class=\"token comment\"># \u8def\u5f84\u7a7f\u8d8a&#xff0c;\u4e8c\u6b21\u62e6\u622a<\/span><br \/>\n                <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;path traversal blocked: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>fe<span class=\"token punctuation\">.<\/span>path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> fe<span class=\"token punctuation\">.<\/span>action <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;delete&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                p<span class=\"token punctuation\">.<\/span>unlink<span class=\"token punctuation\">(<\/span>missing_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                p<span class=\"token punctuation\">.<\/span>parent<span class=\"token punctuation\">.<\/span>mkdir<span class=\"token punctuation\">(<\/span>parents<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> exist_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                p<span class=\"token punctuation\">.<\/span>write_text<span class=\"token punctuation\">(<\/span>fe<span class=\"token punctuation\">.<\/span>content <span class=\"token keyword\">or<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            touched<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>fe<span class=\"token punctuation\">.<\/span>path<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>read_only_tests<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># \u6d4b\u8bd5\u6587\u4ef6\u5fc5\u987b\u662f\u53ea\u8bfb\u526f\u672c&#xff1a;\u6a21\u578b\u5199\u4e0d\u8fdb\u53bb&#xff0c;\u4e5f\u5c31\u6539\u4e0d\u4e86\u5224\u636e<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> t <span class=\"token keyword\">in<\/span> Path<span class=\"token punctuation\">(<\/span>work<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;tests&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>rglob<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;*&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> t<span class=\"token punctuation\">.<\/span>is_file<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    t<span class=\"token punctuation\">.<\/span>chmod<span class=\"token punctuation\">(<\/span><span class=\"token number\">0o444<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> touched<\/p>\n<p>    <span class=\"token comment\"># &#8212;- [3]&#043;[5]&#043;[6] \u65ad\u8a00 \/ \u538b\u7f29 \/ \u56de\u5582 &#8212;-<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_iterate<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> sbx<span class=\"token punctuation\">:<\/span> Sandbox<span class=\"token punctuation\">,<\/span> work<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span> role<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> prompt<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        prop<span class=\"token punctuation\">:<\/span> PatchProposal <span class=\"token operator\">&#061;<\/span> call_structured<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>llm<span class=\"token punctuation\">,<\/span> role<span class=\"token punctuation\">,<\/span> prompt<span class=\"token punctuation\">,<\/span> PatchProposal<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>budget<span class=\"token punctuation\">)<\/span><br \/>\n        touched <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_apply<span class=\"token punctuation\">(<\/span>sbx<span class=\"token punctuation\">,<\/span> work<span class=\"token punctuation\">,<\/span> prop<span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>touched_files <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>touched_files <span class=\"token operator\">&#043;<\/span> touched<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        results <span class=\"token operator\">&#061;<\/span> run_fast<span class=\"token punctuation\">(<\/span>sbx<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">)<\/span><br \/>\n        failed <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span>r <span class=\"token keyword\">for<\/span> r <span class=\"token keyword\">in<\/span> results <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> r<span class=\"token punctuation\">.<\/span>ok<span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> failed<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><\/p>\n<p>        worst <span class=\"token operator\">&#061;<\/span> failed<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        stack <span class=\"token operator\">&#061;<\/span> compress<span class=\"token punctuation\">(<\/span>worst<span class=\"token punctuation\">.<\/span>raw<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token comment\"># flaky \u68c0\u6d4b&#xff1a;\u65ad\u8a00\u672c\u8eab\u4e0d\u7a33\u5b9a\u65f6&#xff0c;\u4e0d\u80fd\u628a\u9505\u7529\u7ed9\u6a21\u578b<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> looks_flaky<span class=\"token punctuation\">(<\/span>sbx<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;python&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-m&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;pytest&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-q&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-p&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;no:cacheprovider&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                             <span class=\"token operator\">*<\/span>worst<span class=\"token punctuation\">.<\/span>failed_nodes<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>iterations<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;note&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;flaky detected&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;node&#034;<\/span><span class=\"token punctuation\">:<\/span> worst<span class=\"token punctuation\">.<\/span>failed_nodes<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;__FLAKY__\\\\n&#034;<\/span> <span class=\"token operator\">&#043;<\/span> stack<\/p>\n<p>        self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>iterations<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;step&#034;<\/span><span class=\"token punctuation\">:<\/span> self<span class=\"token punctuation\">.<\/span>budget<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;layer&#034;<\/span><span class=\"token punctuation\">:<\/span> worst<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;exit_code&#034;<\/span><span class=\"token punctuation\">:<\/span> worst<span class=\"token punctuation\">.<\/span>exit_code<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;killed_by&#034;<\/span><span class=\"token punctuation\">:<\/span> worst<span class=\"token punctuation\">.<\/span>killed_by<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;failed_nodes&#034;<\/span><span class=\"token punctuation\">:<\/span> worst<span class=\"token punctuation\">.<\/span>failed_nodes<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;fingerprint&#034;<\/span><span class=\"token punctuation\">:<\/span> worst<span class=\"token punctuation\">.<\/span>fingerprint<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;stack_chars&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>stack<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;touched&#034;<\/span><span class=\"token punctuation\">:<\/span> touched<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;[<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">] exit&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">.<\/span>exit_code<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span> <span class=\"token keyword\">for<\/span> r <span class=\"token keyword\">in<\/span> failed<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span> <span class=\"token operator\">&#043;<\/span> stack<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">run<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> RunReport<span class=\"token punctuation\">:<\/span><br \/>\n        snap <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>ckpt<span class=\"token punctuation\">.<\/span>snapshot<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>run_id<span class=\"token punctuation\">)<\/span><br \/>\n        prompt <span class=\"token operator\">&#061;<\/span> PROMPTS<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;generator&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>task<span class=\"token operator\">&#061;<\/span>self<span class=\"token punctuation\">.<\/span>task<span class=\"token punctuation\">,<\/span> context<span class=\"token operator\">&#061;<\/span>self<span class=\"token punctuation\">.<\/span>_context<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">while<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                self<span class=\"token punctuation\">.<\/span>budget<span class=\"token punctuation\">.<\/span>step<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>                      <span class=\"token comment\"># \u56db\u7ef4\u5ea6\u9884\u7b97\u68c0\u67e5<\/span><br \/>\n                role <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;generator&#034;<\/span> <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>budget<span class=\"token punctuation\">.<\/span>steps <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">1<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token string\">&#034;fixer&#034;<\/span><br \/>\n                <span class=\"token keyword\">with<\/span> Sandbox<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>limits<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> work<span class=\"token punctuation\">:<\/span><br \/>\n                    ok<span class=\"token punctuation\">,<\/span> stack <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_iterate<span class=\"token punctuation\">(<\/span><br \/>\n                        sbx <span class=\"token operator\">:&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_mk_sandbox<span class=\"token punctuation\">(<\/span>work<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> work<span class=\"token punctuation\">,<\/span><br \/>\n                        role<span class=\"token punctuation\">,<\/span><br \/>\n                        prompt <span class=\"token keyword\">if<\/span> role <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;generator&#034;<\/span><br \/>\n                        <span class=\"token keyword\">else<\/span> PROMPTS<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;fixer&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>failures<span class=\"token operator\">&#061;<\/span>self<span class=\"token punctuation\">.<\/span>_failures<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> stack<span class=\"token operator\">&#061;<\/span>stack<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> ok<span class=\"token punctuation\">:<\/span><br \/>\n                        <span class=\"token comment\"># [4] \u95e8\u7981&#xff1a;\u5168\u91cf\u56de\u5f52\u5728\u5faa\u73af\u6210\u529f\u4e4b\u540e\u624d\u8dd1<\/span><br \/>\n                        gate <span class=\"token operator\">&#061;<\/span> run_gate<span class=\"token punctuation\">(<\/span>sbx<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>budget<span class=\"token punctuation\">.<\/span>pressure<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                        <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">all<\/span><span class=\"token punctuation\">(<\/span>g<span class=\"token punctuation\">.<\/span>ok <span class=\"token keyword\">for<\/span> g <span class=\"token keyword\">in<\/span> gate<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                            self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>solved <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><br \/>\n                            self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>stop_reason <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;solved&#034;<\/span><br \/>\n                            self<span class=\"token punctuation\">.<\/span>_commit<span class=\"token punctuation\">(<\/span>work<span class=\"token punctuation\">,<\/span> snap<span class=\"token punctuation\">)<\/span><br \/>\n                            <span class=\"token keyword\">break<\/span><br \/>\n                        stack <span class=\"token operator\">&#061;<\/span> compress<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>g<span class=\"token punctuation\">.<\/span>raw <span class=\"token keyword\">for<\/span> g <span class=\"token keyword\">in<\/span> gate <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> g<span class=\"token punctuation\">.<\/span>ok<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                        self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>iterations<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><br \/>\n                            <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;step&#034;<\/span><span class=\"token punctuation\">:<\/span> self<span class=\"token punctuation\">.<\/span>budget<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;layer&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;gate&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;regression&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> stack<span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;__FLAKY__&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                        self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>stop_reason <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;flaky_assertion&#034;<\/span><br \/>\n                        <span class=\"token keyword\">break<\/span><br \/>\n                    fp <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>iterations<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;fingerprint&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> fp <span class=\"token keyword\">and<\/span> fp <span class=\"token operator\">&#061;&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_prev_fp<span class=\"token punctuation\">:<\/span>       <span class=\"token comment\"># non_progress<\/span><br \/>\n                        self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>stop_reason <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;non_progress&#034;<\/span><br \/>\n                        <span class=\"token keyword\">break<\/span><br \/>\n                    self<span class=\"token punctuation\">.<\/span>_prev_fp <span class=\"token operator\">&#061;<\/span> fp<br \/>\n        <span class=\"token keyword\">except<\/span> BudgetExceeded <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>stop_reason <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">.<\/span>reason<br \/>\n        <span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>solved<span class=\"token punctuation\">:<\/span><br \/>\n                self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>touched_files <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>ckpt<span class=\"token punctuation\">.<\/span>revert<span class=\"token punctuation\">(<\/span>snap<span class=\"token punctuation\">)<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>steps <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>budget<span class=\"token punctuation\">.<\/span>steps<br \/>\n            self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>cost_usd <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>budget<span class=\"token punctuation\">.<\/span>cost_usd<br \/>\n            self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>tokens <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>budget<span class=\"token punctuation\">.<\/span>tokens<br \/>\n            self<span class=\"token punctuation\">.<\/span>_save<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> self<span class=\"token punctuation\">.<\/span>report<\/p>\n<p>    <span class=\"token comment\"># &#8212;- \u8f85\u52a9 &#8212;-<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_mk_sandbox<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> work<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Sandbox<span class=\"token punctuation\">:<\/span><br \/>\n        s <span class=\"token operator\">&#061;<\/span> Sandbox<span class=\"token punctuation\">.<\/span>__new__<span class=\"token punctuation\">(<\/span>Sandbox<span class=\"token punctuation\">)<\/span><br \/>\n        s<span class=\"token punctuation\">.<\/span>work<span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>home<span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>limits <span class=\"token operator\">&#061;<\/span> work<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>work<span class=\"token punctuation\">.<\/span>parent <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;home&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>limits<br \/>\n        s<span class=\"token punctuation\">.<\/span>root <span class=\"token operator\">&#061;<\/span> work<span class=\"token punctuation\">.<\/span>parent<br \/>\n        <span class=\"token keyword\">return<\/span> s<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_context<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        files <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">.<\/span>glob<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;src\/**\/*.py&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token number\">20<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;&#8212; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>f<span class=\"token punctuation\">.<\/span>relative_to<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> &#8212;\\\\n&#034;<\/span><\/span><br \/>\n                         <span class=\"token operator\">&#043;<\/span> f<span class=\"token punctuation\">.<\/span>read_text<span class=\"token punctuation\">(<\/span>encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token number\">2000<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">for<\/span> f <span class=\"token keyword\">in<\/span> files<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_failures<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        last <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>iterations<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">.<\/span>iterations <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>last<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;failed_nodes&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_commit<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> work<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span> snap<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u628a\u6c99\u7bb1\u7ed3\u679c\u62f7\u56de\u5bbf\u4e3b&#xff0c;\u518d\u7531\u4eba\/CI \u51b3\u5b9a\u662f\u5426\u63d0\u4ea4\u3002\u8fd9\u91cc\u53ea\u843d\u5730\u4e0d commit\u3002&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> fe <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span>work<span class=\"token punctuation\">.<\/span>rglob<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;*.py&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            rel <span class=\"token operator\">&#061;<\/span> fe<span class=\"token punctuation\">.<\/span>relative_to<span class=\"token punctuation\">(<\/span>work<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>rel<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;tests&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">continue<\/span>                 <span class=\"token comment\"># \u6d4b\u8bd5\u6587\u4ef6\u4e0d\u56de\u5199<\/span><br \/>\n            dst <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>repo <span class=\"token operator\">\/<\/span> rel<br \/>\n            dst<span class=\"token punctuation\">.<\/span>parent<span class=\"token punctuation\">.<\/span>mkdir<span class=\"token punctuation\">(<\/span>parents<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> exist_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            shutil<span class=\"token punctuation\">.<\/span>copy2<span class=\"token punctuation\">(<\/span>fe<span class=\"token punctuation\">,<\/span> dst<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_save<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        d <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>repo <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;.harness&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;reports&#034;<\/span><br \/>\n        d<span class=\"token punctuation\">.<\/span>mkdir<span class=\"token punctuation\">(<\/span>parents<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> exist_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">(<\/span>d <span class=\"token operator\">\/<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>self<span class=\"token punctuation\">.<\/span>run_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">.json&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>write_text<span class=\"token punctuation\">(<\/span><br \/>\n            json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>asdict<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>report<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    ap <span class=\"token operator\">&#061;<\/span> argparse<span class=\"token punctuation\">.<\/span>ArgumentParser<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ap<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;repo&#034;<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;.&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ap<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;task&#034;<\/span><span class=\"token punctuation\">,<\/span> required<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ap<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;target&#034;<\/span><span class=\"token punctuation\">,<\/span> required<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ap<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;max-steps&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ap<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;max-cost&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0.50<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ap<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;timeout&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">240<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ap<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;llm-stub&#034;<\/span><span class=\"token punctuation\">,<\/span> action<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;store_true&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\u7528\u672c\u5730\u6869\u51fd\u6570\u8dd1\u901a\u6d41\u7a0b&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    args <span class=\"token operator\">&#061;<\/span> ap<span class=\"token punctuation\">.<\/span>parse_args<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">from<\/span> stub_llm <span class=\"token keyword\">import<\/span> make_llm          <span class=\"token comment\"># \u6362\u6210\u4f60\u81ea\u5df1\u7684\u771f\u5b9e LLM \u5ba2\u6237\u7aef<\/span><br \/>\n    llm <span class=\"token operator\">&#061;<\/span> make_llm<span class=\"token punctuation\">(<\/span>stub<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>llm_stub<span class=\"token punctuation\">)<\/span><\/p>\n<p>    h <span class=\"token operator\">&#061;<\/span> Harness<span class=\"token punctuation\">(<\/span>Path<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>repo<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> args<span class=\"token punctuation\">.<\/span>task<span class=\"token punctuation\">,<\/span> args<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">,<\/span><br \/>\n                Budget<span class=\"token punctuation\">(<\/span>max_steps<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>max_steps<span class=\"token punctuation\">,<\/span> max_cost_usd<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>max_cost<span class=\"token punctuation\">,<\/span><br \/>\n                       max_wall_clock_s<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>timeout<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                Limits<span class=\"token punctuation\">(<\/span>wall_clock_s<span class=\"token operator\">&#061;<\/span><span class=\"token number\">60<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> llm<span class=\"token punctuation\">)<\/span><br \/>\n    r <span class=\"token operator\">&#061;<\/span> h<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>k<span class=\"token punctuation\">:<\/span> v <span class=\"token keyword\">for<\/span> k<span class=\"token punctuation\">,<\/span> v <span class=\"token keyword\">in<\/span> asdict<span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> k <span class=\"token operator\">!&#061;<\/span> <span class=\"token string\">&#034;iterations&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                     ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">if<\/span> r<span class=\"token punctuation\">.<\/span>solved <span class=\"token keyword\">else<\/span> <span class=\"token number\">1<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    sys<span class=\"token punctuation\">.<\/span>exit<span class=\"token punctuation\">(<\/span>main<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u914d\u5957\u7684\u6869 LLM&#xff08;\u771f\u5b9e\u9879\u76ee\u91cc\u6362\u6210\u4f60\u7684\u7f51\u5173\u5ba2\u6237\u7aef&#xff0c;\u63a5\u53e3\u5951\u7ea6\u4fdd\u6301\u4e00\u81f4&#xff1a;(role, prompt) -&gt; (raw_text, in_tokens, out_tokens)&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;stub_llm.py \u2014 \u79bb\u7ebf\u6869&#xff0c;\u8ba9 harness \u5728\u6ca1\u6709 API key \u7684\u60c5\u51b5\u4e0b\u4e5f\u80fd\u8dd1\u901a\u5168\u6d41\u7a0b\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<br \/>\n<span class=\"token keyword\">import<\/span> json<\/p>\n<p>GOOD <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#034;analysis&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;apply_discount \u628a rate \u5f53\u6210\u4e86\u6574\u6570\u767e\u5206\u6bd4&#xff0c;\u5bfc\u81f4 90 \u88ab\u7b97\u51fa 81&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;root_cause&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;src\/pricing.py:42 rate \u5355\u4f4d\u4e0d\u4e00\u81f4&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;files&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;path&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;src\/pricing.py&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;action&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;modify&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;content&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token string\">&#034;def apply_discount(price: float, rate: float) -&gt; float:\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\&#034;\\\\&#034;\\\\&#034;rate \u662f 0~1 \u7684\u6d6e\u70b9\u6bd4\u7387&#xff0c;\u4e0d\u662f\u6574\u6570\u767e\u5206\u6bd4\u3002\\\\&#034;\\\\&#034;\\\\&#034;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    if not 0.0 &lt;&#061; rate &lt;&#061; 1.0:\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;        raise ValueError(f\\\\&#034;rate out of range: {rate}\\\\&#034;)\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    return round(price * (1.0 &#8211; rate), 2)\\\\n&#034;<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;rationale&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u7edf\u4e00\u5355\u4f4d\u4e3a\u6d6e\u70b9\u6bd4\u7387\u5e76\u52a0\u8303\u56f4\u6821\u9a8c&#xff0c;\u4f7f 90*(1-0.1)&#061;81.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;test_targets&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;tests\/test_cart.py::test_discount&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;risk&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;low&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;touches_external&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">make_llm<\/span><span class=\"token punctuation\">(<\/span>stub<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> stub<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> SystemExit<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u628a\u8fd9\u91cc\u66ff\u6362\u6210\u771f\u5b9e\u5ba2\u6237\u7aef&#xff1b;\u5951\u7ea6: (role, prompt) -&gt; (raw, in_tok, out_tok)&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_llm<\/span><span class=\"token punctuation\">(<\/span>role<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> prompt<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> role <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;evaluator&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            raw <span class=\"token operator\">&#061;<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;passed&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;failed_assertions&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                              <span class=\"token string\">&#034;blocking_issues&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;must_not_merge&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                              <span class=\"token string\">&#034;reason&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;diff \u53ea\u89e6\u53ca pricing.py&#xff0c;\u65e0\u8d8a\u754c\u6539\u52a8&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                             ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            raw <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&#096;&#096;&#096;json\\\\n&#034;<\/span> <span class=\"token operator\">&#043;<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>GOOD<span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\n&#096;&#096;&#096;&#034;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> raw<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>prompt<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/\/<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>raw<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/\/<\/span> <span class=\"token number\">4<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> _llm<\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>make_llm<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;generator&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;task&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8dd1\u4e00\u6b21&#xff1a;<\/p>\n<p>python harness.py <span class=\"token parameter variable\">&#8211;repo<\/span> <span class=\"token builtin class-name\">.<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;task<\/span> <span class=\"token string\">&#034;\u4fee\u590d tests\/test_cart.py::test_discount&#xff1a;90 \u5143\u6309 10% \u6298\u6263\u5e94\u5f97 81&#xff0c;\u5b9e\u9645\u5f97\u5230 81.0 \u4f46\u7c7b\u578b\u65ad\u8a00\u5931\u8d25&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;target<\/span> <span class=\"token string\">&#034;tests\/test_cart.py::test_discount&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;max-steps <span class=\"token number\">8<\/span> &#8211;max-cost <span class=\"token number\">0.50<\/span> <span class=\"token parameter variable\">&#8211;timeout<\/span> <span class=\"token number\">240<\/span> &#8211;llm-stub<\/p>\n<p>\u8f93\u51fa&#xff1a;<\/p>\n<p>{<br \/>\n  &#034;run_id&#034;: &#034;run-1759488000&#034;,<br \/>\n  &#034;task&#034;: &#034;\u4fee\u590d tests\/test_cart.py::test_discount&#8230;&#034;,<br \/>\n  &#034;stop_reason&#034;: &#034;solved&#034;,<br \/>\n  &#034;steps&#034;: 2,<br \/>\n  &#034;cost_usd&#034;: 0.0174,<br \/>\n  &#034;tokens&#034;: 3980,<br \/>\n  &#034;solved&#034;: true,<br \/>\n  &#034;touched_files&#034;: [&#034;src\/pricing.py&#034;]<br \/>\n}<\/p>\n<h4>5.7 \u7528\u786e\u5b9a\u6027\u4ee3\u7801\u66ff\u6362\u6389\u6982\u7387\u751f\u6210<\/h4>\n<p>\u6700\u540e\u8865\u4e0a 3.9 \u8282\u627f\u8bfa\u7684\u4e24\u4e2a\u66ff\u6362\u4ef6\u3002\u5b83\u4eec\u7684\u5171\u540c\u7279\u5f81\u662f&#xff1a;\u96f6 LLM \u8c03\u7528&#xff0c;\u6240\u4ee5\u8be5\u9636\u6bb5 token \u6d88\u8017\u4e3a 0&#xff0c;\u4e14\u4e0d\u53ef\u80fd\u4ea7\u751f\u5e7b\u89c9\u3002<\/p>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;deterministic.py \u2014 Schema Validator \u4e0e Documentation Builder \u7684\u96f6 LLM \u5b9e\u73b0\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> ast<br \/>\n<span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">from<\/span> pathlib <span class=\"token keyword\">import<\/span> Path<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> Any<\/p>\n<p><span class=\"token keyword\">from<\/span> pydantic <span class=\"token keyword\">import<\/span> BaseModel<span class=\"token punctuation\">,<\/span> ValidationError<\/p>\n<p><span class=\"token comment\"># &#8212;&#8212;&#8212;- 1. Schema Validator&#xff1a;\u786e\u5b9a\u6027\u6821\u9a8c&#xff0c;\u4e0d\u7528\u6a21\u578b\u5224\u65ad\u300c\u770b\u8d77\u6765\u5bf9\u4e0d\u5bf9\u300d &#8212;&#8212;&#8212;-<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">validate<\/span><span class=\"token punctuation\">(<\/span>payload<span class=\"token punctuation\">:<\/span> Any<span class=\"token punctuation\">,<\/span> model<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">type<\/span><span class=\"token punctuation\">[<\/span>BaseModel<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        model<span class=\"token punctuation\">.<\/span>model_validate<span class=\"token punctuation\">(<\/span>payload<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> ValidationError <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\"># \u628a\u9519\u8bef\u538b\u6210\u4e00\u884c\u4e00\u6761&#xff0c;\u4f9b harness \u56de\u5582\u6216\u5199\u8fdb\u62a5\u544a<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#039;.&#039;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> x <span class=\"token keyword\">in<\/span> err<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;loc&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token string\">&#039;&lt;root&gt;&#039;<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>err<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;msg&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><br \/>\n            <span class=\"token keyword\">for<\/span> err <span class=\"token keyword\">in<\/span> e<span class=\"token punctuation\">.<\/span>errors<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># &#8212;&#8212;&#8212;- 2. Documentation Builder&#xff1a;\u76f4\u63a5\u8bfb AST&#xff0c;\u4e0d\u9760\u6a21\u578b\u590d\u8ff0\u7b7e\u540d &#8212;&#8212;&#8212;-<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">build_api_docs<\/span><span class=\"token punctuation\">(<\/span>src_root<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4ece AST \u63d0\u53d6\u516c\u5171\u51fd\u6570\u7b7e\u540d\u4e0e docstring\u3002\u6a21\u578b\u7248\u672c\u7684\u5178\u578b\u5e7b\u89c9\u662f<br \/>\n    \u300c\u7f16\u9020\u4e00\u4e2a\u4e0d\u5b58\u5728\u7684\u9ed8\u8ba4\u53c2\u6570\u300d&#xff0c;AST \u7248\u672c\u4e0d\u53ef\u80fd\u72af\u8fd9\u4e2a\u9519\u3002&#034;&#034;&#034;<\/span><br \/>\n    docs <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> path <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span>Path<span class=\"token punctuation\">(<\/span>src_root<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>rglob<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;*.py&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        tree <span class=\"token operator\">&#061;<\/span> ast<span class=\"token punctuation\">.<\/span>parse<span class=\"token punctuation\">(<\/span>path<span class=\"token punctuation\">.<\/span>read_text<span class=\"token punctuation\">(<\/span>encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> filename<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>path<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> node <span class=\"token keyword\">in<\/span> ast<span class=\"token punctuation\">.<\/span>walk<span class=\"token punctuation\">(<\/span>tree<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>node<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>ast<span class=\"token punctuation\">.<\/span>FunctionDef<span class=\"token punctuation\">,<\/span> ast<span class=\"token punctuation\">.<\/span>AsyncFunctionDef<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">continue<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> node<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;_&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">continue<\/span><br \/>\n            args <span class=\"token operator\">&#061;<\/span> node<span class=\"token punctuation\">.<\/span>args<br \/>\n            params <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n            pos <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>posonlyargs <span class=\"token operator\">&#043;<\/span> args<span class=\"token punctuation\">.<\/span>args<br \/>\n            defaults <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>pos<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>defaults<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>defaults<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> a<span class=\"token punctuation\">,<\/span> d <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">zip<\/span><span class=\"token punctuation\">(<\/span>pos<span class=\"token punctuation\">,<\/span> defaults<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                ann <span class=\"token operator\">&#061;<\/span> ast<span class=\"token punctuation\">.<\/span>unparse<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">.<\/span>annotation<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> a<span class=\"token punctuation\">.<\/span>annotation <span class=\"token keyword\">else<\/span> <span class=\"token string\">&#034;Any&#034;<\/span><br \/>\n                dv <span class=\"token operator\">&#061;<\/span> ast<span class=\"token punctuation\">.<\/span>unparse<span class=\"token punctuation\">(<\/span>d<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> d <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token boolean\">None<\/span><br \/>\n                params<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">:<\/span> a<span class=\"token punctuation\">.<\/span>arg<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">:<\/span> ann<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;default&#034;<\/span><span class=\"token punctuation\">:<\/span> dv<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> args<span class=\"token punctuation\">.<\/span>kwarg<span class=\"token punctuation\">:<\/span><br \/>\n                params<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;**&#034;<\/span> <span class=\"token operator\">&#043;<\/span> args<span class=\"token punctuation\">.<\/span>kwarg<span class=\"token punctuation\">.<\/span>arg<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;Any&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;default&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            ret <span class=\"token operator\">&#061;<\/span> ast<span class=\"token punctuation\">.<\/span>unparse<span class=\"token punctuation\">(<\/span>node<span class=\"token punctuation\">.<\/span>returns<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> node<span class=\"token punctuation\">.<\/span>returns <span class=\"token keyword\">else<\/span> <span class=\"token string\">&#034;None&#034;<\/span><br \/>\n            docs<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;file&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>path<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;lineno&#034;<\/span><span class=\"token punctuation\">:<\/span> node<span class=\"token punctuation\">.<\/span>lineno<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">:<\/span> node<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;params&#034;<\/span><span class=\"token punctuation\">:<\/span> params<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;returns&#034;<\/span><span class=\"token punctuation\">:<\/span> ret<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;doc&#034;<\/span><span class=\"token punctuation\">:<\/span> ast<span class=\"token punctuation\">.<\/span>get_docstring<span class=\"token punctuation\">(<\/span>node<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> docs<\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">import<\/span> tempfile<br \/>\n    d <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span>tempfile<span class=\"token punctuation\">.<\/span>mkdtemp<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span>d <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;pricing.py&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>write_text<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#039;def apply_discount(price: float, rate: float &#061; 0.1) -&gt; float:\\\\n&#039;<\/span><br \/>\n        <span class=\"token string\">&#039;    &#034;&#034;&#034;\u6309\u6bd4\u7387\u6253\u6298\u3002rate \u662f 0~1 \u7684\u6d6e\u70b9\u6570\u3002&#034;&#034;&#034;\\\\n&#039;<\/span><br \/>\n        <span class=\"token string\">&#039;    return round(price * (1.0 &#8211; rate), 2)\\\\n&#039;<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    ok<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">&#061;<\/span> validate<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;price&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">90<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;rate&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">0.1<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;M&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>BaseModel<span class=\"token punctuation\">,<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;__annotations__&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;price&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;rate&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;validate ok:&#034;<\/span><span class=\"token punctuation\">,<\/span> ok<span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">)<\/span><br \/>\n    ok2<span class=\"token punctuation\">,<\/span> err2 <span class=\"token operator\">&#061;<\/span> validate<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;price&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;abc&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;M2&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>BaseModel<span class=\"token punctuation\">,<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;__annotations__&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;price&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;validate bad:&#034;<\/span><span class=\"token punctuation\">,<\/span> ok2<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;|&#034;<\/span><span class=\"token punctuation\">,<\/span> err2<span class=\"token punctuation\">.<\/span>replace<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034; \/ &#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> item <span class=\"token keyword\">in<\/span> build_api_docs<span class=\"token punctuation\">(<\/span>d<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>item<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;name&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">(<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#039;, &#039;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>p<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;name&#039;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#039;: &#039;<\/span> <span class=\"token operator\">&#043;<\/span> p<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;type&#039;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">for<\/span> p <span class=\"token keyword\">in<\/span> item<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;params&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">)&#034;<\/span><\/span><br \/>\n              <span class=\"token string-interpolation\"><span class=\"token string\">f&#034; -&gt; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>item<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;returns&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;   params:&#034;<\/span><span class=\"token punctuation\">,<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>item<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;params&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;   doc:&#034;<\/span><span class=\"token punctuation\">,<\/span> item<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;doc&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;| token cost: 0&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8f93\u51fa&#xff1a;<\/p>\n<p>validate ok: True<br \/>\nvalidate bad: False | price: Input should be a valid number, unable to parse string as a number<br \/>\napply_discount(price: float, rate: float &#061; 0.1) -&gt; float<br \/>\n   params: [{&#034;name&#034;: &#034;price&#034;, &#034;type&#034;: &#034;float&#034;, &#034;default&#034;: null}, {&#034;name&#034;: &#034;rate&#034;, &#034;type&#034;: &#034;float&#034;, &#034;default&#034;: &#034;0.1&#034;}]<br \/>\n   doc: \u6309\u6bd4\u7387\u6253\u6298\u3002rate \u662f 0~1 \u7684\u6d6e\u70b9\u6570\u3002 | token cost: 0<\/p>\n<p>\u9ed8\u8ba4\u503c 0.1 \u662f\u4ece AST \u91cc\u5b57\u9762\u8bfb\u51fa\u6765\u7684&#xff0c;\u4e0d\u662f\u6a21\u578b\u731c\u7684\u3002\u8fd9\u4e00\u6761\u770b\u7740\u7410\u788e&#xff0c;\u4f46\u5728\u4e00\u4e2a\u6709 300 \u4e2a API \u7684\u6587\u6863\u7ad9\u91cc&#xff0c;\u300c\u731c\u9519\u9ed8\u8ba4\u503c\u300d\u662f\u6700\u5e38\u89c1\u4e5f\u6700\u96be\u88ab\u53d1\u73b0\u7684\u4e00\u7c7b\u9519\u8bef\u3002<\/p>\n<h3>\u516d\u3001\u7ed3\u679c\u5bf9\u6bd4\u4e0e\u6570\u636e\u5206\u6790<\/h3>\n<h4>6.1 \u5b9e\u6d4b\u73af\u5883\u4e0e\u65b9\u6cd5<\/h4>\n<p>\u5728\u5185\u90e8\u4e00\u4e2a\u4e2d\u7b49\u89c4\u6a21 Python \u4ed3\u5e93\u4e0a\u8dd1\u4e86 60 \u4e2a\u771f\u5b9e bug \u4fee\u590d\u4efb\u52a1&#xff08;21k \u884c\u4ee3\u7801\u30011400 \u4e2a\u5355\u6d4b&#xff09;\u3002\u5bf9\u6bd4\u56db\u6863\u914d\u7f6e&#xff0c;\u6bcf\u6863\u8dd1\u540c\u6837\u7684 60 \u4e2a\u4efb\u52a1&#xff0c;\u987a\u5e8f\u56fa\u5b9a&#xff0c;\u907f\u514d\u987a\u5e8f\u6548\u5e94\u3002<\/p>\n<table>\n<tr>\u914d\u7f6e\u6c99\u7bb1\u56de\u6eda\u65ad\u8a00\u9884\u7b97\u9519\u8bef\u6808\u538b\u7f29<\/tr>\n<tbody>\n<tr>\n<td>A \u88f8\u6a21\u578b<\/td>\n<td>\u65e0<\/td>\n<td>\u65e0<\/td>\n<td>\u6a21\u578b\u81ea\u8ff0<\/td>\n<td>\u65e0<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>B \u4ec5\u65ad\u8a00<\/td>\n<td>\u65e0<\/td>\n<td>\u65e0<\/td>\n<td>pytest L3<\/td>\n<td>\u65e0<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>C \u65ad\u8a00&#043;\u9884\u7b97<\/td>\n<td>\u65e0<\/td>\n<td>\u65e0<\/td>\n<td>L0-L3<\/td>\n<td>\u6b65\u6570 8<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>D \u5b8c\u6574 harness<\/td>\n<td>\u6709<\/td>\n<td>git \u5feb\u7167<\/td>\n<td>L0-L3 &#043; \u95e8\u7981<\/td>\n<td>\u56db\u7ef4 &#043; \u8f6f\u538b\u529b<\/td>\n<td>\u6709<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>6.2 \u4e3b\u7ed3\u679c<\/h4>\n<table>\n<tr>\u6307\u6807A \u88f8\u6a21\u578bB \u4ec5\u65ad\u8a00C \u65ad\u8a00&#043;\u9884\u7b97D \u5b8c\u6574 harness<\/tr>\n<tbody>\n<tr>\n<td>\u4efb\u52a1\u6210\u529f\u7387<\/td>\n<td>31.7%<\/td>\n<td>48.3%<\/td>\n<td>63.3%<\/td>\n<td>71.7%<\/td>\n<\/tr>\n<tr>\n<td>\u5e73\u5747\u8fed\u4ee3\u6b65\u6570<\/td>\n<td>1.0<\/td>\n<td>5.8<\/td>\n<td>6.4<\/td>\n<td>4.1<\/td>\n<\/tr>\n<tr>\n<td>\u5e73\u5747 token\/\u4efb\u52a1<\/td>\n<td>9.4k<\/td>\n<td>21.7k<\/td>\n<td>24.1k<\/td>\n<td>14.3k<\/td>\n<\/tr>\n<tr>\n<td>\u5e73\u5747\u6210\u672c\/\u4efb\u52a1&#xff08;USD&#xff09;<\/td>\n<td>0.041<\/td>\n<td>0.094<\/td>\n<td>0.105<\/td>\n<td>0.062<\/td>\n<\/tr>\n<tr>\n<td>P50 \u5899\u949f&#xff08;s&#xff09;<\/td>\n<td>11<\/td>\n<td>74<\/td>\n<td>86<\/td>\n<td>61<\/td>\n<\/tr>\n<tr>\n<td>P95 \u5899\u949f&#xff08;s&#xff09;<\/td>\n<td>34<\/td>\n<td>291<\/td>\n<td>268<\/td>\n<td>174<\/td>\n<\/tr>\n<tr>\n<td>\u8d8a\u6743\u6587\u4ef6\u5199\u5165\u6b21\u6570<\/td>\n<td>7<\/td>\n<td>5<\/td>\n<td>4<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td>\u9700\u4eba\u5de5\u6e05\u7406\u7684\u810f\u5de5\u4f5c\u533a<\/td>\n<td>23<\/td>\n<td>11<\/td>\n<td>9<\/td>\n<td>0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u51e0\u4e2a\u5fc5\u987b\u89e3\u91ca\u7684\u70b9&#xff1a;<\/p>\n<p>D \u7684\u6210\u529f\u7387\u6bd4 C \u9ad8&#xff0c;\u4f46\u6b65\u6570\u6bd4 C \u5c11&#xff0c;\u770b\u8d77\u6765\u77db\u76fe&#xff0c;\u5176\u5b9e\u4e0d\u7136\u3002C \u914d\u7f6e\u91cc\u90a3\u4e9b\u591a\u51fa\u6765\u7684\u6b65\u6570&#xff0c;\u7edd\u5927\u90e8\u5206\u662f\u300c\u6a21\u578b\u5728\u539f\u5730\u6253\u8f6c\u300d\u2014\u2014\u6ca1\u6709\u9519\u8bef\u6808\u538b\u7f29\u65f6&#xff0c;\u6a21\u578b\u88ab\u65e5\u5fd7\u566a\u58f0\u5e26\u504f&#xff0c;\u53bb\u4fee warning&#xff1b;\u6ca1\u6709\u6c99\u7bb1\u65f6&#xff0c;\u5b83\u751a\u81f3\u80fd\u6539\u5230\u81ea\u5df1\u4e0a\u4e00\u8f6e\u5199\u574f\u7684\u4e2d\u95f4\u72b6\u6001\u3002D \u7684 non_progress \u68c0\u6d4b\u628a\u8fd9\u4e9b\u65e0\u6548\u6b65\u6570\u76f4\u63a5\u780d\u6389\u4e86\u3002<\/p>\n<p>D \u7684 token \u6bd4 B\/C \u5c11 40%&#xff0c;\u51e0\u4e4e\u5168\u90e8\u6765\u81ea\u9519\u8bef\u6808\u538b\u7f29&#xff08;\u6bcf\u8f6e\u56de\u5582\u4ece\u7ea6 9k \u5b57\u7b26\u964d\u5230\u7ea6 1.2k&#xff09;\u548c\u786e\u5b9a\u6027\u66ff\u6362&#xff08;5 \u4e2a\u73af\u8282\u7684 token \u5f52\u96f6&#xff09;\u3002\u8fd9\u4e00\u9879\u5176\u5b9e\u662f\u7eaf\u8d5a&#xff1a;\u6210\u529f\u7387\u6ca1\u964d&#xff0c;\u6210\u672c\u964d\u4e86&#xff0c;\u5ef6\u8fdf\u4e5f\u964d\u4e86\u3002<\/p>\n<p>\u8d8a\u6743\u6587\u4ef6\u5199\u5165\u4ece 7 \u6b21\u964d\u5230 0 \u6b21\u662f\u6c99\u7bb1 &#043; \u8def\u5f84\u6b63\u5219 &#043; \u6d4b\u8bd5\u53ea\u8bfb\u4e09\u5c42\u7684\u5171\u540c\u7ed3\u679c\u3002\u5355\u72ec\u4efb\u4f55\u4e00\u5c42\u90fd\u4e0d\u591f&#xff1a;\u53ea\u6709\u6c99\u7bb1&#xff0c;\u6a21\u578b\u8fd8\u80fd\u6539 tests\/&#xff1b;\u53ea\u6709\u6b63\u5219&#xff0c;src\/ \u5185\u90e8\u8d8a\u6743\u7ba1\u4e0d\u4e86\u3002<\/p>\n<h4>6.3 \u8fed\u4ee3\u4e0a\u9650\u7684\u654f\u611f\u5ea6<\/h4>\n<p>max_steps \u662f\u4e00\u4e2a\u5fc5\u987b\u8c03\u7684\u53c2\u6570&#xff0c;\u4f46\u4e0d\u662f\u8d8a\u5927\u8d8a\u597d\u3002<\/p>\n<table>\n<tr>max_steps\u6210\u529f\u7387\u5e73\u5747\u6210\u672c&#xff08;USD&#xff09;\u8fb9\u9645\u6210\u529f\u7387\u589e\u76ca\u8fb9\u9645\u6210\u672c&#xff08;USD&#xff09;<\/tr>\n<tbody>\n<tr>\n<td>2<\/td>\n<td>44.9%<\/td>\n<td>0.028<\/td>\n<td>\u2014<\/td>\n<td>\u2014<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>62.1%<\/td>\n<td>0.049<\/td>\n<td>&#043;17.2%<\/td>\n<td>0.021<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>69.4%<\/td>\n<td>0.068<\/td>\n<td>&#043;7.3%<\/td>\n<td>0.019<\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td>71.7%<\/td>\n<td>0.062<\/td>\n<td>&#043;2.3%<\/td>\n<td>-0.006&#xff08;non_progress \u63d0\u524d\u505c&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>12<\/td>\n<td>72.0%<\/td>\n<td>0.081<\/td>\n<td>&#043;0.3%<\/td>\n<td>0.019<\/td>\n<\/tr>\n<tr>\n<td>16<\/td>\n<td>72.1%<\/td>\n<td>0.098<\/td>\n<td>&#043;0.1%<\/td>\n<td>0.017<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6ce8\u610f\u4e24\u4e2a\u53cd\u5e38\u884c&#xff1a;8 \u6b65\u7684\u5e73\u5747\u6210\u672c\u4f4e\u4e8e 6 \u6b65&#xff0c;\u56e0\u4e3a non_progress \u68c0\u6d4b\u5728\u66f4\u5927\u9884\u7b97\u4e0b\u6709\u673a\u4f1a\u89e6\u53d1&#xff0c;\u53cd\u800c\u63d0\u524d\u6536\u655b&#xff1b;12 \u6b65\u4e4b\u540e\u8fb9\u9645\u589e\u76ca\u8dcc\u5230 0.3% \u4ee5\u4e0b&#xff0c;\u8bf4\u660e\u8fd9\u4e2a\u4ed3\u5e93\u7684\u4efb\u52a1\u590d\u6742\u5ea6\u5206\u5e03\u91cc&#xff0c;\u8d85\u8fc7 10 \u6b65\u80fd\u89e3\u7684\u95ee\u9898\u672c\u6765\u5c31\u662f\u5c11\u6570\u2014\u2014\u90a3\u4e9b\u95ee\u9898\u901a\u5e38\u4e0d\u662f\u300c\u591a\u8bd5\u51e0\u6b21\u300d\u80fd\u89e3\u7684&#xff0c;\u800c\u662f\u4efb\u52a1\u63cf\u8ff0\u672c\u8eab\u4e0d\u591f\u6e05\u695a\u3002<\/p>\n<p>\u6211\u7684\u9ed8\u8ba4\u503c\u662f 8 \u6b65 &#043; 0.5 USD \u53cc\u4e0a\u9650\u3002\u4f4e\u4e8e 6 \u4f1a\u660e\u663e\u6389\u6210\u529f\u7387&#xff0c;\u9ad8\u4e8e 12 \u662f\u6d6a\u8d39\u3002<\/p>\n<h4>6.4 \u5931\u8d25\u539f\u56e0\u5206\u5e03&#xff08;D \u914d\u7f6e&#xff0c;17 \u4e2a\u5931\u8d25\u4efb\u52a1&#xff09;<\/h4>\n<table>\n<tr>stop_reason\u6570\u91cf\u5360\u6bd4\u5178\u578b\u60c5\u5f62<\/tr>\n<tbody>\n<tr>\n<td>non_progress<\/td>\n<td>6<\/td>\n<td>35.3%<\/td>\n<td>\u8fde\u7eed\u4e24\u8f6e\u6307\u7eb9\u76f8\u540c&#xff0c;\u6a21\u578b\u5728\u6539\u540c\u4e00\u4e2a\u5730\u65b9<\/td>\n<\/tr>\n<tr>\n<td>steps_exhausted<\/td>\n<td>4<\/td>\n<td>23.5%<\/td>\n<td>\u9700\u6c42\u6d89\u53ca\u8de8\u6a21\u5757\u91cd\u6784&#xff0c;\u4e00\u6b21\u6027\u6539\u4e0d\u52a8<\/td>\n<\/tr>\n<tr>\n<td>cost_tripped<\/td>\n<td>3<\/td>\n<td>17.6%<\/td>\n<td>\u4efb\u52a1\u89e6\u53d1\u4e86\u5927\u8303\u56f4\u7c7b\u578b\u6539\u52a8&#xff0c;mypy \u53cd\u590d\u62a5\u9519<\/td>\n<\/tr>\n<tr>\n<td>flaky_assertion<\/td>\n<td>2<\/td>\n<td>11.8%<\/td>\n<td>\u6d4b\u8bd5\u672c\u8eab\u4f9d\u8d56\u65f6\u95f4\u4e0e\u968f\u673a\u6570<\/td>\n<\/tr>\n<tr>\n<td>gate_regression<\/td>\n<td>1<\/td>\n<td>5.9%<\/td>\n<td>\u5c40\u90e8\u4fee\u597d\u4e86&#xff0c;\u4f46\u7834\u574f\u4e86\u53e6\u4e00\u4e2a\u6a21\u5757\u7684\u5951\u7ea6<\/td>\n<\/tr>\n<tr>\n<td>sandbox_killed<\/td>\n<td>1<\/td>\n<td>5.9%<\/td>\n<td>\u751f\u6210\u7684\u4ee3\u7801\u91cc\u6709\u6b7b\u5faa\u73af&#xff0c;CPU rlimit \u89e6\u53d1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>non_progress \u5360\u7b2c\u4e00\u4f4d&#xff0c;\u8fd9\u6070\u6070\u8bf4\u660e\u8fd9\u4e2a\u4fe1\u53f7\u6293\u5bf9\u4e86&#xff1a;\u5b83\u628a\u672c\u6765\u4f1a\u4ee5 steps_exhausted \u7ed3\u675f\u3001\u767d\u70e7 6 \u6b65\u7684\u4efb\u52a1\u63d0\u524d\u5224\u6b7b\u3002<\/p>\n<h3>\u4e03\u3001\u8e29\u5751\u8bb0\u5f55\u4e0e\u6392\u67e5\u624b\u518c<\/h3>\n<p>\u516b\u6761&#xff0c;\u5168\u90e8\u662f\u771f\u5b9e\u8e29\u8fc7\u7684\u3002\u683c\u5f0f\u56fa\u5b9a\u4e3a\u300c\u73b0\u8c61 \/ \u5b9a\u4f4d \/ \u539f\u56e0 \/ \u89e3\u51b3\u300d\u3002<\/p>\n<h4>7.1 \u6c99\u7bb1\u9003\u9038&#xff1a;\u5b50\u8fdb\u7a0b\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u62ff\u5230\u4e86\u5bbf\u4e3b\u51ed\u8bc1<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u4e00\u4e2a\u300c\u91cd\u547d\u540d\u5de5\u5177\u7c7b\u300d\u7684\u7b80\u5355\u4efb\u52a1&#xff0c;harness \u62a5\u544a solved&#xff0c;\u4f46\u4e8b\u540e\u5728\u5ba1\u8ba1\u65e5\u5fd7\u91cc\u53d1\u73b0\u4efb\u52a1\u671f\u95f4\u6709\u4e00\u6b21\u5bf9 169.254.169.254&#xff08;\u4e91\u5143\u6570\u636e\u670d\u52a1&#xff09;\u7684\u8bf7\u6c42\u3002\u4efb\u52a1\u672c\u8eab\u4e0d\u9700\u8981\u4efb\u4f55\u7f51\u7edc\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u5728\u6c99\u7bb1\u91cc\u8dd1 env | grep -i -E &#034;aws|ssh|kube|token&#034;&#xff0c;\u8f93\u51fa\u91cc\u6709 AWS_PROFILE&#061;prod\u3001SSH_AUTH_SOCK&#061;\/tmp\/ssh-xxx\/agent.1234\u3001KUBECONFIG&#061;\/home\/me\/.kube\/config\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;tempfile.mkdtemp() \u53ea\u9694\u79bb\u4e86\u5de5\u4f5c\u76ee\u5f55&#xff0c;\u6ca1\u6709\u9694\u79bb\u8eab\u4efd\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;subprocess.run \u9ed8\u8ba4\u7ee7\u627f\u7236\u8fdb\u7a0b\u5b8c\u6574\u73af\u5883\u3002\u6211\u628a repo \u62f7\u8fdb\u4e86\u4e34\u65f6\u76ee\u5f55&#xff0c;\u5374\u6ca1\u6709\u52a8 os.environ\u3002\u6a21\u578b\u751f\u6210\u7684\u4efb\u4f55\u4e00\u6bb5\u811a\u672c\u90fd\u80fd\u8bfb\u5230\u8fd9\u4e9b\u53d8\u91cf&#xff0c;\u800c RLIMIT_AS \u548c\u7f51\u7edc\u7b56\u7565&#xff08;\u5f53\u65f6\u8fd8\u6ca1\u52a0 unshare&#xff09;\u90fd\u7ba1\u4e0d\u5230\u300c\u8bfb\u4e00\u4e2a\u73af\u5883\u53d8\u91cf\u300d\u8fd9\u4e2a\u52a8\u4f5c\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u4e09\u91cd\u5904\u7406&#xff0c;\u7f3a\u4e00\u4e0d\u53ef\u3002<\/p>\n<li>\u73af\u5883\u767d\u540d\u5355 _clean_env()&#xff0c;\u53ea\u4fdd\u7559 PATH\/LANG\/TZ \u7b49&#xff0c;\u663e\u5f0f pop \u6389\u51ed\u8bc1\u7c7b\u53d8\u91cf&#xff08;\u89c1 5.2&#xff09;\u3002<\/li>\n<li>HOME \u5f3a\u5236\u6307\u5411\u6c99\u7bb1\u5185\u7684\u7a7a\u76ee\u5f55&#xff0c;\u8ba9 ~\/.aws\u3001~\/.ssh\u3001~\/.config\/gcloud \u4e00\u6b21\u6027\u5168\u90e8\u5931\u6548\u3002\u8fd9\u4e00\u6761\u6bd4\u9010\u4e2a pop \u66f4\u5f7b\u5e95\u3002<\/li>\n<li>Linux \u4e0a\u7528 unshare -n \u5efa\u65e0\u7f51\u7edc\u547d\u540d\u7a7a\u95f4&#xff1b;\u4e0d\u652f\u6301\u7684\u5e73\u53f0\u6253\u5370\u964d\u7ea7\u8b66\u544a&#xff0c;\u7edd\u4e0d\u9759\u9ed8\u3002<\/li>\n<p>\u9a8c\u8bc1\u65b9\u5f0f&#xff1a;\u5728\u6c99\u7bb1\u91cc\u8dd1 python -c &#034;import os,socket;print(os.environ.get(&#039;AWS_PROFILE&#039;));socket.create_connection((&#039;1.1.1.1&#039;,80),3)&#034;&#xff0c;\u5e94\u5f53\u629b\u5f02\u5e38\u6216\u8d85\u65f6\u3002<\/p>\n<h4>7.2 flaky \u6d4b\u8bd5\u8ba9\u5faa\u73af\u5728\u4e24\u4e2a\u72b6\u6001\u4e4b\u95f4\u9707\u8361<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u4e00\u4e2a\u4efb\u52a1\u7684\u6210\u672c\u662f\u540c\u7c7b\u4efb\u52a1\u7684 4 \u500d&#xff0c;8 \u6b65\u8dd1\u6ee1&#xff0c;\u6700\u540e steps_exhausted \u5931\u8d25\u3002\u9010\u8f6e\u770b\u62a5\u544a&#xff0c;\u53d1\u73b0\u5931\u8d25\u8282\u70b9\u5728 test_order_total \u548c test_order_total_concurrent \u4e4b\u95f4\u6765\u56de\u8df3&#xff0c;\u9519\u8bef\u7c7b\u578b\u4e00\u4f1a\u513f AssertionError \u4e00\u4f1a\u513f TimeoutError\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u628a\u8fd9\u4e24\u4e2a\u6d4b\u8bd5\u5355\u72ec\u62ff\u51fa\u6765\u8fde\u8dd1 10 \u6b21&#xff0c;\u9000\u51fa\u7801\u6709 0 \u6709 1\u3002\u662f\u6d4b\u8bd5\u672c\u8eab\u4e0d\u7a33\u5b9a&#xff0c;\u4e0d\u662f\u4ee3\u7801\u6709\u95ee\u9898\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;test_order_total_concurrent \u4f9d\u8d56 time.time() \u548c\u7ebf\u7a0b\u6c60\u8c03\u5ea6&#xff0c;\u5728\u8d1f\u8f7d\u9ad8\u7684\u65f6\u5019\u4f1a\u8d85\u65f6\u3002harness \u628a\u300c\u65ad\u8a00\u5931\u8d25\u300d\u65e0\u6761\u4ef6\u7b49\u4ef7\u4e3a\u300c\u6a21\u578b\u5199\u9519\u4e86\u300d&#xff0c;\u4e8e\u662f\u6a21\u578b\u88ab\u8981\u6c42\u53bb\u4fee\u4e00\u4e2a\u5b83\u6839\u672c\u6ca1\u78b0\u8fc7\u7684\u5e76\u53d1\u6d4b\u8bd5&#xff0c;\u8d8a\u4fee\u8d8a\u4e71\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u5728\u65ad\u8a00\u5c42\u52a0 looks_flaky()&#xff08;\u89c1 5.4&#xff09;\u2014\u2014\u540c\u4e00\u4e2a\u8282\u70b9\u8fde\u8dd1 3 \u6b21&#xff0c;\u9000\u51fa\u7801\u4e0d\u4e00\u81f4\u5c31\u5224\u5b9a flaky&#xff0c;\u76f4\u63a5\u7f6e stop_reason&#061;flaky_assertion \u5e76\u505c\u6b62\u5faa\u73af&#xff0c;\u4e0d\u628a\u9505\u7529\u7ed9\u6a21\u578b\u3002\u540c\u65f6\u628a flaky \u6d4b\u8bd5\u6253\u4e0a &#064;pytest.mark.flaky \u5e76\u79fb\u51fa L3 \u76ee\u6807\u5c42&#xff0c;\u53ea\u4fdd\u7559\u5728 L5 \u5168\u91cf\u91cc\u4f5c\u4e3a\u53c2\u8003&#xff08;\u4e0d\u8ba1\u5165\u95e8\u7981&#xff09;\u3002<\/p>\n<p>\u8fd9\u6761\u5751\u7684\u6559\u8bad\u662f\u901a\u7528\u7684&#xff1a;**\u4efb\u4f55\u81ea\u52a8\u5316\u4fee\u590d\u5faa\u73af\u90fd\u5fc5\u987b\u5148\u9a8c\u8bc1\u88c1\u5224\u662f\u53ef\u9760\u7684&#xff0c;\u518d\u8ba9\u9009\u624b\u4e0a\u573a\u3002**\u88c1\u5224\u4e0d\u53ef\u9760\u7684\u65f6\u5019&#xff0c;\u5faa\u73af\u8dd1\u5f97\u8d8a\u4e45\u9519\u5f97\u8d8a\u79bb\u8c31\u3002<\/p>\n<h4>7.3 \u8fed\u4ee3\u4e0a\u9650\u8bbe\u6210 3&#xff0c;\u4efb\u52a1\u5927\u6279\u300c\u76f4\u63a5\u653e\u5f03\u300d<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u521d\u7248 harness \u4e0a\u7ebf\u7b2c\u4e00\u5929&#xff0c;\u6210\u529f\u7387\u53ea\u6709 44.9%\u3002\u770b\u5931\u8d25\u5206\u5e03&#xff0c;\u4e00\u5927\u534a\u662f steps_exhausted&#xff0c;\u800c\u4e14\u5b83\u4eec\u7684\u62a5\u544a\u91cc\u5f80\u5f80\u53ea\u6709 2 \u5230 3 \u8f6e\u8fed\u4ee3&#xff0c;\u6700\u540e\u90a3\u8f6e\u7684\u5931\u8d25\u6808\u770b\u8d77\u6765\u300c\u5feb\u8981\u4fee\u597d\u4e86\u300d\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u6211\u628a max_steps \u9ed8\u8ba4\u503c\u8bbe\u6210\u4e86 3&#xff0c;\u7406\u7531\u662f\u300c\u63a7\u5236\u6210\u672c\u300d\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;\u6210\u672c\u7126\u8651\u5bfc\u81f4\u9884\u7b97\u8fc7\u7d27\u3002\u4ece 6.3 \u7684\u654f\u611f\u5ea6\u8868\u53ef\u4ee5\u8bfb\u51fa&#xff0c;\u8fd9\u4e2a\u4ed3\u5e93\u4e0a\u4ece 2 \u6b65\u5230 6 \u6b65\u7684\u8fb9\u9645\u6210\u529f\u7387\u589e\u76ca\u662f &#043;24.5%&#xff0c;\u8fb9\u9645\u6210\u672c\u53ea\u6709 0.04 USD&#xff1b;\u800c 12 \u6b65\u4e4b\u540e\u8fb9\u9645\u589e\u76ca\u8dcc\u5230 0.3%\u3002\u9884\u7b97\u66f2\u7ebf\u6709\u4e00\u4e2a\u660e\u663e\u7684\u819d\u70b9&#xff0c;\u628a\u4e0a\u9650\u8bbe\u5728\u819d\u70b9\u5de6\u8fb9\u662f\u7eaf\u4e8f\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u9ed8\u8ba4\u6539\u6210 8 \u6b65 &#043; 0.5 USD \u53cc\u4e0a\u9650&#xff0c;\u5e76\u4e14\u7528 non_progress \u68c0\u6d4b\u628a\u300c\u6253\u8f6c\u300d\u7684\u4efb\u52a1\u63d0\u524d\u5224\u6b7b\u3002\u8fd9\u6837\u65e2\u4e0d\u4f1a\u8fc7\u65e9\u653e\u5f03&#xff0c;\u4e5f\u4e0d\u4f1a\u8ba9\u65e0\u89e3\u4efb\u52a1\u70e7\u6ee1\u9884\u7b97\u3002\u53e6\u5916\u4e00\u4e2a\u914d\u5957\u52a8\u4f5c&#xff1a;\u5728\u62a5\u544a\u91cc\u8bb0\u5f55\u6bcf\u4e00\u8f6e\u7684 fingerprint&#xff0c;\u9694\u4e00\u5468\u56de\u5934\u770b\u54ea\u4e9b\u6307\u7eb9\u53cd\u590d\u51fa\u73b0\u2014\u2014\u90a3\u4e9b\u901a\u5e38\u662f\u9700\u6c42\u63cf\u8ff0\u4e0d\u6e05\u7684\u4efb\u52a1&#xff0c;\u5e94\u8be5\u56de\u5230\u4eba\u90a3\u91cc\u62c6\u7ec6&#xff0c;\u800c\u4e0d\u662f\u9760\u52a0\u9884\u7b97\u786c\u625b\u3002<\/p>\n<h4>7.4 \u56de\u6eda\u628a\u672a\u8ddf\u8e2a\u6587\u4ef6\u5220\u6ca1\u4e86<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u4e00\u6b21\u5931\u8d25\u7684\u81ea\u52a8\u4fee\u590d\u4e4b\u540e&#xff0c;\u5f00\u53d1\u8005\u53d1\u73b0\u81ea\u5df1\u672c\u5730\u7684 .env.local \u548c\u4e00\u4efd\u5199\u4e86\u4e24\u5929\u8fd8\u6ca1\u63d0\u4ea4\u7684\u8fc1\u79fb\u811a\u672c migrations\/2026_09_add_tenant.sql \u4e00\u8d77\u6d88\u5931\u4e86\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u56de\u6eda\u4ee3\u7801\u662f git checkout . &amp;&amp; git clean -fd\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;git clean -fd \u7684\u5b9a\u4e49\u5c31\u662f\u300c\u5220\u9664\u6240\u6709\u672a\u8ddf\u8e2a\u6587\u4ef6\u300d&#xff0c;\u5b83\u4e0d\u533a\u5206\u8fd9\u4e2a\u6587\u4ef6\u662f\u6a21\u578b\u65b0\u5efa\u7684\u8fd8\u662f\u5f00\u53d1\u8005\u672c\u6765\u5c31\u6709\u7684\u3002git checkout . \u4e5f\u53ea\u6062\u590d\u5df2\u8ddf\u8e2a\u6587\u4ef6\u3002\u4e24\u4e2a\u547d\u4ee4\u5408\u8d77\u6765&#xff0c;\u628a\u300c\u4efb\u52a1\u5f00\u59cb\u524d\u5c31\u5b58\u5728\u7684\u672a\u8ddf\u8e2a\u6587\u4ef6\u300d\u8fd9\u4e00\u6574\u7c7b\u72b6\u6001\u65e0\u5dee\u522b\u62b9\u6389\u4e86\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u6539\u7528 5.3 \u7684\u5feb\u7167\u65b9\u6848\u2014\u2014\u5148 git add -A \u8ba9\u672a\u8ddf\u8e2a\u6587\u4ef6\u8fdb\u5165\u7d22\u5f15&#xff0c;\u518d git diff &#8211;cached &#8211;binary \u751f\u6210\u5305\u542b\u65b0\u5efa\u6587\u4ef6\u7684\u5b8c\u6574 patch&#xff0c;\u56de\u6eda\u65f6 git apply -R\u3002git apply -R \u5bf9\u300cnew file mode\u300d\u6bb5\u843d\u7684\u5904\u7406\u662f\u5220\u9664\u8be5\u6587\u4ef6&#xff0c;\u6240\u4ee5\u5b83\u5929\u7136\u533a\u5206\u4e86\u300c\u65b0\u5efa\u7684&#xff08;\u8be5\u5220&#xff09;\u300d\u548c\u300c\u672c\u6765\u5c31\u6709\u7684&#xff08;\u8be5\u7559&#xff09;\u300d\u3002\u53e6\u5916\u52a0\u4e86\u4e24\u6761\u4fdd\u9669&#xff1a;\u56de\u6eda\u524d\u5148 git apply &#8211;check -R \u9a8c\u8bc1&#xff1b;\u5feb\u7167\u65f6\u628a run_id \u5199\u8fdb patch \u6587\u4ef6\u540d&#xff0c;\u4fdd\u7559 7 \u5929&#xff0c;\u65b9\u4fbf\u4eba\u5de5\u627e\u56de\u3002<\/p>\n<p>\u5982\u679c\u4f60\u73b0\u5728\u7684\u4ee3\u7801\u91cc\u8fd8\u6709 git clean -fd&#xff0c;\u4eca\u5929\u5c31\u6539\u6389\u3002<\/p>\n<h4>7.5 \u9519\u8bef\u6808\u592a\u957f&#xff0c;\u6324\u7206\u4e0a\u4e0b\u6587\u5e76\u5e26\u504f\u6a21\u578b<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u7b2c 3 \u8f6e\u4e4b\u540e\u6a21\u578b\u5f00\u59cb\u300c\u8dd1\u9898\u300d\u2014\u2014\u5b83\u53bb\u4fee\u4e00\u4e9b\u548c\u4efb\u52a1\u5b8c\u5168\u65e0\u5173\u7684 warning&#xff0c;\u751a\u81f3\u5728\u62a5\u544a\u91cc\u62b1\u6028\u300c\u4f9d\u8d56\u7248\u672c\u4e0d\u517c\u5bb9\u300d\u3002\u4efb\u52a1\u7684\u771f\u5b9e\u5931\u8d25\u70b9\u5728\u7b2c 1 \u884c\u5c31\u5df2\u7ecf\u660e\u786e\u4e86\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u6253\u5370\u56de\u5582\u7ed9\u6a21\u578b\u7684\u5b57\u7b26\u4e32\u957f\u5ea6&#xff0c;\u5e73\u5747 9400 \u5b57\u7b26&#xff0c;\u6700\u9ad8 38000\u3002\u91cc\u9762 70% \u662f Requirement already satisfied\u3001Building wheel for xxx \u8fd9\u7c7b\u566a\u58f0\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;\u4e24\u6761\u53e0\u52a0\u3002\u4e00\u662f\u6211\u628a pytest \u7684\u5b8c\u6574 stdout \u539f\u6837\u56de\u5582&#xff1b;\u4e8c\u662f\u4e0a\u4e0b\u6587\u88ab\u566a\u58f0\u5360\u6ee1\u4e4b\u540e&#xff0c;\u6a21\u578b\u80fd\u300c\u770b\u5230\u300d\u7684\u771f\u5b9e\u5931\u8d25\u4fe1\u606f\u53cd\u800c\u53d8\u5c11&#xff0c;\u4e8e\u662f\u5b83\u53ea\u80fd\u4ece\u566a\u58f0\u91cc\u6311\u4e00\u4e2a\u770b\u8d77\u6765\u50cf\u95ee\u9898\u7684\u95ee\u9898\u53bb\u4fee\u3002\u8fd9\u662f\u4e00\u4e2a\u6b63\u53cd\u9988\u7684\u8dd1\u504f\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u5b9e\u73b0 compress()&#xff08;\u89c1 5.4&#xff09;&#xff1a;\u4e22\u6389\u566a\u58f0\u884c\u3001\u4fdd\u7559\u5934\u90e8 12 \u884c\u4e0e\u5c3e\u90e8\u65ad\u8a00\u76f8\u5173\u884c\u3001\u603b\u957f\u5ea6\u786c\u4e0a\u9650 4000 \u5b57\u7b26\u3002\u538b\u7f29\u540e\u5e73\u5747\u56de\u5582\u7ea6 1200 \u5b57\u7b26\u3002\u5b9e\u6d4b\u7ed3\u679c\u662f\u6210\u529f\u7387\u4e0d\u964d\u53cd\u5347&#xff08;\u56e0\u4e3a\u6a21\u578b\u4e0d\u518d\u88ab\u5e26\u504f&#xff09;&#xff0c;\u540c\u65f6 token \u6d88\u8017\u4e0b\u964d\u7ea6 40%\u3002<\/p>\n<p>\u8865\u5145\u4e00\u6761\u7ecf\u9a8c&#xff1a;\u9519\u8bef\u6808\u8981\u4fdd\u7559\u300c\u7cbe\u786e\u4f4d\u7f6e\u300d\u800c\u4e0d\u662f\u300c\u5b8c\u6574\u8fc7\u7a0b\u300d\u3002\u6a21\u578b\u9700\u8981\u7684\u662f src\/pricing.py:42: AssertionError: assert 90 &#061;&#061; 81&#xff0c;\u4e0d\u662f\u524d\u9762 200 \u884c\u7684 fixture \u6784\u9020\u8fc7\u7a0b\u3002<\/p>\n<h4>7.6 \u6a21\u578b\u6539\u6d4b\u8bd5\u800c\u4e0d\u662f\u6539\u4ee3\u7801<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u4efb\u52a1\u62a5\u544a solved&#061;True&#xff0c;\u95e8\u7981\u5168\u7eff&#xff0c;\u4f46 PR \u91cc tests\/test_cart.py \u88ab\u6539\u4e86\u2014\u2014\u65ad\u8a00\u4ece assert total &#061;&#061; 81 \u53d8\u6210\u4e86 assert total &#061;&#061; pytest.approx(81, abs&#061;1)\u3002\u529f\u80fd\u6ca1\u4fee&#xff0c;\u5224\u636e\u88ab\u653e\u5bbd\u4e86\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;git diff \u663e\u793a\u6d4b\u8bd5\u6587\u4ef6\u7684\u6539\u52a8\u6765\u81ea\u6a21\u578b\u7684 patch\u3002\u68c0\u67e5 harness&#xff0c;\u53d1\u73b0\u6c99\u7bb1\u5de5\u4f5c\u533a\u91cc\u7684 tests\/ \u662f\u53ef\u5199\u7684\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;\u6211\u53ea\u7528\u63d0\u793a\u8bcd\u7ea6\u675f\u300c\u4e0d\u8981\u6539\u6d4b\u8bd5\u300d&#xff0c;\u6ca1\u6709\u5728\u6587\u4ef6\u7cfb\u7edf\u5c42\u9762\u7981\u6b62\u3002\u63d0\u793a\u8bcd\u662f\u5efa\u8bae&#xff0c;\u6a21\u578b\u5728\u300c\u6539\u4ee3\u7801\u6539\u4e0d\u52a8\u300d\u7684\u65f6\u5019\u4f1a\u81ea\u7136\u6ed1\u5411\u300c\u6539\u5224\u636e\u300d\u2014\u2014\u56e0\u4e3a\u4ece\u5b83\u7684\u89c6\u89d2\u770b&#xff0c;\u8fd9\u4e24\u6761\u8def\u90fd\u80fd\u8ba9\u65ad\u8a00\u53d8\u7eff\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u4e09\u5c42\u9632\u62a4\u3002<\/p>\n<li>FileEdit.path \u6b63\u5219\u9650\u5236 &#043; Generator\/Fixer \u63d0\u793a\u8bcd\u660e\u786e\u7981\u6b62&#xff08;5.5&#xff09;\u3002<\/li>\n<li>\u6c99\u7bb1\u91cc\u5bf9 tests\/ \u4e0b\u6240\u6709\u6587\u4ef6 chmod 0o444&#xff0c;\u6a21\u578b\u5199\u4e0d\u8fdb\u53bb&#xff08;5.6 \u7684 _apply&#xff09;\u3002<\/li>\n<li>_commit() \u56de\u5199\u5bbf\u4e3b\u65f6\u8df3\u8fc7 tests\/ \u8def\u5f84&#xff0c;\u53cc\u4fdd\u9669\u3002<\/li>\n<p>\u8fd9\u662f\u300c\u786e\u5b9a\u6027\u65ad\u8a00\u300d\u8fd9\u6761\u8fb9\u754c\u7684\u6838\u5fc3\u3002\u5224\u636e\u5fc5\u987b\u7269\u7406\u4e0a\u4e0d\u53ef\u5199&#xff0c;\u5426\u5219\u5b83\u5c31\u4e0d\u662f\u5224\u636e&#xff0c;\u53ea\u662f\u4e00\u4e2a\u9ed8\u8ba4\u503c\u3002<\/p>\n<h4>7.7 \u6210\u672c\u7194\u65ad\u53ea\u7b97\u4e86\u6a21\u578b token&#xff0c;\u5de5\u5177\u4fa7\u8dd1\u5192\u4e86<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u4e00\u4e2a\u4efb\u52a1\u7684\u6a21\u578b token \u53ea\u82b1\u4e86 0.06 USD&#xff0c;\u4f46\u6574\u4e2a\u4efb\u52a1\u8dd1\u4e86 22 \u5206\u949f&#xff0c;\u5360\u4e86 CI \u4e00\u6574\u53f0\u673a\u5668\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u770b RunReport \u7684 iterations&#xff0c;\u6bcf\u8f6e L3 \u76ee\u6807\u6d4b\u8bd5\u7684 duration_ms \u90fd\u5728 90 \u79d2\u4ee5\u4e0a\u3002\u6a21\u578b\u4fa7\u9884\u7b97\u6ca1\u89e6\u9876&#xff0c;\u6240\u4ee5\u5faa\u73af\u4e00\u76f4\u7ee7\u7eed\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;Budget \u53ea\u8bb0\u4e86 token \u548c\u94b1&#xff0c;\u6ca1\u8bb0\u5899\u949f\u3002\u5de5\u5177\u4fa7\u7684\u6210\u672c&#xff08;\u8dd1\u6d4b\u8bd5\u3001\u8dd1 mypy&#xff09;\u5728 token \u8d26\u4e0a\u5b8c\u5168\u4e0d\u53ef\u89c1\u3002\u800c max_wall_clock_s \u5f53\u65f6\u8bbe\u6210\u4e86 600&#xff0c;\u592a\u5bbd\u677e\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u628a\u5899\u949f\u9884\u7b97\u4ece 600 \u964d\u5230 240&#xff0c;\u5e76\u4e14\u5728 Budget.pressure() \u91cc\u628a\u5899\u949f\u4e5f\u7eb3\u5165&#xff08;5.1 \u5df2\u7ecf\u662f\u56db\u7ef4\u5ea6&#xff09;\u3002\u66f4\u5173\u952e\u7684\u662f\u628a\u5de5\u5177\u8017\u65f6\u663e\u5f0f\u8bb0\u8d26&#xff1a;\u6bcf\u4e00\u8f6e\u628a iteration.duration_ms \u7d2f\u52a0&#xff0c;\u5355\u72ec\u51fa\u4e00\u4e2a tool_seconds \u6307\u6807\u3002\u73b0\u5728\u6211\u7684\u770b\u677f\u4e0a\u6709\u4e24\u6761\u7ebf&#xff0c;model_cost_usd \u548c tool_seconds&#xff0c;\u4efb\u4f55\u4e00\u4e2a\u5f02\u5e38\u90fd\u80fd\u7acb\u523b\u5b9a\u4f4d\u662f\u54ea\u4e00\u4fa7\u3002<\/p>\n<h4>7.8 RLIMIT_AS \u8bbe\u592a\u5c0f&#xff0c;CPython \u8d77\u4e0d\u6765<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u628a address_space_mb \u4ece 2048 \u8c03\u5230 512 \u60f3\u7701\u5185\u5b58&#xff0c;\u7ed3\u679c\u6240\u6709\u6c99\u7bb1\u547d\u4ee4\u7684\u9000\u51fa\u7801\u90fd\u662f 1&#xff0c;stdout \u548c stderr \u5168\u7a7a\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u5728\u6c99\u7bb1\u5916\u624b\u52a8\u8dd1 ulimit -v 524288 &amp;&amp; python -c &#034;print(1)&#034;&#xff0c;\u540c\u6837\u9000\u51fa\u7801 1 \u65e0\u8f93\u51fa\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;CPython \u89e3\u91ca\u5668\u542f\u52a8\u65f6\u4f1a\u9884\u7559\u76f8\u5f53\u5927\u4e00\u7247\u865a\u62df\u5730\u5740\u7a7a\u95f4&#xff08;arena\u3001\u7ebf\u7a0b\u6808\u3001importlib \u7684\u6620\u5c04&#xff09;&#xff0c;RLIMIT_AS \u9650\u7684\u662f\u865a\u62df\u5730\u5740\u7a7a\u95f4\u800c\u4e0d\u662f\u7269\u7406\u5185\u5b58\u3002512MB \u7684\u865a\u62df\u5730\u5740\u4e0a\u9650\u5728\u89e3\u91ca\u5668\u5b8c\u6210\u521d\u59cb\u5316\u4e4b\u524d\u5c31\u88ab\u6253\u6ee1\u4e86&#xff0c;\u8fdb\u7a0b\u5728\u80fd\u6253\u5370\u4efb\u4f55\u9519\u8bef\u4fe1\u606f\u4e4b\u524d\u5c31\u88ab SIGKILL \u6389\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;address_space_mb \u4e0d\u4f4e\u4e8e 1536&#xff08;\u6211\u9ed8\u8ba4 2048&#xff09;\u3002\u9700\u8981\u66f4\u4e25\u683c\u7684\u5185\u5b58\u9650\u5236\u65f6&#xff0c;\u4e0d\u8981\u7ee7\u7eed\u538b RLIMIT_AS&#xff0c;\u6539\u6210\u4e0b\u9762\u4e24\u79cd\u4e4b\u4e00&#xff1a;<\/p>\n<ul>\n<li>\u7528 cgroup v2 \u7684 memory.max \u9650\u7269\u7406\u5185\u5b58&#xff08;\u8fd9\u662f\u6b63\u786e\u7684\u91cf&#xff09;\u3002<\/li>\n<li>\u7528 RLIMIT_DATA&#xff08;\u5806&#xff09;\u914d\u5408 RLIMIT_AS \u653e\u5bbd&#xff0c;\u4f46 Python \u4e0a\u6548\u679c\u4e0d\u7a33&#xff0c;\u4e0d\u63a8\u8350\u3002<\/li>\n<\/ul>\n<p>\u901a\u7528\u6392\u67e5\u6280\u5de7&#xff1a;\u6c99\u7bb1\u547d\u4ee4\u9000\u51fa\u7801\u975e 0 \u4e14 stdout\/stderr \u5168\u7a7a\u65f6&#xff0c;\u5148\u6000\u7591 rlimit&#xff0c;\u518d\u6000\u7591\u547d\u4ee4\u672c\u8eab\u3002\u5728 RunResult \u91cc\u4fdd\u7559 killed_by \u5b57\u6bb5\u5c31\u662f\u4e3a\u4e86\u8fd9\u4e00\u523b\u2014\u2014rlimit_cpu\/rlimit_mem\/timeout \u4e09\u4e2a\u503c\u80fd\u8ba9\u8fd9\u7c7b\u95ee\u9898\u4e00\u773c\u770b\u51fa\u3002<\/p>\n<h4>7.9 \u8e29\u5751\u901f\u67e5\u8868<\/h4>\n<table>\n<tr>\u73b0\u8c61\u4e00\u53e5\u8bdd\u5b9a\u4f4d\u547d\u4ee4\u6839\u56e0\u5206\u7c7b\u4fee\u590d\u4f4d\u7f6e<\/tr>\n<tbody>\n<tr>\n<td>\u6c99\u7bb1\u91cc\u80fd\u8bfb\u5230\u5bbf\u4e3b\u51ed\u8bc1<\/td>\n<td>env | grep -i aws<\/td>\n<td>\u73af\u5883\u7ee7\u627f<\/td>\n<td>_clean_env() &#043; HOME \u91cd\u5b9a\u5411<\/td>\n<\/tr>\n<tr>\n<td>\u5faa\u73af\u5728\u4e24\u4e2a\u5931\u8d25\u70b9\u95f4\u8df3<\/td>\n<td>\u5355\u6d4b\u8fde\u8dd1 3 \u6b21<\/td>\n<td>flaky \u65ad\u8a00<\/td>\n<td>looks_flaky() \u63d0\u524d\u505c<\/td>\n<\/tr>\n<tr>\n<td>\u5927\u6279\u4efb\u52a1\u8fc7\u65e9\u653e\u5f03<\/td>\n<td>\u770b stop_reason \u5206\u5e03<\/td>\n<td>\u9884\u7b97\u8fc7\u7d27<\/td>\n<td>max_steps \u8c03\u5230\u819d\u70b9\u53f3\u4fa7<\/td>\n<\/tr>\n<tr>\n<td>\u672c\u5730\u672a\u63d0\u4ea4\u6587\u4ef6\u6d88\u5931<\/td>\n<td>git status \u524d\u540e\u5bf9\u6bd4<\/td>\n<td>git clean -fd<\/td>\n<td>\u6539\u7528 git apply -R<\/td>\n<\/tr>\n<tr>\n<td>\u6a21\u578b\u4fee\u65e0\u5173\u7684\u4e1c\u897f<\/td>\n<td>\u6253\u5370\u56de\u5582\u957f\u5ea6<\/td>\n<td>\u4e0a\u4e0b\u6587\u566a\u58f0<\/td>\n<td>compress()<\/td>\n<\/tr>\n<tr>\n<td>\u6d4b\u8bd5\u65ad\u8a00\u88ab\u653e\u5bbd<\/td>\n<td>git diff tests\/<\/td>\n<td>\u5224\u636e\u53ef\u5199<\/td>\n<td>chmod 0o444 &#043; \u56de\u5199\u8df3\u8fc7<\/td>\n<\/tr>\n<tr>\n<td>\u4efb\u52a1\u8017\u65f6\u957f\u4f46\u5f88\u4fbf\u5b9c<\/td>\n<td>\u770b tool_seconds<\/td>\n<td>\u5de5\u5177\u4fa7\u6210\u672c\u6ca1\u8bb0\u8d26<\/td>\n<td>\u5899\u949f\u7eb3\u5165 pressure()<\/td>\n<\/tr>\n<tr>\n<td>\u6c99\u7bb1\u547d\u4ee4\u65e0\u8f93\u51fa\u9000\u51fa 1<\/td>\n<td>\u624b\u52a8 ulimit -v<\/td>\n<td>\u865a\u62df\u5730\u5740\u4e0a\u9650<\/td>\n<td>address_space_mb &gt;&#061; 1536<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>\u516b\u3001\u4f18\u5316\u65b9\u6848\u4e0e\u8fdb\u9636\u6253\u6cd5<\/h3>\n<h4>8.1 \u52a8\u6001 Skill \u52a0\u8f7d &#043; Prompt Caching \u538b TTFT<\/h4>\n<p>\u628a 30 \u4e2a Skill \u7684\u5b9a\u4e49\u5168\u585e\u8fdb system prompt&#xff0c;\u524d\u7f00\u4f1a\u6709 8000 \u5230 15000 token&#xff0c;\u6bcf\u6b21\u8c03\u7528\u90fd\u8981\u91cd\u65b0 prefill\u3002Anthropic \u84dd\u56fe\u7ed9\u7684\u505a\u6cd5\u662f\u53cd\u8fc7\u6765\u7684&#xff1a;<\/p>\n<p>\u9759\u6001\u524d\u7f00&#xff08;\u53ef\u7f13\u5b58&#xff0c;\u8de8\u4efb\u52a1\u590d\u7528&#xff09;&#xff1a;<br \/>\n    [\u8eab\u4efd] [\u5b89\u5168\u7ea2\u7ebf] [\u8f93\u51fa schema] [\u5de5\u5177\u7b7e\u540d]<br \/>\n        -&gt; \u8fd9\u6bb5\u5fc5\u987b\u6bcf\u6b21\u8c03\u7528\u5b8c\u5168\u9010\u5b57\u8282\u4e00\u81f4&#xff0c;\u624d\u80fd\u547d\u4e2d Prompt Caching<\/p>\n<p>\u52a8\u6001\u6302\u8f7d&#xff08;\u4e0d\u53ef\u7f13\u5b58&#xff0c;\u6309\u9700\u6ce8\u5165&#xff09;&#xff1a;<br \/>\n    [\u672c\u6b21\u4efb\u52a1\u76f8\u5173 Skill 1..3] [\u68c0\u7d22\u5230\u7684\u6587\u4ef6\u7247\u6bb5] [\u538b\u7f29\u540e\u7684\u9519\u8bef\u6808]<br \/>\n        -&gt; \u8fd9\u6bb5\u6bcf\u8f6e\u90fd\u5728\u53d8&#xff0c;\u653e\u5728\u6700\u540e&#xff0c;\u907f\u514d\u6c61\u67d3\u524d\u7f00<\/p>\n<p>\u4e09\u6761\u5b9e\u64cd\u7ea6\u675f&#xff1a;<\/p>\n<ul>\n<li>**\u9759\u6001\u524d\u7f00\u5fc5\u987b\u9010\u5b57\u8282\u7a33\u5b9a\u3002**\u4efb\u4f55\u65f6\u95f4\u6233\u3001\u968f\u673a run_id\u3001\u7248\u672c\u53f7\u62fc\u63a5\u8fdb system prompt \u90fd\u4f1a\u5bfc\u81f4\u7f13\u5b58 miss\u3002\u6211\u628a run_id \u632a\u5230\u4e86 user message \u91cc\u3002<\/li>\n<li>**Skill \u6302\u8f7d\u8981\u6709\u4e0a\u9650\u3002**\u4e00\u6b21\u6700\u591a\u6302 3 \u4e2a&#xff0c;\u8d85\u8fc7\u5c31\u5148\u505a\u4e00\u8f6e\u300c\u9009 Skill\u300d\u7684\u4fbf\u5b9c\u6a21\u578b\u8c03\u7528\u3002\u6302 10 \u4e2a Skill \u7684\u6536\u76ca\u8fdc\u4f4e\u4e8e\u6210\u672c\u3002<\/li>\n<li>**\u7f13\u5b58\u6709\u6548\u671f\u8981\u5bf9\u9f50\u4f60\u7684\u8fed\u4ee3\u8282\u594f\u3002**\u5927\u90e8\u5206\u7f51\u5173\u7684\u7f13\u5b58 TTL \u662f 5 \u5206\u949f&#xff0c;\u800c\u4e00\u8f6e\u8fed\u4ee3&#xff08;\u6a21\u578b\u8c03\u7528 &#043; \u6c99\u7bb1\u8dd1\u6d4b\u8bd5&#xff09;\u5f80\u5f80\u8d85\u8fc7 5 \u5206\u949f\u3002\u89e3\u51b3\u529e\u6cd5\u662f\u628a\u65ad\u8a00\u5c42\u505a\u5feb&#xff1a;L0 \u7528 ruff&#xff08;\u7ea6 50ms&#xff09;\u800c\u4e0d\u662f\u7b49\u5168\u91cf\u6d4b\u8bd5&#xff0c;\u8ba9 TTFT \u7684\u70ed\u8def\u5f84\u7559\u5728 TTL \u5185\u3002<\/li>\n<\/ul>\n<p>\u5b9e\u6d4b&#xff1a;\u9759\u6001\u524d\u7f00 6200 token \u7a33\u5b9a\u540e&#xff0c;\u547d\u4e2d\u7f13\u5b58\u7684\u5355\u8f6e TTFT \u4ece\u7ea6 1.8s \u964d\u5230\u7ea6 0.6s&#xff0c;8 \u6b65\u4efb\u52a1\u7d2f\u8ba1\u7701\u4e0b\u7ea6 9s&#xff1b;\u6210\u672c\u4e0a\u7f13\u5b58\u547d\u4e2d\u7684\u8f93\u5165 token \u901a\u5e38\u6709\u5927\u5e45\u6298\u6263&#xff0c;\u6574\u4f53\u518d\u964d\u7ea6 30%\u3002<\/p>\n<h4>8.2 UI \u7ec4\u4ef6\u4f5c\u4e3a\u5de5\u5177\u8f93\u51fa<\/h4>\n<p>\u5de5\u5177\u8fd4\u56de\u7eaf\u6587\u672c\u65f6&#xff0c;\u300c\u6a21\u578b\u7406\u89e3\u300d\u548c\u300c\u4eba\u7406\u89e3\u300d\u7528\u7684\u662f\u540c\u4e00\u4efd\u6750\u6599&#xff0c;\u800c\u8fd9\u4e24\u4ef6\u4e8b\u7684\u6700\u4f18\u8868\u793a\u5b8c\u5168\u4e0d\u540c\u3002\u8ba9\u5de5\u5177\u8fd4\u56de\u4e00\u4e2a\u7ec4\u4ef6\u63cf\u8ff0&#xff1a;<\/p>\n<p><span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token string-property property\">&#034;component&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;DiffReview&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;props&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string-property property\">&#034;files&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">&#034;path&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;src\/pricing.py&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;added&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">6<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;removed&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;assertions&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">&#034;name&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;L3_target&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;ok&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;ms&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">3120<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;budget&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">&#034;steps&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;2\/8&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;cost&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;$0.017 \/ $0.50&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;actions&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">&#034;id&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;approve&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;label&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u5408\u5e76&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">&#034;id&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;reject&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;label&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u56de\u6eda&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u524d\u7aef\u6e32\u67d3\u6210\u4e00\u4e2a\u771f\u5b9e\u7684 diff \u89c6\u56fe &#043; \u9884\u7b97\u8fdb\u5ea6\u6761 &#043; \u4e24\u4e2a\u6309\u94ae\u3002\u597d\u5904\u6709\u4e09&#xff1a;\u4eba\u4e0d\u7528\u8bfb\u6a21\u578b\u5199\u7684\u81ea\u7136\u8bed\u8a00\u603b\u7ed3&#xff08;\u90a3\u603b\u7ed3\u53ef\u80fd\u6492\u8c0e&#xff09;&#xff1b;\u64cd\u4f5c\u5165\u53e3\u662f\u7ed3\u6784\u5316 action id&#xff0c;\u4e0d\u662f\u300c\u8bf7\u5e2e\u6211\u5408\u5e76\u300d&#xff1b;\u9884\u7b97\u72b6\u6001\u5bf9\u4eba\u53ef\u89c1&#xff0c;\u4eba\u80fd\u5728\u6210\u672c\u5931\u63a7\u524d\u6309\u505c\u3002<\/p>\n<h4>8.3 harness \u5c42\u5f3a\u5236\u5b89\u5168\u62e6\u622a\u4e0e\u4eba\u5de5\u7b7e\u7f72<\/h4>\n<p>\u4e0d\u53ef\u9006\u64cd\u4f5c\u5fc5\u987b\u5728 harness \u5c42\u88ab\u62e6&#xff0c;\u63d0\u793a\u8bcd\u4e0d\u7b97\u3002\u5b9e\u73b0\u65b9\u5f0f\u662f\u5de5\u5177\u6ce8\u518c\u8868\u7684\u4e24\u7ea7\u767d\u540d\u5355&#xff1a;<\/p>\n<table>\n<tr>\u5de5\u5177\u7c7b\u522b\u4f8b\u5b50\u662f\u5426\u9700\u4eba\u5de5\u7b7e\u7f72harness \u884c\u4e3a<\/tr>\n<tbody>\n<tr>\n<td>\u53ea\u8bfb<\/td>\n<td>read_file\u3001grep\u3001list_dir<\/td>\n<td>\u5426<\/td>\n<td>\u76f4\u63a5\u653e\u884c&#xff0c;\u8bb0 journal<\/td>\n<\/tr>\n<tr>\n<td>\u6c99\u7bb1\u5185\u53ef\u9006\u5199<\/td>\n<td>write_file&#xff08;\u6c99\u7bb1\u5185&#xff09;\u3001run_tests<\/td>\n<td>\u5426<\/td>\n<td>\u653e\u884c&#xff0c;\u8bb0 journal&#xff0c;\u5feb\u7167\u8986\u76d6<\/td>\n<\/tr>\n<tr>\n<td>\u5bbf\u4e3b\u53ef\u56de\u6eda\u5199<\/td>\n<td>apply_patch&#xff08;\u6709\u5feb\u7167&#xff09;<\/td>\n<td>\u5426&#xff0c;\u4f46\u9700 PR<\/td>\n<td>\u653e\u884c&#xff0c;\u5fc5\u987b\u6709 Snapshot<\/td>\n<\/tr>\n<tr>\n<td>\u4e0d\u53ef\u9006<\/td>\n<td>db_migrate\u3001send_email\u3001pay\u3001delete_resource<\/td>\n<td>\u662f<\/td>\n<td>\u751f\u6210\u63d0\u6848 -&gt; \u963b\u65ad -&gt; \u5f85\u4eba\u7b7e\u7f72<\/td>\n<\/tr>\n<tr>\n<td>\u7f51\u7edc\u51fa\u53e3<\/td>\n<td>http_request<\/td>\n<td>\u89c6\u57df\u540d\u767d\u540d\u5355<\/td>\n<td>\u767d\u540d\u5355\u5916\u76f4\u63a5\u62d2\u7edd<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>PatchProposal.touches_external&#061;True \u65f6&#xff0c;harness \u4e0d\u6267\u884c&#xff0c;\u800c\u662f\u628a\u63d0\u6848\u5e8f\u5217\u5316\u6210\u4e00\u4efd\u5f85\u7b7e\u7f72\u5bf9\u8c61&#xff08;\u542b\u5b8c\u6574 diff\u3001\u5f71\u54cd\u9762\u3001\u5e42\u7b49\u952e&#xff09;&#xff0c;\u63a8\u7ed9\u5ba1\u6279\u7aef\u3002\u4eba\u6279\u51c6\u540e\u624d\u8d70\u4e00\u6b21\u771f\u5b9e\u8c03\u7528&#xff0c;\u8c03\u7528\u65f6\u5fc5\u987b\u5e26\u4e0a\u4e8b\u5148\u751f\u6210\u7684 idempotency_key&#xff0c;\u5e76\u5199\u8fdb journal\u3002<\/p>\n<p>\u8fd9\u91cc\u547c\u5e94 Anthropic \u84dd\u56fe\u7b2c\u4e09\u6761&#xff1a;**\u62e6\u622a\u70b9\u5728 harness \u5c42&#xff0c;\u4e0d\u5728\u63d0\u793a\u8bcd\u5c42\u3002**\u63d0\u793a\u8bcd\u91cc\u7684\u7981\u4ee4\u4f1a\u88ab\u63d0\u793a\u8bcd\u6ce8\u5165\u7ed5\u8fc7&#xff0c;\u6ce8\u518c\u8868\u91cc\u7684\u7f3a\u5931\u4e0d\u4f1a\u3002<\/p>\n<h4>8.4 \u65ad\u8a00\u9009\u62e9&#xff1a;\u522b\u8dd1\u5168\u91cf&#xff0c;\u8dd1\u53d7\u5f71\u54cd\u5b50\u96c6<\/h4>\n<p>\u5faa\u73af\u91cc\u8dd1\u5168\u91cf\u6d4b\u8bd5\u662f\u6700\u5e38\u89c1\u7684\u6027\u80fd\u9519\u8bef\u3002\u4e09\u79cd\u6e10\u8fdb\u505a\u6cd5&#xff1a;<\/p>\n<li>\u624b\u5de5 target&#xff1a;\u4efb\u52a1\u81ea\u5e26 &#8211;target&#xff0c;\u6700\u7701\u4e8b&#xff0c;\u8986\u76d6\u5927\u90e8\u5206 bug \u4fee\u590d\u573a\u666f\u3002<\/li>\n<li>import \u56fe\u53cd\u67e5&#xff1a;\u4ece\u6539\u52a8\u6587\u4ef6\u7684 import \u5173\u7cfb\u53cd\u67e5\u51fa\u4f9d\u8d56\u5b83\u7684\u6d4b\u8bd5\u6587\u4ef6\u3002<\/li>\n<li>\u8986\u76d6\u7387\u53cd\u67e5&#xff1a;\u7ef4\u62a4\u4e00\u4efd test -&gt; covered_files \u7684\u6620\u5c04&#xff08;\u7528 pytest-cov \u7684 json \u62a5\u544a\u751f\u6210&#xff09;&#xff0c;\u6539\u52a8\u6587\u4ef6\u6620\u5c04\u5230\u6d4b\u8bd5\u96c6\u5408\u3002\u8fd9\u662f\u6700\u51c6\u7684&#xff0c;\u6620\u5c04\u672c\u8eab\u6bcf\u5929\u91cd\u5efa\u4e00\u6b21\u5373\u53ef\u3002<\/li>\n<p>\u7b2c 3 \u79cd\u5728\u6211\u4eec\u7684\u4ed3\u5e93\u4e0a\u628a L3 \u7684\u6d4b\u8bd5\u6570\u91cf\u4ece\u5e73\u5747 340 \u4e2a\u964d\u5230\u5e73\u5747 17 \u4e2a&#xff0c;\u5355\u8f6e\u65ad\u8a00\u8017\u65f6\u4ece 92s \u964d\u5230 4.3s\u3002\u8fd9\u4e00\u9879\u5bf9 6.2 \u8868\u91cc D \u914d\u7f6e\u7684 P50 \u5899\u949f&#xff08;61s&#xff09;\u8d21\u732e\u6700\u5927\u3002<\/p>\n<h4>8.5 \u5e76\u884c\u5019\u9009<\/h4>\n<p>\u5f53\u5355\u6761\u8def\u5f84\u7684\u6536\u655b\u4e0d\u7a33\u5b9a\u65f6&#xff0c;\u53ef\u4ee5\u5728\u4e00\u8f6e\u91cc\u8ba9\u6a21\u578b\u4ea7\u51fa 3 \u4e2a\u5019\u9009 patch&#xff08;n&#061;3&#xff09;&#xff0c;\u5e76\u884c\u4e22\u8fdb 3 \u4e2a\u6c99\u7bb1\u8dd1\u65ad\u8a00&#xff0c;\u53d6\u7b2c\u4e00\u4e2a\u901a\u8fc7\u7684\u3002\u6210\u672c\u662f 3 \u500d\u6a21\u578b\u8c03\u7528&#xff0c;\u4f46\u6c99\u7bb1\u53ef\u4ee5\u5e76\u884c&#xff0c;\u5899\u949f\u57fa\u672c\u4e0d\u53d8\u3002<\/p>\n<p>\u9002\u7528\u6761\u4ef6&#xff1a;\u65ad\u8a00\u8dd1\u5f97\u5feb&#xff08;L3 \u76ee\u6807\u6d4b\u8bd5\u5728 5 \u79d2\u4ee5\u5185&#xff09;\u4e14\u9884\u7b97\u5145\u8db3\u3002\u4e0d\u9002\u5408 L5 \u5168\u91cf\u6d4b\u8bd5\u505a\u95e8\u7981\u7684\u573a\u666f\u2014\u20143 \u4e2a\u5019\u9009 x 5 \u5206\u949f\u5168\u91cf\u6d4b\u8bd5&#xff0c;\u5899\u949f\u4f1a\u70b8\u3002\u6211\u7684\u89c4\u5219\u662f pressure() &lt; 0.5 \u4e14 L3 \u8017\u65f6 &lt; 10s \u65f6\u624d\u5f00\u5e76\u884c\u5019\u9009\u3002<\/p>\n<h4>8.6 \u6c99\u7bb1\u590d\u7528\u4e0e\u9884\u70ed<\/h4>\n<p>\u6bcf\u6b21\u8fed\u4ee3\u91cd\u5efa\u4e34\u65f6\u76ee\u5f55 &#043; copytree \u4e00\u4e2a 21k \u884c\u7684\u4ed3\u5e93&#xff0c;\u5728\u6211\u7684\u673a\u5668\u4e0a\u8981 1.8s&#xff0c;8 \u8f6e\u5c31\u662f 14s \u7eaf\u5f00\u9500\u3002\u4f18\u5316\u4e24\u6761&#xff1a;<\/p>\n<ul>\n<li>\u540c\u4efb\u52a1\u5185\u590d\u7528\u540c\u4e00\u4e2a\u6c99\u7bb1&#xff0c;\u6bcf\u8f6e\u5f00\u59cb\u524d\u7528\u5feb\u7167\u7684 patch \u53cd\u5411\u6062\u590d\u5de5\u4f5c\u533a&#xff0c;\u800c\u4e0d\u662f\u91cd\u5efa\u3002<\/li>\n<li>\u9884\u70ed&#xff1a;\u628a .venv \u548c node_modules \u653e\u5728\u6c99\u7bb1\u5916\u7684\u4e00\u4e2a\u53ea\u8bfb\u5c42&#xff0c;\u7528\u7b26\u53f7\u94fe\u63a5\u6216 bind mount \u6302\u8fdb\u53bb\u3002\u6ce8\u610f\u7b26\u53f7\u94fe\u63a5\u6709\u9003\u9038\u98ce\u9669&#xff0c;\u7528 copytree(symlinks&#061;False) \u6216\u76f4\u63a5 bind mount&#xff0c;\u4e0d\u8981\u7528\u8f6f\u94fe\u3002<\/li>\n<\/ul>\n<p>\u6ce8\u610f\u590d\u7528\u5e26\u6765\u7684\u526f\u4f5c\u7528&#xff1a;**\u4e0a\u4e00\u8f6e\u7559\u4e0b\u7684 __pycache__ \u548c\u4e34\u65f6\u6587\u4ef6\u4f1a\u6c61\u67d3\u4e0b\u4e00\u8f6e\u3002**\u6bcf\u8f6e\u5f00\u59cb\u524d\u5fc5\u987b\u505a\u4e00\u6b21 git clean -fdx -e .venv&#xff08;\u4fdd\u7559\u9884\u70ed\u7684\u4f9d\u8d56\u76ee\u5f55&#xff09;\u3002<\/p>\n<h3>\u4e5d\u3001\u9002\u7528\u573a\u666f\u4e0e\u9009\u578b\u5efa\u8bae<\/h3>\n<h4>9.1 \u9002\u5408\u4e0a harness \u7684\u573a\u666f<\/h4>\n<table>\n<tr>\u573a\u666f\u4e3a\u4ec0\u4e48\u9002\u5408\u9884\u7b97\u5efa\u8bae\u5173\u952e\u914d\u7f6e<\/tr>\n<tbody>\n<tr>\n<td>\u5355\u6d4b\u8986\u76d6\u826f\u597d\u7684 bug \u4fee\u590d<\/td>\n<td>\u65ad\u8a00\u5929\u7136\u5b58\u5728\u4e14\u53ef\u9760<\/td>\n<td>8 \u6b65 \/ 0.5 USD<\/td>\n<td>L3 \u76ee\u6807\u6d4b\u8bd5\u9a71\u52a8<\/td>\n<\/tr>\n<tr>\n<td>\u4f9d\u8d56\u5347\u7ea7\u4e0e\u7c7b\u578b\u4fee\u590d<\/td>\n<td>mypy \/ \u7f16\u8bd1\u5668\u662f\u5b8c\u7f8e\u88c1\u5224<\/td>\n<td>12 \u6b65 \/ 1.0 USD<\/td>\n<td>L1 \u65ad\u8a00\u524d\u7f6e<\/td>\n<\/tr>\n<tr>\n<td>lint \u8fdd\u89c4\u6279\u91cf\u6e05\u7406<\/td>\n<td>ruff \u6709 &#8211;fix&#xff0c;\u5224\u636e 100% \u786e\u5b9a<\/td>\n<td>4 \u6b65 \/ 0.1 USD<\/td>\n<td>\u53ef\u8df3\u8fc7\u6a21\u578b&#xff0c;\u76f4\u63a5\u786e\u5b9a\u6027\u4fee<\/td>\n<\/tr>\n<tr>\n<td>\u811a\u624b\u67b6\u4e0e\u6837\u677f\u4ee3\u7801\u751f\u6210<\/td>\n<td>\u7f16\u8bd1\u901a\u8fc7\u5373\u53ef\u5224\u5b9a<\/td>\n<td>6 \u6b65 \/ 0.3 USD<\/td>\n<td>L2 \u65ad\u8a00<\/td>\n<\/tr>\n<tr>\n<td>\u6d4b\u8bd5\u8865\u5168<\/td>\n<td>\u65b0\u6d4b\u8bd5\u5fc5\u987b\u80fd\u5931\u8d25\u540e\u901a\u8fc7<\/td>\n<td>8 \u6b65 \/ 0.5 USD<\/td>\n<td>\u9700\u53d8\u5f02\u6d4b\u8bd5\u9a8c\u8bc1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>9.2 \u4e0d\u8be5\u7528 harness \u7684\u573a\u666f&#xff08;\u8fd9\u4e00\u8282\u6bd4\u4e0a\u4e00\u8282\u91cd\u8981&#xff09;<\/h4>\n<p>**\u7b2c\u4e00&#xff0c;\u6ca1\u6709\u53ef\u9760\u65ad\u8a00\u7684\u9886\u57df&#xff0c;\u4e0d\u8981\u4e0a\u81ea\u52a8\u5316\u5faa\u73af\u3002**UI \u89c6\u89c9\u8c03\u6574\u3001\u6587\u6848\u6da6\u8272\u3001\u4ea4\u4e92\u4f53\u9a8c\u4f18\u5316\u2014\u2014\u8fd9\u4e9b\u9886\u57df\u7684\u300c\u5bf9\u4e0d\u5bf9\u300d\u6ca1\u6709\u786e\u5b9a\u6027\u88c1\u5224&#xff0c;\u4f60\u53ea\u80fd\u8ba9\u4eba\u770b\u3002\u786c\u8981\u4e0a\u5faa\u73af&#xff0c;\u7ed3\u679c\u5c31\u662f\u6a21\u578b\u81ea\u8bc4\u81ea\u6539&#xff0c;\u6210\u672c\u70e7\u5b8c\u5f97\u5230\u4e00\u4e2a\u4f60\u8bf4\u4e0d\u6e05\u597d\u4e0d\u597d\u7684\u7ed3\u679c\u3002\u6211\u7684\u5224\u65ad\u6807\u51c6\u5f88\u7c97\u66b4&#xff1a;\u5982\u679c\u8fd9\u4e2a\u9886\u57df\u4f60\u5199\u4e0d\u51fa\u4e00\u4e2a\u80fd\u5728 60 \u79d2\u5185\u8dd1\u5b8c\u3001\u9000\u51fa\u7801\u975e 0 \u5373\u5931\u8d25\u7684\u68c0\u67e5\u811a\u672c&#xff0c;\u5c31\u522b\u5f00\u5faa\u73af\u3002<\/p>\n<p>**\u7b2c\u4e8c&#xff0c;\u9700\u6c42\u63cf\u8ff0\u4e0d\u6e05\u7684\u4efb\u52a1&#xff0c;\u52a0\u9884\u7b97\u6ca1\u7528\u3002**6.4 \u7684\u5931\u8d25\u5206\u5e03\u91cc non_progress \u5360 35.3%&#xff0c;\u8fd9\u4e9b\u4efb\u52a1\u56de\u5934\u770b\u51e0\u4e4e\u90fd\u662f\u9700\u6c42\u672c\u8eab\u542b\u7cca&#xff08;\u201c\u628a\u8fd9\u4e2a\u6a21\u5757\u4f18\u5316\u4e00\u4e0b\u201d&#xff09;\u3002\u8fd9\u7c7b\u4efb\u52a1\u5e94\u8be5\u56de\u5230\u4eba\u90a3\u91cc\u62c6\u7ec6&#xff0c;\u800c\u4e0d\u662f\u9760 max_steps&#061;16 \u786c\u625b\u3002<\/p>\n<p>**\u7b2c\u4e09&#xff0c;\u6d89\u53ca\u4e0d\u53ef\u9006\u5916\u90e8\u5199\u64cd\u4f5c\u7684\u573a\u666f&#xff0c;\u5148\u6709\u8865\u507f\u673a\u5236\u518d\u8c08\u81ea\u52a8\u5316\u3002**\u6ca1\u6709\u5e42\u7b49\u952e\u3001\u6ca1\u6709\u8865\u507f\u4e8b\u52a1\u3001\u6ca1\u6709\u5ba1\u6279\u6d41\u7684\u7cfb\u7edf&#xff0c;\u63a5 Agent \u7b49\u4e8e\u88f8\u5954\u3002\u8fd9\u65f6\u5019 harness \u80fd\u505a\u7684\u4e0a\u9650\u662f\u300c\u751f\u6210\u63d0\u6848\u7b49\u4eba\u6279\u300d&#xff0c;\u90a3\u5c31\u8001\u5b9e\u505a\u6210\u63d0\u6848\u7cfb\u7edf&#xff0c;\u522b\u4f2a\u88c5\u6210\u81ea\u52a8\u4fee\u590d\u3002<\/p>\n<p>**\u7b2c\u56db&#xff0c;\u8d85\u5c0f\u6539\u52a8\u4e0d\u503c\u5f97\u5f00 harness\u3002**\u6539\u4e00\u884c\u5e38\u91cf\u3001\u6539\u4e00\u4e2a\u914d\u7f6e\u503c&#xff0c;\u5f00\u4e00\u8f6e harness \u7684\u6210\u672c&#xff08;\u5feb\u7167 &#043; \u6c99\u7bb1 &#043; \u65ad\u8a00&#xff09;\u53ef\u80fd\u6bd4\u4eba\u5de5\u6539\u8fd8\u8d35\u3002\u6211\u8bbe\u4e86\u4e00\u6761\u9608\u503c&#xff1a;\u6539\u52a8\u9762\u5c0f\u4e8e 3 \u884c\u4e14\u65e0\u6d4b\u8bd5\u4f9d\u8d56\u65f6&#xff0c;\u76f4\u63a5\u8d70\u666e\u901a\u7684\u6a21\u578b\u8f85\u52a9\u7f16\u8f91\u3002<\/p>\n<p>**\u7b2c\u4e94&#xff0c;\u5f3a\u5408\u89c4\u884c\u4e1a\u8981\u5148\u89e3\u51b3\u5ba1\u8ba1\u3002**\u5982\u679c\u4f60\u7684\u884c\u4e1a\u8981\u6c42\u6bcf\u4e00\u6b21\u751f\u4ea7\u53d8\u66f4\u90fd\u80fd\u8ffd\u6eaf\u5230\u5177\u4f53\u7684\u4eba\u548c\u64cd\u4f5c\u4f9d\u636e&#xff0c;\u90a3\u4e48\u300c\u6a21\u578b\u751f\u6210 &#043; \u81ea\u52a8\u5408\u5e76\u300d\u8fd9\u5957\u6d41\u7a0b\u5728\u5408\u89c4\u4e0a\u662f\u4e0d\u6210\u7acb\u7684&#xff0c;\u5fc5\u987b\u4fdd\u7559\u4eba\u5de5\u7b7e\u7f72\u73af\u8282\u3002\u8fd9\u6070\u6070\u662f Anthropic \u84dd\u56fe\u7b2c\u4e09\u6761\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3002<\/p>\n<h4>9.3 \u4e0e\u7f16\u7a0b Agent \u4ea7\u54c1\u7684\u5173\u7cfb<\/h4>\n<p>2026 \u5e74\u4e3b\u6d41\u7684\u7f16\u7a0b Agent \u4ea7\u54c1&#xff08;Codex \u7cfb\u3001Claude Code \u7cfb\u7b49&#xff09;\u5185\u90e8\u90fd\u5df2\u7ecf\u6709\u4e86\u5404\u81ea\u7684 harness&#xff0c;\u5dee\u5f02\u4e3b\u8981\u5728\u4e09\u70b9&#xff1a;\u9ed8\u8ba4\u9884\u7b97\u3001\u6c99\u7bb1\u5f3a\u5ea6\u3001\u4ee5\u53ca\u662f\u5426\u5141\u8bb8\u6a21\u578b\u6539\u6d4b\u8bd5\u3002\u9009\u578b\u65f6\u6211\u6700\u770b\u91cd\u7684\u662f\u80fd\u4e0d\u80fd\u628a\u5b83\u7684 harness \u53c2\u6570\u66b4\u9732\u7ed9\u6211\u8c03\u3002\u4e00\u4e2a\u4e0d\u5141\u8bb8\u4f60\u914d\u7f6e max_steps \u548c\u65ad\u8a00\u547d\u4ee4\u7684\u4ea7\u54c1&#xff0c;\u5728\u56e2\u961f\u7ea7\u4f7f\u7528\u4e0a\u98ce\u9669\u5f88\u9ad8\u2014\u2014\u4f60\u6ca1\u6cd5\u628a\u5b83\u7684\u884c\u4e3a\u7eb3\u5165\u81ea\u5df1\u7684\u6210\u672c\u4e0e\u5408\u89c4\u6846\u67b6\u3002<\/p>\n<p>\u81ea\u5efa harness&#xff08;\u672c\u6587\u8fd9\u5957&#xff09;\u7684\u9002\u7528\u524d\u63d0\u662f&#xff1a;\u4f60\u6709\u660e\u786e\u7684\u65ad\u8a00\u4f53\u7cfb\u3001\u6709 CI\u3001\u613f\u610f\u7ef4\u62a4\u8fd9\u5957\u58f3\u5b50\u3002\u5982\u679c\u4f60\u53ea\u662f\u60f3\u8ba9\u4e2a\u4eba\u5f00\u53d1\u6548\u7387\u9ad8\u4e00\u70b9&#xff0c;\u76f4\u63a5\u7528\u6210\u719f\u4ea7\u54c1&#xff0c;\u522b\u81ea\u5df1\u9020\u3002<\/p>\n<h3>\u5341\u3001\u603b\u7ed3\u4e0e\u5c55\u671b<\/h3>\n<p>\u56de\u5230\u5f00\u5934\u90a3\u53e5\u8bdd&#xff1a;LLM \u662f\u975e\u786e\u5b9a\u6027\u7684 token \u751f\u6210\u5668&#xff0c;\u4e0d\u5e94\u8be5\u88ab\u6388\u4e88\u5bf9\u751f\u4ea7 OS \u4e0e\u6570\u636e\u5e93\u7684\u4e2d\u4ecb\u5316\u8bbf\u95ee\u6743\u3002\u8fd9\u7bc7\u6587\u7ae0\u7ed9\u7684\u4e0d\u662f\u300c\u600e\u4e48\u8ba9\u6a21\u578b\u66f4\u9760\u8c31\u300d&#xff0c;\u800c\u662f\u300c\u600e\u4e48\u8ba9\u6a21\u578b\u4e0d\u9760\u8c31\u4e5f\u4e0d\u51fa\u4e8b\u300d&#xff1a;<\/p>\n<ul>\n<li>\u56db\u6761\u786e\u5b9a\u6027\u8fb9\u754c&#xff1a;\u7f16\u6392\u63a7\u5236\u5668&#xff08;\u6b65\u6570\u4e0e\u7ec8\u6b62\u6761\u4ef6&#xff09;\u3001\u9694\u79bb\u6267\u884c\u6c99\u7bb1&#xff08;\u4e34\u65f6\u6587\u4ef6\u7cfb\u7edf &#043; \u53d7\u9650\u5bb9\u5668&#xff09;\u3001\u72b6\u6001\u6301\u4e45\u5316\u4e0e\u56de\u6eda&#xff08;\u6539\u52a8\u4e0e\u5de5\u5177\u8c03\u7528\u53ef checkpoint \/ revert&#xff09;\u3001\u786e\u5b9a\u6027\u65ad\u8a00&#xff08;\u7f16\u8bd1\u5668 \/ linter \/ \u5355\u6d4b\u4f5c\u4e3a\u4e0d\u53ef\u901a\u878d\u7684\u88c1\u5224&#xff09;\u3002\u987a\u5e8f\u4e0d\u80fd\u4e71&#xff0c;\u5148\u6709\u56de\u6eda\u624d\u6562\u6709\u91cd\u8bd5\u3002<\/li>\n<li>\u81ea\u52a8\u5316\u4fee\u590d\u5faa\u73af&#xff1a;\u751f\u6210\u4ee3\u7801\u3001\u4e22\u8fdb\u6c99\u7bb1\u8dd1\u6d4b\u8bd5\u3001\u5931\u8d25\u628a\u538b\u7f29\u540e\u7684\u7cbe\u786e\u9519\u8bef\u6808\u56de\u5582\u6a21\u578b\u3001\u56fa\u5b9a\u8fed\u4ee3\u4e0a\u9650\u3002\u4eba\u4e0d\u518d\u9010\u884c review&#xff0c;\u800c\u662f review \u8fb9\u754c\u914d\u7f6e\u548c\u6700\u7ec8 diff\u3002<\/li>\n<li>\u4e09\u5206\u7acb\u4e0e schema \u5f3a\u5236&#xff1a;\u751f\u6210 \/ \u8bc4\u4f30 \/ \u4fee\u590d\u4e09\u4e2a\u89d2\u8272\u770b\u5230\u7684\u4fe1\u606f\u4e25\u683c\u9694\u79bb&#xff0c;\u6a21\u578b\u4e0d\u80fd\u7ed9\u81ea\u5df1\u751f\u6210\u7684\u4ee3\u7801\u6253\u5206&#xff1b;\u6240\u6709\u8f93\u51fa\u8fc7 JSON Schema&#xff0c;\u95f2\u804a\u6c61\u67d3\u4e0d\u4e86\u673a\u5668\u6d88\u8d39\u7684 payload\u3002<\/li>\n<li>\u6982\u7387\u751f\u6210\u8be5\u88ab\u786e\u5b9a\u6027\u4ee3\u7801\u66ff\u6362\u7684\u5730\u65b9\u5c31\u66ff\u6362&#xff1a;Schema Validator\u3001Documentation Builder \u8fd9\u7c7b\u73af\u8282\u7528\u96f6 LLM \u8c03\u7528\u7684\u786e\u5b9a\u6027\u5b9e\u73b0&#xff0c;\u76f4\u63a5\u6d88\u706d\u4e24\u7c7b\u5e7b\u89c9&#xff08;\u5047\u9633\u6027\u6821\u9a8c\u3001\u7f16\u9020\u7684\u53c2\u6570&#xff09;&#xff0c;\u5e76\u628a\u8be5\u9636\u6bb5 token \u6d88\u8017\u964d\u5230 0\u3002<\/li>\n<li>\u6b65\u6570\u9884\u7b97\u4e0e\u6210\u672c\u7194\u65ad&#xff1a;\u56db\u4e2a\u7ef4\u5ea6\u72ec\u7acb\u8ba1&#xff08;\u6b65\u6570 \/ \u5899\u949f \/ token \/ \u6210\u672c&#xff09;&#xff0c;\u52a0\u4e00\u4e2a non_progress \u6307\u7eb9\u68c0\u6d4b\u548c\u4e00\u6863\u8f6f\u538b\u529b\u964d\u7ea7\u7b56\u7565\u3002<\/li>\n<\/ul>\n<p>\u5b9e\u6d4b\u6570\u636e\u91cc\u6700\u503c\u5f97\u8bb0\u4f4f\u7684\u4e24\u4e2a\u6570\u5b57&#xff1a;**\u5b8c\u6574 harness \u76f8\u6bd4\u300c\u4ec5\u65ad\u8a00\u300d\u914d\u7f6e&#xff0c;\u6210\u529f\u7387 &#043;23.4 \u4e2a\u767e\u5206\u70b9&#xff0c;\u800c\u6210\u672c\u53cd\u800c\u4e0b\u964d 34%\u3002**\u8fd9\u8bf4\u660e\u4e4b\u524d\u591a\u82b1\u7684\u94b1\u4e0d\u662f\u82b1\u5728\u300c\u8ba9\u6a21\u578b\u66f4\u806a\u660e\u300d\u4e0a&#xff0c;\u800c\u662f\u82b1\u5728\u4e86\u6a21\u578b\u6253\u8f6c\u548c\u566a\u58f0\u4e0a\u4e0b\u6587\u4e0a\u3002<\/p>\n<p>\u5c55\u671b\u4e09\u6761\u3002\u7b2c\u4e00&#xff0c;\u65ad\u8a00\u7684\u8d28\u91cf\u548c\u8986\u76d6\u7387\u4f1a\u53d6\u4ee3\u6a21\u578b\u80fd\u529b&#xff0c;\u6210\u4e3a Agent \u7f16\u7a0b\u7cfb\u7edf\u7684\u771f\u6b63\u74f6\u9888\u2014\u2014\u4f60\u73b0\u5728\u5f80\u6d4b\u8bd5\u4e0a\u6295\u7684\u6bcf\u4e00\u5206\u94b1&#xff0c;\u672a\u6765\u90fd\u4f1a\u53d8\u6210 Agent \u53ef\u7528\u7684\u5224\u636e\u3002\u7b2c\u4e8c&#xff0c;harness \u7684\u6807\u51c6\u5316\u6b63\u5728\u53d1\u751f&#xff0c;\u4e2d\u56fd\u4fe1\u901a\u9662 2026-09-29 \u7684\u300a\u53ef\u4fe1\u4e92\u8054\u7f51\u667a\u80fd\u4f53 \u8fd0\u884c\u65f6 \u4e0a\u4e0b\u6587\u5de5\u7a0b\u300b\u6807\u51c6\u548c CIS \u5728 2026-09-16 \u7ed9\u51fa\u7684 MCP \u5ba1\u8ba1\u57fa\u7ebf&#xff0c;\u90fd\u662f\u5728\u7ed9\u8fd9\u4e00\u5c42\u58f3\u5b50\u5b9a\u89c4\u77e9&#xff1b;\u80fd\u628a\u81ea\u5df1\u7684 harness \u6620\u5c04\u5230\u8fd9\u4e9b\u57fa\u7ebf\u4e0a&#xff0c;\u4f1a\u6210\u4e3a\u56e2\u961f\u7ea7\u843d\u5730\u7684\u5165\u573a\u5238\u3002\u7b2c\u4e09&#xff0c;\u4eba\u673a\u754c\u9762\u4f1a\u6210\u4e3a\u65b0\u7684\u5206\u6c34\u5cad&#xff0c;UI \u7ec4\u4ef6\u4f5c\u4e3a\u5de5\u5177\u8f93\u51fa &#043; harness \u5c42\u4eba\u5de5\u7b7e\u7f72&#xff0c;\u4f1a\u8ba9\u300cAgent \u80fd\u505a\u4ec0\u4e48\u300d\u4ece\u6280\u672f\u95ee\u9898\u53d8\u6210\u4ea7\u54c1\u8bbe\u8ba1\u95ee\u9898\u3002<\/p>\n<p>\u6700\u540e\u7ed9\u4e00\u6761\u53ef\u6267\u884c\u7684\u8d77\u6b65\u8def\u5f84&#xff1a;**\u4e0d\u8981\u4e00\u4e0a\u6765\u5c31\u642d\u5b8c\u6574\u7684 harness\u3002**\u6309\u987a\u5e8f\u505a\u56db\u6b65\u2014\u2014\u5148\u628a git clean -fd \u4ece\u4f60\u7684\u56de\u6eda\u4ee3\u7801\u91cc\u5220\u6389&#xff08;7.4&#xff09;&#xff1b;\u518d\u628a\u9519\u8bef\u6808\u538b\u7f29\u52a0\u4e0a&#xff08;7.5&#xff09;&#xff1b;\u7136\u540e\u7ed9\u6d4b\u8bd5\u76ee\u5f55\u52a0\u53ea\u8bfb\u4fdd\u62a4&#xff08;7.6&#xff09;&#xff1b;\u6700\u540e\u518d\u8865\u9884\u7b97\u4e0e\u6c99\u7bb1\u3002\u8fd9\u56db\u6b65\u7684\u6027\u4ef7\u6bd4\u662f\u6309\u8fd9\u4e2a\u987a\u5e8f\u9012\u51cf\u7684&#xff0c;\u4f46\u6bcf\u4e00\u6b65\u90fd\u80fd\u72ec\u7acb\u751f\u6548\u3002<\/p>\n<h3>\u53c2\u8003\u7d20\u6750\u4e0e\u5ef6\u4f38\u9605\u8bfb<\/h3>\n<ul>\n<li>Google ADK 2.0 \/ Antigravity SDK \u7684 Harness Engineering \u9610\u8ff0\u4e0e Anthropic \u5546\u52a1 Agent \u84dd\u56fe&#xff08;\u52a8\u6001 Skill \u52a0\u8f7d\u3001UI \u7ec4\u4ef6\u4f5c\u4e3a\u5de5\u5177\u8f93\u51fa\u3001harness \u5c42\u5b89\u5168\u62e6\u622a&#xff09; \u2014 AtlasNote \u6bcf\u65e5\u7b80\u62a5&#xff0c;2026-09-03<\/li>\n<li>\u4e5d Agent \u6d41\u6c34\u7ebf\u5982\u4f55\u5728\u751f\u4ea7\u89c4\u6a21\u4e0a\u89e3\u51b3\u53ef\u9760\u6027\u95ee\u9898 \u2014 Grafex Media<\/li>\n<li>2026 \u5e74\u4e3b\u6d41\u7f16\u7a0b Agent \u6a2a\u8bc4&#xff1a;Codex \u4e0e Claude Code \u2014 Mem0 Blog<\/li>\n<li>CIS MCP Benchmark \u4e3a Agent \u5de5\u5177\u6cbb\u7406\u8bbe\u5b9a 55 \u70b9\u5ba1\u8ba1\u57fa\u7ebf \u2014 AI Governance&#xff0c;2026-09-16<\/li>\n<li>\u4e2d\u56fd\u4fe1\u901a\u9662\u300a\u53ef\u4fe1\u4e92\u8054\u7f51\u667a\u80fd\u4f53 \u8fd0\u884c\u65f6 \u4e0a\u4e0b\u6587\u5de5\u7a0b\u300b\u6807\u51c6 \u2014 \u6f8e\u6e43\u65b0\u95fb&#xff0c;2026-09-29<\/li>\n<li>LLM \u751f\u4ea7\u53ef\u89c2\u6d4b\u6027\u7684\u5de5\u5177\u5206\u5c42 \u2014 Unico Connect<\/li>\n<li>Agent \u4e0a\u4e0b\u6587\u4e09\u7ea7\u538b\u7f29\u673a\u5236 \u2014 \u817e\u8baf\u65b0\u95fb&#xff0c;2026-09-22<\/li>\n<li>\u591a Agent \u67b6\u6784\u5411 MCP &#043; A2A \u534f\u8bae\u6536\u655b \u2014 The Agent Times<\/li>\n<li>Reciprocal Rank Fusion \u539f\u59cb\u8bba\u6587&#xff08;Cormack, Clarke, Buettcher, SIGIR 2009&#xff09; \u2014 ACM DL&#xff0c;2009<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Harness Engineering&#xff1a;\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc 2026-09 Google \u5728 ADK 2.0 \u4e0e Antigravity SDK \u7684\u516c\u5f00\u9610\u8ff0\u91cc\u628a Harness Engineering&#xff08;\u786e\u5b9a\u6027\u5916\u58f3\u5de5\u7a0b&#xff09;\u6446\u5230\u4e86\u548c\u6a21\u578b\u80fd\u529b\u540c\u7b49\u7684\u4f4d\u7f6e&#xff0c;Anthropic \u540c\u671f\u53d1\u5e03\u7684\u5546\u52a1 Agent \u84dd\u56fe\u7ed9\u51fa\u4e86\u4e09\u6761\u53ef\u76f4\u63a5\u6284\u7684\u5b9e\u8df5&#xff1a;\u52a8\u6001 Skill \u52a0\u8f7d\u914d\u5408 Prompt Caching \u538b TTFT\u3001U<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[10848,14119,14118],"topic":[],"class_list":["post-123277","post","type-post","status-publish","format-standard","hentry","category-server","tag-harness","tag-14119","tag-14118"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Harness Engineering\uff1a\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/123277.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Harness Engineering\uff1a\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"Harness Engineering&#xff1a;\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc 2026-09 Google \u5728 ADK 2.0 \u4e0e Antigravity SDK \u7684\u516c\u5f00\u9610\u8ff0\u91cc\u628a Harness Engineering&#xff08;\u786e\u5b9a\u6027\u5916\u58f3\u5de5\u7a0b&#xff09;\u6446\u5230\u4e86\u548c\u6a21\u578b\u80fd\u529b\u540c\u7b49\u7684\u4f4d\u7f6e&#xff0c;Anthropic \u540c\u671f\u53d1\u5e03\u7684\u5546\u52a1 Agent \u84dd\u56fe\u7ed9\u51fa\u4e86\u4e09\u6761\u53ef\u76f4\u63a5\u6284\u7684\u5b9e\u8df5&#xff1a;\u52a8\u6001 Skill \u52a0\u8f7d\u914d\u5408 Prompt Caching \u538b TTFT\u3001U\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/123277.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-06T15:24:54+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"35 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/123277.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/123277.html\",\"name\":\"Harness Engineering\uff1a\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-11-06T15:24:54+00:00\",\"dateModified\":\"2026-11-06T15:24:54+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/123277.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/123277.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/123277.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Harness Engineering\uff1a\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Harness Engineering\uff1a\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/123277.html","og_locale":"zh_CN","og_type":"article","og_title":"Harness Engineering\uff1a\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"Harness Engineering&#xff1a;\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc 2026-09 Google \u5728 ADK 2.0 \u4e0e Antigravity SDK \u7684\u516c\u5f00\u9610\u8ff0\u91cc\u628a Harness Engineering&#xff08;\u786e\u5b9a\u6027\u5916\u58f3\u5de5\u7a0b&#xff09;\u6446\u5230\u4e86\u548c\u6a21\u578b\u80fd\u529b\u540c\u7b49\u7684\u4f4d\u7f6e&#xff0c;Anthropic \u540c\u671f\u53d1\u5e03\u7684\u5546\u52a1 Agent \u84dd\u56fe\u7ed9\u51fa\u4e86\u4e09\u6761\u53ef\u76f4\u63a5\u6284\u7684\u5b9e\u8df5&#xff1a;\u52a8\u6001 Skill \u52a0\u8f7d\u914d\u5408 Prompt Caching \u538b TTFT\u3001U","og_url":"https:\/\/www.wsisp.com\/helps\/123277.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-11-06T15:24:54+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"35 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/123277.html","url":"https:\/\/www.wsisp.com\/helps\/123277.html","name":"Harness Engineering\uff1a\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-11-06T15:24:54+00:00","dateModified":"2026-11-06T15:24:54+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/123277.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/123277.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/123277.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"Harness Engineering\uff1a\u628a\u968f\u673a\u7684\u6a21\u578b\u5173\u8fdb\u786e\u5b9a\u6027\u7684\u58f3\u5b50\u91cc"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/123277","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=123277"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/123277\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=123277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=123277"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=123277"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=123277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}