<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>东方赞 Blog</title>
        <link>https://dongfangzan.cn/</link>
        <description>东方赞 Blog</description>
        <lastBuildDate>Thu, 31 Dec 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <item>
            <title><![CDATA[你好，欢迎来到我的博客]]></title>
            <link>https://dongfangzan.cn/greetings</link>
            <guid>https://dongfangzan.cn/greetings</guid>
            <pubDate>Thu, 31 Dec 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[关于我]]></description>
            <content:encoded><![CDATA[<h4 class="anchor anchorWithStickyNavbar_LWe7" id="关于我">关于我<a href="https://dongfangzan.cn/greetings#%E5%85%B3%E4%BA%8E%E6%88%91" class="hash-link" aria-label="关于我的直接链接" title="关于我的直接链接">​</a></h4>
<p>欢迎来到我的博客！这里是我分享知识、经验和见解的地方。希望通过这个平台与志同道合的朋友们交流，互相学习，共同成长。让我们一起探索技术与财务的世界，分享彼此的故事和见解！</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="我的公众号">我的公众号<a href="https://dongfangzan.cn/greetings#%E6%88%91%E7%9A%84%E5%85%AC%E4%BC%97%E5%8F%B7" class="hash-link" aria-label="我的公众号的直接链接" title="我的公众号的直接链接">​</a></h4>
<p>为了能够获取第一手资讯，我也会在我的公众号上发布相关的内容，欢迎关注</p>
<img src="https://dongfangzan.cn/img/wechat.png" alt="alt text" width="400">]]></content:encoded>
            <category>Hello</category>
        </item>
        <item>
            <title><![CDATA[想玩龙虾OpenClaw？手把手教你一步步安装跑通]]></title>
            <link>https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action</link>
            <guid>https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action</guid>
            <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[最近龙虾OpenClaw真是火爆了，有很多小伙伴都来问阿赞，该怎么安装一个自己的龙虾？]]></description>
            <content:encoded><![CDATA[<p>最近龙虾OpenClaw真是火爆了，有很多小伙伴都来问阿赞，该怎么安装一个自己的龙虾？</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091218093.png" alt="" class="img_ev3q"></p>
<p>我们看一下最终的样子，安装指南来了！</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091227168.png" alt="" class="img_ev3q"></p>
<p>读完本篇文章，你可以学会：在自己的电脑上安装一个自己的龙虾，并用飞书来直接跟他聊天，完全不需要任何编程基础，纯小白也能轻松上手！</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="准备工作">准备工作<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C" class="hash-link" aria-label="准备工作的直接链接" title="准备工作的直接链接">​</a></h2>
<p><strong>首先，你需要一台可以连接互联网的电脑</strong></p>
<p>Windows、MacOS、Linux 都可以</p>
<p>有不少已经上网搜索过龙虾的小伙伴会问：<strong>Windows、MacOS、Linux 哪个系统更适合安装龙虾？</strong> 我是否应该买一台Mac Mini？</p>
<p>在阿赞的角度来看：MacOS 肯定是独一档的好</p>
<p>因为有着更好的稳定性，更强的性能，更低的功耗，让Mac Mini成为最适合龙虾的机器</p>
<p>但是其他系统也完全可以使用，如果不是重度依赖龙虾工作，你完全没有必要额外去买一台Mac Mini，在现有的电脑上安装使用足矣。</p>
<p><strong>其次，你需要一个大模型的API接口</strong></p>
<p>你可以买任何你觉得好用的大模型API接口，OpenAI、Anthropic、国内的模型厂商都可以</p>
<p>如果你没有预算，完全可以使用免费的模型接口，或者你有比较不错的显卡，那么你完全可以选择在本地部署一个开源模型，来当做龙虾的后端引擎。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="开始安装">开始安装<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E5%BC%80%E5%A7%8B%E5%AE%89%E8%A3%85" class="hash-link" aria-label="开始安装的直接链接" title="开始安装的直接链接">​</a></h2>
<p>我相信绝大多数小伙伴都有windows电脑，所以我们以Windows系统为例，来介绍一下安装的步骤。</p>
<blockquote>
<p>MacOS 和 Linux 的安装步骤基本上是一样的，唯一的区别就是第一步安装 Docker 的方式不太一样，后续的步骤完全一样。</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="第一步安装docker">第一步，安装docker<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E7%AC%AC%E4%B8%80%E6%AD%A5%E5%AE%89%E8%A3%85docker" class="hash-link" aria-label="第一步，安装docker的直接链接" title="第一步，安装docker的直接链接">​</a></h3>
<p>你可以在下面这个地址找到docker的安装教程，这里我不再赘述</p>
<p><a href="https://www.runoob.com/docker/windows-docker-install.html" target="_blank" rel="noopener noreferrer">https://www.runoob.com/docker/windows-docker-install.html</a></p>
<p>安装并启动完成之后，可以看到docker的界面了</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091236269.png" alt="" class="img_ev3q"></p>
<p>打开一个命令行窗口，输入 <code>docker version</code> 来验证一下是否安装成功</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091237011.png" alt="" class="img_ev3q"></p>
<p>看到如上界面后，就表示docker安装成功了，我们就可以进入下一步了。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="第二步下载龙虾docker镜像">第二步，下载龙虾docker镜像<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E7%AC%AC%E4%BA%8C%E6%AD%A5%E4%B8%8B%E8%BD%BD%E9%BE%99%E8%99%BEdocker%E9%95%9C%E5%83%8F" class="hash-link" aria-label="第二步，下载龙虾docker镜像的直接链接" title="第二步，下载龙虾docker镜像的直接链接">​</a></h3>
<p>这里我们使用了一个已经集成好了国内各种聊天软件的龙虾</p>
<p>Github仓库地址如下，感兴趣的小伙伴可以阅读一下，不感兴趣的直接按照我们下面的步骤来操作
<a href="https://github.com/justlovemaki/OpenClaw-Docker-CN-IM" target="_blank" rel="noopener noreferrer">https://github.com/justlovemaki/OpenClaw-Docker-CN-IM</a></p>
<p>打开一个命令行窗口，输入下面的命令来下载这个龙虾的docker镜像</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker pull justlovemaki/openclaw-docker-cn-im:latest</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>如果你没有科学上网的条件，那么大概率上面这个镜像下不下来，没关系我这里也准备了一个国内网络友好的镜像地址</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker pull registry.cn-hangzhou.aliyuncs.com/dongfangzan/openclaw-docker-cn-im:20260309</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<blockquote>
<p>你也可以在后台私信我回复：<strong>龙虾</strong>，我已经把这个镜像准备好了</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20260309141649_221_139.jpg" alt="" class="img_ev3q"></p>
<p><strong>文件下载下来之后，在下载目录，执行下面的命令即可完成导入</strong></p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker load -i openclaw.tar</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091242091.png" alt="" class="img_ev3q"></p>
<p>下载完成后，你可以输入下面的命令看到这个镜像</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker images</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="第三步启动龙虾">第三步，启动龙虾<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E7%AC%AC%E4%B8%89%E6%AD%A5%E5%90%AF%E5%8A%A8%E9%BE%99%E8%99%BE" class="hash-link" aria-label="第三步，启动龙虾的直接链接" title="第三步，启动龙虾的直接链接">​</a></h3>
<p>在你觉得合适的地方，创建一个目录来存放龙虾的数据，比如 <code>E:\openclaw-data</code></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091250980.png" alt="" class="img_ev3q"></p>
<p>这里可以看到，当前目录是空的，我们现在需要创建一个文本文档，命名为 <code>.env</code></p>
<blockquote>
<p>所有的配置文件，你可以关注我的公众号，并在后台回复：<strong>龙虾</strong>，我已经把所有涉及到的文件都准备好了</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20260309141649_221_139.jpg" alt="" class="img_ev3q"></p>
<p>把下面的内容，保存进<code>.env</code>文件中，然后我们开始替换掉里面的内容</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="创建配置文件">创建配置文件<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E5%88%9B%E5%BB%BA%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6" class="hash-link" aria-label="创建配置文件的直接链接" title="创建配置文件的直接链接">​</a></h4>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># OpenClaw Docker 环境变量配置示例</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 复制此文件为 .env 并修改相应的值</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Docker 镜像配置</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENCLAW_IMAGE=justlikemaki/openclaw-docker-cn-im:latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 模型配置</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 是否自动同步模型配置到 openclaw.json (true/false)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 如果你手动修改了 openclaw.json 中的模型设置，请将其设为 false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SYNC_MODEL_CONFIG=true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 提供商 1 (默认)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 主模型 ID (支持多个，用逗号隔开，第一个将作为默认模型)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MODEL_ID=model id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 图片模型 ID (可选，留空则使用 MODEL_ID，支持 provider/model 格式)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">IMAGE_MODEL_ID=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">BASE_URL=http://xxxxx/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">API_KEY=123456</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># API 协议类型: openai-completions 或 anthropic-messages</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">API_PROTOCOL=openai-completions</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 模型上下文窗口大小</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONTEXT_WINDOW=200000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 模型最大输出 tokens</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MAX_TOKENS=8192</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 提供商 2 (可选)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># MODEL2_NAME=model2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># MODEL2_MODEL_ID=model id1,model id2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># MODEL2_BASE_URL=http://xxxxx/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># MODEL2_API_KEY=123456</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># MODEL2_PROTOCOL=openai-completions</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># MODEL2_CONTEXT_WINDOW=200000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># MODEL2_MAX_TOKENS=8192</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Telegram 配置（可选，留空则不启用）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TELEGRAM_BOT_TOKEN=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 飞书配置（可选，留空则不启用）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FEISHU_APP_ID=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FEISHU_APP_SECRET=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 是否启用飞书官方插件 (true/false)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FEISHU_OFFICIAL_PLUGIN_ENABLED=false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 钉钉配置（可选，留空则不启用）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DINGTALK_CLIENT_ID=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DINGTALK_CLIENT_SECRET=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DINGTALK_ROBOT_CODE=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DINGTALK_CORP_ID=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DINGTALK_AGENT_ID=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># QQ 机器人配置（可选，留空则不启用）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">QQBOT_APP_ID=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">QQBOT_CLIENT_SECRET=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># NapCat (OneBot v11) 配置（可选，留空则不启用）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># NapCat 反向 WS 监听端口（NapCat 主动连接到此端口）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAPCAT_REVERSE_WS_PORT=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># NapCat HTTP API 地址（可选，用于主动发送消息）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAPCAT_HTTP_URL=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 连接鉴权 Token（与 NapCat 侧保持一致）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAPCAT_ACCESS_TOKEN=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 管理员用户 ID，多个用逗号分隔</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAPCAT_ADMINS=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 企业微信配置（可选，留空则不启用）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 方式1：单账号（兼容旧格式），会自动同步为 channels.wecom.default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WECOM_TOKEN=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WECOM_ENCODING_AES_KEY=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 方式2：多账号（Multi-Bot）JSON，支持 bot1/bot2... 独立配置（会与现有配置深度合并）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 注意：.env 中 JSON 需要写成单行</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 示例：{"bot1":{"token":"t1","encodingAesKey":"k1","agent":{"corpId":"wwxxx","corpSecret":"s1","agentId":1000001}},"bot2":{"token":"t2","encodingAesKey":"k2","agent":{"corpId":"wwxxx","corpSecret":"s2","agentId":1000002}}}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WECOM_BOTS_JSON=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 工作空间配置（不要更改）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WORKSPACE=/home/node/.openclaw/workspace</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 挂载目录配置（按实际更改）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># OpenClaw 数据目录（包含配置文件、工作空间等所有数据）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENCLAW_DATA_DIR=~/.openclaw</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 可选：容器启动用户 UID:GID</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 默认 0:0（root）用于 init.sh 自动修复挂载目录权限，再降权为 node 启动服务</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 如需与宿主机用户对齐，可设置为 1000:1000 或 Linux 上的 $(id -u):$(id -g)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENCLAW_RUN_USER=0:0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Gateway 配置</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">## 网关 token，用于认证（按实际更改）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENCLAW_GATEWAY_TOKEN=123456</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENCLAW_GATEWAY_BIND=lan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENCLAW_GATEWAY_PORT=18789</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENCLAW_BRIDGE_PORT=18790</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENCLAW_GATEWAY_MODE=local</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 允许的 Origin 域，多个用逗号隔开</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENCLAW_GATEWAY_ALLOWED_ORIGINS=http://localhost</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 允许不安全认证（如 http），可选 true/false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENCLAW_GATEWAY_ALLOW_INSECURE_AUTH=true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 危险：禁用设备认证（如在 Docker 环境中无法获取设备信息），可选 true/false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENCLAW_GATEWAY_DANGEROUSLY_DISABLE_DEVICE_AUTH=false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 插件全局控制</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENCLAW_PLUGINS_ENABLED=true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 飞书官方插件独立开关（对应 plugins.entries.feishu-openclaw-plugin.enabled）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 与旧版 feishu 渠道互斥：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># true  = 启用 feishu-openclaw-plugin，并自动禁用旧版 feishu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># false = 禁用 feishu-openclaw-plugin，并自动启用旧版 feishu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 留空表示不覆盖现有配置；若检测到官方插件已有状态，也会自动与旧版 feishu 做互斥处理</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FEISHU_OFFICIAL_PLUGIN_ENABLED=</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>首先需要注意的是，如果在<strong>第二步</strong> 中下载的镜像是<code>registry.cn-hangzhou.aliyuncs.com/dongfangzan/openclaw-docker-cn-im:20260309</code></p>
<p>那么你需要把上面<code>.env</code>文件中的 <code>OPENCLAW_IMAGE</code> 的值，替换成 <code>registry.cn-hangzhou.aliyuncs.com/dongfangzan/openclaw-docker-cn-im:20260309</code></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091404891.png" alt="" class="img_ev3q"></p>
<p><strong>接下来我们需要替换掉模型相关的配置</strong></p>
<p>注意下面这一块内容，你需要把<code>MODEL_ID</code>、<code>BASE_URL</code>、<code>API_KEY</code> 和 <code>API_PROTOCOL</code> 替换成你自己的大模型接口的相关信息</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 提供商 1 (默认)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 主模型 ID (支持多个，用逗号隔开，第一个将作为默认模型)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MODEL_ID=model id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 图片模型 ID (可选，留空则使用 MODEL_ID，支持 provider/model 格式)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">IMAGE_MODEL_ID=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">BASE_URL=http://xxxxx/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">API_KEY=123456</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># API 协议类型: openai-completions 或 anthropic-messages</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">API_PROTOCOL=openai-completions</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 模型上下文窗口大小</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONTEXT_WINDOW=200000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 模型最大输出 tokens</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MAX_TOKENS=8192</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>在这个步骤中，我们就需要用到大模型的接口了，如果你还没有的话，可以去购买一个，或者使用本地部署的。</p>
<p>我们需要找到你的<strong>API Key 和 API Base URL</strong></p>
<p>这个在为你提供大模型接口的厂商那里都可以找到，<strong>通常在控制台的API管理或者密钥管理那里</strong></p>
<p>比如你在阿里云购买了一个Coding Plan的大模型接口，那么就可以按如下进行填写</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 提供商 1 (默认)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 主模型 ID (支持多个，用逗号隔开，第一个将作为默认模型)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MODEL_ID=qwen3.5-plus</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 图片模型 ID (可选，留空则使用 MODEL_ID，支持 provider/model 格式)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">IMAGE_MODEL_ID=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">BASE_URL=https://coding.dashscope.aliyuncs.com/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">API_KEY=sk-xxxxxx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># API 协议类型: openai-completions 或 anthropic-messages</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">API_PROTOCOL=openai-completions</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 模型上下文窗口大小</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONTEXT_WINDOW=200000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 模型最大输出 tokens</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MAX_TOKENS=8192</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>然后注意在第78行，现在是<code>OPENCLAW_DATA_DIR=~/.openclaw</code></p>
<p>需要替换为你在第三步一开始创建的目录 <code>OPENCLAW_DATA_DIR=E:\\openclaw-data\\.openclaw</code></p>
<blockquote>
<p>windows 路径需要使用双斜杠 <code>\\</code> 来转义，如果是MacOS 或 Linux 则直接使用单斜杠 <code>/</code> 即可</p>
</blockquote>
<p>替换完成后，保存这个<code>.env</code>文件</p>
<p>可以看到当前目录下目前只有这个<code>.env</code>文件</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091300561.png" alt="" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="创建启动文件">创建启动文件<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E5%88%9B%E5%BB%BA%E5%90%AF%E5%8A%A8%E6%96%87%E4%BB%B6" class="hash-link" aria-label="创建启动文件的直接链接" title="创建启动文件的直接链接">​</a></h4>
<p>接着，再打开一个新的文本文件，命名为 <code>docker-compose.yml</code></p>
<p>把下面的所有内容，复制粘贴到 <code>docker-compose.yml</code> 文件中进行保存</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3.8'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">x-openclaw-common-env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token important">&amp;openclaw-common-env</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">TZ</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Asia/Shanghai</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">HOME</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /home/node</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">TERM</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> xterm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">256color</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 模型配置</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">SYNC_MODEL_CONFIG</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">SYNC_MODEL_CONFIG</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">MODEL_ID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">MODEL_ID</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">IMAGE_MODEL_ID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">IMAGE_MODEL_ID</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">BASE_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">BASE_URL</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">API_KEY</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">API_KEY</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">API_PROTOCOL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">API_PROTOCOL</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">CONTEXT_WINDOW</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">CONTEXT_WINDOW</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">MAX_TOKENS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">MAX_TOKENS</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 提供商 2 (可选)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">MODEL2_NAME</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">MODEL2_NAME</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">MODEL2_MODEL_ID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">MODEL2_MODEL_ID</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">MODEL2_BASE_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">MODEL2_BASE_URL</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">MODEL2_API_KEY</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">MODEL2_API_KEY</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">MODEL2_PROTOCOL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">MODEL2_PROTOCOL</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">MODEL2_CONTEXT_WINDOW</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">MODEL2_CONTEXT_WINDOW</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">MODEL2_MAX_TOKENS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">MODEL2_MAX_TOKENS</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 通道配置</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">TELEGRAM_BOT_TOKEN</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">TELEGRAM_BOT_TOKEN</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">FEISHU_APP_ID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">FEISHU_APP_ID</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">FEISHU_APP_SECRET</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">FEISHU_APP_SECRET</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">DINGTALK_CLIENT_ID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DINGTALK_CLIENT_ID</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">DINGTALK_CLIENT_SECRET</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DINGTALK_CLIENT_SECRET</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">DINGTALK_ROBOT_CODE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DINGTALK_ROBOT_CODE</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">DINGTALK_CORP_ID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DINGTALK_CORP_ID</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">DINGTALK_AGENT_ID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DINGTALK_AGENT_ID</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">QQBOT_APP_ID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">QQBOT_APP_ID</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">QQBOT_CLIENT_SECRET</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">QQBOT_CLIENT_SECRET</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">NAPCAT_REVERSE_WS_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">NAPCAT_REVERSE_WS_PORT</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">NAPCAT_HTTP_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">NAPCAT_HTTP_URL</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">NAPCAT_ACCESS_TOKEN</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">NAPCAT_ACCESS_TOKEN</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">NAPCAT_ADMINS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">NAPCAT_ADMINS</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 企业微信配置</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">WECOM_TOKEN</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">WECOM_TOKEN</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">WECOM_ENCODING_AES_KEY</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">WECOM_ENCODING_AES_KEY</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 企业微信多账号配置（JSON 字符串，示例见 .env.example）</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">WECOM_BOTS_JSON</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">WECOM_BOTS_JSON</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 工作空间配置</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">WORKSPACE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">WORKSPACE</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Gateway 配置</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">OPENCLAW_GATEWAY_TOKEN</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_GATEWAY_TOKEN</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">OPENCLAW_GATEWAY_BIND</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_GATEWAY_BIND</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">OPENCLAW_GATEWAY_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_GATEWAY_PORT</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">OPENCLAW_BRIDGE_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_BRIDGE_PORT</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">OPENCLAW_GATEWAY_MODE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_GATEWAY_MODE</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">OPENCLAW_GATEWAY_ALLOWED_ORIGINS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_GATEWAY_ALLOWED_ORIGINS</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">OPENCLAW_GATEWAY_ALLOW_INSECURE_AUTH</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_GATEWAY_ALLOW_INSECURE_AUTH</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">OPENCLAW_GATEWAY_DANGEROUSLY_DISABLE_DEVICE_AUTH</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_GATEWAY_DANGEROUSLY_DISABLE_DEVICE_AUTH</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">OPENCLAW_GATEWAY_AUTH_MODE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_GATEWAY_AUTH_MODE</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 插件控制</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">OPENCLAW_PLUGINS_ENABLED</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_PLUGINS_ENABLED</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">FEISHU_OFFICIAL_PLUGIN_ENABLED</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">FEISHU_OFFICIAL_PLUGIN_ENABLED</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">openclaw-gateway</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openclaw</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_IMAGE</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cap_add</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> CHOWN</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> SETUID</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> SETGID</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> DAC_OVERRIDE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 可选：指定容器运行 UID:GID（例如 1000:1000）</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 默认保持 root 启动，以便 init.sh 自动修复挂载卷权限后再降权运行网关</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_RUN_USER</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">0</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token important">*openclaw-common-env</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_DATA_DIR</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/home/node/.openclaw</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 使用命名卷共享 extensions，确保工具容器安装后的插件主容器可见</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> openclaw</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">extensions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/home/node/.openclaw/extensions</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${OPENCLAW_GATEWAY_PORT}:18789"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${OPENCLAW_BRIDGE_PORT}:18790"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">init</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">openclaw-installer</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> openclaw</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">installer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_IMAGE</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">profiles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> tools</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_RUN_USER</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">0</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token important">*openclaw-common-env</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">OPENCLAW_DATA_DIR</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/home/node/.openclaw</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> openclaw</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">extensions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/home/node/.openclaw/extensions</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">entrypoint</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"tail"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-f"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/dev/null"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">init</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'no'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">stdin_open</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tty</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cap_add</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> CHOWN</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> SETUID</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> SETGID</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> DAC_OVERRIDE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  openclaw</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">extensions</span><span class="token punctuation" style="color:#393A34">:</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>这时，该目录下，就有两个文件了
<img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091304383.png" alt="" class="img_ev3q"></p>
<p>接下来，我们需要在这个目录下打开一个命令行工具</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091301161.png" alt="" class="img_ev3q"></p>
<p>执行下面的命令</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker-compose up -d</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091305041.png" alt="" class="img_ev3q"></p>
<p>看到最下方有一个绿色的<code>Created</code>，就表示龙虾已经成功启动了</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091306497.png" alt="" class="img_ev3q"></p>
<p>然后我们输入下面的命令</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker logs openclaw-gateway</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091307818.png" alt="" class="img_ev3q"></p>
<p>当看到有<code>listening on ws://0.0.0.0:18789</code>的日志输出时，就表示龙虾已经成功启动了</p>
<p>接下来我们输入下面的命令，来进入到龙虾的安装容器中</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker exec -it openclaw-gateway bash</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091309352.png" alt="" class="img_ev3q"></p>
<p>随后输入下面的命令，就进入了与我们的龙虾进行交互时对话的窗口了</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">openclaw tui</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091310382.png" alt="" class="img_ev3q"></p>
<p>如果我们配置的大模型接口没有问题，且网络通畅，那么我们此时与龙虾对话窗口就会有模型的回复了</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091311598.png" alt="" class="img_ev3q"></p>
<p><strong>至此，我们的龙虾就已经跑起来了</strong></p>
<p>但截止到目前为止，我们还是在命令行窗口中与龙虾进行对话的，这样的体验还是比较糟糕的</p>
<p>我们希望可以在聊天工具中直接跟龙虾进行对话，来享受更好的使用体验</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="第四步对接飞书">第四步，对接飞书<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E7%AC%AC%E5%9B%9B%E6%AD%A5%E5%AF%B9%E6%8E%A5%E9%A3%9E%E4%B9%A6" class="hash-link" aria-label="第四步，对接飞书的直接链接" title="第四步，对接飞书的直接链接">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="首先说明一点为什么选择飞书">首先说明一点，为什么选择飞书？<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E9%A6%96%E5%85%88%E8%AF%B4%E6%98%8E%E4%B8%80%E7%82%B9%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9%E9%A3%9E%E4%B9%A6" class="hash-link" aria-label="首先说明一点，为什么选择飞书？的直接链接" title="首先说明一点，为什么选择飞书？的直接链接">​</a></h4>
<p>截止到发文时，其他国内的聊天软件，都需要用户有一个外网IP或者外网域名</p>
<p><strong>再或者需要用户进行复杂的内网穿透，既麻烦又不安全，在外网上暴露龙虾，可能会导致你的数据泄露或者被攻击。</strong></p>
<p>所以目前国内使用体验最好的，可能就是飞书了，因为他不需要你有外网IP或者外网域名，也不需要你进行内网穿透</p>
<p>直接在飞书添加一个机器人，就可以直接跟你的龙虾进行对话了</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="注册飞书">注册飞书<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E6%B3%A8%E5%86%8C%E9%A3%9E%E4%B9%A6" class="hash-link" aria-label="注册飞书的直接链接" title="注册飞书的直接链接">​</a></h4>
<p>首先，你需要去飞书的官网<a href="https://www.feishu.cn/" target="_blank" rel="noopener noreferrer">https://www.feishu.cn/</a></p>
<p>注册一个账号并下载安装，注册飞书的方法非常简单，直接使用手机号或者邮箱注册就可以了，按照提示操作即可</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="创建飞书机器人">创建飞书机器人<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E5%88%9B%E5%BB%BA%E9%A3%9E%E4%B9%A6%E6%9C%BA%E5%99%A8%E4%BA%BA" class="hash-link" aria-label="创建飞书机器人的直接链接" title="创建飞书机器人的直接链接">​</a></h4>
<p>访问地址，进入飞书开放平台，<a href="https://open.feishu.cn/" target="_blank" rel="noopener noreferrer">https://open.feishu.cn/</a></p>
<p>点击右上角开发者后台</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091320522.png" alt="" class="img_ev3q"></p>
<p>点击创建企业自建应用</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091320090.png" alt="" class="img_ev3q"></p>
<p>根据你的喜好，来给你的龙虾命名</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091321765.png" alt="" class="img_ev3q"></p>
<p>创建完成后，点击左侧<code>凭证与基础信息</code>，来获取你的<code>App ID</code>和<code>App Secret</code></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091322687.png" alt="" class="img_ev3q"></p>
<p>记住这个App ID和App Secret，然后我们回到刚才的控制台黑框中</p>
<p>通过命令来进入到龙虾的安装容器中</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker exec -it openclaw-gateway bash</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>如果你刚刚没有退出龙虾的对话窗口，那么直接按键盘上的Ctrl+D来回到容器中</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091326980.png" alt="" class="img_ev3q"></p>
<p>这时，输入下面的命令</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">feishu-plugin-onboard install</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>然后按照下面的命令输入 y-&gt;回车
<img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091343200.png" alt="" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091344842.png" alt="" class="img_ev3q"></p>
<p>接下来，回到你的<code>.env</code>文件中，把你刚才获取的<code>App ID</code>和<code>App Secret</code>，分别替换掉 <code>FEISHU_APP_ID</code> 和 <code>FEISHU_APP_SECRET</code> 的值</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091348645.png" alt="" class="img_ev3q"></p>
<p>并将<code>.env</code>文件最最后一行的飞书官方插件开关 <code>FEISHU_OFFICIAL_PLUGIN_ENABLED</code> 的值，替换为 <code>true</code></p>
<p>保存文件后，回到命令行窗口，输入下面的命令，来重启龙虾</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 关闭龙虾</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker-compose down</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 启动龙虾</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker-compose up -d</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 查看日志</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker-compose logs openclaw-gateway</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>最终看到下面的文字，表明龙虾与飞书对接成功了</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091350335.png" alt="" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="配置飞书权限">配置飞书权限<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E9%85%8D%E7%BD%AE%E9%A3%9E%E4%B9%A6%E6%9D%83%E9%99%90" class="hash-link" aria-label="配置飞书权限的直接链接" title="配置飞书权限的直接链接">​</a></h4>
<p>接下来，我们需要回到飞书的开发者后台，来给我们的机器人添加权限</p>
<p>选择<strong>权限管理</strong>，点击<strong>批量导入/导出权限</strong></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091335112.png" alt="" class="img_ev3q"></p>
<p>这里我整理好了一个常用的权限列表，你可以直接复制下面的内容，粘贴到飞书的权限批量导入框中，来快速添加权限</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"scopes"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"tenant"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"bitable:app"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"bitable:app:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar.acl:create"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar.acl:delete"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar.acl:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar.event:create"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar.event:delete"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar.event:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar.event:reply"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar.event:update"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar.free_busy:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar:create"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar:delete"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar:subscribe"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:calendar:update"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:exchange.bindings:create"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:exchange.bindings:delete"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:exchange.bindings:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:settings.caldav:create"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:settings.workhour:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:time_off:create"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:time_off:delete"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"calendar:timeoff"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"cardkit:card:write"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"contact:contact.base:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"contact:user.base:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"docx:document"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"docx:document.block:convert"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"docx:document:create"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"docx:document:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"docx:document:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:drive"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:drive.metadata:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:drive.search:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:drive:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:drive:version"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:drive:version:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:export:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:file"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:file.like:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:file.meta.sec_label.read_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:file:download"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:file:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:file:upload"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"drive:file:view_record:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:app_feed_card:write"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:biz_entity_tag_relation:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:biz_entity_tag_relation:write"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.access_event.bot_p2p_chat:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.announcement:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.announcement:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.chat_pins:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.chat_pins:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.collab_plugins:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.collab_plugins:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.managers:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.members:bot_access"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.members:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.members:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.menu_tree:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.menu_tree:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.moderation:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.tabs:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.tabs:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.top_notice:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.widgets:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat.widgets:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat:create"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat:delete"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat:moderation:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat:operate_as_owner"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:chat:update"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:datasync.feed_card.time_sensitive:write"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message.group_at_msg:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message.group_msg"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message.p2p_msg:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message.pins:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message.pins:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message.reactions:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message.reactions:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message.urgent"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message.urgent.status:write"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message.urgent:phone"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message.urgent:sms"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message:readonly"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message:recall"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message:send_as_bot"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message:send_multi_depts"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message:send_multi_users"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message:send_sys_msg"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:message:update"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:resource"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:tag:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:tag:write"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:url_preview.update"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"im:user_agent:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:member:create"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:member:retrieve"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:member:update"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:node:copy"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:node:create"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:node:move"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:node:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:node:retrieve"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:node:update"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:setting:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:setting:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:space:read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:space:retrieve"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:space:write_only"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:wiki"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"wiki:wiki:readonly"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"user"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"contact:contact.base:readonly"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="配置飞书接收消息">配置飞书接收消息<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E9%85%8D%E7%BD%AE%E9%A3%9E%E4%B9%A6%E6%8E%A5%E6%94%B6%E6%B6%88%E6%81%AF" class="hash-link" aria-label="配置飞书接收消息的直接链接" title="配置飞书接收消息的直接链接">​</a></h4>
<p>接下来，点击左侧<strong>事件与回调</strong>-&gt;<strong>订阅方式</strong></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091339400.png" alt="" class="img_ev3q"></p>
<p>选择<strong>使用长连接接收事件</strong>，点击保存，如果你保存成功了，说明上述的配置就都生效了</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091352728.png" alt="" class="img_ev3q"></p>
<p>如果你看到下面的界面，表明前面龙虾与飞书的连接没有配置成功，回到前面的步骤，检查一下是否正确配置了<code>App ID</code>和<code>App Secret</code>，以及是否重启了龙虾</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091350971.png" alt="" class="img_ev3q"></p>
<p>接下来，右侧的<strong>添加事件</strong>按钮</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091353352.png" alt="" class="img_ev3q"></p>
<p>添加<strong>接收消息</strong>事件</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091354921.png" alt="" class="img_ev3q"></p>
<p>在这里面，我们就配置了当飞书接收到消息的时候，发送一个事件到我们的龙虾，来触发龙虾的回复</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091354358.png" alt="" class="img_ev3q"></p>
<p>到此，我们就完成了飞书时间的配置</p>
<p>接下来，点击上方的<strong>创建版本</strong>，来发布这个机器人</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091355369.png" alt="" class="img_ev3q"></p>
<p>填写版本号和版本描述，点击保存-&gt;确认发布即可</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091356184.png" alt="" class="img_ev3q"></p>
<p>到这里我们就完成了所有飞书的配置工作</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="第五步在飞书与小龙虾对话">第五步，在飞书与小龙虾对话<a href="https://dongfangzan.cn/2026/03/09/2026/openclaw-in-action#%E7%AC%AC%E4%BA%94%E6%AD%A5%E5%9C%A8%E9%A3%9E%E4%B9%A6%E4%B8%8E%E5%B0%8F%E9%BE%99%E8%99%BE%E5%AF%B9%E8%AF%9D" class="hash-link" aria-label="第五步，在飞书与小龙虾对话的直接链接" title="第五步，在飞书与小龙虾对话的直接链接">​</a></h3>
<p>经过上述发布后，飞书工作台里面，就可以看到这个机器人了</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091358733.png" alt="" class="img_ev3q"></p>
<p>点击这个机器人，进入对话界面，发送一条消息试试</p>
<p>你就可以看到，龙虾已经成功回复了你的消息了，我们的小龙虾就正式上线啦！</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202603091359658.png" alt="" class="img_ev3q"></p>
<p>完结撒花，快来试试你的龙虾吧！如果你在安装的过程中遇到了任何问题，欢迎在评论区留言，我会第一时间回复大家的！</p>]]></content:encoded>
            <category>Claude Code</category>
        </item>
        <item>
            <title><![CDATA[本地部署大模型接入 Claude Code 全攻略：轻松实现不限量 Vibe Coding]]></title>
            <link>https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic</link>
            <guid>https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic</guid>
            <pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[2026 年，AI 编程已经成为主流趋势，而 Anthropic 的 Claude Code 凭借其强大的代码理解和生成能力，迅速赢得了开发者的青睐。🎉]]></description>
            <content:encoded><![CDATA[<p>2026 年，AI 编程已经成为主流趋势，而 <strong>Anthropic</strong> 的 <strong>Claude Code</strong> 凭借其强大的代码理解和生成能力，迅速赢得了开发者的青睐。🎉</p>
<p>Anthropic 系列模型主要以云端服务形式提供，受限于网络和昂贵的价格，很多开发者希望能在本地部署类似能力的大模型</p>
<p>国内最近开源的 <code>Kimi-K2.5</code> / <code>GLM-4.7</code> / <code>MiniMax-M2.1</code> 等模型，具备强大的编程能力，可以说在一定程度上替代 Anthropic 系列模型</p>
<p>可以在享受不限速的本地推理体验的同时<strong>摆脱网络和费用的束缚，并保证数据的隐私安全</strong></p>
<p>但是目前本地部署的开源方案中，大多数模型部署后都<strong>只支持 OpenAI 兼容格式</strong>的接口</p>
<p>无法直接兼容 Anthropic 的调用格式，这就给想要无缝切换到本地模型的开发者带来了不便</p>
<p>本篇文章，我们将分享如何利用本地部署大模型，助你轻松实现不限量的 Vibe Coding 体验！</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="接口之争">接口之争<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#%E6%8E%A5%E5%8F%A3%E4%B9%8B%E4%BA%89" class="hash-link" aria-label="接口之争的直接链接" title="接口之争的直接链接">​</a></h2>
<p>在介绍如何接入之前，我们可以先了解一下目前主流的 AI 接口格式，具体都有哪些区别</p>
<blockquote>
<p>对这部分内容已经了解的朋友可以直接跳过到后面如何使用转换器的章节。</p>
</blockquote>
<p><strong>目前主流的 AI 接口主要有三种</strong></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-openai-chatcompletions-接口">1. OpenAI /chat/completions 接口<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#1-openai-chatcompletions-%E6%8E%A5%E5%8F%A3" class="hash-link" aria-label="1. OpenAI /chat/completions 接口的直接链接" title="1. OpenAI /chat/completions 接口的直接链接">​</a></h3>
<p>这个接口相信大家都比较熟悉，在 2022 年末，ChatGPT 发布时，OpenAI 推出了这个接口，迅速成为行业标准</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031443141.png" alt="" width="600" border="1">
<p>几乎所有的模型厂商都兼容这个接口，这也是我们最常用的接口。</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031444948.png" alt="OpenAI Chat Completions" width="600" border="1">
<p>这个接口顾名思义，本质是为了<strong>对话文本生成</strong>快速做出来的接口，且非常简单易用</p>
<p>它的核心假设是：</p>
<ul>
<li>一次请求 = 一次文本回复</li>
<li>你自己管理上下文</li>
<li>工具调用是后来硬塞进去的（function calling）</li>
</ul>
<p>这在 2023 年是非常合理的设计，因为当时大多数模型都<strong>只是对话工具</strong></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-openai-responses-接口">2. OpenAI /responses 接口<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#2-openai-responses-%E6%8E%A5%E5%8F%A3" class="hash-link" aria-label="2. OpenAI /responses 接口的直接链接" title="2. OpenAI /responses 接口的直接链接">​</a></h3>
<p>到了 2025 年，随着大模型能力的发展，<strong>Agent 智能体、多模态、工具调用已经越来越重要</strong></p>
<p>原来的<code>/chat/completions</code>历史包袱太重，已经无法很好地支持这些新兴的复杂交互场景</p>
<p>OpenAI 在 2025 年 3 月份发布了一个新的接口 <code>/responses</code>，这个接口本质上是为了更好地<strong>支持复杂交互设计的</strong></p>
<p>在这个全新的接口中，增加了<strong>原生的 Agent 能力</strong>:</p>
<ol>
<li>内置 tool use：file_search、code_interpreter、image_generation、web_search、MCP 等</li>
<li>一次 responses 调用里可以发生多次<code>模型-工具-模型</code>循环</li>
</ol>
<p>增加了 <strong>原生的状态(stateful)</strong> 支持，保持会话状态，让每次推理不再失忆</p>
<p>与此同时，<strong>多模态</strong>也不再是给 chat 接口加个字段，而是：</p>
<ol>
<li>text / image / audio / file 都是一等公民</li>
<li>输出也是多 item（text + tool_call + structured output）</li>
</ol>
<p>这对真正做产品级应用很重要，OpenAI 也在积极的推动这个接口的生态建设</p>
<p>比如现在的 OpenAI 推出的编程工具 <strong>Codex</strong> 就是基于这个接口设计的</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031452429.png" alt="OpenAI Responses" width="600" border="1">
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-anthropic-messages-接口">3. Anthropic /messages 接口<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#3-anthropic-messages-%E6%8E%A5%E5%8F%A3" class="hash-link" aria-label="3. Anthropic /messages 接口的直接链接" title="3. Anthropic /messages 接口的直接链接">​</a></h3>
<p>Anthropic 的 <code>/messages</code> 接口，在原理上其实与 OpenAI 的 <code>/chat/completions</code> 接口更为接近</p>
<p>他们在<strong>文本对话</strong>的基础上，增加了多模态、工具调用的能力，并没有额外基于 Agent 去设计一套全新的接口</p>
<p>但有趣的是，Anthropic 是一家工程能力非常强的公司，他们在过去一年中，专注于 Agent 的落地</p>
<p>在 AI 编程这个领域，打造了一个非常强大的编程 Agent 工具 <strong>Claude Code</strong></p>
<p>使得基于这一套 <code>/messages</code> 接口，利用<strong>工具调用、MCP、Agent Skills</strong> 等能力，能够实现非常高效的交互能力</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031501568.png" alt="OpenAI Responses" width="600" border="1">
<p>随着 Claude Code 越来越流行，越来越多的开发者希望能够直接调用兼容 Anthropic 的 <code>/messages</code> 接口，来利用 Claude Code 的强大能力</p>
<p>很多国内厂家也开始支持 Anthropic 的接口规范</p>
<p>虽然 OpenAI 的 <code>/responses</code> 接口在设计上看起来更超前，更优秀</p>
<p>但 Anthropic 的 <code>/messages</code> 接口，凭借其强大的生态和落地能力，似乎已经成了 Agent 开发的事实标准</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="本地部署大模型接入-claude-code-全攻略">本地部署大模型接入 Claude Code 全攻略<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8E%A5%E5%85%A5-claude-code-%E5%85%A8%E6%94%BB%E7%95%A5" class="hash-link" aria-label="本地部署大模型接入 Claude Code 全攻略的直接链接" title="本地部署大模型接入 Claude Code 全攻略的直接链接">​</a></h2>
<p>现在，回到我们的主题，如何将本地部署的大模型，接入到 Claude Code 体系中？</p>
<p>当前我们本地部署大模型，通常会采用以下三种推理引擎来运行大模型</p>
<ol>
<li><strong>Ollama</strong></li>
<li><strong>vLLM</strong></li>
<li><strong>SGLang</strong></li>
</ol>
<p>绝大多数非自研模型的 AI 接口提供商，大体上也是基于以上的推理引擎进行修改而来的</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-ollama">1. Ollama<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#1-ollama" class="hash-link" aria-label="1. Ollama的直接链接" title="1. Ollama的直接链接">​</a></h3>
<p><code>Ollama</code> 作为目前桌面端使用最多的推理引擎，一开始就已经支持了 OpenAI 的 <code>/chat/completions</code> 接口</p>
<p>2026 年初，Ollama 也发布了对 Anthropic <code>/messages</code> 接口的支持</p>
<p>所以，如果你使用 Ollama 来部署模型，那么直接调用本地的 Ollama 服务即可</p>
<blockquote>
<p>你需要升级到 Ollama 最新版本，才能支持 Anthropic 接口，至少&gt;=<code>v0.15.0</code></p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-vllm">2. vLLM<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#2-vllm" class="hash-link" aria-label="2. vLLM的直接链接" title="2. vLLM的直接链接">​</a></h3>
<p><code>vLLM</code> 作为目前最流行的云端推理引擎，支持了最多类型的 API</p>
<p>上述我们提到的三种主流接口，<code>vLLM</code> 都已经支持</p>
<p>如果你使用 <code>vLLM</code> 来部署模型，在启动模型成功时，看到 <code>vLLM</code> 支持的 API</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031527715.png" alt="local-openai2anthropic" width="600" border="1">
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-sglang">3. SGLang<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#3-sglang" class="hash-link" aria-label="3. SGLang的直接链接" title="3. SGLang的直接链接">​</a></h3>
<p><code>SGLang</code> 作为目前另外一款跟 <code>vLLM</code> 齐名的推理引擎，目前只支持 OpenAI 的 <code>/chat/completions</code> 接口</p>
<p>在当前的版本中，还没有对 Anthropic 的 <code>/messages</code> 接口提供支持</p>
<p>但在今年的 Roadmap 中，SGLang 团队已经明确表示会支持 Anthropic 接口</p>
<p>只是具体的发布时间还未确定，所以如果你使用 SGLang 来部署模型，目前还无法直接支持 Anthropic 接口调用</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="简单总结">简单总结<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#%E7%AE%80%E5%8D%95%E6%80%BB%E7%BB%93" class="hash-link" aria-label="简单总结的直接链接" title="简单总结的直接链接">​</a></h3>
<p>我们总结一下，如果你使用 <code>Ollama</code> 或 <code>vLLM</code> 来部署模型</p>
<p>那么恭喜你，你可以直接调用本地的 Anthropic 接口来实现接入 Claude Code</p>
<p>如果你使用<code>SGLang</code>来部署模型，那就比较惨了，目前就只有干瞪眼了</p>
<p>那么有的同学可能会问了</p>
<p>我不知道我们公司是用啥部署的，只有一个<code>/chat/completions</code>接口</p>
<p>或者你像我一样，希望可以享受 <code>SGLang</code> 的高性能，那该怎么办呢？</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="claude-code-router">Claude Code Router<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#claude-code-router" class="hash-link" aria-label="Claude Code Router的直接链接" title="Claude Code Router的直接链接">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031537957.png" alt="" class="img_ev3q"></p>
<p>github 地址：
<a href="https://github.com/musistudio/claude-code-router" target="_blank" rel="noopener noreferrer">https://github.com/musistudio/claude-code-router</a></p>
<p>顾名思义，这是一款可以将各种类型的 AI 接口，转换成 Anthropic <code>/messages</code> 接口的转换器</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031537106.png" alt="" class="img_ev3q"></p>
<p>同时可以对你所有的模型进行路由</p>
<p>目前 github 上已经积累了 25k+ stars，受到了社区的广泛关注</p>
<p>你可以进入他的 github 仓库，查看详细的使用说明，只需要几步配置就可以完成部署</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="local-openai2anthropic">local-openai2anthropic<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#local-openai2anthropic" class="hash-link" aria-label="local-openai2anthropic的直接链接" title="local-openai2anthropic的直接链接">​</a></h2>
<p><code>Claude Code Router</code> 是一款非常好用的软件，在很多场景下面都能派上用场</p>
<p>但是在当前的开源的推理引擎中，即使是兼容OpenAI接口的 <code>Ollama</code> 、 <code>vLLM</code> 和 <code>SGLang</code> 也并不完美</p>
<p><strong>每家实现的兼容OpenAI接口的方式各不相同，这就导致了即使是对 AI 非常熟悉的工程师，也无法完美适配每一家不同的接口</strong></p>
<p>所以针对我们本地部署大模型接入 Claude Code 的场景，我自己写了一个非常轻量级的转换器 <code>local-openai2anthropic</code></p>
<p><a href="https://github.com/dongfangzan/local-openai2anthropic" target="_blank" rel="noopener noreferrer">https://github.com/dongfangzan/local-openai2anthropic</a></p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031546713.png" alt="local-openai2anthropic" width="600" border="1">
<p>这个转换器的设计目标非常简单，<strong>只考虑本地部署大模型接入 Claude Code 等编程工具的场景</strong></p>
<p>主要功能：</p>
<ul>
<li>本地部署的 <strong>OpenAI 兼容接口（如 SGLang / Ollama / vLLM） 转换成 Anthropic 兼容接口</strong></li>
<li>完美适配了不同开源模型的<strong>思考、非思考模式的切换</strong></li>
<li>通过<strong>外接搜索工具</strong>，解决本地模型无法进行 <code>WebSearch</code> 的问题</li>
<li>支持图像输入(<code>Kimi-K2.5</code>/<code>Qwen3-VL</code>/<code>GLM-4.6V</code>)，实现多模态能力</li>
<li>完美支持 token 用量估算，<strong>避免上下文超限导致的窗口溢出</strong></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="使用方法">使用方法<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95" class="hash-link" aria-label="使用方法的直接链接" title="使用方法的直接链接">​</a></h3>
<p>你可以直接通过 <code>pip</code> 安装这个包</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip install local-openai2anthropic</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>然后通过命令行启动这个转换器</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">oa2a start</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>启动后，通过引导输入你的本地 OpenAI 兼容接口地址和 API Key 即可</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031555162.png" alt="local-openai2anthropic" width="600" border="1">
<p>随后，只需要将你Claude Code 的 <code>ANTHROPIC_BASE_URL</code> 地址，指向这个转换器的地址即可</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">vi ~/.claude_code/settings.json</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031608457.png" alt="local-openai2anthropic" width="300" border="1">
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="联网搜索支持">联网搜索支持<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#%E8%81%94%E7%BD%91%E6%90%9C%E7%B4%A2%E6%94%AF%E6%8C%81" class="hash-link" aria-label="联网搜索支持的直接链接" title="联网搜索支持的直接链接">​</a></h3>
<p>如果你需要通过搜索引擎来支持 <code>WebSearch</code> 功能</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031727534.png" alt="local-openai2anthropic" width="600" border="1">
<p>可以通过配置 <code>tavily_api_key</code> 来实现</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">vi ~/.oa2a/config.toml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031557091.png" alt="local-openai2anthropic" width="600" border="1">
<p>免费版的 Tavily Search，每个月有 1000 次调用额度，基本上可以满足日常使用需求</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202602031625170.png" alt="" class="img_ev3q"></p>
<p>你可以到他的官网去<strong>免费注册一个账号</strong>，来获取 API Key</p>
<p>官网地址：<a href="https://tavily.com/" target="_blank" rel="noopener noreferrer">https://tavily.com</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="结束">结束<a href="https://dongfangzan.cn/2026/02/03/2026/local-openai2anthropic#%E7%BB%93%E6%9D%9F" class="hash-link" aria-label="结束的直接链接" title="结束的直接链接">​</a></h2>
<p>感谢你看到这里，随着 AI 编程时代的全面到来，<strong>本地化部署已经成为追求极致性能与数据隐私开发者的必经之路</strong></p>
<p>目前<strong>国产开源模型（如 Kimi-K2.5、GLM-4.7、MiniMax-M2.1）在能力上已经非常能打</strong>，无论你用哪种方式来实现 Vibe Coding，我们的目标都是一致的：</p>
<p>打破格式壁垒，释放本地算力的无限潜力。 🚀</p>
<p>希望这篇教程能帮助你搭建起专属的本地 AI 编程环境，<strong>享受不限速、不泄密、不掉线的 Vibe Coding 体验！</strong></p>
<p>如果你在部署过程中遇到任何坑，或者有更好的玩法的，欢迎在评论区交流，或者直接去 GitHub 提 Issue！👋</p>]]></content:encoded>
            <category>Claude Code</category>
        </item>
        <item>
            <title><![CDATA[重磅开源！Kimi K2.5 本地部署全攻略：手把手教你跑通 1T MoE 巨兽]]></title>
            <link>https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment</link>
            <guid>https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment</guid>
            <pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[最近，Kimi K2.5 模型正式开源，再一次刷新了开源大模型的能力天花板！🎉]]></description>
            <content:encoded><![CDATA[<p>最近，<strong>Kimi K2.5</strong> 模型正式开源，再一次刷新了开源大模型的能力天花板！🎉</p>
<p>特别是在 <strong>Agent 智能体、编程开发 和 视觉理解</strong> 领域，其表现堪称惊艳。</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601301345380.png" alt="" class="img_ev3q"></p>
<p>本篇文章，我们就最近这几天在本地部署 Kimi K2.5 模型的<strong>踩坑实践</strong>做一个全方位分享，助你一次跑通！💪</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="-一-模型下载">📦 一、 模型下载<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E4%B8%80-%E6%A8%A1%E5%9E%8B%E4%B8%8B%E8%BD%BD" class="hash-link" aria-label="📦 一、 模型下载的直接链接" title="📦 一、 模型下载的直接链接">​</a></h3>
<p>你可以在 <strong>魔搭社区</strong> 或者 <strong>Hugging Face</strong> 找到这个模型。</p>
<p>👉 <strong>国内推荐：魔搭社区</strong>，下载速度会更快一些
🔗 链接：<a href="https://modelscope.cn/models/moonshotai/Kimi-K2.5" target="_blank" rel="noopener noreferrer">https://modelscope.cn/models/moonshotai/Kimi-K2.5</a></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601301348655.png" alt="" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="-模型参数概览">📊 模型参数概览<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E6%A8%A1%E5%9E%8B%E5%8F%82%E6%95%B0%E6%A6%82%E8%A7%88" class="hash-link" aria-label="📊 模型参数概览的直接链接" title="📊 模型参数概览的直接链接">​</a></h4>
<p>在模型卡片中我们可以看到：</p>
<ul>
<li><strong>总参数量</strong>：1T (MoE 架构)</li>
<li><strong>激活参数</strong>：32B</li>
<li><strong>量化版本</strong>：原生 INT4</li>
<li><strong>实际大小</strong>：约 <strong>595.21GB</strong> (虽然听起来恐怖，但因为是 INT4，实际体量在可控范围内)</li>
</ul>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="️-二-硬件环境准备">⚙️ 二、 硬件环境准备<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#%EF%B8%8F-%E4%BA%8C-%E7%A1%AC%E4%BB%B6%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87" class="hash-link" aria-label="⚙️ 二、 硬件环境准备的直接链接" title="⚙️ 二、 硬件环境准备的直接链接">​</a></h3>
<p>从模型大小就能看出，这位“巨兽”对硬件的要求不低。😨</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="-最低配置门槛">💻 最低配置门槛<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E6%9C%80%E4%BD%8E%E9%85%8D%E7%BD%AE%E9%97%A8%E6%A7%9B" class="hash-link" aria-label="💻 最低配置门槛的直接链接" title="💻 最低配置门槛的直接链接">​</a></h4>
<p><code>8 * 96GB H20</code> 是能摸到这个模型的底线，且需要<strong>裁剪上下文长度</strong>。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="-推荐配置方案">✨ 推荐配置方案<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E6%8E%A8%E8%8D%90%E9%85%8D%E7%BD%AE%E6%96%B9%E6%A1%88" class="hash-link" aria-label="✨ 推荐配置方案的直接链接" title="✨ 推荐配置方案的直接链接">​</a></h4>
<p>为了拥有丝滑的使用体验，我们推荐以下几种配置：</p>
<table><thead><tr><th style="text-align:left">方案</th><th style="text-align:left">硬件配置</th><th style="text-align:left">推荐指数</th><th style="text-align:left">备注</th></tr></thead><tbody><tr><td style="text-align:left"><strong>方案一</strong></td><td style="text-align:left"><code>8 * 141GB H200</code> (单机)</td><td style="text-align:left">⭐⭐⭐⭐⭐</td><td style="text-align:left"><strong>最推荐</strong>，省心高效</td></tr><tr><td style="text-align:left"><strong>方案二</strong></td><td style="text-align:left"><code>2 * 8 * 96GB H20</code> (双机)</td><td style="text-align:left">⭐⭐⭐⭐</td><td style="text-align:left">需配置多机通信</td></tr><tr><td style="text-align:left"><strong>方案三</strong></td><td style="text-align:left"><code>2 * 8 * 80GB H100</code> (双机)</td><td style="text-align:left">⭐⭐⭐⭐</td><td style="text-align:left">算力强，显存刚好</td></tr></tbody></table>
<blockquote>
<p>💡 <strong>小贴士</strong>：比如 H100 这种算力够但显存吃紧的卡，完全可以通过<strong>多机部署</strong>来解决。</p>
</blockquote>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="️-三-部署步骤">🛠️ 三、 部署步骤<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#%EF%B8%8F-%E4%B8%89-%E9%83%A8%E7%BD%B2%E6%AD%A5%E9%AA%A4" class="hash-link" aria-label="🛠️ 三、 部署步骤的直接链接" title="🛠️ 三、 部署步骤的直接链接">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="0️⃣-前置准备">0️⃣ 前置准备<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#0%EF%B8%8F%E2%83%A3-%E5%89%8D%E7%BD%AE%E5%87%86%E5%A4%87" class="hash-link" aria-label="0️⃣ 前置准备的直接链接" title="0️⃣ 前置准备的直接链接">​</a></h4>
<p>首先在你的服务器上安装好 <strong>Nvidia 驱动</strong> 和 <strong>CUDA 环境</strong>（此处省略一万字...）。</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="-下载模型到本地">📥 下载模型到本地<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E4%B8%8B%E8%BD%BD%E6%A8%A1%E5%9E%8B%E5%88%B0%E6%9C%AC%E5%9C%B0" class="hash-link" aria-label="📥 下载模型到本地的直接链接" title="📥 下载模型到本地的直接链接">​</a></h5>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 1. 安装 modelscope</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pip install modelscope</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 2. 下载模型到指定目录</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">modelscope download moonshotai/Kimi-K2.5 --local-dir ./dir</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>⏳ 经过漫长的等待... 下载完成后，整个 Kimi K2.5 模型大约 <strong>555GB</strong>。
<img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601301357478.png" alt="" class="img_ev3q"></p>
<p>📖 官方部署文档参考：
<a href="https://modelscope.cn/models/moonshotai/Kimi-K2.5/file/view/master/docs%2Fdeploy_guidance.md?status=1" target="_blank" rel="noopener noreferrer">https://modelscope.cn/models/moonshotai/Kimi-K2.5/file/view/master/docs%2Fdeploy_guidance.md?status=1</a></p>
<hr>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="1️⃣-方案-a使用-vllm-部署">1️⃣ 方案 A：使用 vLLM 部署<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#1%EF%B8%8F%E2%83%A3-%E6%96%B9%E6%A1%88-a%E4%BD%BF%E7%94%A8-vllm-%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="1️⃣ 方案 A：使用 vLLM 部署的直接链接" title="1️⃣ 方案 A：使用 vLLM 部署的直接链接">​</a></h4>
<p>vLLM 是一个高性能的大模型推理引擎，支持大规模模型的高效推理。</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="-方法一本机直接部署">📍 方法一：本机直接部署<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E6%96%B9%E6%B3%95%E4%B8%80%E6%9C%AC%E6%9C%BA%E7%9B%B4%E6%8E%A5%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="📍 方法一：本机直接部署的直接链接" title="📍 方法一：本机直接部署的直接链接">​</a></h5>
<p>安装 vLLM（注意版本号！）：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">uv pip install -U vllm==0.15.0 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># ⚠️ 注意：一定要安装 0.15.0 及以上版本，才能支持 Kimi K2.5</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>启动脚本</strong> (单机 <code>8 * 141GB H200/H20</code>)：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">vllm serve $MODEL_PATH -tp 8 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--trust-remote-code \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--tool-call-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--reasoning-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--enable-auto-tool-choice \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--port 8000 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--host 0.0.0.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="-方法二docker-部署-推荐-">📍 方法二：Docker 部署 (推荐 🌟)<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E6%96%B9%E6%B3%95%E4%BA%8Cdocker-%E9%83%A8%E7%BD%B2-%E6%8E%A8%E8%8D%90-" class="hash-link" aria-label="📍 方法二：Docker 部署 (推荐 🌟)的直接链接" title="📍 方法二：Docker 部署 (推荐 🌟)的直接链接">​</a></h5>
<p>不想污染本地环境？用 Docker！</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 拉取镜像</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker pull vllm/vllm-openai:v0.15.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>启动脚本</strong>：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker run --runtime nvidia --gpus all \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -v $MODEL_PATH:$MODEL_PATH \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -p 8000:8000 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --ipc=host \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    vllm/vllm-openai:v0.15.0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --model $MODEL_PATH \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --trust-remote-code \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --tool-call-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --reasoning-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --enable-auto-tool-choice \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --port 8000 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --host 0.0.0.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="-多机部署补充">🌐 多机部署补充<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E5%A4%9A%E6%9C%BA%E9%83%A8%E7%BD%B2%E8%A1%A5%E5%85%85" class="hash-link" aria-label="🌐 多机部署补充的直接链接" title="🌐 多机部署补充的直接链接">​</a></h5>
<p>如果是双机部署（如 <code>2 * 8 * 96GB H20</code>），需确保节点间网络互通（IB 网络配置正确）。
👉 配置 IB 网络可参考我之前的 DeepSeek 部署文章：
<a href="https://mp.weixin.qq.com/s/iyYap5ciQd3JtpgBNnld8Q" target="_blank" rel="noopener noreferrer">https://mp.weixin.qq.com/s/iyYap5ciQd3JtpgBNnld8Q</a></p>
<p><strong>主节点脚本</strong>：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">vllm serve $MODEL_PATH \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --tool-call-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --reasoning-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --enable-auto-tool-choice \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --enable-expert-parallel \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --enable-chunked-prefill \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --host 0.0.0.0 --port 8000 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --distributed-executor-backend mp \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --pipeline-parallel-size 2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --tensor-parallel-size 8 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --nnodes 2 --node-rank 0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --served-model-name kimi-k2.5 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --master-addr $HEAD_NODE_IP \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --trust-remote-code </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>从节点脚本</strong>：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">vllm serve $MODEL_PATH \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --tool-call-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --reasoning-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --enable-auto-tool-choice \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --enable-expert-parallel \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --enable-chunked-prefill \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --host 0.0.0.0 --port 8000 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --distributed-executor-backend mp \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --pipeline-parallel-size 2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --tensor-parallel-size 8 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --nnodes 2 --node-rank 1 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --served-model-name kimi-k2.5 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --master-addr $HEAD_NODE_IP --headless\</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --trust-remote-code </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><em>(从节点脚本类似，仅需修改 <code>--node-rank 1</code> 并添加 <code>--headless</code> 参数)</em></p>
<hr>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="2️⃣-方案-b使用-sglang-部署--作者当前在用">2️⃣ 方案 B：使用 SGLang 部署 (🔥 作者当前在用)<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#2%EF%B8%8F%E2%83%A3-%E6%96%B9%E6%A1%88-b%E4%BD%BF%E7%94%A8-sglang-%E9%83%A8%E7%BD%B2--%E4%BD%9C%E8%80%85%E5%BD%93%E5%89%8D%E5%9C%A8%E7%94%A8" class="hash-link" aria-label="2️⃣ 方案 B：使用 SGLang 部署 (🔥 作者当前在用)的直接链接" title="2️⃣ 方案 B：使用 SGLang 部署 (🔥 作者当前在用)的直接链接">​</a></h4>
<p>截止目前，SGLang 尚未发布最新的正式版，需使用<strong>开发版本</strong>。</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="-方法一本机源码部署">📍 方法一：本机源码部署<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E6%96%B9%E6%B3%95%E4%B8%80%E6%9C%AC%E6%9C%BA%E6%BA%90%E7%A0%81%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="📍 方法一：本机源码部署的直接链接" title="📍 方法一：本机源码部署的直接链接">​</a></h5>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 安装依赖 (源码安装)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pip install "sglang @ git+https://github.com/sgl-project/sglang.git#subdirectory=python"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pip install nvidia-cudnn-cu12==9.16.0.29</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>启动脚本</strong>：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sglang serve --model-path $MODEL_PATH \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--tp 8 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--trust-remote-code \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--tool-call-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--reasoning-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--host 0.0.0.0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--port 8000</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>多机部署，同样的需要首先配置IB网络</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 主节点</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sglang serve --model-path $MODEL_PATH --served-model-name kimi-k2.5 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --tp 16 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --trust-remote-code \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --tool-call-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --reasoning-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --dist-init-addr $HEAD_NODE_IP:$HEAD_NODE_PORT \ # 例如我的是10.0.41.2:8000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --nnodes 2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --node-rank 0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --host 0.0.0.0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --port 8000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 从节点</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sglang serve --model-path $MODEL_PATH --served-model-name kimi-k2.5 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --tp 16 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --trust-remote-code \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --tool-call-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --reasoning-parser kimi_k2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --dist-init-addr $HEAD_NODE_IP:$HEAD_NODE_PORT \ # 例如我的是10.0.41.2:8000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --nnodes 2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --node-rank 1 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --host 0.0.0.0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --port 8000</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="-方法二docker-部署-推荐--1">📍 方法二：Docker 部署 (推荐 🌟)<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E6%96%B9%E6%B3%95%E4%BA%8Cdocker-%E9%83%A8%E7%BD%B2-%E6%8E%A8%E8%8D%90--1" class="hash-link" aria-label="📍 方法二：Docker 部署 (推荐 🌟)的直接链接" title="📍 方法二：Docker 部署 (推荐 🌟)的直接链接">​</a></h5>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 1. 拉取最新开发版镜像</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker pull sglang/sglang:dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 2. 启动容器</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker run -d --gpus all \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --shm-size=128g \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --ipc=host \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --network=host \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --name kimi-k2.5 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  lmsysorg/sglang:dev \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  bash -c "while true; do sleep 3600; done"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 3. 进入容器</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker exec -it kimi-k2.5 bash</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 4. 在容器内执行方法一中的启动脚本即可</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="-部署成功验证">✅ 部署成功验证<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E9%83%A8%E7%BD%B2%E6%88%90%E5%8A%9F%E9%AA%8C%E8%AF%81" class="hash-link" aria-label="✅ 部署成功验证的直接链接" title="✅ 部署成功验证的直接链接">​</a></h5>
<p>当日志中出现如下内容，恭喜你，模型启动成功！🎊
<img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601301427050.png" alt="" class="img_ev3q"></p>
<p><strong>实测性能</strong>：</p>
<ul>
<li><strong>环境</strong>：<code>2 * 8 * 80GB H100</code></li>
<li><strong>Decode 速度</strong>：平均 <strong>70-80 tokens/s</strong></li>
<li><strong>评价</strong>：比 GLM-4.7 和 MiniMax-M2.1 稍慢，但考虑到模型量级巨大，这个速度完全可接受！
<img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601301428754.png" alt="" class="img_ev3q"></li>
</ul>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="-四-下一步落地">🔮 四、 下一步：落地<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E5%9B%9B-%E4%B8%8B%E4%B8%80%E6%AD%A5%E8%90%BD%E5%9C%B0" class="hash-link" aria-label="🔮 四、 下一步：落地的直接链接" title="🔮 四、 下一步：落地的直接链接">​</a></h3>
<p>相信大家本地部署 Kimi K2.5，绝不仅仅是为了简单聊聊天。🗣️</p>
<p>在 2026 年的今天，<strong>编程 和 Agent 才是 AI 的核心生产力</strong>。</p>
<p>Kimi K2.5 在这两方面的能力非常强大，加上原生支持多模态，让它在<strong>视觉编程</strong>方面拥有了天然优势。</p>
<p>想象一下：</p>
<blockquote>
<p>📸 你只需要截个图，发给 AI，它就能帮你生成一个一模一样的界面...</p>
</blockquote>
<p>这种感觉有多爽？只有亲自体验过才知道！😎</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/63c5f13891f0cebe9cf614bdcfe8bce7.png" alt="" class="img_ev3q"></p>
<p>然而，理想很丰满，现实却有些“骨感”。🤔</p>
<p>虽然直接购买官方 API 门槛最低，但在企业级实战中，我们往往面临着两座大山：<strong>网络延迟的不确定性</strong> 和 <strong>核心数据的安全红线</strong>。把核心代码交给公网模型？很多团队心里总会犯嘀咕。</p>
<p>既然公有云有顾虑，那**“把能力搬回家”**就成了必然选择。</p>
<p>但问题来了：<strong>如何把 Kimi K2.5 这种“巨无霸”平稳落地，并像 API 一样丝滑地接入到我们的开发流中？</strong></p>
<p>这正是我们下一阶段要攻克的重点——从“能跑通”到“好用”，实现真正的本地化生产力闭环。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="-写在最后">📝 写在最后<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#-%E5%86%99%E5%9C%A8%E6%9C%80%E5%90%8E" class="hash-link" aria-label="📝 写在最后的直接链接" title="📝 写在最后的直接链接">​</a></h3>
<p>感谢你看到这里！祝你部署顺利！🎉</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="下篇文章预告-"><strong>下篇文章预告</strong> 🚀<a href="https://dongfangzan.cn/2026/01/30/2026/kimi-k2.5-deployment#%E4%B8%8B%E7%AF%87%E6%96%87%E7%AB%A0%E9%A2%84%E5%91%8A-" class="hash-link" aria-label="下篇文章预告-的直接链接" title="下篇文章预告-的直接链接">​</a></h4>
<p>我们将讨论如何将你本地部署的大模型完美接入 <strong>Claude Code</strong>，让你闲置的 GPU 转冒烟，发挥它的最大价值！🔥</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601301432256.png" alt="" class="img_ev3q"></p>
<p><strong>关注我，不迷路！</strong> 👇</p>]]></content:encoded>
            <category>Claude Code</category>
        </item>
        <item>
            <title><![CDATA[Claude Agent SDK 开发指南2 - 对话、工具调用、MCP以及如何让AI操纵你的浏览器]]></title>
            <link>https://dongfangzan.cn/2026/01/22/2026/claude-agent-sdk-python01</link>
            <guid>https://dongfangzan.cn/2026/01/22/2026/claude-agent-sdk-python01</guid>
            <pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[上篇文章中我们看到，如何用Claude Agent SDK快速搭建一个AI Agent]]></description>
            <content:encoded><![CDATA[<p>上篇文章中我们看到，如何用Claude Agent SDK快速搭建一个AI Agent</p>
<p>只用了几分钟时间，我们就快速搭建了一个可以自动修复Python代码的QuickStart</p>
<p>在本篇文章中我们继续来深入了解Claude Agent SDK的核心组件——<code>query()</code>函数和<code>ClaudeSDKClient</code>类</p>
<!-- -->
<p>Claude Agent SDK的核心组件主要包括两个部分：<code>query()</code>函数和<code>ClaudeSDKClient</code>类</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="如何去选择使用query函数还是claudesdkclient类">如何去选择使用<code>query()</code>函数还是<code>ClaudeSDKClient</code>类<a href="https://dongfangzan.cn/2026/01/22/2026/claude-agent-sdk-python01#%E5%A6%82%E4%BD%95%E5%8E%BB%E9%80%89%E6%8B%A9%E4%BD%BF%E7%94%A8query%E5%87%BD%E6%95%B0%E8%BF%98%E6%98%AFclaudesdkclient%E7%B1%BB" class="hash-link" aria-label="如何去选择使用query函数还是claudesdkclient类的直接链接" title="如何去选择使用query函数还是claudesdkclient类的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="快速对比">快速对比<a href="https://dongfangzan.cn/2026/01/22/2026/claude-agent-sdk-python01#%E5%BF%AB%E9%80%9F%E5%AF%B9%E6%AF%94" class="hash-link" aria-label="快速对比的直接链接" title="快速对比的直接链接">​</a></h3>
<table><thead><tr><th>特性</th><th><code>query()</code>函数</th><th><code>ClaudeSDKClient</code>类</th></tr></thead><tbody><tr><td>会话</td><td>每次创建一个新的会话</td><td>在整个对话过程中复用同一个会话</td></tr><tr><td>对话次数</td><td>适合单次对话场景</td><td>适合在同一个上下文中多次对话</td></tr><tr><td>连接管理</td><td>自动管理连接</td><td>需要手动控制连接</td></tr><tr><td>流式输入</td><td>✅ 支持</td><td>✅ 支持</td></tr><tr><td>中断</td><td>❌ 不支持</td><td>✅ 支持</td></tr><tr><td>钩子</td><td>❌ 不支持</td><td>✅ 支持</td></tr><tr><td>自定义工具</td><td>❌ 不支持</td><td>✅ 支持</td></tr><tr><td>持续对话</td><td>❌ 每次都是新会话</td><td>✅ 维护对话上下文</td></tr><tr><td>使用场景</td><td>适合一次性任务</td><td>适合持续对话和复杂交互</td></tr></tbody></table>
<blockquote>
<p><strong>注意：自定义工具，只能在ClaudeSDKClient里面使用</strong>，这是很多新手容易忽略的点</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="何时使用-query每次都是新会话">何时使用 query()（每次都是新会话）<a href="https://dongfangzan.cn/2026/01/22/2026/claude-agent-sdk-python01#%E4%BD%95%E6%97%B6%E4%BD%BF%E7%94%A8-query%E6%AF%8F%E6%AC%A1%E9%83%BD%E6%98%AF%E6%96%B0%E4%BC%9A%E8%AF%9D" class="hash-link" aria-label="何时使用 query()（每次都是新会话）的直接链接" title="何时使用 query()（每次都是新会话）的直接链接">​</a></h3>
<p>最适合：</p>
<ul>
<li>一次性问题，不需要对话历史</li>
<li>不需要之前交换上下文的独立任务</li>
<li>简单的自动化脚本</li>
<li>当你每次都想要一个全新的开始</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="何时使用-claudesdkclient持续对话">何时使用 ClaudeSDKClient（持续对话）<a href="https://dongfangzan.cn/2026/01/22/2026/claude-agent-sdk-python01#%E4%BD%95%E6%97%B6%E4%BD%BF%E7%94%A8-claudesdkclient%E6%8C%81%E7%BB%AD%E5%AF%B9%E8%AF%9D" class="hash-link" aria-label="何时使用 ClaudeSDKClient（持续对话）的直接链接" title="何时使用 ClaudeSDKClient（持续对话）的直接链接">​</a></h3>
<p>最适合：</p>
<ul>
<li>继续对话 - 当你需要 Claude 记住上下文时</li>
<li>后续问题 - 基于之前的回答构建</li>
<li>交互式应用程序 - 聊天界面、REPL</li>
<li>响应驱动逻辑 - 当下一个操作取决于 Claude 的响应时</li>
<li>会话控制 - 显式管理对话生命周期</li>
</ul>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="简单总结">简单总结<a href="https://dongfangzan.cn/2026/01/22/2026/claude-agent-sdk-python01#%E7%AE%80%E5%8D%95%E6%80%BB%E7%BB%93" class="hash-link" aria-label="简单总结的直接链接" title="简单总结的直接链接">​</a></h3>
<p>以上是官方对query()和ClaudeSDKClient的对比介绍</p>
<p>说简单点，<code>query()</code>函数更适合一次性任务，而<code>ClaudeSDKClient</code>类更适合持续对话和复杂交互</p>
<p>如果你希望做一个AI对话机器人，那么<code>ClaudeSDKClient</code>类无疑是更好的选择</p>
<p>如果你只是想执行一个简单的任务，比如发送一个微信公众号消息，那么使用<code>query()</code>函数就足够了</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="query-函数">query() 函数<a href="https://dongfangzan.cn/2026/01/22/2026/claude-agent-sdk-python01#query-%E5%87%BD%E6%95%B0" class="hash-link" aria-label="query() 函数的直接链接" title="query() 函数的直接链接">​</a></h2>
<p>我们看一下<code>query()</code>的核心定义</p>
<div class="language-Python language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">query</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> AsyncIterable</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">dict</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Any</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    options</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClaudeAgentOptions </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> AsyncIterator</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Message</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>query()</code>函数接受两个核心参数：</p>
<ul>
<li><code>prompt</code>：可以是一个字符串，也可以是一个异步可迭代对象，对话的提示词</li>
<li><code>options</code>：可选的配置对象，默认为<code>ClaudeAgentOptions()</code></li>
</ul>
<p><code>query()</code>函数返回一个异步迭代器<code>AsyncIterator[Message]</code>，可以用来逐步获取Claude Agent的响应</p>
<p>代码示例</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">import asyncio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">from claude_agent_sdk import query, ClaudeAgentOptions</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">async def main():</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    options = ClaudeAgentOptions(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        system_prompt="你是一个经验丰富的Python开发人员",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        permission_mode='acceptEdits',</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        cwd="./2-1-query"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    async for message in query(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        prompt="创建一个Python的Web服务器示例代码",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        options=options</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ):</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        print(message)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">asyncio.run(main())</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>大概用时几十秒，可以看到AI输出的结果如下</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601221610109.png" width="600" border="1px">
<p>并看到，我们指定目录下生成了相应的代码文件</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601221612767.png" width="200" border="1px">
<p><strong>AI 甚至贴心的给我们写了一份README文件，让我们能轻松的读懂代码</strong></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601221613879.png" alt="" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="工具调用和mcp">工具调用和Mcp<a href="https://dongfangzan.cn/2026/01/22/2026/claude-agent-sdk-python01#%E5%B7%A5%E5%85%B7%E8%B0%83%E7%94%A8%E5%92%8Cmcp" class="hash-link" aria-label="工具调用和Mcp的直接链接" title="工具调用和Mcp的直接链接">​</a></h2>
<p>AI Agent的核心，还是可以利用各类工具，为我们完成复杂的任务</p>
<p>在上面的例子中，AI Agent就调用了<code>Edit</code>工具，帮我们创建了Python代码文件</p>
<p>我们首先来看tool注解（装饰器）的定义</p>
<div class="language-Python language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">tool</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    input_schema</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token builtin">dict</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Any</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> Callable</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Callable</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Any</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Awaitable</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">dict</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Any</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> SdkMcpTool</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Any</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>可以看到，<code>tool</code>注解接受三个参数</p>
<table><thead><tr><th style="text-align:left">参数</th><th style="text-align:left">类型</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left">name</td><td style="text-align:left">str</td><td style="text-align:left">工具的唯一标识符</td></tr><tr><td style="text-align:left">description</td><td style="text-align:left">str</td><td style="text-align:left">工具功能的人类可读描述</td></tr><tr><td style="text-align:left">input_schema</td><td style="text-align:left">type</td><td style="text-align:left">dict[str, Any]</td></tr></tbody></table>
<p>对于input_schema参数，有两种方式可以</p>
<ol>
<li>简单模式</li>
</ol>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"text"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"count"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> int</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> bool</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 表示工具需要三个参数，text是字符串，count是整数，enabled是布尔值</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol start="2">
<li>复杂模式JSON Schema格式</li>
</ol>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"object"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"properties"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"text"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"count"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"integer"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"minimum"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"required"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"text"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>以上json_schema表示json例子如下</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"text"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hello, World!"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必填</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"count"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">42</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 非必填，最小是0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>我们现在来自定义一个简单的工具，来让AI打招呼</p>
<div class="language-Python language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> claude_agent_sdk </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> tool</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> typing </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Any</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@tool</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"greet"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Greet a user"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">greet</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">args</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">dict</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Any</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token builtin">dict</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Any</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"content"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">"type"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"text"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">"text"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f"你好, </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">args</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">[</span><span class="token string-interpolation interpolation string" style="color:#e3116c">'name'</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">]</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">!"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>我们再回顾一下tool的返回值</p>
<div class="language-Python language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> Callable</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Callable</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Any</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Awaitable</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">dict</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Any</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> SdkMcpTool</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Any</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>可以看到，在Claude Agent SDK中，如果想要使用一个工具，你需要把它注册到MCP服务器（MCP Server）里面才可以使用</p>
<div class="language-Python language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">my_mcp_server </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> create_sdk_mcp_server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"my_mcp_server"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    version</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"2.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">greet</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Pass decorated functions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    options </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ClaudeAgentOptions</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        mcp_servers</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"my_mcp_server"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> my_mcp_server</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        allowed_tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"mcp__my_mcp_server__greet"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">with</span><span class="token plain"> ClaudeSDKClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">options</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">options</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">query</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"你好，我叫东方赞，请使用greet工具"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> message </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">receive_response</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">asyncio</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>我们详细解释一下这里的代码</p>
<ol>
<li>
<p><strong>query()函数无法使用自定义工具，如果要调用工具，你需要使用ClaudeSDKClient</strong>，在这里官方文档没有特别强调这一点，会让很多新接触的研发人员感到困惑</p>
</li>
<li>
<p><strong><code>allowed_tools=["mcp__my_mcp_server__greet"]</code>约定了工具的命名格式，mcp__{server_name}__{tool_name}</strong></p>
</li>
</ol>
<p>在代码执行过程中，可以看到AI成功调用了我们自定义的greet工具的过程</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601221707765.png" width="700" border="1px">
<p>如果我们注释掉<code>allowed_tools</code>参数，AI会向用户发起询问，是否允许使用该工具</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601221710791.png" width="700" border="1px">
<p>我们还可以使用一个外部的mcp server来实现网页抓取的功能</p>
<blockquote>
<p>我们可以到模搭社区去找一个免费的mcp server，比如Chrome浏览器工具</p>
</blockquote>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601221918157.png" width="700" border="1px">
<p>首先在本地安装这个mcp server</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npx chrome-devtools-mcp@latest</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>如果你没有安装Node.js，可以先去<a href="https://nodejs.org/" target="_blank" rel="noopener noreferrer">Node.js官网</a>下载安装</p>
<p>然后我们启动启动执行这个mcp server</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">import asyncio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">from claude_agent_sdk import ClaudeAgentOptions, ResultMessage, ClaudeSDKClient</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">from claude_agent_sdk._errors import CLIConnectionError</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">async def main():</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    options = ClaudeAgentOptions(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        mcp_servers={</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "chrome-devtools": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "command": "npx",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "args": ["chrome-devtools-mcp@latest"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        allowed_tools=["mcp__chrome-devtools__*"],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    async with ClaudeSDKClient(options=options) as client:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        await client.query("帮我打开一个新的标签页，进入谷歌官网，并搜索东方赞博客"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                           "找到你觉得最可能是的，进去之后看看他最近写了哪些东西？")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        async for message in client.receive_response():</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            print(message)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            if isinstance(message, ResultMessage) and message.subtype == "success":</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                print(message.result)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">asyncio.run(main())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>你可以非常清晰的看到整个操作过程</p>
<ol>
<li>AI Agent使用Chrome DevTools打开了一个新的标签页</li>
<li>进入谷歌官网</li>
<li>搜索“东方赞博客”</li>
<li>找到最可能的结果，进入博客页面</li>
<li>查看最近的文章内容</li>
<li>完成总结</li>
</ol>
<p>我把整个视频录制了一份，感兴趣的朋友可以看下整个过程</p>
<video controls="" width="540" height="360"><source src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/%E5%BD%95%E5%88%B6%E4%BA%8E%202026-01-22%2019.13.13.mp4" type="video/mp4" width="400px"><track kind="captions" src="/captions.vtt" label="中文字幕"></video>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="https://dongfangzan.cn/2026/01/22/2026/claude-agent-sdk-python01#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>本文我们深入介绍了Claude Agent SDK的核心组件——<code>query()</code>函数和<code>ClaudeSDKClient</code>类</p>
<p>我们详细对比了两者的区别和使用场景，并通过工具调用和MCP，来展示了如何利用Agent SDK来完成复杂的任务</p>
<p>下篇文章，我们会继续深入其他更多的特性，比如流式输入、中断、钩子函数等高级功能</p>
<p>感谢你看到这里，如果你对Claude Agent SDK有任何问题，欢迎在评论区留言讨论！</p>]]></content:encoded>
            <category>Claude Code</category>
        </item>
        <item>
            <title><![CDATA[Claude Agent SDK 开发指南1 - QuickStart]]></title>
            <link>https://dongfangzan.cn/2026/01/21/2026/claude-agent-sdk-quickstart</link>
            <guid>https://dongfangzan.cn/2026/01/21/2026/claude-agent-sdk-quickstart</guid>
            <pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[AI发展到了2026年，越来越多的开发者已经开始注意到，需要落地AI应用，单纯依赖大模型能力已经远远不够了]]></description>
            <content:encoded><![CDATA[<p>AI发展到了2026年，越来越多的开发者已经开始注意到，需要落地AI应用，单纯依赖大模型能力已经远远不够了</p>
<p>大家开始逐步开发落地AI应用，而Claude Agent SDK的出现，无疑为开发者提供了一个极其便利的工具</p>
<p>本系列文章，我们就来介绍Claude Agent SDK的使用方法和一些实战经验</p>
<!-- -->
<p>使用 Claude Code 作为库构建生产级 AI 代理</p>
<p>构建能够自主读取文件、运行命令、搜索网络、编辑代码等的 AI 代理。Agent SDK 为您提供了与 Claude Code 相同的工具、代理循环和上下文管理，可在 Python 和 TypeScript 中编程。</p>
<p>Agent SDK 包含用于读取文件、运行命令和编辑代码的内置工具，因此您的代理可以立即开始工作，无需您实现工具执行。深入了解快速入门或探索使用 SDK 构建的真实代理</p>
<p><a href="https://platform.claude.com/docs/zh-CN/agent-sdk/overview" target="_blank" rel="noopener noreferrer">官方文档地址</a></p>
<blockquote>
<p>以上是官方对Claude Agent SDK的介绍</p>
</blockquote>
<h1>快速开始</h1>
<p>下面我们就来快速体验一下Claude Agent SDK的使用方法</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="环境准备">环境准备<a href="https://dongfangzan.cn/2026/01/21/2026/claude-agent-sdk-quickstart#%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87" class="hash-link" aria-label="环境准备的直接链接" title="环境准备的直接链接">​</a></h2>
<ul>
<li>Node.js 18+ 或 Python 3.10+</li>
<li>一个Anthropic账户</li>
<li>或支持兼容Anthropic API的模型（你可以使用最新版本的Ollama进行本地测试）</li>
</ul>
<blockquote>
<p>以下都是用Python版本进行演示</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="安装">安装<a href="https://dongfangzan.cn/2026/01/21/2026/claude-agent-sdk-quickstart#%E5%AE%89%E8%A3%85" class="hash-link" aria-label="安装的直接链接" title="安装的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="claude-code-安装">Claude Code 安装<a href="https://dongfangzan.cn/2026/01/21/2026/claude-agent-sdk-quickstart#claude-code-%E5%AE%89%E8%A3%85" class="hash-link" aria-label="Claude Code 安装的直接链接" title="Claude Code 安装的直接链接">​</a></h3>
<p>Agent SDK是使用Claude Code作为其运行时的，所以你需要先安装Claude Code</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># macOS/Linux/WSL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">curl -fsSL https://claude.ai/install.sh | bash</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>或者使用npm进行安装</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm install -g @anthropic-ai/claude-code</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="安装agent-sdk包">安装Agent SDK包<a href="https://dongfangzan.cn/2026/01/21/2026/claude-agent-sdk-quickstart#%E5%AE%89%E8%A3%85agent-sdk%E5%8C%85" class="hash-link" aria-label="安装Agent SDK包的直接链接" title="安装Agent SDK包的直接链接">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># TypeScript</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npm install @anthropic-ai/claude-agent-sdk</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Python</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pip install claude-agent-sdk</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="配置本地环境变量">配置本地环境变量<a href="https://dongfangzan.cn/2026/01/21/2026/claude-agent-sdk-quickstart#%E9%85%8D%E7%BD%AE%E6%9C%AC%E5%9C%B0%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F" class="hash-link" aria-label="配置本地环境变量的直接链接" title="配置本地环境变量的直接链接">​</a></h3>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ANTHROPIC_API_KEY=sk-ant-your-key-here</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">兼容Anthropic API的地址</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># ANTHROPIC_BASE_URL=http://localhost:3456</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="hello-world-示例">Hello World 示例<a href="https://dongfangzan.cn/2026/01/21/2026/claude-agent-sdk-quickstart#hello-world-%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="Hello World 示例的直接链接" title="Hello World 示例的直接链接">​</a></h2>
<p>编写代码如下</p>
<div class="language-Python language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> asyncio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> claude_agent_sdk </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> query</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ClaudeAgentOptions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> AssistantMessage</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ResultMessage</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Agentic loop: streams messages as Claude works</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> message </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> query</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        prompt</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"你好，请介绍一下自己"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        options</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">ClaudeAgentOptions</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            allowed_tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"Read"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Tools Claude can use</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Print human-readable output</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token builtin">isinstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> AssistantMessage</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> block </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> message</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">content</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token builtin">hasattr</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">block</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"text"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">block</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">text</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic"># Claude's reasoning</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> </span><span class="token builtin">hasattr</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">block</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Tool: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">block</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># Tool being called</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> </span><span class="token builtin">isinstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ResultMessage</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Done: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">message</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">subtype</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Final result</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">asyncio</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Output:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 我是 Claude，由 Anthropic 开发的 AI 助手。我可以在对话中帮助你完成各种任务，包括：</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># **💻 编程与开发**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># - 编写、审查和调试代码</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># - 帮助设计软件架构</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># - 修复 bug 和优化性能</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># - 运行命令和测试</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h1>Agent能力示例</h1>
<p>为了展示Agent的能力，我们可以让它读取一个本地文件，以官方文档中的例子为例</p>
<p>首先，我们可以准备一个有缺陷的代码如下，并保存到本地叫做<code>utils.py</code>：</p>
<div class="language-Python language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calculate_average</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">numbers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    total </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> num </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> numbers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        total </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> num</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> total </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">numbers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">get_user_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> user</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">upper</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>在这段代码中，有两个主要错误</p>
<ol>
<li><code>calculate_average</code> 函数在计算平均值时没有处理空列表的情况，这会导致除以零的错误。</li>
<li><code>get_user_name</code> 函数假设传入的 <code>user</code> 字典中总是包含 <code>name</code> 键，如果缺少该键会引发 <code>KeyError</code>。</li>
</ol>
<p>我们使用Agent SDK来让Claude自动修复这些错误</p>
<div class="language-Python language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> asyncio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> claude_agent_sdk </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> query</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ClaudeAgentOptions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> AssistantMessage</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ResultMessage</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Agent执行循环</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> message </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> query</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        prompt</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"请审查代码utils.py，查找可能导致崩溃的错误。修复你发现的任何问题。"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        options</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">ClaudeAgentOptions</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            allowed_tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"Read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Edit"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Glob"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 可以使用的工具</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            permission_mode</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"acceptEdits"</span><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 自动批准文件编辑</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 打印人类可读的输出</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token builtin">isinstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> AssistantMessage</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> block </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> message</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">content</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token builtin">hasattr</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">block</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"text"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">block</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">text</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic"># Claude的推理过程</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> </span><span class="token builtin">hasattr</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">block</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Tool: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">block</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># 调用的工具</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> </span><span class="token builtin">isinstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ResultMessage</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Done: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">message</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">subtype</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 最终结果</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">asyncio</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>可以看到输出内容如下</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">我会帮您审查并修复 utils.py 文件中的潜在错误。让我先读取这个文件。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Tool: Glob</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Tool: Read</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">我发现了这个文件中存在几个可能导致崩溃的错误：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">## 发现的问题：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">1. **`calculate_average` 函数 - 零除错误**：当 `numbers` 为空列表时，`len(numbers)` 返回 0，导致除零错误。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2. **`get_user_name` 函数 - KeyError**：当传入的字典中没有 "name" 键时，会抛出 KeyError。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">3. **`get_user_name` 函数 - AttributeError**：如果 `user` 不是一个字典，或者 `user["name"]` 不是字符串，调用 `.upper()` 会失败。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">4. **`get_user_name` 函数 - TypeError**：如果传入的不是字典类型，索引操作 `user["name"]` 会失败。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">现在让我修复这些问题：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Tool: Edit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Tool: Edit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">完成！我已经修复了所有可能导致崩溃的错误。以下是修复的详细说明：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">## 修复内容：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">### 1. `calculate_average` 函数</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">**问题**：空列表会导致 `ZeroDivisionError`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">**修复**：添加了空列表检查，当列表为空时返回 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">### 2. `get_user_name` 函数</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">**问题**：多个潜在错误</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- `KeyError`：字典中没有 "name" 键</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- `AttributeError`：不是字符串类型无法调用 `.upper()`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- `TypeError`：传入的不是字典类型</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">**修复**：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- 检查 `user` 是否为空或不是字典类型</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- 使用 `.get()` 方法安全地获取 "name" 值，避免 `KeyError`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- 使用 `str()` 转换确保类型正确</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- 添加空字符串检查，避免对空值调用 `.upper()`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">现在这两个函数都具有更强的健壮性，能够处理各种边界情况而不会导致程序崩溃。</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>随后检查<code>utils.py</code>文件，发现代码已经被自动修复为如下内容</p>
<div class="language-Python language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calculate_average</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">numbers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> numbers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    total </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> num </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> numbers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        total </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> num</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> total </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">numbers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">get_user_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> user </span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> </span><span class="token builtin">isinstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">dict</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> user</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">upper</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> name </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>可以看到，<strong>只需要几分钟时间</strong>，我们就用agent sdk实现了一个自动读取，自动修改代码的AI Agent</p>
<p>当然我们也可以通过更改一些参数，来修改Agent的能力，比如增加网络搜索</p>
<div class="language-Python language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">options</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">ClaudeAgentOptions</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    allowed_tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"Read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Edit"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Glob"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WebSearch"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    permission_mode</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"acceptEdits"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>或者给Claude一个自定义的系统提示词</p>
<div class="language-Python language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">options</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">ClaudeAgentOptions</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    allowed_tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"Read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Edit"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Glob"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    permission_mode</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"acceptEdits"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    system_prompt</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"你是一个经验丰富的Python开发者，请帮我审查并修复代码中的错误。"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>亦或者直接执行bash命令</p>
<div class="language-Python language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">options</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">ClaudeAgentOptions</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 允许Bash工具</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    allowed_tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"Read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Edit"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Glob"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Bash"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    permission_mode</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"acceptEdits"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="工具">工具<a href="https://dongfangzan.cn/2026/01/21/2026/claude-agent-sdk-quickstart#%E5%B7%A5%E5%85%B7" class="hash-link" aria-label="工具的直接链接" title="工具的直接链接">​</a></h2>
<p>工具是Claude Agent SDK的核心能力之一</p>
<p>它可以控制你的Agent能够执行哪些操作</p>
<table><thead><tr><th style="text-align:left">工具</th><th style="text-align:left">Agent能够做什么</th></tr></thead><tbody><tr><td style="text-align:left">Read、Glob、Grep、WebSearch</td><td style="text-align:left">只读、分析，聊天助手</td></tr><tr><td style="text-align:left">Read、Edit、Glob</td><td style="text-align:left">修改、分析代码，对权限要求高</td></tr><tr><td style="text-align:left">Read、Edit、Glob、Bash、Grep</td><td style="text-align:left">完全自动工具</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="权限模式">权限模式<a href="https://dongfangzan.cn/2026/01/21/2026/claude-agent-sdk-quickstart#%E6%9D%83%E9%99%90%E6%A8%A1%E5%BC%8F" class="hash-link" aria-label="权限模式的直接链接" title="权限模式的直接链接">​</a></h2>
<p>权限模式(permission_mode)主要用于控制你需要多少人工干预</p>
<table><thead><tr><th style="text-align:left">模式</th><th style="text-align:left">行为</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:left">acceptEdits</td><td style="text-align:left">自动批准文件编辑，询问其他操作</td><td style="text-align:left">受信任的开发工作流</td></tr><tr><td style="text-align:left">bypassPermissions</td><td style="text-align:left">无提示运行</td><td style="text-align:left">适合完全自动化场景</td></tr><tr><td style="text-align:left">default</td><td style="text-align:left">需要人工批准</td><td style="text-align:left">自定义批准流程</td></tr></tbody></table>
<p>更多权限模式的介绍，我们可以参照官方文档，也可以我们以后再来探讨</p>
<h1>总结</h1>
<p>截止到这个阶段，我们了解到了Claude Agent SDK的基本使用方法</p>
<p>与我们熟悉的OpenAI的<code>/chat/completions</code>接口相比</p>
<p>Claude Agent SDK完整的封装了Agent的能力，让你不用再关心</p>
<ol>
<li>如何管理上下文</li>
<li>如何调用工具</li>
<li>如何处理多轮对话</li>
<li>如何处理文件读写
等等复杂的逻辑，也让你可以更专注于业务逻辑的实现</li>
</ol>
<p>相较于<code>LangChain</code>等框架，Claude Agent SDK将整个Think-Act-Observe流程进行了高度封装，且性能更优，使用体验更好
<img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601211625185.png" alt="" class="img_ev3q"></p>
<p>好了今天的快速入门就到这里，感谢你看到这里，下期见</p>]]></content:encoded>
            <category>Claude Code</category>
        </item>
        <item>
            <title><![CDATA[10 天用掉 10 亿 tokens 后，我的一些 vibe coding 经验]]></title>
            <link>https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience</link>
            <guid>https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience</guid>
            <pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[之前，我简单体验了一下Claude Code，在一些简单的代码和工具任务里面，可以看到Vibe Coding 能带来的巨大提升]]></description>
            <content:encoded><![CDATA[<p>之前，我简单体验了一下Claude Code，在一些简单的代码和工具任务里面，可以看到Vibe Coding 能带来的巨大提升</p>
<p>相信很多使用过人的朋友在尝试过一次后，都会被深刻的震撼到</p>
<p>最近也看到很多大佬的谈到，Claude Code 用 1 小时就完成了过去一年以来所构建的东西</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601141525844.png" alt="" class="img_ev3q"></p>
<p>那么在高强度的复杂工程里面，Vibe Coding 究竟能带来什么样的体验呢？</p>
<p>在过去的 10 天里，我消耗了10亿Tokens，就来分享一下我的一些实际体验和心得吧。</p>
<!-- -->
<p>首先需要声明的是，能消耗这么多token，并不是我钞能力无敌，可以肆意挥霍</p>
<p>而是这段时间我用的都是私有化部署的开原模型，分别是</p>
<ol>
<li><code>GLM-4.7</code></li>
<li><code>MiniMax-M2.1</code></li>
<li><code>Qwen3-235B-A22B</code></li>
<li><code>DeepSeek-V3.2</code></li>
</ol>
<p>同时再叠个甲，上述几个模型，都是用的开源方案进行本地部署的</p>
<p>虽然decode的速度比官方快很多，但是并不具备官方的编程工具，且对Claude Code的适配也并不完善</p>
<p>所以无论你用的是Claude的模型，还是用官方的上述模型，实际效果应该都会比我更好</p>
<h1>一开始</h1>
<p>熟悉的朋友可能了解，我们在公司内部使用OpenWebUI搭建了一套AI系统，专门服务内部用户。
<img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601151607234.png" alt="" class="img_ev3q"></p>
<p>OpenWebUI是一个超过120k⭐️的超级开源项目，相信很多人都知道他</p>
<p>有超过700位开发者贡献过代码，我自己也是其中之一[旺柴]</p>
<p>我们在上面搭建了以上几个模型的服务，用户可以在OpenWebUI上直接调用DeepSeek等相关模型</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601151618484.png" alt="RAG系统" width="400">
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601151632002.png" alt="" class="img_ev3q"></p>
<p>同时建了一个RAG系统，用于回答内部用户的问题</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601151629379.png" alt="RAG系统" width="400">
<p>这套系统在线上跑了一年之后，用户反馈也非常不错，但也存在不少问题，比如</p>
<ol>
<li>用户不知道这一大堆模型该怎么选，哪个能识图？哪个能写代码？哪个能写材料？是被问到最多的问题</li>
<li>RAG出来的东西不准，需要人工校验</li>
<li>AI办事流程开发复杂，连个简单的请假，都要专门写工作流</li>
</ol>
<p>RAG的问题尤其凸显</p>
<p>在文档数据量从几百个增长到几十万个的时候</p>
<p><strong>花费在人肉排查问题上的时间，有时候比RAG本身带来的提效要高很多</strong></p>
<blockquote>
<p>比如下面这个问题，在文档数超过80000个后，rerank模型对某些明明正确的结果给出的灾难性打分</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601160905372.png" alt="" class="img_ev3q"></p>
<p>求助了很多朋友都遇到这种类似的问题</p>
<p><strong>RAG的感觉就是Demo很美好，一落地就抓瞎</strong></p>
<p><strong>固定的RAG工作流，有时候让在用户只问一个简单问题，也要忍受查询文档的缓慢过程</strong></p>
<p>这体验非常糟糕，这也是在当下这个时点内部AI系统面临的困境。</p>
<p>对于这种用业余时间维护的为爱发电项目，就几乎变成了一个无法维护的项目</p>
<h1>OpenAgentWebUI</h1>
<p>那么在当下这个时间点，如果要搭建一个内部AI系统，Agent模式肯定是最合适的</p>
<p>所以基于这个考虑，我就开始尝试基于Claude Code搭建一个OpenAgentWebUI来解决上述问题</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-只有一个ai">1. 只有一个AI<a href="https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience#1-%E5%8F%AA%E6%9C%89%E4%B8%80%E4%B8%AAai" class="hash-link" aria-label="1. 只有一个AI的直接链接" title="1. 只有一个AI的直接链接">​</a></h3>
<p>不让用户选择，就没有模型选择的问题</p>
<p>这个AI能识图、能写材料、能写代码、能画图、能查内部资料、能办事</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-agentic-rag">2. Agentic RAG<a href="https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience#2-agentic-rag" class="hash-link" aria-label="2. Agentic RAG的直接链接" title="2. Agentic RAG的直接链接">​</a></h3>
<p>针对不同用户的不同任务，由AI自主判断，选择合适的RAG工作流</p>
<p>这也就是Agentic RAG的概念</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-保持用户习惯">3. 保持用户习惯<a href="https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience#3-%E4%BF%9D%E6%8C%81%E7%94%A8%E6%88%B7%E4%B9%A0%E6%83%AF" class="hash-link" aria-label="3. 保持用户习惯的直接链接" title="3. 保持用户习惯的直接链接">​</a></h3>
<p>为了降低用户的学习成本，与现在所有的AI保持一致，用户在使用OpenAgentWebUI的时候，不需要学习新的指令，只需要按照现在的习惯来使用即可。</p>
<h1>开始编码</h1>
<p>我给把前面的故事给Claude Code讲了一遍</p>
<p>接下来让AI根据我的描述进行计划并实施编码后，他给了我这样一个界面</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20260106111542_13442_30.png" alt="" class="img_ev3q"></p>
<p>看起来完全不可用，简直丑的不忍直视</p>
<p><strong>看到这个的时候连我自己都在笑这是什么玩意</strong></p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601151719019.png" alt="alt text" width="200">
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="反思">反思<a href="https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience#%E5%8F%8D%E6%80%9D" class="hash-link" aria-label="反思的直接链接" title="反思的直接链接">​</a></h3>
<p>如果是这样的话，那压根就没有做了，这得做到猴年马月了，这Vibe Coding也不行啊</p>
<p>但是仔细回想，这只是AI一次生成的，如果我把整个工作流按照正常的开发流程来一遍，也许可行呢？</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设计先行">设计先行<a href="https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience#%E8%AE%BE%E8%AE%A1%E5%85%88%E8%A1%8C" class="hash-link" aria-label="设计先行的直接链接" title="设计先行的直接链接">​</a></h3>
<p>相信各位在公司里做开发，也是首先产品设计方案，其次UI/UX出原型图，最后根据原型图进行开发的吧</p>
<p>那么好，我们就从设计开始，让AI不考虑任何功能实现，我们只考虑UI/UX的设计，用纯html+css的方式来只做样式设计</p>
<p><strong>很快，大概用了半个小时左右的调整和细化，原型很快就做出来了</strong>
<img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601151725726.png" alt="" class="img_ev3q"></p>
<blockquote>
<p>设计稿在代码仓库的<code>frontend/design</code>目录下</p>
</blockquote>
<p>看到这个原型的时候，信心就都回来了</p>
<p>原来我一个从来没搞过设计的后端工程师，也能做出来一个看着还不错的原型设计了啊！</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="接着编码">接着编码<a href="https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience#%E6%8E%A5%E7%9D%80%E7%BC%96%E7%A0%81" class="hash-link" aria-label="接着编码的直接链接" title="接着编码的直接链接">​</a></h2>
<p>有了设计稿，就开始让 AI 一比一的还原设计稿</p>
<p>接下来就是一边摸鱼，一边干活，边调试边优化</p>
<p><strong>一杯茶，一包烟，敲打AI一整天的方式完成了整个前端的开发</strong></p>
<p>中间遇到一些AI乱写的地方，我会及时提醒他，让AI严格按照设计稿进行还原，比如一开始写成了这个样子</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20260105190109_13400_30.png" alt="" class="img_ev3q"></p>
<p>再根据心情一点点的调整，最后得到了这样的前端</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601151720398.png" alt="" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202601151733954.png" alt="" class="img_ev3q"></p>
<p><strong>在功能上，登录、注册、对话管理、AI对话、浅色/暗色切换、多语言、上传附件、搜索对话、用户编辑等十多个大的功能点基本上开发完成</strong></p>
<p>截止到达到这个阶段，也才过去了一周不到，效率算是远超预期，接着我又开始了后端的开发</p>
<p>所有的代码我都公布在了</p>
<p><a href="https://gitee.com/zsy3313422/open-claude-webui" target="_blank" rel="noopener noreferrer">https://gitee.com/zsy3313422/open-claude-webui</a></p>
<p>目前尚未开发完成，最近写的有点累了，总结一下经验换换脑子，感兴趣的朋友也可以看看给点意见</p>
<h1>经验总结</h1>
<p>从开始琢磨这个事情，到完善一个可用的前端代码，也才过去了几天时间，这种效率是非常恐怖的</p>
<p>以我一个后端工程师的经验，估计写完这套前端代码，至少要花上可能数月的时间</p>
<p>AI编码效率，目前已经达到了一个非常高的水平，但是如何让AI编码能规范的按照你的思路进进行编码，以下是我的一点经验总结</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-先有设计再编码">1. 先有设计，再编码<a href="https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience#1-%E5%85%88%E6%9C%89%E8%AE%BE%E8%AE%A1%E5%86%8D%E7%BC%96%E7%A0%81" class="hash-link" aria-label="1. 先有设计，再编码的直接链接" title="1. 先有设计，再编码的直接链接">​</a></h3>
<p>在AI的帮助下使用figma、sketch等工具先设计出原型图，可以让你更在一开始的阶段更注重用户体验</p>
<p><strong>设计稿写的越精确，AI编码的结果就越符合你的预期</strong></p>
<blockquote>
<p>如果你像我一样没用过设计工具，直接用html和css也是一个思路，不必拘泥于形式</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-plan之后再coding">2. Plan之后再Coding<a href="https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience#2-plan%E4%B9%8B%E5%90%8E%E5%86%8Dcoding" class="hash-link" aria-label="2. Plan之后再Coding的直接链接" title="2. Plan之后再Coding的直接链接">​</a></h3>
<p>在开启每次PR之前，使用Claude Code的Plan Mode（按两下shift+tab切换）与AI进行讨论完善计划</p>
<p>磨刀不误砍柴工，经过多轮讨论后生成代码质量更高，考虑的内容会更完善</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-尽早开始维护你的claudemd">3. 尽早开始维护你的CLAUDE.md<a href="https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience#3-%E5%B0%BD%E6%97%A9%E5%BC%80%E5%A7%8B%E7%BB%B4%E6%8A%A4%E4%BD%A0%E7%9A%84claudemd" class="hash-link" aria-label="3. 尽早开始维护你的CLAUDE.md的直接链接" title="3. 尽早开始维护你的CLAUDE.md的直接链接">​</a></h3>
<p>可能有人不知道什么是CLAUDE.md</p>
<p>这个文件是Claude Code的底层规范，分成三层
<strong>1. 系统级，由Claude管理，用户操作不了</strong>
<strong>2. 用户级，你自己的编码习惯和规则，在各个项目中通用</strong>
<strong>3. 项目级，仅在具体项目中使用</strong></p>
<p>他就像整个开发团队里的约束文档，规定了整个项目的编码规范、设计规范、功能规范等</p>
<p>如果没有约束，AI写起代码来就会天马行空</p>
<p>一个很典型的例子就是，AI有可能一会用html自己写组件，一会引入一个乱七八糟的组件来实现相同的功能</p>
<p>时间长了你的代码就会变得几乎不可维护</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-把你自己当做技术主管而不是程序员">4. 把你自己当做技术主管而不是程序员<a href="https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience#4-%E6%8A%8A%E4%BD%A0%E8%87%AA%E5%B7%B1%E5%BD%93%E5%81%9A%E6%8A%80%E6%9C%AF%E4%B8%BB%E7%AE%A1%E8%80%8C%E4%B8%8D%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%91%98" class="hash-link" aria-label="4. 把你自己当做技术主管而不是程序员的直接链接" title="4. 把你自己当做技术主管而不是程序员的直接链接">​</a></h3>
<p>在编码的过程中，你要把自己当做技术主管，而不是简单的当做一个程序员</p>
<p>你大量的时间，应该放在如何制定约束，让AI按照你的约束进行编码</p>
<p>比如我自己常用的</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">1. 代码查找时优先使用 LSP 工具</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2. 访问外部网站时，如果访问失败使用本地代理</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">3. 前端在写css是严格限制使用 Tailwind CSS 类名</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">4. **优先使用现有组件框架**，避免从零手写 HTML/CSS 实现</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">5. 设计数据库时⚠️严禁使用 UUID 作为主键</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">6. ⚠️严禁使用数据库外键约束</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>你可以使用自己的编码习惯和团队习惯来进行约束</p>
<p>如果是团队工作，可以由整个团队共同讨论的编码规范结果</p>
<p>最终写入一个由团队共同使用的CLAUDE.md文件来约束AI的行为</p>
<p>相信你会用的越来越顺畅</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="5-学会接受不完美">5. 学会接受不完美<a href="https://dongfangzan.cn/2026/01/14/2026/vibe-coding-experience#5-%E5%AD%A6%E4%BC%9A%E6%8E%A5%E5%8F%97%E4%B8%8D%E5%AE%8C%E7%BE%8E" class="hash-link" aria-label="5. 学会接受不完美的直接链接" title="5. 学会接受不完美的直接链接">​</a></h3>
<p>有很多人都讨厌屎山代码，很多人吐槽AI写的屎山代码</p>
<p>但是事实上说句可能扎心的话，没有程序员会觉得自己写的代码是屎山，但是看别人写的都是屎山</p>
<p>看看自己身边的同事写的代码</p>
<p>再看看公司内部前人遗留下的代码</p>
<p><strong>有多少代码是真正让你看了会觉得写的真棒👍🏻？</strong></p>
<p><strong>有多少代码是让你看了后觉得就是写的一坨屎山？</strong></p>
<p>接受AI写的不完美，就像是你不得不接受几年请青涩的自己，和其他人写的不完美的代码</p>
<p><strong>真正实现价值，比写出完美的代码更重要</strong></p>
<h1>结束</h1>
<p>好了感谢你看到这里，接下来我会继续完善上面的项目，并继续探索AI Coding</p>
<p>欢迎留下你的宝贵意见，我们下期再见啦！</p>]]></content:encoded>
            <category>Claude Code</category>
        </item>
        <item>
            <title><![CDATA[怀疑 Vibe Coding？Claude Code 实战体验：AI 现在可以真正帮你写代码吗？]]></title>
            <link>https://dongfangzan.cn/2025/12/30/2025/ClaudeCode</link>
            <guid>https://dongfangzan.cn/2025/12/30/2025/ClaudeCode</guid>
            <pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[在上篇文章中2025年12月26日，我不再写代码了]]></description>
            <content:encoded><![CDATA[<p>在上篇文章中<a href="https://dongfangzan.com/2025/12/26/no-coding/" target="_blank" rel="noopener noreferrer">2025年12月26日，我不再写代码了</a></p>
<p>我讲述了我自己如何从 AI 辅助编程，转向 Vibe Coding 的心路历程</p>
<p>相信很多人都有类似经历，但是也会怀疑</p>
<ol>
<li><strong>Vibe Coding 到底有没有用？如何才能真正利用 Vibe Coding 来提升编程效率？</strong></li>
<li><strong>Vibe Coding 很贵，是否值得购买？有没有更便宜的方案？</strong></li>
<li><strong>受限于网络问题，国外模型不可用/公司内网环境无法对接外网，是否有解决方案？</strong></li>
</ol>
<p>在本篇文章中，我们就来一一解答这些问题</p>
<!-- -->
<p>首先，Vibe Coding 是一个基于 AI 的编程工具，它的主要作用是帮助开发者快速生成代码。</p>
<p>从 3 月份 Claude Code 发布以来，已经过去了 9 个月时间</p>
<p>Claude Code 的作者 Boris 在 X 上放出了自己过去 30 天里的真实生产数据：</p>
<blockquote>
<p>在过去 30 天里，我合并了 259 个 PR —— 共 497 次提交，新增约 4 万行代码，删除约 3.8 万行代码。而且，每一行代码都是由 Claude Code + Opus 4.5 编写的。</p>
<p>Claude 可以稳定地持续运行数分钟、数小时，甚至数天（借助 Stop hooks）。</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301325054.png" alt="" class="img_ev3q"></p>
<p>当然如果你觉得他是作者自卖自夸，但其实 Claude Code 是一个开源项目</p>
<p>所有人的提交记录都可以在代码仓库里查看</p>
<p><a href="https://github.com/anthropics/claude-code" target="_blank" rel="noopener noreferrer">https://github.com/anthropics/claude-code</a></p>
<p>毕竟数据不能作假，Vibe Coding 已经确确实实成为了很多人的选择</p>
<h1>2. 如何才能真正利用 Vibe Coding 来提升编程效率？</h1>
<p>分享一下我自己的一个真实编程环境</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301329689.png" alt="" class="img_ev3q"></p>
<p>这是字节跳动的 TRAE + Claude Code 组合</p>
<p>我不仅用它来写代码，还用来写文档，甚至还用他来学习。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="代码层面">代码层面<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#%E4%BB%A3%E7%A0%81%E5%B1%82%E9%9D%A2" class="hash-link" aria-label="代码层面的直接链接" title="代码层面的直接链接">​</a></h2>
<p>代码质量的好坏其实更多取决于你使用的模型好坏</p>
<p>这个与大家在网页上进行对话式的问答写出来的代码差别不大</p>
<p>区别更多的在于，<strong>Claude Code 能够直接读取你仓库中的代码，而不再依赖你手动复制粘贴</strong></p>
<p><strong>对于一个代码仓库，你可以直接让模型分析整个仓库的核心逻辑</strong></p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301339904.png" alt="Claude Code 分析仓库核心逻辑" width="600">
<p><strong>分析可能存在的问题，例如代码质量、性能问题、安全问题等</strong></p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301341583.png" alt="Claude Code 分析仓库问题" width="300">
<p><strong>并让其直接修复</strong></p>
<p>你甚至可以让模型直接操作 git 仓库，比如提交代码、创建发布、自动合并 PR、构建镜像并发布到仓库</p>
<p><strong>将原来需要折腾一整套 CICD 流程的时间大幅简化</strong></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301350873.png" alt="" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="文档层面">文档层面<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#%E6%96%87%E6%A1%A3%E5%B1%82%E9%9D%A2" class="hash-link" aria-label="文档层面的直接链接" title="文档层面的直接链接">​</a></h2>
<p>基于整个代码仓库，一次性生成 README 文档，帮助其他开发者快速了解项目的功能、安装方法、使用示例等。</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301347281.png" alt="" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="学习新知识">学习新知识<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#%E5%AD%A6%E4%B9%A0%E6%96%B0%E7%9F%A5%E8%AF%86" class="hash-link" aria-label="学习新知识的直接链接" title="学习新知识的直接链接">​</a></h2>
<p>对于不了解的新知识，Claude Code 可以直接帮助你学习并理解</p>
<p>比如，我希望学习 LangChain 这一开发框架</p>
<p>就可以让 Claude Code 直接讲解 LangChain 的基本概念、架构、使用方法等，<strong>并生成相应的示例代码</strong></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301405864.png" alt="" class="img_ev3q"></p>
<p><strong>还有更多高效的功能可以让你事半功倍</strong></p>
<h1>3. 如何使用 Claude Code</h1>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="31-安装-nodejs">3.1 安装 NodeJS<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#31-%E5%AE%89%E8%A3%85-nodejs" class="hash-link" aria-label="3.1 安装 NodeJS的直接链接" title="3.1 安装 NodeJS的直接链接">​</a></h2>
<p>Claude Code 是一个 NodeJS 模块，因此你需要先安装 NodeJS</p>
<p>你可以从 <a href="https://nodejs.org/" target="_blank" rel="noopener noreferrer">https://nodejs.org/</a> 下载并安装最新版本的 NodeJS</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="32-安装-claude-code">3.2 安装 Claude Code<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#32-%E5%AE%89%E8%A3%85-claude-code" class="hash-link" aria-label="3.2 安装 Claude Code的直接链接" title="3.2 安装 Claude Code的直接链接">​</a></h2>
<p>安装完成 NodeJS 后，你可以使用 npm 来安装 Claude Code</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm install -g @anthropic-ai/claude-code</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301410858.png" alt="" class="img_ev3q"></p>
<p>安装完成后，执行下面的命令，你就可以看到 Claude Code 的界面了</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">claude</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301412333.png" alt="" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="33-安装-ide-插件">3.3 安装 IDE 插件<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#33-%E5%AE%89%E8%A3%85-ide-%E6%8F%92%E4%BB%B6" class="hash-link" aria-label="3.3 安装 IDE 插件的直接链接" title="3.3 安装 IDE 插件的直接链接">​</a></h2>
<p>为了更方便地使用 Claude Code，你可以安装对应的 IDE 插件</p>
<p>取决于你的爱好，VS Code 或 JetBrains 等 IDE 都有对应的插件</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="vs-code-插件推荐">VS Code 插件（推荐）<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#vs-code-%E6%8F%92%E4%BB%B6%E6%8E%A8%E8%8D%90" class="hash-link" aria-label="VS Code 插件（推荐）的直接链接" title="VS Code 插件（推荐）的直接链接">​</a></h3>
<p>你可以在 VS Code 插件市场搜索 "Claude Code" 并安装</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301414658.png" alt="" class="img_ev3q"></p>
<p>然后点击代码窗口右上角的 "Claude Code" 图标，即可打开 Claude Code 界面</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301416186.png" alt="" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="jetbrains-插件">JetBrains 插件<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#jetbrains-%E6%8F%92%E4%BB%B6" class="hash-link" aria-label="JetBrains 插件的直接链接" title="JetBrains 插件的直接链接">​</a></h3>
<p>同样的，在 JetBrains 插件市场搜索 "Claude Code" 并安装</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301418550.png" alt="" class="img_ev3q"></p>
<p>相比之下，VS Code 插件的功能更强大，使用体验更好</p>
<p>安装好了之后，其实就可以直接使用 Claude Code 了</p>
<p>但是！Claude Code 原生的不仅受限于网络限制，而且价格并不便宜</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301423928.png" alt="" class="img_ev3q"></p>
<p>想要拿来高强度编码的话，即使是 20 美元的 Pro 订阅方案也经不住造</p>
<h1>4. 有没有更便宜的方案？</h1>
<p>其实国内很多模型，都提供了 Claude Code 对接方案</p>
<p>如果你已经买了相应的模型订阅，那么就可以直接使用</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="deepseek">DeepSeek<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#deepseek" class="hash-link" aria-label="DeepSeek的直接链接" title="DeepSeek的直接链接">​</a></h3>
<p><a href="https://api-docs.deepseek.com/zh-cn/guides/anthropic_api" target="_blank" rel="noopener noreferrer">https://api-docs.deepseek.com/zh-cn/guides/anthropic_api</a></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301427243.png" alt="" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="glm">GLM<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#glm" class="hash-link" aria-label="GLM的直接��链接" title="GLM的直接链接">​</a></h3>
<p><a href="https://docs.bigmodel.cn/cn/coding-plan/tool/claude" target="_blank" rel="noopener noreferrer">https://docs.bigmodel.cn/cn/coding-plan/tool/claude</a></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301429468.png" alt="" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="通义千问系列">通义千问系列<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#%E9%80%9A%E4%B9%89%E5%8D%83%E9%97%AE%E7%B3%BB%E5%88%97" class="hash-link" aria-label="通义千问系列的直接链接" title="通义千问系列的直接链接">​</a></h3>
<p><a href="https://bailian.console.aliyun.com/?tab=doc#/doc/?type=model&amp;url=2949529" target="_blank" rel="noopener noreferrer">https://bailian.console.aliyun.com/?tab=doc#/doc/?type=model&amp;url=2949529</a></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301431525.png" alt="" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cc-switch">CC Switch<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#cc-switch" class="hash-link" aria-label="CC Switch的直接链接" title="CC Switch的直接链接">​</a></h3>
<p>这里还推荐一个软件叫做 <strong>CC Switch</strong></p>
<p>它可以帮助你在不同的模型供应商之间切换，而不需要重新安装插件</p>
<p><a href="https://github.com/farion1231/cc-switch" target="_blank" rel="noopener noreferrer">https://github.com/farion1231/cc-switch</a></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301449681.png" alt="" class="img_ev3q"></p>
<h1>不能上外网，只能用内网的方案</h1>
<p>如果你的公司有严格的网络策略，不能直接上外网，只能通过内网访问模型 API</p>
<p>当然如果公司内部能够统一搭建 Claude Code 代理来给用自然是最好的</p>
<p>如果没有，你需要找公司的 AI 部门，询问是否能够提供一个内部的模型 API 地址</p>
<p>这个 AI 的地址分为两种情况</p>
<ol>
<li><strong>OpenAI 格式</strong>，通常是<code>/v1/chat/completions</code>结尾</li>
<li><strong>Claude 格式</strong>，通常是<code>/v1/messages</code>结尾</li>
</ol>
<p>如果你的内网 AI 接口支持第 2 种 Claude 格式，按照上述方法简单配置一下 API 地址，即可直接使用 Claude Code</p>
<p>但在当前的市场上，绝大多数模型都只支持第 1 种 OpenAI 格式</p>
<p>Claude Code 本身却不支持这种格式，所以你需要进行转换。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="claude-code-router">Claude Code Router<a href="https://dongfangzan.cn/2025/12/30/2025/ClaudeCode#claude-code-router" class="hash-link" aria-label="Claude Code Router的直接链接" title="Claude Code Router的直接链接">​</a></h3>
<p>你可以借助一个叫做 <strong>Claude Code Router</strong> 的工具来实现这一转换</p>
<p><a href="https://github.com/musistudio/claude-code-router" target="_blank" rel="noopener noreferrer">https://github.com/musistudio/claude-code-router</a></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301444075.png" alt="" class="img_ev3q"></p>
<p>在已经安装完 Claude Code 后，安装 Claude Code Router</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm install -g @musistudio/claude-code-router</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>并使用下面的命令启动配置 Claude Code Router</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ccr ui</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>在此，就可以将自己部署/第三方的 OpenAI 模型接入 Claude Code 中使用啦！
<img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512301446536.png" alt="" class="img_ev3q"></p>
<h1>最后</h1>
<p>从最初的怀疑到现在的高效使用，Vibe Coding 确实已经证明了它的价值。</p>
<p>这不是要让 AI 完全取代程序员，而是让程序员从重复的编码工作中解放出来，将更多精力投入到架构设计、产品思考和创新上。</p>
<p>当你不再纠结于代码的细节，而是专注于"要做什么"而非"怎么写"时，你的生产力将得到质的飞跃。</p>
<p><strong>Vibe Coding 不是终点，而是编程方式的新起点。在这个 AI 时代，学会与 AI 协作，将成为每个程序员的核心竞争力。</strong></p>
<p>与其观望和怀疑，不如亲自体验一下。也许过不了多久，你也会和我一样感叹：原来写代码可以这么轻松。</p>]]></content:encoded>
            <category>Claude Code</category>
        </item>
        <item>
            <title><![CDATA[2025年12月26日，我不再写代码了]]></title>
            <link>https://dongfangzan.cn/2025/12/26/2025/no-coding</link>
            <guid>https://dongfangzan.cn/2025/12/26/2025/no-coding</guid>
            <pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[那个改变一切的夜晚]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="那个改变一切的夜晚">那个改变一切的夜晚<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E9%82%A3%E4%B8%AA%E6%94%B9%E5%8F%98%E4%B8%80%E5%88%87%E7%9A%84%E5%A4%9C%E6%99%9A" class="hash-link" aria-label="那个改变一切的夜晚的直接链接" title="那个改变一切的夜晚的直接链接">​</a></h3>
<p>2025年12月26日，一个普通的冬天 ❄️</p>
<p>我坐在电脑前，像往常一样准备开始写代码。</p>
<p>但这一次，我没有打开 IDE，没有新建文件，没有敲下第一行 <code>import</code>。</p>
<p>我只是打开了一个软件</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512261612251.png" alt="" class="img_ev3q"></p>
<p>然后，我开始"说话"：</p>
<blockquote>
<p>"帮我写一个通用后台管理系统，就像 RuoYI 一样，支持用户管理、角色管理、菜单管理、操作日志管理……"</p>
</blockquote>
<p><strong>几分钟后</strong>，一个完整的系统，出现了在我的面前。</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512261615403.png" alt="" class="img_ev3q"></p>
<p>那一刻，我意识到：<strong>我不再需要"写"代码了。</strong></p>
<!-- -->
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="十年写代码的方式从未改变">十年：写代码的方式从未改变<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E5%8D%81%E5%B9%B4%E5%86%99%E4%BB%A3%E7%A0%81%E7%9A%84%E6%96%B9%E5%BC%8F%E4%BB%8E%E6%9C%AA%E6%94%B9%E5%8F%98" class="hash-link" aria-label="十年：写代码的方式从未改变的直接链接" title="十年：写代码的方式从未改变的直接链接">​</a></h3>
<p>2014年，我硕士毕业 🎓</p>
<p>这十年，我走过不少地方：国企、互联网公司、事业单位，后来又做了几年数字游民，接单写代码。</p>
<p>环境在变，节奏在变，但我的写代码方式始终没变：</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">需求来了 → 打开 Google → 搜索 "Java 实现 xxx" </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">→ 翻十几页结果 → 复制粘贴 → 改改改 → 跑通</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>搜索引擎是我最好的朋友，Stack Overflow/CSDN/博客园 是我的第二个家。</strong></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="chatgpt-带来的变革">ChatGPT 带来的变革<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#chatgpt-%E5%B8%A6%E6%9D%A5%E7%9A%84%E5%8F%98%E9%9D%A9" class="hash-link" aria-label="ChatGPT 带来的变革的直接链接" title="ChatGPT 带来的变革的直接链接">​</a></h3>
<p>2023年，ChatGPT 横空出世 🔥</p>
<p>我也开始用 AI 辅助写代码，但那时候 AI 对我来说，只是一个更聪明的搜索引擎：</p>
<ul>
<li>它给我答案</li>
<li>但代码还是要我自己改</li>
<li>Bug 还是要我自己调</li>
</ul>
<p><strong>但我依然是"写代码的人"，AI 只是帮我写得快了一点。</strong></p>
<p>2025年，国产 AI 模型开始崛起 🇨🇳</p>
<p>DeepSeek、智谱、月之暗面... 一个个名字刷屏。</p>
<p>最直接的感受：</p>
<table><thead><tr><th style="text-align:left">以前</th><th style="text-align:left">现在</th></tr></thead><tbody><tr><td style="text-align:left">🌍 需要翻墙</td><td style="text-align:left">✅ 国内直连</td></tr><tr><td style="text-align:left">⏳ 等待 loading</td><td style="text-align:left">✅ 秒级响应</td></tr><tr><td style="text-align:left">💸 价格昂贵</td><td style="text-align:left">✅ 便宜亲民</td></tr><tr><td style="text-align:left">🤔 中文一般</td><td style="text-align:left">✅ 原生优化</td></tr></tbody></table>
<p><strong>选择更多了，体验更好了，门槛更低了。</strong></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="真正的-vibe-coding">真正的 Vibe Coding<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E7%9C%9F%E6%AD%A3%E7%9A%84-vibe-coding" class="hash-link" aria-label="真正的 Vibe Coding的直接链接" title="真正的 Vibe Coding的直接链接">​</a></h2>
<p>到了 2025 年 3 月，Claude Code 出现了 🤖</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512261648560.png" alt="" class="img_ev3q"></p>
<p>号称是 Vibe Coding 的标杆，大家都说好用。</p>
<p>但我试了之后，真的是特别强，特别好用</p>
<p>但也还是那两个老问题：</p>
<table><thead><tr><th style="text-align:left">问题</th><th style="text-align:left">体验</th></tr></thead><tbody><tr><td style="text-align:left">🐌 <strong>卡</strong></td><td style="text-align:left">响应慢，经常转圈</td></tr><tr><td style="text-align:left">💰 <strong>贵</strong></td><td style="text-align:left">用不起，钱包受不了</td></tr></tbody></table>
<p>尤其是命令行编程的模式，跟我用了十年的"手写代码"习惯完全冲突。</p>
<p>打开 IDE、敲代码、改代码、跑代码，这套流程已经刻进肌肉记忆了。</p>
<p><strong>突然让我对着命令行说话，说实话，不愿意尝试。</strong></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="终于找到对味儿的-vibe-coding-">终于找到「对味儿」的 Vibe Coding 🎯<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E7%BB%88%E4%BA%8E%E6%89%BE%E5%88%B0%E5%AF%B9%E5%91%B3%E5%84%BF%E7%9A%84-vibe-coding-" class="hash-link" aria-label="终于找到「对味儿」的 Vibe Coding 🎯的直接链接" title="终于找到「对味儿」的 Vibe Coding 🎯的直接链接">​</a></h2>
<p>在我以为接下来的几年之内，我可能还是会继续用人写 + AI 辅助的方式来写大型项目。</p>
<p>也会尝试用 Vibe Coding 来写一些简单的脚本，或者是一些小项目。</p>
<p>但随着 GLM4.7 和 ZCode 的发布，好像一切都发生了一点点变化。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="首先国产模型也比肩最强了">首先国产模型也比肩最强了<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E9%A6%96%E5%85%88%E5%9B%BD%E4%BA%A7%E6%A8%A1%E5%9E%8B%E4%B9%9F%E6%AF%94%E8%82%A9%E6%9C%80%E5%BC%BA%E4%BA%86" class="hash-link" aria-label="首先国产模型也比肩最强了的直接链接" title="首先国产模型也比肩最强了的直接链接">​</a></h3>
<p>在大模型排行榜上，GLM4.7 超过了最新的 GPT-5.2，接近 gemini 和 Claude 等顶尖模型</p>
<p>很多大牛博主实测，GLM4.7 写出来的代码已经非常可用，甚至很好用了</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512261744062.png" alt="" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="其次是成本上的优化">其次是成本上的优化<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E5%85%B6%E6%AC%A1%E6%98%AF%E6%88%90%E6%9C%AC%E4%B8%8A%E7%9A%84%E4%BC%98%E5%8C%96" class="hash-link" aria-label="其次是成本上的优化的直接链接" title="其次是成本上的优化的直接链接">​</a></h3>
<p>购买官方的接口，3 倍的用量，1/7 的价格</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512261728950.png" alt="" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="再次是工具上的革新">再次是工具上的革新<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E5%86%8D%E6%AC%A1%E6%98%AF%E5%B7%A5%E5%85%B7%E4%B8%8A%E7%9A%84%E9%9D%A9%E6%96%B0" class="hash-link" aria-label="再次是工具上的革新的直接链接" title="再次是工具上的革新的直接链接">​</a></h3>
<p>Z Code 是一个编码工具，它将最优秀的 AI 智能体与你现有的工具完美结合，让你能够无缝地进行规划、编码、审查和部署。</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512261756412.png" alt="" class="img_ev3q"></p>
<p>他可以直接使用官方的 Claude 模型、智谱系列模型</p>
<p>还可以使用你自定义的模型，并将其直接接入到 Claude Code 中</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512261758366.png" alt="" class="img_ev3q"></p>
<p>针对于不喜欢命令行编程的用户，Z Code 提供了一个基于 GUI 的界面，你可以直接在界面上"说话"，直接看到结果</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512261800601.png" alt="" class="img_ev3q"></p>
<p>彻底解决了Claude Code 的三大痛点 💥</p>
<table><thead><tr><th style="text-align:left">痛点</th><th style="text-align:left">Claude Code</th><th style="text-align:left">Z Code</th></tr></thead><tbody><tr><td style="text-align:left">🐌 <strong>响应慢</strong></td><td style="text-align:left">经常卡顿，等待漫长</td><td style="text-align:left">⚡ 秒级响应，丝滑流畅</td></tr><tr><td style="text-align:left">💰 <strong>成本高</strong></td><td style="text-align:left">价格昂贵，钱包压力</td><td style="text-align:left">💵 便宜亲民，性价比高</td></tr><tr><td style="text-align:left">🖥️ <strong>命令行</strong></td><td style="text-align:left">黑框操作，学习门槛高</td><td style="text-align:left">🎨 GUI 界面，直观易用</td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="最后最重要的是速度上质的飞跃">最后，最重要的是速度上质的飞跃<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E6%9C%80%E5%90%8E%E6%9C%80%E9%87%8D%E8%A6%81%E7%9A%84%E6%98%AF%E9%80%9F%E5%BA%A6%E4%B8%8A%E8%B4%A8%E7%9A%84%E9%A3%9E%E8%B7%83" class="hash-link" aria-label="最后，最重要的是速度上质的飞跃的直接链接" title="最后，最重要的是速度上质的飞跃的直接链接">​</a></h3>
<p>对于我来说，GLM 4.7 带给我的最大的影响，其实是速度上的飞跃。</p>
<img src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202512261717314.png" alt="alt text" width="200">
<p>如果你有私有化部署的 GLM4.7-FP8 在 H100 上运行，decode 的速度会达到<strong>惊人的 200 tokens/秒</strong>。</p>
<p>即使是稍差一点的 H20，decode 的速度也会达到 <strong>160 tokens/秒</strong>。</p>
<p><strong>这是我用过速度最快的旗舰模型，没有之一。</strong></p>
<p>别小看这点速度的提升，它对编程体验的改变是颠覆性的 💥</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="为什么速度这么重要">为什么速度这么重要？🤔<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%9F%E5%BA%A6%E8%BF%99%E4%B9%88%E9%87%8D%E8%A6%81" class="hash-link" aria-label="为什么速度这么重要？🤔的直接链接" title="为什么速度这么重要？🤔的直接链接">​</a></h4>
<p><strong>想象一下这样的场景：</strong></p>
<table><thead><tr><th style="text-align:left">速度</th><th style="text-align:left">生成 1000 行代码</th><th style="text-align:left">你的体验</th></tr></thead><tbody><tr><td style="text-align:left">🐌 20 tokens/秒</td><td style="text-align:left">约 50 秒</td><td style="text-align:left">等待、走神、刷手机</td></tr><tr><td style="text-align:left">🚀 160 tokens/秒</td><td style="text-align:left">约 6 秒</td><td style="text-align:left">专注、连贯、心流状态</td></tr></tbody></table>
<p><strong>当代码以"说话"的速度生成时：</strong></p>
<ul>
<li>✅ <strong>思维不会被打断</strong> — 你的思路还在，代码就已经出来了</li>
<li>✅ <strong>反馈即时可见</strong> — 改完需求，马上看到结果</li>
<li>✅ <strong>沉浸式编程</strong> — 进入心流状态，效率翻倍</li>
<li>✅ <strong>多轮迭代更轻松</strong> — 一分钟内可以完成 3-5 次调整</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="真实感受对比-">真实感受对比 📊<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E7%9C%9F%E5%AE%9E%E6%84%9F%E5%8F%97%E5%AF%B9%E6%AF%94-" class="hash-link" aria-label="真实感受对比 📊的直接链接" title="真实感受对比 📊的直接链接">​</a></h4>
<p><strong>以前的体验：</strong></p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">我："帮我写一个用户登录功能"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">AI: ████████░░░░░░░░░░░░░░ 30%</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     [等待中... 喝口水... 看看手机...]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">AI: ████████████████░░░░░░ 60%</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     [还在生成... 思路都断了...]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">AI: █████████████████████ 100%</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     [终于好了，忘了刚才想说什么了]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>现在的体验：</strong></p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">我："帮我写一个用户登录功能"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">AI: █████████████████████ 100% ✨</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     [哇！这么快！继续...]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">我："把密码改成 BCrypt 加密"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">AI: █████████████████████ 100% ✨</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     [改好了！]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">我："再加个验证码功能"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">AI: █████████████████████ 100% ✨</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     [搞定！]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>现在，我们回到一个老生常谈的问题</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="程序员会被-ai-取代吗">程序员会被 AI 取代吗？<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E7%A8%8B%E5%BA%8F%E5%91%98%E4%BC%9A%E8%A2%AB-ai-%E5%8F%96%E4%BB%A3%E5%90%97" class="hash-link" aria-label="程序员会被 AI 取代吗？的直接链接" title="程序员会被 AI 取代吗？的直接链接">​</a></h2>
<p>我觉得会，也不会。</p>
<p>会被替代的，是"代码工人"。哪怕你精通十几种编程语言，如果每天的工作只是机械地写业务代码、CRUD、复制粘贴——那 AI 确实能做得更出色。</p>
<p>不会被替代的，是那些把时间花在解决问题上的人，这也回归了工程师本来的意义。</p>
<p><strong>Vibe Coding 🤖 的存在的价值就在于</strong></p>
<p><strong>🎯 让我们从"写代码的人"变成"解决问题的人"</strong></p>
<ul>
<li>不再纠结语法细节</li>
<li>不再重复造轮子</li>
<li>专注于业务逻辑和架构设计</li>
<li>把更多时间花在真正有价值的事情上</li>
</ul>
<p>这就是从今天开始，<strong>我不再"写"代码的原因。</strong></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="给还在犹豫的你-">给还在犹豫的你 💡<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E7%BB%99%E8%BF%98%E5%9C%A8%E7%8A%B9%E8%B1%AB%E7%9A%84%E4%BD%A0-" class="hash-link" aria-label="给还在犹豫的你 💡的直接链接" title="给还在犹豫的你 💡的直接链接">​</a></h2>
<p>如果你也在犹豫要不要尝试 Vibe Coding，我的建议是：</p>
<p>📌 <strong>现在就开始</strong></p>
<ol>
<li>📥 下载 Z Code（支持 macOS 和 Windows）</li>
<li>🔗 接入 GLM4.7</li>
<li>🗣️ 开始用自然语言写代码</li>
<li>🚀 体验效率提升</li>
</ol>
<p><strong>别等了，未来已经来了。</strong> 🌟</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="最后的话-">最后的话 📝<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E6%9C%80%E5%90%8E%E7%9A%84%E8%AF%9D-" class="hash-link" aria-label="最后的话 📝的直接链接" title="最后的话 📝的直接链接">​</a></h2>
<p>十年前，我学会了写代码。</p>
<p>十年后，我学会了不写代码。</p>
<p>这不是倒退，而是进步。</p>
<p><strong>因为我们终于可以专注于真正重要的事情——用技术解决问题，创造价值。</strong></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="欢迎关注-">欢迎关注 🌟<a href="https://dongfangzan.cn/2025/12/26/2025/no-coding#%E6%AC%A2%E8%BF%8E%E5%85%B3%E6%B3%A8-" class="hash-link" aria-label="欢迎关注 🌟的直接链接" title="欢迎关注 🌟的直接链接">​</a></h2>
<p>如果你喜欢这篇文章，欢迎关注我的公众号：</p>
<p><strong>「程序员阿赞」</strong> 👨‍💻</p>
<p>我会在这里分享：</p>
<ul>
<li>🔥 最新 AI 技术动态</li>
<li>💻 高效编程技巧</li>
<li>🚀 工具使用心得</li>
<li>📖 技术成长之路</li>
</ul>
<img src="https://dongfangzan.cn/img/wechat.png" alt="alt text" width="400">]]></content:encoded>
            <category>glm</category>
        </item>
        <item>
            <title><![CDATA[从零开始用 LangChain 开发 Agent 系列]]></title>
            <link>https://dongfangzan.cn/2025/12/23/2025/LangChain</link>
            <guid>https://dongfangzan.cn/2025/12/23/2025/LangChain</guid>
            <pubDate>Tue, 23 Dec 2025 10:00:00 GMT</pubDate>
            <description><![CDATA[- 1. LangChain 入门，构建第一个智能体]]></description>
            <content:encoded><![CDATA[<ul>
<li><a href="https://dongfangzan.cn/2025/12/23/2025/docs/ai/development/LangChain/2025-12-22-Introduction">1. LangChain 入门，构建第一个智能体</a></li>
<li><a href="https://dongfangzan.cn/2025/12/23/2025/docs/ai/development/LangChain/2025-12-23-Model">2. 详述 LangChain 中的 Model</a></li>
</ul>]]></content:encoded>
            <category>LangChain</category>
        </item>
        <item>
            <title><![CDATA[小米大模型Mimo-V2-Flash本地部署]]></title>
            <link>https://dongfangzan.cn/2025/12/19/2025/Mimo-V2-Flash</link>
            <guid>https://dongfangzan.cn/2025/12/19/2025/Mimo-V2-Flash</guid>
            <pubDate>Fri, 19 Dec 2025 10:00:00 GMT</pubDate>
            <description><![CDATA[Mimo-V2-Flash如何在本地部署？需要多少算力？效果如何？]]></description>
            <content:encoded><![CDATA[<p>Mimo-V2-Flash如何在本地部署？需要多少算力？效果如何？</p>
<p><img decoding="async" loading="lazy" src="https://fastly.jsdelivr.net/gh/bucketio/img16@main/2025/12/19/1766116861023-4101b4ef-6317-43ff-9001-fa8825593cd3.png" alt="" class="img_ev3q"></p>
<!-- -->
<p>话不多说直接开始，模型下载地址：</p>
<p><a href="https://modelscope.cn/models/XiaomiMiMo/MiMo-V2-Flash" target="_blank" rel="noopener noreferrer">https://modelscope.cn/models/XiaomiMiMo/MiMo-V2-Flash</a></p>
<p><a href="https://huggingface.co/XiaomiMiMo/MiMo-V2-Flash" target="_blank" rel="noopener noreferrer">https://huggingface.co/XiaomiMiMo/MiMo-V2-Flash</a></p>
<p>下载完成后，可以看到整个模型文件大小为292G</p>
<p><img decoding="async" loading="lazy" src="https://fastly.jsdelivr.net/gh/bucketio/img15@main/2025/12/19/1766116493702-9717ddeb-537a-4a34-9145-1fe19dfa6a03.png" alt="" class="img_ev3q"></p>
<p>在比较知名的开源模型中，与通义千问3-235B-FP8模型大小近似</p>
<p>简单做个对比如下</p>
<table><thead><tr><th></th><th>Mimo-V2-Flash</th><th>Qwen3-235B-FP8</th></tr></thead><tbody><tr><td>总参数</td><td>309B</td><td>235B</td></tr><tr><td>激活参数</td><td>15B</td><td>22B</td></tr><tr><td>模型大小</td><td>292G</td><td>221G</td></tr></tbody></table>
<p><em>Mimo-V2-Flash是在FP8上原生训练的而Qwen3并不是，所以这里仅对比同在FP8下的模型大小</em></p>
<p><img decoding="async" loading="lazy" src="https://fastly.jsdelivr.net/gh/bucketio/img6@main/2025/12/19/1766116580308-e22d7d3d-d489-4fd5-9de3-c644770f728e.png" alt="" class="img_ev3q"></p>
<h1>Day0 部署准备</h1>
<p>这里我的测试机器是一台8 * H100 80G的服务器
<img decoding="async" loading="lazy" src="https://fastly.jsdelivr.net/gh/bucketio/img19@main/2025/12/19/1766117229290-ff6e25a2-3933-4d9b-88db-9ee4bd4c92e3.png" alt="" class="img_ev3q"></p>
<p>根据模型卡片描述，我们可以直接使用sglang的python包进行启动。
<img decoding="async" loading="lazy" src="https://fastly.jsdelivr.net/gh/bucketio/img16@main/2025/12/19/1766117452922-5b624133-e829-4a7a-abf0-6686593018e4.png" alt="" class="img_ev3q"></p>
<p>为了环境更纯净，通常来说用docker可能更简单点</p>
<p>我们可以找到sglang最近的dev版本</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker pull lmsysorg/sglang:dev</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><em>截止到写稿时，sglang还没有发布正式支持Mimo-V2-Flash的新发布版本</em></p>
<p><em>小米牌面不行啊[吃瓜]，DeepSeek每次都是秒发</em></p>
<h1>部署开始</h1>
<p>1.使用下面的启动命令，将容器挂起</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker run -d --gpus all \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --shm-size=32g \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --ipc=host \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --network=host \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --name mimo-v2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -v /path/to/huggingface:/root/.cache/huggingface \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  lmsysorg/sglang:dev \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  bash -c "while true; do sleep 3600; done"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>2.进入容器</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker exec -it mimo-v2 bash</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>3.卸载容器内已经按照好的sglang，并按照包含了mimo-v2-flash的sglang</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip uninstall sglang -y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pip install sglang==0.5.6.post2.dev8005+pr.15207.g39d5bd57a \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --index-url https://sgl-project.github.io/whl/pr/ \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --extra-index-url https://pypi.org/simple</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>4.执行下面的命令来启动模型</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">export SGLANG_ENABLE_SPEC_V2=1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nohup python3 -m sglang.launch_server \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --model-path /root/.cache/huggingface/hub/XiaomiMiMo/MiMo-V2-Flash \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --served-model-name mimo-v2-flash \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --pp-size 1 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --dp-size 2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --enable-dp-attention \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --tp-size 8 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --moe-a2a-backend deepep \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --page-size 1 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --trust-remote-code \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --tool-call-parser mimo \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --chunked-prefill-size 16384 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --reasoning-parser qwen3 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --context-length 262144 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --attention-backend fa3 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --speculative-algorithm EAGLE \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --speculative-num-steps 3 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --speculative-eagle-topk 1 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --speculative-num-draft-tokens 4 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --host 0.0.0.0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      --port 8000 &gt; app.log 2&gt;&amp;1 &amp;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><em>需要注意的是，官网放出的--enable-mtp，在H100上无法正常启动</em></p>
<p>最后我们如果看到下面的日志，就表明启动成功啦！
<img decoding="async" loading="lazy" src="https://fastly.jsdelivr.net/gh/bucketio/img4@main/2025/12/19/1766118698349-cad3eba9-e7d2-43ca-8a81-7907222e0174.png" alt="" class="img_ev3q"></p>
<p>找一个AI客户端来看使用成果</p>
<p><img decoding="async" loading="lazy" src="https://fastly.jsdelivr.net/gh/bucketio/img19@main/2025/12/19/1766118913056-7f02982d-dd7f-4dfd-9887-d7d033b26437.png" alt="" class="img_ev3q"></p>
<p>可以看到Decode的速度是非常快的</p>
<p>最快可以达到<strong>170tokens/s</strong></p>
<p>平均也达到了<strong>110tokens/s</strong>，比较惊喜，也超过了在默认启动参数下Qwen3-235B</p>
<p><img decoding="async" loading="lazy" src="https://fastly.jsdelivr.net/gh/bucketio/img17@main/2025/12/19/1766120005204-17134d06-f3b0-4ee7-93db-3034ede0930b.png" alt="" class="img_ev3q"></p>
<h1>深度思考</h1>
<p><code>Mimo-V2-Flash</code>是一个支持切换思考和非思考的模型</p>
<p>通过模型卡片描述可以看到</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl -i http://localhost:9001/v1/chat/completions \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -H 'Content-Type:application/json' \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -d  '{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "messages" : [{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "role": "user",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "content": "Nice to meet you MiMo"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            }],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "model": "mimo-v2-flash",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "max_tokens": 4096,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "temperature": 0.8,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "top_p": 0.95,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "stream": true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "chat_template_kwargs": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "enable_thinking": true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>通过参数来控制思考开关</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">"chat_template_kwargs": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "enable_thinking": true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>与其他模型不同，在现阶段本地部署的<code>Mimo-V2-Flash</code></p>
<p><strong><code>enable_thinking</code>是必须要传的</strong></p>
<p>否则会导致模型回复的内容直接解析到了思考内容中</p>
<p>这可能是由于早期版本使用的通义千问的reasoning-parser导致的问题，待后续修复</p>
<p><img decoding="async" loading="lazy" src="https://fastly.jsdelivr.net/gh/bucketio/img5@main/2025/12/19/1766119266617-751bb723-6f32-4324-b391-ae161eb4e077.png" alt="" class="img_ev3q"></p>
<h1>工具调用</h1>
<p>在不开启深度思考模式时，目前工具调用可以正常使用</p>
<p><img decoding="async" loading="lazy" src="https://fastly.jsdelivr.net/gh/bucketio/img7@main/2025/12/19/1766119440710-fe3596ee-1825-49bd-bf94-9ba243f37b9b.png" alt="" class="img_ev3q"></p>
<p>开启深度思考后，如果temperature过高，很大程度上会导致工具调用失败
<img decoding="async" loading="lazy" src="https://fastly.jsdelivr.net/gh/bucketio/img11@main/2025/12/19/1766119672069-76ed0d99-9b97-4108-a18b-456427b2bbe5.png" alt="" class="img_ev3q"></p>
<p>推荐temperature=0.3时
<img decoding="async" loading="lazy" src="https://fastly.jsdelivr.net/gh/bucketio/img11@main/2025/12/19/1766119882146-34aef78c-b848-4a23-b0b8-7f7c3161ee38.png" alt="" class="img_ev3q"></p>
<p>在使用时尽量按照官方文档中推荐的采样参数进行设置</p>
<blockquote>
<p>IMPORTANT
<strong>推荐的采样参数</strong>：
top_p=<strong>0.95</strong>
temperature=<strong>0.8</strong> 适用于数学、写作、Web 开发
temperature=<strong>0.3</strong> 适用于自主任务（例如，氛围编码、工具使用）</p>
</blockquote>
<h1>结尾</h1>
<p>好啦，这就是<code>Mimo-V2-Flash</code>在Day0的一些本地部署测试</p>
<p>目前还存在一些小bug，应该会在后续版本中修复，随着持续优化也会有更强的性能</p>
<p>接下来一段时间我这边也会持续使用一段时间这个模型</p>
<p>看一下在写作、编程等实际使用场景的效果如何</p>
<p>感谢你看到这里啦！</p>]]></content:encoded>
            <category>llm</category>
            <category>mimo</category>
        </item>
        <item>
            <title><![CDATA[真·生产级满血版Deepseek-r1 671B部署实例2-后续问题、调优以及压测]]></title>
            <link>https://dongfangzan.cn/2025/02/11/2025/DeepSeek-2</link>
            <guid>https://dongfangzan.cn/2025/02/11/2025/DeepSeek-2</guid>
            <pubDate>Tue, 11 Feb 2025 10:00:00 GMT</pubDate>
            <description><![CDATA[上一篇文章20250208 真·生产级满血版Deepseek-r1 671B部署实例]]></description>
            <content:encoded><![CDATA[<p>上一篇文章<a href="https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek">20250208 真·生产级满血版Deepseek-r1 671B部署实例</a></p>
<p>我们在2台 8 * H100 80G上成功的完成了部署并使用了几天，并在真实的生产环境上运行了几天，也遇到了一些问题，随之对相应的问题进行了一些调整和优化，本文就来详细说一说。</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="vllm上恼人的性能问题">VLLM上恼人的性能问题<a href="https://dongfangzan.cn/2025/02/11/2025/DeepSeek-2#vllm%E4%B8%8A%E6%81%BC%E4%BA%BA%E7%9A%84%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98" class="hash-link" aria-label="VLLM上恼人的性能问题的直接链接" title="VLLM上恼人的性能问题的直接链接">​</a></h2>
<blockquote>
<p>首先声明，应该不是引擎有问题，应该是我菜还没找对办法，这个引擎是相当强大的！</p>
</blockquote>
<p>VLLM在2025年1月27日公布了V1版本，具体的详细内容可以看</p>
<p><a href="https://blog.vllm.ai/2025/01/27/v1-alpha-release.html" target="_blank" rel="noopener noreferrer">https://blog.vllm.ai/2025/01/27/v1-alpha-release.html</a></p>
<p>主要就是为了解决过去V0版本的性能问题和大量技术债务，但是遗憾的是，在当前这个时间点官方貌似并没有在V1引擎上支持Deepseek</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202502111150081.png" alt="" class="img_ev3q"></p>
<p>所以在上一篇文章中，我也只能无奈选择退回到V0引擎的版本。</p>
<p>听闻有些技术能力强的大厂哥哥们已经搞定了这个问题，这个确实佩服，点赞👍！</p>
<p>起初在部署起来的时候是非常让人兴奋的，简单看了一下VLLM后台的日志，每秒的生成速度在21-30之间波动，人肉平均一下就是25tokens/s左右（没有详细测，人肉估计），人肉检测首个token返回时间大概在1.8s-1.9s左右，已经达到了跟官网网页上的速度类似的速度。</p>
<p>但是随着开放使用之后，问题就来了，在处理长上下文的时候（4k以上），出现了一种偶发性的降速，并且这个请求直到处理完之前，都会一直保持1 tokens/s以下</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202502111150342.png" alt="" class="img_ev3q"></p>
<p>在<code>nvidia-smi</code>中可以看到所有GPU的利用率会直接冲到100%，直到这个超卡的请求全部生成完，才会恢复正常。</p>
<p>实体感受就像一个人前一秒在滔滔不绝的疯狂输出，下一秒他突然就卡壳了。</p>
<p>如果单纯只是这一个请求卡住了，那么影响的是这一个人的使用，倒还勉强能接受。</p>
<p>可惜的是接下来进来的每一个请求都会非常慢，有一种一个坏学生把全班的好学生都教坏了的既视感😂。</p>
<p>如果长prompt无法使用，那么就注定在RAG这个企业内部最常用的AI场景出现了死局。</p>
<h1>二、调整思路</h1>
<p>鉴于上述问题，希望有感兴趣的大佬也可以来指导我一下，感激不尽，我这边也会和开源社区继续研究推理引擎，把这个问题解决掉。</p>
<p>马斯克说，很多即使很优秀的工程师都会在已有的路径上持续去优化一个也许不该存在问题，这就是路径依赖。通往罗马的路不止只有一条，可以解决这个问题的方法也可以让问题本身不存在。</p>
<p>抱着这样的想法再来回头重新审视问题，重新找到Deepseek的官方仓库：<a href="https://github.com/deepseek-ai/DeepSeek-V3" target="_blank" rel="noopener noreferrer">https://github.com/deepseek-ai/DeepSeek-V3</a>，可以看到除了第一个以外，Deepseek推荐的第一个是一个叫作SGLang的推理引擎。</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202502111151981.png" alt="" class="img_ev3q"></p>
<p>查看这个引擎的文档清晰的写到：SGLang从一开始就在与Deepseek团队深度合作，完成了Deepseek V3的适配工作，并且给出的详细的部署步骤。</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202502111151416.png" alt="" class="img_ev3q"></p>
<p>部署文档可见：<a href="https://github.com/sgl-project/sglang/tree/main/benchmark/deepseek_v3" target="_blank" rel="noopener noreferrer">https://github.com/sgl-project/sglang/tree/main/benchmark/deepseek_v3</a></p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202502111151710.png" alt="" class="img_ev3q"></p>
<p>有了这个，我们只需要重新调整一下部署脚本，把相应的Deepseek V3换成Deepseek R1即可（tokennizer是一样的，所以可以通用）</p>
<p>在两个节点上分别执行下面的命令，过一会就看得到</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 在两个节点上分别执行命令</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 节点1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker run </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">gpus </span><span class="token builtin">all</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">shm</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">size 128g \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">network</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">host \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">v </span><span class="token operator" style="color:#393A34">~</span><span class="token operator" style="color:#393A34">/</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cache</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">huggingface</span><span class="token punctuation" style="color:#393A34">:</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">root</span><span class="token operator" style="color:#393A34">/</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cache</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">huggingface \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">name sglang_multinode1 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">d \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ipc</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">host </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">restart always \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">privileged </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_IB_HCA</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">mlx5_1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_6</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_7</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_8 </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_P2P_LEVEL</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">NVL </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_IB_GID_INDEX</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">  </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_IB_CUDA_SUPPORT</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_IB_DISABLE</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_SOCKET_IFNAME</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">ibs11</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs12</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs13</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs14</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs15</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs16</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs17</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs18 </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_DEBUG</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">INFO </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_NET_GDR_LEVEL</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">egistry</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cn</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">hangzhou</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">aliyuncs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">com</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">dongfangzan</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">sglang</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">v0</span><span class="token punctuation" style="color:#393A34">.</span><span class="token number" style="color:#36acaa">4.2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">post3</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">cu124 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">python3 </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">m sglang</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">launch_server </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">model</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">path </span><span class="token operator" style="color:#393A34">/</span><span class="token plain">root</span><span class="token operator" style="color:#393A34">/</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cache</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">huggingface</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">hub</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">deepseek</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ai</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">DeepSeek</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">R1 </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">served</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">model</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">name deepseek</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">r1 </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">tp </span><span class="token number" style="color:#36acaa">16</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">dist</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">init</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">addr ip1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">20000</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">nnodes </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">node</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">rank </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">trust</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">remote</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">code </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">host </span><span class="token number" style="color:#36acaa">0.0</span><span class="token number" style="color:#36acaa">.0</span><span class="token number" style="color:#36acaa">.0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">port </span><span class="token number" style="color:#36acaa">8000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 节点2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker run </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">gpus </span><span class="token builtin">all</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">shm</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">size 128g \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">network</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">host \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">v </span><span class="token operator" style="color:#393A34">~</span><span class="token operator" style="color:#393A34">/</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cache</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">huggingface</span><span class="token punctuation" style="color:#393A34">:</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">root</span><span class="token operator" style="color:#393A34">/</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cache</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">huggingface \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">name sglang_multinode1 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">d \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ipc</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">host </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">restart always \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">privileged </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_IB_HCA</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">mlx5_1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_6</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_7</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mlx5_8 </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_P2P_LEVEL</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">NVL </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_IB_GID_INDEX</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">  </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_IB_CUDA_SUPPORT</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_IB_DISABLE</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_SOCKET_IFNAME</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">ibs11</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs12</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs13</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs14</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs15</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs16</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs17</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ibs18 </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_DEBUG</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">INFO </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">e NCCL_NET_GDR_LEVEL</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">egistry</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cn</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">hangzhou</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">aliyuncs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">com</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">dongfangzan</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">sglang</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">v0</span><span class="token punctuation" style="color:#393A34">.</span><span class="token number" style="color:#36acaa">4.2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">post3</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">cu124 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">python3 </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">m sglang</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">launch_server </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">model</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">path </span><span class="token operator" style="color:#393A34">/</span><span class="token plain">root</span><span class="token operator" style="color:#393A34">/</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cache</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">huggingface</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">hub</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">deepseek</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">ai</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">DeepSeek</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">R1 </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">served</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">model</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">name deepseek</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">r1 </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">tp </span><span class="token number" style="color:#36acaa">16</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">dist</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">init</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">addr ip1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">20000</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">nnodes </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">node</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">rank </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">trust</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">remote</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">code </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">host </span><span class="token number" style="color:#36acaa">0.0</span><span class="token number" style="color:#36acaa">.0</span><span class="token number" style="color:#36acaa">.0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">port </span><span class="token number" style="color:#36acaa">8000</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>神奇的事情就自然而然的发生了，引擎一次性启动成功</p>
<p>并且经过测试，token的生成速度达到了31+tokens/s，较原方案大幅提升了<strong>20%+</strong></p>
<p><img decoding="async" loading="lazy" src="https://cdn.nlark.com/yuque/0/2025/png/141952/1739246806768-537db3b0-4035-4054-b5d8-ac35c8974c63.png" alt="" class="img_ev3q"></p>
<p>经过一天多的使用，也没有再次出现过降速和卡顿的问题。</p>
<h1>三、压测</h1>
<p>从直观感受来目测系统响应速度有两个点</p>
<ol>
<li>当用户提了问题，AI给出的第一个token的延时时间，也就是常说的<strong>Time To First Token（TTFT）</strong></li>
<li>字符输出的速度，也就是在论文里常看到的Output Thoughput token/s</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="单个请求">单个请求<a href="https://dongfangzan.cn/2025/02/11/2025/DeepSeek-2#%E5%8D%95%E4%B8%AA%E8%AF%B7%E6%B1%82" class="hash-link" aria-label="单个请求的直接链接" title="单个请求的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ttft">TTFT<a href="https://dongfangzan.cn/2025/02/11/2025/DeepSeek-2#ttft" class="hash-link" aria-label="TTFT的直接链接" title="TTFT的直接链接">​</a></h3>
<p>首先简单用one-api去测试一下系统的反应，首次未命中缓存时，大概在1.9s左右，后续命中缓存的情况下，降低到只有0.43秒。</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202502111212307.png" alt="" class="img_ev3q"></p>
<p>针对TTFT的测试，随机生成16/256/1024/2048/4096/8192/16384/32768/65536个随机token来当做输入prompt，模拟在不同长度输入的场景下，用户能接收到的第一个字符的平均等待时间，时间越短，用户见到第一个token速度越快。</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202502111735060.png" alt="" class="img_ev3q"></p>
<p>这里可以看到一个非常有趣的现象，在长度为8192个token之前的TTFT增长曲线是比较平缓的，到8192之后陡然上升，而且呈现一个很有意思的趋势，就是16384是8192的2倍，5.11接近2.94的2倍；32769是8192的4倍，11.78接近2.94的4倍；貌似是一个线性的增长关系，这个8192就是一个比较有趣的数字。</p>
<p>回头再看系统在启动过程中打印的日志中包含了这样一个数字，<code>chunked_prefill_size=8192</code>，那么大概率这里就跟这个chunked_prefill_size有关。</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202502111544136.png" alt="" class="img_ev3q"></p>
<p>找Deepseek一问，便可可得知，这个参数是做显存优化用的，较小的chunk_size可以节约显存，但是没关系我们都已经有2<em>8</em>H100了，直接拉大来提升速度就会是一个不错的优化选择，具体的优化细节我们有机会再来讨论。</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202502111546743.png" alt="" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="output-thoughput-tokens">Output Thoughput token/s<a href="https://dongfangzan.cn/2025/02/11/2025/DeepSeek-2#output-thoughput-tokens" class="hash-link" aria-label="Output Thoughput token/s的直接链接" title="Output Thoughput token/s的直接链接">​</a></h3>
<p>上文已经提到过，单个请求的输出速度基本保持在了31-32token/s之间，肉眼可见的快速。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="多请求并发">多请求并发<a href="https://dongfangzan.cn/2025/02/11/2025/DeepSeek-2#%E5%A4%9A%E8%AF%B7%E6%B1%82%E5%B9%B6%E5%8F%91" class="hash-link" aria-label="多请求并发的直接链接" title="多请求并发的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ttft-1">TTFT<a href="https://dongfangzan.cn/2025/02/11/2025/DeepSeek-2#ttft-1" class="hash-link" aria-label="TTFT的直接链接" title="TTFT的直接链接">​</a></h3>
<p>这次我们使用1024个随机输入token，对模型的进行10/20/30/40/50/100并发进行测试，来看分别在不同并发量的情况下，token最大的生成速度和TTFT。</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202502111736135.png" alt="" class="img_ev3q"></p>
<p>可以看到当并发请求上到超过50并发时，系统的等待时间已经超过10秒了，这时候给人的感觉已经是很慢了，再往上拉高并发数量也基本失去了意义</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="output-thoughput-tokens-1">Output Thoughput token/s<a href="https://dongfangzan.cn/2025/02/11/2025/DeepSeek-2#output-thoughput-tokens-1" class="hash-link" aria-label="Output Thoughput token/s的直接链接" title="Output Thoughput token/s的直接链接">​</a></h3>
<p>这块基本上就是纯属娱乐一下了</p>
<p>系统的最大吞吐量，当以1024个随机token输入，500并发时出现将近1192.06token/s（当然这个数据只是估算出来的，并没有太多实际的价值）</p>
<p><img decoding="async" loading="lazy" src="https://cdn.nlark.com/yuque/0/2025/png/141952/1739265256396-e2b6762a-c7cb-47f2-8f6b-bd8c2784af9a.png" alt="" class="img_ev3q"></p>
<p>在我们使用默认参数的情况下，能看到日志中最大可以处理的请求数量为78。</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202502111731832.png" alt="" class="img_ev3q"></p>
<p>这个参数在默认的时候是没有设置的，Deepseek给出的推荐值如下图所示</p>
<p><img decoding="async" loading="lazy" src="https://hx-zsy.oss-cn-chengdu.aliyuncs.com/img/202502111742959.png" alt="" class="img_ev3q"></p>
<h1>四、结语</h1>
<p>在完成Deepseek-r1的部署之后，我们发现的VLLM中可能存在的潜在问题目前无法解决，随后替换成了SGLang来暂时让系统达到可用状态。</p>
<p>接下来对整个系统进行了一系列的测试，在测试过程中发现了很多有意思的参数设置，比如chunked_prefill_size和max_running_reuquest在不同场景下可能影响着系统的延迟和吞吐能力，这将会成为我们接下来的进行优化的目标，感谢你看到这里。</p>]]></content:encoded>
            <category>llm</category>
            <category>deepseek</category>
        </item>
        <item>
            <title><![CDATA[真·生产级满血版Deepseek-r1部署实例]]></title>
            <link>https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek</link>
            <guid>https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek</guid>
            <pubDate>Sat, 01 Feb 2025 10:00:00 GMT</pubDate>
            <description><![CDATA[满血版DeepSeek-R1怎么部署？在这篇文章里我们好好聊一聊]]></description>
            <content:encoded><![CDATA[<p>满血版DeepSeek-R1怎么部署？在这篇文章里我们好好聊一聊</p>
<p>本来过年前乐乐呵呵的准备出去旅游的，Deepseek来了一波疯狂炸场，把全世界的目光都吸引了过来，这波泼天的流量也是没谁了。</p>
<p>年后没多久，因为一些特定的原因，官网的Deepseek基本都变成了这个状态</p>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/busy-d44ad6ca7f2724a5f4ed4a6d5cb4725f.png" width="568" height="276" class="img_ev3q"></p>
<p>手上刚好有几张算力还算可以的显卡，经过一系列折腾，终于完成了完整版Deepseek-r1 671B满血版生产级的部署，本来就来详细讲一下。</p>
<blockquote>
<p>本人水平有限，部署过程中对各种设备、模型、网络等内容的理解有限，还望各位高手指正</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="一准备工作">一、准备工作<a href="https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek#%E4%B8%80%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C" class="hash-link" aria-label="一、准备工作的直接链接" title="一、准备工作的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="11-模型文件">1.1 模型文件<a href="https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek#11-%E6%A8%A1%E5%9E%8B%E6%96%87%E4%BB%B6" class="hash-link" aria-label="1.1 模型文件的直接链接" title="1.1 模型文件的直接链接">​</a></h3>
<p>生产级满血版的Deepseek-r1，我们应该直奔他的原版仓库</p>
<ol>
<li><a href="https://huggingface.co/deepseek-ai/DeepSeek-R1" target="_blank" rel="noopener noreferrer">huggingface的Deepseek-r1仓库地址</a></li>
</ol>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(7)-d6869a3d827c5782a45233c15a5e805e.png" width="2678" height="1394" class="img_ev3q"></p>
<ol start="2">
<li><a href="https://modelscope.cn/models/deepseek-ai/DeepSeek-R1" target="_blank" rel="noopener noreferrer">魔塔社区(modelscope)的Deepseek-r1仓库地址</a></li>
</ol>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(8)-8f17e91b52d49bad059e2acbf9f2640b.png" width="2758" height="1490" class="img_ev3q"></p>
<p>因为网络的问题，我们可以通过魔塔社区去下载可能会比较快，毕竟这个模型还是很大的。</p>
<p>这里可能需要澄清一下，网络上各种文章说Deepseek-r1的文件大小有600G、700G还有1T以上可能都不是非常准确。</p>
<p>实际在linux下载后的完整版是642G</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUQAAAAoCAYAAACGq4NTAAAACXBIWXMAABYlAAAWJQFJUiTwAAAUa0lEQVR4nO2deVQbR57Hv2oJiUNIAoRAnMKAOQzYQIxP8EnsGHzFuZw78cvuziabzCa7+zKZ3c2bybxJ9r3JzGaSNxMnL5kdO2PHmTi+YhvHN7bxDQZjMDYYgzhkQCCBEJKQ1PuHoNWtA4QkY2z3569uqqu6Sl397arf71cFx6JXkmCZ0lisZii7ruB0zR/RO3DeKT0qbBlK532AkKCIe1C7+x0SbV012FfxJoYtKggCErBm4WeQh6d5VdqQUYsWVSVO1/4eesMNAEB46ByUzv8IEmGMPyvO4gHaIRIHGozo6CfBJYCFigDkxvDAJVxfz5vc6rF4A5fgQRH9CBJkX6Nf3wW1tgUGkw4AEMgXIkKciCCB+B7X8mGERLemGdVNu9HefQHawSqXV6UllCA0KHKS68YCAOIgDjbOCvT4elYQ7yMIggeJMIYdaUwZODBbh9HUfhDG4VaXV2Ql/Quypz0GLjdgkuvG4g2sILKw+ACX4ILgCJz+Hi9bg7zpTyNOOpMVw/sIDmtDZGFhYbHhxrTIwsLC8vDBCiILCwvLCKwNkYWF5YFh38kq1DYqAQCrCnMxc3r8hPKzgsjCch9iMVtRef02ACAwMADZKRN78R9EBgYN2H+6mjpXyKUTLuOuCKLVSqKtqw+d3b1IkEdCLvU8Rk6nN6ChRQUAkIqFSIxx3SiL2Yrbqh40KlVQ9+oQGRGKGGkY0hQx4PHGtwRYzFa092jQ3qVGm0qNwEAB4qMiEBcVhghxKDgcj6v8wNE3oMetti6YzWZ09mgRHx0BfgAXcqkEEWIhOA/wj2M2W1Hb1IY7vRqo+wYRERaCuMgwyGXhCBeF3OvqUWj1Q/hqTzkAIFjAx+//7dlJua+rvjFKsCAAkeEihIuEIIjx+8ioqBMjUdIJUeGIDBd5XbdjF+uo4/zMRIhDgyZcht8EUTswhJOX69HQ3IFmVQ+sVtvfSwpnYnVRrtP1zW1d0AwaAADJsTKIhLbgSaVKjS9/OAEAyEqOwxvPLGfkM5nM+HrPSVy5oXRZj2ABH5vWFWFGSpzbupZfbsC2srNu02XhIrz9/EpIQoPdXvMgc725HX/dd8ZteoRYiLWL81CQNW0Sa3X3udLQii37TkNvNLlMz0yKwUurC7160R4UxusbAEAQwJpFeVg+Jws8hyUhJAk0Ku/gdFUDLtbdonQCANYsysWqhTO9qpfZbMXh87XU+WMLvCvHL4JYUX0D3xyoYDRuFI120GWezTtPQKPTAwDe2lgMkTB23PuotTr8bstB9PW7LhMA9EYTPt1xBL95fQOkklBG2pDRhC93nkBdc8eY9+nq7cd//ul7vPfqGsRESsat18OGWqvD13vKcf5qE15ZWwhhsOcrAaYqrapefP79sTGvqWvuwC8+24HX1i9BbnriJNXs/sNqBXYfr8TVhlb8+yuljLRPtx1C3e1Ov9/zbM1NmM02AVLIIxAnC/eqHJ8E0Wyx4pNvynCzrYvxd4kwGPHRtulnlouRmslkocQQABI8nOt/V3aeIYZFuWmYlRYPgYCPS7XNOFlVT4ny33+6iJ89tZSR/4cjlxhimBgVjsUFGUiQS2E0DqPmZhvKKmoAAFJxKMJED+cIkQ6PR2DjirnQDAyhtVONm60qagR17VY7PvnbIfzytbX3uJa+s+vIBeo4WMDHqsIczEiOg6Z/ELWNbTh6sZ5KjwwLdVXEQ8do3wAAkiTRqx3E+dpbUGtty0qbOnpwuqoBC3Pt68IHDUa/14Mkgf2n7LbDkqJZXpflkyAePlfLEENZuAgvlS5AcnzUmPnau9TUcbCAj5Ag50h/V2xavwgfbzmAdrUGbz+3EtPiZFRacpwMYlEQdh+vBAA0dzBFuqdvAKeu3KDOl81Ox4blcxi2jmlxMqQrorG//Ape31iMQD67wmB+VgoWzJpOnQ8PW7C9rAIVNU0AAGVXH642Ksc16pMkvLbL+pLX0/w32+395fFl+dRLLJdKkDEtFoV56dhRdhbrlxcgLmr80ce9bO9k4dg3AKC0KBeffXuYGnicq25kCGIAlwuFPAILZk1HfqYCxy9ex75y12vAPaWuSUkNsCTCYGQle+9g8loQNQN67CuvpM5Xzs/G2sX5Hj3Ils4e6ljhxmniCj6fh3deLIHBNEzZHOk8kplECWL/oAEWqxVcwmbD+J42ApCFi/Dko3Nd3iM9KQbpSexaYXcEBHDx4upCGM1mXK5rAQBsO3gOv30j3unZN7beweGztWhRqaHR6RHI5yFWKsGcnFQU5qWN2VcmmpckSXz01T5YSRJJMZF4orgAxy/Xoaq+Bbc71QgW8KGIkeLReVlOz9disVLTLQAun3+0VIy3nl855m8zme31hCsNrdg/IjZpCjmeKC6YeCEThCA4eKK4AL/+YjcAoK27j5H+zkur/O6U21d+hTouKZzp08fEa0HcfvAcNT2VS8VYuzjP44rc6uimjpPjZWNc6QyfzwWfz3WZFhrENHZzYK/QdZrd4sni2RO6J4szaxflU4LY1z8IjU6PsBEnFEkCu49dwqFztYw8BpMZTR09aOrowfmam3jz2ZUQCJhd0Nu8VpJEy51eAMCA3ghwOCivaqDS9UYT6po7UNfcgQ3L8lE8N5tK43IJ8HgEJYqX6pqxcn6Ox7/FvWivJ1xrbIOyyyZIaQr5hPL6glRsNykYTGZGmr/FsL2rD7c7bTNOHo/AvJxUn8rzaqUKSQLVN+27e/zDhqXQ6Q04d7URX+w8jj/vOIp95VXo7NG4zN+ktAuiN7FC7lDesU/FJcJgajpsMVsZD2bGNPceaBbPkIWLkEibOvZqBqjjyvpmxgvO4xFQyCMQRgtbaerowYHT9i+7P/KOotHpUV7VAIIAUuNkSI2PAkHr6TuPXkZ3bz8jT9Y0u1Nv9/FKbNl3Cjq9we09/FVnf7TXHbW32qnj6ZMoiF19Wuo47C6HKh08Y7cdLi/I8ijkbiy8GiFqaQ4RggB6Nf341eajjGuqG5XYf6oaTxcXYElBJvV3i9lKGV0BuI0z9IbaJnsHoMdHddNe1mAB36MYKZbxiYwQUaOybs0AkuOjYLFYsb3MvontgpwUbFw1nwq/qLzegi92HgcAHDpXi+J5WZSX2pe8jgTyeXjv1dWQRdhiYNVaHT786kfohmwiV3amBi+sXkhd/0RxAWoaldSsp6KmCRU1TSjKTcNjC3PcvthTpb2OtHX1MhyQKbSZ2ImL9dANTcy58ejcLPD548tFd28/tu47TZ0neOnt9QTtwBAu1d2mzpfRdMZbvBLELtrXVRgUiD+PPDRX7Dh8AamKaMoN3k6zKQTyeX4L2ejrH6Q8xACwdHY6daymCWKEmNmxe/sH0dJpH1nWN7Vj0GhAMF+A50rm+6VuDyr0sKbuXttv3NrZQ4mORBiM50sXMKZJeemJmJedjLNXR5wyKjUyRkZnvuR15PGlsykxBGyxk08/WkAFM1c1tOKF1cy2/Ndr6/DxljKqDgBQXtWA8qoGFM/JxOqiPCdRmCrtpTMwaMD/fvMTdZ4SG4ngQLvjcu/JKrexlu5YMCvVqe3lNCclCaC+pRM9fQOMa1YVehcP6AnHLlyjjguykhAa4ruWeCWId9T2IXH/oAHSsFC8sqYQCrkUJIBrTe34ctdxyiaz+1glFWBNd6gk+XG6vPVHe7BorEzC6Dh8mrdYZ2B2hNobSmw7dM5lmawgjg1Be3ktFtuz7qK9EEsKMlzajLJS46mXvLtPh4yRv/uS1+m6FGfhyM1QACOCqDeaQJIk4x5yqQT/8+ZTOHyhFj+eusJwtBw+X4dL9S34j5dLKFvpVGovAAwOGdHa2YPth84zRP350oVj5PINuig6smpBjl9ngHRMJgsOX6AHYnsfakPHK0Gkj7gA4N2XSxgjvZnT47Fp7SJsHhk53u6wi2AzLbxh2jjhOZ6y+xgzvvCFVQsY6fRRoVbnPqibZWJ0015oWYRttEifPew6dhkHaWtLRzGZ7fZcel/yJa8jYqFzDCmPSyCQz6Psyf06g9OqEy6PwMr5OVhekIWK6pvYe7KKEpe+/kF8vPUgPvjZ45R4TYX26o0mvP27bS5HfctmZyDaYensu6+WYthicVmWOya6auufn1qGnNS7t776bM0NyryREjux5cFj4ZUgXrreQh1nJEa7nPbS49J0Qwbqa9zYZneo7D9djcbWO4x8Da0q6ri2qQ1/2FqG0kW5SE1wFk+SBLYfPMvwJr62fhEUscz/XyEJtQui1Wr7ko7GPqYnyfHcY/Oo9L8ddL+kj4WJiuY0k4XZOqTFYbmSo5fREYK2tMuXvE5phOs0HpcHwFaucXgYgOtleDwegaL8NBTmTcee45UoO3sVgC2eteZmG7WLylRpr7sp8PplzhEVMh/WC9PJSIzGxlX2WdRHX/9I1eOW8s5dE0SSJBmbOPgSiO2IV4K4OH86vj9yGQAQGeb6x3Uc/JMkYCWtjK8iwBRAVzS0qjBX0+8kiENGE/669xRjTfMTyx9BfmaSUxkEwUGwgE89rBOX6lFSaPsRZRFihq3pwJmaMZcGsthoVfVSIR0AIB1ZvRETGca4bt0S53XsdNIT7TF/vuR1ZGDQ4DJWVW+0TyUlwvE9oBwOB+uW5qOxVYXGdtvHvFXVQwniVGlvIJ8HfgAPeqOJMdU/cr52QiFEEyEyTMQQ1xdKF1Czwp/O16J4XrbHiy4mQs3NNvSP7IMQJgrxyK7qKV4JolRiFxC6TZDObZX976MhMC0dapfXjgePYMYdVt9Q4i97TlJfVIIANq1bjPwMhdsyCmZMw4nK6wCAgxU1WF6QNeG4LhYbZosV2w7YbbbREWJqShUtta/95vEIFOWlMwz6Y+FLXkeaO7qd9sJrVfVS0yyCgNt4VlfER0spQdTr7aOxqdBex91uNn9/DFUNtrC43ccrMScr+a6HvwDArLRESITB0Oj0sFqBsjPV2LDc/8HgB2grW1YX+ddp45UiRNNGVC13enG5rpkxMjOZzPhmv/2FUcTYQmASY6T4/Jcvj1l2/a12fLL9MADn3W6GjCZ8vfsUrjbaR4VhohD863Mrxp0GlBTNogTRbLbi/c9/wFvPrfCb7eFhgCRtns7NO48zQqdeLLXbbGOlEmo0bjZb8advj2DThiUMR4Q7fMnryK5jl5CZFIOAAJvoWSxW/P0ne4hLPC0cpEczgAu1t1AwYxo10qUzZDThYl0zdS4Ns4vLVGkvnWdWzEP1zVZK/Lf+eAZvPvuoT2V6AocDrFuah//bawu7OXqxDivm5/h184/WTjUV6sXjESjISvFb2YC3gigVIzVORq1j/nLXSVRUN0IRI4XRNIyK6kaGTWPdkkf8UllVt4YhhgAgCOAx4p7oyKUSPDviKQ4NCcSKuVlUEKxGp8evNu9CSmwkEmOkkIiCoenXs9NlB8qv3EBnjwa9A3qGCI4ya3o8Y005l0dg07oifLrjCACgsb0bv/jjd8hOiUeMVAxhiACDQyaoejRIipNhxbxsv+R1RKXW4r8//wELR9baXrx2CypadETpIvv0VNmpxt6TVdh7sgoRYiGS4yMRGSZCkCAAPb06nK65wZiG5mXYP/5Tpb10xKFBWF2Uhz0nbMtY65o7cK1RiRmTsIns7BnT8N2hC9AbTdQo8YniOVT6H7aWwUqzndL3Qth7sgr1tFjiwvx0py3m6AHqK+ZlO20v5itezxmfLVmAD77cRX2Frt1qxzVaZPwoG5blO3m5/IlKrYU7K2TvgJ5xvnZJPvh8HmPtY2N7NzUVYnGN425GgG3K+fjSR7CsYIZT2oyUOKycn8OIC73aqHT6mOkGDU4vuS956cilYnT2aF1uHJASG8lw+nVp7HZttVbnUvhH2bAs32n6ORXa60jx3CwcPV9Hecj/svcMPnrzKZ9XcowHlyCwZlEuvh0ZjR+5UI8V82dSMYLj+QzofS3ZwW/QN6Bn+AyWzh4rCMk7vP515FIxPnzjaWSnxMOVQ08uFePdl0sYa0Y9gUsrjOsQl+XOc+gODuGYn4OSwll4b9MapMZHIVjAn1B5DwuEm/WmYaIQZCXHYeW8LPzm9SexfE6W27Wp65bk4f1/XIfUOJnL/gEAfbohv+cd5Y1nipGpkDPyEwRQPCcTb7+4inFtdkoCimZNhzDI/dQuNT4K77zwmNv+PNntpT8jV+8Fj0vgxdV2U4ZuyICjF685XTdRxrsvACzMTWMI79ELdS6vm8i9AODouavU8fycZISM8by8xS//l5kkgd5+HfoH9AgOEkAqCQXXz0PZu4XJZEaXph8WsxUiYRBEIUH3Td3vJ3R6A3q1gxi2WBDA4yFcFOyxbcmTvBarFa9/uIU6H7VVWyxWtHdrIAziI1wsHPdeRqMZA/ohDA4ZweFwqD4x0eWed7u9Dxsmkxk///gbakb6639az4gO8Rd+cbNyOLalUREedLipBp/P83p3XRbPEQYHev1S+5KXyyWQEO358xUIeBAIQl06VybCvWrvg8qpquuUGKYlRN8VMQTY/7rHwsJyHxAfFYGNK2zOmTTF3duvlBVEFhaWKc90hXxStjBjjWUsLCwsI7AjRJYHAg44kIxs6MA6xVi8xS9eZhYWFpYHAfZTysLCwjICK4gsLCwsI7A2RBYWlocenYnE5nOGqSGIRtMA6luP4U7fdSRFzUVSzFwE8Py/jxrL3WdA342OnmswW4YRwOUjNjIbIUEPX+C7xTKMZtVFNHWcglSUjExFMYIE7M5KUxESQGufFYebTfdeEC2WYdQ07cfZuvcBADeUO1Cc/zHSEhaBw2Fn9KNYrWao+5Xo7KnDHc11WEkr5GGZiJPlICw0dor8ViS0ug4cq3wfwxYVBAEJWLPws4dOEEnSituqSzh04eewWLVoAGAwaVGQ8fykfOhJ0ooe7W10a5pBklYECUSIj8xBQIDr3cGHjFp0qOugN2hBcLiQCKMhj8gAQUyePEy0zv7ENMzBOeUwbuus+H8e8z5kye7ooQAAAABJRU5ErkJggg==" width="324" height="40" class="img_ev3q"></p>
<p>还需要注意的是，可能大家看到的更多的是ollama官网的671b写的是404G，如下图</p>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(10)-eba714b82b2f57416b2030b3ced766b8.png" width="1590" height="1236" class="img_ev3q"></p>
<p>这个并非不准确，而是ollama提供的是一个4bit的量化版本，并非真正的满血非量化版本。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="12-服务器显卡">1.2 服务器/显卡<a href="https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek#12-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%98%BE%E5%8D%A1" class="hash-link" aria-label="1.2 服务器/显卡的直接链接" title="1.2 服务器/显卡的直接链接">​</a></h3>
<p>在这里我们准备2台8 * NVIDIA H100 80GB HBM3的服务器，并且显卡之间用Nvlink进行连接。</p>
<blockquote>
<p>当然如果有H200可能效果会更好，但是毕竟那玩意还是太稀有了。</p>
</blockquote>
<p>按照英伟达官网安装好显卡驱动、cuda、以及nvidia-fabricmanager，这里列出我使用的版本。</p>
<p>显卡驱动版本：<code>550.54.15</code></p>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(11)-15a63cc1c8d870331fc5b0dc82e0bd7d.png" width="1386" height="230" class="img_ev3q"></p>
<p>cuda版本：<code>release 12.4, V12.4.131</code></p>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(12)-a2a15129e8be72c4cf747b1eada59823.png" width="724" height="196" class="img_ev3q"></p>
<p>nvidia-fabricmanager：<code>550_550.54.15</code></p>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(13)-8396152886cce3b2e9b9b00a7824e2fe.png" width="2490" height="448" class="img_ev3q"></p>
<p>这里值得注意的是，上述三个软件版本一定要相互匹配，不然是运行不起来的。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="13-推理引擎">1.3 推理引擎<a href="https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek#13-%E6%8E%A8%E7%90%86%E5%BC%95%E6%93%8E" class="hash-link" aria-label="1.3 推理引擎的直接链接" title="1.3 推理引擎的直接链接">​</a></h3>
<p>模型、硬件都准备好了，接下来就是软件了。</p>
<p>在这里选择了<a href="https://github.com/vllm-project/vllm" target="_blank" rel="noopener noreferrer">vllm</a>，与ollama类似，这也是一个推理引擎，但是具有更高性能的特点，社区也比较活跃，有关他的详细介绍也可以看看其他的文章。</p>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(14)-f2289b35e76bf0b46d5bc652f6b445e0.png" width="1828" height="712" class="img_ev3q"></p>
<p>为了简化部署和统一环境，我们只需要下载vLLM的docker镜像即可。</p>
<p>在两台服务器上分别执行命令</p>
<p><code>docker pull vllm/vllm-openai:v0.7.1</code></p>
<p>如果网络不太好，在阿里云上也有相应的镜像</p>
<p><code>docker pull registry.cn-hangzhou.aliyuncs.com/dongfangzan/vllm-openai:v0.7.1</code></p>
<p>到此我们所有的准备工作就都做完了，接下来就可以进入部署阶段了。</p>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(15)-0b6c1a8e06145a5415edd199a237ed54.png" width="1198" height="122" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="二开始部署">二、开始部署<a href="https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek#%E4%BA%8C%E5%BC%80%E5%A7%8B%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="二、开始部署的直接链接" title="二、开始部署的直接链接">​</a></h2>
<p>根据vllm的部署文档<a href="https://docs.vllm.ai/en/latest/serving/distributed_serving.html" target="_blank" rel="noopener noreferrer">Distributed Inference and Serving — vLLM</a>，我们首先要找到一个脚本用来做分布式推理。</p>
<p><a href="https://github.com/vllm-project/vllm/blob/main/examples/online_serving/run_cluster.sh" target="_blank" rel="noopener noreferrer">run_cluster.sh</a></p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#!/bin/bash</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Check for minimum number of required arguments</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">if [ $# -lt 4 ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    echo "Usage: $0 docker_image head_node_address --head|--worker path_to_hf_home [additional_args...]"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exit 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Assign the first three arguments and shift them away</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DOCKER_IMAGE="$1"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HEAD_NODE_ADDRESS="$2"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NODE_TYPE="$3"  # Should be --head or --worker</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PATH_TO_HF_HOME="$4"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">shift 4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Additional arguments are passed directly to the Docker command</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ADDITIONAL_ARGS=("$@")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Validate node type</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">if [ "${NODE_TYPE}" != "--head" ] &amp;&amp; [ "${NODE_TYPE}" != "--worker" ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    echo "Error: Node type must be --head or --worker"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exit 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Define a function to cleanup on EXIT signal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cleanup() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    docker stop node</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    docker rm node</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">trap cleanup EXIT</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Command setup for head or worker node</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RAY_START_CMD="ray start --block"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">if [ "${NODE_TYPE}" == "--head" ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    RAY_START_CMD+=" --head --port=6379"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">else</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    RAY_START_CMD+=" --address=${HEAD_NODE_ADDRESS}:6379"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Run the docker command with the user specified parameters and additional arguments</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker run \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --entrypoint /bin/bash \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --network host \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --name node \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --shm-size 10.24g \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --gpus all \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -v "${PATH_TO_HF_HOME}:/root/.cache/huggingface" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "${ADDITIONAL_ARGS[@]}" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "${DOCKER_IMAGE}" -c "${RAY_START_CMD}"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>然后在两个不同的节点上分别执行命令</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 节点1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">bash run_cluster.sh \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                vllm/vllm-openai \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ip_of_head_node \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                --head \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                /path/to/the/huggingface/home/in/this/node \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e VLLM_HOST_IP=ip_of_this_node</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 节点2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">bash run_cluster.sh \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                vllm/vllm-openai \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ip_of_head_node \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                --worker \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                /path/to/the/huggingface/home/in/this/node \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e VLLM_HOST_IP=ip_of_this_node</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>两个节点均完成启动之后，找到其中一个节点，使用<code>docker exec -it node bash</code>进入容器，这时候就可以执行vllm的启动命令了。</p>
<div class="language-plain codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-plain codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">vllm serve /root/.cache/huggingface/hub/deepseek-ai/DeepSeek-R1 \ </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--served-model-name deepseek-r1 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--enable-prefix-caching \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--max-model-len 32768 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--gpu-memory-utilization 0.95 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--tensor-parallel-size 8 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--pipeline-parallel-size 2 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--enable-chunked-prefill \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--max-num-batched-tokens 32768 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--trust-remote-code \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--port 8000</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>如果顺利的话，在漫长的等待之后，就可以看到模型所有的safetensors被一个一个的加载起来。</p>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(16)-3c76b7a0ba4593a2da4d37a10a03bddf.png" width="1560" height="684" class="img_ev3q"></p>
<p>这时我们再去找一个<a href="https://chatboxai.app/zh" target="_blank" rel="noopener noreferrer">Chatbox</a>、<a href="https://openwebui.com/" target="_blank" rel="noopener noreferrer">Open WebUI</a>等图形化工具进行一些简单的配置，就可以对话了。</p>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(17)-65986f968ad6318490891060cb4a3c4c.png" width="2048" height="1536" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="21-但是">2.1 但是<a href="https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek#21-%E4%BD%86%E6%98%AF" class="hash-link" aria-label="2.1 但是的直接链接" title="2.1 但是的直接链接">​</a></h3>
<p>总会有但是，部署的过程肯定不会那么顺利，尤其是在多机多卡的推理场景上。</p>
<p>用上述脚本只能勉强把模型跑起来，跑起来之后，跟官网上那种流畅的速度比起来简直是千差万别，**基本上就是一个字一个字在蹦，**非常的慢。</p>
<p>我们在后台看到token的生成速度，好一点的时候可能有20+tokens/s，稍微问多一点的时候可能会掉到只有不到1tokens/s，非常的惨。</p>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(18)-a4d7c138337feb77cf8527a44e583c8c.png" width="1196" height="462" class="img_ev3q"></p>
<p>到了这里可能会怀疑为什么这么多H100还是会这么慢？</p>
<p>实际上这里的瓶颈已经不在于显卡的算力，即使不是16张H100而是16张4090的话，算力也不是阻碍。</p>
<p>搞过多机多卡训练的大佬可能就会知道，在这种场景下<strong>网络带宽</strong>才是真正限制推理速度的最大阻碍。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="22-超高性能网络-infiniband">2.2 超高性能网络-Infiniband<a href="https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek#22-%E8%B6%85%E9%AB%98%E6%80%A7%E8%83%BD%E7%BD%91%E7%BB%9C-infiniband" class="hash-link" aria-label="2.2 超高性能网络-Infiniband的直接链接" title="2.2 超高性能网络-Infiniband的直接链接">​</a></h3>
<p>InfiniBand （以下简称IB网络）是一种专为高性能计算（HPC）和超大规模数据中心设计的网络技术，以亚微秒级超低延迟和超高带宽为核心优势。</p>
<p>这里的带宽，不是指家里的千兆网或者机房中的万兆网（10G/s）就那么简单，而是有接近400G/s的超高速显卡互联网络。</p>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(19)-60d903a39bb16d87a1f89d298f2eb8bb.png" width="2250" height="1230" class="img_ev3q"></p>
<p>在保证系统上安装且启用了IB网卡的情况下，我们用命令<code>ibdev2netdev -v</code>可以看到IB网口的状态。</p>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(20)-510f20ac40dbc7abba0a5ae6d9565f86.png" width="1500" height="536" class="img_ev3q"></p>
<p>当确认了IB网络是通畅的时候，我们需要对上述的启动脚本进行修改，在两个节点上分别执行以下命令</p>
<div class="language-plain codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-plain codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 节点1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">bash run_cluster.sh \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                vllm/vllm-openai \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ip_of_head_node \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                --head \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                /path/to/the/huggingface/home/in/this/node \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e VLLM_HOST_IP=ip_of_this_node</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                --privileged -e NCCL_IB_HCA=mlx5 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e NCCL_P2P_LEVEL=NVL \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e NCCL_IB_GID_INDEX=3 \ </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e NCCL_IB_DISABLE=0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e NCCL_DEBUG=INFO \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e NCCL_SOCKET_IFNAME=ibs1 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e NCCL_NET_GDR_LEVEL=2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 节点2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">bash run_cluster.sh \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                vllm/vllm-openai \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ip_of_head_node \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                --worker \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                /path/to/the/huggingface/home/in/this/node \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e VLLM_HOST_IP=ip_of_this_node \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                --privileged -e NCCL_IB_HCA=mlx5 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e NCCL_P2P_LEVEL=NVL \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e NCCL_IB_GID_INDEX=3 \ </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e NCCL_IB_DISABLE=0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e NCCL_DEBUG=INFO \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e NCCL_SOCKET_IFNAME=ibs1 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                -e NCCL_NET_GDR_LEVEL=2</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>新增的环境变量配置，主要用于启用IB网络通信，而非使用以太网进行通信，详细的每一个参数的具体含义，可以在英伟达<a href="https://docs.nvidia.com/deeplearning/nccl/archives/nccl_2215/user-guide/docs/env.html" target="_blank" rel="noopener noreferrer">NCCL的官方网站</a>上找到说明。</p>
<div class="language-plain codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-plain codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">--privileged -e NCCL_IB_HCA=mlx5 \ # 通信设备为IB网卡</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-e NCCL_P2P_LEVEL=NVL \ </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-e NCCL_IB_GID_INDEX=3 \ </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-e NCCL_IB_DISABLE=0 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-e NCCL_DEBUG=INFO \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-e NCCL_SOCKET_IFNAME=ibs1 \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-e NCCL_NET_GDR_LEVEL=2</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>在完成配置之后，重新启动vllm，就可以看到如下的效果了。</p>
<p><img decoding="async" loading="lazy" src="https://youtu.be/yKNxeF4KMsY" alt="" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="三下一步">三、下一步<a href="https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek#%E4%B8%89%E4%B8%8B%E4%B8%80%E6%AD%A5" class="hash-link" aria-label="三、下一步的直接链接" title="三、下一步的直接链接">​</a></h2>
<p>部署到这里，我们就得到了一个跟官网不卡的时候速度类似的满血版Deepseek-r1，希望这个文档对你有所帮助。</p>
<p>下一步，我会对已经完成部署的模型进行压测，来探索系统的性能极限在哪里，以及如何在生产环境中何如进行进一步的性能优化，期待你的关注。</p>
<blockquote>
<p>个人水平有限，有误的地方望指正</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a href="https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek#%E9%99%84%E5%BD%95" class="hash-link" aria-label="附录的直接链接" title="附录的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="runtimeerror-nccl-error-unhandled-svstem-error-run-with-nccl-debug-ine-for-deta">RuntimeError; Nccl error; unhandled svstem error (run with NCCL DEBUG INE for deta<a href="https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek#runtimeerror-nccl-error-unhandled-svstem-error-run-with-nccl-debug-ine-for-deta" class="hash-link" aria-label="RuntimeError; Nccl error; unhandled svstem error (run with NCCL DEBUG INE for deta的直接链接" title="RuntimeError; Nccl error; unhandled svstem error (run with NCCL DEBUG INE for deta的直接链接">​</a></h3>
<p>这个报错大概率是nccl配置有问题，单机多卡场景下，请按照如下思路排查</p>
<ol>
<li>请检查pytorch版本与nccl版本是否匹配？</li>
<li>nvidia-fabricmanager是否开启? <code>systemctl status nvidia-fabricmanager</code></li>
<li>fabricmanager的版本与显卡驱动版本是否匹配？</li>
<li>执行vllm的测试脚本，<a href="https://docs.vllm.ai/en/latest/getting_started/troubleshooting.html#incorrect-hardware-driver" target="_blank" rel="noopener noreferrer">文档地址</a>，以确定问题出现在哪里</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置了ib网络输出还是很慢">设置了IB网络，输出还是很慢<a href="https://dongfangzan.cn/2025/02/01/2025/How-to-deploy-DeepSeek#%E8%AE%BE%E7%BD%AE%E4%BA%86ib%E7%BD%91%E7%BB%9C%E8%BE%93%E5%87%BA%E8%BF%98%E6%98%AF%E5%BE%88%E6%85%A2" class="hash-link" aria-label="设置了IB网络，输出还是很慢的直接链接" title="设置了IB网络，输出还是很慢的直接链接">​</a></h3>
<p>在启动脚本前加入NCCL_DEBUG=INFO，并检查是否有如下日志，最关键的就是<code>[send] via NET/IB/0/GDRDMA</code>，这段日志表示网络通信是通过BI网络且开启了RDMA</p>
<blockquote>
<p>NCCL中的RDMA（远程直接内存访问）通过绕过操作系统内核实现GPU内存直接跨节点通信，减少数据传输延迟和CPU开销；该技术利用网卡的零拷贝能力加速多机多卡间的集体操作（如AllReduce），显著提升分布式训练的通信效率。</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(21)-ee25f6e04d162c3ebab04cc8a84aea02.png" width="1866" height="596" class="img_ev3q"></p>
<p>如果你找到的日志是[send] via NET/SOCKET，则表示网络通信是通过以太网传输的，那么这时字符输出很慢是正常的。</p>
<p>如果你找到的日志是[send] via NET/IB/0，则表示网络通信是通过IB网络的，但是没有开启GDRDMA技术，则会有大致5%的性能损耗（网传，未实测）。</p>
<p>排查思路如下：</p>
<ol>
<li>检查IB网络是否开启，并正确配置。</li>
<li>在github上找一个代码仓库<a href="https://github.com/NVIDIA/nccl-tests" target="_blank" rel="noopener noreferrer">https://github.com/NVIDIA/nccl-tests</a>，根据文档进行nccl的测试，逐一排查问题。</li>
<li>对<code>NCCL_IB_DISABLE</code>、<code>NCCL_IB_HCA</code>等环境变量的配置进行修改并调试，<a href="https://docs.nvidia.com/deeplearning/nccl/archives/nccl_2215/user-guide/docs/env.html" target="_blank" rel="noopener noreferrer">NCCL的官方网站</a>会有给你很大的帮助。</li>
<li>对于你找到的日志是[send] via NET/IB/0，无法正确开启RDMA的场景，请关注<a href="https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/troubleshooting.html#gpu-to-gpu-communication" target="_blank" rel="noopener noreferrer">这个文档</a>，确认自己的系统中是否正确开启了nvidia-peermem，因为默认它是不开启的，会导致RDMA无法使用。</li>
</ol>
<p><img decoding="async" loading="lazy" src="https://dongfangzan.cn/assets/images/image%20(22)-1d979da1e4fe9b7ed86fc85b9622f624.png" width="1428" height="676" class="img_ev3q"></p>]]></content:encoded>
            <category>llm</category>
            <category>deepseek</category>
        </item>
        <item>
            <title><![CDATA[《肥胖代码：减肥的秘密》]]></title>
            <link>https://dongfangzan.cn/2022/11/15/2022/ 肥胖代码：减肥的秘密</link>
            <guid>https://dongfangzan.cn/2022/11/15/2022/ 肥胖代码：减肥的秘密</guid>
            <pubDate>Tue, 15 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[我从小是个瘦子，但是自打结婚开始，就以每年10斤的速度长胖，最胖的时候达到了170斤，身体开始出现各种问题。从那时候起，我就开始减肥。]]></description>
            <content:encoded><![CDATA[<p>我从小是个瘦子，但是自打结婚开始，就以每年10斤的速度长胖，最胖的时候达到了170斤，身体开始出现各种问题。从那时候起，我就开始减肥。</p>
<p>2017年年初，我用了半年不到的时间从170斤减到了150斤，但是自此之后的5年时间里，我的体重一直在140-150之间反复横跳再也降不下去。</p>
<p>我曾经十分自责的认为是自己没有毅力无法坚持，但为了身体健康，还是要寻找其他方式来帮助我减肥成功，希望这本书能帮到我，如果我可以成功，那希望这本书也能帮到大家。</p>
<blockquote>
<p>写于2022-11-15</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="一个前提">一个前提<a href="https://dongfangzan.cn/2022/11/15/2022/%20%E8%82%A5%E8%83%96%E4%BB%A3%E7%A0%81%EF%BC%9A%E5%87%8F%E8%82%A5%E7%9A%84%E7%A7%98%E5%AF%86#%E4%B8%80%E4%B8%AA%E5%89%8D%E6%8F%90" class="hash-link" aria-label="一个前提的直接链接" title="一个前提的直接链接">​</a></h2>
<p>人体会根据你的遗传基因和体内的激素水平，对你的体重预设一个平衡的值，来保证机体可以生存下去。
想要通过节食和运动来减肥，可能会在减肥初期看到一些效果，但是长期来看，由于体内的遗传基因和激素水平没有发生改变，就会使体重回到原来的预设状态，甚至比以前更胖。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="我们常见的误区">我们常见的误区<a href="https://dongfangzan.cn/2022/11/15/2022/%20%E8%82%A5%E8%83%96%E4%BB%A3%E7%A0%81%EF%BC%9A%E5%87%8F%E8%82%A5%E7%9A%84%E7%A7%98%E5%AF%86#%E6%88%91%E4%BB%AC%E5%B8%B8%E8%A7%81%E7%9A%84%E8%AF%AF%E5%8C%BA" class="hash-link" aria-label="我们常见的误区的直接链接" title="我们常见的误区的直接链接">​</a></h2>
<ol>
<li>经过调查显示，通过毅力进行的节食减肥会在6个月左右的时候达到体重最轻，然后在12个月后反弹。</li>
<li>同时运动带来的减肥效果是有限的（饮食占95%，运动可能只占5%），也就是我们常说的“管住嘴、迈开腿”并不会帮你减肥成功。</li>
<li>过量进食并不会让你长胖，而是同节食一样，短期长胖，长期回到预设的体重。</li>
<li>果糖和代糖也是非常糟糕的食物，会导致胰岛素水平上升，从而引发肥胖</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="关键问题">关键问题<a href="https://dongfangzan.cn/2022/11/15/2022/%20%E8%82%A5%E8%83%96%E4%BB%A3%E7%A0%81%EF%BC%9A%E5%87%8F%E8%82%A5%E7%9A%84%E7%A7%98%E5%AF%86#%E5%85%B3%E9%94%AE%E9%97%AE%E9%A2%98" class="hash-link" aria-label="关键问题的直接链接" title="关键问题的直接链接">​</a></h2>
<ol>
<li>胰岛素是让人发胖的罪魁祸首，同时越胖的人会出现胰岛素抵抗的问题，也就是分泌同样的胰岛素，分解糖原的水平变低，从而身体会分泌更多的胰岛素，最终形成一个恶性循环。</li>
<li>如何吃和什么时候吃是解决胰岛素抵抗的关键问题</li>
<li>皮质醇也会导致胰岛素分泌过多，也就是说长期的心理压力越大，经常失眠，也会诱发发胖</li>
<li>脂肪肝也会加剧胰岛素抵抗，越是脂肪肝，越容易胖</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="如何做">如何做<a href="https://dongfangzan.cn/2022/11/15/2022/%20%E8%82%A5%E8%83%96%E4%BB%A3%E7%A0%81%EF%BC%9A%E5%87%8F%E8%82%A5%E7%9A%84%E7%A7%98%E5%AF%86#%E5%A6%82%E4%BD%95%E5%81%9A" class="hash-link" aria-label="如何做的直接链接" title="如何做的直接链接">​</a></h2>
<p>影响体重的主要因素有两个，吃什么和什么时间吃</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="如何吃">如何吃<a href="https://dongfangzan.cn/2022/11/15/2022/%20%E8%82%A5%E8%83%96%E4%BB%A3%E7%A0%81%EF%BC%9A%E5%87%8F%E8%82%A5%E7%9A%84%E7%A7%98%E5%AF%86#%E5%A6%82%E4%BD%95%E5%90%83" class="hash-link" aria-label="如何吃的直接链接" title="如何吃的直接链接">​</a></h3>
<ol>
<li>减少多余糖的摄入，不加额外的糖，不吃精加工的甜品，如果实在想吃甜品，可以把水果当成甜品，不要吃零食，咖啡比想象的更健康，但不要加糖，多喝茶，可以喝骨汤</li>
<li>减少精制谷物的摄入，如面粉和各种精加工的面包、饼干等东西。摄入完全未经加工的碳水化合物。茄子、甘蓝、菠菜、胡萝卜、西蓝花、豌豆、西红柿、芦笋、甜椒、西葫芦、花椰菜、牛油果、生菜、甜菜、黄瓜、卷心菜等都是非常健康的含碳水化合物的食物。</li>
<li>适度摄入蛋白质，不要高蛋白饮食，很难坚持</li>
<li>增加天然脂肪的摄入，橄榄油、黄油、椰子油和猪油，不吃深加工的，坚果和全脂牛奶都是不错的食物，牛油果非常好</li>
<li>增加相关保护因子的摄入，膳食纤维可以减少碳水化合物对胰岛素的刺激，天然的食物中有大量膳食纤维，但在加工过程中会被去除。魔芋和醋也是很好避免胰岛素上升的东西</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="什么时间吃">什么时间吃<a href="https://dongfangzan.cn/2022/11/15/2022/%20%E8%82%A5%E8%83%96%E4%BB%A3%E7%A0%81%EF%BC%9A%E5%87%8F%E8%82%A5%E7%9A%84%E7%A7%98%E5%AF%86#%E4%BB%80%E4%B9%88%E6%97%B6%E9%97%B4%E5%90%83" class="hash-link" aria-label="什么时间吃的直接链接" title="什么时间吃的直接链接">​</a></h3>
<p>长期节食会导致减肥初期体重减轻后进入平台期，接着是可怕的体重反弹。胰岛素抵抗使胰岛素保持在较高水平，较高的胰岛素水平又使身体的体重设定点偏高，体重设定点过高必然会削弱减肥的努力成果，人们会觉得越来越饿，所以只调整食谱不够。间歇性禁食（24-36小时）对身体有益，通过定期禁食可以降低胰岛素水平，从而显著提升胰岛素敏感性。
间歇性禁食组受试者的胰岛素水平明显较低，胰岛素抵抗状况得以明显改善。由于间歇性禁食组出现了极低胰岛素水平阶段，减缓了胰岛素抵抗的症状，对身体健康更加有利。</p>
<p>禁食是指自愿在特定的时间不吃食物，但允许喝水或茶等不含热量的饮料，可以每天补充一粒多种维生素片，每天2升水，可以喝骨头汤，蔬菜汤都可以。</p>
<p>禁食有三种方式：</p>
<ol>
<li>24小时禁食从第一天晚餐开始直到第二天的晚餐前结束。实际上这意味着在禁食日你不吃早餐、午餐和零食，只吃一顿晚餐。从本质上来说，你从第一天晚上7点禁食到第二天晚上7点，少吃了两顿饭。也可以从第一天的早餐或午餐开始禁食。</li>
<li>36小时禁食是指从第一天晚餐之后开始，直到第三天早餐前结束。这意味着一整天不吃早餐、午餐、晚餐和任何零食。你从第一天晚上7点禁食到第三天早上7点，少吃了三顿饭。（关于膳食方案和禁食计划，详见附录一）。</li>
</ol>
<p>每周进行2次左右的间歇性禁食。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="禁食计划">禁食计划<a href="https://dongfangzan.cn/2022/11/15/2022/%20%E8%82%A5%E8%83%96%E4%BB%A3%E7%A0%81%EF%BC%9A%E5%87%8F%E8%82%A5%E7%9A%84%E7%A7%98%E5%AF%86#%E7%A6%81%E9%A3%9F%E8%AE%A1%E5%88%92" class="hash-link" aria-label="禁食计划的直接链接" title="禁食计划的直接链接">​</a></h4>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="24小时禁食方案">24小时禁食方案<a href="https://dongfangzan.cn/2022/11/15/2022/%20%E8%82%A5%E8%83%96%E4%BB%A3%E7%A0%81%EF%BC%9A%E5%87%8F%E8%82%A5%E7%9A%84%E7%A7%98%E5%AF%86#24%E5%B0%8F%E6%97%B6%E7%A6%81%E9%A3%9F%E6%96%B9%E6%A1%88" class="hash-link" aria-label="24小时禁食方案的直接链接" title="24小时禁食方案的直接链接">​</a></h5>
<p><img decoding="async" loading="lazy" src="https://github.com/dongfangzan/ReadingNotes/blob/main/images/24%E5%B0%8F%E6%97%B6%E7%A6%81%E9%A3%9F%E6%96%B9%E6%A1%88.jpeg?raw=true" alt="24小时禁食方案" class="img_ev3q"></p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="36小时禁食方案">36小时禁食方案<a href="https://dongfangzan.cn/2022/11/15/2022/%20%E8%82%A5%E8%83%96%E4%BB%A3%E7%A0%81%EF%BC%9A%E5%87%8F%E8%82%A5%E7%9A%84%E7%A7%98%E5%AF%86#36%E5%B0%8F%E6%97%B6%E7%A6%81%E9%A3%9F%E6%96%B9%E6%A1%88" class="hash-link" aria-label="36小时禁食方案的直接链接" title="36小时禁食方案的直接链接">​</a></h5>
<p><img decoding="async" loading="lazy" src="https://github.com/dongfangzan/ReadingNotes/blob/main/images/36%E5%B0%8F%E6%97%B6%E7%A6%81%E9%A3%9F%E6%96%B9%E6%A1%88.jpeg?raw=true" alt="36小时禁食方案" class="img_ev3q"></p>
<p>禁食的时候饿怎么办，绿茶、肉桂、咖啡和奇亚籽能帮助缓解饥饿。</p>
<p>禁食期可以运动，书上说很多人在禁食期可能会精力更加充沛，可能是因为肾上腺素水平升高。禁食期基础代谢率没有下降，反而升高。禁食期可以进行日常的所有正常活动，不会出现持续疲劳的状态。如果你觉得过度疲劳，就应该立即停止禁食，去看医生。</p>
<p>如果头晕，可能是脱水，头疼可以增加盐的摄入（喝盐水），便秘需要增加膳食纤维。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="间歇性禁食的小技巧">间歇性禁食的小技巧<a href="https://dongfangzan.cn/2022/11/15/2022/%20%E8%82%A5%E8%83%96%E4%BB%A3%E7%A0%81%EF%BC%9A%E5%87%8F%E8%82%A5%E7%9A%84%E7%A7%98%E5%AF%86#%E9%97%B4%E6%AD%87%E6%80%A7%E7%A6%81%E9%A3%9F%E7%9A%84%E5%B0%8F%E6%8A%80%E5%B7%A7" class="hash-link" aria-label="间歇性禁食的小技巧的直接链接" title="间歇性禁食的小技巧的直接链接">​</a></h3>
<ol>
<li>喝水</li>
<li>让自己忙起来</li>
<li>喝咖啡</li>
<li>留意你的感觉，饥饿感是一阵一阵的，饿过了就不饿了</li>
<li>给自己一个月时间来适应</li>
<li>非禁食日注意还是要根据上述如何吃保持</li>
<li>不要自我放纵</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="我的todo-list">我的todo list<a href="https://dongfangzan.cn/2022/11/15/2022/%20%E8%82%A5%E8%83%96%E4%BB%A3%E7%A0%81%EF%BC%9A%E5%87%8F%E8%82%A5%E7%9A%84%E7%A7%98%E5%AF%86#%E6%88%91%E7%9A%84todo-list" class="hash-link" aria-label="我的todo list的直接链接" title="我的todo list的直接链接">​</a></h2>
<ol>
<li>戒糖（包含代糖，主要是无糖可乐），戒精加工食品，戒零食，不吃面食（面、馒头、抄手、饺子）</li>
<li>一日三餐，尽量在10小时之内吃完，不加餐</li>
<li>非禁食日不饿肚子（个人觉得很重要，而且得明确出来）</li>
<li>每周三、周日为24小时禁食日，周二（六）晚饭吃完后只喝茶水-周三（日）晚饭</li>
<li>尽量每日保证7-9小时睡眠</li>
<li>每周锻炼2-3次，如跑步、骑自行车、跳健身操、举哑铃等等</li>
<li>每日记录体重变化</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="过程记录">过程记录<a href="https://dongfangzan.cn/2022/11/15/2022/%20%E8%82%A5%E8%83%96%E4%BB%A3%E7%A0%81%EF%BC%9A%E5%87%8F%E8%82%A5%E7%9A%84%E7%A7%98%E5%AF%86#%E8%BF%87%E7%A8%8B%E8%AE%B0%E5%BD%95" class="hash-link" aria-label="过程记录的直接链接" title="过程记录的直接链接">​</a></h2>
<table><thead><tr><th style="text-align:left">天数</th><th style="text-align:left">日期</th><th style="text-align:left">早上空腹</th><th style="text-align:left">累计减重</th><th style="text-align:left">体脂率</th><th style="text-align:left">变化</th><th style="text-align:left">备注</th><th style="text-align:left">感想</th></tr></thead><tbody><tr><td style="text-align:left">1</td><td style="text-align:left">2022-11-15</td><td style="text-align:left">76.65kg</td><td style="text-align:left">0</td><td style="text-align:left">-</td><td style="text-align:left">0</td><td style="text-align:left">开始日</td><td style="text-align:left"></td></tr><tr><td style="text-align:left">2</td><td style="text-align:left">2022-11-16</td><td style="text-align:left">76.25kg</td><td style="text-align:left">0.40kg</td><td style="text-align:left">-</td><td style="text-align:left">-0.4kg</td><td style="text-align:left">禁食日</td><td style="text-align:left"></td></tr><tr><td style="text-align:left">3</td><td style="text-align:left">2022-11-17</td><td style="text-align:left">75.75kg</td><td style="text-align:left">0.90kg</td><td style="text-align:left">21.2%</td><td style="text-align:left">-0.5kg</td><td style="text-align:left">中午吃干锅</td><td style="text-align:left">中午这么吃，算是重油了，居然第二天没啥变化</td></tr><tr><td style="text-align:left">4</td><td style="text-align:left">2022-11-18</td><td style="text-align:left">75.80kg</td><td style="text-align:left">0.85kg</td><td style="text-align:left">21.4%</td><td style="text-align:left">+0.05kg</td><td style="text-align:left">训练日，骑车</td><td style="text-align:left">中午食堂很油，晚上就吃了牛肉干、坚果和橙子</td></tr><tr><td style="text-align:left">5</td><td style="text-align:left">2022-11-19</td><td style="text-align:left">75.35kg</td><td style="text-align:left">1.30kg</td><td style="text-align:left">21.3%</td><td style="text-align:left">-0.45kg</td><td style="text-align:left"></td><td style="text-align:left">晚上吃火锅，吃了很多，社交不可避免</td></tr><tr><td style="text-align:left">6</td><td style="text-align:left">2022-11-20</td><td style="text-align:left">75.50kg</td><td style="text-align:left">1.15kg</td><td style="text-align:left">20.9%</td><td style="text-align:left">+0.15kg</td><td style="text-align:left">禁食日</td><td style="text-align:left">按经验体重会暴涨，但却没有</td></tr><tr><td style="text-align:left">7</td><td style="text-align:left">2022-11-21</td><td style="text-align:left">75.10kg</td><td style="text-align:left">1.55kg</td><td style="text-align:left">21.0%</td><td style="text-align:left">-0.40kg</td><td style="text-align:left">训练日，骑车</td><td style="text-align:left">一周没饿肚子，还吃了好吃的，减了3斤</td></tr><tr><td style="text-align:left">8</td><td style="text-align:left">2022-11-22</td><td style="text-align:left">74.35kg</td><td style="text-align:left">2.30kg</td><td style="text-align:left">20.9%</td><td style="text-align:left">-0.75kg</td><td style="text-align:left"></td><td style="text-align:left"></td></tr><tr><td style="text-align:left">9</td><td style="text-align:left">2022-11-23</td><td style="text-align:left">74.25kg</td><td style="text-align:left">2.40kg</td><td style="text-align:left">21.8%</td><td style="text-align:left">-0.10kg</td><td style="text-align:left">禁食日+训练日</td><td style="text-align:left">晚上吃了烧烤，吃到饱</td></tr><tr><td style="text-align:left">10</td><td style="text-align:left">2022-11-24</td><td style="text-align:left">74kg</td><td style="text-align:left">2.65kg</td><td style="text-align:left">21.8%</td><td style="text-align:left">-0.25kg</td><td style="text-align:left"></td><td style="text-align:left"></td></tr><tr><td style="text-align:left">11</td><td style="text-align:left">2022-11-25</td><td style="text-align:left">74kg</td><td style="text-align:left">2.65kg</td><td style="text-align:left">20.6%</td><td style="text-align:left">0kg</td><td style="text-align:left">训练日</td><td style="text-align:left"></td></tr></tbody></table>]]></content:encoded>
            <category>读书笔记</category>
        </item>
        <item>
            <title><![CDATA[大厂逃离后上岸人员的年终总结]]></title>
            <link>https://dongfangzan.cn/2021/12/31/2021/summary</link>
            <guid>https://dongfangzan.cn/2021/12/31/2021/summary</guid>
            <pubDate>Fri, 31 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[2020年6月份，我离开国内某互联网大厂，距今其实也有一年半的时间了。说是年终总结，其实更想在离开这一年半时间后，对自己进行一个总结和复盘。]]></description>
            <content:encoded><![CDATA[<p>2020年6月份，我离开国内某互联网大厂，距今其实也有一年半的时间了。说是年终总结，其实更想在离开这一年半时间后，对自己进行一个总结和复盘。</p>
<p>离职交工牌之前照的，人长的丑，就不露脸了，认识的人自然知道是谁。</p>
<p><img decoding="async" loading="lazy" alt="images" src="https://dongfangzan.cn/assets/images/card-d9cae3f828bc631dd89a9ee14bd0288e.png" width="638" height="858" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="为什么离职">为什么离职<a href="https://dongfangzan.cn/2021/12/31/2021/summary#%E4%B8%BA%E4%BB%80%E4%B9%88%E7%A6%BB%E8%81%8C" class="hash-link" aria-label="为什么离职的直接链接" title="为什么离职的直接链接">​</a></h2>
<p>就像马云说的，员工为什么离职，要么是钱没给到位，要么是心受委屈了。归根到底总结成一条，就是干得不爽。对我来说，可能还是后者占比较大的成分。</p>
<p>从毕业开始，我一直在国企工作，有着安逸稳定的工作和相对和谐的办公室环境，虽然挣得少，但还是开开心心的。不过自己毕竟不是个安分的人，按部就班的生活让我觉得无聊，年轻的热血又容易上头，总以为自己就是那个可以成为“海贼王”的男人，所以17年毅然决然放弃国企的工作投身互联网。</p>
<p>收入这一方面，从国企的月薪6k一步步涨到接近30k，其实也就用了不到3年时间。</p>
<p>伴随着收入的上涨，带来的挑战和压力也是巨大的，这时可能按照正常故事情节的发展就应该是通过一步步努力，获得晋升，赢取白富美，走上人生巅峰。</p>
<p>但是事实有点残酷，无数的熬夜和加班换来的是业务没有起色，团队几乎解散。苟延残喘到年财年结束后，也就树倒猢狲散了，大部分团队成员转岗的转岗，离职的离职，其实也挺正常的。</p>
<p>那时候内心充满了愤怒，把所有的责任都归在遇到了一个倒霉团队和倒霉领导上，甚至还气不过在脉脉上发帖。</p>
<p><img decoding="async" loading="lazy" alt="maimai" src="https://dongfangzan.cn/assets/images/maimai-e795835b9280583929f143bae657bc6a.png" width="1170" height="2532" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="我的选择">我的选择<a href="https://dongfangzan.cn/2021/12/31/2021/summary#%E6%88%91%E7%9A%84%E9%80%89%E6%8B%A9" class="hash-link" aria-label="我的选择的直接链接" title="我的选择的直接链接">​</a></h2>
<p>其实大家读到这都看得出来，这不就是抗压能力差吗，还说的那么矫情。</p>
<p>是的，冷静下来重新观察自己和所处的环境，可能那个时候在心理上面没有做到真正的准备好，再加上点运气不佳，虽然在这3年期间，每年都能明显体会到自己的成长，但还是有点受不了，毅然决然的就辞了。</p>
<p>但是在这个过程中，时常在思考几个问题：</p>
<ol>
<li>为什么加班熬夜都搞成这个鬼样子了，业务还是没了？</li>
<li>那么如果反过来，我不加班，不熬夜，上班认真干，下班到点走人，会不会也有可能做出成绩？</li>
<li>那么排除环境因素（如：不加班就会被觉得不努力，减少无用的开会，去掉那些上线了却没量的功能），是不是有可能做到朝九晚五，安心下班回家，还能把事情做好？</li>
<li>如果我每天只专注在最有用的东西上，极致的提高自己的效率，让自己家人满意，心情愉悦，是不是有可能在身心健康的前提下让自己的收入稳步提升？</li>
<li>如果我抗压能力确实一般，那是不是我就一定配不上这一份收入？</li>
</ol>
<p>Elon Musk在接受采访的时候说过，即使是最聪明的工程师，在面对一个需求时，通常都会考虑如何在现有的产品上进行优化，而不是考虑这个需求是否正确的。如果这个需求是错的，那么我们做的所有优化就都是无用功。那么为什么会出现这样的问题？</p>
<p>在我们过去接受的教育中，如果我们的老师、父母提出一个很蠢的问题，我们没有拒绝回答的权利，只能顺着他们的思路学习，也没法去质疑我们的老师和父母，因为他们可能是某个领域的专家教授和我们最尊敬的人。</p>
<p>就像在公司的程序员，如果某条业务线做的不好，有可能是这条业务线的销售犯了很蠢的错误（当然也可能有我们自己的问题），导致压根没人用我们的系统，那么无论你怎么去迭代架构，把所有程序员都杀了祭天也无能为力，但作为打工程序员中的一员，我没有这个权利去指责销售不给力。</p>
<p>到这里，我决定把这个问题是否有解，当成一个课题来研究，拿我自己做实验。我相信的是，根本没有所谓的work-life balance.
而是Work is life and life is work. 认真生活，快乐工作才是应该追求的。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="课题描述">课题描述<a href="https://dongfangzan.cn/2021/12/31/2021/summary#%E8%AF%BE%E9%A2%98%E6%8F%8F%E8%BF%B0" class="hash-link" aria-label="课题描述的直接链接" title="课题描述的直接链接">​</a></h3>
<p>在接下来这几年里，希望可以在一个不卷的环境里（最起码自己觉得心情舒畅），完全随着自己意愿来掌控自己的生活，而且生活质量稳步提升。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="评价标准">评价标准<a href="https://dongfangzan.cn/2021/12/31/2021/summary#%E8%AF%84%E4%BB%B7%E6%A0%87%E5%87%86" class="hash-link" aria-label="评价标准的直接链接" title="评价标准的直接链接">​</a></h3>
<ol>
<li>基本原则：保持绝大多数时间心情愉悦，有时间陪家人，有时间发展自己的兴趣爱好。</li>
<li>收入：希望稳中有升，至少不会下降太多，小孩子才做选择，成年人是我都要。</li>
<li>自我提升：每年至少在某一个领域内，希望有一个里程碑式的提升，不会觉得碌碌无为。</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="离职后的复盘">离职后的复盘<a href="https://dongfangzan.cn/2021/12/31/2021/summary#%E7%A6%BB%E8%81%8C%E5%90%8E%E7%9A%84%E5%A4%8D%E7%9B%98" class="hash-link" aria-label="离职后的复盘的直接链接" title="离职后的复盘的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="工作选择">工作选择<a href="https://dongfangzan.cn/2021/12/31/2021/summary#%E5%B7%A5%E4%BD%9C%E9%80%89%E6%8B%A9" class="hash-link" aria-label="工作选择的直接链接" title="工作选择的直接链接">​</a></h3>
<p>上帝给你关上一扇门，就会为你打开一扇窗。</p>
<p>当年本科毕业的时候，感觉自己找不到工作，就去考了个研，没想到就是因为这个学历、过去的互联网经历以及还不算大的年龄（没到35），让我顺利面试通过某事业单位信息部门，收入膝盖斩，一朝回到解放前。</p>
<p>有人肯定会说，你这不就是找了个地方躺平去了吗？还说的一套一套的，假的很。</p>
<p>其实也不能算错，毕竟给自己出的课题的第一条基本原则就是需要大多数时间保持心情愉悦，有时间陪家人，有时间发展自己的兴趣爱好，有可支配的时间，没有这一条，那我的课题就没法进行下去。</p>
<p>但事业单位也是单位，你拿钱不干活坐吃山空那也是不可能的，甚至不少事业单位事情也挺多的挺卷的，闲人多了，也喜欢互相算计来算计去的，各种糟烂事也不少。但<strong>好在</strong>晋升途径不透明，绝大多数人也没啥希望，所以只要不放在心上就无所谓。</p>
<p>同样的问题，如果领导提了一个傻问题，我同样也没法指责说你是个傻X。互联网的技术，对传统企业来说还是太新了，很多人无法接受（领导曾经要求厂家不能使用json作为接口传输格式，必须使用xml，理由是json他看不懂）。
所以目前可以当做是一个兜底的方案吧，希望未来能可以探索出一条更好的路来，这一点我还是有信心。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="技术">技术<a href="https://dongfangzan.cn/2021/12/31/2021/summary#%E6%8A%80%E6%9C%AF" class="hash-link" aria-label="技术的直接链接" title="技术的直接链接">​</a></h3>
<p>到了新的单位，没有承担具体的研发工作了，其实时间上相对就会充裕一些。</p>
<p>有很多之前公司里认识的朋友互相之间就会问，赞赞有没有时间帮忙做个XX项目，在业余时间里去接一些单子来做，当做外快了。</p>
<p>过去这一年多的时间里，相继接触了C#、vue、react、区块链相关、微信公众号、企业微信等等一堆东西的开发工作（以前就是开会、写Java、写SQL，工具人一个），虽然说技术深度上没有提升，但是广度上是之前远远不可想象的。</p>
<p>有人会问，你这跟公司里上班有啥区别，还不是跪舔甲方？</p>
<p>错，我可以看心情选择我喜欢的技术，选择和我合得来的合伙人。甲方不会喷：不行你今年就325！他们只会用给不给钱来为我投票。</p>
<p>在大厂的时候，我接手别人扔过来的多年遗留下来的系统，开发的功能90%没有开量就夭折了，而且我加班加到吐血。我甚至有时候会想，公司给我这么多钱，应该不是喊我来创造价值的，而是不让我给竞争对手创造价值，这在另一个角度来看也是在为公司出力。</p>
<p>离职后开发系统的，100%在稳定的运行着，有的甚至每个月带来上百万的营业流水，有的服务数万用户（虽然不多），我却从来没玩命加班赶工过。</p>
<p>自己还半吊子的写了点开源项目，<a href="https://gitee.com/mortise-and-tenon/mortnon" target="_blank" rel="noopener noreferrer">卯榫/后台快速开发框架</a>，经常水，也没写完，希望2022年有机会能把它完成，至少交付1.0版本，也算是对自己一个交代。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="收入">收入<a href="https://dongfangzan.cn/2021/12/31/2021/summary#%E6%94%B6%E5%85%A5" class="hash-link" aria-label="收入的直接链接" title="收入的直接链接">​</a></h3>
<p>个人有记账的习惯，按照目前记录的情况，收入基本与在大厂上班时总体收入持平（我级别也不高），甚至还多了那么一丢丢，比我预想的还要好一点。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="生活">生活<a href="https://dongfangzan.cn/2021/12/31/2021/summary#%E7%94%9F%E6%B4%BB" class="hash-link" aria-label="生活的直接链接" title="生活的直接链接">​</a></h3>
<p>今年6月份，在我了离开大厂差不多一周年的前几天，家里迎来了小妹，让我解锁了新的成就。之前天天忙，没有时间陪大哥，大哥也不喜欢我（T_T）。
现在应该会抽出更多的时间陪着两小只一起成长。</p>
<p><img decoding="async" loading="lazy" alt="children" src="https://dongfangzan.cn/assets/images/children-3c8476b777c43775cdb4e80c42fd381f.png" width="1080" height="1440" class="img_ev3q"></p>
<p>小时候羡慕其他人家的孩子可以弹钢琴，所以我也买了架电钢琴，放在家里当摆设，虽然我不会弹，但是我得有。男人永远都长不大，只有玩具在不断更新。
目前已经学会两只老虎和小星星，大哥觉得很搞笑。</p>
<p><img decoding="async" loading="lazy" alt="piano" src="https://dongfangzan.cn/assets/images/piano-29a66973e81d014e7d42958be63c4a36.png" width="1702" height="1276" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="读书">读书<a href="https://dongfangzan.cn/2021/12/31/2021/summary#%E8%AF%BB%E4%B9%A6" class="hash-link" aria-label="读书的直接链接" title="读书的直接链接">​</a></h3>
<p>小说：还是一如既往的喜欢侦探小说，尤其是东野圭吾《沉默的巡游》、《红手指》、《盛夏方程式》、《秘密》、《新参者》、《金色梦乡》</p>
<p>传记：《巴菲特传》、《硅谷钢铁侠》、《你当像鸟飞往你的山》、《我在碧桂园的1000天》</p>
<p>会计：《世界上最简单的会计书》、《东奥快会计在线CPA-轻松过关一（会计、审计、税法）》（如果这个也算书的话，了解一下国内最不好考的证到底在说个啥）</p>
<p>数学：《刘嘉概率论通识讲义》</p>
<p>技术：《Mongodb进阶与实战》、《Go语言实战》、《labuladong的算法小抄》（看了一半，练练脑挺好的）</p>
<p>审计：《让数字说话》</p>
<p>其他课程：看了一个月李宏毅教授的机器学习相关课程，没坚持下来，放弃了。</p>
<p>还有些其他的看了一半的书一大堆，就不一一记录了。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="运动">运动<a href="https://dongfangzan.cn/2021/12/31/2021/summary#%E8%BF%90%E5%8A%A8" class="hash-link" aria-label="运动的直接链接" title="运动的直接链接">​</a></h3>
<p>个人感觉练的不算少，但是吃的也不少，所以一点没瘦。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="https://dongfangzan.cn/2021/12/31/2021/summary#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>过去的这一年多，不断的提醒自己，要专注、保持平常心，甚至把张一鸣前些年的微博总结出来之后打印下来，隔段时间看一遍，帮助自己躁动的内心重新安静下来，在需要工作的时候提升专注力。有时候会被调侃，不去字节跳动拍老板马屁可惜了，哈哈。</p>
<p>从2014年7月毕业到2020年6月大厂离职，我把这段经历当做认识社会的第一个阶段，做的不够好，但也收获了很多，就像《钢炼》里爱德华说的：</p>
<blockquote>
<p>没有伴随着痛楚的教训，是毫无意义的。因为人若不牺牲些什么，是什么都无法得到的。但当忍受过这种痛楚，将其克服的时候，人就会得到不输给任何事的坚韧的心，没错，钢铁般坚韧的心。</p>
</blockquote>
<p>从2020年7月开始，第二个阶段稳步提升，在属于我的机遇闪现前，把自己能做好的，做到极致。但我要的永远不是朝死里卷，而是快乐工作、认真生活。</p>
<p>新的一年，新的flag，该立还是要立，明年再来看完成多少</p>
<ul>
<li>减肥减到130斤，体脂率15%</li>
<li>持续写作，持续读书</li>
<li>完成<a href="https://gitee.com/mortise-and-tenon/Fmortnon" target="_blank" rel="noopener noreferrer">卯榫/后台快速开发框架</a>1.0版本的开发</li>
<li>通过CPA会计、审计、税法考试</li>
<li>深入学习react、Typescript等前端知识</li>
<li>LeetCode刷200-300题</li>
</ul>]]></content:encoded>
            <category>总结</category>
        </item>
    </channel>
</rss>