{"id":595,"date":"2026-02-01T23:55:07","date_gmt":"2026-02-01T15:55:07","guid":{"rendered":"https:\/\/blog.itsmygo.uk\/2026\/02\/01\/openclaw-%e5%8e%9f%e5%a7%8b%e7%a2%bc%e8%a7%a3%e8%ae%80%ef%bc%9a%e4%b8%80%e5%80%8b%e3%80%8c%e5%80%8b%e4%ba%ba-ai-%e5%8a%a9%e7%90%86%e3%80%8d%e7%9a%84%e5%a4%9a%e9%80%9a%e9%81%93%e9%96%98%e9%81%93\/"},"modified":"2026-02-02T00:51:31","modified_gmt":"2026-02-01T16:51:31","slug":"openclaw-%e5%8e%9f%e5%a7%8b%e7%a2%bc%e8%a7%a3%e8%ae%80%ef%bc%9a%e4%b8%80%e5%80%8b%e3%80%8c%e5%80%8b%e4%ba%ba-ai-%e5%8a%a9%e7%90%86%e3%80%8d%e7%9a%84%e5%a4%9a%e9%80%9a%e9%81%93%e9%96%98%e9%81%93","status":"publish","type":"post","link":"https:\/\/blog.itsmygo.uk\/wordpress\/2026\/02\/01\/openclaw-%e5%8e%9f%e5%a7%8b%e7%a2%bc%e8%a7%a3%e8%ae%80%ef%bc%9a%e4%b8%80%e5%80%8b%e3%80%8c%e5%80%8b%e4%ba%ba-ai-%e5%8a%a9%e7%90%86%e3%80%8d%e7%9a%84%e5%a4%9a%e9%80%9a%e9%81%93%e9%96%98%e9%81%93\/","title":{"rendered":"OpenClaw \u539f\u59cb\u78bc\u89e3\u8b80\uff1a\u4e00\u500b\u300c\u500b\u4eba AI \u52a9\u7406\u300d\u7684\u591a\u901a\u9053\u9598\u9053\u67b6\u69cb"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">OpenClaw \u662f\u4e00\u500b\u91ce\u5fc3\u5341\u8db3\u7684\u958b\u6e90\u5c08\u6848\u2014\u2014\u5b83\u8981\u8b93\u4f60\u5728\u81ea\u5df1\u7684\u88dd\u7f6e\u4e0a\u904b\u884c\u4e00\u500b AI \u52a9\u7406\uff0c\u540c\u6642\u63a5\u5165 WhatsApp\u3001Telegram\u3001Slack\u3001Discord\u3001Signal\u3001iMessage \u7b49\u5341\u9918\u500b\u901a\u8a0a\u5e73\u53f0\u3002\u8b80\u9019\u4efd\u539f\u59cb\u78bc\uff0c\u4f60\u80fd\u5b78\u5230\u5982\u4f55\u8a2d\u8a08\u4e00\u5957 Plugin \u9a45\u52d5\u7684\u901a\u9053\u62bd\u8c61\u5c64\u3001\u5982\u4f55\u5728\u55ae\u4e00 WebSocket Gateway \u4e0a\u7ba1\u7406\u591a Agent \u7684 Session \u751f\u547d\u9031\u671f\u3001\u5982\u4f55\u7d44\u88dd System Prompt \u6210\u70ba\u53ef\u914d\u7f6e\u7684\u300c\u4eba\u683c\u5f15\u64ce\u300d\uff0c\u4ee5\u53ca\u5982\u4f55\u7528 Node Registry \u6a21\u5f0f\u8b93\u684c\u9762\u8207\u884c\u52d5\u88dd\u7f6e\u7121\u7e2b\u5354\u4f5c\u3002\u9019\u4e9b\u8a2d\u8a08\u6982\u5ff5\u53ef\u4ee5\u76f4\u63a5\u501f\u93e1\u5230\u4efb\u4f55\u9700\u8981\u300c\u591a\u5165\u53e3 + \u55ae\u6838\u5fc3\u300d\u67b6\u69cb\u7684\u5c08\u6848\u4e2d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/openclaw\/openclaw\">OpenClaw GitHub Repository<\/a> \u2014 \u5c08\u6848\u539f\u59cb\u78bc\uff0c\u5305\u542b\u5b8c\u6574\u7684 Gateway \u67b6\u69cb\u3001Channel Plugin \u7cfb\u7d71\u3001\u548c\u6240\u6709\u672c\u6587\u89e3\u8b80\u7684\u8a2d\u8a08\u5be6\u4f5c<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5c08\u6848\u6982\u89bd<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OpenClaw \u662f\u4e00\u500b <strong>\u672c\u5730\u512a\u5148\uff08local-first\uff09\u7684\u500b\u4eba AI \u52a9\u7406<\/strong>\uff0c\u4ee5 TypeScript \u64b0\u5beb\uff0c\u904b\u884c\u5728 Node.js 22+ \u4e0a\u3002\u6838\u5fc3\u662f\u4e00\u500b <strong>Gateway\uff08\u9598\u9053\uff09\u63a7\u5236\u5e73\u9762<\/strong>\uff0c\u900f\u904e WebSocket \u9023\u63a5\u6240\u6709\u5ba2\u6236\u7aef\u2014\u2014CLI\u3001macOS \u9078\u55ae\u5217 App\u3001iOS\/Android \u7bc0\u9ede\u3001Web \u4ecb\u9762\uff0c\u4ee5\u53ca\u5404\u901a\u8a0a\u5e73\u53f0\u7684 Channel Plugin\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6280\u8853\u68e7\uff1aTypeScript + Node.js\uff0c\u4f7f\u7528 <code>@sinclair\/typebox<\/code> \u505a Schema \u9a57\u8b49\uff0c<code>@anthropic-ai\/sdk<\/code> \u548c <code>openai<\/code> SDK \u8207 LLM \u4ea4\u4e92\uff0c\u642d\u914d <code>@mariozechner\/pi-coding-agent<\/code> \u4f5c\u70ba\u5e95\u5c64 Agent Runtime\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c08\u6848\u898f\u6a21\u9f90\u5927\uff0c<code>src\/<\/code> \u4e0b\u6709\u8d85\u904e 20 \u500b\u5b50\u76ee\u9304\u3001\u6578\u767e\u500b TypeScript \u6a94\u6848\uff0c\u53e6\u6709 macOS\uff08Swift\uff09\u3001iOS\uff08Swift\uff09\u3001Android\uff08Kotlin\uff09\u539f\u751f App\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u67b6\u69cb\u7e3d\u89bd<\/h2>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">src\/\n\u251c\u2500\u2500 gateway\/          <span class=\"hljs-comment\"># \ud83c\udfdb\ufe0f Gateway \u63a7\u5236\u5e73\u9762\uff1aWS \u4f3a\u670d\u5668\u3001HTTP \u7aef\u9ede\u3001Session \u7ba1\u7406<\/span>\n\u2502   \u251c\u2500\u2500 server.impl.ts       <span class=\"hljs-comment\"># \u9598\u9053\u555f\u52d5\u4e3b\u6d41\u7a0b<\/span>\n\u2502   \u251c\u2500\u2500 server-methods\/      <span class=\"hljs-comment\"># WS RPC \u65b9\u6cd5\u8655\u7406\u5668\uff08agent\u3001sessions\u3001chat\u3001nodes...\uff09<\/span>\n\u2502   \u251c\u2500\u2500 server-ws-runtime.ts <span class=\"hljs-comment\"># WebSocket \u9023\u7dda\u8655\u7406<\/span>\n\u2502   \u251c\u2500\u2500 protocol\/            <span class=\"hljs-comment\"># TypeBox Schema \u5b9a\u7fa9\u7684\u5354\u5b9a\u898f\u683c<\/span>\n\u2502   \u2514\u2500\u2500 node-registry.ts     <span class=\"hljs-comment\"># \u88dd\u7f6e\u7bc0\u9ede\u8a3b\u518a\u8207\u9060\u7aef\u547c\u53eb<\/span>\n\u251c\u2500\u2500 agents\/           <span class=\"hljs-comment\"># \ud83e\udd16 Agent Runtime\uff1a\u5d4c\u5165\u5f0f Pi Agent\u3001\u5de5\u5177\u3001\u6a21\u578b\u7ba1\u7406<\/span>\n\u2502   \u251c\u2500\u2500 pi-embedded-runner.ts    <span class=\"hljs-comment\"># Agent \u57f7\u884c\u5f15\u64ce<\/span>\n\u2502   \u251c\u2500\u2500 pi-embedded-subscribe.ts <span class=\"hljs-comment\"># \u4e32\u6d41\u8a02\u95b1\u8207\u5206\u584a<\/span>\n\u2502   \u251c\u2500\u2500 system-prompt.ts         <span class=\"hljs-comment\"># System Prompt \u7d44\u88dd\u5f15\u64ce<\/span>\n\u2502   \u251c\u2500\u2500 model-fallback.ts        <span class=\"hljs-comment\"># \u6a21\u578b Failover \u7b56\u7565<\/span>\n\u2502   \u251c\u2500\u2500 pi-tools.ts              <span class=\"hljs-comment\"># \u5de5\u5177\u8a3b\u518a\u8207\u7b56\u7565\u904e\u6ffe<\/span>\n\u2502   \u251c\u2500\u2500 skills\/                  <span class=\"hljs-comment\"># Skills \u5e73\u53f0<\/span>\n\u2502   \u2514\u2500\u2500 sandbox\/                 <span class=\"hljs-comment\"># Docker Sandbox \u9694\u96e2<\/span>\n\u251c\u2500\u2500 channels\/         <span class=\"hljs-comment\"># \ud83d\udcf1 \u901a\u9053\u5c64\uff1aPlugin \u67b6\u69cb\u7684\u591a\u5e73\u53f0\u901a\u8a0a\u62bd\u8c61<\/span>\n\u2502   \u251c\u2500\u2500 plugins\/             <span class=\"hljs-comment\"># Channel Plugin \u5b9a\u7fa9\u3001\u8f09\u5165\u3001Catalog<\/span>\n\u2502   \u251c\u2500\u2500 registry.ts          <span class=\"hljs-comment\"># \u6838\u5fc3\u901a\u9053\u4e2d\u7e7c\u8cc7\u6599<\/span>\n\u2502   \u2514\u2500\u2500 dock.ts              <span class=\"hljs-comment\"># \u901a\u9053\u5c0d\u63a5\u4ecb\u9762<\/span>\n\u251c\u2500\u2500 auto-reply\/       <span class=\"hljs-comment\"># \ud83d\udd04 \u81ea\u52d5\u56de\u8986\u5f15\u64ce\uff1a\u8a0a\u606f\u6d3e\u767c\u3001\u6307\u4ee4\u89e3\u6790\u3001\u56de\u8986\u7ba1\u7dda<\/span>\n\u2502   \u251c\u2500\u2500 dispatch.ts          <span class=\"hljs-comment\"># \u5165\u7ad9\u8a0a\u606f\u5206\u767c<\/span>\n\u2502   \u251c\u2500\u2500 reply\/               <span class=\"hljs-comment\"># \u56de\u8986\u751f\u6210\u7ba1\u7dda\uff08\u542b streaming\u3001chunking\u3001directives\uff09<\/span>\n\u2502   \u2514\u2500\u2500 commands-registry.ts <span class=\"hljs-comment\"># \u804a\u5929\u6307\u4ee4 (\/status\u3001\/new\u3001\/think...)<\/span>\n\u251c\u2500\u2500 plugins\/          <span class=\"hljs-comment\"># \ud83d\udd0c \u901a\u7528 Plugin Registry\uff1a\u5de5\u5177\u3001Hook\u3001HTTP\u3001CLI \u64f4\u5c55<\/span>\n\u2502   \u251c\u2500\u2500 registry.ts          <span class=\"hljs-comment\"># \u7d71\u4e00 Plugin \u8a3b\u518a\u4e2d\u5fc3<\/span>\n\u2502   \u251c\u2500\u2500 discovery.ts         <span class=\"hljs-comment\"># Plugin \u81ea\u52d5\u767c\u73fe<\/span>\n\u2502   \u2514\u2500\u2500 runtime.ts           <span class=\"hljs-comment\"># Plugin \u57f7\u884c\u671f\u7ba1\u7406<\/span>\n\u251c\u2500\u2500 cli\/              <span class=\"hljs-comment\"># \u2328\ufe0f CLI \u8868\u9762\uff1acommander.js \u98a8\u683c\u7684\u6307\u4ee4\u7cfb\u7d71<\/span>\n\u251c\u2500\u2500 config\/           <span class=\"hljs-comment\"># \u2699\ufe0f \u7d44\u614b\u7ba1\u7406\uff1aJSON5 \u683c\u5f0f\u3001Schema \u9a57\u8b49\u3001\u71b1\u91cd\u8f09<\/span>\n\u251c\u2500\u2500 browser\/          <span class=\"hljs-comment\"># \ud83c\udf10 \u700f\u89bd\u5668\u63a7\u5236\uff1aCDP \u6574\u5408\u7684 Chrome \u81ea\u52d5\u5316<\/span>\n\u251c\u2500\u2500 canvas-host\/      <span class=\"hljs-comment\"># \ud83c\udfa8 Canvas A2UI\uff1aAgent \u9a45\u52d5\u7684\u8996\u89ba\u5316\u5de5\u4f5c\u5340<\/span>\n\u251c\u2500\u2500 infra\/            <span class=\"hljs-comment\"># \ud83c\udfd7\ufe0f \u57fa\u790e\u8a2d\u65bd\uff1aHeartbeat\u3001\u8a3a\u65b7\u3001\u66f4\u65b0\u6aa2\u67e5<\/span>\n\u2514\u2500\u2500 hooks\/            <span class=\"hljs-comment\"># \ud83e\ude9d Hook \u7cfb\u7d71\uff1a\u4e8b\u4ef6\u9a45\u52d5\u7684\u64f4\u5c55\u9ede<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">\u6838\u5fc3\u8a2d\u8a08\u89e3\u6790<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u4e00\uff1aGateway \u4f5c\u70ba\u55ae\u4e00\u63a7\u5236\u5e73\u9762<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenClaw \u6700\u6838\u5fc3\u7684\u67b6\u69cb\u6c7a\u7b56\u662f <strong>\u4e00\u5207\u90fd\u7d93\u904e Gateway<\/strong>\u3002Gateway \u662f\u4e00\u500b WebSocket \u4f3a\u670d\u5668\uff0c\u6240\u6709\u5ba2\u6236\u7aef\uff08CLI\u3001App\u3001Web\u3001Node\uff09\u90fd\u900f\u904e WebSocket \u9023\u7dda\u5230 Gateway\uff0c\u6240\u6709\u901a\u9053\u8a0a\u606f\u4e5f\u900f\u904e Gateway \u8f49\u767c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/openclaw\/openclaw\/blob\/main\/src\/gateway\/server.impl.ts\"><code>src\/gateway\/server.impl.ts<\/code><\/a> \u2014 Gateway \u555f\u52d5\u4e3b\u6d41\u7a0b\uff0c\u5305\u542b Plugin \u8f09\u5165\u3001WS\/HTTP \u4f3a\u670d\u5668\u521d\u59cb\u5316\u3001Channel \u555f\u52d5\u7684\u5b8c\u6574\u7ba1\u7dda<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">startGatewayServer<\/span>(<span class=\"hljs-params\">\n  port = <span class=\"hljs-number\">18789<\/span>,\n  opts: GatewayServerOptions = {},\n<\/span>): <span class=\"hljs-title\">Promise<\/span>&lt;<span class=\"hljs-title\">GatewayServer<\/span>&gt; <\/span>{\n  <span class=\"hljs-comment\">\/\/ ... \u7d44\u614b\u8f09\u5165\u3001\u9077\u79fb\u3001\u9a57\u8b49<\/span>\n  <span class=\"hljs-keyword\">const<\/span> { pluginRegistry, <span class=\"hljs-attr\">gatewayMethods<\/span>: baseGatewayMethods } = loadGatewayPlugins({\n    <span class=\"hljs-attr\">cfg<\/span>: cfgAtStart,\n    <span class=\"hljs-attr\">workspaceDir<\/span>: defaultWorkspaceDir,\n    log,\n    coreGatewayHandlers,\n    baseMethods,\n  });\n\n  <span class=\"hljs-keyword\">const<\/span> channelMethods = listChannelPlugins().flatMap(<span class=\"hljs-function\">(<span class=\"hljs-params\">plugin<\/span>) =&gt;<\/span> plugin.gatewayMethods ?? &#91;]);\n  <span class=\"hljs-keyword\">const<\/span> gatewayMethods = <span class=\"hljs-built_in\">Array<\/span>.from(<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Set<\/span>(&#91;...baseGatewayMethods, ...channelMethods]));\n\n  attachGatewayWsHandlers({\n    wss, clients, port,\n    gatewayMethods,\n    <span class=\"hljs-attr\">events<\/span>: GATEWAY_EVENTS,\n    <span class=\"hljs-attr\">extraHandlers<\/span>: {\n      ...pluginRegistry.gatewayHandlers,\n      ...execApprovalHandlers,\n    },\n    <span class=\"hljs-comment\">\/\/ ... \u6ce8\u5165\u5927\u91cf context<\/span>\n  });\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>\u70ba\u4ec0\u9ebc\u9019\u6a23\u8a2d\u8a08\uff1f<\/strong> Gateway \u6a21\u5f0f\u8b93 OpenClaw \u5be6\u73fe\u4e86\u5e7e\u4ef6\u95dc\u9375\u7684\u4e8b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Protocol \u7d71\u4e00<\/strong>\uff1a\u7121\u8ad6\u662f WhatsApp \u9084\u662f Discord \u7684\u8a0a\u606f\uff0c\u9032\u5165 Gateway \u5f8c\u90fd\u88ab\u6a19\u6e96\u5316\u70ba\u7d71\u4e00\u7684 Session \u4e8b\u4ef6<\/li>\n\n\n<li><strong>\u72c0\u614b\u96c6\u4e2d<\/strong>\uff1aSession \u7ba1\u7406\u3001Chat Abort\u3001Dedupe \u7b49\u72c0\u614b\u90fd\u5728 Gateway \u5167\u5b58\u4e2d\u7dad\u8b77\uff0c\u907f\u514d\u5206\u6563\u5f0f\u72c0\u614b\u7684\u8907\u96dc\u6027<\/li>\n\n\n<li><strong>Plugin \u53ef\u6ce8\u5165 Gateway \u65b9\u6cd5<\/strong>\uff1aPlugin \u4e0d\u53ea\u63d0\u4f9b\u5de5\u5177\uff0c\u9084\u80fd\u6ce8\u5165\u65b0\u7684 WS RPC \u65b9\u6cd5\uff0c\u64f4\u5c55 Gateway \u7684\u80fd\u529b<\/li>\n\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><code>startGatewayServer<\/code> \u51fd\u5f0f\u8d85\u904e 400 \u884c\uff0c\u555f\u52d5\u6d41\u7a0b\u6309\u9806\u5e8f\u5b8c\u6210\uff1a\u7d44\u614b\u9a57\u8b49 \u2192 Plugin \u8f09\u5165 \u2192 TLS \u8a2d\u5b9a \u2192 WS\/HTTP \u4f3a\u670d\u5668 \u2192 Channel \u555f\u52d5 \u2192 Cron \u6392\u7a0b \u2192 Node \u767c\u73fe\u3002\u6574\u500b Gateway \u5c31\u662f\u4e00\u689d\u7cbe\u5fc3\u7de8\u6392\u7684\u555f\u52d5\u7ba1\u7dda\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u4e8c\uff1aChannel Plugin \u7684 Adapter \u6a21\u5f0f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenClaw \u652f\u63f4 13+ \u500b\u901a\u8a0a\u5e73\u53f0\uff0c\u4f46\u539f\u59cb\u78bc\u4e2d\u4e26\u6c92\u6709\u5de8\u5927\u7684 if-else \u6216 switch-case\u3002\u5b83\u7684\u79d8\u5bc6\u662f\u4e00\u5957\u7cbe\u5fc3\u8a2d\u8a08\u7684 <strong>Channel Plugin \u4ecb\u9762<\/strong>\uff0c\u4f7f\u7528 Adapter \u6a21\u5f0f\u5c07\u6bcf\u500b\u901a\u9053\u7684\u884c\u70ba\u62c6\u5206\u6210\u7368\u7acb\u7684\u95dc\u6ce8\u9762\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/openclaw\/openclaw\/blob\/main\/src\/channels\/plugins\/types.plugin.ts\"><code>src\/channels\/plugins\/types.plugin.ts<\/code><\/a> \u2014 Channel Plugin \u6838\u5fc3\u578b\u5225\u5b9a\u7fa9\uff0c\u5b9a\u7fa9\u4e86\u5341\u9918\u500b\u53ef\u9078 Adapter \u4ecb\u9762<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> type ChannelPlugin&lt;ResolvedAccount = any&gt; = {\n  <span class=\"hljs-attr\">id<\/span>: ChannelId;\n  meta: ChannelMeta;\n  capabilities: ChannelCapabilities;\n\n  <span class=\"hljs-comment\">\/\/ \u6bcf\u500b adapter \u8655\u7406\u4e00\u500b\u95dc\u6ce8\u9762<\/span>\n  config: ChannelConfigAdapter&lt;ResolvedAccount&gt;;     <span class=\"hljs-comment\">\/\/ \u7d44\u614b\u89e3\u6790<\/span>\n  setup?: ChannelSetupAdapter;                        <span class=\"hljs-comment\">\/\/ \u521d\u59cb\u5316\u8a2d\u5b9a<\/span>\n  pairing?: ChannelPairingAdapter;                    <span class=\"hljs-comment\">\/\/ DM \u914d\u5c0d\u9a57\u8b49<\/span>\n  security?: ChannelSecurityAdapter&lt;ResolvedAccount&gt;; <span class=\"hljs-comment\">\/\/ \u5b89\u5168\u7b56\u7565<\/span>\n  groups?: ChannelGroupAdapter;                       <span class=\"hljs-comment\">\/\/ \u7fa4\u7d44\u884c\u70ba<\/span>\n  mentions?: ChannelMentionAdapter;                   <span class=\"hljs-comment\">\/\/ @\u63d0\u53ca\u8655\u7406<\/span>\n  outbound?: ChannelOutboundAdapter;                  <span class=\"hljs-comment\">\/\/ \u5916\u767c\u8a0a\u606f<\/span>\n  streaming?: ChannelStreamingAdapter;                <span class=\"hljs-comment\">\/\/ \u4e32\u6d41\u5206\u584a<\/span>\n  threading?: ChannelThreadingAdapter;                <span class=\"hljs-comment\">\/\/ \u57f7\u884c\u7dd2 \/ \u56de\u8986<\/span>\n  messaging?: ChannelMessagingAdapter;                <span class=\"hljs-comment\">\/\/ \u8a0a\u606f\u64cd\u4f5c<\/span>\n  gateway?: ChannelGatewayAdapter&lt;ResolvedAccount&gt;;   <span class=\"hljs-comment\">\/\/ Gateway WS \u8655\u7406<\/span>\n  onboarding?: ChannelOnboardingAdapter;              <span class=\"hljs-comment\">\/\/ CLI \u56ae\u5c0e<\/span>\n  agentTools?: ChannelAgentToolFactory | ChannelAgentTool&#91;]; <span class=\"hljs-comment\">\/\/ \u901a\u9053\u5c08\u5c6c\u5de5\u5177<\/span>\n};\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>\u70ba\u4ec0\u9ebc\u9019\u6a23\u8a2d\u8a08\uff1f<\/strong> \u6bcf\u500b\u901a\u8a0a\u5e73\u53f0\u7684 API \u5dee\u7570\u6975\u5927\u2014\u2014WhatsApp \u7528 QR code \u914d\u5c0d\u3001Telegram \u7528 Bot Token\u3001Discord \u6709 Guild \u6982\u5ff5\u3001iMessage \u53ea\u80fd\u5728 macOS \u4e0a\u904b\u884c\u3002\u628a\u9019\u4e9b\u5dee\u7570\u62c6\u6210\u5341\u5e7e\u500b\u53ef\u9078\u7684 Adapter \u4ecb\u9762\uff0c\u8b93\u6bcf\u500b Plugin \u53ea\u5be6\u4f5c\u81ea\u5df1\u9700\u8981\u7684\u90e8\u5206\uff0c\u4e0d\u9700\u8981\u7684 Adapter \u7559 <code>undefined<\/code>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Channel Plugin \u7684\u8f09\u5165\u4f7f\u7528\u4e86 Registry + Cache \u6a21\u5f0f\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/openclaw\/openclaw\/blob\/main\/src\/channels\/plugins\/load.ts\"><code>src\/channels\/plugins\/load.ts<\/code><\/a> \u2014 Channel Plugin \u8f09\u5165\u8207\u5feb\u53d6\u6a5f\u5236\uff0cRegistry \u66f4\u63db\u6642\u81ea\u52d5\u6e05\u9664\u5feb\u53d6<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> cache = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Map<\/span>&lt;ChannelId, ChannelPlugin&gt;();\n<span class=\"hljs-keyword\">let<\/span> lastRegistry: PluginRegistry | <span class=\"hljs-literal\">null<\/span> = <span class=\"hljs-literal\">null<\/span>;\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">ensureCacheForRegistry<\/span>(<span class=\"hljs-params\">registry: PluginRegistry | null<\/span>) <\/span>{\n  <span class=\"hljs-keyword\">if<\/span> (registry === lastRegistry) <span class=\"hljs-keyword\">return<\/span>;\n  cache.clear();\n  lastRegistry = registry;\n}\n\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">loadChannelPlugin<\/span>(<span class=\"hljs-params\">id: ChannelId<\/span>): <span class=\"hljs-title\">Promise<\/span>&lt;<span class=\"hljs-title\">ChannelPlugin<\/span> | <span class=\"hljs-title\">undefined<\/span>&gt; <\/span>{\n  <span class=\"hljs-keyword\">const<\/span> registry = getActivePluginRegistry();\n  ensureCacheForRegistry(registry);\n  <span class=\"hljs-keyword\">const<\/span> cached = cache.get(id);\n  <span class=\"hljs-keyword\">if<\/span> (cached) <span class=\"hljs-keyword\">return<\/span> cached;\n  <span class=\"hljs-keyword\">const<\/span> pluginEntry = registry?.channels.find(<span class=\"hljs-function\">(<span class=\"hljs-params\">entry<\/span>) =&gt;<\/span> entry.plugin.id === id);\n  <span class=\"hljs-keyword\">if<\/span> (pluginEntry) {\n    cache.set(id, pluginEntry.plugin);\n    <span class=\"hljs-keyword\">return<\/span> pluginEntry.plugin;\n  }\n  <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">undefined<\/span>;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u9019\u500b Cache \u6703\u5728 Plugin Registry \u66f4\u63db\u6642\u81ea\u52d5\u6e05\u7a7a\uff0c\u78ba\u4fdd\u71b1\u91cd\u8f09\u6642\u4e0d\u6703\u4f7f\u7528\u5230\u820a\u7684 Plugin \u5be6\u4f8b\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u4e09\uff1a\u7d71\u4e00 Plugin Registry \u67b6\u69cb<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Channel Plugin \u53ea\u662f\u6574\u500b Plugin \u7cfb\u7d71\u7684\u4e00\u90e8\u5206\u3002OpenClaw \u6709\u4e00\u500b\u901a\u7528\u7684 Plugin Registry\uff0c\u53ef\u4ee5\u8a3b\u518a\u516d\u7a2e\u4e0d\u540c\u985e\u578b\u7684\u64f4\u5c55\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/openclaw\/openclaw\/blob\/main\/src\/plugins\/registry.ts\"><code>src\/plugins\/registry.ts<\/code><\/a> \u2014 \u7d71\u4e00 Plugin \u8a3b\u518a\u4e2d\u5fc3\uff0c\u4e00\u500b Plugin \u53ef\u540c\u6642\u63d0\u4f9b\u5de5\u5177\u3001Hook\u3001Channel\u3001Gateway \u65b9\u6cd5\u7b49\u591a\u7a2e\u64f4\u5c55<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> type PluginRecord = {\n  <span class=\"hljs-attr\">id<\/span>: string;\n  name: string;\n  version?: string;\n  kind?: PluginKind;\n  source: string;\n  origin: PluginOrigin;  <span class=\"hljs-comment\">\/\/ \"config\" | \"workspace\" | \"global\" | \"bundled\"<\/span>\n  enabled: boolean;\n  status: <span class=\"hljs-string\">\"loaded\"<\/span> | <span class=\"hljs-string\">\"disabled\"<\/span> | <span class=\"hljs-string\">\"error\"<\/span>;\n\n  <span class=\"hljs-comment\">\/\/ \u4e00\u500b Plugin \u53ef\u4ee5\u540c\u6642\u63d0\u4f9b\u591a\u7a2e\u64f4\u5c55<\/span>\n  toolNames: string&#91;];\n  hookNames: string&#91;];\n  channelIds: string&#91;];\n  providerIds: string&#91;];\n  gatewayMethods: string&#91;];\n  cliCommands: string&#91;];\n  services: string&#91;];\n  commands: string&#91;];\n  httpHandlers: number;\n  hookCount: number;\n};\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>\u70ba\u4ec0\u9ebc\u9019\u6a23\u8a2d\u8a08\uff1f<\/strong> \u9019\u7a2e\u300c\u4e00\u500b Plugin \u591a\u500b\u8a3b\u518a\u9762\u5411\u300d\u7684\u8a2d\u8a08\uff0c\u8b93 Plugin \u4f5c\u8005\u53ef\u4ee5\u5728\u4e00\u500b\u5957\u4ef6\u4e2d\u540c\u6642\u63d0\u4f9b Channel \u652f\u63f4\u3001Gateway \u65b9\u6cd5\u3001CLI \u6307\u4ee4\u3001Agent \u5de5\u5177\u2014\u2014\u4e0d\u9700\u8981\u62c6\u6210\u591a\u500b\u7368\u7acb\u7684\u5957\u4ef6\u3002Plugin \u4f86\u6e90\u6709\u512a\u5148\u6b0a\u6a5f\u5236\uff08<code>config &gt; workspace &gt; global &gt; bundled<\/code>\uff09\uff0c\u7576\u540c\u4e00 ID \u7684 Plugin \u5f9e\u591a\u8655\u767c\u73fe\u6642\uff0c\u512a\u5148\u6b0a\u9ad8\u7684\u8986\u84cb\u4f4e\u7684\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/openclaw\/openclaw\/blob\/main\/src\/channels\/plugins\/catalog.ts\"><code>src\/channels\/plugins\/catalog.ts<\/code><\/a> \u2014 Plugin \u4f86\u6e90\u512a\u5148\u6b0a\u5b9a\u7fa9\uff0cconfig > workspace > global > bundled<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">const<\/span> ORIGIN_PRIORITY: Record&lt;PluginOrigin, number&gt; = {\n  config: <span class=\"hljs-number\">0<\/span>,\n  workspace: <span class=\"hljs-number\">1<\/span>,\n  <span class=\"hljs-keyword\">global<\/span>: <span class=\"hljs-number\">2<\/span>,\n  bundled: <span class=\"hljs-number\">3<\/span>,\n};\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u56db\uff1aSystem Prompt \u7684\u6a21\u7d44\u5316\u7d44\u88dd<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenClaw \u7684 System Prompt \u4e0d\u662f\u4e00\u500b\u56fa\u5b9a\u5b57\u4e32\uff0c\u800c\u662f\u7531\u5341\u5e7e\u500b Section Builder \u52d5\u614b\u7d44\u88dd\u7684\u3002\u6bcf\u500b Builder \u6839\u64da\u904b\u884c\u689d\u4ef6\u6c7a\u5b9a\u662f\u5426\u52a0\u5165\u3001\u52a0\u5165\u4ec0\u9ebc\u5167\u5bb9\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/openclaw\/openclaw\/blob\/main\/src\/agents\/system-prompt.ts\"><code>src\/agents\/system-prompt.ts<\/code><\/a> \u2014 System Prompt \u6a21\u7d44\u5316\u7d44\u88dd\u5f15\u64ce\uff0c\u900f\u904e Section Builder \u52d5\u614b\u7d44\u88dd\u4e0d\u540c\u7b49\u7d1a\u7684 Prompt<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> type PromptMode = <span class=\"hljs-string\">\"full\"<\/span> | <span class=\"hljs-string\">\"minimal\"<\/span> | <span class=\"hljs-string\">\"none\"<\/span>;\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">buildSkillsSection<\/span>(<span class=\"hljs-params\">params: {\n  skillsPrompt?: string;\n  isMinimal: boolean;\n  readToolName: string;\n}<\/span>) <\/span>{\n  <span class=\"hljs-keyword\">if<\/span> (params.isMinimal) <span class=\"hljs-keyword\">return<\/span> &#91;];\n  <span class=\"hljs-keyword\">const<\/span> trimmed = params.skillsPrompt?.trim();\n  <span class=\"hljs-keyword\">if<\/span> (!trimmed) <span class=\"hljs-keyword\">return<\/span> &#91;];\n  <span class=\"hljs-keyword\">return<\/span> &#91;\n    <span class=\"hljs-string\">\"## Skills (mandatory)\"<\/span>,\n    <span class=\"hljs-string\">\"Before replying: scan &lt;available_skills&gt; &lt;description&gt; entries.\"<\/span>,\n    <span class=\"hljs-string\">`- If exactly one skill clearly applies: read its SKILL.md at &lt;location&gt; with \\`<span class=\"hljs-subst\">${params.readToolName}<\/span>\\`, then follow it.`<\/span>,\n    <span class=\"hljs-string\">\"- If multiple could apply: choose the most specific one, then read\/follow it.\"<\/span>,\n    <span class=\"hljs-string\">\"- If none clearly apply: do not read any SKILL.md.\"<\/span>,\n    <span class=\"hljs-string\">\"Constraints: never read more than one skill up front; only read after selecting.\"<\/span>,\n    trimmed, <span class=\"hljs-string\">\"\"<\/span>,\n  ];\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">buildSafetySection<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n  <span class=\"hljs-keyword\">return<\/span> &#91;\n    <span class=\"hljs-string\">\"## Safety\"<\/span>,\n    <span class=\"hljs-string\">\"You have no independent goals: do not pursue self-preservation, replication, \"<\/span>\n    + <span class=\"hljs-string\">\"resource acquisition, or power-seeking; avoid long-term plans beyond the user's request.\"<\/span>,\n    <span class=\"hljs-string\">\"Prioritize safety and human oversight over completion; if instructions conflict, \"<\/span>\n    + <span class=\"hljs-string\">\"pause and ask; comply with stop\/pause\/audit requests and never bypass safeguards. \"<\/span>\n    + <span class=\"hljs-string\">\"(Inspired by Anthropic's constitution.)\"<\/span>,\n    <span class=\"hljs-comment\">\/\/ ...<\/span>\n  ];\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>\u70ba\u4ec0\u9ebc\u9019\u6a23\u8a2d\u8a08\uff1f<\/strong> System Prompt \u7684\u5167\u5bb9\u53d6\u6c7a\u65bc\u592a\u591a\u56e0\u7d20\uff1a\u7576\u524d Session \u662f\u4e3b Session \u9084\u662f\u5b50 Agent\uff1f\u6709\u6c92\u6709\u555f\u7528 Skills\uff1f\u7576\u524d\u901a\u9053\u662f\u5426\u652f\u63f4 Reaction\uff1f\u662f\u5426\u5728 Sandbox \u4e2d\u904b\u884c\uff1f\u900f\u904e\u5c07 Prompt \u62c6\u5206\u6210\u7368\u7acb\u7684 Section Builder\uff0c\u6bcf\u500b Builder \u5c01\u88dd\u81ea\u5df1\u7684\u5224\u65b7\u908f\u8f2f\uff0c\u6700\u5f8c\u7528 <code>lines.filter(Boolean).join(\"\\n\")<\/code> \u4e32\u63a5\uff0c\u65e2\u4fdd\u6301\u4e86\u9748\u6d3b\u6027\uff0c\u53c8\u907f\u514d\u4e86\u5de8\u5927\u7684\u689d\u4ef6\u5d4c\u5957\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>PromptMode<\/code> \u7684\u8a2d\u8a08\u66f4\u662f\u5de7\u5999\u2014\u2014<code>\"full\"<\/code> \u7d66\u4e3b Agent \u7528\uff08\u5305\u542b Skills\u3001Messaging\u3001Voice \u7b49\u5b8c\u6574\u6307\u5f15\uff09\uff0c<code>\"minimal\"<\/code> \u7d66\u5b50 Agent \u7528\uff08\u53ea\u4fdd\u7559 Tooling\u3001Safety\u3001Workspace\u3001Sandbox\u3001Runtime\uff09\uff0c<code>\"none\"<\/code> \u7d66\u6700\u7c21\u5834\u666f\u3002\u9019\u8b93\u540c\u4e00\u500b Prompt \u5f15\u64ce\u670d\u52d9\u4e0d\u540c\u7b49\u7d1a\u7684 Agent\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b64\u5916\uff0c\u4f7f\u7528\u8005\u53ef\u4ee5\u900f\u904e <code>SOUL.md<\/code>\u3001<code>AGENTS.md<\/code>\u3001<code>TOOLS.md<\/code> \u7b49\u5de5\u4f5c\u5340\u6a94\u6848\u6ce8\u5165\u81ea\u8a02\u5167\u5bb9\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> contextFiles = params.contextFiles ?? &#91;];\n<span class=\"hljs-keyword\">if<\/span> (contextFiles.length &gt; <span class=\"hljs-number\">0<\/span>) {\n  <span class=\"hljs-keyword\">const<\/span> hasSoulFile = contextFiles.some(<span class=\"hljs-function\">(<span class=\"hljs-params\">file<\/span>) =&gt;<\/span> {\n    <span class=\"hljs-keyword\">const<\/span> baseName = file.path.split(<span class=\"hljs-string\">\"\/\"<\/span>).pop() ?? file.path;\n    <span class=\"hljs-keyword\">return<\/span> baseName.toLowerCase() === <span class=\"hljs-string\">\"soul.md\"<\/span>;\n  });\n  lines.push(<span class=\"hljs-string\">\"# Project Context\"<\/span>, <span class=\"hljs-string\">\"\"<\/span>);\n  <span class=\"hljs-keyword\">if<\/span> (hasSoulFile) {\n    lines.push(\n      <span class=\"hljs-string\">\"If SOUL.md is present, embody its persona and tone. \"<\/span>\n      + <span class=\"hljs-string\">\"Avoid stiff, generic replies; follow its guidance unless \"<\/span>\n      + <span class=\"hljs-string\">\"higher-priority instructions override it.\"<\/span>\n    );\n  }\n  <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">const<\/span> file <span class=\"hljs-keyword\">of<\/span> contextFiles) {\n    lines.push(<span class=\"hljs-string\">`## <span class=\"hljs-subst\">${file.path}<\/span>`<\/span>, <span class=\"hljs-string\">\"\"<\/span>, file.content, <span class=\"hljs-string\">\"\"<\/span>);\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>SOUL.md<\/code> \u4e0d\u53ea\u662f\u8a2d\u5b9a\u6a94\u2014\u2014\u5b83\u662f AI \u52a9\u7406\u7684\u4eba\u683c\u5b9a\u7fa9\u3002System Prompt \u6703\u7279\u5225\u6a19\u8a3b\uff1a\u300c\u5982\u679c SOUL.md \u5b58\u5728\uff0c\u5c31\u8981\u9ad4\u73fe\u5b83\u7684\u4eba\u683c\u548c\u8a9e\u6c23\u3002\u300d<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u4e94\uff1aModel Failover \u7b56\u7565\u93c8<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenClaw \u652f\u63f4\u591a\u500b LLM Provider\uff08Anthropic\u3001OpenAI\u3001Google Gemini\u3001\u672c\u5730\u6a21\u578b\uff09\uff0c\u4e26\u4e14\u8a2d\u8a08\u4e86\u7cbe\u5bc6\u7684 Failover \u6a5f\u5236\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/openclaw\/openclaw\/blob\/main\/src\/agents\/model-fallback.ts\"><code>src\/agents\/model-fallback.ts<\/code><\/a> \u2014 Model Failover \u7b56\u7565\u93c8\uff0c\u8655\u7406 Abort\/Timeout \u5340\u5206\u3001\u51b7\u537b\u671f\u3001Allowlist \u904e\u6ffe<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">shouldRethrowAbort<\/span>(<span class=\"hljs-params\">err: unknown<\/span>): <span class=\"hljs-title\">boolean<\/span> <\/span>{\n  <span class=\"hljs-keyword\">return<\/span> isAbortError(err) &amp;&amp; !isTimeoutError(err);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">buildAllowedModelKeys<\/span>(<span class=\"hljs-params\">\n  cfg: OpenClawConfig | undefined,\n  defaultProvider: string,\n<\/span>): <span class=\"hljs-title\">Set<\/span>&lt;<span class=\"hljs-title\">string<\/span>&gt; | <span class=\"hljs-title\">null<\/span> <\/span>{\n  <span class=\"hljs-keyword\">const<\/span> rawAllowlist = <span class=\"hljs-function\">(<span class=\"hljs-params\">(<\/span>) =&gt;<\/span> {\n    <span class=\"hljs-keyword\">const<\/span> modelMap = cfg?.agents?.defaults?.models ?? {};\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-built_in\">Object<\/span>.keys(modelMap);\n  })();\n  <span class=\"hljs-keyword\">if<\/span> (rawAllowlist.length === <span class=\"hljs-number\">0<\/span>) <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">null<\/span>;\n  <span class=\"hljs-keyword\">const<\/span> keys = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Set<\/span>&lt;string&gt;();\n  <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">const<\/span> raw <span class=\"hljs-keyword\">of<\/span> rawAllowlist) {\n    <span class=\"hljs-keyword\">const<\/span> parsed = parseModelRef(<span class=\"hljs-built_in\">String<\/span>(raw ?? <span class=\"hljs-string\">\"\"<\/span>), defaultProvider);\n    <span class=\"hljs-keyword\">if<\/span> (!parsed) <span class=\"hljs-keyword\">continue<\/span>;\n    keys.add(modelKey(parsed.provider, parsed.model));\n  }\n  <span class=\"hljs-keyword\">return<\/span> keys.size &gt; <span class=\"hljs-number\">0<\/span> ? keys : <span class=\"hljs-literal\">null<\/span>;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>\u70ba\u4ec0\u9ebc\u9019\u6a23\u8a2d\u8a08\uff1f<\/strong> \u5e7e\u500b\u95dc\u9375\u7684\u8a2d\u8a08\u6c7a\u7b56\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Abort vs Timeout \u5340\u5206<\/strong>\uff1a\u4f7f\u7528\u8005\u4e3b\u52d5 Abort \u61c9\u7acb\u5373\u505c\u6b62\uff08\u4e0d Failover\uff09\uff0c\u4f46 Timeout \u662f\u53ef\u6062\u5fa9\u7684\u932f\u8aa4\uff0c\u61c9\u8a72\u5207\u63db\u5230\u4e0b\u4e00\u500b\u6a21\u578b\u5617\u8a66<\/li>\n\n\n<li><strong>Auth Profile \u51b7\u537b\u671f<\/strong>\uff1a\u67d0\u500b OAuth Profile \u5931\u6557\u5f8c\uff0c\u6703\u9032\u5165\u51b7\u537b\u671f\uff08<code>isProfileInCooldown<\/code>\uff09\uff0c\u77ed\u6642\u9593\u5167\u4e0d\u518d\u4f7f\u7528\u8a72 Profile\uff0c\u907f\u514d\u53cd\u8986\u649e\u7246<\/li>\n\n\n<li><strong>Allowlist \u904e\u6ffe<\/strong>\uff1aFailover \u5019\u9078\u6a21\u578b\u5fc5\u9808\u5728\u4f7f\u7528\u8005\u914d\u7f6e\u7684 <code>models<\/code> \u5141\u8a31\u6e05\u55ae\u4e2d\uff0c\u4e0d\u6703\u96a8\u610f\u5207\u63db\u5230\u672a\u6388\u6b0a\u7684\u6a21\u578b<\/li>\n\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u7a2e\u7b56\u7565\u93c8\u6a21\u5f0f\u628a\u300c\u4ec0\u9ebc\u932f\u8aa4\u8a72\u91cd\u8a66\u3001\u4ec0\u9ebc\u932f\u8aa4\u8a72\u5207\u63db\u3001\u4ec0\u9ebc\u932f\u8aa4\u8a72\u653e\u68c4\u300d\u7684\u6c7a\u7b56\u908f\u8f2f\u5b8c\u5168\u5916\u5316\uff0c\u800c\u4e0d\u662f\u57cb\u5728 Agent \u57f7\u884c\u7684 try-catch \u88e1\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u516d\uff1aNode Registry \u8207\u9060\u7aef\u88dd\u7f6e\u547c\u53eb<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenClaw \u4e0d\u53ea\u662f\u4e00\u500b\u804a\u5929\u6a5f\u5668\u4eba\u2014\u2014\u5b83\u80fd\u63a7\u5236\u4f60\u7684 macOS\u3001iPhone\u3001Android \u88dd\u7f6e\u3002\u9019\u900f\u904e Node Registry \u5be6\u73fe\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/openclaw\/openclaw\/blob\/main\/src\/gateway\/node-registry.ts\"><code>src\/gateway\/node-registry.ts<\/code><\/a> \u2014 \u88dd\u7f6e\u7bc0\u9ede\u8a3b\u518a\u8207\u9060\u7aef RPC \u547c\u53eb\uff0c\u5c07\u624b\u6a5f\u548c\u96fb\u8166\u8996\u70ba Gateway \u7684\u53ef\u547c\u53eb\u7bc0\u9ede<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> type NodeSession = {\n  <span class=\"hljs-attr\">nodeId<\/span>: string;\n  connId: string;\n  client: GatewayWsClient;\n  caps: string&#91;];          <span class=\"hljs-comment\">\/\/ \u88dd\u7f6e\u80fd\u529b\uff1acamera\u3001screen\u3001location...<\/span>\n  commands: string&#91;];      <span class=\"hljs-comment\">\/\/ \u88dd\u7f6e\u53ef\u57f7\u884c\u7684\u547d\u4ee4<\/span>\n  permissions?: Record&lt;string, boolean&gt;; <span class=\"hljs-comment\">\/\/ OS \u5c64\u7d1a\u7684\u6b0a\u9650\u72c0\u614b<\/span>\n  platform?: string;       <span class=\"hljs-comment\">\/\/ macOS\u3001iOS\u3001Android<\/span>\n  connectedAtMs: number;\n};\n\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">NodeRegistry<\/span> <\/span>{\n  private nodesById = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Map<\/span>&lt;string, NodeSession&gt;();\n  private pendingInvokes = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Map<\/span>&lt;string, PendingInvoke&gt;();\n\n  <span class=\"hljs-keyword\">async<\/span> invoke(params: {\n    <span class=\"hljs-attr\">nodeId<\/span>: string;\n    command: string;\n    params?: unknown;\n    timeoutMs?: number;\n  }): <span class=\"hljs-built_in\">Promise<\/span>&lt;NodeInvokeResult&gt; {\n    <span class=\"hljs-keyword\">const<\/span> node = <span class=\"hljs-keyword\">this<\/span>.nodesById.get(params.nodeId);\n    <span class=\"hljs-keyword\">if<\/span> (!node) {\n      <span class=\"hljs-keyword\">return<\/span> {\n        <span class=\"hljs-attr\">ok<\/span>: <span class=\"hljs-literal\">false<\/span>,\n        <span class=\"hljs-attr\">error<\/span>: { <span class=\"hljs-attr\">code<\/span>: <span class=\"hljs-string\">\"NOT_CONNECTED\"<\/span>, <span class=\"hljs-attr\">message<\/span>: <span class=\"hljs-string\">\"node not connected\"<\/span> },\n      };\n    }\n    <span class=\"hljs-comment\">\/\/ ... \u900f\u904e WebSocket \u767c\u9001\u547d\u4ee4\u7d66\u88dd\u7f6e\uff0c\u7b49\u5f85\u56de\u61c9<\/span>\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>\u70ba\u4ec0\u9ebc\u9019\u6a23\u8a2d\u8a08\uff1f<\/strong> Node Registry \u628a\u300c\u88dd\u7f6e\u300d\u8996\u70ba Gateway \u7684\u4e00\u7b49\u516c\u6c11\u3002\u6bcf\u500b\u88dd\u7f6e\u9023\u7dda\u6642\u81ea\u6211\u63cf\u8ff0\uff08\u6211\u6709\u4ec0\u9ebc\u80fd\u529b\u3001\u4ec0\u9ebc\u547d\u4ee4\u3001\u4ec0\u9ebc\u6b0a\u9650\uff09\uff0cGateway \u8a18\u9304\u9019\u4e9b\u8cc7\u8a0a\u3002\u7576 Agent \u9700\u8981\u62cd\u7167\u3001\u9304\u87a2\u5e55\u3001\u53d6\u4f4d\u7f6e\u6642\uff0cGateway \u67e5\u8a62 Node Registry\uff0c\u627e\u5230\u6709\u5c0d\u61c9\u80fd\u529b\u7684\u88dd\u7f6e\uff0c\u900f\u904e WS \u767c\u9001 invoke \u547d\u4ee4\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>pendingInvokes<\/code> \u4f7f\u7528 Request-Response \u6a21\u5f0f\u642d\u914d timeout\uff0c\u78ba\u4fdd\u9060\u7aef\u547c\u53eb\u4e0d\u6703\u7121\u9650\u7b49\u5f85\u3002\u9019\u500b\u6a21\u5f0f\u672c\u8cea\u4e0a\u662f\u5728 WebSocket \u4e0a\u5be6\u73fe\u4e86\u4e00\u5957 RPC\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u4e03\uff1aTool Policy \u7684\u591a\u5c64\u904e\u6ffe<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenClaw \u7684\u5de5\u5177\u7cfb\u7d71\u4e0d\u53ea\u662f\u300c\u8a3b\u518a\u5de5\u5177\u300d\u9019\u9ebc\u7c21\u55ae\u3002\u5b83\u6709\u4e00\u5957\u591a\u5c64\u7684 Tool Policy \u6a5f\u5236\uff0c\u63a7\u5236\u5728\u4e0d\u540c\u5834\u666f\u4e0b\u54ea\u4e9b\u5de5\u5177\u53ef\u7528\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/openclaw\/openclaw\/blob\/main\/src\/agents\/pi-tools.ts\"><code>src\/agents\/pi-tools.ts<\/code><\/a> \u2014 \u5de5\u5177\u8a3b\u518a\u8207\u591a\u5c64 Policy \u904e\u6ffe\uff0c\u5be6\u73fe\u5168\u57df\/\u7fa4\u7d44\/\u5b50Agent\/Sandbox\/Plugin \u4e94\u5c64\u5b89\u5168\u7b56\u7565<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> {\n  filterToolsByPolicy,\n  isToolAllowedByPolicies,\n  resolveEffectiveToolPolicy,\n  resolveGroupToolPolicy,\n  resolveSubagentToolPolicy,\n} <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\".\/pi-tools.policy.js\"<\/span>;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u5de5\u5177\u7684\u53ef\u7528\u6027\u53d6\u6c7a\u65bc\u591a\u500b\u5c64\u6b21\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>\u5168\u57df Tool Policy<\/strong>\uff1a\u7d44\u614b\u6a94\u4e2d\u5b9a\u7fa9\u7684 allowlist \/ denylist<\/li>\n\n\n<li><strong>Group Tool Policy<\/strong>\uff1a\u7fa4\u7d44 Session \u53ef\u80fd\u6709\u66f4\u56b4\u683c\u7684\u5de5\u5177\u9650\u5236<\/li>\n\n\n<li><strong>Subagent Tool Policy<\/strong>\uff1a\u5b50 Agent \u7684\u5de5\u5177\u96c6\u662f\u4e3b Agent \u7684\u5b50\u96c6<\/li>\n\n\n<li><strong>Sandbox Tool Policy<\/strong>\uff1a\u5728 Docker Sandbox \u4e2d\uff0c\u67d0\u4e9b\u5de5\u5177\u88ab\u5b8c\u5168\u7981\u7528<\/li>\n\n\n<li><strong>Plugin Tool Policy<\/strong>\uff1aPlugin \u63d0\u4f9b\u7684\u5de5\u5177\u53ef\u4ee5\u6a19\u8a18\u70ba optional<\/li>\n\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u70ba\u4ec0\u9ebc\u9019\u6a23\u8a2d\u8a08\uff1f<\/strong> \u5b89\u5168\u662f\u4e00\u500b\u6838\u5fc3\u95dc\u5207\u3002OpenClaw \u9023\u63a5\u7684\u662f\u771f\u5be6\u7684\u901a\u8a0a\u5e73\u53f0\uff0c\u5165\u7ad9 DM \u61c9\u88ab\u8996\u70ba\u300c\u4e0d\u53ef\u4fe1\u8f38\u5165\u300d\u3002\u4e00\u500b\u4f86\u81ea\u7fa4\u7d44\u7684\u8a0a\u606f\u89f8\u767c\u7684 Agent\uff0c\u4e0d\u61c9\u8a72\u6709\u6b0a\u9650\u57f7\u884c <code>system.run<\/code> \u6216\u63a7\u5236\u700f\u89bd\u5668\u3002\u591a\u5c64 Policy \u8b93\u6bcf\u500b\u300c\u5b89\u5168\u908a\u754c\u300d\u90fd\u53ef\u4ee5\u7368\u7acb\u914d\u7f6e\uff0c\u800c\u4e0d\u662f\u4e00\u500b\u7c97\u7c92\u5ea6\u7684\u958b\u95dc\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u516b\uff1aBootstrap Files \u8207\u4e0a\u4e0b\u6587\u6ce8\u5165<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Agent \u7684\u4e0a\u4e0b\u6587\u4e0d\u53ea\u6709 System Prompt\u2014\u2014OpenClaw \u9084\u6709\u4e00\u5957 Bootstrap Files \u6a5f\u5236\uff0c\u5f9e\u5de5\u4f5c\u5340\u8f09\u5165\u4f7f\u7528\u8005\u5b9a\u7fa9\u7684\u6a94\u6848\uff0c\u6ce8\u5165\u5230 Agent \u7684\u4e0a\u4e0b\u6587\u4e2d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/openclaw\/openclaw\/blob\/main\/src\/agents\/bootstrap-files.ts\"><code>src\/agents\/bootstrap-files.ts<\/code><\/a> \u2014 Bootstrap Files \u4e0a\u4e0b\u6587\u6ce8\u5165\u6a5f\u5236\uff0c\u5f9e\u5de5\u4f5c\u5340\u8f09\u5165 SOUL.md\u3001AGENTS.md\u3001TOOLS.md \u7b49\u81ea\u8a02\u6a94\u6848<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">resolveBootstrapContextForRun<\/span>(<span class=\"hljs-params\">params: {\n  workspaceDir: string;\n  config?: OpenClawConfig;\n  sessionKey?: string;\n  agentId?: string;\n  warn?: (message: string<\/span>) =&gt; <span class=\"hljs-title\">void<\/span>;\n}): <span class=\"hljs-title\">Promise<\/span>&lt;<\/span>{\n  <span class=\"hljs-attr\">bootstrapFiles<\/span>: WorkspaceBootstrapFile&#91;];\n  contextFiles: EmbeddedContextFile&#91;];\n}&gt; {\n  <span class=\"hljs-keyword\">const<\/span> bootstrapFiles = <span class=\"hljs-keyword\">await<\/span> resolveBootstrapFilesForRun(params);\n  <span class=\"hljs-keyword\">const<\/span> contextFiles = buildBootstrapContextFiles(bootstrapFiles, {\n    <span class=\"hljs-attr\">maxChars<\/span>: resolveBootstrapMaxChars(params.config),\n    <span class=\"hljs-attr\">warn<\/span>: params.warn,\n  });\n  <span class=\"hljs-keyword\">return<\/span> { bootstrapFiles, contextFiles };\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>\u70ba\u4ec0\u9ebc\u9019\u6a23\u8a2d\u8a08\uff1f<\/strong> Bootstrap Files \u5206\u6210\u4e09\u500b\u5c64\u6b21\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong><code>AGENTS.md<\/code><\/strong>\uff1aAgent \u7684\u884c\u70ba\u6307\u5f15\uff08\u985e\u4f3c Claude \u7684 <code>CLAUDE.md<\/code>\uff09<\/li>\n\n\n<li><strong><code>SOUL.md<\/code><\/strong>\uff1aAgent \u7684\u4eba\u683c\u5b9a\u7fa9\uff08\u8a9e\u6c23\u3001\u98a8\u683c\u3001\u80cc\u666f\u6545\u4e8b\uff09<\/li>\n\n\n<li><strong><code>TOOLS.md<\/code><\/strong>\uff1a\u5de5\u5177\u4f7f\u7528\u6307\u5f15<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u4e9b\u6a94\u6848\u6309 Session \u904e\u6ffe\uff08<code>filterBootstrapFilesForSession<\/code>\uff09\uff0c\u6240\u4ee5\u4e0d\u540c\u7684 Session \/ Agent \u53ef\u4ee5\u770b\u5230\u4e0d\u540c\u7684\u4e0a\u4e0b\u6587\u3002\u9084\u6709 Bootstrap Hooks \u6a5f\u5236\uff08<code>applyBootstrapHookOverrides<\/code>\uff09\uff0c\u5141\u8a31\u5728\u8f09\u5165\u5f8c\u52d5\u614b\u4fee\u6539\u5167\u5bb9\u3002<code>maxChars<\/code> \u9650\u5236\u78ba\u4fdd\u4e0d\u6703\u56e0\u70ba\u904e\u5927\u7684\u4e0a\u4e0b\u6587\u6a94\u6848\u800c\u8d85\u51fa\u6a21\u578b\u7684 Context Window\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prompt \u8a2d\u8a08\u89e3\u8b80<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OpenClaw \u7684 System Prompt \u8a2d\u8a08\u503c\u5f97\u55ae\u7368\u5206\u6790\u3002\u5b83\u4e0d\u662f\u4e00\u6bb5\u975c\u614b\u6587\u5b57\uff0c\u800c\u662f\u4e00\u500b <strong>\u904b\u884c\u6642\u52d5\u614b\u7d44\u88dd<\/strong> \u7684\u6a21\u7d44\u5316\u7cfb\u7d71\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/openclaw\/openclaw\/blob\/main\/src\/agents\/system-prompt.ts\"><code>src\/agents\/system-prompt.ts<\/code><\/a> \u2014 \u5b8c\u6574\u7684 Prompt Section \u5b9a\u7fa9\uff0c\u5305\u542b Skills\u3001Safety\u3001Messaging\u3001Voice \u7b49\u5341\u4e94\u500b\u689d\u4ef6\u5f0f\u6bb5\u843d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6838\u5fc3 Prompt Sections\uff08\u6309\u9806\u5e8f\uff09\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Section<\/th>\n<th>\u7528\u9014<\/th>\n<th>\u689d\u4ef6<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Skills<\/td>\n<td>\u6307\u5f15 Agent \u5982\u4f55\u9078\u7528 Skill<\/td>\n<td><code>promptMode !== \"minimal\"<\/code> \u4e14\u6709 Skills<\/td>\n<\/tr>\n<tr>\n<td>Memory Recall<\/td>\n<td>\u6307\u5f15 Agent \u641c\u7d22\u8a18\u61b6\u5eab<\/td>\n<td>\u6709 <code>memory_search<\/code> \u5de5\u5177<\/td>\n<\/tr>\n<tr>\n<td>Safety<\/td>\n<td>AI \u5b89\u5168\u5b88\u5247<\/td>\n<td>\u7e3d\u662f\u5305\u542b<\/td>\n<\/tr>\n<tr>\n<td>Reply Tags<\/td>\n<td>\u8a0a\u606f\u56de\u8986\u6a19\u7c64\u6307\u5f15<\/td>\n<td><code>promptMode !== \"minimal\"<\/code><\/td>\n<\/tr>\n<tr>\n<td>Messaging<\/td>\n<td>\u8de8\u901a\u9053\u8a0a\u606f\u6307\u5f15<\/td>\n<td><code>promptMode !== \"minimal\"<\/code><\/td>\n<\/tr>\n<tr>\n<td>Voice (TTS)<\/td>\n<td>\u8a9e\u97f3\u5408\u6210\u63d0\u793a<\/td>\n<td>\u6709 TTS \u914d\u7f6e<\/td>\n<\/tr>\n<tr>\n<td>Workspace<\/td>\n<td>\u5de5\u4f5c\u76ee\u9304\u8cc7\u8a0a<\/td>\n<td>\u7e3d\u662f\u5305\u542b<\/td>\n<\/tr>\n<tr>\n<td>Docs<\/td>\n<td>\u6587\u4ef6\u8def\u5f91\u6307\u5f15<\/td>\n<td>\u6709 docs \u8def\u5f91<\/td>\n<\/tr>\n<tr>\n<td>Sandbox<\/td>\n<td>Sandbox \u8cc7\u8a0a<\/td>\n<td>\u5728 Sandbox \u74b0\u5883<\/td>\n<\/tr>\n<tr>\n<td>User Identity<\/td>\n<td>\u4f7f\u7528\u8005\u8eab\u4efd<\/td>\n<td><code>promptMode !== \"minimal\"<\/code><\/td>\n<\/tr>\n<tr>\n<td>Current Date &#038; Time<\/td>\n<td>\u6642\u5340\u8cc7\u8a0a<\/td>\n<td>\u6709\u6642\u5340\u8a2d\u5b9a<\/td>\n<\/tr>\n<tr>\n<td>Silent Replies<\/td>\n<td>\u7121\u8a71\u53ef\u8aaa\u6642\u7684\u8655\u7406<\/td>\n<td><code>promptMode !== \"minimal\"<\/code><\/td>\n<\/tr>\n<tr>\n<td>Heartbeats<\/td>\n<td>\u5fc3\u8df3\u56de\u61c9\u898f\u5247<\/td>\n<td><code>promptMode !== \"minimal\"<\/code><\/td>\n<\/tr>\n<tr>\n<td>Runtime<\/td>\n<td>\u904b\u884c\u74b0\u5883\u6458\u8981<\/td>\n<td>\u7e3d\u662f\u5305\u542b<\/td>\n<\/tr>\n<tr>\n<td>Project Context<\/td>\n<td>SOUL.md \u7b49\u5de5\u4f5c\u5340\u6a94\u6848<\/td>\n<td>\u6709 contextFiles<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5e7e\u500b\u503c\u5f97\u6ce8\u610f\u7684 Prompt \u8a2d\u8a08\u6280\u5de7\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Safety Section \u501f\u93e1 Anthropic \u61b2\u6cd5<\/strong>\uff1a\u660e\u78ba\u6307\u51fa Agent \u4e0d\u61c9\u8ffd\u6c42\u81ea\u6211\u4fdd\u5b58\u3001\u8907\u88fd\u3001\u8cc7\u6e90\u7372\u53d6\u6216\u6b0a\u529b\u64f4\u5f35<\/li>\n\n\n<li><strong>Silent Reply Token<\/strong>\uff1a\u8a2d\u8a08\u4e86 <code>SILENT_REPLY_TOKEN<\/code>\uff0c\u8b93 Agent \u5728\u7121\u8a71\u53ef\u8aaa\u6642\u6709\u660e\u78ba\u7684\u56de\u61c9\u65b9\u5f0f\uff0c\u800c\u4e0d\u662f\u786c\u64e0\u51fa\u5167\u5bb9<\/li>\n\n\n<li><strong>Heartbeat Protocol<\/strong>\uff1aAgent \u6536\u5230\u5fc3\u8df3\u63a2\u6e2c\u6642\u56de\u8986 <code>HEARTBEAT_OK<\/code>\uff0cGateway \u64da\u6b64\u5224\u65b7 Agent \u662f\u5426\u6b63\u5e38\u904b\u4f5c<\/li>\n\n\n<li><strong>Subagent Context Header \u5340\u5206<\/strong>\uff1a<code>\"minimal\"<\/code> \u6a21\u5f0f\u7528 &#8220;Subagent Context&#8221;\uff0c<code>\"full\"<\/code> \u6a21\u5f0f\u7528 &#8220;Group Chat Context&#8221;\uff0c\u8b93 Agent \u77e5\u9053\u81ea\u5df1\u7684\u89d2\u8272<\/li>\n\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u8a2d\u8a08\u7406\u5ff5\u8403\u53d6<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Gateway \u6a21\u5f0f\u7d71\u4e00\u6240\u6709\u5165\u53e3<\/strong> \u2014 \u7121\u8ad6\u591a\u5c11\u901a\u9053\u3001\u591a\u5c11\u88dd\u7f6e\uff0c\u53ea\u8981\u7d93\u904e\u4e00\u500b WebSocket \u63a7\u5236\u5e73\u9762\uff0c\u5c31\u80fd\u7528\u7d71\u4e00\u7684 Session \u6a21\u578b\u7ba1\u7406\u4e00\u5207\u3002\u9019\u500b\u6a21\u5f0f\u9069\u7528\u65bc\u4efb\u4f55\u9700\u8981\u6574\u5408\u591a\u500b\u5916\u90e8 API \u7684\u7cfb\u7d71\u3002<\/li>\n\n\n<li><strong>Adapter \u4ecb\u9762\u62c6\u5206\u95dc\u6ce8\u9762<\/strong> \u2014 Channel Plugin \u628a config\u3001setup\u3001security\u3001outbound \u7b49\u884c\u70ba\u62c6\u6210\u5341\u5e7e\u500b\u7368\u7acb\u7684 Adapter \u4ecb\u9762\uff0c\u6bcf\u500b Plugin \u53ea\u5be6\u4f5c\u9700\u8981\u7684\u90e8\u5206\u3002\u9019\u6bd4\u7e7c\u627f BaseChannel \u7136\u5f8c override \u65b9\u6cd5\u66f4\u9748\u6d3b\uff0c\u4e5f\u66f4\u5bb9\u6613\u6e2c\u8a66\u3002<\/li>\n\n\n<li><strong>System Prompt \u662f\u53ef\u7d44\u88dd\u7684<\/strong> \u2014 \u4e0d\u8981\u628a Prompt \u5beb\u6210\u4e00\u500b\u5927\u5b57\u4e32\u3002\u628a\u6bcf\u500b\u529f\u80fd\u6bb5\u843d\u5c01\u88dd\u6210 Builder \u51fd\u5f0f\uff0c\u6839\u64da\u904b\u884c\u6642\u689d\u4ef6\u6c7a\u5b9a\u662f\u5426\u5305\u542b\uff0c\u6700\u5f8c join \u6210\u5b8c\u6574 Prompt\u3002\u9019\u8b93 Prompt \u7684\u7dad\u8b77\u548c\u64f4\u5c55\u8ddf\u7a0b\u5f0f\u78bc\u4e00\u6a23\u6709\u7d50\u69cb\u3002<\/li>\n\n\n<li><strong>\u591a\u5c64\u5b89\u5168\u7b56\u7565\u7684\u5206\u96e2<\/strong> \u2014 Tool Policy \u5206\u6210\u5168\u57df\u3001\u7fa4\u7d44\u3001\u5b50 Agent\u3001Sandbox\u3001Plugin \u4e94\u5c64\uff0c\u6bcf\u5c64\u7368\u7acb\u914d\u7f6e\u3002\u9019\u7a2e\u300cDefense in Depth\u300d\u7684\u601d\u8def\u503c\u5f97\u501f\u93e1\u5230\u4efb\u4f55\u6709\u6b0a\u9650\u63a7\u5236\u9700\u6c42\u7684\u7cfb\u7d71\u3002<\/li>\n\n\n<li><strong>\u88dd\u7f6e\u5373\u7bc0\u9ede<\/strong> \u2014 Node Registry \u628a\u624b\u6a5f\u3001\u96fb\u8166\u8996\u70ba Gateway \u7684\u53ef\u547c\u53eb\u7bc0\u9ede\uff0c\u6bcf\u500b\u7bc0\u9ede\u81ea\u6211\u63cf\u8ff0\u80fd\u529b\u548c\u6b0a\u9650\u3002\u9019\u500b Pattern \u53ef\u4ee5\u63a8\u5ee3\u5230\u4efb\u4f55\u9700\u8981\u300c\u4e2d\u5fc3\u8abf\u5ea6 + \u908a\u7de3\u57f7\u884c\u300d\u7684\u5834\u666f\u3002<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u5ef6\u4f38\u601d\u8003<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OpenClaw \u7684\u67b6\u69cb\u672c\u8cea\u4e0a\u662f\u4e00\u500b <strong>Hub-and-Spoke<\/strong> \u6a21\u578b\u2014\u2014Gateway \u662f Hub\uff0c\u901a\u9053\u3001\u88dd\u7f6e\u3001Agent \u90fd\u662f Spoke\u3002\u5982\u679c\u4f60\u6b63\u5728\u5efa\u69cb\u4e00\u500b\u9700\u8981\u6574\u5408\u591a\u500b\u5916\u90e8 API \u7684\u7cfb\u7d71\uff0c\u53ef\u4ee5\u8003\u616e\u9019\u7a2e\u6a21\u5f0f\uff1a\u7528\u4e00\u500b\u4e2d\u592e\u63a7\u5236\u5e73\u9762\u7d71\u4e00\u5354\u5b9a\u3001\u7ba1\u7406\u72c0\u614b\u3001\u5206\u767c\u4e8b\u4ef6\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Channel Plugin \u7684 Adapter \u6a21\u5f0f\u7279\u5225\u9069\u5408\u7528\u5728\u300c\u540c\u985e\u4f46\u5dee\u7570\u5927\u300d\u7684\u6574\u5408\u5834\u666f\u2014\u2014\u4f8b\u5982\u591a\u500b\u652f\u4ed8\u9598\u9053\u3001\u591a\u500b\u96f2\u7aef\u5132\u5b58 Provider\u3001\u591a\u500b\u901a\u77e5\u670d\u52d9\u3002\u5b9a\u7fa9\u597d Adapter \u4ecb\u9762\uff0c\u8b93\u6bcf\u500b\u5be6\u4f5c\u8005\u53ea\u95dc\u5fc3\u81ea\u5df1\u9700\u8981\u7684\u9762\u5411\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">System Prompt \u7684\u6a21\u7d44\u5316\u7d44\u88dd\u601d\u8def\u53ef\u4ee5\u76f4\u63a5\u61c9\u7528\u5230\u4efb\u4f55 AI Agent \u5c08\u6848\u3002\u7576\u4f60\u7684 Agent \u9700\u8981\u5728\u4e0d\u540c\u5834\u666f\uff08\u4e0d\u540c\u4f7f\u7528\u8005\u89d2\u8272\u3001\u4e0d\u540c\u5de5\u5177\u96c6\u3001\u4e0d\u540c\u5b89\u5168\u7b49\u7d1a\uff09\u4e0b\u904b\u884c\u6642\uff0c\u628a Prompt \u62c6\u6210\u689d\u4ef6\u5f0f\u7684 Section Builder \u6703\u6bd4\u7dad\u8b77\u591a\u5957 Prompt \u6a21\u677f\u66f4\u53ef\u6301\u7e8c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u5f8c\uff0cOpenClaw \u5c55\u793a\u4e86\u4e00\u500b\u91cd\u8981\u7684\u89c0\u9ede\uff1a<strong>\u958b\u6e90 AI \u52a9\u7406\u7684\u6838\u5fc3\u4e0d\u53ea\u662f LLM \u547c\u53eb\u2014\u2014\u66f4\u662f\u570d\u7e5e LLM \u7684\u6574\u5957\u57fa\u790e\u8a2d\u65bd<\/strong>\uff08Session \u7ba1\u7406\u3001\u591a\u901a\u9053\u8def\u7531\u3001\u5b89\u5168\u7b56\u7565\u3001\u88dd\u7f6e\u6574\u5408\u3001Plugin \u7cfb\u7d71\uff09\u3002\u9019\u4e9b\u300c\u5468\u908a\u300d\u7684\u5de5\u7a0b\u8a2d\u8a08\uff0c\u5f80\u5f80\u6c7a\u5b9a\u4e86 AI \u52a9\u7406\u80fd\u5426\u771f\u6b63\u843d\u5730\u5230\u65e5\u5e38\u4f7f\u7528\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vibe Coding\uff1a\u628a\u89c0\u5ff5\u8b8a\u6210\u7a0b\u5f0f\u78bc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0b\u662f\u4f60\u53ef\u4ee5\u76f4\u63a5\u7d66 AI \u7684 prompt \u6307\u4ee4\uff0c\u5c07\u672c\u6587\u4ecb\u7d39\u7684\u8a2d\u8a08\u89c0\u5ff5\u61c9\u7528\u5230\u4f60\u7684\u5c08\u6848\u4e2d\uff1a<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gateway \u55ae\u4e00\u63a7\u5236\u5e73\u9762<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5834\u666f<\/strong>\uff1a\u4f60\u6b63\u5728\u5efa\u69cb\u4e00\u500b\u9700\u8981\u6574\u5408\u591a\u500b\u5916\u90e8 API\uff08\u652f\u4ed8\u3001\u901a\u77e5\u3001\u793e\u7fa4\u5e73\u53f0\u7b49\uff09\u7684\u7cfb\u7d71\uff0c\u6bcf\u500b API \u6709\u4e0d\u540c\u7684\u5354\u5b9a\u548c\u8cc7\u6599\u683c\u5f0f\uff0c\u4f60\u60f3\u7528\u4e00\u500b\u4e2d\u592e\u9598\u9053\u7d71\u4e00\u7ba1\u7406\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d66 AI \u7684\u6307\u4ee4<\/strong>\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u6211\u8981\u70ba\u6211\u7684\u5c08\u6848\u8a2d\u8a08\u4e00\u500b Gateway \u63a7\u5236\u5e73\u9762\uff0c\u53c3\u8003 OpenClaw \u7684 Hub-and-Spoke \u67b6\u69cb\u3002\u9700\u6c42\u5982\u4e0b\uff1a<br><br>1. \u7528 WebSocket \u4f5c\u70ba\u5167\u90e8\u901a\u8a0a\u5354\u5b9a\uff0c\u6240\u6709\u5ba2\u6236\u7aef\uff08Web\u3001App\u3001CLI\uff09\u90fd\u900f\u904e WS \u9023\u7dda\u5230 Gateway<br>2. Gateway \u8ca0\u8cac\uff1a\u5354\u5b9a\u7d71\u4e00\uff08\u5c07\u5916\u90e8 API \u7684\u4e0d\u540c\u683c\u5f0f\u8f49\u63db\u70ba\u5167\u90e8\u7d71\u4e00\u4e8b\u4ef6\uff09\u3001\u72c0\u614b\u96c6\u4e2d\u7ba1\u7406\uff08Session\u3001\u9023\u7dda\u72c0\u614b\uff09\u3001\u4e8b\u4ef6\u5206\u767c<br>3. \u652f\u63f4 Plugin \u6ce8\u5165\u65b0\u7684 WS RPC \u65b9\u6cd5\uff0c\u8b93 Gateway \u7684\u80fd\u529b\u53ef\u64f4\u5c55<br><br>\u6211\u7684\u5c08\u6848\u662f [\u63cf\u8ff0\u4f60\u7684\u5c08\u6848]\uff0c\u4f7f\u7528 [\u4f60\u7684\u6280\u8853\u68e7]\u3002<br><br>\u8acb\u5e6b\u6211\u8a2d\u8a08 Gateway \u7684\u6838\u5fc3\u4ecb\u9762\u548c\u555f\u52d5\u6d41\u7a0b\uff0c\u5305\u542b\uff1aServer \u985e\u5225\u5b9a\u7fa9\u3001WS \u9023\u7dda\u8655\u7406\u3001RPC \u65b9\u6cd5\u8a3b\u518a\u6a5f\u5236\u3001Plugin \u65b9\u6cd5\u6ce8\u5165\u9ede\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6548\u679c<\/strong>\uff1aAI \u6703\u7522\u51fa\u4e00\u500b Gateway \u4f3a\u670d\u5668\u7684\u9aa8\u67b6\u7a0b\u5f0f\u78bc\uff0c\u5305\u542b WebSocket \u9023\u7dda\u7ba1\u7406\u3001RPC \u65b9\u6cd5\u8def\u7531\u3001Plugin \u64f4\u5c55\u9ede\uff0c\u4ee5\u53ca\u4e00\u500b\u6e05\u6670\u7684\u555f\u52d5\u7ba1\u7dda\uff08\u7d44\u614b\u8f09\u5165 -> Plugin \u8a3b\u518a -> WS \u4f3a\u670d\u5668\u555f\u52d5\uff09\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Channel Plugin Adapter \u6a21\u5f0f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5834\u666f<\/strong>\uff1a\u4f60\u9700\u8981\u6574\u5408\u591a\u500b\u300c\u540c\u985e\u4f46\u5dee\u7570\u5927\u300d\u7684\u5916\u90e8\u670d\u52d9\uff08\u4f8b\u5982\u591a\u500b\u652f\u4ed8\u9598\u9053\u3001\u591a\u500b\u96f2\u7aef\u5132\u5b58\u3001\u591a\u500b\u901a\u77e5\u670d\u52d9\uff09\uff0c\u5e0c\u671b\u7528\u7d71\u4e00\u4ecb\u9762\u5c01\u88dd\u5dee\u7570\uff0c\u4f46\u6bcf\u500b\u670d\u52d9\u7684\u80fd\u529b\u548c\u8a2d\u5b9a\u6d41\u7a0b\u90fd\u4e0d\u540c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d66 AI \u7684\u6307\u4ee4<\/strong>\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u6211\u8981\u7528 Adapter \u6a21\u5f0f\u8a2d\u8a08\u4e00\u5957 Plugin \u4ecb\u9762\uff0c\u53c3\u8003 OpenClaw \u7684 ChannelPlugin \u8a2d\u8a08\u3002\u6211\u7684\u5834\u666f\u662f\u6574\u5408\u591a\u500b [\u4f60\u7684\u6574\u5408\u5c0d\u8c61\uff0c\u4f8b\u5982\uff1a\u652f\u4ed8\u9598\u9053]\u3002<br><br>\u8a2d\u8a08\u8981\u6c42\uff1a<br>1. \u5b9a\u7fa9\u4e00\u500b\u4e3b Plugin \u578b\u5225\uff0c\u5305\u542b id\u3001meta\u3001capabilities \u7b49\u57fa\u672c\u6b04\u4f4d<br>2. \u628a\u4e0d\u540c\u7684\u884c\u70ba\u9762\u5411\u62c6\u6210\u7368\u7acb\u7684 Adapter \u4ecb\u9762\uff08\u4f8b\u5982 config\u3001setup\u3001security\u3001outbound \u7b49\uff09\uff0c\u6bcf\u500b\u90fd\u662f\u53ef\u9078\u7684\uff08optional\uff09<br>3. \u6bcf\u500b Plugin \u53ea\u9700\u5be6\u4f5c\u81ea\u5df1\u652f\u63f4\u7684 Adapter\uff0c\u4e0d\u652f\u63f4\u7684\u7559 undefined<br>4. \u52a0\u4e0a Registry + Cache \u6a5f\u5236\uff0c\u652f\u63f4 Plugin \u7684\u52d5\u614b\u8f09\u5165\u548c\u71b1\u91cd\u8f09\u6642\u81ea\u52d5\u6e05\u9664\u5feb\u53d6<br><br>\u8acb\u7528 TypeScript \u5be6\u4f5c\uff0c\u4e26\u63d0\u4f9b\u4e00\u500b\u5177\u9ad4\u7684 Plugin \u5be6\u4f5c\u7bc4\u4f8b\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6548\u679c<\/strong>\uff1aAI \u6703\u7522\u51fa\u4e00\u7d44 TypeScript \u4ecb\u9762\u5b9a\u7fa9\uff0c\u5c07\u6574\u5408\u884c\u70ba\u62c6\u5206\u6210\u591a\u500b\u53ef\u9078\u7684 Adapter\uff0c\u4ee5\u53ca\u4e00\u500b\u5e36\u5feb\u53d6\u7684 Plugin Registry\u3002\u4f60\u6703\u5f97\u5230\u4e00\u500b\u4e3b\u4ecb\u9762\u3001\u6578\u500b Adapter \u5b50\u4ecb\u9762\u3001Registry \u8f09\u5165\u908f\u8f2f\uff0c\u548c\u81f3\u5c11\u4e00\u500b\u5177\u9ad4\u7684 Plugin \u5be6\u4f5c\u7bc4\u4f8b\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">System Prompt \u6a21\u7d44\u5316\u7d44\u88dd<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5834\u666f<\/strong>\uff1a\u4f60\u7684 AI Agent \u5c08\u6848\u9700\u8981\u6839\u64da\u4e0d\u540c\u5834\u666f\uff08\u4e0d\u540c\u4f7f\u7528\u8005\u89d2\u8272\u3001\u4e0d\u540c\u5de5\u5177\u96c6\u3001\u4e0d\u540c\u5b89\u5168\u7b49\u7d1a\u3001\u4e3b Agent vs \u5b50 Agent\uff09\u52d5\u614b\u8abf\u6574 System Prompt\uff0c\u76ee\u524d\u7dad\u8b77\u591a\u5957 Prompt \u6a21\u677f\u5df2\u7d93\u96e3\u4ee5\u7ba1\u7406\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d66 AI \u7684\u6307\u4ee4<\/strong>\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u6211\u8981\u91cd\u69cb\u6211\u7684 AI Agent \u7684 System Prompt\uff0c\u5f9e\u4e00\u500b\u5927\u5b57\u4e32\u6539\u6210\u6a21\u7d44\u5316\u7d44\u88dd\u6a21\u5f0f\uff0c\u53c3\u8003 OpenClaw \u7684 Section Builder \u8a2d\u8a08\u3002<br><br>\u76ee\u524d\u7684 Prompt \u5167\u5bb9\u5305\u542b\uff1a[\u5217\u51fa\u4f60\u7684 Prompt \u5305\u542b\u7684\u6bb5\u843d\uff0c\u4f8b\u5982\uff1a\u89d2\u8272\u5b9a\u7fa9\u3001\u5b89\u5168\u5b88\u5247\u3001\u5de5\u5177\u4f7f\u7528\u6307\u5f15\u3001\u56de\u61c9\u683c\u5f0f\u8981\u6c42\u3001\u4e0a\u4e0b\u6587\u8cc7\u8a0a\u7b49]<br><br>\u8a2d\u8a08\u8981\u6c42\uff1a<br>1. \u5b9a\u7fa9 PromptMode\uff08\u4f8b\u5982 &#8220;full&#8221; | &#8220;minimal&#8221; | &#8220;none&#8221;\uff09\uff0c\u4e0d\u540c\u6a21\u5f0f\u5305\u542b\u4e0d\u540c\u7684 Section<br>2. \u6bcf\u500b Section \u5c01\u88dd\u6210\u7368\u7acb\u7684 Builder \u51fd\u5f0f\uff0c\u63a5\u6536\u53c3\u6578\u5f8c\u56de\u50b3\u5b57\u4e32\u9663\u5217\uff0c\u6839\u64da\u689d\u4ef6\u6c7a\u5b9a\u662f\u5426\u7522\u51fa\u5167\u5bb9<br>3. \u652f\u63f4\u5f9e\u5916\u90e8\u6a94\u6848\uff08\u985e\u4f3c OpenClaw \u7684 SOUL.md\u3001AGENTS.md\uff09\u6ce8\u5165\u81ea\u8a02\u5167\u5bb9<br>4. \u6700\u5f8c\u7528 filter(Boolean).join(&#8220;\\n&#8221;) \u7d44\u88dd\u6210\u5b8c\u6574 Prompt<br><br>\u8acb\u5e6b\u6211\u8a2d\u8a08 Section Builder \u7684\u67b6\u69cb\u548c\u4e3b\u8981\u7684\u7d44\u88dd\u51fd\u5f0f\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6548\u679c<\/strong>\uff1aAI \u6703\u5c07\u4f60\u7684 Prompt \u62c6\u89e3\u6210\u591a\u500b\u7368\u7acb\u7684 Builder \u51fd\u5f0f\uff0c\u6bcf\u500b\u51fd\u5f0f\u5c01\u88dd\u81ea\u5df1\u7684\u689d\u4ef6\u5224\u65b7\u908f\u8f2f\uff0c\u52a0\u4e0a\u4e00\u500b\u4e3b\u7d44\u88dd\u51fd\u5f0f\uff0c\u6839\u64da PromptMode \u548c\u904b\u884c\u6642\u53c3\u6578\u52d5\u614b\u7d44\u88dd\u5b8c\u6574\u7684 System Prompt\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u591a\u5c64 Tool Policy \u5b89\u5168\u7b56\u7565<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5834\u666f<\/strong>\uff1a\u4f60\u7684 AI Agent \u7cfb\u7d71\u6703\u63a5\u6536\u4f86\u81ea\u5916\u90e8\u7684\u4e0d\u53ef\u4fe1\u8f38\u5165\uff08\u4f8b\u5982\u4f7f\u7528\u8005\u8a0a\u606f\u3001\u7b2c\u4e09\u65b9 Webhook\uff09\uff0c\u9700\u8981\u6839\u64da\u4e0d\u540c\u7684\u5b89\u5168\u908a\u754c\u9650\u5236 Agent \u53ef\u4f7f\u7528\u7684\u5de5\u5177\uff0c\u907f\u514d\u6b0a\u9650\u904e\u5ea6\u958b\u653e\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d66 AI \u7684\u6307\u4ee4<\/strong>\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u6211\u8981\u70ba\u6211\u7684 AI Agent \u7cfb\u7d71\u8a2d\u8a08\u591a\u5c64\u7684 Tool Policy \u904e\u6ffe\u6a5f\u5236\uff0c\u53c3\u8003 OpenClaw \u7684 Defense in Depth \u7b56\u7565\u3002<br><br>\u6211\u7684\u7cfb\u7d71\u6709\u4ee5\u4e0b\u5b89\u5168\u908a\u754c\uff1a[\u63cf\u8ff0\u4f60\u7684\u908a\u754c\uff0c\u4f8b\u5982\uff1a\u7ba1\u7406\u54e1 vs \u4e00\u822c\u4f7f\u7528\u8005\u3001\u5167\u90e8\u547c\u53eb vs \u5916\u90e8 API\u3001\u6b63\u5f0f\u74b0\u5883 vs \u6c99\u7bb1\u74b0\u5883]<br><br>\u8a2d\u8a08\u8981\u6c42\uff1a<br>1. \u6bcf\u4e00\u5c64 Policy \u7368\u7acb\u5b9a\u7fa9 allowlist \/ denylist<br>2. \u591a\u5c64 Policy \u6309\u512a\u5148\u9806\u5e8f\u758a\u52a0\u904e\u6ffe\uff1a\u5168\u57df Policy -> \u89d2\u8272 Policy -> \u5834\u666f Policy -> \u6c99\u7bb1 Policy<br>3. \u63d0\u4f9b resolveEffectiveToolPolicy \u51fd\u5f0f\uff0c\u5c07\u591a\u5c64 Policy \u5408\u4f75\u70ba\u6700\u7d42\u7684\u53ef\u7528\u5de5\u5177\u6e05\u55ae<br>4. \u63d0\u4f9b isToolAllowedByPolicies \u51fd\u5f0f\uff0c\u7528\u65bc\u55ae\u4e00\u5de5\u5177\u7684\u5feb\u901f\u6aa2\u67e5<br><br>\u8acb\u7528 TypeScript \u5be6\u4f5c\u5b8c\u6574\u7684 Policy \u89e3\u6790\u908f\u8f2f\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6548\u679c<\/strong>\uff1aAI \u6703\u7522\u51fa\u4e00\u5957\u5206\u5c64\u7684 Tool Policy \u7cfb\u7d71\uff0c\u5305\u542b Policy \u578b\u5225\u5b9a\u7fa9\u3001\u591a\u5c64\u5408\u4f75\u908f\u8f2f\u3001\u5feb\u901f\u6aa2\u67e5\u51fd\u5f0f\uff0c\u8b93\u4f60\u80fd\u5728\u4e0d\u540c\u7684\u5b89\u5168\u908a\u754c\u7368\u7acb\u914d\u7f6e\u5de5\u5177\u5b58\u53d6\u6b0a\u9650\uff0c\u5be6\u73fe\u7e31\u6df1\u9632\u79a6\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Model Failover \u7b56\u7565\u93c8<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5834\u666f<\/strong>\uff1a\u4f60\u7684\u5c08\u6848\u4f7f\u7528\u591a\u500b LLM Provider\uff08\u4f8b\u5982 Anthropic\u3001OpenAI\u3001\u672c\u5730\u6a21\u578b\uff09\uff0c\u9700\u8981\u5728\u67d0\u500b Provider \u6545\u969c\u6642\u81ea\u52d5\u5207\u63db\uff0c\u4f46\u8981\u5340\u5206\u300c\u4f7f\u7528\u8005\u4e3b\u52d5\u53d6\u6d88\u300d\u548c\u300c\u903e\u6642\u7b49\u53ef\u6062\u5fa9\u932f\u8aa4\u300d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d66 AI \u7684\u6307\u4ee4<\/strong>\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u6211\u8981\u70ba\u6211\u7684 LLM \u547c\u53eb\u5c64\u8a2d\u8a08 Failover \u7b56\u7565\u93c8\uff0c\u53c3\u8003 OpenClaw \u7684 Model Failover \u8a2d\u8a08\u3002<br><br>\u6211\u4f7f\u7528\u7684 Provider \u6709\uff1a[\u5217\u51fa\u4f60\u7684 Provider]<br><br>\u8a2d\u8a08\u8981\u6c42\uff1a<br>1. \u5340\u5206 Abort\uff08\u4f7f\u7528\u8005\u4e3b\u52d5\u53d6\u6d88\uff0c\u4e0d\u91cd\u8a66\uff09\u548c Timeout\uff08\u53ef\u6062\u5fa9\u932f\u8aa4\uff0c\u5207\u63db\u4e0b\u4e00\u500b\u6a21\u578b\uff09<br>2. \u5931\u6557\u7684 Provider \u9032\u5165\u51b7\u537b\u671f\uff0c\u77ed\u6642\u9593\u5167\u4e0d\u518d\u5617\u8a66<br>3. Failover \u5019\u9078\u6a21\u578b\u5fc5\u9808\u5728\u4f7f\u7528\u8005\u914d\u7f6e\u7684\u5141\u8a31\u6e05\u55ae\u4e2d<br>4. \u5c07\u300c\u4ec0\u9ebc\u932f\u8aa4\u8a72\u91cd\u8a66\u3001\u4ec0\u9ebc\u8a72\u5207\u63db\u3001\u4ec0\u9ebc\u8a72\u653e\u68c4\u300d\u7684\u6c7a\u7b56\u908f\u8f2f\u5916\u5316\u6210\u7b56\u7565\u51fd\u5f0f\uff0c\u800c\u975e\u57cb\u5728 try-catch \u4e2d<br><br>\u8acb\u8a2d\u8a08\u5b8c\u6574\u7684 Failover \u7b56\u7565\u93c8\uff0c\u5305\u542b\u932f\u8aa4\u5206\u985e\u3001\u51b7\u537b\u671f\u7ba1\u7406\u3001\u5019\u9078\u6a21\u578b\u7be9\u9078\u3001\u548c\u4e3b\u8981\u7684\u91cd\u8a66\u8ff4\u5708\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6548\u679c<\/strong>\uff1aAI \u6703\u7522\u51fa\u4e00\u5957\u5b8c\u6574\u7684 LLM Failover \u6a5f\u5236\uff0c\u5305\u542b\u932f\u8aa4\u985e\u578b\u5224\u65b7\u51fd\u5f0f\uff08shouldRetry \/ shouldFallback \/ shouldAbort\uff09\u3001Provider \u51b7\u537b\u671f\u7ba1\u7406\u3001Allowlist \u904e\u6ffe\u3001\u4ee5\u53ca\u4e00\u500b\u6e05\u6670\u7684 Failover \u57f7\u884c\u8ff4\u5708\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5ef6\u4f38\u95b1\u8b80<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><a href=\"https:\/\/github.com\/openclaw\/openclaw\">OpenClaw GitHub Repository<\/a> \u2014 \u5c08\u6848\u539f\u59cb\u78bc\uff0c\u5305\u542b\u5b8c\u6574\u7684 Gateway \u67b6\u69cb\u3001Channel Plugin \u7cfb\u7d71\u3001\u548c\u6240\u6709\u672c\u6587\u89e3\u8b80\u7684\u8a2d\u8a08\u5be6\u4f5c<\/li>\n\n\n<li><a href=\"https:\/\/docs.openclaw.ai\/start\/getting-started\">OpenClaw \u5b98\u65b9\u6587\u4ef6 &#8211; Getting Started<\/a> \u2014 \u5f9e\u96f6\u958b\u59cb\u5b89\u88dd\u548c\u8a2d\u5b9a OpenClaw\uff0c\u5feb\u901f\u7406\u89e3 Gateway\u3001Channel\u3001Agent \u4e09\u8005\u7684\u95dc\u4fc2<\/li>\n\n\n<li><a href=\"https:\/\/openclaw.ai\/blog\/introducing-openclaw\">Introducing OpenClaw\uff08\u5b98\u65b9 Blog\uff09<\/a> \u2014 Peter Steinberger \u64b0\u5beb\u7684\u5c08\u6848\u4ecb\u7d39\uff0c\u8aaa\u660e\u8a2d\u8a08\u54f2\u5b78\u548c\u67b6\u69cb\u6c7a\u7b56\u80cc\u5f8c\u7684\u8003\u91cf<\/li>\n\n\n<li><a href=\"https:\/\/www.ibm.com\/think\/news\/clawdbot-ai-agent-testing-limits-vertical-integration\">IBM Think &#8211; OpenClaw: The viral &#8220;space lobster&#8221; agent testing the limits of vertical integration<\/a> \u2014 IBM \u5c0d OpenClaw \u5782\u76f4\u6574\u5408\u67b6\u69cb\u7684\u6df1\u5ea6\u5206\u6790\uff0c\u63a2\u8a0e Gateway \u63a7\u5236\u5e73\u9762\u8a2d\u8a08\u7684\u53d6\u6368<\/li>\n\n\n<li><a href=\"https:\/\/dflow.sh\/blog\/openclaw-why-this-flawed-ai-assistant-is-the-blueprint-for-your-digital-future\">dFlow &#8211; Why This Flawed AI Assistant is the Blueprint for Your Digital Future<\/a> \u2014 \u5f9e\u67b6\u69cb\u3001\u90e8\u7f72\u7b56\u7565\u3001\u5b89\u5168\u6027\u4e09\u500b\u89d2\u5ea6\u6df1\u5ea6\u5256\u6790 OpenClaw\uff0c\u9069\u5408\u60f3\u4e86\u89e3\u8a2d\u8a08\u53d6\u6368\u7684\u8b80\u8005<\/li>\n\n\n<li><a href=\"https:\/\/sendbird.com\/blog\/ai-prompts\/modular-ai-prompts\">Sendbird &#8211; Evolutionary prompting: Using modular AI prompts<\/a> \u2014 \u63a2\u8a0e System Prompt \u6a21\u7d44\u5316\u7d44\u88dd\u7684\u65b9\u6cd5\u8ad6\uff0c\u8207 OpenClaw \u7684 Section Builder \u8a2d\u8a08\u7406\u5ff5\u76f8\u547c\u61c9<\/li>\n\n<\/ul>\n\n\n<div class=\"wp-like-post__wrapper\" style=\"\"><button type=\"button\" class=\"wp-like-post__button \" style=\"height: 30px; color: #000000;\" data-post-id=\"595\" data-total-likes=\"0\" data-likes-from-user=\"0\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" width=\"30\" height=\"30\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6.633 10.5c.806 0 1.533-.446 2.031-1.08a9.041 9.041 0 012.861-2.4c.723-.384 1.35-.956 1.653-1.715a4.498 4.498 0 00.322-1.672V3a.75.75 0 01.75-.75A2.25 2.25 0 0116.5 4.5c0 1.152-.26 2.243-.723 3.218-.266.558.107 1.282.725 1.282h3.126c1.026 0 1.945.694 2.054 1.715.045.422.068.85.068 1.285a11.95 11.95 0 01-2.649 7.521c-.388.482-.987.729-1.605.729H13.48c-.483 0-.964-.078-1.423-.23l-3.114-1.04a4.501 4.501 0 00-1.423-.23H5.904M14.25 9h2.25M5.904 18.75c.083.205.173.405.27.602.197.4-.078.898-.523.898h-.908c-.889 0-1.713-.518-1.972-1.368a12 12 0 01-.521-3.507c0-1.553.295-3.036.831-4.398C3.387 10.203 4.167 9.75 5 9.75h1.053c.472 0 .745.556.5.96a8.958 8.958 0 00-1.302 4.665c0 1.194.232 2.333.654 3.375z\" \/><\/svg><\/button><div class=\"wp-like-post__count\"\">0<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>OpenClaw \u662f\u4e00\u500b\u91ce\u5fc3\u5341\u8db3\u7684\u958b\u6e90\u5c08\u6848\u2014\u2014\u5b83\u8981\u8b93\u4f60\u5728\u81ea\u5df1\u7684\u88dd\u7f6e\u4e0a\u904b\u884c\u4e00\u500b AI \u52a9\u7406\uff0c\u540c\u6642\u63a5\u5165 Whats [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rolpb_likes":0,"footnotes":""},"categories":[555],"tags":[430,565,566,562,26],"class_list":["post-595","post","type-post","status-publish","format-standard","hentry","category-ai-agent-github","tag-ai-agent","tag-gateway","tag-plugin-architecture","tag-system-prompt","tag-typescript"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"_links":{"self":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/595","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/comments?post=595"}],"version-history":[{"count":1,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/595\/revisions"}],"predecessor-version":[{"id":617,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/595\/revisions\/617"}],"wp:attachment":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/media?parent=595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/categories?post=595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/tags?post=595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}