{"id":97813,"date":"2026-08-30T09:33:07","date_gmt":"2026-08-30T01:33:07","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/97813.html"},"modified":"2026-08-30T09:33:07","modified_gmt":"2026-08-30T01:33:07","slug":"acp-%e5%8d%8f%e8%ae%ae-devops-%e5%8f%af%e8%a7%86%e5%8c%96%ef%bc%9aagent-%e4%b8%8e%e7%bc%96%e8%be%91%e5%99%a8%e7%9a%84%e4%b8%a4%e6%9d%a1%e6%a1%a5%ef%bc%88%e7%ac%ac99%e7%af%87-e85%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/97813.html","title":{"rendered":"ACP \u534f\u8bae + devops \u53ef\u89c6\u5316\uff1aAgent \u4e0e\u7f16\u8f91\u5668\u7684\u4e24\u6761\u6865\uff08\u7b2c99\u7bc7-E85\uff09"},"content":{"rendered":"<p>\u4e0a\u4e00\u7bc7 \u8bb2\u4e86 Eino ADK \u7684 Agent \u751f\u547d\u5468\u671f\u3002\u6536\u5c3e\u524d\u8fd8\u5269\u4e24\u5757&#034;\u5468\u8fb9\u4ef6&#034;&#xff1a;ACP \u534f\u8bae\u6865&#xff08;\u8ba9 Eino Agent \u63a5\u5165\u5916\u90e8\u7f16\u8f91\u5668&#xff0c;\u53cc\u5411\u901a\u4fe1&#xff09;\u548c devops \u53ef\u89c6\u5316&#xff08;\u628a\u7f16\u8bd1\u540e\u7684 Graph \u66b4\u9732\u6210 HTTP \u753b\u5e03&#xff0c;\u7ed9\u524d\u7aef\u8c03\u8bd5\u7528&#xff09;\u3002\u4e00\u4e2a\u5411\u5916\u4ea4\u4e92&#xff0c;\u4e00\u4e2a\u5411\u5185\u89c2\u5bdf\u2014\u2014\u6b63\u597d\u662f\u4e00\u8fdb\u4e00\u51fa\u4e24\u6761\u6865\u3002<\/p>\n<p>\u6e90\u7801\u90fd\u5728 eino-ext \u4e0b&#xff1a;acp\/ \u4e24\u4e2a\u6587\u4ef6&#xff08;backend.go 894 \u884c &#043; conv.go \u7ea6 400 \u884c&#xff09;&#xff0c;devops\/ \u4e00\u4e2a\u6a21\u5757\u3002\u8fd9\u7bc7\u62c6\u5b8c&#xff0c;Eino \u7684\u5168\u666f\u5c31\u95ed\u73af\u4e86\u3002<\/p>\n<h3>&#xff08;\u4e00&#xff09;ACP \u662f\u4ec0\u4e48&#xff1a;\u7f16\u8f91\u5668\u548c Agent \u7684\u901a\u7528\u8bed<\/h3>\n<p>ACP&#xff08;Agent Client Protocol&#xff09; \u662f\u4e00\u4e2a\u5f00\u653e\u534f\u8bae&#xff0c;\u89e3\u51b3\u7684\u95ee\u9898\u662f&#xff1a;\u7f16\u8f91\u5668&#xff08;Zed\u3001Neovim \u7b49&#xff09;\u548c Agent \u540e\u7aef\u600e\u4e48\u5bf9\u8bdd&#xff1f;<\/p>\n<p>\u6ca1\u6709 ACP \u4e4b\u524d&#xff0c;\u6bcf\u4e2a\u7f16\u8f91\u5668\u63d2\u4ef6\u90fd\u8981\u4e3a\u6bcf\u4e2a Agent \u6846\u67b6\u5199\u4e00\u904d\u9002\u914d\u3002\u6709\u4e86 ACP&#xff0c;\u7f16\u8f91\u5668\u53ea\u9700\u8981\u5b9e\u73b0\u4e00\u4efd\u534f\u8bae\u5ba2\u6237\u7aef&#xff0c;\u4efb\u4f55\u5b9e\u73b0 ACP \u7684 Agent \u90fd\u80fd\u63a5\u5165\u3002<\/p>\n<p>Eino \u7684\u63a5\u5165\u5c42\u5728 eino-ext\/acp&#xff0c;README \u91cc\u4e00\u53e5\u8bdd\u8bf4\u6e05\u4e86\u4e24\u4e2a\u65b9\u5411&#xff1a;<\/p>\n<ul>\n<li>AgentEventToSessionUpdate\u2014\u2014\u4e0b\u884c&#xff1a;\u628a Eino \u7684 AgentEvent \u6d41\u8f6c\u6210 ACP \u7684 SessionUpdate \u901a\u77e5&#xff0c;\u63a8\u7ed9\u7f16\u8f91\u5668<\/li>\n<li>NewClientToolsMiddleware\u2014\u2014\u4e0a\u884c&#xff1a;\u628a\u7f16\u8f91\u5668\u4fa7\u7684\u80fd\u529b&#xff08;\u6587\u4ef6\u7cfb\u7edf\u3001\u7ec8\u7aef&#xff09;\u6865\u63a5\u6210 Eino \u7684\u6587\u4ef6\u7cfb\u7edf\u5de5\u5177&#xff0c;Agent \u53cd\u8fc7\u6765\u64cd\u4f5c\u7528\u6237\u673a\u5668<\/li>\n<\/ul>\n<h3>&#xff08;\u4e8c&#xff09;\u4e0b\u884c&#xff1a;\u4e8b\u4ef6\u8f6c\u6362 conv.go<\/h3>\n<p>conv.go:99-102 \u7684\u7b7e\u540d&#xff1a;<\/p>\n<p><span class=\"token keyword\">func<\/span> <span class=\"token function\">AgentEventToSessionUpdate<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    event <span class=\"token operator\">*<\/span>adk<span class=\"token punctuation\">.<\/span>AgentEvent<span class=\"token punctuation\">,<\/span><br \/>\n    opt <span class=\"token operator\">*<\/span>EventConverterOption<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> iter<span class=\"token punctuation\">.<\/span>Seq2<span class=\"token punctuation\">[<\/span>acpproto<span class=\"token punctuation\">.<\/span>SessionUpdate<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>\u6620\u5c04\u5173\u7cfb&#xff08;README \u91cc\u7684\u8868&#xff09;&#xff1a;<\/p>\n<table>\n<tr>Eino \u4e8b\u4ef6ACP SessionUpdate<\/tr>\n<tbody>\n<tr>\n<td>Assistant \u6d88\u606f<\/td>\n<td>AgentMessageChunk<\/td>\n<\/tr>\n<tr>\n<td>\u63a8\u7406\u5185\u5bb9&#xff08;reasoning&#xff09;<\/td>\n<td>AgentThoughtChunk<\/td>\n<\/tr>\n<tr>\n<td>User \u6d88\u606f<\/td>\n<td>UserMessageChunk<\/td>\n<\/tr>\n<tr>\n<td>\u5de5\u5177\u8c03\u7528<\/td>\n<td>ToolCall<\/td>\n<\/tr>\n<tr>\n<td>\u5de5\u5177\u7ed3\u679c<\/td>\n<td>ToolCallUpdate<\/td>\n<\/tr>\n<tr>\n<td>\u4e2d\u65ad<\/td>\n<td>AgentMessageChunk &#043; _meta[&#034;eino:interrupted&#034;]<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>\u4e2d\u65ad\u7684\u8de8\u8fdb\u7a0b\u5951\u7ea6<\/h4>\n<p>\u4e2d\u65ad\u6700\u7279\u6b8a\u3002ACP \u534f\u8bae\u672c\u8eab\u6ca1\u6709&#034;\u4e2d\u65ad&#034;\u6982\u5ff5&#xff0c;Eino \u7684\u505a\u6cd5\u662f\u585e\u8fdb _meta&#xff08;conv.go:33-35&#xff09;&#xff1a;<\/p>\n<p><span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    MetaKeyInterrupted       <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;eino:interrupted&#034;<\/span><br \/>\n    MetaKeyInterruptContexts <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;eino:interruptContexts&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u6ce8\u91ca\u91cc\u6709\u4e00\u53e5\u5173\u952e\u7684\u8bdd&#xff1a;\u201cThese form a cross-process contract with clients; changing them is a breaking change.\u201d\u2014\u2014\u8fd9\u4e24\u4e2a key \u662f\u548c\u5ba2\u6237\u7aef\u7ea6\u5b9a\u7684\u8de8\u8fdb\u7a0b\u5951\u7ea6&#xff0c;\u6539\u540d\u5c31\u662f\u7834\u574f\u6027\u53d8\u66f4\u3002\u4e0d\u53d1\u660e\u65b0\u6d88\u606f\u7c7b\u578b&#xff0c;\u590d\u7528\u6587\u672c\u901a\u9053 &#043; \u5143\u6570\u636e\u6807\u8bb0&#xff0c;\u662f\u534f\u8bae\u9002\u914d\u91cc\u6700\u514b\u5236\u7684\u505a\u6cd5\u3002<\/p>\n<h4>\u6d41\u5f0f\u5de5\u5177\u8c03\u7528&#xff1a;\u6309 Index \u805a\u5408<\/h4>\n<p>\u6d41\u5f0f\u6a21\u578b\u8f93\u51fa\u65f6&#xff0c;\u5de5\u5177\u8c03\u7528\u7684\u53c2\u6570\u662f\u4e00\u5757\u5757\u6765\u7684\u3002\u4e0a\u6e38\u53ea\u5728\u7b2c\u4e00\u4e2a\u5757\u5e26 ID \u548c Name&#xff08;conv.go:74-81 \u7684\u6ce8\u91ca\u89e3\u91ca\u4e86\u539f\u56e0&#xff1a;eino \u7684 concatToolCalls \u6309 Index \u805a\u5408&#xff0c;\u6309 ID \u4f1a\u9759\u9ed8\u4e22\u5757&#xff09;\u3002\u6240\u4ee5\u8f6c\u6362\u5668\u7ef4\u62a4\u4e00\u4e2a\u6309 Index \u952e\u63a7\u7684\u7d2f\u79ef\u5668&#xff1a;<\/p>\n<p><span class=\"token keyword\">type<\/span> toolCallAccum <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    id   <span class=\"token builtin\">string<\/span><br \/>\n    name <span class=\"token builtin\">string<\/span><br \/>\n    args strings<span class=\"token punctuation\">.<\/span>Builder<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u9ed8\u8ba4\u628a\u6240\u6709\u5757\u62fc\u6210\u4e00\u4e2a\u5b8c\u6574 ToolCall \u518d\u53d1&#xff1b;\u5f00 PreserveToolCallStream \u5219\u9010\u5757\u900f\u4f20&#xff0c;\u5ba2\u6237\u7aef\u6309 ToolCallID \u91cd\u7ec4&#xff08;ID \u4e00\u53d8\u5373\u4e0a\u4e00\u4e2a\u8c03\u7528\u7ed3\u675f&#xff09;\u3002<\/p>\n<h3>&#xff08;\u4e09&#xff09;\u4e0a\u884c&#xff1a;\u80fd\u529b\u95e8\u63a7 backend.go<\/h3>\n<p>NewClientToolsMiddleware&#xff08;backend.go:143-185&#xff09;\u7684\u6838\u5fc3\u903b\u8f91\u662f\u4e00\u5f20\u80fd\u529b \u2192 \u5de5\u5177\u542f\u7528\u77e9\u9635\u3002ACP \u534f\u8bae\u53ea\u66b4\u9732\u4e09\u4e2a\u80fd\u529b&#xff1a;read_text_file\u3001write_text_file\u3001terminal\u3002Eino \u7684\u6587\u4ef6\u7cfb\u7edf\u5de5\u5177\u6709\u4e03\u4e2a&#xff1a;ls\/read\/write\/edit\/glob\/grep\/shell\u3002\u600e\u4e48\u6620\u5c04&#xff1f;<\/p>\n<p><span class=\"token comment\">\/\/ \u9ed8\u8ba4\u5168\u90e8 Disable: true<\/span><br \/>\nconfig <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>mfs<span class=\"token punctuation\">.<\/span>MiddlewareConfig<span class=\"token punctuation\">{<\/span><br \/>\n    LsToolConfig<span class=\"token punctuation\">:<\/span>   <span class=\"token operator\">&amp;<\/span>mfs<span class=\"token punctuation\">.<\/span>ToolConfig<span class=\"token punctuation\">{<\/span>Disable<span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    ReadFileToolConfig<span class=\"token punctuation\">:<\/span>  <span class=\"token operator\">&amp;<\/span>mfs<span class=\"token punctuation\">.<\/span>ToolConfig<span class=\"token punctuation\">{<\/span>Disable<span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token comment\">\/\/ &#8230; \u5168\u7981<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">if<\/span> cfg<span class=\"token punctuation\">.<\/span>Capabilities<span class=\"token punctuation\">.<\/span>Terminal <span class=\"token punctuation\">{<\/span><br \/>\n    config<span class=\"token punctuation\">.<\/span>Shell <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>shell<span class=\"token punctuation\">{<\/span><span class=\"token operator\">&#8230;<\/span><span class=\"token punctuation\">}<\/span>                    <span class=\"token comment\">\/\/ shell \u53ea\u770b Terminal<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> cfg<span class=\"token punctuation\">.<\/span>UseTerminalForFileTools <span class=\"token punctuation\">{<\/span><br \/>\n        config<span class=\"token punctuation\">.<\/span>LsToolConfig <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">nil<\/span>                 <span class=\"token comment\">\/\/ ls\/glob\/grep \u89e3\u7981<\/span><br \/>\n        config<span class=\"token punctuation\">.<\/span>GlobToolConfig <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n        config<span class=\"token punctuation\">.<\/span>GrepToolConfig <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">if<\/span> b<span class=\"token punctuation\">.<\/span>hasReadFS  <span class=\"token punctuation\">{<\/span> config<span class=\"token punctuation\">.<\/span>ReadFileToolConfig <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">if<\/span> b<span class=\"token punctuation\">.<\/span>hasWriteFS <span class=\"token punctuation\">{<\/span> config<span class=\"token punctuation\">.<\/span>WriteFileToolConfig <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">if<\/span> b<span class=\"token punctuation\">.<\/span>hasReadFS <span class=\"token operator\">&amp;&amp;<\/span> b<span class=\"token punctuation\">.<\/span>hasWriteFS <span class=\"token punctuation\">{<\/span> config<span class=\"token punctuation\">.<\/span>EditFileToolConfig <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">}<\/span> <span class=\"token comment\">\/\/ edit &#061; \u8bfb&#043;\u5199<\/span><\/p>\n<p>\u56db\u79cd\u7ec4\u5408&#xff08;demo \u5b9e\u6d4b&#xff09;&#xff1a;<\/p>\n<table>\n<tr>\u5ba2\u6237\u7aef\u80fd\u529bshellls\/glob\/grepread\/writeedit<\/tr>\n<tbody>\n<tr>\n<td>fs &#043; terminal<\/td>\n<td>\u2713<\/td>\n<td>\u2713<\/td>\n<td>\u2713<\/td>\n<td>\u2713<\/td>\n<\/tr>\n<tr>\n<td>\u4ec5 fs<\/td>\n<td>\u00b7<\/td>\n<td>\u00b7<\/td>\n<td>\u2713<\/td>\n<td>\u2713<\/td>\n<\/tr>\n<tr>\n<td>terminal&#xff08;\u4e0d\u5f00\u6587\u4ef6\u5de5\u5177&#xff09;<\/td>\n<td>\u2713<\/td>\n<td>\u00b7<\/td>\n<td>\u00b7<\/td>\n<td>\u00b7<\/td>\n<\/tr>\n<tr>\n<td>terminal&#xff08;\u5f00\u6587\u4ef6\u5de5\u5177&#xff09;<\/td>\n<td>\u2713<\/td>\n<td>\u2713<\/td>\n<td>\u00b7<\/td>\n<td>\u00b7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>edit \u8981\u8bfb&#043;\u5199\u53cc\u80fd\u529b\u2014\u2014\u56e0\u4e3a\u5b83\u662f\u8bfb-\u6539-\u5199\u4e09\u6b65&#xff0c;\u7f3a\u4e00\u4e2a\u90fd\u505a\u4e0d\u4e86\u3002\u8fd9\u4e2a\u95e8\u63a7\u4e0d\u662f\u914d\u7f6e\u6d01\u7656&#xff1a;\u5ba2\u6237\u7aef\u6ca1\u58f0\u660e\u7684\u80fd\u529b&#xff0c;\u5de5\u5177\u5bf9\u6a21\u578b\u5c31\u4e0d\u53ef\u89c1&#xff0c;\u6a21\u578b\u4e0d\u4f1a\u5c1d\u8bd5\u8c03\u7528\u7136\u540e\u5931\u8d25\u3002<\/p>\n<h4>Edit \u8bfb-\u6539-\u5199&#xff08;backend.go:634-690&#xff09;<\/h4>\n<p>ACP \u6ca1\u6709\u539f\u5b50\u7684&#034;\u7f16\u8f91&#034;RPC&#xff0c;Edit \u662f\u62fc\u51fa\u6765\u7684&#xff1a;ReadTextFile \u5168\u91cf\u8bfb \u2192 \u5185\u5b58\u66ff\u6362 \u2192 WriteTextFile \u5168\u91cf\u5199\u3002\u4e09\u6001\u6821\u9a8c&#xff1a;<\/p>\n<p>count <span class=\"token operator\">:&#061;<\/span> strings<span class=\"token punctuation\">.<\/span><span class=\"token function\">Count<\/span><span class=\"token punctuation\">(<\/span>content<span class=\"token punctuation\">,<\/span> req<span class=\"token punctuation\">.<\/span>OldString<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">case<\/span> count <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> ErrOldStringNotFound       <span class=\"token comment\">\/\/ \u6ca1\u627e\u5230<\/span><br \/>\n<span class=\"token keyword\">case<\/span> count <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token operator\">!<\/span>req<span class=\"token punctuation\">.<\/span>ReplaceAll<span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> ErrAmbiguousReplace          <span class=\"token comment\">\/\/ \u591a\u5904\u547d\u4e2d&#xff0c;\u8981\u6c42\u663e\u5f0f ReplaceAll<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u5916\u52a0 32 MiB \u5927\u5c0f\u4e0a\u9650&#xff08;maxEditFileSize&#xff09;\u9632 OOM\u3002\u4e94\u4e2a\u54e8\u5175\u9519\u8bef&#xff08;backend.go:41-52&#xff09;\u8ba9\u8c03\u7528\u65b9\u80fd errors.Is \u7cbe\u786e\u5206\u6d3e\u3002<\/p>\n<h4>rg \u63a2\u6d4b\u4e09\u6001\u673a&#xff08;backend.go:404-455&#xff09;<\/h4>\n<p>grep \u5de5\u5177\u4f18\u5148\u8d70 ripgrep&#xff08;rg &#8211;json&#xff09;&#xff0c;\u5ba2\u6237\u7aef\u6ca1\u88c5\u5c31\u56de\u9000 POSIX grep\u3002\u63a2\u6d4b\u7528 command -v rg&#xff0c;\u7ed3\u679c\u4e09\u6001\u7f13\u5b58&#xff1a;<\/p>\n<p><span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    rgUnprobed    <span class=\"token comment\">\/\/ \u6ca1\u63a2\u6d4b\u8fc7<\/span><br \/>\n    rgAvailable   <span class=\"token comment\">\/\/ \u786e\u8ba4\u6709 rg<\/span><br \/>\n    rgUnavailable <span class=\"token comment\">\/\/ \u786e\u8ba4\u6ca1\u6709<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u5e76\u53d1\u8bbe\u8ba1\u5f88\u8bb2\u7a76&#xff1a;TryLock \u975e\u963b\u585e\u2014\u2014\u63a2\u6d4b\u8fdb\u884c\u4e2d&#xff0c;\u540e\u6765\u7684\u5e76\u53d1 grep \u4e0d\u7b49&#xff0c;\u76f4\u63a5\u8d70 POSIX \u56de\u9000&#xff08;rgProbeMu \u6ce8\u91ca\u539f\u6587&#xff1a;\u201clatecomers fall back to POSIX grep for that single call rather than waiting\u201d&#xff09;\u3002\u4f20\u8f93\u9519\u8bef\u4e0d\u7f13\u5b58&#xff0c;\u4fdd\u6301 unprobed \u4e0b\u6b21\u91cd\u8bd5\u3002demo \u5b9e\u6d4b&#xff1a;\u9996\u6b21\u63a2\u6d4b\u53d1 1 \u6761\u547d\u4ee4&#xff0c;\u4e8c\u6b21\u8c03\u7528\u5feb\u8def\u5f84 0 \u6761\u3002<\/p>\n<h4>POSIX grep \u56de\u9000\u89e3\u6790&#xff08;backend.go:815-893&#xff09;<\/h4>\n<p>\u56de\u9000\u65b9\u6848\u7528 grep -RnE&#xff0c;\u8f93\u51fa\u662f path:line:content\u3002\u96be\u9898&#xff1a;\u8def\u5f84\u91cc\u542b\u5192\u53f7&#xff08;vendor\/pkg:v2\/file.go:7:func Foo()&#xff09;\u3002\u89e3\u6cd5\u662f\u627e\u7b2c\u4e00\u4e2a &lt;\u5206\u9694\u7b26&gt;&lt;\u6570\u5b57&gt;&lt;\u5206\u9694\u7b26&gt; \u8fb9\u754c&#xff1a;<\/p>\n<p>vendor\/pkg:v2\/file.go:7:func Foo()<br \/>\n             \u2191 &#034;:v&#034; \u4e2d v \u975e\u6570\u5b57&#xff0c;\u8df3\u8fc7<br \/>\n                     \u2191 &#034;:7:&#034; \u547d\u4e2d \u2192 path \/ line \/ content \u4e09\u5206<\/p>\n<p>\u6ce8\u91ca\u91cc\u8bda\u5b9e\u6807\u6ce8\u4e86\u5df2\u77e5\u5c40\u9650&#xff1a;\u8def\u5f84\u672c\u8eab\u542b :N: \u6a21\u5f0f\u65f6\u4f1a\u5207\u9519&#xff0c;POSIX grep \u6ca1\u6709 NUL \u5206\u9694\u8f93\u51fa\u6a21\u5f0f&#xff08;-Z \u662f GNU \u72ec\u6709&#xff09;&#xff0c;\u8fd9\u662f\u56fa\u6709\u7684 best-effort \u6743\u8861\u3002<\/p>\n<h4>shell \u751f\u547d\u5468\u671f&#xff08;backend.go:193-260&#xff09;<\/h4>\n<p>\u4e00\u6b21 shell \u6267\u884c\u56db\u6b65 RPC&#xff1a;CreateTerminal \u2192 WaitForTerminalExit \u2192 TerminalOutput \u2192 ReleaseTerminal\u3002Release \u653e\u5728 defer \u91cc\u4e14\u7528\u72ec\u7acb\u7684\u540e\u53f0 ctx&#xff08;5 \u79d2\u8d85\u65f6&#xff09;\u2014\u2014\u8c03\u7528\u65b9\u7684 ctx \u88ab\u53d6\u6d88&#xff08;\u7528\u6237\u505c\u6b62\u3001\u8d85\u65f6&#xff09;\u65f6&#xff0c;\u7ec8\u7aef\u6e05\u7406\u4ecd\u7136\u6267\u884c&#xff0c;\u4e0d\u6cc4\u6f0f\u3002\u540e\u53f0\u6267\u884c&#xff08;RunInBackendGround&#xff09;\u663e\u5f0f\u62d2\u7edd\u800c\u975e\u9759\u9ed8\u6cc4\u6f0f\u3002<\/p>\n<h3>&#xff08;\u56db&#xff09;devops \u53ef\u89c6\u5316&#xff1a;\u7f16\u8bd1\u540e\u7684 Graph \u957f\u4ec0\u4e48\u6837<\/h3>\n<p>\u6362\u65b9\u5411\u3002Agent \u8dd1\u8d77\u6765\u540e&#xff0c;Graph \u5185\u90e8\u7ed3\u6784\u600e\u4e48\u770b&#xff1f;eino-ext\/devops \u6a21\u5757\u628a\u8fd9\u4e2a\u80fd\u529b\u505a\u6210\u4e86\u4e00\u4e2a\u5185\u5d4c HTTP \u670d\u52a1\u3002<\/p>\n<h4>\u542f\u52a8&#xff1a;\u4e24\u884c\u4ee3\u7801&#xff08;dev.go:33-48&#xff09;<\/h4>\n<p><span class=\"token keyword\">func<\/span> <span class=\"token function\">Init<\/span><span class=\"token punctuation\">(<\/span>ctx context<span class=\"token punctuation\">.<\/span>Context<span class=\"token punctuation\">,<\/span> opts <span class=\"token operator\">&#8230;<\/span>model<span class=\"token punctuation\">.<\/span>DevOption<span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    opt <span class=\"token operator\">:&#061;<\/span> model<span class=\"token punctuation\">.<\/span><span class=\"token function\">NewDevOpt<\/span><span class=\"token punctuation\">(<\/span>opts<span class=\"token punctuation\">)<\/span><br \/>\n    apihandler<span class=\"token punctuation\">.<\/span><span class=\"token function\">InitDebug<\/span><span class=\"token punctuation\">(<\/span>opt<span class=\"token punctuation\">)<\/span><br \/>\n    errCh <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    safego<span class=\"token punctuation\">.<\/span><span class=\"token function\">Go<\/span><span class=\"token punctuation\">(<\/span>ctx<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        errCh <span class=\"token operator\">&lt;-<\/span> apihandler<span class=\"token punctuation\">.<\/span><span class=\"token function\">StartHTTPServer<\/span><span class=\"token punctuation\">(<\/span>ctx<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>DevServerIP<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>DevServerPort<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">select<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">case<\/span> err <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&lt;-<\/span>errCh<span class=\"token punctuation\">:<\/span>        <span class=\"token comment\">\/\/ \u542f\u52a8\u5373\u5931\u8d25<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> err<br \/>\n    <span class=\"token keyword\">case<\/span> <span class=\"token operator\">&lt;-<\/span>time<span class=\"token punctuation\">.<\/span><span class=\"token function\">After<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span> <span class=\"token operator\">*<\/span> time<span class=\"token punctuation\">.<\/span>Second<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token comment\">\/\/ 2 \u79d2\u6ca1\u62a5\u9519\u5c31\u8ba4\u4e3a\u8d77\u6765\u4e86<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u9ed8\u8ba4\u76d1\u542c 127.0.0.1:52538\u2014\u2014\u53ea\u7ed1\u672c\u673a\u56de\u73af&#xff0c;\u6ce8\u91ca\u91cc\u660e\u786e\u8b66\u544a\u7ed1 0.0.0.0 \u6709\u5b89\u5168\u98ce\u9669\u30022 \u79d2\u8d85\u65f6\u662f\u4e2a\u52a1\u5b9e\u7684\u542f\u53d1\u5f0f&#xff1a;HTTP \u670d\u52a1\u5668\u8981\u4e48\u7acb\u523b\u62a5\u9519&#xff0c;\u8981\u4e48\u8ba4\u4e3a\u5df2\u5c31\u7eea\u3002<\/p>\n<h4>\u8def\u7531\u8868&#xff08;server.go:55-75&#xff09;<\/h4>\n<p>GET  \/eino\/devops\/ping                                        \u63a2\u6d3b<br \/>\nGET  \/eino\/devops\/stream_log                                  \u65e5\u5fd7\u6d41<br \/>\nGET  \/eino\/devops\/version                                     \u7248\u672c<br \/>\nGET  \/eino\/devops\/debug\/v1\/input_types                        \u8f93\u5165\u7c7b\u578b<br \/>\nGET  \/eino\/devops\/debug\/v1\/graphs                             \u56fe\u5217\u8868<br \/>\nGET  \/eino\/devops\/debug\/v1\/graphs\/{graph_id}\/canvas           \u753b\u5e03\u4fe1\u606f<br \/>\nPOST \/eino\/devops\/debug\/v1\/graphs\/{graph_id}\/threads          \u5efa\u8c03\u8bd5\u7ebf\u7a0b<br \/>\nPOST \/eino\/devops\/debug\/v1\/graphs\/{graph_id}\/threads\/{tid}\/stream   \u8c03\u8bd5\u6267\u884c(SSE)<\/p>\n<p>\u4e94\u4e2a debug \u8def\u7531\u6784\u6210\u5b8c\u6574\u8c03\u8bd5\u73af&#xff1a;\u770b\u6709\u54ea\u4e9b\u56fe \u2192 \u62ff\u753b\u5e03\u7ed3\u6784 \u2192 \u5f00\u8c03\u8bd5\u7ebf\u7a0b \u2192 \u6d41\u5f0f\u6267\u884c\u3002<\/p>\n<h3>&#xff08;\u4e94&#xff09;CanvasInfo&#xff1a;\u753b\u5e03\u6570\u636e\u6a21\u578b<\/h3>\n<p>\u5148\u4fee\u6b63\u4e00\u4e2a\u5bb9\u6613\u60f3\u5f53\u7136\u7684\u70b9&#xff1a;devops \u4e0d\u751f\u6210 Mermaid\u3002 \u753b\u5e03\u7684\u6700\u7ec8\u5f62\u6001\u662f CanvasInfo JSON\u2014\u2014\u8282\u70b9\u3001\u8fb9\u3001\u5206\u652f\u7684\u5e26\u7c7b\u578b\u63cf\u8ff0&#xff0c;\u7531 EinoDev \u524d\u7aef&#xff08;VSCode \u63d2\u4ef6\/Web&#xff09;\u6e32\u67d3\u6210\u53ef\u4ea4\u4e92\u753b\u5e03&#xff0c;\u4e0d\u662f\u6587\u672c\u56fe\u8868\u3002Go \u4fa7\u53ea\u8d1f\u8d23&#034;\u628a\u7f16\u8bd1\u671f\u56fe\u7ed3\u6784\u7ffb\u8bd1\u6210\u81ea\u63cf\u8ff0 JSON&#034;\u3002<\/p>\n<p>\u6a21\u578b&#xff08;devops\/model\/canvas.go&#xff09;&#xff1a;<\/p>\n<p><span class=\"token keyword\">type<\/span> CanvasInfo <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    Version <span class=\"token builtin\">string<\/span> <span class=\"token string\">&#096;json:&#034;version&#034;&#096;<\/span>   <span class=\"token comment\">\/\/ &#034;1.0.0&#034;<\/span><br \/>\n    <span class=\"token operator\">*<\/span>GraphSchema <span class=\"token string\">&#096;json:&#034;,inline&#034;&#096;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">type<\/span> GraphSchema <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    ID<span class=\"token punctuation\">,<\/span> Name <span class=\"token builtin\">string<\/span><br \/>\n    Nodes    <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">*<\/span>Node<br \/>\n    Edges    <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">*<\/span>Edge<br \/>\n    Branches <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">*<\/span>Branch<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">type<\/span> NodeType <span class=\"token builtin\">string<\/span><br \/>\n<span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    NodeTypeOfStart    NodeType <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;start&#034;<\/span><br \/>\n    NodeTypeOfEnd      NodeType <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;end&#034;<\/span><br \/>\n    NodeTypeOfBranch   NodeType <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;branch&#034;<\/span><br \/>\n    NodeTypeOfParallel NodeType <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;parallel&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<h4>BuildGraphSchema&#xff1a;\u4e09\u6b65\u7ffb\u8bd1&#xff08;container.go:159-195&#xff09;<\/h4>\n<p>\u7f16\u8bd1\u540e\u7684\u56fe\u4fe1\u606f&#xff08;GraphNodeInfo&#xff1a;\u8282\u70b9\u540d\u3001\u7ec4\u4ef6\u7c7b\u578b\u3001\u53cd\u5c04\u7c7b\u578b&#xff09;\u7ffb\u8bd1\u6210\u753b\u5e03&#xff1a;<\/p>\n<li>buildGraphNodes&#xff1a;\u63d2\u5165\u865a\u62df __start__\/__end__ \u8282\u70b9&#xff1b;\u6bcf\u4e2a\u7ec4\u4ef6\u8282\u70b9\u7684\u8f93\u5165\u8f93\u51fa\u7c7b\u578b\u7ecf parseReflectTypeToJsonSchema \u8f6c\u6210 JSON Schema&#xff08;\u524d\u7aef\u663e\u793a\u7c7b\u578b\u63d0\u793a\u7528&#xff09;<\/li>\n<li>buildGraphEdges&#xff1a;\u4e00\u5bf9\u4e00\u7684\u8fb9\u76f4\u63a5\u5efa&#xff1b;\u4e00\u5bf9\u591a&#xff08;\u5e76\u884c&#xff09;\u63d2\u5165\u865a\u62df\u5e76\u884c\u8282\u70b9 from:X\u2014\u2014\u6e90\u8282\u70b9 \u2192 from:X \u2192 N \u4e2a\u76ee\u6807&#xff0c;\u8ba9\u524d\u7aef\u80fd\u753b\u51fa\u6247\u51fa\u5f62\u72b6<\/li>\n<li>buildSubGraphSchema&#xff1a;\u5d4c\u5957\u56fe&#xff08;\u5982 Agent \u5185\u90e8\u7684 react \u5faa\u73af&#xff09;\u9012\u5f52\u6784\u5efa&#xff0c;\u6302\u5230\u8282\u70b9\u7684 GraphSchema \u5b57\u6bb5\u2014\u2014\u753b\u5e03\u53ef\u4e0b\u94bb<\/li>\n<p>demo \u5b9e\u6d4b&#xff08;judge \u8282\u70b9\u6247\u51fa\u5230 output_a\/output_b&#xff09;&#xff1a;<\/p>\n<p>\u8282\u70b9(7): __start__[start] __end__[end] agent[Graph] judge[Lambda]<br \/>\n         output_a[Lambda] output_b[Lambda] from:judge[parallel]<br \/>\n\u8fb9(4):   agent~&gt;judge judge~&gt;from:judge<br \/>\n         from:judge~&gt;output_a from:judge~&gt;output_b<br \/>\n\u5b50\u56fe:    agent \u2192 react_loop(\u8282\u70b9\u6570&#061;3)<\/p>\n<p>\u5e8f\u5217\u5316\u540e 1098 \u5b57\u8282\u7684 JSON&#xff0c;\u5c31\u662f\u524d\u7aef\u753b\u5e03\u6d88\u8d39\u7684\u5168\u90e8\u4fe1\u606f\u3002<\/p>\n<h3>&#xff08;\u516d&#xff09;\u4e24\u4e2a\u6a21\u5757\u7684\u5171\u540c\u8bbe\u8ba1\u5473\u9053<\/h3>\n<table>\n<tr>acpdevops<\/tr>\n<tbody>\n<tr>\n<td>\u5b9a\u4f4d<\/td>\n<td>\u5411\u5916&#xff1a;\u63a5\u7f16\u8f91\u5668<\/td>\n<td>\u5411\u5185&#xff1a;\u7ed9\u8c03\u8bd5\u5668<\/td>\n<\/tr>\n<tr>\n<td>\u4f9d\u8d56\u65b9\u5411<\/td>\n<td>Eino \u7c7b\u578b \u2192 ACP \u534f\u8bae\u7c7b\u578b<\/td>\n<td>Eino \u7f16\u8bd1\u4ea7\u7269 \u2192 \u753b\u5e03 JSON<\/td>\n<\/tr>\n<tr>\n<td>\u8fb9\u754c\u5b88\u536b<\/td>\n<td>\u80fd\u529b\u95e8\u63a7&#xff08;\u6ca1\u58f0\u660e\u5c31\u4e0d\u66b4\u9732&#xff09;<\/td>\n<td>\u56de\u73af\u7ed1\u5b9a&#xff08;127.0.0.1&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u5951\u7ea6\u7a33\u5b9a\u6027<\/td>\n<td>_meta key \u662f\u8de8\u8fdb\u7a0b\u5951\u7ea6<\/td>\n<td>CanvasInfo \u5e26\u7248\u672c\u53f7 \u201c1.0.0\u201d<\/td>\n<\/tr>\n<tr>\n<td>\u964d\u7ea7\u7b56\u7565<\/td>\n<td>rg \u2192 POSIX grep \u53cc\u8f68<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5171\u540c\u70b9&#xff1a;\u90fd\u4e0d\u53d1\u660e\u65b0\u6982\u5ff5&#xff0c;\u53ea\u505a\u5fe0\u5b9e\u7ffb\u8bd1\u3002ACP \u4fa7\u628a Eino \u4e8b\u4ef6\u7ffb\u8bd1\u6210\u534f\u8bae\u66f4\u65b0&#xff0c;devops \u4fa7\u628a\u56fe\u7ed3\u6784\u7ffb\u8bd1\u6210\u81ea\u63cf\u8ff0 JSON\u3002\u9002\u914d\u5c42\u7684\u672c\u5206\u662f\u900f\u660e&#xff0c;\u4e0d\u662f\u806a\u660e\u3002<\/p>\n<h3>\u5c0f\u7ed3<\/h3>\n<li>ACP \u4e0b\u884c&#xff1a;AgentEventToSessionUpdate \u516d\u7c7b\u6620\u5c04&#xff1b;\u4e2d\u65ad\u8d70 _meta[&#034;eino:interrupted&#034;] \u8de8\u8fdb\u7a0b\u5951\u7ea6&#xff1b;\u6d41\u5f0f\u5de5\u5177\u8c03\u7528\u6309 Index \u805a\u5408&#xff08;\u6309 ID \u4e22\u5757&#xff09;<\/li>\n<li>ACP \u4e0a\u884c&#xff1a;\u80fd\u529b \u2192 \u5de5\u5177\u77e9\u9635&#xff0c;edit \u8981\u8bfb\u5199\u53cc\u80fd\u529b&#xff1b;Edit &#061; \u8bfb\u6539\u5199\u4e09\u6001\u6821\u9a8c &#043; 32MiB \u4e0a\u9650&#xff1b;rg \u63a2\u6d4b\u4e09\u6001\u7f13\u5b58 &#043; TryLock \u975e\u963b\u585e\u56de\u9000&#xff1b;shell \u56db\u6b65 RPC\u3001Release \u7528\u72ec\u7acb\u540e\u53f0 ctx<\/li>\n<li>devops&#xff1a;\u4e24\u884c Init \u8d77\u672c\u673a HTTP \u670d\u52a1&#xff1b;\u516b\u6761\u8def\u7531&#xff1b;CanvasInfo \u4e0d\u662f Mermaid&#xff0c;\u662f\u524d\u7aef\u753b\u5e03\u6d88\u8d39\u7684\u5e26\u7c7b\u578b JSON&#xff1b;\u5e76\u884c\u6247\u51fa\u7528 from:X \u865a\u62df\u8282\u70b9\u8868\u8fbe&#xff1b;\u5b50\u56fe\u9012\u5f52\u6302\u8f7d\u53ef\u4e0b\u94bb<\/li>\n<p>\u4e0b\u4e00\u7bc7&#xff08;E100&#xff09;\u662f\u6536\u5b98&#xff1a;Eino &#043; DeepFlux \u5b9e\u6218\u5168\u666f\u590d\u76d8\u2014\u2014100 \u7bc7\u4ece 5 \u5206\u949f Demo \u5230\u4f01\u4e1a\u7ea7\u5e73\u53f0\u8d70\u8fc7\u7684\u8def\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e0a\u4e00\u7bc7 \u8bb2\u4e86 Eino ADK \u7684 Agent \u751f\u547d\u5468\u671f\u3002\u6536\u5c3e\u524d\u8fd8\u5269\u4e24\u5757\\&#8221;\u5468\u8fb9\u4ef6\\&#8221;&#xff1a;ACP \u534f\u8bae\u6865&#xff08;\u8ba9 Eino Agent \u63a5\u5165\u5916\u90e8\u7f16\u8f91\u5668&#xff0c;\u53cc\u5411\u901a\u4fe1&#xff09;\u548c devops \u53ef\u89c6\u5316&#xff08;\u628a\u7f16\u8bd1\u540e\u7684 Graph \u66b4\u9732\u6210 HTTP \u753b\u5e03&#xff0c;\u7ed9\u524d\u7aef\u8c03\u8bd5\u7528&#xff09;\u3002\u4e00\u4e2a\u5411\u5916\u4ea4\u4e92&#xff0c;\u4e00\u4e2a\u5411\u5185\u89c2\u5bdf\u2014\u2014\u6b63\u597d\u662f\u4e00\u8fdb\u4e00\u51fa\u4e24\u6761\u6865\u3002<br \/>\n\u6e90\u7801\u90fd\u5728 eino-ext \u4e0b&#xff1a;acp\/ \u4e24\u4e2a\u6587\u4ef6&amp;#x<\/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":[11207,9429,9428,9109,74,1404],"topic":[],"class_list":["post-97813","post","type-post","status-publish","format-standard","hentry","category-server","tag-acp","tag-eino","tag-graph","tag-9109","tag-agent","tag-devops"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ACP \u534f\u8bae + devops \u53ef\u89c6\u5316\uff1aAgent \u4e0e\u7f16\u8f91\u5668\u7684\u4e24\u6761\u6865\uff08\u7b2c99\u7bc7-E85\uff09 - \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\/97813.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ACP \u534f\u8bae + devops \u53ef\u89c6\u5316\uff1aAgent \u4e0e\u7f16\u8f91\u5668\u7684\u4e24\u6761\u6865\uff08\u7b2c99\u7bc7-E85\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u4e0a\u4e00\u7bc7 \u8bb2\u4e86 Eino ADK \u7684 Agent \u751f\u547d\u5468\u671f\u3002\u6536\u5c3e\u524d\u8fd8\u5269\u4e24\u5757&quot;\u5468\u8fb9\u4ef6&quot;&#xff1a;ACP \u534f\u8bae\u6865&#xff08;\u8ba9 Eino Agent \u63a5\u5165\u5916\u90e8\u7f16\u8f91\u5668&#xff0c;\u53cc\u5411\u901a\u4fe1&#xff09;\u548c devops \u53ef\u89c6\u5316&#xff08;\u628a\u7f16\u8bd1\u540e\u7684 Graph \u66b4\u9732\u6210 HTTP \u753b\u5e03&#xff0c;\u7ed9\u524d\u7aef\u8c03\u8bd5\u7528&#xff09;\u3002\u4e00\u4e2a\u5411\u5916\u4ea4\u4e92&#xff0c;\u4e00\u4e2a\u5411\u5185\u89c2\u5bdf\u2014\u2014\u6b63\u597d\u662f\u4e00\u8fdb\u4e00\u51fa\u4e24\u6761\u6865\u3002 \u6e90\u7801\u90fd\u5728 eino-ext \u4e0b&#xff1a;acp\/ \u4e24\u4e2a\u6587\u4ef6&amp;#x\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/97813.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-30T01:33:07+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=\"5 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/97813.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/97813.html\",\"name\":\"ACP \u534f\u8bae + devops \u53ef\u89c6\u5316\uff1aAgent \u4e0e\u7f16\u8f91\u5668\u7684\u4e24\u6761\u6865\uff08\u7b2c99\u7bc7-E85\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-08-30T01:33:07+00:00\",\"dateModified\":\"2026-08-30T01:33:07+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/97813.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/97813.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/97813.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ACP \u534f\u8bae + devops \u53ef\u89c6\u5316\uff1aAgent \u4e0e\u7f16\u8f91\u5668\u7684\u4e24\u6761\u6865\uff08\u7b2c99\u7bc7-E85\uff09\"}]},{\"@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":"ACP \u534f\u8bae + devops \u53ef\u89c6\u5316\uff1aAgent \u4e0e\u7f16\u8f91\u5668\u7684\u4e24\u6761\u6865\uff08\u7b2c99\u7bc7-E85\uff09 - \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\/97813.html","og_locale":"zh_CN","og_type":"article","og_title":"ACP \u534f\u8bae + devops \u53ef\u89c6\u5316\uff1aAgent \u4e0e\u7f16\u8f91\u5668\u7684\u4e24\u6761\u6865\uff08\u7b2c99\u7bc7-E85\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u4e0a\u4e00\u7bc7 \u8bb2\u4e86 Eino ADK \u7684 Agent \u751f\u547d\u5468\u671f\u3002\u6536\u5c3e\u524d\u8fd8\u5269\u4e24\u5757\"\u5468\u8fb9\u4ef6\"&#xff1a;ACP \u534f\u8bae\u6865&#xff08;\u8ba9 Eino Agent \u63a5\u5165\u5916\u90e8\u7f16\u8f91\u5668&#xff0c;\u53cc\u5411\u901a\u4fe1&#xff09;\u548c devops \u53ef\u89c6\u5316&#xff08;\u628a\u7f16\u8bd1\u540e\u7684 Graph \u66b4\u9732\u6210 HTTP \u753b\u5e03&#xff0c;\u7ed9\u524d\u7aef\u8c03\u8bd5\u7528&#xff09;\u3002\u4e00\u4e2a\u5411\u5916\u4ea4\u4e92&#xff0c;\u4e00\u4e2a\u5411\u5185\u89c2\u5bdf\u2014\u2014\u6b63\u597d\u662f\u4e00\u8fdb\u4e00\u51fa\u4e24\u6761\u6865\u3002 \u6e90\u7801\u90fd\u5728 eino-ext \u4e0b&#xff1a;acp\/ \u4e24\u4e2a\u6587\u4ef6&amp;#x","og_url":"https:\/\/www.wsisp.com\/helps\/97813.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-08-30T01:33:07+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"5 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/97813.html","url":"https:\/\/www.wsisp.com\/helps\/97813.html","name":"ACP \u534f\u8bae + devops \u53ef\u89c6\u5316\uff1aAgent \u4e0e\u7f16\u8f91\u5668\u7684\u4e24\u6761\u6865\uff08\u7b2c99\u7bc7-E85\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-08-30T01:33:07+00:00","dateModified":"2026-08-30T01:33:07+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/97813.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/97813.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/97813.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"ACP \u534f\u8bae + devops \u53ef\u89c6\u5316\uff1aAgent \u4e0e\u7f16\u8f91\u5668\u7684\u4e24\u6761\u6865\uff08\u7b2c99\u7bc7-E85\uff09"}]},{"@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\/97813","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=97813"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/97813\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=97813"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=97813"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=97813"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=97813"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}