{"id":110319,"date":"2026-09-26T15:41:22","date_gmt":"2026-09-26T07:41:22","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/110319.html"},"modified":"2026-09-26T15:41:22","modified_gmt":"2026-09-26T07:41:22","slug":"%e3%80%90hermes-agent%e3%80%91hermes-agent-%e5%ad%90%e4%bb%a3%e7%90%86%e5%a7%94%e6%b4%be%e6%b5%81%e7%a8%8b%e8%b6%85%e6%b7%b1%e5%ba%a6%e5%88%86%e6%9e%90%e4%b9%8b%e4%ba%8c","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/110319.html","title":{"rendered":"\u3010hermes-agent\u3011Hermes Agent \u5b50\u4ee3\u7406\u59d4\u6d3e\u6d41\u7a0b\u8d85\u6df1\u5ea6\u5206\u6790\u4e4b\u4e8c"},"content":{"rendered":"<h3>10. \u5fc3\u8df3\u76d1\u63a7\u7cfb\u7edf _Heartbeat<\/h3>\n<h4>10.1 \u8bbe\u8ba1\u539f\u7406<\/h4>\n<p>#mermaid-svg-cTO2GHoGNsGriCif{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cTO2GHoGNsGriCif .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cTO2GHoGNsGriCif .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cTO2GHoGNsGriCif .error-icon{fill:#552222;}#mermaid-svg-cTO2GHoGNsGriCif .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cTO2GHoGNsGriCif .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cTO2GHoGNsGriCif .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cTO2GHoGNsGriCif .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cTO2GHoGNsGriCif .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cTO2GHoGNsGriCif .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cTO2GHoGNsGriCif .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cTO2GHoGNsGriCif .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cTO2GHoGNsGriCif .marker.cross{stroke:#333333;}#mermaid-svg-cTO2GHoGNsGriCif svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cTO2GHoGNsGriCif p{margin:0;}#mermaid-svg-cTO2GHoGNsGriCif .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-cTO2GHoGNsGriCif .cluster-label text{fill:#333;}#mermaid-svg-cTO2GHoGNsGriCif .cluster-label span{color:#333;}#mermaid-svg-cTO2GHoGNsGriCif .cluster-label span p{background-color:transparent;}#mermaid-svg-cTO2GHoGNsGriCif .label text,#mermaid-svg-cTO2GHoGNsGriCif span{fill:#333;color:#333;}#mermaid-svg-cTO2GHoGNsGriCif .node rect,#mermaid-svg-cTO2GHoGNsGriCif .node circle,#mermaid-svg-cTO2GHoGNsGriCif .node ellipse,#mermaid-svg-cTO2GHoGNsGriCif .node polygon,#mermaid-svg-cTO2GHoGNsGriCif .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cTO2GHoGNsGriCif .rough-node .label text,#mermaid-svg-cTO2GHoGNsGriCif .node .label text,#mermaid-svg-cTO2GHoGNsGriCif .image-shape .label,#mermaid-svg-cTO2GHoGNsGriCif .icon-shape .label{text-anchor:middle;}#mermaid-svg-cTO2GHoGNsGriCif .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cTO2GHoGNsGriCif .rough-node .label,#mermaid-svg-cTO2GHoGNsGriCif .node .label,#mermaid-svg-cTO2GHoGNsGriCif .image-shape .label,#mermaid-svg-cTO2GHoGNsGriCif .icon-shape .label{text-align:center;}#mermaid-svg-cTO2GHoGNsGriCif .node.clickable{cursor:pointer;}#mermaid-svg-cTO2GHoGNsGriCif .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cTO2GHoGNsGriCif .arrowheadPath{fill:#333333;}#mermaid-svg-cTO2GHoGNsGriCif .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cTO2GHoGNsGriCif .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cTO2GHoGNsGriCif .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cTO2GHoGNsGriCif .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cTO2GHoGNsGriCif .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cTO2GHoGNsGriCif .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cTO2GHoGNsGriCif .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cTO2GHoGNsGriCif .cluster text{fill:#333;}#mermaid-svg-cTO2GHoGNsGriCif .cluster span{color:#333;}#mermaid-svg-cTO2GHoGNsGriCif div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cTO2GHoGNsGriCif .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cTO2GHoGNsGriCif rect.text{fill:none;stroke-width:0;}#mermaid-svg-cTO2GHoGNsGriCif .icon-shape,#mermaid-svg-cTO2GHoGNsGriCif .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cTO2GHoGNsGriCif .icon-shape p,#mermaid-svg-cTO2GHoGNsGriCif .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cTO2GHoGNsGriCif .icon-shape rect,#mermaid-svg-cTO2GHoGNsGriCif .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cTO2GHoGNsGriCif .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cTO2GHoGNsGriCif .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cTO2GHoGNsGriCif :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f(\u6709\u8fdb\u5c55)<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426(\u65e0\u8fdb\u5c55)<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f (idle&gt;&#061;15cycles&#061;450sin_tool&gt;&#061;40cycles&#061;1200s)<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>_Heartbeat(child, parent, idx)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>last_seen &#061; {iter:0, tool:None, ts:None, stale:0}<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>start()<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>schedule(self.tick, _HEARTBEAT_INTERVAL&#061;30s)\u901a\u8fc7periodic_schedulerNOT one daemon thread per child<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>tick() \u6bcf30\u79d2<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>child.get_activity_summary()\u83b7\u53d6(iter, tool, activity_ts)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>iter\u53d8\u4e86 ORtool\u53d8\u4e86 ORactivity_ts\u63a8\u8fdb?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>last_seen.update(iter, tool, stale&#061;0)\u66f4\u65b0ts<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>last_seen.stale &#043;&#061; 1<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>touch(desc)\u5237\u65b0parent._last_activity_ts\u9632\u6b62gateway\u4e0d\u6d3b\u52a8\u8d85\u65f6<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>stale &gt;&#061; \u9608\u503c?<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>return False\u505c\u6b62\u5fc3\u8df3\u8ba9gateway\u8d85\u65f6\u89e6\u53d1<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>return None\u7ee7\u7eed\u4e0b\u4e00\u5468\u671f<\/p>\n<p><\/span><\/p>\n<h4>10.2 \u505c\u6ede\u68c0\u6d4b\u9608\u503c<\/h4>\n<table>\n<tr>\u72b6\u6001\u9608\u503c\u5b9e\u9645\u65f6\u95f4\u539f\u56e0<\/tr>\n<tbody>\n<tr>\n<td>idle (\u65e0tool)<\/td>\n<td>15 cycles<\/td>\n<td>450\u79d2 (7.5\u5206\u949f)<\/td>\n<td>tight&#xff1a;\u771f\u6b63wedged\u7684child\u4e0d\u5e94\u63a9\u76d6gateway\u8d85\u65f6<\/td>\n<\/tr>\n<tr>\n<td>in-tool (\u6709tool)<\/td>\n<td>40 cycles<\/td>\n<td>1200\u79d2 (20\u5206\u949f)<\/td>\n<td>\u9ad8&#xff1a;\u5408\u6cd5\u7684\u957f\u5de5\u5177\u9700\u8981\u65f6\u95f4\u5b8c\u6210<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fdb\u5ea6\u5b9a\u4e49&#xff08;\u4e09\u9009\u4e00\u5373\u89c6\u4e3a\u6709\u8fdb\u5c55&#xff09;&#xff1a;<\/p>\n<li>api_call_count\u589e\u52a0&#xff08;\u65b0API\u8c03\u7528&#xff09;<\/li>\n<li>current_tool\u53d8\u5316&#xff08;\u5de5\u5177\u5207\u6362&#xff09;<\/li>\n<li>last_activity_ts\u63a8\u8fdb&#xff08;\u6d41\u5f0fchunk\/\u5de5\u5177\u8f6c\u6362\/API\u8c03\u7528\u5f00\u59cb\/\u5b8c\u6210&#xff09;<\/li>\n<p>last_activity_ts\u5728\u6162\u6a21\u578b\u7b49\u5f85\u65f6\u4e5f\u4f1a\u5237\u65b0&#xff08;direct_api_call\u5fc3\u8df3&#xff09;&#xff0c;\u6240\u4ee5\u6162\u6a21\u578b\u4e0d\u4f1a\u5728idle\u9608\u503c\u770b\u8d77\u6765\u505c\u6ede\u3002<\/p>\n<h4>10.3 \u5173\u952e\u8bbe\u8ba1&#xff1a;\u5171\u4eabperiodic_scheduler<\/h4>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">start<\/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 keyword\">from<\/span> agent<span class=\"token punctuation\">.<\/span>periodic_scheduler <span class=\"token keyword\">import<\/span> schedule<br \/>\n    <span class=\"token keyword\">from<\/span> tools<span class=\"token punctuation\">.<\/span>delegate_tool <span class=\"token keyword\">import<\/span> _HEARTBEAT_INTERVAL<br \/>\n    self<span class=\"token punctuation\">.<\/span>handle <span class=\"token operator\">&#061;<\/span> schedule<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>tick<span class=\"token punctuation\">,<\/span> _HEARTBEAT_INTERVAL<span class=\"token punctuation\">)<\/span><\/p>\n<ul>\n<li>\u4e0d\u662f\u6bcf\u4e2achild\u4e00\u4e2adaemon thread&#xff1a;\u6240\u6709\u5fc3\u8df3\u901a\u8fc7\u5171\u4eab\u7684agent.periodic_scheduler\u8c03\u5ea6<\/li>\n<li>\u9996\u6b21schedule\u5931\u8d25&#xff08;OS\u7ebf\u7a0b\u8017\u5c3d&#xff09;\u2192handle\u4e3aNone\u2192stop()\u662fno-op<\/li>\n<li>stop()\u8c03\u7528handle.cancel(wait&#061;5)&#xff0c;\u955c\u50cf\u65e7thread join&#xff1a;\u4e00\u4e2ain-flight tick\u5b8c\u6210<\/li>\n<\/ul>\n<hr \/>\n<h3>11. \u7ed3\u679c\u6784\u5efa\u4e0e\u6458\u8981\u9884\u7b97<\/h3>\n<h4>11.1 _finalize_child_results() \u5b8c\u6574\u7ec8\u7ed3\u5316<\/h4>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">_finalize_child_results<\/span><span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">,<\/span> task_list<span class=\"token punctuation\">,<\/span> children<span class=\"token punctuation\">,<\/span> parent_agent<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> _parent_finalization_lock<span class=\"token punctuation\">(<\/span>parent_agent<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>  <span class=\"token comment\"># per-parent\u9501\u5e8f\u5217\u5316\u751f\u547d\u5468\u671f\u526f\u4f5c\u7528<\/span><br \/>\n        _apply_summary_budget<span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">,<\/span> parent_agent<span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># 1. \u6458\u8981\u9884\u7b97<\/span><br \/>\n        child_by_index <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span>index<span class=\"token punctuation\">:<\/span> child <span class=\"token keyword\">for<\/span> index<span class=\"token punctuation\">,<\/span> _task<span class=\"token punctuation\">,<\/span> child <span class=\"token keyword\">in<\/span> children<span class=\"token punctuation\">}<\/span><br \/>\n        _notify_memory_manager<span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">,<\/span> task_list<span class=\"token punctuation\">,<\/span> child_by_index<span class=\"token punctuation\">,<\/span> parent_agent<span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># 2. \u8bb0\u5fc6\u901a\u77e5<\/span><br \/>\n        children_cost_total <span class=\"token operator\">&#061;<\/span> _fire_subagent_stop_hooks<span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">,<\/span> child_by_index<span class=\"token punctuation\">,<\/span> parent_agent<span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># 3. \u94a9\u5b50&#043;\u6210\u672c\u5f39\u51fa<\/span><br \/>\n        _rollup_children_cost<span class=\"token punctuation\">(<\/span>parent_agent<span class=\"token punctuation\">,<\/span> children_cost_total<span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># 4. \u6210\u672c\u6c47\u603b<\/span><\/p>\n<h4>11.2 \u6458\u8981\u9884\u7b97\u7b97\u6cd5<\/h4>\n<p>#mermaid-svg-NVDk3vx8AatbfWOU{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NVDk3vx8AatbfWOU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NVDk3vx8AatbfWOU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NVDk3vx8AatbfWOU .error-icon{fill:#552222;}#mermaid-svg-NVDk3vx8AatbfWOU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NVDk3vx8AatbfWOU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NVDk3vx8AatbfWOU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NVDk3vx8AatbfWOU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NVDk3vx8AatbfWOU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NVDk3vx8AatbfWOU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NVDk3vx8AatbfWOU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NVDk3vx8AatbfWOU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NVDk3vx8AatbfWOU .marker.cross{stroke:#333333;}#mermaid-svg-NVDk3vx8AatbfWOU svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NVDk3vx8AatbfWOU p{margin:0;}#mermaid-svg-NVDk3vx8AatbfWOU .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-NVDk3vx8AatbfWOU .cluster-label text{fill:#333;}#mermaid-svg-NVDk3vx8AatbfWOU .cluster-label span{color:#333;}#mermaid-svg-NVDk3vx8AatbfWOU .cluster-label span p{background-color:transparent;}#mermaid-svg-NVDk3vx8AatbfWOU .label text,#mermaid-svg-NVDk3vx8AatbfWOU span{fill:#333;color:#333;}#mermaid-svg-NVDk3vx8AatbfWOU .node rect,#mermaid-svg-NVDk3vx8AatbfWOU .node circle,#mermaid-svg-NVDk3vx8AatbfWOU .node ellipse,#mermaid-svg-NVDk3vx8AatbfWOU .node polygon,#mermaid-svg-NVDk3vx8AatbfWOU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NVDk3vx8AatbfWOU .rough-node .label text,#mermaid-svg-NVDk3vx8AatbfWOU .node .label text,#mermaid-svg-NVDk3vx8AatbfWOU .image-shape .label,#mermaid-svg-NVDk3vx8AatbfWOU .icon-shape .label{text-anchor:middle;}#mermaid-svg-NVDk3vx8AatbfWOU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NVDk3vx8AatbfWOU .rough-node .label,#mermaid-svg-NVDk3vx8AatbfWOU .node .label,#mermaid-svg-NVDk3vx8AatbfWOU .image-shape .label,#mermaid-svg-NVDk3vx8AatbfWOU .icon-shape .label{text-align:center;}#mermaid-svg-NVDk3vx8AatbfWOU .node.clickable{cursor:pointer;}#mermaid-svg-NVDk3vx8AatbfWOU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NVDk3vx8AatbfWOU .arrowheadPath{fill:#333333;}#mermaid-svg-NVDk3vx8AatbfWOU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NVDk3vx8AatbfWOU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NVDk3vx8AatbfWOU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NVDk3vx8AatbfWOU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NVDk3vx8AatbfWOU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NVDk3vx8AatbfWOU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NVDk3vx8AatbfWOU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NVDk3vx8AatbfWOU .cluster text{fill:#333;}#mermaid-svg-NVDk3vx8AatbfWOU .cluster span{color:#333;}#mermaid-svg-NVDk3vx8AatbfWOU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NVDk3vx8AatbfWOU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NVDk3vx8AatbfWOU rect.text{fill:none;stroke-width:0;}#mermaid-svg-NVDk3vx8AatbfWOU .icon-shape,#mermaid-svg-NVDk3vx8AatbfWOU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NVDk3vx8AatbfWOU .icon-shape p,#mermaid-svg-NVDk3vx8AatbfWOU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NVDk3vx8AatbfWOU .icon-shape rect,#mermaid-svg-NVDk3vx8AatbfWOU .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NVDk3vx8AatbfWOU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NVDk3vx8AatbfWOU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NVDk3vx8AatbfWOU :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>_apply_summary_budget(results, parent_agent)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u7b5b\u9009\u6709summary\u7684\u6761\u76ee<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>static_ceiling &#061; cfg.max_summary_chars\u9ed8\u8ba424000<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_parent_summary_char_budget()\u52a8\u6001headroom\u9884\u7b97<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>context_length &#061; compressor.context_length<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_parent_prompt_size_tokens()parent\u7684\u5f53\u524dprompt\u5927\u5c0f<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>headroom &#061; context_length &#8211; used &#8211; max_tokens<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>per_summary &#061; headroom * 0.5 \/ n_summaries * 4 chars\/token<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>max(2000, per_summary)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>cap &#061; min(static_ceiling, dynamic_budget)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>for each summary:<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>len(summary) &gt; cap?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4fdd\u6301\u539f\u6837<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>_trim_summary_with_footer()<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>75% head &#043; 25% tail\u6309\u884c\u8fb9\u754c\u5bf9\u9f50<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>_spill_summary_to_file()\u5168\u6587\u5199\u5165cache\/delegation\/<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u9644\u52a0footer:read_file path&#061;&#8230; offset&#061;&#8230;<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>entry.summary_truncated &#061; Trueentry.summary_full_path &#061; spill_path<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5b8c\u6210<\/p>\n<p><\/span><\/p>\n<p>\u5173\u952e\u53c2\u6570&#xff1a;<\/p>\n<ul>\n<li>_SUMMARY_HEADROOM_FRACTION &#061; 0.5&#xff1a;\u7236\u4ee3\u7406\u5269\u4f59\u4e0a\u4e0b\u6587headroom\u768450%\u5206\u914d\u7ed9\u6458\u8981<\/li>\n<li>_MIN_SUMMARY_CHARS &#061; 2000&#xff1a;\u5373\u4f7f\u7236\u4ee3\u7406\u63a5\u8fd1\u6ee1&#xff0c;\u5355\u6458\u8981\u81f3\u5c112000\u5b57\u7b26<\/li>\n<li>DEFAULT_MAX_SUMMARY_CHARS &#061; 24000&#xff1a;\u786c\u6027\u4e0a\u9650<\/li>\n<li>cap &#061; min(static_ceiling, dynamic_budget)&#xff1a;\u53d6\u8f83\u5c0f\u503c<\/li>\n<\/ul>\n<p>_parent_prompt_size_tokens() \u7684\u5173\u952e\u4fee\u6b63&#xff08;L225-236&#xff09;&#xff1a;<\/p>\n<p>size <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">getattr<\/span><span class=\"token punctuation\">(<\/span>parent_agent<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;_last_prompt_size_tokens&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># aggregator\u7684\u6700\u540e\u4e00\u6b21prompt_tokens<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>size<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token builtin\">int<\/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 keyword\">and<\/span> size <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>size<span class=\"token punctuation\">)<\/span><br \/>\nlast_usage <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">getattr<\/span><span class=\"token punctuation\">(<\/span>parent_agent<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;_last_turn_usage&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\nused <span class=\"token operator\">&#061;<\/span> last_usage<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;prompt_tokens&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>last_usage<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token boolean\">None<\/span><br \/>\n<span class=\"token comment\"># \u6ce8\u610f&#xff1a;session_prompt_tokens\u662f\u6574\u4e2a\u4f1a\u8bdd\u7684\u7d2f\u8ba1SUM&#xff0c;\u51e0\u767e\u6b21\u8c03\u7528\u540e\u8d85\u8fc7\u4efb\u4f55\u4e0a\u4e0b\u6587\u7a97\u53e3<\/span><br \/>\n<span class=\"token comment\"># \u7528\u5b83\u4f1a\u8ba9\u6bcf\u4e2a\u6458\u8981\u90fd\u574d\u7f29\u52302000\u5b57\u7b26floor<\/span><\/p>\n<h4>11.3 _fire_subagent_stop_hooks() \u94a9\u5b50&#043;\u6210\u672c\u5f39\u51fa<\/h4>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">_fire_subagent_stop_hooks<\/span><span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">,<\/span> child_by_index<span class=\"token punctuation\">,<\/span> parent_agent<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    children_cost_total <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> entry <span class=\"token keyword\">in<\/span> results<span class=\"token punctuation\">:<\/span><br \/>\n        child_role <span class=\"token operator\">&#061;<\/span> entry<span class=\"token punctuation\">.<\/span>pop<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;_child_role&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># \u5f39\u51fa\u6a21\u578b\u4e0d\u53ef\u89c1\u5b57\u6bb5<\/span><br \/>\n        child_cost <span class=\"token operator\">&#061;<\/span> entry<span class=\"token punctuation\">.<\/span>pop<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;_child_cost_usd&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> child_cost<span class=\"token punctuation\">:<\/span><br \/>\n            children_cost_total <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>child_cost<span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> invoke_hook <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            child <span class=\"token operator\">&#061;<\/span> child_by_index<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span>entry<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;task_index&#034;<\/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 punctuation\">)<\/span><br \/>\n            invoke_hook<span class=\"token punctuation\">(<\/span><br \/>\n                <span class=\"token string\">&#034;subagent_stop&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                parent_session_id<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">getattr<\/span><span class=\"token punctuation\">(<\/span>parent_agent<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;session_id&#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                parent_turn_id<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">getattr<\/span><span class=\"token punctuation\">(<\/span>parent_agent<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;_current_turn_id&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><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                child_session_id<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">getattr<\/span><span class=\"token punctuation\">(<\/span>child<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;session_id&#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                child_role<span class=\"token operator\">&#061;<\/span>child_role<span class=\"token punctuation\">,<\/span><br \/>\n                child_summary<span class=\"token operator\">&#061;<\/span>entry<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;summary&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                child_status<span class=\"token operator\">&#061;<\/span>entry<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                tool_call_history<span class=\"token operator\">&#061;<\/span>_subagent_stop_tool_call_history<span class=\"token punctuation\">(<\/span>entry<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;tool_trace&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><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>entry<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;duration_seconds&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token number\">0<\/span><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><br \/>\n            <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> children_cost_total<\/p>\n<ul>\n<li>_child_role\u548c_child_cost_usd\u5728\u5e8f\u5217\u5316\u524d\u5f39\u51fa&#xff08;\u6a21\u578b\u4e0d\u53ef\u89c1&#xff09;<\/li>\n<li>tool_call_history\u7ecf\u8fc7\u5143\u6570\u636eonly\u8131\u654f&#xff08;\u8f93\u5165\u6458\u8981\u91cd\u65b0\u6e05\u6d17&#xff0c;URL secrets\u5265\u79bb&#xff09;<\/li>\n<li>subagent_stop\u94a9\u5b50\u8ba9\u63d2\u4ef6\u53ef\u4ee5\u76d1\u63a7\u5b50\u4ee3\u7406\u751f\u547d\u5468\u671f<\/li>\n<\/ul>\n<h4>11.4 \u6210\u672c\u6c47\u603b<\/h4>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">_rollup_children_cost<\/span><span class=\"token punctuation\">(<\/span>parent_agent<span class=\"token punctuation\">,<\/span> children_cost_total<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\">if<\/span> children_cost_total <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><br \/>\n    current <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">getattr<\/span><span class=\"token punctuation\">(<\/span>parent_agent<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;session_estimated_cost_usd&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    parent_agent<span class=\"token punctuation\">.<\/span>session_estimated_cost_usd <span class=\"token operator\">&#061;<\/span> current <span class=\"token operator\">&#043;<\/span> children_cost_total<br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">getattr<\/span><span class=\"token punctuation\">(<\/span>parent_agent<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;session_cost_source&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;none&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;none&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        parent_agent<span class=\"token punctuation\">.<\/span>session_cost_source <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;subagent&#034;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">getattr<\/span><span class=\"token punctuation\">(<\/span>parent_agent<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;session_cost_status&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;unknown&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;unknown&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        parent_agent<span class=\"token punctuation\">.<\/span>session_cost_status <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;estimated&#034;<\/span><\/p>\n<ul>\n<li>\u5b50\u4ee3\u7406\u6210\u672c\u6298\u5165\u7236\u4ee3\u7406\u7684\u4f1a\u8bdd\u603b\u6210\u672c<\/li>\n<li>source\/status\u4ec5\u5728\u7236\u4ee3\u7406\u6ca1\u6709\u81ea\u5df1\u7684\u503c\u65f6\u8bbe\u7f6e&#xff08;\u4e0d\u8986\u76d6&#xff09;<\/li>\n<\/ul>\n<hr \/>\n<h3>12. \u63a7\u5236\u9762&#xff1a;list \/ steer \/ stop<\/h3>\n<h4>12.1 \u63a7\u5236\u9762\u67b6\u6784<\/h4>\n<p>#mermaid-svg-hGZxRyafEQwD0Wms{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hGZxRyafEQwD0Wms .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hGZxRyafEQwD0Wms .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hGZxRyafEQwD0Wms .error-icon{fill:#552222;}#mermaid-svg-hGZxRyafEQwD0Wms .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hGZxRyafEQwD0Wms .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hGZxRyafEQwD0Wms .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hGZxRyafEQwD0Wms .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hGZxRyafEQwD0Wms .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hGZxRyafEQwD0Wms .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hGZxRyafEQwD0Wms .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hGZxRyafEQwD0Wms .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hGZxRyafEQwD0Wms .marker.cross{stroke:#333333;}#mermaid-svg-hGZxRyafEQwD0Wms svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hGZxRyafEQwD0Wms p{margin:0;}#mermaid-svg-hGZxRyafEQwD0Wms .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-hGZxRyafEQwD0Wms .cluster-label text{fill:#333;}#mermaid-svg-hGZxRyafEQwD0Wms .cluster-label span{color:#333;}#mermaid-svg-hGZxRyafEQwD0Wms .cluster-label span p{background-color:transparent;}#mermaid-svg-hGZxRyafEQwD0Wms .label text,#mermaid-svg-hGZxRyafEQwD0Wms span{fill:#333;color:#333;}#mermaid-svg-hGZxRyafEQwD0Wms .node rect,#mermaid-svg-hGZxRyafEQwD0Wms .node circle,#mermaid-svg-hGZxRyafEQwD0Wms .node ellipse,#mermaid-svg-hGZxRyafEQwD0Wms .node polygon,#mermaid-svg-hGZxRyafEQwD0Wms .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hGZxRyafEQwD0Wms .rough-node .label text,#mermaid-svg-hGZxRyafEQwD0Wms .node .label text,#mermaid-svg-hGZxRyafEQwD0Wms .image-shape .label,#mermaid-svg-hGZxRyafEQwD0Wms .icon-shape .label{text-anchor:middle;}#mermaid-svg-hGZxRyafEQwD0Wms .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hGZxRyafEQwD0Wms .rough-node .label,#mermaid-svg-hGZxRyafEQwD0Wms .node .label,#mermaid-svg-hGZxRyafEQwD0Wms .image-shape .label,#mermaid-svg-hGZxRyafEQwD0Wms .icon-shape .label{text-align:center;}#mermaid-svg-hGZxRyafEQwD0Wms .node.clickable{cursor:pointer;}#mermaid-svg-hGZxRyafEQwD0Wms .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hGZxRyafEQwD0Wms .arrowheadPath{fill:#333333;}#mermaid-svg-hGZxRyafEQwD0Wms .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hGZxRyafEQwD0Wms .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hGZxRyafEQwD0Wms .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hGZxRyafEQwD0Wms .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hGZxRyafEQwD0Wms .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hGZxRyafEQwD0Wms .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hGZxRyafEQwD0Wms .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hGZxRyafEQwD0Wms .cluster text{fill:#333;}#mermaid-svg-hGZxRyafEQwD0Wms .cluster span{color:#333;}#mermaid-svg-hGZxRyafEQwD0Wms div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hGZxRyafEQwD0Wms .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hGZxRyafEQwD0Wms rect.text{fill:none;stroke-width:0;}#mermaid-svg-hGZxRyafEQwD0Wms .icon-shape,#mermaid-svg-hGZxRyafEQwD0Wms .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hGZxRyafEQwD0Wms .icon-shape p,#mermaid-svg-hGZxRyafEQwD0Wms .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hGZxRyafEQwD0Wms .icon-shape rect,#mermaid-svg-hGZxRyafEQwD0Wms .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hGZxRyafEQwD0Wms .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hGZxRyafEQwD0Wms .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hGZxRyafEQwD0Wms :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>list<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>steer<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>stop<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6a21\u578b\u8c03\u7528 delegate_task(action&#061;&#8230;)<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>_handle_control_action()<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>action<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_list_payload(parent_agent)\u5217\u51fa\u5f53\u524d\u4f1a\u8bdd\u7684\u6d3b\u8dc3\u5b50\u4ee3\u7406<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u68c0\u67e5 subagent_id &#043; message<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u68c0\u67e5 subagent_id<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_owns_subagent_record()Tier1: weakref\u94feTier2: durable lineage<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>{subagent_id, parent_id, goal, model,status, running_seconds, accepting_steer,live_transcript}<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8fd4\u56deJSON<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_owns_subagent_record?&#043; record.accepting_steer?<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>steer_subagent(sid, message)\u2192 agent.steer(text)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u9519\u8bef&#xff1a;\u4e0d\u5728\u6b64\u4f1a\u8bdd\u7684spawn\u6811\u4e2d<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8fd4\u56de&#xff1a;steer\u5df2\u6392\u961f\u5b50\u4ee3\u7406\u5728\u4e0b\u6b21\u8fed\u4ee3\u8fb9\u754c\u770b\u5230<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_owns_subagent_record?<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>interrupt_subagent(sid)\u2192 request_hard_interrupt(agent)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u9519\u8bef&#xff1a;\u4e0d\u5728\u6b64\u4f1a\u8bdd\u7684spawn\u6811\u4e2d<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8fd4\u56de&#xff1a;interrupt_requested\u5b50\u4ee3\u7406\u5728\u4e0b\u6b21\u8fed\u4ee3\u8fb9\u754c\u505c\u6b62\u90e8\u5206\u7ed3\u679c\u4ecd\u8fd4\u56de<\/p>\n<p><\/span><\/p>\n<h4>12.2 steer_subagent() \u8be6\u7ec6\u903b\u8f91<\/h4>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">steer_subagent<\/span><span class=\"token punctuation\">(<\/span>subagent_id<span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">,<\/span> owner_session_id<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span> owner_transport<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span> owner_session_record<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/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> text <span class=\"token keyword\">or<\/span> <span class=\"token keyword\">not<\/span> text<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\">return<\/span> <span class=\"token boolean\">False<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> _active_subagents_lock<span class=\"token punctuation\">:<\/span><br \/>\n        record <span class=\"token operator\">&#061;<\/span> _active_subagents<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span>subagent_id<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> record <span class=\"token keyword\">or<\/span> <span class=\"token keyword\">not<\/span> record<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;accepting_steer&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">False<\/span><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 comment\"># \u4e0d\u5b58\u5728\u6216\u5df2\u5173\u95edsteer\u63a5\u53d7<\/span><br \/>\n        <span class=\"token comment\"># \u6743\u9650\u9a8c\u8bc1&#xff1a;gateway\u8c03\u7528\u8005\u5fc5\u987b\u5339\u914downer_session_id &#043; transport &#043; session_record<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> owner_session_id <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token keyword\">and<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n            record<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;owner_session_id&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> owner_session_id<br \/>\n            <span class=\"token keyword\">or<\/span> owner_transport <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><br \/>\n            <span class=\"token keyword\">or<\/span> <span class=\"token keyword\">not<\/span> _subagent_transport_matches<span class=\"token punctuation\">(<\/span>record<span class=\"token punctuation\">,<\/span> owner_transport<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">or<\/span> owner_session_record <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><br \/>\n            <span class=\"token keyword\">or<\/span> record<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;owner_session_record&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> owner_session_record<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 comment\"># \u6743\u9650\u4e0d\u5339\u914d<\/span><br \/>\n        agent <span class=\"token operator\">&#061;<\/span> record<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;agent&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> agent <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">(<\/span>agent<span class=\"token punctuation\">.<\/span>steer<span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># AIAgent.steer()\u8ffd\u52a0\u5230\u5b50\u4ee3\u7406\u6700\u540e\u7684\u5de5\u5177\u7ed3\u679c<\/span><br \/>\n        <span class=\"token keyword\">except<\/span> Exception<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><\/p>\n<p>steer\u8bed\u4e49&#xff1a;<\/p>\n<ul>\n<li>\u4e0d\u5207\u65ad\u5f53\u524d\u5de5\u5177\u8c03\u7528&#xff1a;text\u8ffd\u52a0\u5230\u5b50\u4ee3\u7406\u4e0b\u6b21\u8fed\u4ee3\u8fb9\u754c\u7684\u6700\u540e\u5de5\u5177\u7ed3\u679c<\/li>\n<li>\u7ebf\u6027\u5316&#xff1a;\u6ce8\u518c\u8868\u9501\u4fdd\u8bc1acceptance\u548cdelivery\u7684\u539f\u5b50\u6027<\/li>\n<li>missed_steer&#xff1a;\u5982\u679c\u5b50\u4ee3\u7406\u5728delivery\u8fb9\u754c\u524d\u5b8c\u6210&#xff0c;text\u8fdb\u5165entry\u7684missed_steer\u5b57\u6bb5<\/li>\n<\/ul>\n<h4>12.3 _owns_subagent_record() \u53cc\u5c42\u6743\u9650<\/h4>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">_owns_subagent_record<\/span><span class=\"token punctuation\">(<\/span>record<span class=\"token punctuation\">,<\/span> parent_agent<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 comment\"># Tier 1: \u8eab\u4efd\u2014\u2014_delegate_parent_ref weakref\u94fe\u5230\u8fbeparent_agent<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> _is_descendant_of<span class=\"token punctuation\">(<\/span>record<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;agent&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> parent_agent<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">True<\/span><br \/>\n    <span class=\"token comment\"># Tier 2: \u6301\u4e45lineage\u2014\u2014owner_agent_session_id\u5339\u914d&#xff08;\u8de8parent_agent\u91cd\u5efa&#xff09;<\/span><br \/>\n    owner_sid <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>record<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;owner_agent_session_id&#034;<\/span><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    parent_sid <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">getattr<\/span><span class=\"token punctuation\">(<\/span>parent_agent<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;session_id&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><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 keyword\">if<\/span> <span class=\"token keyword\">not<\/span> owner_sid <span class=\"token keyword\">or<\/span> <span class=\"token keyword\">not<\/span> parent_sid<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> owner_sid <span class=\"token operator\">&#061;&#061;<\/span> parent_sid<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">True<\/span><br \/>\n    <span class=\"token comment\"># \u538b\u7f29\u65cb\u8f6c&#xff1a;\u6bd4\u8f83lineage tips<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> _resolve_session_lineage<span class=\"token punctuation\">(<\/span>owner_sid<span class=\"token punctuation\">,<\/span> parent_agent<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token punctuation\">{<\/span>parent_sid<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>Tier 2\u5b58\u5728\u7684\u539f\u56e0&#xff1a;<\/p>\n<ul>\n<li>CLI\u5728\u4f1a\u8bdd\u4e2d\u8bbe\u7f6eself.agent &#061; None&#xff08;\u8def\u7531\u53d8\u66f4\u3001\u51ed\u8bc1\u5237\u65b0\u3001\/model\u3001MoA one-shots&#xff09;\u5e76\u6784\u5efa\u65b0AIAgent<\/li>\n<li>\u5b50\u4ee3\u7406\u4fdd\u6301\u5bf9\u65e7AIAgent\u7684weakref&#xff0c;identity chain\u65ad\u88c2<\/li>\n<li>Delivery\u6309\u6301\u4e45session_id\u8def\u7531&#xff0c;\u63a7\u5236\u5fc5\u987b\u4f7f\u7528\u540c\u4e00spine<\/li>\n<\/ul>\n<h4>12.4 _subagent_transport_matches() \u4f20\u8f93\u6743\u9650<\/h4>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">_subagent_transport_matches<\/span><span class=\"token punctuation\">(<\/span>record<span class=\"token punctuation\">,<\/span> transport<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 keyword\">if<\/span> record<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;owner_transport&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span>  <span class=\"token comment\"># \u975egateway\u4f1a\u8bdd\u65e0RPC\u6743\u9650<\/span><br \/>\n    owner <span class=\"token operator\">&#061;<\/span> record<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;owner_session_record&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    bound <span class=\"token operator\">&#061;<\/span> owner<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;transport&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>owner<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">else<\/span> record<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;owner_transport&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> bound <span class=\"token keyword\">is<\/span> transport <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>bound<span class=\"token punctuation\">,<\/span> FanoutTransport<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">and<\/span> bound<span class=\"token punctuation\">.<\/span>contains<span class=\"token punctuation\">(<\/span>transport<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<ul>\n<li>\u6743\u9650\u8ddf\u968f\u62e5\u6709\u4f1a\u8bdd\u7684LIVE\u4f20\u8f93\u69fd&#xff08;\u8bfb\u53d6\u65f6\u68c0\u67e5&#xff0c;\u975e\u8bb0\u5f55\u65f6\u5feb\u7167&#xff09;<\/li>\n<li>\u6bcf\u4e2areattach\u8def\u5f84&#xff08;prompt.submit\u3001queued drain\u3001resume\u3001activate\u3001viewer failover&#xff09;\u90fd\u4fee\u6539\u4f20\u8f93\u69fd<\/li>\n<li>per-record\u526f\u672c\u9700\u8981\u5728\u6bcf\u4e2areattach\u7ad9\u70b9\u540c\u6b65&#xff0c;\u6709\u4e24\u4e2a\u88ab\u9057\u6f0f&#xff08;#106663&#xff09;<\/li>\n<\/ul>\n<hr \/>\n<h3>13. \u5de5\u5177\u96c6\u9694\u79bb\u673a\u5236<\/h3>\n<h4>13.1 \u88ab\u963b\u6b62\u7684\u5de5\u5177<\/h4>\n<p>DELEGATE_BLOCKED_TOOLS <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">frozenset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token string\">&#034;delegate_task&#034;<\/span><span class=\"token punctuation\">,<\/span>    <span class=\"token comment\"># \u65e0\u9012\u5f52\u59d4\u6d3e&#xff08;leaf\u89d2\u8272&#xff09;<\/span><br \/>\n    <span class=\"token string\">&#034;clarify&#034;<\/span><span class=\"token punctuation\">,<\/span>          <span class=\"token comment\"># \u65e0\u7528\u6237\u4ea4\u4e92<\/span><br \/>\n    <span class=\"token string\">&#034;memory&#034;<\/span><span class=\"token punctuation\">,<\/span>           <span class=\"token comment\"># \u65e0MEMORY.md\u5199\u5165<\/span><br \/>\n    <span class=\"token string\">&#034;send_message&#034;<\/span><span class=\"token punctuation\">,<\/span>     <span class=\"token comment\"># \u65e0\u8de8\u5e73\u53f0\u526f\u4f5c\u7528<\/span><br \/>\n    <span class=\"token string\">&#034;cronjob_manage&#034;<\/span><span class=\"token punctuation\">,<\/span>   <span class=\"token comment\"># \u65e0\u4ee5\u7236\u4ee3\u7406\u540d\u4e49\u8c03\u5ea6\u66f4\u591a\u5de5\u4f5c<\/span><br \/>\n<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>13.2 _resolve_child_toolsets() \u89e3\u6790\u6d41\u7a0b<\/h4>\n<p>#mermaid-svg-qhm4SwA7HRWYCW2c{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qhm4SwA7HRWYCW2c .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qhm4SwA7HRWYCW2c .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qhm4SwA7HRWYCW2c .error-icon{fill:#552222;}#mermaid-svg-qhm4SwA7HRWYCW2c .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qhm4SwA7HRWYCW2c .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qhm4SwA7HRWYCW2c .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qhm4SwA7HRWYCW2c .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qhm4SwA7HRWYCW2c .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qhm4SwA7HRWYCW2c .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qhm4SwA7HRWYCW2c .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qhm4SwA7HRWYCW2c .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qhm4SwA7HRWYCW2c .marker.cross{stroke:#333333;}#mermaid-svg-qhm4SwA7HRWYCW2c svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qhm4SwA7HRWYCW2c p{margin:0;}#mermaid-svg-qhm4SwA7HRWYCW2c .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-qhm4SwA7HRWYCW2c .cluster-label text{fill:#333;}#mermaid-svg-qhm4SwA7HRWYCW2c .cluster-label span{color:#333;}#mermaid-svg-qhm4SwA7HRWYCW2c .cluster-label span p{background-color:transparent;}#mermaid-svg-qhm4SwA7HRWYCW2c .label text,#mermaid-svg-qhm4SwA7HRWYCW2c span{fill:#333;color:#333;}#mermaid-svg-qhm4SwA7HRWYCW2c .node rect,#mermaid-svg-qhm4SwA7HRWYCW2c .node circle,#mermaid-svg-qhm4SwA7HRWYCW2c .node ellipse,#mermaid-svg-qhm4SwA7HRWYCW2c .node polygon,#mermaid-svg-qhm4SwA7HRWYCW2c .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qhm4SwA7HRWYCW2c .rough-node .label text,#mermaid-svg-qhm4SwA7HRWYCW2c .node .label text,#mermaid-svg-qhm4SwA7HRWYCW2c .image-shape .label,#mermaid-svg-qhm4SwA7HRWYCW2c .icon-shape .label{text-anchor:middle;}#mermaid-svg-qhm4SwA7HRWYCW2c .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qhm4SwA7HRWYCW2c .rough-node .label,#mermaid-svg-qhm4SwA7HRWYCW2c .node .label,#mermaid-svg-qhm4SwA7HRWYCW2c .image-shape .label,#mermaid-svg-qhm4SwA7HRWYCW2c .icon-shape .label{text-align:center;}#mermaid-svg-qhm4SwA7HRWYCW2c .node.clickable{cursor:pointer;}#mermaid-svg-qhm4SwA7HRWYCW2c .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qhm4SwA7HRWYCW2c .arrowheadPath{fill:#333333;}#mermaid-svg-qhm4SwA7HRWYCW2c .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qhm4SwA7HRWYCW2c .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qhm4SwA7HRWYCW2c .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qhm4SwA7HRWYCW2c .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qhm4SwA7HRWYCW2c .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qhm4SwA7HRWYCW2c .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qhm4SwA7HRWYCW2c .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qhm4SwA7HRWYCW2c .cluster text{fill:#333;}#mermaid-svg-qhm4SwA7HRWYCW2c .cluster span{color:#333;}#mermaid-svg-qhm4SwA7HRWYCW2c div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qhm4SwA7HRWYCW2c .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qhm4SwA7HRWYCW2c rect.text{fill:none;stroke-width:0;}#mermaid-svg-qhm4SwA7HRWYCW2c .icon-shape,#mermaid-svg-qhm4SwA7HRWYCW2c .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qhm4SwA7HRWYCW2c .icon-shape p,#mermaid-svg-qhm4SwA7HRWYCW2c .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qhm4SwA7HRWYCW2c .icon-shape rect,#mermaid-svg-qhm4SwA7HRWYCW2c .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qhm4SwA7HRWYCW2c .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qhm4SwA7HRWYCW2c .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qhm4SwA7HRWYCW2c :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u6709<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>None<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u6709<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u65e0<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u6709<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u65e0<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>_resolve_child_toolsets(parent, toolsets, effective_role)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>parent.enabled_toolsets?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>parent_toolsets &#061; set(parent.enabled_toolsets)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>parent\u6709valid_tool_names?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4ecetool names\u53cd\u63a8toolsets<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>parent_toolsets &#061; DEFAULT_TOOLSETS[&#039;terminal&#039;, &#039;file&#039;, &#039;web&#039;]<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u663e\u5f0ftoolsets\u53c2\u6570?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_expand_parent_toolsets()\u6dfb\u52a0tools\u662fparent\u5b50\u96c6\u7684toolset<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u7ee7\u627fparent\u7684enabled set<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>child_toolsets &#061; [t for t in toolsets if t in expanded_parent]<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>inherit_mcp_toolsets?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8ffd\u52a0parent\u7684MCP toolsets<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u7ee7\u7eed<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>_strip_blocked_tools()\u79fb\u9664\u5168\u90e8\u5de5\u5177\u88ab\u963b\u6b62\u7684toolset&#043; delegation\/kanban<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>effective_role &#061;&#061; &#039;orchestrator&#039;?<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>\u4ecedisabled\u4e2d\u79fb\u9664delegation\u5728enabled\u4e2d\u6dfb\u52a0delegation<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4fdd\u6301delegation\u5728disabled\u4e2d<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>child_disabled &#061; inherited_disabled &#043;_blocked_toolsets_for_role(role) &#043; [&#039;kanban&#039;]<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>return (child_toolsets, child_disabled_toolsets)<\/p>\n<p><\/span><\/p>\n<p>\u5173\u952e\u8bbe\u8ba1&#xff1a;<\/p>\n<ul>\n<li>\u5b50\u4ee3\u7406\u6c38\u4e0d\u83b7\u5f97\u7236\u4ee3\u7406\u7f3a\u5c11\u7684\u5de5\u5177&#xff1a;\u663e\u5f0ftoolsets\u4e0eparent\u7684&#xff08;\u590d\u5408\u5c55\u5f00\u540e\u7684&#xff09;\u96c6\u5408\u53d6\u4ea4\u96c6<\/li>\n<li>\u53cc\u91cd\u5265\u79bb&#xff1a;\u6574\u4f53\u88ab\u963b\u6b62\u7684toolset\u5728\u8fd9\u91cc\u5265\u79bb &#043; \u6df7\u5408bundle\u4e2d\u7684\u5355\u4e2a\u88ab\u963b\u6b62\u5de5\u5177\u901a\u8fc7disabled_toolsets\u5728composite\u5c55\u5f00\u540e\u51cf\u53bb<\/li>\n<li>orchestrator\u89d2\u8272\u4f8b\u5916&#xff1a;delegationtoolset\u88ab\u65e0\u6761\u4ef6\u91cd\u65b0\u6dfb\u52a0&#xff08;\u89d2\u8272\u6388\u4e88&#xff0c;\u975e\u7ee7\u627f&#xff09;<\/li>\n<\/ul>\n<h4>13.3 composite toolset\u5c55\u5f00<\/h4>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">_expand_parent_toolsets<\/span><span class=\"token punctuation\">(<\/span>parent_toolsets<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6dfb\u52a0tools\u662fparent\u5b50\u96c6\u7684toolset&#034;&#034;&#034;<\/span><br \/>\n    parent_tool_names <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span>t <span class=\"token keyword\">for<\/span> ts_name <span class=\"token keyword\">in<\/span> parent_toolsets<br \/>\n                        <span class=\"token keyword\">for<\/span> t <span class=\"token keyword\">in<\/span> <span class=\"token punctuation\">(<\/span>TOOLSETS<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span>ts_name<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;tools&#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><br \/>\n    expanded <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>parent_toolsets<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> parent_tool_names<span class=\"token punctuation\">:<\/span><br \/>\n        expanded<span class=\"token punctuation\">.<\/span>update<span class=\"token punctuation\">(<\/span><br \/>\n            ts_name <span class=\"token keyword\">for<\/span> ts_name<span class=\"token punctuation\">,<\/span> ts_def <span class=\"token keyword\">in<\/span> TOOLSETS<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> ts_name <span class=\"token keyword\">not<\/span> <span class=\"token keyword\">in<\/span> expanded <span class=\"token keyword\">and<\/span> ts_def<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;tools&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">and<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>ts_def<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;tools&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>issubset<span class=\"token punctuation\">(<\/span>parent_tool_names<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> expanded<\/p>\n<p>\u95ee\u9898&#xff1a;parent\u5728hermes-clicomposite\u4e0a&#xff0c;child\u8bf7\u6c42web\/terminal\u2014\u2014bare name intersection\u4f1a\u62d2\u7edd\u5b83\u4eec&#xff0c;\u56e0\u4e3aweb \u2260 hermes-cli\u3002\u5c55\u5f00\u540e&#xff0c;web\u7684tools\u662fhermes-clitools\u7684\u5b50\u96c6\u2192\u88ab\u6dfb\u52a0\u5230expanded\u96c6\u5408\u2192child\u7684web\u5728expanded\u4e2d\u2192\u901a\u8fc7\u3002<\/p>\n<hr \/>\n<h3>14. \u7ed3\u6784\u5316\u8f93\u51fa\u9a8c\u8bc1<\/h3>\n<h4>14.1 \u9a8c\u8bc1\u6d41\u7a0b<\/h4>\n<p>#mermaid-svg-tW67sLIJd1HREJNT{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tW67sLIJd1HREJNT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tW67sLIJd1HREJNT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tW67sLIJd1HREJNT .error-icon{fill:#552222;}#mermaid-svg-tW67sLIJd1HREJNT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tW67sLIJd1HREJNT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tW67sLIJd1HREJNT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tW67sLIJd1HREJNT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tW67sLIJd1HREJNT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tW67sLIJd1HREJNT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tW67sLIJd1HREJNT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tW67sLIJd1HREJNT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tW67sLIJd1HREJNT .marker.cross{stroke:#333333;}#mermaid-svg-tW67sLIJd1HREJNT svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tW67sLIJd1HREJNT p{margin:0;}#mermaid-svg-tW67sLIJd1HREJNT .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-tW67sLIJd1HREJNT .cluster-label text{fill:#333;}#mermaid-svg-tW67sLIJd1HREJNT .cluster-label span{color:#333;}#mermaid-svg-tW67sLIJd1HREJNT .cluster-label span p{background-color:transparent;}#mermaid-svg-tW67sLIJd1HREJNT .label text,#mermaid-svg-tW67sLIJd1HREJNT span{fill:#333;color:#333;}#mermaid-svg-tW67sLIJd1HREJNT .node rect,#mermaid-svg-tW67sLIJd1HREJNT .node circle,#mermaid-svg-tW67sLIJd1HREJNT .node ellipse,#mermaid-svg-tW67sLIJd1HREJNT .node polygon,#mermaid-svg-tW67sLIJd1HREJNT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tW67sLIJd1HREJNT .rough-node .label text,#mermaid-svg-tW67sLIJd1HREJNT .node .label text,#mermaid-svg-tW67sLIJd1HREJNT .image-shape .label,#mermaid-svg-tW67sLIJd1HREJNT .icon-shape .label{text-anchor:middle;}#mermaid-svg-tW67sLIJd1HREJNT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tW67sLIJd1HREJNT .rough-node .label,#mermaid-svg-tW67sLIJd1HREJNT .node .label,#mermaid-svg-tW67sLIJd1HREJNT .image-shape .label,#mermaid-svg-tW67sLIJd1HREJNT .icon-shape .label{text-align:center;}#mermaid-svg-tW67sLIJd1HREJNT .node.clickable{cursor:pointer;}#mermaid-svg-tW67sLIJd1HREJNT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tW67sLIJd1HREJNT .arrowheadPath{fill:#333333;}#mermaid-svg-tW67sLIJd1HREJNT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tW67sLIJd1HREJNT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tW67sLIJd1HREJNT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tW67sLIJd1HREJNT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tW67sLIJd1HREJNT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tW67sLIJd1HREJNT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tW67sLIJd1HREJNT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tW67sLIJd1HREJNT .cluster text{fill:#333;}#mermaid-svg-tW67sLIJd1HREJNT .cluster span{color:#333;}#mermaid-svg-tW67sLIJd1HREJNT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tW67sLIJd1HREJNT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tW67sLIJd1HREJNT rect.text{fill:none;stroke-width:0;}#mermaid-svg-tW67sLIJd1HREJNT .icon-shape,#mermaid-svg-tW67sLIJd1HREJNT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tW67sLIJd1HREJNT .icon-shape p,#mermaid-svg-tW67sLIJd1HREJNT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tW67sLIJd1HREJNT .icon-shape rect,#mermaid-svg-tW67sLIJd1HREJNT .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tW67sLIJd1HREJNT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tW67sLIJd1HREJNT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tW67sLIJd1HREJNT :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>_validate_child_output_schema()<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>child._delegate_output_schemais dict?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8fd4\u56de: \u65e0schema, valid&#061;None, \u65e0\u5206\u652f<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>validate_output(first_text, schema)jsonschema\u9a8c\u8bc1<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>valid?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8fd4\u56de: schema, valid&#061;True, 0 retries<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>first_text\u975e\u7a7a\u4e14\u975einterrupted?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8fd4\u56de: schema, valid&#061;False, 0 retries<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>child.run_conversation(build_retry_message(errors))EXACTLY ONE bounded retry<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_retry_result<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>result.final_response &#061; retry_textresult.api_calls &#043;&#061; retry_api_callsresult.messages &#043;&#061; retry_messages<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>validate_output(retry_text, schema)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8fd4\u56de: schema, valid&#061;?, 1 retry<\/p>\n<p><\/span><\/p>\n<h4>14.2 retry\u8bbe\u8ba1\u8981\u70b9<\/h4>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">build_retry_message<\/span><span class=\"token punctuation\">(<\/span>errors<span class=\"token punctuation\">:<\/span> List<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> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    error_block <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 string-interpolation\"><span class=\"token string\">f&#034;- <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span> <span class=\"token keyword\">for<\/span> e <span class=\"token keyword\">in<\/span> errors<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Your previous final response was rejected by the output contract &#034;<\/span><br \/>\n            <span class=\"token string\">&#034;validator. Validation errors:\\\\n&#034;<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>error_block<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\\\\n\\\\n&#034;<\/span><\/span><br \/>\n            <span class=\"token string\">&#034;Reply with ONLY the corrected JSON object matching the OUTPUT &#034;<\/span><br \/>\n            <span class=\"token string\">&#034;CONTRACT schema from your task context. No prose, no explanations.&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<ul>\n<li>\u6070\u597d\u4e00\u6b21\u91cd\u8bd5&#xff1a;\u591a\u6b21\u91cd\u8bd5\u8ba9\u524d\u6cbf\u6a21\u578b\u4e22\u5f03\u7b2c\u4e00\u6b21\u6b63\u786e\u7684\u5b57\u6bb5<\/li>\n<li>Schema\u4e0d\u518d\u91cd\u65b0\u7c98\u8d34&#xff1a;\u5b50\u4ee3\u7406\u5df2\u5728context\u4e2d\u6301\u6709contract<\/li>\n<li>\u9519\u8bef\u9010\u5b57\u4f20\u9012&#xff1a;\u9a8c\u8bc1\u9519\u8bef\u539f\u6587\u4f20\u5165retry\u6d88\u606f<\/li>\n<\/ul>\n<h4>14.3 JSON\u5019\u9009\u63d0\u53d6<\/h4>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">extract_json_candidate<\/span><span class=\"token punctuation\">(<\/span>text<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\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    raw <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>text <span class=\"token keyword\">or<\/span> <span class=\"token string\">&#034;&#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 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>  <span class=\"token comment\"># \u5265\u79bbmarkdown fence<\/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;\\\\n&#034;<\/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 operator\">&#8211;<\/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>rstrip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>endswith<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>rstrip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/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>lower<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;json\\\\n&#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;\\\\n&#034;<\/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 number\">1<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> opener<span class=\"token punctuation\">,<\/span> closer <span class=\"token keyword\">in<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;{&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;}&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;]&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>  <span class=\"token comment\"># \u63d0\u53d6\u6700\u5916\u5c42{&#8230;}\/[&#8230;]<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> raw<span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span>opener<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> raw<br \/>\n        start <span class=\"token operator\">&#061;<\/span> raw<span class=\"token punctuation\">.<\/span>find<span class=\"token punctuation\">(<\/span>opener<span class=\"token punctuation\">)<\/span><br \/>\n        end <span class=\"token operator\">&#061;<\/span> raw<span class=\"token punctuation\">.<\/span>rfind<span class=\"token punctuation\">(<\/span>closer<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> start <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">and<\/span> end <span class=\"token operator\">&gt;<\/span> start<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> raw<span class=\"token punctuation\">[<\/span>start<span class=\"token punctuation\">:<\/span>end <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> raw<\/p>\n<hr \/>\n<h3>15. \u5f02\u6b65\u6301\u4e45\u5316\u8d26\u672c\u4e0e\u5d29\u6e83\u6062\u590d<\/h3>\n<h4>15.1 SQLite\u8868\u7ed3\u6784<\/h4>\n<p><span class=\"token comment\">&#8212; async_delegations \u8868 (state.db)<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> async_delegations <span class=\"token punctuation\">(<\/span><br \/>\n    delegation_id        <span class=\"token keyword\">TEXT<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    origin_session       <span class=\"token keyword\">TEXT<\/span><span class=\"token punctuation\">,<\/span>          <span class=\"token comment\">&#8212; \u4f1a\u8bdd\u8def\u7531\u952e<\/span><br \/>\n    origin_ui_session_id <span class=\"token keyword\">TEXT<\/span><span class=\"token punctuation\">,<\/span>          <span class=\"token comment\">&#8212; TUI\u6807\u7b7eID<\/span><br \/>\n    parent_session_id    <span class=\"token keyword\">TEXT<\/span><span class=\"token punctuation\">,<\/span>          <span class=\"token comment\">&#8212; \u7236\u4f1a\u8bdd\u6301\u4e45ID<\/span><br \/>\n    state                <span class=\"token keyword\">TEXT<\/span><span class=\"token punctuation\">,<\/span>          <span class=\"token comment\">&#8212; running\/finalizing\/completed\/error\/stalled\/unknown<\/span><br \/>\n    dispatched_at        <span class=\"token keyword\">REAL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    updated_at           <span class=\"token keyword\">REAL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    completed_at         <span class=\"token keyword\">REAL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    event_json           <span class=\"token keyword\">TEXT<\/span><span class=\"token punctuation\">,<\/span>          <span class=\"token comment\">&#8212; \u5b8c\u6210\u4e8b\u4ef6JSON<\/span><br \/>\n    result_json          <span class=\"token keyword\">TEXT<\/span><span class=\"token punctuation\">,<\/span>          <span class=\"token comment\">&#8212; \u7ed3\u679cJSON<\/span><br \/>\n    delivery_state       <span class=\"token keyword\">TEXT<\/span><span class=\"token punctuation\">,<\/span>          <span class=\"token comment\">&#8212; pending\/delivered\/dropped<\/span><br \/>\n    delivery_attempts    <span class=\"token keyword\">INTEGER<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    delivery_claim       <span class=\"token keyword\">TEXT<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    delivery_claimed_at  <span class=\"token keyword\">REAL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    delivered_at         <span class=\"token keyword\">REAL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    owner_pid            <span class=\"token keyword\">INTEGER<\/span><span class=\"token punctuation\">,<\/span>       <span class=\"token comment\">&#8212; \u6d3e\u53d1\u8fdb\u7a0bPID<\/span><br \/>\n    owner_started_at     <span class=\"token keyword\">REAL<\/span><span class=\"token punctuation\">,<\/span>          <span class=\"token comment\">&#8212; \u8fdb\u7a0b\u542f\u52a8\u65f6\u95f4(\u533a\u5206PID\u590d\u7528)<\/span><br \/>\n    task_json            <span class=\"token keyword\">TEXT<\/span><span class=\"token punctuation\">,<\/span>          <span class=\"token comment\">&#8212; \u4efb\u52a1\u8f7d\u8377JSON<\/span><br \/>\n    origin_session_id    <span class=\"token keyword\">TEXT<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>15.2 \u6295\u9012\u72b6\u6001\u673a<\/h4>\n<p>#mermaid-svg-srqUKBoGyHtY5D8z{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-srqUKBoGyHtY5D8z .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-srqUKBoGyHtY5D8z .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-srqUKBoGyHtY5D8z .error-icon{fill:#552222;}#mermaid-svg-srqUKBoGyHtY5D8z .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-srqUKBoGyHtY5D8z .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-srqUKBoGyHtY5D8z .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-srqUKBoGyHtY5D8z .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-srqUKBoGyHtY5D8z .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-srqUKBoGyHtY5D8z .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-srqUKBoGyHtY5D8z .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-srqUKBoGyHtY5D8z .marker{fill:#333333;stroke:#333333;}#mermaid-svg-srqUKBoGyHtY5D8z .marker.cross{stroke:#333333;}#mermaid-svg-srqUKBoGyHtY5D8z svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-srqUKBoGyHtY5D8z p{margin:0;}#mermaid-svg-srqUKBoGyHtY5D8z defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-srqUKBoGyHtY5D8z g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-srqUKBoGyHtY5D8z g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-srqUKBoGyHtY5D8z g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-srqUKBoGyHtY5D8z g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-srqUKBoGyHtY5D8z g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-srqUKBoGyHtY5D8z .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-srqUKBoGyHtY5D8z .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-srqUKBoGyHtY5D8z .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-srqUKBoGyHtY5D8z .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-srqUKBoGyHtY5D8z .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-srqUKBoGyHtY5D8z .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-srqUKBoGyHtY5D8z .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-srqUKBoGyHtY5D8z .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-srqUKBoGyHtY5D8z .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-srqUKBoGyHtY5D8z .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-srqUKBoGyHtY5D8z .edgeLabel .label text{fill:#333;}#mermaid-svg-srqUKBoGyHtY5D8z .label div .edgeLabel{color:#333;}#mermaid-svg-srqUKBoGyHtY5D8z .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-srqUKBoGyHtY5D8z .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-srqUKBoGyHtY5D8z .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-srqUKBoGyHtY5D8z .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-srqUKBoGyHtY5D8z .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-srqUKBoGyHtY5D8z .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-srqUKBoGyHtY5D8z .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-srqUKBoGyHtY5D8z #statediagram-barbEnd{fill:#333333;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-srqUKBoGyHtY5D8z .cluster-label,#mermaid-svg-srqUKBoGyHtY5D8z .nodeLabel{color:#131300;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-srqUKBoGyHtY5D8z .note-edge{stroke-dasharray:5;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-note text{fill:black;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram-note .nodeLabel{color:black;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagram .edgeLabel{color:red;}#mermaid-svg-srqUKBoGyHtY5D8z #dependencyStart,#mermaid-svg-srqUKBoGyHtY5D8z #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-srqUKBoGyHtY5D8z .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-srqUKBoGyHtY5D8z :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/p>\n<p>_persist_dispatch()<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>complete_completion_delivery()\u539f\u5b50\u786e\u8ba4\u6210\u529f\u6295\u9012<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>drop_completion_delivery()\u76ee\u6807\u6c38\u4e45\u6d88\u5931(\/new\/reset)<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>release_completion_delivery()attempts &gt;&#061; MAX(8)<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>defer_completion_delivery()\u4e0d\u6d88\u8017attempt\u8fd4\u56depending<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>pending<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>delivered<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>dropped<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>claim_completion_delivery():\u539f\u5b50claim\u9632\u6b62\u591aconsumer\u7ade\u4e89delivery_attempts &#043; 1300\u79d2\u540e\u65e7claim\u53ef\u88ab\u62a2\u5360<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/span><\/p>\n<h4>15.3 \u5d29\u6e83\u6062\u590d\u6d41\u7a0b<\/h4>\n<p>#mermaid-svg-IZX2skRZz371Q2dY{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IZX2skRZz371Q2dY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IZX2skRZz371Q2dY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IZX2skRZz371Q2dY .error-icon{fill:#552222;}#mermaid-svg-IZX2skRZz371Q2dY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IZX2skRZz371Q2dY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IZX2skRZz371Q2dY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IZX2skRZz371Q2dY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IZX2skRZz371Q2dY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IZX2skRZz371Q2dY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IZX2skRZz371Q2dY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IZX2skRZz371Q2dY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IZX2skRZz371Q2dY .marker.cross{stroke:#333333;}#mermaid-svg-IZX2skRZz371Q2dY svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IZX2skRZz371Q2dY p{margin:0;}#mermaid-svg-IZX2skRZz371Q2dY .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-IZX2skRZz371Q2dY .cluster-label text{fill:#333;}#mermaid-svg-IZX2skRZz371Q2dY .cluster-label span{color:#333;}#mermaid-svg-IZX2skRZz371Q2dY .cluster-label span p{background-color:transparent;}#mermaid-svg-IZX2skRZz371Q2dY .label text,#mermaid-svg-IZX2skRZz371Q2dY span{fill:#333;color:#333;}#mermaid-svg-IZX2skRZz371Q2dY .node rect,#mermaid-svg-IZX2skRZz371Q2dY .node circle,#mermaid-svg-IZX2skRZz371Q2dY .node ellipse,#mermaid-svg-IZX2skRZz371Q2dY .node polygon,#mermaid-svg-IZX2skRZz371Q2dY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IZX2skRZz371Q2dY .rough-node .label text,#mermaid-svg-IZX2skRZz371Q2dY .node .label text,#mermaid-svg-IZX2skRZz371Q2dY .image-shape .label,#mermaid-svg-IZX2skRZz371Q2dY .icon-shape .label{text-anchor:middle;}#mermaid-svg-IZX2skRZz371Q2dY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IZX2skRZz371Q2dY .rough-node .label,#mermaid-svg-IZX2skRZz371Q2dY .node .label,#mermaid-svg-IZX2skRZz371Q2dY .image-shape .label,#mermaid-svg-IZX2skRZz371Q2dY .icon-shape .label{text-align:center;}#mermaid-svg-IZX2skRZz371Q2dY .node.clickable{cursor:pointer;}#mermaid-svg-IZX2skRZz371Q2dY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IZX2skRZz371Q2dY .arrowheadPath{fill:#333333;}#mermaid-svg-IZX2skRZz371Q2dY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IZX2skRZz371Q2dY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IZX2skRZz371Q2dY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IZX2skRZz371Q2dY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IZX2skRZz371Q2dY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IZX2skRZz371Q2dY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IZX2skRZz371Q2dY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IZX2skRZz371Q2dY .cluster text{fill:#333;}#mermaid-svg-IZX2skRZz371Q2dY .cluster span{color:#333;}#mermaid-svg-IZX2skRZz371Q2dY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IZX2skRZz371Q2dY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IZX2skRZz371Q2dY rect.text{fill:none;stroke-width:0;}#mermaid-svg-IZX2skRZz371Q2dY .icon-shape,#mermaid-svg-IZX2skRZz371Q2dY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IZX2skRZz371Q2dY .icon-shape p,#mermaid-svg-IZX2skRZz371Q2dY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IZX2skRZz371Q2dY .icon-shape rect,#mermaid-svg-IZX2skRZz371Q2dY .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IZX2skRZz371Q2dY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IZX2skRZz371Q2dY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IZX2skRZz371Q2dY :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8fdb\u7a0b\u91cd\u542f<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>recover_abandoned_delegations()<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>SELECT * FROM async_delegationsWHERE state IN (&#039;running&#039;,&#039;finalizing&#039;)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>for each row:<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>owner_pid\u5b58\u5728\u4e14\u8fdb\u7a0b\u5b58\u6d3b\u4e14\u542f\u52a8\u65f6\u95f4\u5339\u914d?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8df3\u8fc7&#xff1a;\u8fdb\u7a0b\u4ecd\u5728\u8fd0\u884c<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5206\u7c7b\u4e3aunknown<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6709partial results?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_recovered_results()\u5df2\u8bb0\u5f55\u7684children\u4fdd\u6301\u771f\u5b9e\u7ed3\u679c\u672a\u8bb0\u5f55\u7684\u6807\u8bb0unknown<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6240\u6709children\u6807\u8bb0unknown<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>UPDATE state&#061;&#039;unknown&#039;,event_json&#061;&#8230;, result_json&#061;&#8230;<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>restore_undelivered_completions()<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>SELECT * FROM async_delegationsWHERE state !&#061; &#039;running&#039;AND delivery_state&#061;&#039;pending&#039;AND event_json IS NOT NULL<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>for each row:<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>age &gt; 48h?<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>UPDATE delivery_state&#061;&#039;dropped&#039;WARNING: \u592a\u65e7\u4e0d\u91cd\u653e<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>evt.restored &#061; Truetarget_queue.put(evt)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6062\u590d\u5b8c\u6210<\/p>\n<p><\/span><\/p>\n<p>\u5173\u952e\u6062\u590d\u53c2\u6570&#xff1a;<\/p>\n<ul>\n<li>_MAX_RETAINED_COMPLETED &#061; 50&#xff1a;\u5185\u5b58\u4e2d\u4fdd\u7559\u7684\u5df2\u5b8c\u6210\u8bb0\u5f55\u4e0a\u9650<\/li>\n<li>_DURABLE_RETENTION_SECONDS &#061; 7 * 24 * 3600&#xff1a;SQLite\u4e2ddelivered\u8bb0\u5f55\u4fdd\u75597\u5929<\/li>\n<li>_MAX_DURABLE_PENDING &#061; 1000&#xff1a;pending\u8bb0\u5f55\u4e0a\u9650<\/li>\n<li>_MAX_DELIVERY_ATTEMPTS &#061; 8&#xff1a;\u6295\u9012\u5c1d\u8bd5\u4e0a\u9650&#xff0c;\u8d85\u8fc7\u540eterminally dropped<\/li>\n<li>_MAX_COMPLETION_REPLAY_AGE_S &#061; 48 * 3600&#xff1a;48\u5c0f\u65f6\u4ee5\u4e0a\u7684pending\u4e0d\u91cd\u653e<\/li>\n<\/ul>\n<h4>15.4 _transaction() \u8fde\u63a5\u7ba1\u7406<\/h4>\n<p><span class=\"token decorator annotation punctuation\">&#064;contextmanager<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">_transaction<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Iterator<span class=\"token punctuation\">[<\/span>sqlite3<span class=\"token punctuation\">.<\/span>Connection<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;Open a connection, commit\/rollback on exit, and ALWAYS close it&#034;&#034;&#034;<\/span><br \/>\n    conn <span class=\"token operator\">&#061;<\/span> _connect<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\">with<\/span> conn<span class=\"token punctuation\">:<\/span>  <span class=\"token comment\"># commit\/rollback<\/span><br \/>\n            <span class=\"token keyword\">yield<\/span> conn<br \/>\n    <span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        conn<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># __enter__\/__exit__\u53ea\u63d0\u4ea4\/\u56de\u6eda&#xff0c;\u4e0d\u5173\u95ed\u8fde\u63a5&#xff01;<\/span><\/p>\n<p>\u5173\u952e\u4fee\u590d&#xff08;#69567\/#69594&#xff09;&#xff1a;<\/p>\n<ul>\n<li>with conn:\u53ea\u63d0\u4ea4\/\u56de\u6eda\u4e8b\u52a1&#xff0c;\u4e0d\u5173\u95ed\u8fde\u63a5<\/li>\n<li>\u5355\u7528with _connect()\u4f1a\u6cc4\u6f0f\u8fde\u63a5\u548cWAL\/SHM\u6587\u4ef6\u63cf\u8ff0\u7b26<\/li>\n<li>\u957f\u671f\u8fd0\u884c\u7684gateway\u4f1a\u8017\u5c3dRLIMIT_NOFILE<\/li>\n<li>finally: conn.close()\u786e\u4fdd\u6bcf\u6b21\u90fd\u5173\u95ed<\/li>\n<\/ul>\n<h4>15.5 record_unit_child() \u589e\u91cf\u6301\u4e45\u5316<\/h4>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">record_unit_child<\/span><span class=\"token punctuation\">(<\/span>delegation_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> entry<span class=\"token punctuation\">:<\/span> Dict<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> Any<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 boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4e3a\u591a\u5b50\u4ee3\u7406\u5355\u5143\u7684\u6bcf\u4e2a\u5b8c\u6210\u7684child\u6301\u4e45\u5316\u7ed3\u679c&#xff0c;\u5d29\u6e83\u540e\u53ea\u4e22\u5931\u672a\u5b8c\u6210\u7684&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> _DB_LOCK<span class=\"token punctuation\">,<\/span> _transaction<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> conn<span class=\"token punctuation\">:<\/span><br \/>\n        row <span class=\"token operator\">&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>execute<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;SELECT result_json FROM async_delegations WHERE state&#061;&#039;running&#039;&#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><span class=\"token punctuation\">.<\/span>fetchone<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> row <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><br \/>\n        partial <span class=\"token operator\">&#061;<\/span> json<span class=\"token punctuation\">.<\/span>loads<span class=\"token punctuation\">(<\/span>row<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token string\">&#034;{}&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        results <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> partial<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;results&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">if<\/span> r<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;task_index&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> entry<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;task_index&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        results<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>entry<span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># \u66ff\u6362\u540ctask_index\u7684\u65e7\u8bb0\u5f55<\/span><br \/>\n        conn<span class=\"token punctuation\">.<\/span>execute<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;UPDATE result_json&#061;?, updated_at&#061;? WHERE state&#061;&#039;running&#039;&#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>\u573a\u666f&#xff1a;1393\u4e2aagent\u7684\u6279\u91cf\u8fd0\u884c\u4e2d&#xff0c;wave-1\u7684\u6240\u6709child\u572808:29\u7684401\u98ce\u66b4\u4e2d\u6b7b\u4ea1&#xff0c;\u7236\u4ee3\u7406\u572809:36\u624d\u6536\u5230&#034;unknown outcome&#034;\u5757\u2014\u201466\u5206\u949f\u65e0\u4efb\u4f55\u8fd0\u884c\u3002\u589e\u91cf\u6301\u4e45\u5316\u8ba9\u5df2\u5b8c\u6210\u7684children\u7ed3\u679c\u5728\u5d29\u6e83\u540e\u4ecd\u7136\u53ef\u7528\u3002<\/p>\n<hr \/>\n<h3>16. \u505c\u6ede\u76d1\u63a7 _stale_monitor_loop<\/h3>\n<h4>16.1 \u76d1\u63a7\u6d41\u7a0b<\/h4>\n<p>#mermaid-svg-fUIf5QWu1zLSqJUG{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fUIf5QWu1zLSqJUG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fUIf5QWu1zLSqJUG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fUIf5QWu1zLSqJUG .error-icon{fill:#552222;}#mermaid-svg-fUIf5QWu1zLSqJUG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fUIf5QWu1zLSqJUG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fUIf5QWu1zLSqJUG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fUIf5QWu1zLSqJUG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fUIf5QWu1zLSqJUG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fUIf5QWu1zLSqJUG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fUIf5QWu1zLSqJUG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fUIf5QWu1zLSqJUG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fUIf5QWu1zLSqJUG .marker.cross{stroke:#333333;}#mermaid-svg-fUIf5QWu1zLSqJUG svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fUIf5QWu1zLSqJUG p{margin:0;}#mermaid-svg-fUIf5QWu1zLSqJUG .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-fUIf5QWu1zLSqJUG .cluster-label text{fill:#333;}#mermaid-svg-fUIf5QWu1zLSqJUG .cluster-label span{color:#333;}#mermaid-svg-fUIf5QWu1zLSqJUG .cluster-label span p{background-color:transparent;}#mermaid-svg-fUIf5QWu1zLSqJUG .label text,#mermaid-svg-fUIf5QWu1zLSqJUG span{fill:#333;color:#333;}#mermaid-svg-fUIf5QWu1zLSqJUG .node rect,#mermaid-svg-fUIf5QWu1zLSqJUG .node circle,#mermaid-svg-fUIf5QWu1zLSqJUG .node ellipse,#mermaid-svg-fUIf5QWu1zLSqJUG .node polygon,#mermaid-svg-fUIf5QWu1zLSqJUG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fUIf5QWu1zLSqJUG .rough-node .label text,#mermaid-svg-fUIf5QWu1zLSqJUG .node .label text,#mermaid-svg-fUIf5QWu1zLSqJUG .image-shape .label,#mermaid-svg-fUIf5QWu1zLSqJUG .icon-shape .label{text-anchor:middle;}#mermaid-svg-fUIf5QWu1zLSqJUG .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fUIf5QWu1zLSqJUG .rough-node .label,#mermaid-svg-fUIf5QWu1zLSqJUG .node .label,#mermaid-svg-fUIf5QWu1zLSqJUG .image-shape .label,#mermaid-svg-fUIf5QWu1zLSqJUG .icon-shape .label{text-align:center;}#mermaid-svg-fUIf5QWu1zLSqJUG .node.clickable{cursor:pointer;}#mermaid-svg-fUIf5QWu1zLSqJUG .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fUIf5QWu1zLSqJUG .arrowheadPath{fill:#333333;}#mermaid-svg-fUIf5QWu1zLSqJUG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fUIf5QWu1zLSqJUG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fUIf5QWu1zLSqJUG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fUIf5QWu1zLSqJUG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fUIf5QWu1zLSqJUG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fUIf5QWu1zLSqJUG .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fUIf5QWu1zLSqJUG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fUIf5QWu1zLSqJUG .cluster text{fill:#333;}#mermaid-svg-fUIf5QWu1zLSqJUG .cluster span{color:#333;}#mermaid-svg-fUIf5QWu1zLSqJUG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fUIf5QWu1zLSqJUG .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fUIf5QWu1zLSqJUG rect.text{fill:none;stroke-width:0;}#mermaid-svg-fUIf5QWu1zLSqJUG .icon-shape,#mermaid-svg-fUIf5QWu1zLSqJUG .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fUIf5QWu1zLSqJUG .icon-shape p,#mermaid-svg-fUIf5QWu1zLSqJUG .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fUIf5QWu1zLSqJUG .icon-shape rect,#mermaid-svg-fUIf5QWu1zLSqJUG .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fUIf5QWu1zLSqJUG .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fUIf5QWu1zLSqJUG .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fUIf5QWu1zLSqJUG :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>stalling<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>running &#043; has progress_fn<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5176\u4ed6<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_dispatch() with progress_fn<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_ensure_stale_monitor()<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>monitor_thread\u5b58\u6d3b?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8fd4\u56de<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>\u542f\u52a8daemon threadname&#061;&#039;async-delegate-stale-monitor&#039;<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>while not _monitor_stop.wait(30s):<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_sweep_stale_locked(now)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>for each record:<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>status<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>now &#8211; _interrupted_at &gt;&#061; 120s?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u52a0\u5165expired\u5217\u8868\u5f3a\u5236\u7ec8\u7ed3\u5316<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4fdd\u6301stalling<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_started?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6392\u961f\u4e2d&#xff0c;\u4e0d\u8ba1\u505c\u6ede<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>token, in_tool &#061; progress_fn()<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>token !&#061; _progress_token?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>update _progress_token, _progress_ts&#061;now\u6709\u8fdb\u5c55<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>quiet_for &#061; now &#8211; _progress_ts<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>limit &#061; 1200s if in_tool else 450s<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>quiet_for &gt;&#061; limit?<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>status&#061;&#039;stalling&#039;_interrupted_at&#061;now\u8bb0\u5f55stall\u5143\u6570\u636e<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4fdd\u6301running<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8df3\u8fc7<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_call_interrupt(interrupt_fn)\u8c03\u7528\u5b50\u4ee3\u7406\u4e2d\u65ad<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>_finalize(id, _stalled_result, &#039;stalled&#039;)\u5f3a\u5236\u7ec8\u7ed3\u5316<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>any_monitorable?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>return\u76d1\u63a7\u7ebf\u7a0b\u9000\u51fa<\/p>\n<p><\/span><\/p>\n<h4>16.2 \u9608\u503c\u53c2\u6570<\/h4>\n<table>\n<tr>\u53c2\u6570\u503c\u542b\u4e49<\/tr>\n<tbody>\n<tr>\n<td>_STALE_CHECK_INTERVAL<\/td>\n<td>30\u79d2<\/td>\n<td>\u76d1\u63a7\u7ebf\u7a0b\u626b\u63cf\u95f4\u9694<\/td>\n<\/tr>\n<tr>\n<td>_STALE_IDLE_SECONDS<\/td>\n<td>450\u79d2 (7.5\u5206\u949f)<\/td>\n<td>idle\u72b6\u6001\u505c\u6ede\u9608\u503c<\/td>\n<\/tr>\n<tr>\n<td>_STALE_IN_TOOL_SECONDS<\/td>\n<td>1200\u79d2 (20\u5206\u949f)<\/td>\n<td>in-tool\u72b6\u6001\u505c\u6ede\u9608\u503c<\/td>\n<\/tr>\n<tr>\n<td>_STALL_GRACE_SECONDS<\/td>\n<td>120\u79d2 (2\u5206\u949f)<\/td>\n<td>stalling\u2192\u5f3a\u5236\u7ec8\u7ed3\u5316\u7684\u5bbd\u9650\u7a97\u53e3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>16.3 _stalled_result() \u5408\u6210\u7ed3\u679c<\/h4>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">_stalled_result<\/span><span class=\"token punctuation\">(<\/span>delegation_id<span class=\"token punctuation\">,<\/span> event_record<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Dict<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> Any<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    error <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Async delegation <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>delegation_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> stalled: the detached subagent stopped making progress &#034;<\/span><\/span><br \/>\n        <span class=\"token string\">&#034;(no new API calls, tool activity, or streamed tokens), did not respond to interruption, and never &#034;<\/span><br \/>\n        <span class=\"token string\">&#034;produced a completion event. The worker may be wedged inside a model API call&#8230;&#034;<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    stall_meta <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;stalled_after_quiet_seconds&#034;<\/span><span class=\"token punctuation\">:<\/span> event_record<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;_stall_quiet_seconds&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;stall_threshold_seconds&#034;<\/span><span class=\"token punctuation\">:<\/span> event_record<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;_stall_threshold_seconds&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;stall_phase&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;in_tool&#034;<\/span> <span class=\"token keyword\">if<\/span> stall_in_tool <span class=\"token keyword\">else<\/span> <span class=\"token string\">&#034;idle&#034;<\/span> <span class=\"token keyword\">if<\/span> stall_in_tool <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><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;stall_grace_seconds&#034;<\/span><span class=\"token punctuation\">:<\/span> _STALL_GRACE_SECONDS<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> event_record<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;is_batch&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token operator\">**<\/span>_batch_crash<span class=\"token punctuation\">(<\/span>error<span class=\"token punctuation\">,<\/span> duration<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>stall_meta<span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token operator\">**<\/span>_single_crash<span class=\"token punctuation\">(<\/span>error<span class=\"token punctuation\">,<\/span> duration<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;stalled&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;exit_reason&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;stalled&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>stall_meta<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u7ed3\u6784\u5316stall\u5143\u6570\u636e\u8ba9\u7236\u4ee3\u7406\/UI\u533a\u5206stall-monitor kill\u548c\u5176\u4ed6\u5931\u8d25&#xff0c;\u65e0\u9700\u89e3\u6790error\u5b57\u7b26\u4e32\u3002<\/p>\n<hr \/>\n<h3>17. \u5b9e\u65f6\u8f6c\u5f55\u65e5\u5fd7<\/h3>\n<h4>17.1 LiveTranscriptWriter \u67b6\u6784<\/h4>\n<p>#mermaid-svg-jU4pY3AGOEsWqH6a{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jU4pY3AGOEsWqH6a .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jU4pY3AGOEsWqH6a .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jU4pY3AGOEsWqH6a .error-icon{fill:#552222;}#mermaid-svg-jU4pY3AGOEsWqH6a .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jU4pY3AGOEsWqH6a .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jU4pY3AGOEsWqH6a .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jU4pY3AGOEsWqH6a .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jU4pY3AGOEsWqH6a .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jU4pY3AGOEsWqH6a .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jU4pY3AGOEsWqH6a .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jU4pY3AGOEsWqH6a .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jU4pY3AGOEsWqH6a .marker.cross{stroke:#333333;}#mermaid-svg-jU4pY3AGOEsWqH6a svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jU4pY3AGOEsWqH6a p{margin:0;}#mermaid-svg-jU4pY3AGOEsWqH6a .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-jU4pY3AGOEsWqH6a .cluster-label text{fill:#333;}#mermaid-svg-jU4pY3AGOEsWqH6a .cluster-label span{color:#333;}#mermaid-svg-jU4pY3AGOEsWqH6a .cluster-label span p{background-color:transparent;}#mermaid-svg-jU4pY3AGOEsWqH6a .label text,#mermaid-svg-jU4pY3AGOEsWqH6a span{fill:#333;color:#333;}#mermaid-svg-jU4pY3AGOEsWqH6a .node rect,#mermaid-svg-jU4pY3AGOEsWqH6a .node circle,#mermaid-svg-jU4pY3AGOEsWqH6a .node ellipse,#mermaid-svg-jU4pY3AGOEsWqH6a .node polygon,#mermaid-svg-jU4pY3AGOEsWqH6a .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jU4pY3AGOEsWqH6a .rough-node .label text,#mermaid-svg-jU4pY3AGOEsWqH6a .node .label text,#mermaid-svg-jU4pY3AGOEsWqH6a .image-shape .label,#mermaid-svg-jU4pY3AGOEsWqH6a .icon-shape .label{text-anchor:middle;}#mermaid-svg-jU4pY3AGOEsWqH6a .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jU4pY3AGOEsWqH6a .rough-node .label,#mermaid-svg-jU4pY3AGOEsWqH6a .node .label,#mermaid-svg-jU4pY3AGOEsWqH6a .image-shape .label,#mermaid-svg-jU4pY3AGOEsWqH6a .icon-shape .label{text-align:center;}#mermaid-svg-jU4pY3AGOEsWqH6a .node.clickable{cursor:pointer;}#mermaid-svg-jU4pY3AGOEsWqH6a .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jU4pY3AGOEsWqH6a .arrowheadPath{fill:#333333;}#mermaid-svg-jU4pY3AGOEsWqH6a .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jU4pY3AGOEsWqH6a .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jU4pY3AGOEsWqH6a .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jU4pY3AGOEsWqH6a .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jU4pY3AGOEsWqH6a .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jU4pY3AGOEsWqH6a .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jU4pY3AGOEsWqH6a .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jU4pY3AGOEsWqH6a .cluster text{fill:#333;}#mermaid-svg-jU4pY3AGOEsWqH6a .cluster span{color:#333;}#mermaid-svg-jU4pY3AGOEsWqH6a div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jU4pY3AGOEsWqH6a .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jU4pY3AGOEsWqH6a rect.text{fill:none;stroke-width:0;}#mermaid-svg-jU4pY3AGOEsWqH6a .icon-shape,#mermaid-svg-jU4pY3AGOEsWqH6a .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jU4pY3AGOEsWqH6a .icon-shape p,#mermaid-svg-jU4pY3AGOEsWqH6a .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jU4pY3AGOEsWqH6a .icon-shape rect,#mermaid-svg-jU4pY3AGOEsWqH6a .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jU4pY3AGOEsWqH6a .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jU4pY3AGOEsWqH6a .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jU4pY3AGOEsWqH6a :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>create_live_transcripts()<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>LiveTranscriptWriter(delegation_id, task_index, goal, context)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u521b\u5efa\u76ee\u5f55 cache\/delegation\/live\/\/<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5199\u5165 HH:MM:SS role | text<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>event(&#039;user&#039;, &#039;kickoff: &#039; &#043; goal)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_ok &#061; True, path &#061; task-N.log<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>observe(event_type, tool_name, preview, args, kwargs)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_OBSERVERS demux:<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>tool.started \u2192 tool_start(name, args_preview)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>tool.completed \u2192 tool_result(name, result, duration, is_error)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_thinking \u2192 thinking(text)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>reasoning.available \u2192 thinking(text)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>subagent.text \u2192 add_stream_delta(delta)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>subagent.start \u2192 event(&#039;start&#039;, goal)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>subagent.complete \u2192 _on_complete(status, duration, summary)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>event(role, text)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_stream_buf.append(delta)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_stream_len &gt;&#061; 4000?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>flush_stream()<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u7b49\u5f85\u66f4\u591adelta<\/p>\n<p><\/span><span style=\"color:#000 !important\" class=\"nodeLabel\"><\/p>\n<p>_redact(text)redact_sensitive_text(force&#061;True)<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5199\u5165\u5931\u8d25?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>_ok &#061; False\u540e\u7eed\u8c03\u7528\u53d8\u4e3adebug-logged no-op<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u7ee7\u7eed<\/p>\n<p><\/span><\/p>\n<h4>17.2 \u5b89\u5168\u8bbe\u8ba1<\/h4>\n<p>\u6bcf\u884c\u6587\u672c\u901a\u8fc7_redact()\u5f3a\u5236\u8131\u654f&#xff1a;<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">_redact<\/span><span class=\"token punctuation\">(<\/span>text<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\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> text<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> text<br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">from<\/span> agent<span class=\"token punctuation\">.<\/span>redact <span class=\"token keyword\">import<\/span> redact_sensitive_text<br \/>\n        <span class=\"token keyword\">return<\/span> redact_sensitive_text<span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">,<\/span> force<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> Exception<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;[line withheld: redaction unavailable]&#034;<\/span>  <span class=\"token comment\"># \u5931\u8d25\u65f6\u6263\u7559\u800c\u975e\u6cc4\u9732<\/span><\/p>\n<ul>\n<li>force&#061;True&#xff1a;\u5373\u4f7f\u5168\u5c40toggle\u5173\u95ed\u4e5f\u5f3a\u5236\u8131\u654f&#xff08;\u5b89\u5168\u8fb9\u754c&#xff09;<\/li>\n<li>redactor\u4e0d\u53ef\u7528\u65f6\u6263\u7559\u6574\u884c\u800c\u975e\u6cc4\u9732<\/li>\n<li>cache\/delegation\u88ab\u53ea\u8bfb\u6302\u8f7d\u5230\u8fdc\u7a0b\u7ec8\u7aef\u540e\u7aef&#xff0c;\u6bcf\u884c\u90fd\u5fc5\u987b\u51ed\u8bc1\u8131\u654f<\/li>\n<\/ul>\n<h4>17.3 \u622a\u65ad\u9884\u7b97<\/h4>\n<table>\n<tr>\u4e8b\u4ef6\u7c7b\u578b\u9650\u5236\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>assistant_text<\/td>\n<td>600 chars<\/td>\n<td>\u52a9\u624b\u56de\u590d\u6587\u672c<\/td>\n<\/tr>\n<tr>\n<td>thinking<\/td>\n<td>300 chars<\/td>\n<td>\u63a8\u7406\u6587\u672c<\/td>\n<\/tr>\n<tr>\n<td>tool args<\/td>\n<td>220 chars<\/td>\n<td>\u5de5\u5177\u53c2\u6570\u9884\u89c8<\/td>\n<\/tr>\n<tr>\n<td>tool result<\/td>\n<td>400 chars<\/td>\n<td>\u5de5\u5177\u7ed3\u679c\u9884\u89c8<\/td>\n<\/tr>\n<tr>\n<td>kickoff<\/td>\n<td>500 chars<\/td>\n<td>\u542f\u52a8\u6d88\u606f<\/td>\n<\/tr>\n<tr>\n<td>stream buffer<\/td>\n<td>4000 chars<\/td>\n<td>\u6d41\u5f0fdelta\u7f13\u51b2flush\u9608\u503c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8f6c\u5f55\u65e5\u5fd7\u662f\u7d27\u51d1\u7684\u64cd\u4f5c\u89c6\u56fe&#xff1b;\u5b8c\u6574\u6587\u672c\u5728SessionDB transcript\u548csummary spill\u6587\u4ef6\u4e2d\u3002<\/p>\n<h4>17.4 \u4fdd\u7559\u7b56\u7565<\/h4>\n<p>LIVE_RETENTION_DAYS <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">7<\/span><\/p>\n<p>7\u5929\u4fdd\u7559&#xff0c;\u901a\u8fc7update_manifest_statuses()\u66f4\u65b0manifest\u4e2d\u7684\u72b6\u6001&#xff0c;\u5728\u540e\u7eeddispatch\u65f6\u4fee\u526a\u65e7\u76ee\u5f55\u3002<\/p>\n<hr \/>\n<h3>18. \u8bbe\u8ba1\u4eae\u70b9\u4e0e\u5173\u952e\u51b3\u7b56<\/h3>\n<h4>18.1 \u5341\u5927\u8bbe\u8ba1\u4eae\u70b9<\/h4>\n<p>#mermaid-svg-l5A4xwWZJQA1Enkx{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-l5A4xwWZJQA1Enkx .error-icon{fill:#552222;}#mermaid-svg-l5A4xwWZJQA1Enkx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-l5A4xwWZJQA1Enkx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-l5A4xwWZJQA1Enkx .marker.cross{stroke:#333333;}#mermaid-svg-l5A4xwWZJQA1Enkx svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-l5A4xwWZJQA1Enkx p{margin:0;}#mermaid-svg-l5A4xwWZJQA1Enkx .edge{stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .section&#8211;1 rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section&#8211;1 path,#mermaid-svg-l5A4xwWZJQA1Enkx .section&#8211;1 circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section&#8211;1 polygon,#mermaid-svg-l5A4xwWZJQA1Enkx .section&#8211;1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section&#8211;1 text{fill:#ffffff;}#mermaid-svg-l5A4xwWZJQA1Enkx .node-icon&#8211;1{font-size:40px;color:#ffffff;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-edge&#8211;1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-depth&#8211;1{stroke-width:17;}#mermaid-svg-l5A4xwWZJQA1Enkx .section&#8211;1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled circle,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:lightgray;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:#efefef;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-0 rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section-0 path,#mermaid-svg-l5A4xwWZJQA1Enkx .section-0 circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section-0 polygon,#mermaid-svg-l5A4xwWZJQA1Enkx .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section-0 text{fill:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .node-icon-0{font-size:40px;color:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-depth-0{stroke-width:14;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled circle,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:lightgray;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:#efefef;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-1 rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section-1 path,#mermaid-svg-l5A4xwWZJQA1Enkx .section-1 circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section-1 polygon,#mermaid-svg-l5A4xwWZJQA1Enkx .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section-1 text{fill:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .node-icon-1{font-size:40px;color:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-depth-1{stroke-width:11;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled circle,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:lightgray;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:#efefef;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-2 rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section-2 path,#mermaid-svg-l5A4xwWZJQA1Enkx .section-2 circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section-2 polygon,#mermaid-svg-l5A4xwWZJQA1Enkx .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section-2 text{fill:#ffffff;}#mermaid-svg-l5A4xwWZJQA1Enkx .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-depth-2{stroke-width:8;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled circle,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:lightgray;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:#efefef;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-3 rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section-3 path,#mermaid-svg-l5A4xwWZJQA1Enkx .section-3 circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section-3 polygon,#mermaid-svg-l5A4xwWZJQA1Enkx .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section-3 text{fill:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .node-icon-3{font-size:40px;color:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-depth-3{stroke-width:5;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled circle,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:lightgray;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:#efefef;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-4 rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section-4 path,#mermaid-svg-l5A4xwWZJQA1Enkx .section-4 circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section-4 polygon,#mermaid-svg-l5A4xwWZJQA1Enkx .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section-4 text{fill:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .node-icon-4{font-size:40px;color:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-depth-4{stroke-width:2;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled circle,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:lightgray;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:#efefef;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-5 rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section-5 path,#mermaid-svg-l5A4xwWZJQA1Enkx .section-5 circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section-5 polygon,#mermaid-svg-l5A4xwWZJQA1Enkx .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section-5 text{fill:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .node-icon-5{font-size:40px;color:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-depth-5{stroke-width:-1;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled circle,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:lightgray;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:#efefef;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-6 rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section-6 path,#mermaid-svg-l5A4xwWZJQA1Enkx .section-6 circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section-6 polygon,#mermaid-svg-l5A4xwWZJQA1Enkx .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section-6 text{fill:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .node-icon-6{font-size:40px;color:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-depth-6{stroke-width:-4;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled circle,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:lightgray;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:#efefef;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-7 rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section-7 path,#mermaid-svg-l5A4xwWZJQA1Enkx .section-7 circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section-7 polygon,#mermaid-svg-l5A4xwWZJQA1Enkx .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section-7 text{fill:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .node-icon-7{font-size:40px;color:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-depth-7{stroke-width:-7;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled circle,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:lightgray;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:#efefef;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-8 rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section-8 path,#mermaid-svg-l5A4xwWZJQA1Enkx .section-8 circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section-8 polygon,#mermaid-svg-l5A4xwWZJQA1Enkx .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section-8 text{fill:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .node-icon-8{font-size:40px;color:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-depth-8{stroke-width:-10;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled circle,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:lightgray;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:#efefef;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-9 rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section-9 path,#mermaid-svg-l5A4xwWZJQA1Enkx .section-9 circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section-9 polygon,#mermaid-svg-l5A4xwWZJQA1Enkx .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section-9 text{fill:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .node-icon-9{font-size:40px;color:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-depth-9{stroke-width:-13;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled circle,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:lightgray;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:#efefef;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-10 rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section-10 path,#mermaid-svg-l5A4xwWZJQA1Enkx .section-10 circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section-10 polygon,#mermaid-svg-l5A4xwWZJQA1Enkx .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section-10 text{fill:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .node-icon-10{font-size:40px;color:black;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .edge-depth-10{stroke-width:-16;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled circle,#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:lightgray;}#mermaid-svg-l5A4xwWZJQA1Enkx .disabled text{fill:#efefef;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-root rect,#mermaid-svg-l5A4xwWZJQA1Enkx .section-root path,#mermaid-svg-l5A4xwWZJQA1Enkx .section-root circle,#mermaid-svg-l5A4xwWZJQA1Enkx .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-l5A4xwWZJQA1Enkx .section-root text{fill:#ffffff;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-root span{color:#ffffff;}#mermaid-svg-l5A4xwWZJQA1Enkx .section-2 span{color:#ffffff;}#mermaid-svg-l5A4xwWZJQA1Enkx .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-l5A4xwWZJQA1Enkx .edge{fill:none;}#mermaid-svg-l5A4xwWZJQA1Enkx .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-l5A4xwWZJQA1Enkx :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5b50\u4ee3\u7406\u59d4\u6d3e\u8bbe\u8ba1\u4eae\u70b9<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u9694\u79bb\u6027<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u72ec\u7acbsession_id\/task_id<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4e13\u7528SessionDB\u53e5\u67c4<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>skip_memory\/skip_context_files<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u53ef\u9009<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u53ef\u63a7\u6027<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5de5\u5177\u96c6\u53cc\u91cd\u5265\u79bb<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>depth-derived\u89d2\u8272<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6682\u505c\u5f00\u5173<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u975e\u4ea4\u4e92\u5ba1\u6279\u56de\u8c03<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u53ef\u89c2\u6d4b<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5b9e\u65f6\u8f6c\u5f55\u65e5\u5fd7<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8fdb\u5ea6\u56de\u8c03relay<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>tool_trace\u8ffd\u8e2a<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5fc3\u8df3\u76d1\u63a7<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u53ef\u6062\u590d<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>SQLite\u6301\u4e45\u5316\u8d26\u672c<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u589e\u91cfchild\u6301\u4e45\u5316<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5d29\u6e83\u6062\u590d<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>48h\u91cd\u653e\u7a97\u53e3<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u53ef\u63a7\u5236<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>list\/steer\/stop<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u53cc\u5c42\u6743\u9650\u9a8c\u8bc1<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4f20\u8f93\u69fd\u6743\u9650<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>missed_steer\u62a5\u544a<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6210\u672c\u53ef\u63a7<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>headroom<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u65e0ceiling<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6df1\u5ea6\u4e0a\u9650<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u538b\u7f29\u9608\u503c\u8986\u76d6<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Cache TTL\u964d\u7ea7<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5b89\u5168\u6027<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u51ed\u8bc1\u8131\u654f\u8f6c\u5f55<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u51ed\u8bc1\u6c60\u9694\u79bb<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>URL secret\u5265\u79bb<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8f93\u51faSchema\u9a8c\u8bc1<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5065\u58ee\u6027<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>daemon\u7ebf\u7a0b\u6c60<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>0.5s\u8f6e\u8be2\u4e2d\u65ad<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8d85\u65f6\u8bca\u65ad\u8f6c\u50a8<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>OpenSSL\u5b89\u5168<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u505c\u6ede\u76d1\u63a7&#043;\u5bbd\u9650\u7a97\u53e3<\/p>\n<p><\/span><\/p>\n<h4>18.2 \u5173\u952e\u8bbe\u8ba1\u51b3\u7b56\u603b\u7ed3<\/h4>\n<table>\n<tr>#\u51b3\u7b56\u539f\u56e0\u5f15\u7528<\/tr>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>\u5b50\u4ee3\u7406\u7528\u4e13\u7528SessionDB\u800c\u975e\u5171\u4eab\u7236\u4ee3\u7406\u7684<\/td>\n<td>\u7236\u53e5\u67c4\u53ef\u80fd\u5728\u5176\u751f\u547d\u5468\u671f\u4e2d\u88ab\u5173\u95ed&#xff0c;\u540e\u53f0child\u4ecd\u5728daemon\u7ebf\u7a0b\u5237\u65b0\u2192transcript\u9759\u9ed8\u4e22\u5931<\/td>\n<td>#81267<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>\u5bb9\u91cf\u6ee1\u65f6\u62d2\u7edd\u800c\u975e\u6392\u961f<\/td>\n<td>\u9632\u6b62\u5931\u63a7\u6a21\u578b\u5806\u79ef\u65e0\u754c\u540e\u53f0\u5de5\u4f5c<\/td>\n<td>\u8bbe\u8ba1\u51b3\u7b56<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>0.5\u79d2\u8f6e\u8be2\u800c\u975eas_completed()<\/td>\n<td>wedged child\u4e0d\u80fd\u6c38\u8fdc\u963b\u585e\u7236\u4ee3\u7406<\/td>\n<td>\u5065\u58ee\u6027<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>\u8d85\u65f6\u540e\u5ef6\u8fdf\u5173\u95ed\u800c\u975e\u7acb\u5373\u5173\u95ed<\/td>\n<td>worker\u901a\u5e38parked\u5728OpenSSL read\u4e2d&#xff0c;\u8de8\u7ebf\u7a0bFD\u91ca\u653e\u7834\u574f\u539f\u751f\u72b6\u6001<\/td>\n<td>#29507\/#70773<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>heartbeat\u7528\u5171\u4eabperiodic_scheduler<\/td>\n<td>\u4e0d\u662f\u6bcf\u4e2achild\u4e00\u4e2adaemon thread<\/td>\n<td>\u8d44\u6e90\u6548\u7387<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>\u6458\u8981\u9884\u7b97\u7528_last_prompt_size_tokens\u800c\u975esession_prompt_tokens<\/td>\n<td>\u540e\u8005\u662f\u7d2f\u8ba1SUM&#xff0c;\u51e0\u767e\u6b21\u8c03\u7528\u540e\u8d85\u8fc7\u4efb\u4f55\u4e0a\u4e0b\u6587\u7a97\u53e3<\/td>\n<td>\u5b9e\u6d4b\u53d1\u73b0<\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>_transaction()\u786e\u4fddconn.close()<\/td>\n<td>with conn:\u53ea\u63d0\u4ea4\/\u56de\u6eda\u4e0d\u5173\u95ed&#xff0c;\u6cc4\u6f0fWAL\/SHM fd<\/td>\n<td>#69567\/#69594<\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td>record_unit_child()\u589e\u91cf\u6301\u4e45\u5316<\/td>\n<td>1393-agent\u8fd0\u884c\u4e2d66\u5206\u949f\u65e0\u4efb\u4f55\u8fd0\u884c\u7684dead wave<\/td>\n<td>\u5b9e\u6d4b\u573a\u666f<\/td>\n<\/tr>\n<tr>\n<td>9<\/td>\n<td>restored\u4e8b\u4ef6\u6807\u8bb0restored&#061;True<\/td>\n<td>\u65b0\u4f1a\u8bdd\u4e0d\u5e94\u7ee7\u627f\u6b7b\u4f1a\u8bdd\u7684delegation\u7ed3\u679c<\/td>\n<td>#64484<\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td>custom\u7aef\u70b9\u6309\u8eab\u4efd\u5339\u914d\u51ed\u8bc1\u6c60<\/td>\n<td>\u4e0d\u540ccustom\u7aef\u70b9\u8bef\u5171\u4eab\u6c60\u4f1a\u8986\u76d6\u5b50\u4ee3\u7406\u7684base_url<\/td>\n<td>#7833<\/td>\n<\/tr>\n<tr>\n<td>11<\/td>\n<td>ACP command\u5fc5\u987b\u5728PATH\u4e0a<\/td>\n<td>\u5426\u5219\u5b50\u4ee3\u7406\u9759\u9ed8\u964d\u7ea7\u5230\u5176\u4ed6transport<\/td>\n<td>#80450<\/td>\n<\/tr>\n<tr>\n<td>12<\/td>\n<td>\u4f20\u8f93\u6743\u9650\u8bfb\u53d6\u65f6\u68c0\u67e5\u800c\u975e\u8bb0\u5f55\u65f6\u5feb\u7167<\/td>\n<td>\u6bcf\u4e2areattach\u8def\u5f84\u90fd\u4fee\u6539\u4f20\u8f93\u69fd&#xff0c;per-record\u526f\u672c\u9700\u540c\u6b65<\/td>\n<td>#106663<\/td>\n<\/tr>\n<tr>\n<td>13<\/td>\n<td>Schema\u9a8c\u8bc1\u6070\u597d\u4e00\u6b21\u91cd\u8bd5<\/td>\n<td>\u591a\u6b21\u91cd\u8bd5\u8ba9\u524d\u6cbf\u6a21\u578b\u4e22\u5f03\u7b2c\u4e00\u6b21\u6b63\u786e\u7684\u5b57\u6bb5<\/td>\n<td>\u6a21\u578b\u884c\u4e3a<\/td>\n<\/tr>\n<tr>\n<td>14<\/td>\n<td>\u5b50\u4ee3\u7406\u4e0d\u4f7f\u75281h cache tier<\/td>\n<td>\u5b50\u4ee3\u7406\u6bcf\u51e0\u79d2\u8c03\u7528\u3001\u51e0\u5206\u949f\u540e\u6d88\u5931&#xff0c;1h tier 2x\u5199\u5165\u65e0\u4fdd\u7559\u6536\u76ca<\/td>\n<td>#14971<\/td>\n<\/tr>\n<tr>\n<td>15<\/td>\n<td>push_task_failure_notice\u5373\u65f6\u901a\u77e5<\/td>\n<td>\u4e0d\u7b49\u6574\u4e2a\u6279\u6b21\u5b8c\u6210\u5c31\u901a\u77e5\u5931\u8d25\u7684sibling<\/td>\n<td>1393-agent\u573a\u666f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>18.3 \u5b8c\u6574\u7aef\u5230\u7aef\u65f6\u5e8f\u56fe<\/h4>\n<p>Pluginscompletion_queueSQLiteRegistryHeartbeatAIAgent(\u5b50)DaemonThreadPoolExecutor_build_childrendelegate_taskAIAgent(\u7236)\u7528\u6237Pluginscompletion_queueSQLiteRegistryHeartbeatAIAgent(\u5b50)DaemonThreadPoolExecutor_build_childrendelegate_taskAIAgent(\u7236)\u7528\u6237#mermaid-svg-sal0OyuNRgLzmduS{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sal0OyuNRgLzmduS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sal0OyuNRgLzmduS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sal0OyuNRgLzmduS .error-icon{fill:#552222;}#mermaid-svg-sal0OyuNRgLzmduS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sal0OyuNRgLzmduS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sal0OyuNRgLzmduS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sal0OyuNRgLzmduS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sal0OyuNRgLzmduS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sal0OyuNRgLzmduS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sal0OyuNRgLzmduS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sal0OyuNRgLzmduS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sal0OyuNRgLzmduS .marker.cross{stroke:#333333;}#mermaid-svg-sal0OyuNRgLzmduS svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sal0OyuNRgLzmduS p{margin:0;}#mermaid-svg-sal0OyuNRgLzmduS .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-sal0OyuNRgLzmduS text.actor&gt;tspan{fill:black;stroke:none;}#mermaid-svg-sal0OyuNRgLzmduS .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-sal0OyuNRgLzmduS .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-sal0OyuNRgLzmduS .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-sal0OyuNRgLzmduS .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-sal0OyuNRgLzmduS #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-sal0OyuNRgLzmduS .sequenceNumber{fill:white;}#mermaid-svg-sal0OyuNRgLzmduS #sequencenumber{fill:#333;}#mermaid-svg-sal0OyuNRgLzmduS #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-sal0OyuNRgLzmduS .messageText{fill:#333;stroke:none;}#mermaid-svg-sal0OyuNRgLzmduS .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-sal0OyuNRgLzmduS .labelText,#mermaid-svg-sal0OyuNRgLzmduS .labelText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-sal0OyuNRgLzmduS .loopText,#mermaid-svg-sal0OyuNRgLzmduS .loopText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-sal0OyuNRgLzmduS .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-sal0OyuNRgLzmduS .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-sal0OyuNRgLzmduS .noteText,#mermaid-svg-sal0OyuNRgLzmduS .noteText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-sal0OyuNRgLzmduS .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-sal0OyuNRgLzmduS .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-sal0OyuNRgLzmduS .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-sal0OyuNRgLzmduS .actorPopupMenu{position:absolute;}#mermaid-svg-sal0OyuNRgLzmduS .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 \/ 0.4));}#mermaid-svg-sal0OyuNRgLzmduS .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-sal0OyuNRgLzmduS .actor-man circle,#mermaid-svg-sal0OyuNRgLzmduS line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-sal0OyuNRgLzmduS :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}\u5b88\u536b\u68c0\u67e5: pause\/depth\/concurrencyloop[\u6bcf\u4e2a\u4efb\u52a1 (\u4e3b\u7ebf\u7a0b\u987a\u5e8f)]_units_of() \u2192 \u9ed8\u8ba41\u4e2a\u5355\u5143(\u5168\u90e83\u4e2atask)daemon worker\u7ebf\u7a0bpar[3\u4e2a\u5e76\u884cworker]\u7236\u4ee3\u7406Turn\u7ed3\u675f\u540edrain&#034;\u5206\u67903\u4e2a\u6587\u4ef6&#034;delegate_task(tasks&#061;[t0, t1, t2])_resolve_delegation_credentials()_normalize_task_list() \/ _coerce_task_schemas()create_live_transcripts() \u2192 3\u4e2atranscript writers_capture_origin() \u2192 \u6355\u83b7session\u8eab\u4efd_build_children(task_list, &#8230;)_build_child_preserving_parent_tools()_resolve_child_toolsets() \u2192 enabled\/disabled_build_child_system_prompt(goal, context)_resolve_child_runtime() \u2192 provider\/base_url\/api_keyAIAgent(**rt, quiet_mode&#061;True, skip_memory&#061;True, &#8230;)_apply_child_cache_ttl() \u2192 1h\u964d\u7ea75m_apply_child_compression_cap()child._delegate_parent_ref &#061; weakref(parent)_attach_child(parent, child)invoke_hook(&#034;subagent_start&#034;, &#8230;)children &#061; [(0,t0,c0), (1,t1,c1), (2,t2,c2)]_Batch(&#8230;)_run_batch(batch, background&#061;True)_dispatch_background(batch)_dispatch_unit(unit, unit_id, slot_key, routing)_persist_dispatch(record) \u2192 INSERT async_delegationsexecutor.submit(_worker){&#034;status&#034;: &#034;dispatched&#034;, &#034;delegation_id&#034;: &#034;deleg_xxx&#034;}&#034;\u5df2\u6d3e\u53d13\u4e2a\u5b50\u4ee3\u7406\u5230\u540e\u53f0&#8230;&#034;_execute_and_aggregate(unit)_run_children_parallel(batch)_register_child(c0, &#8230;)heartbeat.start()c0.run_conversation(goal)(\u72ec\u7acb\u7684\u5bf9\u8bdd\u5faa\u73af&#8230;)touch(&#034;subagent 0 working&#034;) (\u6bcf30s)_register_child(c1, &#8230;)heartbeat.start()c1.run_conversation(goal)(\u72ec\u7acb\u7684\u5bf9\u8bdd\u5faa\u73af&#8230;)touch(&#034;subagent 1 working&#034;) (\u6bcf30s)_register_child(c2, &#8230;)heartbeat.start()c2.run_conversation(goal)(\u72ec\u7acb\u7684\u5bf9\u8bdd\u5faa\u73af&#8230;)touch(&#034;subagent 2 working&#034;) (\u6bcf30s)result &#061; {final_response, api_calls, messages, &#8230;}_validate_child_output_schema()_build_result_entry() \u2192 {status, summary, tokens, cost, tool_trace}_finalize_child_results()_apply_summary_budget() \u2192 \u6458\u8981\u88c1\u526a&#043;spillinvoke_hook(&#034;subagent_stop&#034;, &#8230;)_rollup_children_cost(parent, total)_unregister_subagent(sid)heartbeat.stop()child.close() \u2192 \u91ca\u653eSessionDB\/\u7ec8\u7aef\/browser_persist_completion(event, result)completion_queue.put(event)\u65b0Turn: type&#061;&#034;async_delegation&#034; event\u5904\u7406\u5b8c\u6210\u4e8b\u4ef6(results)&#034;3\u4e2a\u5b50\u4ee3\u7406\u5b8c\u6210: [\u7ed3\u679c\u6458\u8981]&#034;<\/p>\n<hr \/>\n<h3>\u9644\u5f55A&#xff1a;\u6587\u4ef6\u6e05\u5355\u4e0e\u884c\u6570\u7edf\u8ba1<\/h3>\n<table>\n<tr>\u6587\u4ef6\u884c\u6570\u804c\u8d23<\/tr>\n<tbody>\n<tr>\n<td>tools\/delegate_tool.py<\/td>\n<td>745<\/td>\n<td>\u5165\u53e3\u3001_build_child_agent\u3001_run_single_child\u3001_build_children\u3001schema\u6ce8\u518c<\/td>\n<\/tr>\n<tr>\n<td>tools\/delegate_tool_dispatch.py<\/td>\n<td>432<\/td>\n<td>_Batch\u3001_run_batch\u3001_dispatch_background\u3001_execute_and_aggregate\u3001_run_children_parallel<\/td>\n<\/tr>\n<tr>\n<td>tools\/delegate_tool_child_run.py<\/td>\n<td>836<\/td>\n<td>_Heartbeat\u3001_ChildRun\u3001_register_child\u3001_build_result_entry\u3001_validate_child_output_schema\u3001_defer_close_after_timeout<\/td>\n<\/tr>\n<tr>\n<td>tools\/delegate_tool_config.py<\/td>\n<td>529<\/td>\n<td>\u914d\u7f6e\u65cb\u94ae\u3001_resolve_delegation_credentials\u3001_resolve_child_credential_pool\u3001_resolve_child_runtime<\/td>\n<\/tr>\n<tr>\n<td>tools\/delegate_tool_registry.py<\/td>\n<td>310<\/td>\n<td>_active_subagents\u6ce8\u518c\u8868\u3001steer\/stop\/list\u63a7\u5236\u9762\u3001_owns_subagent_record\u6743\u9650<\/td>\n<\/tr>\n<tr>\n<td>tools\/delegate_tool_toolsets.py<\/td>\n<td>114<\/td>\n<td>_resolve_child_toolsets\u3001DELEGATE_BLOCKED_TOOLS\u3001composite\u5c55\u5f00<\/td>\n<\/tr>\n<tr>\n<td>tools\/delegate_tool_results.py<\/td>\n<td>410<\/td>\n<td>_apply_summary_budget\u3001_fire_subagent_stop_hooks\u3001_rollup_children_cost\u3001_finalize_child_results<\/td>\n<\/tr>\n<tr>\n<td>tools\/async_delegation.py<\/td>\n<td>1012<\/td>\n<td>_dispatch\u3001_finalize\u3001_push_completion_event\u3001SQLite\u8d26\u672c\u3001\u5d29\u6e83\u6062\u590d\u3001\u505c\u6ede\u76d1\u63a7<\/td>\n<\/tr>\n<tr>\n<td>tools\/delegation_live_log.py<\/td>\n<td>315<\/td>\n<td>LiveTranscriptWriter\u3001\u5b9e\u65f6\u8f6c\u5f55\u3001\u51ed\u8bc1\u8131\u654f<\/td>\n<\/tr>\n<tr>\n<td>tools\/delegation_output_schema.py<\/td>\n<td>116<\/td>\n<td>coerce_output_schema\u3001validate_output\u3001build_retry_message<\/td>\n<\/tr>\n<tr>\n<td>tools\/daemon_pool.py<\/td>\n<td>56<\/td>\n<td>DaemonThreadPoolExecutor<\/td>\n<\/tr>\n<tr>\n<td>tools\/subagent_worktree.py<\/td>\n<td>193<\/td>\n<td>git worktree\u9694\u79bb(\u53ef\u9009)<\/td>\n<\/tr>\n<tr>\n<td>\u603b\u8ba1<\/td>\n<td>5,072<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>\u9644\u5f55B&#xff1a;\u5173\u952e\u5e38\u91cf\u901f\u67e5<\/h3>\n<table>\n<tr>\u5e38\u91cf\u503c\u6587\u4ef6\u542b\u4e49<\/tr>\n<tbody>\n<tr>\n<td>_DEFAULT_MAX_CONCURRENT_CHILDREN<\/td>\n<td>10<\/td>\n<td>config.py<\/td>\n<td>\u5e76\u53d1\u5b50\u4ee3\u7406\u9ed8\u8ba4\u4e0a\u9650<\/td>\n<\/tr>\n<tr>\n<td>MAX_DEPTH<\/td>\n<td>1<\/td>\n<td>config.py<\/td>\n<td>\u9ed8\u8ba4spawn\u6df1\u5ea6(\u6241\u5e73)<\/td>\n<\/tr>\n<tr>\n<td>_MIN_SPAWN_DEPTH<\/td>\n<td>1<\/td>\n<td>config.py<\/td>\n<td>spawn\u6df1\u5ea6floor<\/td>\n<\/tr>\n<tr>\n<td>DEFAULT_MAX_ITERATIONS<\/td>\n<td>250<\/td>\n<td>delegate_tool.py<\/td>\n<td>\u5b50\u4ee3\u7406\u6700\u5927\u8fed\u4ee3\u6570<\/td>\n<\/tr>\n<tr>\n<td>_HEARTBEAT_INTERVAL<\/td>\n<td>30s<\/td>\n<td>delegate_tool.py<\/td>\n<td>\u5fc3\u8df3\u95f4\u9694<\/td>\n<\/tr>\n<tr>\n<td>_HEARTBEAT_STALE_CYCLES_IDLE<\/td>\n<td>15<\/td>\n<td>delegate_tool.py<\/td>\n<td>idle\u505c\u6ede\u5468\u671f(450s)<\/td>\n<\/tr>\n<tr>\n<td>_HEARTBEAT_STALE_CYCLES_IN_TOOL<\/td>\n<td>40<\/td>\n<td>delegate_tool.py<\/td>\n<td>in-tool\u505c\u6ede\u5468\u671f(1200s)<\/td>\n<\/tr>\n<tr>\n<td>DEFAULT_CHILD_TIMEOUT<\/td>\n<td>None<\/td>\n<td>config.py<\/td>\n<td>\u9ed8\u8ba4\u65e0\u8d85\u65f6<\/td>\n<\/tr>\n<tr>\n<td>DEFAULT_MAX_SUMMARY_CHARS<\/td>\n<td>24000<\/td>\n<td>results.py<\/td>\n<td>\u6458\u8981\u786c\u4e0a\u9650<\/td>\n<\/tr>\n<tr>\n<td>_SUMMARY_HEADROOM_FRACTION<\/td>\n<td>0.5<\/td>\n<td>results.py<\/td>\n<td>headroom\u5206\u914d\u6bd4\u4f8b<\/td>\n<\/tr>\n<tr>\n<td>_MIN_SUMMARY_CHARS<\/td>\n<td>2000<\/td>\n<td>results.py<\/td>\n<td>\u6458\u8981floor<\/td>\n<\/tr>\n<tr>\n<td>_DEFAULT_MAX_ASYNC_CHILDREN<\/td>\n<td>3<\/td>\n<td>async_delegation.py<\/td>\n<td>\u5f02\u6b65\u5b50\u4ee3\u7406\u9ed8\u8ba4\u4e0a\u9650<\/td>\n<\/tr>\n<tr>\n<td>_MAX_RETAINED_COMPLETED<\/td>\n<td>50<\/td>\n<td>async_delegation.py<\/td>\n<td>\u5185\u5b58\u5df2\u5b8c\u6210\u8bb0\u5f55\u4e0a\u9650<\/td>\n<\/tr>\n<tr>\n<td>_DURABLE_RETENTION_SECONDS<\/td>\n<td>7\u5929<\/td>\n<td>async_delegation.py<\/td>\n<td>SQLite\u4fdd\u7559\u671f<\/td>\n<\/tr>\n<tr>\n<td>_MAX_DELIVERY_ATTEMPTS<\/td>\n<td>8<\/td>\n<td>async_delegation.py<\/td>\n<td>\u6295\u9012\u5c1d\u8bd5\u4e0a\u9650<\/td>\n<\/tr>\n<tr>\n<td>_MAX_COMPLETION_REPLAY_AGE_S<\/td>\n<td>48h<\/td>\n<td>async_delegation.py<\/td>\n<td>\u91cd\u653e\u5e74\u9f84\u4e0a\u9650<\/td>\n<\/tr>\n<tr>\n<td>_STALE_CHECK_INTERVAL<\/td>\n<td>30s<\/td>\n<td>async_delegation.py<\/td>\n<td>\u505c\u6ede\u76d1\u63a7\u95f4\u9694<\/td>\n<\/tr>\n<tr>\n<td>_STALE_IDLE_SECONDS<\/td>\n<td>450s<\/td>\n<td>async_delegation.py<\/td>\n<td>\u5f02\u6b65idle\u505c\u6ede\u9608\u503c<\/td>\n<\/tr>\n<tr>\n<td>_STALE_IN_TOOL_SECONDS<\/td>\n<td>1200s<\/td>\n<td>async_delegation.py<\/td>\n<td>\u5f02\u6b65in-tool\u505c\u6ede\u9608\u503c<\/td>\n<\/tr>\n<tr>\n<td>_STALL_GRACE_SECONDS<\/td>\n<td>120s<\/td>\n<td>async_delegation.py<\/td>\n<td>stalling\u2192\u5f3a\u5236\u7ec8\u7ed3\u5bbd\u9650<\/td>\n<\/tr>\n<tr>\n<td>LIVE_RETENTION_DAYS<\/td>\n<td>7<\/td>\n<td>delegation_live_log.py<\/td>\n<td>\u8f6c\u5f55\u65e5\u5fd7\u4fdd\u7559<\/td>\n<\/tr>\n<tr>\n<td>_CHILD_CAP_MIN<\/td>\n<td>16000<\/td>\n<td>delegate_tool.py<\/td>\n<td>\u538b\u7f29\u9608\u503cfloor<\/td>\n<\/tr>\n<tr>\n<td>MAX_SCHEMA_RETRIES<\/td>\n<td>1<\/td>\n<td>delegation_output_schema.py<\/td>\n<td>Schema\u9a8c\u8bc1\u91cd\u8bd5\u6b21\u6570<\/td>\n<\/tr>\n<tr>\n<td>_RECENT_SUBAGENTS_CAP<\/td>\n<td>200<\/td>\n<td>registry.py<\/td>\n<td>\u8fd1\u671f\u5b8c\u6210\u5b50\u4ee3\u7406\u8bb0\u5f55\u4e0a\u9650<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>10. \u5fc3\u8df3\u76d1\u63a7\u7cfb\u7edf _Heartbeat<br \/>\n10.1 \u8bbe\u8ba1\u539f\u7406<br \/>\n#mermaid-svg-cTO2GHoGNsGriCif{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}<\/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":[10609,74,66],"topic":[],"class_list":["post-110319","post","type-post","status-publish","format-standard","hentry","category-server","tag-hermes","tag-agent","tag-ai"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u3010hermes-agent\u3011Hermes Agent \u5b50\u4ee3\u7406\u59d4\u6d3e\u6d41\u7a0b\u8d85\u6df1\u5ea6\u5206\u6790\u4e4b\u4e8c - \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\/110319.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u3010hermes-agent\u3011Hermes Agent \u5b50\u4ee3\u7406\u59d4\u6d3e\u6d41\u7a0b\u8d85\u6df1\u5ea6\u5206\u6790\u4e4b\u4e8c - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"10. \u5fc3\u8df3\u76d1\u63a7\u7cfb\u7edf _Heartbeat 10.1 \u8bbe\u8ba1\u539f\u7406 #mermaid-svg-cTO2GHoGNsGriCif{font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/110319.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-26T07:41:22+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=\"45 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/110319.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/110319.html\",\"name\":\"\u3010hermes-agent\u3011Hermes Agent \u5b50\u4ee3\u7406\u59d4\u6d3e\u6d41\u7a0b\u8d85\u6df1\u5ea6\u5206\u6790\u4e4b\u4e8c - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-09-26T07:41:22+00:00\",\"dateModified\":\"2026-09-26T07:41:22+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/110319.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/110319.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/110319.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u3010hermes-agent\u3011Hermes Agent \u5b50\u4ee3\u7406\u59d4\u6d3e\u6d41\u7a0b\u8d85\u6df1\u5ea6\u5206\u6790\u4e4b\u4e8c\"}]},{\"@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":"\u3010hermes-agent\u3011Hermes Agent \u5b50\u4ee3\u7406\u59d4\u6d3e\u6d41\u7a0b\u8d85\u6df1\u5ea6\u5206\u6790\u4e4b\u4e8c - \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\/110319.html","og_locale":"zh_CN","og_type":"article","og_title":"\u3010hermes-agent\u3011Hermes Agent \u5b50\u4ee3\u7406\u59d4\u6d3e\u6d41\u7a0b\u8d85\u6df1\u5ea6\u5206\u6790\u4e4b\u4e8c - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"10. \u5fc3\u8df3\u76d1\u63a7\u7cfb\u7edf _Heartbeat 10.1 \u8bbe\u8ba1\u539f\u7406 #mermaid-svg-cTO2GHoGNsGriCif{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}","og_url":"https:\/\/www.wsisp.com\/helps\/110319.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-09-26T07:41:22+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"45 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/110319.html","url":"https:\/\/www.wsisp.com\/helps\/110319.html","name":"\u3010hermes-agent\u3011Hermes Agent \u5b50\u4ee3\u7406\u59d4\u6d3e\u6d41\u7a0b\u8d85\u6df1\u5ea6\u5206\u6790\u4e4b\u4e8c - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-09-26T07:41:22+00:00","dateModified":"2026-09-26T07:41:22+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/110319.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/110319.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/110319.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u3010hermes-agent\u3011Hermes Agent \u5b50\u4ee3\u7406\u59d4\u6d3e\u6d41\u7a0b\u8d85\u6df1\u5ea6\u5206\u6790\u4e4b\u4e8c"}]},{"@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\/110319","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=110319"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/110319\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=110319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=110319"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=110319"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=110319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}