agent/assets/agent服务协议.html
2025-03-30 09:13:46 +08:00

291 lines
47 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html><head>
<title>agent服务协议</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="assets/katex/katex.min.css">
<script type="text/javascript" src="assets/mermaid/mermaid.min.js" charset="UTF-8"></script>
<style>
code[class*=language-],pre[class*=language-]{color:#333;background:0 0;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.4;-moz-tab-size:8;-o-tab-size:8;tab-size:8;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:.8em;overflow:auto;border-radius:3px;background:#f5f5f5}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal;background:#f5f5f5}.token.blockquote,.token.comment{color:#969896}.token.cdata{color:#183691}.token.doctype,.token.macro.property,.token.punctuation,.token.variable{color:#333}.token.builtin,.token.important,.token.keyword,.token.operator,.token.rule{color:#a71d5d}.token.attr-value,.token.regex,.token.string,.token.url{color:#183691}.token.atrule,.token.boolean,.token.code,.token.command,.token.constant,.token.entity,.token.number,.token.property,.token.symbol{color:#0086b3}.token.prolog,.token.selector,.token.tag{color:#63a35c}.token.attr-name,.token.class,.token.class-name,.token.function,.token.id,.token.namespace,.token.pseudo-class,.token.pseudo-element,.token.url-reference .token.variable{color:#795da3}.token.entity{cursor:help}.token.title,.token.title .token.punctuation{font-weight:700;color:#1d3e81}.token.list{color:#ed6a43}.token.inserted{background-color:#eaffea;color:#55a532}.token.deleted{background-color:#ffecec;color:#bd2c00}.token.bold{font-weight:700}.token.italic{font-style:italic}.language-json .token.property{color:#183691}.language-markup .token.tag .token.punctuation{color:#333}.language-css .token.function,code.language-css{color:#0086b3}.language-yaml .token.atrule{color:#63a35c}code.language-yaml{color:#183691}.language-ruby .token.function{color:#333}.language-markdown .token.url{color:#795da3}.language-makefile .token.symbol{color:#795da3}.language-makefile .token.variable{color:#183691}.language-makefile .token.builtin{color:#0086b3}.language-bash .token.keyword{color:#0086b3}pre[data-line]{position:relative;padding:1em 0 1em 3em}pre[data-line] .line-highlight-wrapper{position:absolute;top:0;left:0;background-color:transparent;display:block;width:100%}pre[data-line] .line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:hsla(24,20%,50%,.08);background:linear-gradient(to right,hsla(24,20%,50%,.1) 70%,hsla(24,20%,50%,0));pointer-events:none;line-height:inherit;white-space:pre}pre[data-line] .line-highlight:before,pre[data-line] .line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:hsla(24,20%,50%,.4);color:#f4f1ef;font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px #fff}pre[data-line] .line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}html body{font-family:'Helvetica Neue',Helvetica,'Segoe UI',Arial,freesans,sans-serif;font-size:16px;line-height:1.6;color:#333;background-color:#fff;overflow:initial;box-sizing:border-box;word-wrap:break-word}html body>:first-child{margin-top:0}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{line-height:1.2;margin-top:1em;margin-bottom:16px;color:#000}html body h1{font-size:2.25em;font-weight:300;padding-bottom:.3em}html body h2{font-size:1.75em;font-weight:400;padding-bottom:.3em}html body h3{font-size:1.5em;font-weight:500}html body h4{font-size:1.25em;font-weight:600}html body h5{font-size:1.1em;font-weight:600}html body h6{font-size:1em;font-weight:600}html body h1,html body h2,html body h3,html body h4,html body h5{font-weight:600}html body h5{font-size:1em}html body h6{color:#5c5c5c}html body strong{color:#000}html body del{color:#5c5c5c}html body a:not([href]){color:inherit;text-decoration:none}html body a{color:#08c;text-decoration:none}html body a:hover{color:#00a3f5;text-decoration:none}html body img{max-width:100%}html body>p{margin-top:0;margin-bottom:16px;word-wrap:break-word}html body>ol,html body>ul{margin-bottom:16px}html body ol,html body ul{padding-left:2em}html body ol.no-list,html body ul.no-list{padding:0;list-style-type:none}html body ol ol,html body ol ul,html body ul ol,html body ul ul{margin-top:0;margin-bottom:0}html body li{margin-bottom:0}html body li.task-list-item{list-style:none}html body li>p{margin-top:0;margin-bottom:0}html body .task-list-item-checkbox{margin:0 .2em .25em -1.8em;vertical-align:middle}html body .task-list-item-checkbox:hover{cursor:pointer}html body blockquote{margin:16px 0;font-size:inherit;padding:0 15px;color:#5c5c5c;background-color:#f0f0f0;border-left:4px solid #d6d6d6}html body blockquote>:first-child{margin-top:0}html body blockquote>:last-child{margin-bottom:0}html body hr{height:4px;margin:32px 0;background-color:#d6d6d6;border:0 none}html body table{margin:10px 0 15px 0;border-collapse:collapse;border-spacing:0;display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}html body table th{font-weight:700;color:#000}html body table td,html body table th{border:1px solid #d6d6d6;padding:6px 13px}html body dl{padding:0}html body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}html body dl dd{padding:0 16px;margin-bottom:16px}html body code{font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:.85em;color:#000;background-color:#f0f0f0;border-radius:3px;padding:.2em 0}html body code::after,html body code::before{letter-spacing:-.2em;content:'\00a0'}html body pre>code{padding:0;margin:0;word-break:normal;white-space:pre;background:0 0;border:0}html body .highlight{margin-bottom:16px}html body .highlight pre,html body pre{padding:1em;overflow:auto;line-height:1.45;border:#d6d6d6;border-radius:3px}html body .highlight pre{margin-bottom:0;word-break:normal}html body pre code,html body pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}html body pre code:after,html body pre code:before,html body pre tt:after,html body pre tt:before{content:normal}html body blockquote,html body dl,html body ol,html body p,html body pre,html body ul{margin-top:0;margin-bottom:16px}html body kbd{color:#000;border:1px solid #d6d6d6;border-bottom:2px solid #c7c7c7;padding:2px 4px;background-color:#f0f0f0;border-radius:3px}@media print{html body{background-color:#fff}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{color:#000;page-break-after:avoid}html body blockquote{color:#5c5c5c}html body pre{page-break-inside:avoid}html body table{display:table}html body img{display:block;max-width:100%;max-height:100%}html body code,html body pre{word-wrap:break-word;white-space:pre}}.markdown-preview{width:100%;height:100%;box-sizing:border-box}.markdown-preview ul{list-style:disc}.markdown-preview ul ul{list-style:circle}.markdown-preview ul ul ul{list-style:square}.markdown-preview ol{list-style:decimal}.markdown-preview ol ol,.markdown-preview ul ol{list-style-type:lower-roman}.markdown-preview ol ol ol,.markdown-preview ol ul ol,.markdown-preview ul ol ol,.markdown-preview ul ul ol{list-style-type:lower-alpha}.markdown-preview .newpage,.markdown-preview .pagebreak{page-break-before:always}.markdown-preview pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}.markdown-preview pre.line-numbers>code{position:relative}.markdown-preview pre.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:1em;font-size:100%;left:0;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.markdown-preview pre.line-numbers .line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.markdown-preview pre.line-numbers .line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}.markdown-preview .mathjax-exps .MathJax_Display{text-align:center!important}.markdown-preview:not([data-for=preview]) .code-chunk .code-chunk-btn-group{display:none}.markdown-preview:not([data-for=preview]) .code-chunk .status{display:none}.markdown-preview:not([data-for=preview]) .code-chunk .output-div{margin-bottom:16px}.markdown-preview .md-toc{padding:0}.markdown-preview .md-toc .md-toc-link-wrapper .md-toc-link{display:inline;padding:.25rem 0}.markdown-preview .md-toc .md-toc-link-wrapper .md-toc-link div,.markdown-preview .md-toc .md-toc-link-wrapper .md-toc-link p{display:inline}.markdown-preview .md-toc .md-toc-link-wrapper.highlighted .md-toc-link{font-weight:800}.scrollbar-style::-webkit-scrollbar{width:8px}.scrollbar-style::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}.scrollbar-style::-webkit-scrollbar-thumb{border-radius:5px;background-color:rgba(150,150,150,.66);border:4px solid rgba(150,150,150,.66);background-clip:content-box}html body[for=html-export]:not([data-presentation-mode]){position:relative;width:100%;height:100%;top:0;left:0;margin:0;padding:0;overflow:auto}html body[for=html-export]:not([data-presentation-mode]) .markdown-preview{position:relative;top:0;min-height:100vh}@media screen and (min-width:914px){html body[for=html-export]:not([data-presentation-mode]) .markdown-preview{padding:2em calc(50% - 457px + 2em)}}@media screen and (max-width:914px){html body[for=html-export]:not([data-presentation-mode]) .markdown-preview{padding:2em}}@media screen and (max-width:450px){html body[for=html-export]:not([data-presentation-mode]) .markdown-preview{font-size:14px!important;padding:1em}}@media print{html body[for=html-export]:not([data-presentation-mode]) #sidebar-toc-btn{display:none}}html body[for=html-export]:not([data-presentation-mode]) #sidebar-toc-btn{position:fixed;bottom:8px;left:8px;font-size:28px;cursor:pointer;color:inherit;z-index:99;width:32px;text-align:center;opacity:.4}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] #sidebar-toc-btn{opacity:1}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc{position:fixed;top:0;left:0;width:300px;height:100%;padding:32px 0 48px 0;font-size:14px;box-shadow:0 0 4px rgba(150,150,150,.33);box-sizing:border-box;overflow:auto;background-color:inherit}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar{width:8px}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-thumb{border-radius:5px;background-color:rgba(150,150,150,.66);border:4px solid rgba(150,150,150,.66);background-clip:content-box}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc a{text-decoration:none}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc{padding:0 16px}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc .md-toc-link-wrapper .md-toc-link{display:inline;padding:.25rem 0}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc .md-toc-link-wrapper .md-toc-link div,html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc .md-toc-link-wrapper .md-toc-link p{display:inline}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc .md-toc-link-wrapper.highlighted .md-toc-link{font-weight:800}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{left:300px;width:calc(100% - 300px);padding:2em calc(50% - 457px - 300px / 2);margin:0;box-sizing:border-box}@media screen and (max-width:1274px){html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{padding:2em}}@media screen and (max-width:450px){html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{width:100%}}html body[for=html-export]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .markdown-preview{left:50%;transform:translateX(-50%)}html body[for=html-export]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .md-sidebar-toc{display:none}
/* Please visit the URL below for more information: */
/* https://shd101wyy.github.io/markdown-preview-enhanced/#/customize-css */
</style>
<!-- The content below will be included at the end of the <head> element. --><script type="text/javascript">
document.addEventListener("DOMContentLoaded", function () {
// your code here
});
</script></head><body for="html-export">
<div class="crossnote markdown-preview ">
<h4 id="1-ai-agent">1. AI agent </h4>
<p>Agent模块负责处理request工作流生成prompt与LLM交互。<br>
Agent 有三模式运行由plugin在request的model参数决定运行模式在交互过程对agent是透明的。</p>
<blockquote>
<ol>
<li>agent local model就是agent调用本地部署的LLM模型</li>
<li>agent remote api就是agent调用openai或deepseek等外部服务的api</li>
<li>plugin remote api由plugin调用openai或deepseek等外部服务的api</li>
</ol>
</blockquote>
<p>agent网页版测试 <a href="https://host:port/simpletest2025">https://host:port/simpletest2025</a><br>
前端测试代码 repo/examples<br>
测试api_key: “<em><strong>simpletest2025</strong></em>_xxxx” xxxx为任意字符串</p>
<h5 id="11-系统框架">1.1 系统框架 </h5>
<img src="assets/架构.png" alt="drawing" style="width:700px;">
<p>ideservice 是须要plugin提供给agent的一些获取IDE信息的基础功能为穿透NAT需要websocket连接。</p>
<h5 id="12-workflow">1.2 workflow </h5>
<div class="mermaid">sequenceDiagram
plugin-&gt;&gt;agent: request
agent--&gt;&gt;ideservice: more info
ideservice--&gt;&gt;agent: file, symbol
agent-&gt;&gt;plugin: result
</div><p>agent有可能会多次向ideservice询问更多的信息这对于plugin是透明的。</p>
<h5 id="13-task-pool">1.3 Task Pool </h5>
<p>章节2中所有带cmd参数带前缀“exec”的request都是涉及LLM模型调用的。<br>
Agent用一个FIFO队列缓存所有用户的未处理任务当队列长度过大时agent会拒绝新来的任务。<br>
同一APIkey同时能建立5个链接一个连接只能有一个任务在队列同时提交两个task, 前一个会被取消。</p>
<h4 id="2-agent协议">2. Agent协议 </h4>
<p>plugin通过websocket连接agent。如果使用https, 需要设置client接受agent的https认证证书。</p>
<h5 id="21-身份认证">2.1 身份认证 </h5>
<p>建立连接时带header "X-Api-Key" : api_key如果api_key不对agent主动断开连接</p>
<pre data-role="codeBlock" data-info="javascript" class="language-javascript javascript"><code><span class="token keyword keyword-let">let</span> client <span class="token operator">=</span> <span class="token keyword keyword-new">new</span> <span class="token class-name">ws<span class="token punctuation">.</span>WebSocket</span><span class="token punctuation">(</span><span class="token string">'wss://host:8080/ws'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token literal-property property">headers</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token punctuation">[</span><span class="token string">"X-Api-Key"</span><span class="token punctuation">]</span><span class="token operator">:</span> <span class="token string">"simpletest2025_001"</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span>
</code></pre><h5 id="22-获取agent支持的模型-list_model">2.2 获取Agent支持的模型 list_model </h5>
<pre data-role="codeBlock" data-info="javascript" class="language-javascript javascript"><code><span class="token literal-property property">request</span><span class="token operator">:</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"request_id"</span><span class="token operator">:</span> <span class="token number">123</span><span class="token punctuation">,</span> <span class="token comment">// 随机生成 (必填)</span>
<span class="token string-property property">"cmd"</span> <span class="token operator">:</span> <span class="token string">"list_model"</span>
<span class="token punctuation">}</span>
<span class="token literal-property property">response</span><span class="token operator">:</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"request_id"</span><span class="token operator">:</span> <span class="token number">123</span><span class="token punctuation">,</span> <span class="token comment">// 同request</span>
<span class="token string-property property">"models"</span> <span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"local deepseek-R1:32b"</span><span class="token punctuation">,</span> <span class="token string">"deepseek-R1:32b"</span><span class="token punctuation">]</span> <span class="token comment">// (必填)</span>
<span class="token punctuation">}</span>
</code></pre><h5 id="23-生成代码解释-exec_explain">2.3 生成代码解释 (exec_explain) </h5>
<pre data-role="codeBlock" data-info="javascript" class="language-javascript javascript"><code><span class="token literal-property property">request</span><span class="token operator">:</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"cmd"</span> <span class="token operator">:</span> <span class="token string">"exec_explain"</span><span class="token punctuation">,</span>
<span class="token string-property property">"request_id"</span> <span class="token operator">:</span> <span class="token number">123</span><span class="token punctuation">,</span> <span class="token comment">// 随机生成 (必填)</span>
<span class="token string-property property">"language"</span> <span class="token operator">:</span> <span class="token string">"en"</span><span class="token punctuation">,</span> <span class="token comment">// 语言, en-英文, zh-中文,默认为 en (可选)</span>
<span class="token string-property property">"selected_text"</span><span class="token operator">:</span> text_context<span class="token punctuation">,</span> <span class="token comment">// 选取的代码片段 (必填)</span>
<span class="token string-property property">"visible_text"</span> <span class="token operator">:</span> text_context<span class="token punctuation">,</span> <span class="token comment">// ide窗口可见的代码片段 (必填)</span>
<span class="token string-property property">"model"</span> <span class="token operator">:</span> <span class="token string">"local deepseek-r1:32b"</span><span class="token punctuation">,</span> <span class="token comment">//(必填)</span>
<span class="token string-property property">"stream"</span> <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token comment">// stream方式返回目前未支持 (可选)</span>
<span class="token punctuation">}</span>
<span class="token literal-property property">text_context</span><span class="token operator">:</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"filepath"</span><span class="token operator">:</span> <span class="token string">"example\\\\game.py"</span><span class="token punctuation">,</span> <span class="token comment">// 文件路径 </span>
<span class="token string-property property">"range"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token string-property property">"start"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string-property property">"line"</span><span class="token operator">:</span> <span class="token number">33</span><span class="token punctuation">,</span> <span class="token string-property property">"character"</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// 从33行0字符开始</span>
<span class="token string-property property">"end"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string-property property">"line"</span><span class="token operator">:</span> <span class="token number">45</span><span class="token punctuation">,</span> <span class="token string-property property">"character"</span><span class="token operator">:</span> <span class="token number">41</span><span class="token punctuation">}</span> <span class="token comment">// 到45行41字符结束</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token string-property property">"text"</span><span class="token operator">:</span> <span class="token string">"..."</span> <span class="token comment">// 源码片段</span>
<span class="token punctuation">}</span>
<span class="token literal-property property">成功返回</span><span class="token operator">:</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"request_id"</span> <span class="token operator">:</span> <span class="token number">123</span><span class="token punctuation">,</span> <span class="token comment">// 同request必填</span>
<span class="token string-property property">"msg"</span> <span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span> <span class="token comment">// 返回内容</span>
<span class="token string-property property">"stream_seq_id"</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token comment">// stream sequence id目前未支持 (可选)</span>
<span class="token string-property property">"stream_finish"</span><span class="token operator">:</span> <span class="token boolean">false</span> <span class="token comment">// stream 结束,目前未支持 (可选)</span>
<span class="token punctuation">}</span>
<span class="token literal-property property">失败返回</span><span class="token operator">:</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"request_id"</span><span class="token operator">:</span> <span class="token number">123</span><span class="token punctuation">,</span> <span class="token comment">// 同request必填</span>
<span class="token string-property property">"error"</span> <span class="token operator">:</span> <span class="token string">"cancelled"</span> <span class="token comment">// 出错信息,没有就是调用成功(必填)</span>
<span class="token punctuation">}</span>
</code></pre><h5 id="24-生成代码文档-exec_docstring">2.4 生成代码文档 (exec_docstring) </h5>
<p>目前只支持python</p>
<pre data-role="codeBlock" data-info="javascript" class="language-javascript javascript"><code><span class="token literal-property property">request</span><span class="token operator">:</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"cmd"</span> <span class="token operator">:</span> <span class="token string">"exec_docstring"</span><span class="token punctuation">,</span>
<span class="token string-property property">"request_id"</span> <span class="token operator">:</span> <span class="token number">123</span><span class="token punctuation">,</span> <span class="token comment">// 随机生成 (必填)</span>
<span class="token string-property property">"language"</span> <span class="token operator">:</span> <span class="token string">"en"</span><span class="token punctuation">,</span> <span class="token comment">// 语言, en-英文, zh-中文,默认为 en (可选)</span>
<span class="token string-property property">"selected_text"</span><span class="token operator">:</span> text_context<span class="token punctuation">,</span> <span class="token comment">// 选取的代码片段 (必填)</span>
<span class="token string-property property">"model"</span> <span class="token operator">:</span> <span class="token string">"local deepseek-r1:32b"</span><span class="token punctuation">,</span> <span class="token comment">//(必填)</span>
<span class="token string-property property">"stream"</span> <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token comment">// stream方式返回目前未支持 (可选)</span>
<span class="token punctuation">}</span>
返回json格式同 <span class="token number">2.3</span>
</code></pre><h5 id="25-代码优化-exec_optimize">2.5 代码优化 (exec_optimize) </h5>
<p>//TODO 未测试效果, prompt该如何描述优化</p>
<pre data-role="codeBlock" data-info="javascript" class="language-javascript javascript"><code><span class="token literal-property property">request</span><span class="token operator">:</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"cmd"</span> <span class="token operator">:</span> <span class="token string">"exec_optimize"</span><span class="token punctuation">,</span>
<span class="token string-property property">"request_id"</span> <span class="token operator">:</span> <span class="token number">123</span><span class="token punctuation">,</span> <span class="token comment">// 随机生成 (必填)</span>
<span class="token string-property property">"language"</span> <span class="token operator">:</span> <span class="token string">"en"</span><span class="token punctuation">,</span> <span class="token comment">// 语言, en-英文, zh-中文,默认为 en (可选)</span>
<span class="token string-property property">"selected_text"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span> <span class="token comment">// 选取的代码片段 (必填)</span>
<span class="token string-property property">"model"</span> <span class="token operator">:</span> <span class="token string">"local deepseek-r1:32b"</span><span class="token punctuation">,</span> <span class="token comment">//(必填)</span>
<span class="token string-property property">"stream"</span> <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token comment">// stream方式返回目前未支持 (可选)</span>
<span class="token punctuation">}</span>
返回json格式同 <span class="token number">2.3</span>
</code></pre><h5 id="26-生成单元测试代码-exec_fix">2.6 生成单元测试代码 (exec_fix) </h5>
<pre data-role="codeBlock" data-info="javascript" class="language-javascript javascript"><code><span class="token literal-property property">request</span><span class="token operator">:</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"cmd"</span> <span class="token operator">:</span> <span class="token string">"exec_fix"</span><span class="token punctuation">,</span>
<span class="token string-property property">"request_id"</span> <span class="token operator">:</span> <span class="token number">123</span><span class="token punctuation">,</span> <span class="token comment">// 随机生成 (必填)</span>
<span class="token string-property property">"language"</span> <span class="token operator">:</span> <span class="token string">"en"</span><span class="token punctuation">,</span> <span class="token comment">// 语言, en-英文, zh-中文,默认为 en (可选)</span>
<span class="token string-property property">"selected_text"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span> <span class="token comment">// 选取的代码片段 (必填)</span>
<span class="token string-property property">"model"</span> <span class="token operator">:</span> <span class="token string">"local deepseek-r1:32b"</span><span class="token punctuation">,</span><span class="token comment">//(必填)</span>
<span class="token string-property property">"stream"</span> <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token comment">// stream方式返回目前未支持 (可选)</span>
<span class="token punctuation">}</span>
返回json格式同 <span class="token number">2.3</span>
</code></pre><h5 id="27-生成单元测试代码-exec_unittest">2.7 生成单元测试代码 (exec_unittest) </h5>
<p>// TODO 与ideservice交互</p>
<p>目前仅支持英文回复, 流程对devchat做了简化</p>
<div class="mermaid">sequenceDiagram
plugin-&gt;&gt;agent: exec_unittest_recommend 请求测试建议
agent-&gt;&gt;plugin: 测试建议
plugin-&gt;&gt;agent: exec_unittest_code 请求测试代码
plugin-&gt;&gt;agent: 测试代码
</div><pre data-role="codeBlock" data-info="javascript" class="language-javascript javascript"><code><span class="token literal-property property">请求测试建议</span><span class="token operator">:</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"cmd"</span> <span class="token operator">:</span> <span class="token string">"exec_unittest_recommend"</span><span class="token punctuation">,</span>
<span class="token string-property property">"request_id"</span><span class="token operator">:</span> <span class="token number">123</span><span class="token punctuation">,</span> <span class="token comment">// 随机生成 (必填)</span>
<span class="token string-property property">"language"</span> <span class="token operator">:</span> <span class="token string">"en"</span><span class="token punctuation">,</span> <span class="token comment">// 语言, en-英文, zh-中文,默认为 en (可选)</span>
<span class="token string-property property">"user_prompt"</span> <span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span> <span class="token comment">// 用户定制化描述 (可选)</span>
<span class="token string-property property">"file_content"</span> <span class="token operator">:</span> <span class="token string">"..."</span> <span class="token comment">// 整个文件内容(必填)</span>
<span class="token string-property property">"filepath"</span> <span class="token operator">:</span> <span class="token string">"\\example\\game.py"</span><span class="token punctuation">,</span> <span class="token comment">// 文件路径(必填)</span>
<span class="token string-property property">"func_name"</span> <span class="token operator">:</span> <span class="token string">"next_turn"</span><span class="token punctuation">,</span> <span class="token comment">// 函数名 (必填)</span>
<span class="token string-property property">"func_location"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token comment">// 函数位置(必填)</span>
<span class="token string-property property">"start"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string-property property">"line"</span><span class="token operator">:</span> <span class="token number">33</span><span class="token punctuation">,</span> <span class="token string-property property">"character"</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token string-property property">"end"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string-property property">"line"</span><span class="token operator">:</span> <span class="token number">45</span><span class="token punctuation">,</span> <span class="token string-property property">"character"</span><span class="token operator">:</span> <span class="token number">41</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token string-property property">"func_symbols"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token comment">// function 内的所以变量名和函数名 (必填)</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"next_turn"</span><span class="token punctuation">,</span>
<span class="token string-property property">"kind"</span><span class="token operator">:</span> <span class="token string">"Function"</span><span class="token punctuation">,</span>
<span class="token string-property property">"range"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token comment">// 位置</span>
<span class="token string-property property">"start"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string-property property">"line"</span><span class="token operator">:</span> <span class="token number">33</span><span class="token punctuation">,</span> <span class="token string-property property">"character"</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token string-property property">"end"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string-property property">"line"</span><span class="token operator">:</span> <span class="token number">45</span><span class="token punctuation">,</span> <span class="token string-property property">"character"</span><span class="token operator">:</span> <span class="token number">41</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token string-property property">"children"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"WIDTH"</span><span class="token punctuation">,</span>
<span class="token string-property property">"kind"</span><span class="token operator">:</span> <span class="token string">"Constant"</span><span class="token punctuation">,</span>
<span class="token string-property property">"range"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token comment">// 位置</span>
<span class="token string-property property">"start"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string-property property">"line"</span><span class="token operator">:</span> <span class="token number">33</span><span class="token punctuation">,</span> <span class="token string-property property">"character"</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token string-property property">"end"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string-property property">"line"</span><span class="token operator">:</span> <span class="token number">45</span><span class="token punctuation">,</span> <span class="token string-property property">"character"</span><span class="token operator">:</span> <span class="token number">41</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token string-property property">"children"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token spread operator">...</span>
<span class="token punctuation">]</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token spread operator">...</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token string-property property">"model"</span> <span class="token operator">:</span> <span class="token string">"local deepseek-r1:32b"</span><span class="token punctuation">,</span> <span class="token comment">//(必填)</span>
<span class="token string-property property">"stream"</span> <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token comment">// stream方式返回目前未支持 (可选)</span>
<span class="token punctuation">}</span>
返回json格式同 <span class="token number">2.3</span>
请求测试代码:
<span class="token punctuation">{</span>
<span class="token string-property property">"cmd"</span> <span class="token operator">:</span> <span class="token string">"exec_unittest_code"</span><span class="token punctuation">,</span>
<span class="token string-property property">"request_id"</span> <span class="token operator">:</span> <span class="token number">123</span><span class="token punctuation">,</span> <span class="token comment">// 随机生成 (必填)</span>
<span class="token string-property property">"language"</span> <span class="token operator">:</span> <span class="token string">"en"</span><span class="token punctuation">,</span> <span class="token comment">// 语言, en-英文, zh-中文,默认为 en (可选)</span>
<span class="token string-property property">"test_cases_str"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span> <span class="token comment">// exec_unittest_recommend 提供的 (必填)</span>
<span class="token comment">// 如果task_id为空须填写</span>
<span class="token string-property property">"function_name"</span> <span class="token operator">:</span> <span class="token string">""</span> <span class="token comment">// 函数名 (可选)</span>
<span class="token string-property property">"user_prompt"</span> <span class="token operator">:</span> <span class="token string">""</span> <span class="token comment">// 定制化描述 (可选)</span>
<span class="token string-property property">"file_path"</span> <span class="token operator">:</span> <span class="token string">"./src/test.py"</span> <span class="token comment">// 文件在项目里的相对路径 (可选)</span>
<span class="token string-property property">"relevant_content"</span> <span class="token operator">:</span> <span class="token string">""</span> <span class="token comment">// the relevant source code of the function (可选)</span>
<span class="token string-property property">"reference_content"</span><span class="token operator">:</span> <span class="token string">""</span> <span class="token comment">// the relevant source code of the function (可选)</span>
<span class="token string-property property">"stream"</span><span class="token operator">:</span> <span class="token boolean">false</span> <span class="token comment">// stream方式返回目前未支持 (可选)</span>
<span class="token punctuation">}</span>
返回json格式同 <span class="token number">2.3</span>
</code></pre><h5 id="28-和大模型对话-exec_chat">2.8 和大模型对话 (exec_chat) </h5>
<pre data-role="codeBlock" data-info="javascript" class="language-javascript javascript"><code><span class="token literal-property property">request</span><span class="token operator">:</span>
<span class="token punctuation">{</span>
<span class="token string-property property">"cmd"</span> <span class="token operator">:</span> <span class="token string">"exec_chat"</span><span class="token punctuation">,</span>
<span class="token string-property property">"request_id"</span><span class="token operator">:</span> <span class="token number">123</span><span class="token punctuation">,</span> <span class="token comment">// 随机生成 (必填)</span>
<span class="token string-property property">"msg"</span> <span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span> <span class="token comment">// 内容 (必填)</span>
<span class="token string-property property">"model"</span> <span class="token operator">:</span> <span class="token string">"local deepseek-r1:32b"</span><span class="token punctuation">,</span> <span class="token comment">//(必填)</span>
<span class="token string-property property">"stream"</span> <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token comment">// stream方式返回目前未支持 (可选)</span>
<span class="token punctuation">}</span>
返回json格式同 <span class="token number">2.3</span>
</code></pre><h4 id="3-ide_service协议">3. ide_service协议 </h4>
<p>开发优先级低解决2.7“与ideservice交互”问题前未用到</p>
<p>是由 agent 向 ide_service 请求,参考<br>
<a href="https://github.com/devchat-ai/devchat-vscode/blob/main/src/ide_services/services.ts">https://github.com/devchat-ai/devchat-vscode/blob/main/src/ide_services/services.ts</a></p>
<p>只保留以下服务,</p>
<pre data-role="codeBlock" data-info="javascript" class="language-javascript javascript"><code> <span class="token string-property property">"/get_document_symbols"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token literal-property property">keys</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"abspath"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token literal-property property">handler</span><span class="token operator">:</span> getDocumentSymbols<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token string-property property">"/find_def_locations"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token literal-property property">keys</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"abspath"</span><span class="token punctuation">,</span> <span class="token string">"line"</span><span class="token punctuation">,</span> <span class="token string">"character"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token literal-property property">handler</span><span class="token operator">:</span> findDefinitionLocations<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token string-property property">"/find_type_def_locations"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token literal-property property">keys</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"abspath"</span><span class="token punctuation">,</span> <span class="token string">"line"</span><span class="token punctuation">,</span> <span class="token string">"character"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token literal-property property">handler</span><span class="token operator">:</span> findTypeDefinitionLocations<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
</code></pre><h4 id="3-功能覆盖">3. 功能覆盖 </h4>
<img src="assets/功能覆盖.png">
</div>
<script type="module">
// TODO: If ZenUML gets integrated into mermaid in the future,
// we can remove the following lines.
var MERMAID_CONFIG = ({"startOnLoad":false});
if (typeof MERMAID_CONFIG !== 'undefined') {
MERMAID_CONFIG.startOnLoad = false
MERMAID_CONFIG.cloneCssStyles = false
MERMAID_CONFIG.theme = "default"
}
mermaid.initialize(MERMAID_CONFIG || {})
if (typeof(window['Reveal']) !== 'undefined') {
function mermaidRevealHelper(event) {
var currentSlide = event.currentSlide
var diagrams = currentSlide.querySelectorAll('.mermaid')
for (var i = 0; i < diagrams.length; i++) {
var diagram = diagrams[i]
if (!diagram.hasAttribute('data-processed')) {
mermaid.init(null, diagram, ()=> {
Reveal.slide(event.indexh, event.indexv)
})
}
}
}
Reveal.addEventListener('slidetransitionend', mermaidRevealHelper)
Reveal.addEventListener('ready', mermaidRevealHelper)
await mermaid.run({
nodes: document.querySelectorAll('.mermaid')
})
} else {
await mermaid.run({
nodes: document.querySelectorAll('.mermaid')
})
}
</script>
</body></html>