<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Pi Coding Agent on OHTLY Blog</title>
    <link>https://blog.ohtly.com/tags/pi-coding-agent/</link>
    <description>Recent content in Pi Coding Agent on OHTLY Blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 14 Jul 2026 14:43:55 +0800</lastBuildDate>
    <atom:link href="https://blog.ohtly.com/tags/pi-coding-agent/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>给 Pi Coding Agent 项目配置 HTTP 代理</title>
      <link>https://blog.ohtly.com/posts/2026-07-14-pi-coding-agent-http-proxy/</link>
      <pubDate>Tue, 14 Jul 2026 14:32:55 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-07-14-pi-coding-agent-http-proxy/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;&#xA;  背景&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Pi Coding Agent 统一通过 &lt;code&gt;HTTP_PROXY&lt;/code&gt; 环境变量控制所有 &lt;code&gt;fetch&lt;/code&gt; 请求（LLM API 调用 + 工具层请求）是否走代理。代理服务器自身配置例外规则（如国内地址直连），deepseek 等国内服务实际不绕路。&lt;/p&gt;&#xA;&lt;p&gt;配置方式：在 &lt;code&gt;config.json&lt;/code&gt; 中写入代理地址，项目持久化，重启后自动生效。&lt;/p&gt;&#xA;&lt;h2 id=&#34;sdk-网络层&#34;&gt;&#xA;  SDK 网络层&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#sdk-%e7%bd%91%e7%bb%9c%e5%b1%82&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Pi Coding Agent 用 &lt;code&gt;undici.setGlobalDispatcher()&lt;/code&gt; 替换全局 &lt;code&gt;fetch&lt;/code&gt;，底层由 &lt;code&gt;undici.EnvHttpProxyAgent&lt;/code&gt; 控制。该 dispatcher 同时服务于 LLM API 请求和工具 &lt;code&gt;execute&lt;/code&gt; 中的 &lt;code&gt;fetch&lt;/code&gt;，&lt;code&gt;HTTP_PROXY&lt;/code&gt; / &lt;code&gt;HTTPS_PROXY&lt;/code&gt; 环境变量同时影响两端。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;AgentSession&#xA;    ├── LLM API 请求（OpenAI / Anthropic / DeepSeek）&#xA;    └── 工具 execute fetch（search / fetch / curl 等）&#xA;              │&#xA;              ▼&#xA;        undici 全局 dispatcher&#xA;              │&#xA;              ▼&#xA;        EnvHttpProxyAgent（读取 HTTP_PROXY）&#xA;              │&#xA;              ▼&#xA;            代理服务器&#xA;          （自己做例外规则）&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;配置方式&#34;&gt;&#xA;  配置方式&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%85%8d%e7%bd%ae%e6%96%b9%e5%bc%8f&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;configjson-新增-httpproxy&#34;&gt;&#xA;  config.json 新增 &lt;code&gt;httpProxy&lt;/code&gt;&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#configjson-%e6%96%b0%e5%a2%9e-httpproxy&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;provider&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deepseek&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;model&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;apiKey&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sk-xxx&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;cwd&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/project&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;httpProxy&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://127.0.0.1:7890&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;windmillUrl&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://ape:3900&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;windmillToken&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;留空则不设代理。&lt;/p&gt;</description>
    </item>
    <item>
      <title>为 Pi Coding Agent 编写扩展命令</title>
      <link>https://blog.ohtly.com/posts/2026-07-14-pi-coding-agent-commands/</link>
      <pubDate>Tue, 14 Jul 2026 14:32:55 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-07-14-pi-coding-agent-commands/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;&#xA;  背景&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Pi Coding Agent 内置斜杠命令机制，用户输入 &lt;code&gt;/cmd&lt;/code&gt; 时优先匹配已注册的命令，不发给 LLM。命令由扩展通过 &lt;code&gt;pi.registerCommand()&lt;/code&gt; 注册，handler 接收 &lt;code&gt;ctx&lt;/code&gt; 参数，可调用 &lt;code&gt;ctx.newSession()&lt;/code&gt;、&lt;code&gt;ctx.reload()&lt;/code&gt;、&lt;code&gt;ctx.ui&lt;/code&gt; 等方法。&lt;/p&gt;&#xA;&lt;p&gt;SDK 示例自带 &lt;code&gt;/commands&lt;/code&gt; 命令（列出所有可用命令），但直接在项目中引用时没有输出——因为默认环境未注入 UI Context。&lt;/p&gt;&#xA;&lt;h2 id=&#34;注册命令&#34;&gt;&#xA;  注册命令&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%b3%a8%e5%86%8c%e5%91%bd%e4%bb%a4&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Extension 文件中通过 &lt;code&gt;pi.registerCommand()&lt;/code&gt; 注册：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;ExtensionAPI&lt;/span&gt; } &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@earendil-works/pi-coding-agent&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;pi&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;ExtensionAPI&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;pi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;registerCommand&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;mycmd&amp;#34;&lt;/span&gt;, {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;description&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;命令简短描述&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;handler&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;args&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;// args: 命令后面的参数字符串&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;// ctx: ExtensionCommandContext&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;registerCommand&lt;/code&gt; 的 options 字段：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;字段&lt;/th&gt;&#xA;          &lt;th&gt;类型&lt;/th&gt;&#xA;          &lt;th&gt;说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;命令描述，/commands 列表展示&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;getArgumentCompletions&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;function&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;可选，参数自动补全&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;handler&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;function&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;命令执行函数&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;code&gt;handler&lt;/code&gt; 的 &lt;code&gt;ctx&lt;/code&gt;（&lt;code&gt;ExtensionCommandContext&lt;/code&gt;）常用方法：&lt;/p&gt;</description>
    </item>
    <item>
      <title>为 Pi Coding Agent 编写自定义工具</title>
      <link>https://blog.ohtly.com/posts/2026-07-14-pi-coding-agent-custom-tool/</link>
      <pubDate>Tue, 14 Jul 2026 10:30:00 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-07-14-pi-coding-agent-custom-tool/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;&#xA;  背景&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Pi Coding Agent 的扩展机制允许向 AgentSession 注册自定义 Tool，LLM 在对话中可以直接调用这些工具。扩展是 ESM 模块，通过 &lt;code&gt;pi.registerTool()&lt;/code&gt; 注册，自动加载到当前 Session。&lt;/p&gt;&#xA;&lt;h2 id=&#34;注册-tool&#34;&gt;&#xA;  注册 Tool&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%b3%a8%e5%86%8c-tool&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Extension 文件导出一个默认函数，接收 &lt;code&gt;pi: ExtensionAPI&lt;/code&gt; 作为参数：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;ExtensionAPI&lt;/span&gt; } &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@earendil-works/pi-coding-agent&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt; } &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;typebox&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;pi&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;ExtensionAPI&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;pi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;registerTool&lt;/span&gt;({ &lt;span style=&#34;color:#75715e&#34;&gt;/* ... */&lt;/span&gt; });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;pi.registerTool()&lt;/code&gt; 接收一个对象，关键字段如下：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;字段&lt;/th&gt;&#xA;          &lt;th&gt;类型&lt;/th&gt;&#xA;          &lt;th&gt;说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;工具唯一标识，LLM 据此调用&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;label&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;显示名称，UI 中展示&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;工具描述，LLM 据此判断何时调用&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;promptSnippet&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;简短提示，注入系统提示词&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;promptGuidelines&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;调用 guideline，LLM 参考&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;parameters&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;TypeBox Schema&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;参数 Schema，LLM 据此生成参数&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;execute&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;function&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;工具执行函数&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;typebox-schema&#34;&gt;&#xA;  TypeBox Schema&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#typebox-schema&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;parameters&lt;/code&gt; 用 TypeBox 定义：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Electron 集成 PI SDK 桌面聊天实践</title>
      <link>https://blog.ohtly.com/posts/2026-07-13-electron-pi-coding-agent/</link>
      <pubDate>Mon, 13 Jul 2026 19:41:23 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-07-13-electron-pi-coding-agent/</guid>
      <description>&lt;h2 id=&#34;项目背景&#34;&gt;&#xA;  项目背景&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%a1%b9%e7%9b%ae%e8%83%8c%e6%99%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;用 Electron 封装 PI Coding Agent SDK，做一个轻量桌面 AI 聊天客户端。目标是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;提供 GUI 界面替代终端交互&lt;/li&gt;&#xA;&lt;li&gt;跨平台（macOS + Windows）&lt;/li&gt;&#xA;&lt;li&gt;集成 PI SDK 的 tool calling、流式回复能力&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;源码：&lt;a href=&#34;https://github.com/MarshalW/electron-pi&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;MarshalW/electron-pi&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;架构&#34;&gt;&#xA;  架构&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%9e%b6%e6%9e%84&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Renderer (index.html)&#xA;    ↕ contextBridge (preload.js)&#xA;Main Process (main.js)&#xA;    ↕ @earendil-works/pi-coding-agent&#xA;AgentSession (Tool calling, LLM 通信)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;三进程架构：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Renderer&lt;/strong&gt;：纯前端 HTML/CSS/JS，显示聊天界面&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Preload&lt;/strong&gt;：contextBridge 暴露 &lt;code&gt;window.pi.*&lt;/code&gt; API&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Main&lt;/strong&gt;：Electron 主进程，管理窗口、PI SDK、IPC 通道&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;IPC 通道设计：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Channel&lt;/th&gt;&#xA;          &lt;th&gt;方向&lt;/th&gt;&#xA;          &lt;th&gt;说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;config:get&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Renderer → Main&lt;/td&gt;&#xA;          &lt;td&gt;读取配置&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;config:save&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Renderer → Main&lt;/td&gt;&#xA;          &lt;td&gt;保存配置&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;session:create&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Renderer → Main&lt;/td&gt;&#xA;          &lt;td&gt;创建 AgentSession&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;session:send&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Renderer → Main&lt;/td&gt;&#xA;          &lt;td&gt;发送 prompt&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;session:abort&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Renderer → Main&lt;/td&gt;&#xA;          &lt;td&gt;中止回复&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;pi:event&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Main → Renderer&lt;/td&gt;&#xA;          &lt;td&gt;推送流式事件&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;pi-sdk-集成&#34;&gt;&#xA;  PI SDK 集成&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#pi-sdk-%e9%9b%86%e6%88%90&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;模型解析&#34;&gt;&#xA;  模型解析&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%a8%a1%e5%9e%8b%e8%a7%a3%e6%9e%90&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;createAgentSession&lt;/code&gt; 需要完整的模型对象（含 &lt;code&gt;baseUrl&lt;/code&gt;、&lt;code&gt;api&lt;/code&gt; 等字段），不能只传 &lt;code&gt;{ provider, model }&lt;/code&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pi Web 配置 DeepSeek 与自定义工具</title>
      <link>https://blog.ohtly.com/posts/2026-07-13-pi-web-deepseek-custom-tools/</link>
      <pubDate>Mon, 13 Jul 2026 09:44:05 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-07-13-pi-web-deepseek-custom-tools/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;&#xA;  背景&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/earendil-works/pi&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pi Coding Agent&lt;/a&gt; 是一个开源的 AI 编程助手，69K+ Stars，MIT 协议。它的架构分三层：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://www.npmjs.com/package/@earendil-works/pi-ai&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@earendil-works/pi-ai&lt;/a&gt;&lt;/strong&gt; — 统一多 Provider LLM API&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://www.npmjs.com/package/@earendil-works/pi-agent-core&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@earendil-works/pi-agent-core&lt;/a&gt;&lt;/strong&gt; — Agent 运行时（Tool calling、状态管理）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://www.npmjs.com/package/@earendil-works/pi-coding-agent&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@earendil-works/pi-coding-agent&lt;/a&gt;&lt;/strong&gt; — CLI + SDK&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/agegr/pi-web&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pi Web&lt;/a&gt; 是社区开发的 Web UI，1.1K Stars。它通过 Pi SDK 直接创建 AgentSession，通过 SSE 推送流式事件到浏览器，不跑 CLI 子进程。&lt;/p&gt;&#xA;&lt;p&gt;同类项目还有 &lt;a href=&#34;https://github.com/jmfederico/pi-web&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;jmfederico/pi-web&lt;/a&gt;（支持远程 Machine/Fleet）和 &lt;a href=&#34;https://github.com/minghinmatthewlam/pi-gui&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pi-gui&lt;/a&gt;（Electron 桌面版）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;部署&#34;&gt;&#xA;  部署&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%83%a8%e7%bd%b2&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;环境要求：Node.js 22+。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/agegr/pi-web.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd pi-web&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm run dev&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认运行在 &lt;code&gt;http://localhost:30141&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;配置-deepseek-模型&#34;&gt;&#xA;  配置 DeepSeek 模型&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%85%8d%e7%bd%ae-deepseek-%e6%a8%a1%e5%9e%8b&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Pi Coding Agent 内置了 DeepSeek Provider，模型定义在 &lt;a href=&#34;https://github.com/earendil-works/pi/blob/main/packages/ai/src/providers/deepseek.models.ts&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;deepseek.models.ts&lt;/a&gt;，包含 &lt;code&gt;deepseek-v4-flash&lt;/code&gt; 和 &lt;code&gt;deepseek-v4-pro&lt;/code&gt;。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
