<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Pi on OHTLY Blog</title>
    <link>https://blog.ohtly.com/tags/pi/</link>
    <description>Recent content in Pi 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/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>
  </channel>
</rss>
