<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://ittour.net/blog</id>
    <title>IT Tour Blog</title>
    <updated>2026-03-24T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://ittour.net/blog"/>
    <subtitle>IT Tour Blog</subtitle>
    <icon>https://ittour.net/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[OpenClaw Installation and Configuration]]></title>
        <id>https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration</id>
        <link href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration"/>
        <updated>2026-03-24T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>OpenClaw 是一个面向 AI Agent 与 Computer Use（计算机操作智能体） 场景的开源项目，旨在让大模型从传统的“文本理解与生成”能力，进一步发展为具备“界面感知、任务规划与操作执行”能力的智能体系统。通过结合视觉理解、自然语言推理以及对浏览器或桌面环境的动作控制，OpenClaw 使模型能够围绕用户目标完成一系列实际任务，例如信息检索、网页操作、表单填写、流程执行与界面交互等。</p>
<p>下面以 OpenClaw v2026.3.13 版本为例, 介绍其在 WSL2/Debian 系统中的安装配置过程</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-前置条件prerequisite">1. 前置条件/Prerequisite<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#1-%E5%89%8D%E7%BD%AE%E6%9D%A1%E4%BB%B6prerequisite" class="hash-link" aria-label="Direct link to 1. 前置条件/Prerequisite" title="Direct link to 1. 前置条件/Prerequisite" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-安装基础工具集">1.1. 安装基础工具集<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#11-%E5%AE%89%E8%A3%85%E5%9F%BA%E7%A1%80%E5%B7%A5%E5%85%B7%E9%9B%86" class="hash-link" aria-label="Direct link to 1.1. 安装基础工具集" title="Direct link to 1.1. 安装基础工具集" translate="no">​</a></h3>
<p>WSL2/Debian 为例:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">sudo apt-get install build-essential procps curl file git</span><br></span></code></pre></div></div>
<blockquote>
<p>OpenClaw 安装及 Skill 安装依赖 git</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-安装-nodejs---openclaw-运行环境">1.2. 安装 Node.js - OpenClaw 运行环境<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#12-%E5%AE%89%E8%A3%85-nodejs---openclaw-%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83" class="hash-link" aria-label="Direct link to 1.2. 安装 Node.js - OpenClaw 运行环境" title="Direct link to 1.2. 安装 Node.js - OpenClaw 运行环境" translate="no">​</a></h3>
<p>Debian/nvm 为例, 其他环境请参考: <a href="https://nodejs.org/en/download" target="_blank" rel="noopener noreferrer" class="">https://nodejs.org/en/download</a></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">\. "$HOME/.nvm/nvm.sh"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nvm install 24</span><br></span></code></pre></div></div>
<blockquote>
<p>OpenClaw 依赖的 node 版本是 22.12.0+, 如果没有版本选择倾向, 可以让 OpenClaw 安装脚本自动安装</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="13-安装-homebrew---某些-skill-安装需要">1.3. 安装 Homebrew - 某些 Skill 安装需要<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#13-%E5%AE%89%E8%A3%85-homebrew---%E6%9F%90%E4%BA%9B-skill-%E5%AE%89%E8%A3%85%E9%9C%80%E8%A6%81" class="hash-link" aria-label="Direct link to 1.3. 安装 Homebrew - 某些 Skill 安装需要" title="Direct link to 1.3. 安装 Homebrew - 某些 Skill 安装需要" translate="no">​</a></h3>
<p>参考: <a href="https://brew.sh/" target="_blank" rel="noopener noreferrer" class="">https://brew.sh/</a>, <a href="https://docs.brew.sh/Homebrew-on-Linux" target="_blank" rel="noopener noreferrer" class="">https://docs.brew.sh/Homebrew-on-Linux</a></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"</span><br></span></code></pre></div></div>
<p>安装结束时按照提示添加 brew 到 PATH:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">echo &gt;&gt; /home/zhangsan/.bashrc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv bash)"' &gt;&gt; /home/zhangsan/.bashrc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv bash)"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="14-安装-golang-shell---某些-skill-安装需要">1.4. 安装 golang shell - 某些 Skill 安装需要<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#14-%E5%AE%89%E8%A3%85-golang-shell---%E6%9F%90%E4%BA%9B-skill-%E5%AE%89%E8%A3%85%E9%9C%80%E8%A6%81" class="hash-link" aria-label="Direct link to 1.4. 安装 golang shell - 某些 Skill 安装需要" title="Direct link to 1.4. 安装 golang shell - 某些 Skill 安装需要" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">rm -rf /usr/local/go &amp;&amp; tar -C /usr/local -xzf go1.26.1.linux-amd64.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export PATH=$PATH:/usr/local/go/bin</span><br></span></code></pre></div></div>
<p>参考: <a href="https://go.dev/doc/install" target="_blank" rel="noopener noreferrer" class="">https://go.dev/doc/install</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-安装过程中的主要配置">2. 安装过程中的主要配置<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#2-%E5%AE%89%E8%A3%85%E8%BF%87%E7%A8%8B%E4%B8%AD%E7%9A%84%E4%B8%BB%E8%A6%81%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="Direct link to 2. 安装过程中的主要配置" title="Direct link to 2. 安装过程中的主要配置" translate="no">​</a></h2>
<p>OpenClaw 提供了多种安装方式, 比如可以通过<code>npm i -g openclaw</code>的方式安装, 或<code>Hackable</code>的源码方式安装等. 这里选择最方便的<code>one-liner</code>安装方式, 直接在 linux shell 环境启动安装:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">curl -fsSL https://openclaw.ai/install.sh | bash</span><br></span></code></pre></div></div>
<blockquote>
<p>更多介绍请参考文档: <a href="https://docs.openclaw.ai/start/getting-started" target="_blank" rel="noopener noreferrer" class="">https://docs.openclaw.ai/start/getting-started</a></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-step-by-step-的介绍">2.1. Step by step 的介绍<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#21-step-by-step-%E7%9A%84%E4%BB%8B%E7%BB%8D" class="hash-link" aria-label="Direct link to 2.1. Step by step 的介绍" title="Direct link to 2.1. Step by step 的介绍" translate="no">​</a></h3>
<ol>
<li class="">启安装后会先检测并安装基础的软件环境, 然后进入配置向导. 首先是一个风险提示, 想安装就输入 y 或 yes</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  I understand this is personal-by-default and shared/multi-user use requires lock-down. Continue?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Yes / ○ No</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">配置方式, 可以选择 QuickStart, 后期通过<code>openclaw configure</code>再配置其它, 或通过<code>openclaw onboard</code>重启配置向导. 这里选择 Manual (<strong>通过上下方向键移动选中项后回车</strong>)</li>
</ol>
<blockquote>
<p><strong>注: 选择 Manual 的目的是把相关配置一次性配置完. 后续的这些步骤是没有次序和依赖关系的, 都可以先选择 Skip for now 或 Finished 跳过向导后再次启动配置, 设置步骤编号只是为了读起来有次序感.</strong></p>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Onboarding mode</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ QuickStart</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Manual (Configure port, network, Tailscale, and auth options.)</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">选择 Local gateway 在本地安装 gateway, 而不是连接到其它 gateway</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  What do you want to set up?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Local gateway (this machine) (No gateway detected (ws://127.0.0.1:18789))</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Remote gateway (info-only)</span><br></span></code></pre></div></div>
<ol start="4">
<li class="">设定工作目录, 没有特殊要求用默认值即可</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Workspace directory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  /home/zhangsan/.openclaw/workspace</span><br></span></code></pre></div></div>
<ol start="5">
<li class="">配置模型提供者</li>
</ol>
<blockquote>
<ul>
<li class="">这里有必要说明一下模型的选择, 如果你是想试玩一下 OpenClaw, 感受一下其能力, 但又没有购买 token 包, 可以暂时先选择<code>Qwen (OAuth)</code>, 可以很方便的打开浏览器完成邮箱认证获取小部分免费额度并可投入使用一小会儿, 不过聊几个回合就会把免费额度用完了, 仅够体验</li>
<li class="">还有另一个获取免费 token 的渠道就是 nVidia, 登录 build.nvidia.com/models 并使用手机号注册(可能要海外手机号), 可以获得<code>Up to 40 rpm</code>的 API 调用额度, 在平台上可以免费使用标记为 Free Endpoint 的模型. 比如<code>qwen/qwen3.5-122b-a10b</code>, <code>moonshotai/kimi-k2.5</code> 等都可以使用. 注意 OpenClaw 中需要选择的 provider 是<code>Custom Provider</code></li>
<li class="">其它非在列的第三方 API 厂商都选择<code>Custom Provider</code>, 指定<code>Base URL</code>和<code>API key</code>后, 再根据 API 类型设置是<code>OpenAI-compatible</code>还是<code>Anthropic-compatible</code>, 如果是<code>openai-responses</code>类型的API, 则需要直接修改配置文件<code>openclaw.json</code></li>
<li class="">也可以选择<code>Skip for now</code>, 稍后通过<code>openclaw configure</code>重新启动配置</li>
</ul>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Model/auth provider</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ OpenAI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Anthropic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Chutes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ MiniMax</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Moonshot AI (Kimi K2.5)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Google</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ xAI (Grok)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Mistral AI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Volcano Engine</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ BytePlus</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ OpenRouter</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Kilo Gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Qwen (OAuth)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Z.AI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Qianfan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Alibaba Cloud Model Studio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Copilot</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Vercel AI Gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ OpenCode</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Xiaomi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Synthetic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Together AI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Hugging Face</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Venice AI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ LiteLLM</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Cloudflare AI Gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Custom Provider</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Ollama</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ SGLang</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ vLLM</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Skip for now</span><br></span></code></pre></div></div>
<p>这是选择<code>Qwen (OAuth)</code>后出现的配置步骤, 根据提示的链接完成认证即可:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◒  Starting Qwen OAuth…│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">◇  Qwen OAuth ─────────────────────────────────────────────────────────────────────────╮</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">│  Open https://chat.qwen.ai/authorize?user_code=XXXXXXXX&amp;client=qwen-code to approve  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  access.                                                                             │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  If prompted, enter the code XXXXXXXX.                                               │</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">◐  Waiting for Qwen OAuth approval….</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">◇  Qwen OAuth complete</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">◇  Provider notes ──────────────────────────────────────────────────────────────────────╮</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">│  Qwen OAuth tokens auto-refresh. Re-run login if refresh fails or access is revoked.  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  Base URL defaults to https://portal.qwen.ai/v1. Override                             │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  models.providers.qwen-portal.baseUrl if needed.                                      │</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">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">◇  Model configured ─────────────────────────────╮</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">│  Default model set to qwen-portal/coder-model  │</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">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">◆  Default model</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Keep current (qwen-portal/coder-model)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Enter model manually</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ qwen-portal/coder-model</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● qwen-portal/vision-model (Qwen Vision · ctx 125k)</span><br></span></code></pre></div></div>
<ol start="6">
<li class="">设定网关端口, 默认即可</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Gateway port</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  18789</span><br></span></code></pre></div></div>
<ol start="7">
<li class="">设定网关服务绑定的 IP, 如果需要向外部提供服务, 可选择<code>LAN (0.0.0.0)</code>, 体验推荐<code>Loopback (127.0.0.1)</code></li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Gateway bind</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Loopback (127.0.0.1)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ LAN (0.0.0.0)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Tailnet (Tailscale IP)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Auto (Loopback → LAN)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Custom IP</span><br></span></code></pre></div></div>
<ol start="8">
<li class="">连接网关的认证方式, Token 即可</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Gateway auth</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Token (Recommended default (local + remote))</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Password</span><br></span></code></pre></div></div>
<ol start="9">
<li class="">这一步是设定是否通过 Tailscale 服务把网关端口暴露到公网, 强烈建议 Off, 除非你了解并愿意承担其风险</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Tailscale exposure</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Off (No Tailscale exposure)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Serve</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Funnel</span><br></span></code></pre></div></div>
<ol start="10">
<li class="">设置 Gateway token 的保存方式. 测试环境用第一项; 生产环境用 SecretRef, 防止 openclaw.json 文件中存储明文 token</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  How do you want to provide the gateway token?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Generate/store plaintext token (Default)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Use SecretRef</span><br></span></code></pre></div></div>
<blockquote>
<p>细节参见: <a href="https://docs.openclaw.ai/gateway/secrets" target="_blank" rel="noopener noreferrer" class="">https://docs.openclaw.ai/gateway/secrets</a></p>
</blockquote>
<ol start="11">
<li class="">让你选择使用指定的 token (粘贴已有的token), 或自动生成一个 token (保持空白后回车)</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Gateway token (blank to generate)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  Needed for multi-machine or non-loopback access</span><br></span></code></pre></div></div>
<ol start="12">
<li class="">是否现在配置 Channel? Yes</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Configure chat channels now?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Yes / ○ No</span><br></span></code></pre></div></div>
<blockquote>
<p>Channel 的作用是让你设置可以通过哪个社交软件(聊天工具)来给 OpenClaw 发指令并获取交互输出</p>
</blockquote>
<ol start="13">
<li class="">这里我们选择在国内比较方便配置的飞书</li>
</ol>
<blockquote>
<p>在 OpenClaw v2026.3.13 版本中, 飞书插件安装有一个小坑需要注意一下: 如果 openclaw 安装时使用的是 one-liner 安装, 安装飞书插件那里一定选择<code>Use local plugin path</code>, 不要再从 npm 库下载一个, 否则后面一直会有一个令人讨厌的 Warning 跟着你: <code>Config warnings:\n- plugins.entries.feishu: plugin feishu: duplicate plugin id detected; later plugin may be overridden (/home/zhangsan/.openclaw/extensions/feishu/index.ts)</code></p>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Select a channel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Telegram (Bot API)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ WhatsApp (QR link)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Discord (Bot API)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ IRC (Server + Nick)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Google Chat (Chat API)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Slack (Socket Mode)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Signal (signal-cli)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ iMessage (imsg)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ LINE (Messaging API)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Feishu/Lark (飞书) (plugin · install)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Nostr (NIP-04 DMs)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Microsoft Teams (Bot Framework)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Mattermost (plugin)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Nextcloud Talk (self-hosted)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Matrix (plugin)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ BlueBubbles (macOS app)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Zalo (Bot API)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Zalo (Personal Account)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Synology Chat (Webhook)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Tlon (Urbit)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Finished</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">◆ Install Feishu plugin?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ ○ Download from npm (@openclaw/feishu)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ ● Use local plugin path (/home/zhangsan/.nvm/versions/node/v24.14.0/lib/node_modules/openclaw/extensions/feishu)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ ○ Skip for now</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">12:01:27 [plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load: feishu (/home/zhangsan/.nvm/versions/node/v24.14.0/lib/node_modules/openclaw/extensions/feishu/index.ts). Set plugins.allow to explicit trusted ids.</span><br></span></code></pre></div></div>
<blockquote>
<p>注: 据说 OpenClaw 在 2026.3.22 ~ 2026.3.23 版本的更新中，对底层的插件架构和扩展目录进行了大规模重构, 新版本中已经不存有 <code>/home/zhangsan/.nvm/versions/node/v24.14.0/lib/node_modules/openclaw/extensions</code>这样的路径, 所以安装选项也会发生变化, 请自行斟酌</p>
</blockquote>
<ol start="14">
<li class="">开始配置飞书</li>
</ol>
<blockquote>
<ul>
<li class="">启用飞书 Channel 需要在飞书开放平台创建应用和机器人, 获取 App ID 和 App Secret, 需要注意的是权限设置, 确保可以向机器人私发消息</li>
<li class="">飞书开放平台配置参考文档:<!-- -->
<ul>
<li class=""><a href="https://docs.openclaw.ai/channels/feishu#step-1-create-a-feishu-app" target="_blank" rel="noopener noreferrer" class="">https://docs.openclaw.ai/channels/feishu#step-1-create-a-feishu-app</a></li>
<li class=""><a href="https://copaw.agentscope.io/docs/channels/#%E9%A3%9E%E4%B9%A6" target="_blank" rel="noopener noreferrer" class="">https://copaw.agentscope.io/docs/channels/#飞书</a></li>
</ul>
</li>
<li class="">除了文档中介绍的权限之外, 还是开通 tenant/租户 级别的这些权限: <code>contact:contact.base:readonly</code>, <code>contact:contact:access_as_app</code>, <code>contact:contact:readonly</code>, <code>contact:contact:readonly_as_app</code></li>
</ul>
</blockquote>
<p>获取到 App ID 和 App Secret 后, 跟随配置向导完成如下设置:</p>
<ul>
<li class="">直接粘贴飞书 App Secret 和 App ID (敏感正式环境可选择 external secret provider)</li>
<li class="">设置连接方式 WebSocket</li>
<li class="">根据所在环境选择飞书域名, 国内为 feishu.cn, 国外为 larksuite.com</li>
<li class="">安全设置, 设置哪些群聊可以使用飞书机器人. 可以通过 Allowlist 来设置群 ID, 或设置为 Open 允许所有群使用. 群聊的会话 ID 可以在飞书群 -&gt; 设置界面的最底部查看</li>
</ul>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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 credentials ──────────────────────────────────────────────────────────────╮</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) Go to Feishu Open Platform (open.feishu.cn)                                   │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  2) Create a self-built app                                                       │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  3) Get App ID and App Secret from Credentials page                               │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  4) Enable required permissions: im:message, im:chat, contact:user.base:readonly  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  5) Publish the app or add it to a test group                                     │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  Tip: you can also set FEISHU_APP_ID / FEISHU_APP_SECRET env vars.                │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  Docs: feishu                 │</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">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">◆  How do you want to provide this App Secret?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Enter App Secret (Stores the credential directly in OpenClaw config)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Use external secret provider</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">◇  Enter Feishu App Secret</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</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">◇  Enter Feishu App ID</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  cli_xxxxxxxxxxxxxxxx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[info]: [ 'client ready' ]</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 connection test ───────────────────────────╮</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">│  Connected as ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  │</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">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">◆  Feishu connection mode</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● WebSocket (default)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Webhook</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">◆  Which Feishu domain?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Feishu (feishu.cn) - China</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Lark (larksuite.com) - International</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">◆  Group chat policy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Allowlist - only respond in specific groups</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Open - respond in all groups (requires mention)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Disabled - don't respond in groups</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">◆  Group chat allowlist (chat_ids)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  oc_xxxxx, oc_yyyyy</span><br></span></code></pre></div></div>
<p>飞书配置完成后如果不再配置其他 Channel, 就在 Channel 配置界面选择 Finished 继续.</p>
<ol start="15">
<li class="">接下来向导会问你是否要配置私聊（Direct Message, DM）访问策略: Yes 无疑</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Configure DM access policies now? (default: pairing)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Yes / ○ No</span><br></span></code></pre></div></div>
<ol start="16">
<li class="">设置飞书私聊策略, 对应的选择分别是: 一一配对, 白名单, 全开放</li>
</ol>
<blockquote>
<p>如果选择一一配对, 某个用户给机器人私发消息时会弹出配对指令, 通过 openclaw 执行该指令授权后才会有响应: <code>openclaw pairing approve feishu &lt;CODE&gt;</code></p>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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 DM policy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Pairing (recommended)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Allowlist (specific users only)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Open (public inbound DMs)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Disabled (ignore DMs)</span><br></span></code></pre></div></div>
<ol start="17">
<li class="">为 openclaw 配置联网搜索功能, 这也是一个必要的基本能力</li>
</ol>
<blockquote>
<p>个人使用的话, 推荐可以免费薅羊毛的 Brave Search, 方法也比较简单:</p>
<ul>
<li class="">注册登录brave search api 平台: <a href="https://brave.com/search/api/" target="_blank" rel="noopener noreferrer" class="">https://brave.com/search/api/</a></li>
<li class="">在 Billing -&gt; Payment method 中绑定一个卡, 支持银联, 绑定后会预扣一个美金</li>
<li class="">在 Usage limits 中可以设置每月使用限额, 设置为 5 美金. Brave Search 会每月赠送你 5 美金的额度. 这样就互抵了, 免费使用</li>
<li class="">进入<code>API keys</code>, 点击<code>Add API key</code>, 创建一下 key 并复制, 选中<code>Brave Search</code>并在接下来的步骤填入复制的 key, Brave Search 就配置完成了</li>
</ul>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Search provider</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Brave Search (Structured results · country/language/time filters)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Gemini (Google Search)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Grok (xAI)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Kimi (Moonshot)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Perplexity Search</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Skip for now</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">◇  Brave Search API key</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  BSAxxxxxx_XXXXXXXXX_xxxxxxxxxxx</span><br></span></code></pre></div></div>
<ol start="18">
<li class="">Skill 配置步骤, 暂不需要什么高级功能, 可以选择跳过, 相应 Skill 需要的 KEY 也全部选 No, 如需要可以后期再配置</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◇  Skills status ─────────────╮</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">│  Eligible: 18               │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  Missing requirements: 31   │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  Unsupported on this OS: 7  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  Blocked by allowlist: 0    │</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">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">◆  Configure skills now? (recommended)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Yes / ● No</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">◇  Set GOOGLE_PLACES_API_KEY for goplaces?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  No</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">◇  Set GEMINI_API_KEY for nano-banana-pro?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  No</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">◇  Set NOTION_API_KEY for notion?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  No</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">◇  Set OPENAI_API_KEY for openai-image-gen?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  No</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">◇  Set OPENAI_API_KEY for openai-whisper-api?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  No</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">◆  Set ELEVENLABS_API_KEY for sag?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Yes / ● No</span><br></span></code></pre></div></div>
<ol start="19">
<li class="">Hooks 建议启用 command-logger 和 session-memory, 主要用于实现命令日志记录和会话记忆功能</li>
</ol>
<blockquote>
<p>复选框的选择方式是: 方向键移动到高亮选项, 然后通过空格键选中或取消选中</p>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Enable hooks?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ◻ Skip for now</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ◻ 🚀 boot-md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ◻ 📎 bootstrap-extra-files</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ◼ 📝 command-logger (Log all command events to a centralized audit file)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ◼ 💾 session-memory (Save session context to memory when /new or /reset command is issued)</span><br></span></code></pre></div></div>
<ol start="20">
<li class="">是否在 Service 形式安装 gateway: Yes, 安装后可以像管理普通 systemd 服务的形式进行管理, 比如通过 <code>systemctl --user status openclaw-gateway</code> 来查询状态</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Install Gateway service (recommended)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Yes / ○ No</span><br></span></code></pre></div></div>
<ol start="21">
<li class="">完成安装</li>
</ol>
<blockquote>
<ul>
<li class="">接下来根据向导完成安装就行了</li>
<li class="">需要记录下 Gateway 的 token, 可以直接点击 Web UI 链接打开 OpenClaw Web UI</li>
<li class="">最后的<code>bash shell completion for openclaw</code>可以根据个人习惯选择装或不装, 没啥大用, 就那几个命令</li>
</ul>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">◆  Gateway service runtime</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Node (recommended) (Required for WhatsApp + Telegram. Bun can corrupt memory on reconnect.)</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">◒  Installing Gateway service…</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Installed systemd service: /home/zhangsan/.config/systemd/user/openclaw-gateway.service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">◇  Gateway service installed.</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">Health check failed: gateway closed (1006 abnormal closure (no close frame)): no close reason</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Gateway target: ws://127.0.0.1:18789</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Source: local loopback</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Config: /home/zhangsan/.openclaw/openclaw.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Bind: lan</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">◇  Health check help ────────────────────────────────╮</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">│  Docs:                                             │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  https://docs.openclaw.ai/gateway/health           │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  https://docs.openclaw.ai/gateway/troubleshooting  │</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">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">◇  Optional apps ────────────────────────╮</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">│  Add nodes for extra features:         │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  - macOS app (system + notifications)  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  - iOS app (camera/canvas)             │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  - Android app (camera/canvas)         │</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">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">◇  Control UI ───────────────────────────────────────────────────────────────────────╮</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">│  Web UI: http://127.0.0.1:18789/                                                 │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  Web UI (with token):                                                              │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  http://127.0.0.1:18789/#token=25637d07f8f36fe427c6de1d9f2214fc564f2be49809359d  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  Gateway WS: ws://127.0.0.1:18789                                                │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  Gateway: not detected (SECURITY ERROR: Gateway URL "ws://127.0.0.1:18789" uses  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  plaintext ws:// to a non-loopback address.)                                       │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  Docs: https://docs.openclaw.ai/web/control-ui                                     │</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">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">◇  Workspace backup ────────────────────────────────────────╮</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">│  Back up your agent workspace.                            │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  Docs: https://docs.openclaw.ai/concepts/agent-workspace  │</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">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">◇  Security ──────────────────────────────────────────────────────╮</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">│  Running agents on your computer is risky — harden your setup:  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  https://docs.openclaw.ai/security                              │</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">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">◆  Enable bash shell completion for openclaw?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Yes / ○ No</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="22-配置文件">2.2. 配置文件<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#22-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6" class="hash-link" aria-label="Direct link to 2.2. 配置文件" title="Direct link to 2.2. 配置文件" translate="no">​</a></h3>
<p>除了一些凭证或 token 信息, OpenClaw 的配置内容都保存在 .openclaw/openclaw.json 文件中, 如果你对该文件结构足够熟悉, 可以直接修改该文件, 然后执行<code>openclaw daemon restart</code>重启生效即可.</p>
<p>下面是一个配置文件示例:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">"meta"</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">"lastTouchedVersion"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026.3.23-2"</span><span class="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">"lastTouchedAt"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026-03-25T07:13:31.449Z"</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">"wizard"</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">"lastRunAt"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026-03-25T07:13:31.416Z"</span><span class="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">"lastRunVersion"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026.3.23-2"</span><span class="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">"lastRunCommand"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"onboard"</span><span class="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">"lastRunMode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"local"</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">"auth"</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">"profiles"</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">"qwen-portal:default"</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">"provider"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen-portal"</span><span class="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">"mode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"oauth"</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">"ollama:default"</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">"provider"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ollama"</span><span class="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">"mode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"api_key"</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><span class="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">"models"</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">"mode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"merge"</span><span class="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">"providers"</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">"mycompany-openai"</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">"baseUrl"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://ai.mycompany.com/openai/v1"</span><span class="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">"apiKey"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxx"</span><span class="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">"api"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"openai-responses"</span><span class="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">"models"</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 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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gpt-5.3-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 property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gpt-5.3-chat (Custom Provider)"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"input"</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">"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">"image"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100000</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">16000</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gpt-5.4"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gpt-5.4 (Custom Provider)"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"input"</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">"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">"image"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000000</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">128000</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><span class="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">"mycompany-anthropic"</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">"baseUrl"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://ai.mycompany.com/v1"</span><span class="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">"apiKey"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sk-xxxxxxxxxxxxxxxxxxxxxxx"</span><span class="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">"api"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"anthropic-messages"</span><span class="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">"models"</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 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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"claude-haiku-4-5"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"claude-haiku-4-5 (Custom Provider)"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"input"</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">"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">"image"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200000</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">64000</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"claude-sonnet-4-6"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"claude-sonnet-4-6 (Custom Provider)"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"input"</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">"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">"image"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000000</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">64000</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"claude-opus-4-6"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"claude-opus-4-6 (Custom Provider)"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"input"</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">"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">"image"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000000</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">128000</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><span class="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">"mycompany-google"</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">"baseUrl"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://ai.mycompany.com/v1"</span><span class="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">"apiKey"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sk-xxxxxxxxxxxxxxxxxxxxxxx"</span><span class="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">"api"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"google-generative-ai"</span><span class="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">"models"</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 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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gemini-3.1-flash-lite"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gemini-3.1-flash-lite (Custom Provider)"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"input"</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">"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">"image"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000000</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65000</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gemini-3.1-pro"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gemini-3.1-pro (Custom Provider)"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"input"</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">"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">"image"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000000</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65000</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><span class="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">"ollama"</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">"baseUrl"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://127.0.0.1:11434"</span><span class="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">"apiKey"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OLLAMA_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 property" style="color:#36acaa">"api"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ollama"</span><span class="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">"models"</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 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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"glm-4.7-flash"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"glm-4.7-flash"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="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">"input"</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">"text"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">128000</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8192</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen3-embedding:4b"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen3-embedding:4b"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="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">"input"</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">"text"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40960</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8192</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen3.5:2b"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen3.5:2b"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="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">"input"</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">"text"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">262144</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8192</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen2.5:3b"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen2.5:3b"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="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">"input"</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">"text"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">32768</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8192</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"nomic-embed-text:latest"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"nomic-embed-text:latest"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="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">"input"</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">"text"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2048</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8192</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen3.5:4b"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen3.5:4b"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="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">"input"</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">"text"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">262144</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8192</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen3:4b"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen3:4b"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="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">"input"</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">"text"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">262144</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8192</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen3:8b"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen3:8b"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="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">"input"</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">"text"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40960</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8192</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><span class="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">"nvidia-nim"</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">"baseUrl"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://integrate.api.nvidia.com/v1"</span><span class="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">"apiKey"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"nvapi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"</span><span class="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">"api"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"openai-completions"</span><span class="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">"models"</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 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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"moonshotai/kimi-k2.5"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"moonshotai/kimi-k2.5 (Custom Provider)"</span><span class="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">"api"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"openai-completions"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="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">"input"</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">"text"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">16000</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4096</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen/qwen3.5-397b-a17b"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen/qwen3.5-397b-a17b (Custom Provider)"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"input"</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">"text"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">16000</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4096</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><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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen/qwen3-5-122b-a10b"</span><span class="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">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"qwen / qwen3-5-122b-a10b (Custom Provider)"</span><span class="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">"reasoning"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"input"</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">"text"</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">"cost"</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">"input"</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 property" style="color:#36acaa">"output"</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 property" style="color:#36acaa">"cacheRead"</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 property" style="color:#36acaa">"cacheWrite"</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 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">"contextWindow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">16384</span><span class="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">"maxTokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4096</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><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 property" style="color:#36acaa">"agents"</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">"defaults"</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">"model"</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">"primary"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"mycompany-anthropic/claude-sonnet-4-6"</span><span class="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">"fallbacks"</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">"mycompany-anthropic/claude-haiku-4-5"</span><span class="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">"mycompany-openai/gpt-5.3-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">"mycompany-anthropic/claude-opus-4-6"</span><span class="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">"mycompany-google/gemini-3.1-pro"</span><span class="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">"mycompany-google/gemini-3.1-flash-lite"</span><span class="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">"mycompany-openai/gpt-5.4"</span><span class="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">"nvidia-nim/qwen/qwen3.5-122b-a10b"</span><span class="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">"nvidia-nim/qwen/qwen3.5-397b-a17b"</span><span class="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">"nvidia-nim/moonshotai/kimi-k2.5"</span><span class="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">"ollama/qwen3:4b"</span><span class="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">"ollama/qwen3.5:4b"</span><span class="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">"ollama/qwen3.5:2b"</span><span class="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">"ollama/qwen3:8b"</span><span class="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">"ollama/qwen2.5:3b"</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 property" style="color:#36acaa">"models"</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">"ollama/qwen3:4b"</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 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">"ollama/qwen3.5:4b"</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 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">"ollama/qwen3.5:2b"</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 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">"ollama/qwen3:8b"</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 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">"ollama/qwen2.5:3b"</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 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">"nvidia-nim/moonshotai/kimi-k2.5"</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 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">"nvidia-nim/qwen/qwen3.5-397b-a17b"</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 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">"nvidia-nim/qwen/qwen3.5-122b-a10b"</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 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">"mycompany-openai/gpt-5.4"</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 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">"mycompany-openai/gpt-5.3-chat"</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 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">"mycompany-anthropic/claude-opus-4-6"</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 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">"mycompany-anthropic/claude-haiku-4-5"</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 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">"mycompany-anthropic/claude-sonnet-4-6"</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 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">"mycompany-google/gemini-3.1-flash-lite"</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 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">"mycompany-google/gemini-3.1-pro"</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 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">"workspace"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/home/zhangsan/.openclaw/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 property" style="color:#36acaa">"memorySearch"</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">"enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"provider"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ollama"</span><span class="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">"remote"</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">"baseUrl"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://127.0.0.1:11434"</span><span class="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">"apiKey"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ollama"</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">"model"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"nomic-embed-text"</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 property" style="color:#36acaa">"list"</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 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">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"main"</span><span class="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">"model"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"mycompany-openai/gpt-5.4"</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><span class="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">"tools"</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">"profile"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"full"</span><span class="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">"web"</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">"search"</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">"enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"provider"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"brave"</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><span class="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">"commands"</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">"native"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"auto"</span><span class="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">"nativeSkills"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"auto"</span><span class="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">"restart"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"ownerDisplay"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"raw"</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">"session"</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">"dmScope"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"per-channel-peer"</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">"hooks"</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">"internal"</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">"enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"entries"</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">"command-logger"</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">"enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" 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 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">"session-memory"</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">"enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" 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 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><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">"channels"</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">"feishu"</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">"enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"appId"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cli_xxxxxxxxxxxxxxxx"</span><span class="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">"appSecret"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"</span><span class="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">"connectionMode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"websocket"</span><span class="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">"domain"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"feishu"</span><span class="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">"groupPolicy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"allowlist"</span><span class="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">"groupAllowFrom"</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">"oc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"</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><span class="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">"gateway"</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">"port"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">18789</span><span class="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">"mode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"local"</span><span class="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">"bind"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"lan"</span><span class="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">"controlUi"</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">"allowedOrigins"</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">"http://localhost:18789"</span><span class="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">"http://127.0.0.1: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><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">"auth"</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">"mode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"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 property" style="color:#36acaa">"token"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"</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">"tailscale"</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">"mode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"off"</span><span class="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">"resetOnExit"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</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">"nodes"</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">"denyCommands"</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">"camera.snap"</span><span class="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">"camera.clip"</span><span class="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">"screen.record"</span><span class="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">"contacts.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 string" style="color:#e3116c">"calendar.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 string" style="color:#e3116c">"reminders.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 string" style="color:#e3116c">"sms.send"</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><span class="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">"plugins"</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">"allow"</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">"feishu"</span><span class="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">"qwen-portal-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 string" style="color:#e3116c">"brave"</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">"load"</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">"paths"</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 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">"entries"</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">"qwen-portal-auth"</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">"enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" 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 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">"feishu"</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">"enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" 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 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">"brave"</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">"enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="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">"config"</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">"webSearch"</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">"apiKey"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BSAxxxxxx_xxxxxxxxx_xxxxxxxxxxx"</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><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><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></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-自定义模型-provider-及-api-兼容模式">3. 自定义模型 Provider 及 API 兼容模式<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#3-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9E%8B-provider-%E5%8F%8A-api-%E5%85%BC%E5%AE%B9%E6%A8%A1%E5%BC%8F" class="hash-link" aria-label="Direct link to 3. 自定义模型 Provider 及 API 兼容模式" title="Direct link to 3. 自定义模型 Provider 及 API 兼容模式" translate="no">​</a></h2>
<p>OpenClaw 安装完成后, 可以通过<code>openclaw configure</code>命令重新启动配置向导. 如果你有购买第三方的模型服务 API, 或公司内部有统一付费的模型 API 代理, 可以通过<code>Custom Provider</code>途径对接.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="31-向导配置说明">3.1 向导配置说明<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#31-%E5%90%91%E5%AF%BC%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E" class="hash-link" aria-label="Direct link to 3.1 向导配置说明" title="Direct link to 3.1 向导配置说明" translate="no">​</a></h3>
<p>启动配置向导后的选择路径: <code>Where will the Gateway run?: Local</code> -&gt; <code>Select sections to configure: Model</code> -&gt; <code>Model/auth provider: Custom Provider</code></p>
<p>以 <code>https://build.nvidia.com/moonshotai/kimi-k2.5</code> 模型为例, 在向导中分别提供:</p>
<ol>
<li class="">API Base URL</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">API Base URL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  https://integrate.api.nvidia.com/v1</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">粘贴获取的 API key</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">How do you want to provide this API key?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● Paste API key now (Stores the key directly in OpenClaw config)</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">API Key (leave blank if not required)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nvapi-**********U9w</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">选择 API 兼容类型</li>
</ol>
<blockquote>
<p>在 OpenClaw（以及类似的 LLM 网关/代理框架）中，模型 API 兼容模式（Compatibility Modes） 的核心作用是协议转换。市面上的大语言模型（LLM）厂商并没有统一的标准，各家的接口参数、消息格式、甚至返回值结构都不一样。这些“模式”就是告诉框架：应该用什么格式把你的 Prompt 组装发给大模型，以及怎么解析大模型吐回来的数据。特别是 OpenClaw 还涉及到工具的调用, 协议不匹配会直接导致 OpenClaw 报错, 比如常见的<code>Message ordering conflict - please try again. If this persists, use /new to start a fresh session.</code>错误就是因为协议不匹配引起的.<br>
<!-- -->OpenClaw 配置向导提供了两种 API 兼容模式, 对于更多的模型厂商, 可以直接去修改 openclaw.json 文件以获得更好的兼容性和功能扩展</p>
</blockquote>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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"> Endpoint compatibility</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ● OpenAI-compatible (Uses /chat/completions)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Anthropic-compatible</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│  ○ Unknown (detect automatically)</span><br></span></code></pre></div></div>
<ol start="4">
<li class="">
<p>选择模型
Model ID
moonshotai/kimi-k2.5</p>
</li>
<li class="">
<p>给 Provider 取个名称
Endpoint ID
nvidia-nim</p>
</li>
<li class="">
<p>Model alias 没有意义, 留空回车完成模型配置</p>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="32-api-兼容模式对比">3.2 API 兼容模式对比<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#32-api-%E5%85%BC%E5%AE%B9%E6%A8%A1%E5%BC%8F%E5%AF%B9%E6%AF%94" class="hash-link" aria-label="Direct link to 3.2 API 兼容模式对比" title="Direct link to 3.2 API 兼容模式对比" translate="no">​</a></h3>
<p>参考上文提供的 openclaw.json 的示例, API 兼容模式配置在 models.providers.&lt;YOUR PROVIDER&gt;.api 属性中, 下表收集了常见的 API 兼容模式, 请根据选用的 provider 和 模型去配置正确的模式:</p>
<table><thead><tr><th style="text-align:left">模式名称 (API Mode)</th><th style="text-align:left">适用模型 / 生态</th><th style="text-align:left">底层 API 特点 &amp; 工作原理</th><th style="text-align:left">当前状态 / 适用场景</th></tr></thead><tbody><tr><td style="text-align:left"><strong><code>openai-responses</code></strong> <br><em>(或 openai-chat)</em></td><td style="text-align:left"><strong>现代 GPT 家族</strong> (GPT-4o) <br><strong>90% 第三方模型</strong> (DeepSeek, 阿里, Kimi 等)</td><td style="text-align:left"><strong>当前行业绝对的“事实标准”</strong>。<br>采用标准的 <code>messages</code> 数组（区分 System/User/Assistant/Tool 角色），原生完美支持函数调用 (Function Calling)。</td><td style="text-align:left">🌟 <strong>绝对主流 / 核心必选</strong><br>只要不是 Claude 或 Google 亲儿子，无脑选此模式。</td></tr><tr><td style="text-align:left"><strong><code>openai-completions</code></strong></td><td style="text-align:left"><strong>早期 GPT 模型</strong> (davinci) <br>代码补全专用模型</td><td style="text-align:left"><strong>大模型时代的“活化石”</strong>。<br>不支持角色划分，单向纯文本输入 (<code>prompt</code>)，模型只负责单向文本接龙（续写）。</td><td style="text-align:left">⚠️ <strong>逐步淘汰 / 特定场景</strong><br>仅在代码行级补全 (Copilot) 或旧模型兼容时使用。</td></tr><tr><td style="text-align:left"><strong><code>anthropic-messages</code></strong></td><td style="text-align:left"><strong>现代 Claude 3 / 3.5 家族</strong> <br>(Haiku, Sonnet, Opus)</td><td style="text-align:left"><strong>Anthropic 全新设计的现代协议</strong>。<br>强制 System 提示词与对话历史分离（置于顶层），拥有极其严谨的多模态和工具调用数据结构。</td><td style="text-align:left">🔥 <strong>复杂任务首选</strong><br>在代码生成、长文本理解和复杂 Agent 工作流中表现极佳。</td></tr><tr><td style="text-align:left"><strong><code>anthropic-completion</code></strong></td><td style="text-align:left"><strong>早期 Claude 1 / 2 家族</strong></td><td style="text-align:left"><strong>无结构化数组时代的妥协产物</strong>。<br>依赖在纯文本中硬编码 <code>\n\nHuman:</code> 和 <code>\n\nAssistant:</code> 换行符来模拟多轮对话身份。</td><td style="text-align:left">❌ <strong>已废弃 (Deprecated)</strong><br>仅用于极少数遗留的老旧系统兼容。</td></tr><tr><td style="text-align:left"><strong><code>google-ai</code></strong> <br><em>(或 google-generative-ai)</em></td><td style="text-align:left"><strong>个人版 Gemini 家族</strong> <br>(Gemini 1.5 Pro / Flash 等)</td><td style="text-align:left"><strong>Google AI Studio 开发者通道</strong>。<br>完全无视 OpenAI 标准，自创 <code>contents</code>/<code>parts</code> 嵌套结构；使用简单的 API Key 即可进行鉴权调用。</td><td style="text-align:left">🚀 <strong>个人开发者 / 轻量级首选</strong><br>适合中小团队直接对接性价比极高的 Gemini 模型。</td></tr><tr><td style="text-align:left"><strong><code>google-gemini</code></strong> <br><em>(或 vertex-ai)</em></td><td style="text-align:left"><strong>企业版 Gemini 家族</strong> <br>(依托于 Google Cloud)</td><td style="text-align:left"><strong>Google Cloud (GCP) 企业级通道</strong>。<br>数据结构同上，但<strong>网络路由和鉴权完全不同</strong>。需配置 GCP 的项目 ID、部署区域 (Region) 以及 IAM 复杂凭据。</td><td style="text-align:left">🏢 <strong>企业级云服务 / 合规必备</strong><br>适合对数据隐私、SLA 保证有严格要求的出海企业。</td></tr><tr><td style="text-align:left"><strong><code>azure-openai</code></strong></td><td style="text-align:left"><strong>微软云 GPT 家族</strong> <br>(依托于 Microsoft Azure)</td><td style="text-align:left"><strong>数据结构 100% 同 OpenAI 标准</strong>。<br>但网络层被微软魔改：强制使用 <code>api-key</code> 请求头，URL 必须拼接专有的部署名和 <code>api-version</code> 版本号。</td><td style="text-align:left">🛡️ <strong>世界500强 / 隐私合规标配</strong><br>享受微软企业级数据不泄露协议 (B2B SLA) 的唯一途径。</td></tr><tr><td style="text-align:left"><strong><code>ollama</code></strong></td><td style="text-align:left"><strong>本地开源模型</strong> <br>(Llama 3, Qwen2, Mistral 等)</td><td style="text-align:left"><strong>本地私有化部署原生 API</strong>。<br>不走云端，直接与本地 Ollama 引擎通信，支持 <code>keep_alive</code>（模型常驻内存）等精细化的硬件调度参数。</td><td style="text-align:left">💻 <strong>本地优先 / 隐私极客必备</strong><br>零 API 成本，适合让 Agent 离线操作本地电脑和敏感文件。</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-配置启用-memory-search-必要">4. 配置启用 Memory Search (必要)<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#4-%E9%85%8D%E7%BD%AE%E5%90%AF%E7%94%A8-memory-search-%E5%BF%85%E8%A6%81" class="hash-link" aria-label="Direct link to 4. 配置启用 Memory Search (必要)" title="Direct link to 4. 配置启用 Memory Search (必要)" translate="no">​</a></h2>
<p>在 OpenClaw 这样的大模型 Agent 框架中，如果说前面提到的 session-memory 是机器人的**“短期记忆（RAM 内存）”，那么 Memory Search（记忆搜索） 就是机器人的“长期记忆（硬盘 / 知识库）”**。</p>
<p>Memory Search 的核心作用是跨会话的语义检索与上下文增强（RAG）。它让 AI 能够“记住”几天前、几个月前甚至几年前你们聊过的信息，或者从海量的文档中瞬间找出相关内容。</p>
<p>在 OpenClaw 中，Memory Search 赋予了 Agent 真正的“成长性”和“企业级知识储备”。它让大模型不再是一个每次都需要重新调教的通用工具，而是一个能随着你不断使用、不断积累经验，越来越懂你业务的专属 AI 助手。</p>
<p>Memory Search 并不是像传统数据库那样用 WHERE text LIKE '%关键字%' 去做死板的字面匹配，它使用的是向量检索（Vector Search）。我们需要为 Memory Search 提供一个 Embedding 模型.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="41-ollama-配置示例">4.1. Ollama 配置示例<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#41-ollama-%E9%85%8D%E7%BD%AE%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="Direct link to 4.1. Ollama 配置示例" title="Direct link to 4.1. Ollama 配置示例" translate="no">​</a></h3>
<p>如果你有一个带显卡的PC, 可以选择部署一个 Ollama 环境, 参见 <a class="" href="https://ittour.net/blog/2026/03/23/ollama-install-and-configure">Ollama 安装</a><br>
<!-- -->然后下载一个轻量化的 Embedding 模型(比如 nomic-embed-text), 用于开启 Memory Search.</p>
<ol>
<li class="">下载模型</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">ollama pull nomic-embed-text</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">配置启用 Memory Search, 假设 Ollama 部署在 OpenClaw 本机:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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 config set agents.defaults.memorySearch.enabled true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">openclaw config set agents.defaults.memorySearch.provider "ollama"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">openclaw config set agents.defaults.memorySearch.remote.baseUrl "http://127.0.0.1:11434"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">openclaw config set agents.defaults.memorySearch.remote.apiKey "ollama"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">openclaw config set agents.defaults.memorySearch.model "nomic-embed-text"</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">查看并重建 Memory 索引</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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 memory status --deep # 查看</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">openclaw memory index # 索引</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">openclaw memory status --deep # 再查看</span><br></span></code></pre></div></div>
<p>当然也可以直接使用厂家的商业 Embedding 模型, 默认方式相同, 请自行选用</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-解锁命令执行等所有权限">5. 解锁命令执行等所有权限<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#5-%E8%A7%A3%E9%94%81%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E7%AD%89%E6%89%80%E6%9C%89%E6%9D%83%E9%99%90" class="hash-link" aria-label="Direct link to 5. 解锁命令执行等所有权限" title="Direct link to 5. 解锁命令执行等所有权限" translate="no">​</a></h2>
<p>OpenClaw v2026.3.13 版本的 profile 默认是 coding, 不具备命令执行权限, 通过把 profile 设置为 full, 以解锁所有权限:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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 config set tools.profile full</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">openclaw gateway restart</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-使用方式">6. 使用方式<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#6-%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F" class="hash-link" aria-label="Direct link to 6. 使用方式" title="Direct link to 6. 使用方式" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="61-通过-webchat-比如-http12700118789">6.1. 通过 WebChat. 比如: <a href="http://127.0.0.1:18789/" target="_blank" rel="noopener noreferrer" class="">http://127.0.0.1:18789/</a><a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#61-%E9%80%9A%E8%BF%87-webchat-%E6%AF%94%E5%A6%82-http12700118789" class="hash-link" aria-label="Direct link to 61-通过-webchat-比如-http12700118789" title="Direct link to 61-通过-webchat-比如-http12700118789" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" src="https://ittour.net/assets/images/feishu-dm-example-dd71bc4ee056a3e07f47841c4e14605c.png" width="964" height="561" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="62-通过你绑定的-channel-比如-飞书-whats-app-等">6.2. 通过你绑定的 Channel. 比如: 飞书, What's App 等<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#62-%E9%80%9A%E8%BF%87%E4%BD%A0%E7%BB%91%E5%AE%9A%E7%9A%84-channel-%E6%AF%94%E5%A6%82-%E9%A3%9E%E4%B9%A6-whats-app-%E7%AD%89" class="hash-link" aria-label="Direct link to 6.2. 通过你绑定的 Channel. 比如: 飞书, What's App 等" title="Direct link to 6.2. 通过你绑定的 Channel. 比如: 飞书, What's App 等" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" src="https://ittour.net/assets/images/feishu-dm-example-dd71bc4ee056a3e07f47841c4e14605c.png" width="964" height="561" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-在-wsl-中基于openclaw-browser-relay启用浏览器操作">7. 在 WSL 中基于<code>OpenClaw Browser Relay</code>启用浏览器操作<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#7-%E5%9C%A8-wsl-%E4%B8%AD%E5%9F%BA%E4%BA%8Eopenclaw-browser-relay%E5%90%AF%E7%94%A8%E6%B5%8F%E8%A7%88%E5%99%A8%E6%93%8D%E4%BD%9C" class="hash-link" aria-label="Direct link to 7-在-wsl-中基于openclaw-browser-relay启用浏览器操作" title="Direct link to 7-在-wsl-中基于openclaw-browser-relay启用浏览器操作" translate="no">​</a></h2>
<p>在 Windows Subsystem for Linux (WSL) 中安装 OpenClaw 没有像在 MacOS 和 Windows 上安装那么方便的操纵浏览器, 但也不是没有办法.</p>
<p>比如通过 Chrome 的插件: <code>OpenClaw Browser Relay</code>, 到这儿来安装: <a href="https://chromewebstore.google.com/search/OpenClaw%20Browser%20Relay" target="_blank" rel="noopener noreferrer" class="">https://chromewebstore.google.com/search/OpenClaw%20Browser%20Relay</a>, 然后设置:</p>
<ol>
<li class="">
<p>安装完成后会弹出设置界面, 默认情况下不用修改端口, 填入 Gateway token 后点击 Save 按钮<br>
<img decoding="async" loading="lazy" src="https://ittour.net/assets/images/openclaw-browser-relay-setup-1-cf9dd30d86177d3f997295a6a15b6747.png" width="883" height="523" class="img_ev3q"></p>
</li>
<li class="">
<p>确保 OpenClaw Browser Relay 插件成功连接到网关:<br>
<img decoding="async" loading="lazy" src="https://ittour.net/assets/images/openclaw-browser-relay-setup-2-0705eb3b0e736c1e40749ca25ef3e092.png" width="845" height="506" class="img_ev3q"></p>
</li>
<li class="">
<p>在浏览器中把插件按钮显示出来, 并点击:<br>
<img decoding="async" loading="lazy" src="https://ittour.net/assets/images/openclaw-browser-relay-setup-3-ff9bef902130263878ca3856c7cb8a23.png" width="325" height="314" class="img_ev3q"></p>
</li>
<li class="">
<p>当插件的状态变为"ON"的时候, OpenClaw就可以操纵这个浏览器 tab了.<br>
<img decoding="async" loading="lazy" src="https://ittour.net/assets/images/openclaw-browser-relay-setup-4-f91b715ec12cb24e57802df4fff593b6.png" width="322" height="146" class="img_ev3q"></p>
</li>
</ol>
<p>然后就可以通过 WebChat 或 Channel 直接告诉 OpenClaw 帮你填下活了, 比如: 打开某个网址, 进入某个模块, 抓取某些数据, 有异常的话给 Channel 发个告警, 然后再把这几步做下定时巡检任务.</p>
<p><strong>注: OpenClaw Browser Relay 在 v2026.3.13 版本工作正常, 但升级到 v2026.3.23-2 版本后, 浏览器插件连接网关一直连不上, 还在研究. 报错如下:</strong><br>
<code>Relay not reachable/authenticated at http://127.0.0.1:18792/. Start OpenClaw browser relay and verify token.</code></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-环境变量的配置">8. 环境变量的配置<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#8-%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E7%9A%84%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="Direct link to 8. 环境变量的配置" title="Direct link to 8. 环境变量的配置" translate="no">​</a></h2>
<p>使用 <code>.openclaw</code> 目录下的 <code>.env</code> 文件, 可以直接为 OpenClaw 配置所以的环境变量. 比如:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">$ cat ~/.openclaw/.env</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HTTP_PROXY=http://127.0.0.1:10808</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OPENAI_API_KEY=sk-...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ANTHROPIC_API_KEY=sk-ant-...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FEISHU_APP_SECRET=...</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-使用-clawhub-安装-skill">9. 使用 Clawhub 安装 Skill<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#9-%E4%BD%BF%E7%94%A8-clawhub-%E5%AE%89%E8%A3%85-skill" class="hash-link" aria-label="Direct link to 9. 使用 Clawhub 安装 Skill" title="Direct link to 9. 使用 Clawhub 安装 Skill" translate="no">​</a></h2>
<p>想持续提供 OpenClaw 的能力吗? 请安装 Skill.</p>
<ol>
<li class="">去 <a href="https://clawhub.ai/skills" target="_blank" rel="noopener noreferrer" class="">https://clawhub.ai/skills</a> 找到心仪的 Skill</li>
<li class="">安装 clawhub CLI: <code>npm i -g clawhub</code></li>
<li class="">使用<code>clawhub login</code>登录 clawhub, 登录后可以使用<code>clawhub whoami</code>查看登录状态</li>
<li class="">使用<code>clawhub install &lt;SKILL&gt;</code>安装. 比如: <code>clawhub install weather</code></li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-升级-openclaw">10. 升级 OpenClaw<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#10-%E5%8D%87%E7%BA%A7-openclaw" class="hash-link" aria-label="Direct link to 10. 升级 OpenClaw" title="Direct link to 10. 升级 OpenClaw" translate="no">​</a></h2>
<p>跟安装一样, 重新执行就行了, 然后在配置向导中一路选择保留配置和数据.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-卸载-openclaw">12. 卸载 OpenClaw<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#12-%E5%8D%B8%E8%BD%BD-openclaw" class="hash-link" aria-label="Direct link to 12. 卸载 OpenClaw" title="Direct link to 12. 卸载 OpenClaw" translate="no">​</a></h2>
<ol>
<li class="">执行如下脚本进行卸载:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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 uninstall --all --yes --non-interactive</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npm rm -g openclaw</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">如果无法通过上述指令清除干净, 必要情况下通过查找删除所有目录:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">$ which openclaw</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/home/zhangsan/.npm-global/bin/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">$ cd /home/zhangsan/.npm-global/bin/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ ls -la</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">total 8</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">drwxr-xr-x 2 zhangsan zhangsan 4096 Mar 12 20:26 .</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">drwxr-xr-x 4 zhangsan zhangsan 4096 Mar 12 20:13 ..</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lrwxrwxrwx 1 zhangsan zhangsan   41 Mar 12 20:26 openclaw -&gt; ../lib/node_modules/openclaw/openclaw.mjs</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">~/.npm-global/bin$ rm openclaw</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">~/.npm-global/bin$ rm -rf ../lib/node_modules/openclaw</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">修改 ~/.bashrc, 删除 OpenClaw bash completions 相关内容</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-slash-commands">12. Slash Commands<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#12-slash-commands" class="hash-link" aria-label="Direct link to 12. Slash Commands" title="Direct link to 12. Slash Commands" translate="no">​</a></h2>
<p>OpenClaw 的 WebChat 中可以直接执行 bash 指令, 格式是在聊天窗口中直接输入 <code>!&lt;cmd&gt;</code> 或 <code>/bash &lt;cmd&gt;</code><br>
<!-- -->但默认没有开启, 执行<code>/bash ls -la</code>时会提示: <code>bash is disabled. Set commands.bash=true to enable. Docs: https://docs.openclaw.ai/tools/slash-commands#config</code></p>
<p>现在展示一步步开启:</p>
<ol>
<li class=""><code>openclaw config set commands.bash true</code></li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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 config set commands.bash 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">🦞 OpenClaw 2026.3.23-2 (7ffe7e4) — I don't sleep, I just enter low-power mode and dream of clean diffs.</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">Config overwrite: /home/zhangsan/.openclaw/openclaw.json (sha256 19870f67fda3bf3964d110ac38cfac4e87e1363dbe4dba25fa4fdadd9f91ba63 -&gt; 4e9bb164bd13d959ef161810194e112ad97bd037ec0570b57298555d9b68eeb2, backup=/home/zhangsan/.openclaw/openclaw.json.bak)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Updated commands.bash. Restart the gateway to apply.</span><br></span></code></pre></div></div>
<p>再试<code>/bash ls -la</code>提示:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">elevated is not available right now (runtime=direct).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Failing gates: allowFrom (tools.elevated.allowFrom.webchat)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Fix-it keys:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- tools.elevated.enabled</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- tools.elevated.allowFrom.&lt;provider&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- agents.list[].tools.elevated.enabled</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- agents.list[].tools.elevated.allowFrom.&lt;provider&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">See: openclaw sandbox explain --session agent:main:main</span><br></span></code></pre></div></div>
<ol start="2">
<li class=""><code>openclaw sandbox explain --session agent:main:main</code></li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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 sandbox explain --session agent:main:main</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">🦞 OpenClaw 2026.3.23-2 (7ffe7e4) — Self-hosted, self-updating, self-aware (just kidding... unless?).</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">Effective sandbox:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  agentId: main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sessionKey: agent:main:main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  mainSessionKey: agent:main:main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  runtime: direct</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  mode: off scope: agent perSession: false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  workspaceAccess: none workspaceRoot: /home/zhangsan/.openclaw/sandboxes</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">Sandbox tool policy:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  allow (default): exec, process, read, write, edit, apply_patch, image, sessions_list, sessions_history, sessions_send, sessions_spawn, sessions_yield, subagents, session_status</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  deny  (default): browser, canvas, nodes, cron, gateway, telegram, whatsapp, discord, irc, googlechat, slack, signal, imessage, line</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">Elevated:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  enabled: true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  channel: webchat</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  allowedByConfig: false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  failing gates: allowFrom (tools.elevated.allowFrom.webchat)</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">Fix-it:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - tools.sandbox.tools.allow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - tools.sandbox.tools.deny</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - agents.list[].tools.sandbox.tools.allow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - agents.list[].tools.sandbox.tools.deny</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - tools.elevated.enabled</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - tools.elevated.allowFrom.webchat</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">Docs: docs.openclaw.ai/sandbox</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">根据提示依次执行:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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 config set tools.elevated.enabled true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">openclaw config set tools.elevated.allowFrom.webchat '["*"]'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">openclaw gateway restart</span><br></span></code></pre></div></div>
<ol start="4">
<li class="">再次尝试执行<code>/bash ls -la</code>, 在弹出的窗口 Allow 操作<br>
<img decoding="async" loading="lazy" src="https://ittour.net/assets/images/bash-exec-approve-5ebcde2844ba80336332b5cd5074e3bf.png" width="549" height="392" class="img_ev3q"></li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="13-其它排错调试场景">13. 其它排错调试场景<a href="https://ittour.net/blog/2026/03/24/openclaw-install-and-configuration#13-%E5%85%B6%E5%AE%83%E6%8E%92%E9%94%99%E8%B0%83%E8%AF%95%E5%9C%BA%E6%99%AF" class="hash-link" aria-label="Direct link to 13. 其它排错调试场景" title="Direct link to 13. 其它排错调试场景" translate="no">​</a></h2>
<ol>
<li class="">在飞书中向机器人发消息时得到的回复是<code>OpenClaw: access not configured.</code></li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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: access not configured.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Your Feishu user id: ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Pairing code: XXXXXXXX</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ask the bot owner to approve with:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">openclaw pairing approve feishu XXXXXXXX</span><br></span></code></pre></div></div>
<p>是因为你飞书 Channel 的 DM Policy 是 pairing, 需要 OpenClaw 所有人执行 <code>openclaw pairing approve feishu XXXXXXXX</code> 进行授权, 然后就可以通过飞书指挥 OpenClaw 了\</p>
<ol start="2">
<li class="">大量的 <code>Tool not found</code> 回复
大概率就是你的模型 API 类型配置错误, 请检查 openclaw.json 中的这三个属性值配置是否跟模型匹配:</li>
</ol>
<ul>
<li class=""><code>models.providers.&lt;YOUR PROVIDER&gt;.api</code> - API 兼容模式</li>
<li class=""><code>models.providers.&lt;YOUR PROVIDER&gt;.models[].reasoning</code> - 是否支持开启思考</li>
<li class=""><code>models.providers.&lt;YOUR PROVIDER&gt;.models[].input[]</code> - 是否配置了支持的输入类型. 如 "text", "image" 等</li>
</ul>
<p>最后祝养虾愉快!!!</p>]]></content>
        <category label="Openclaw" term="Openclaw"/>
        <category label="AI" term="AI"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Integration Github Actions with Google Compute Engine]]></title>
        <id>https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce</id>
        <link href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce"/>
        <updated>2026-03-10T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>记录一下通过 Github Actions 把项目输出通过 SSH 发布到 Google GCE 的配置过程.</p>
<ol>
<li class="">主要步骤:</li>
</ol>
<ul>
<li class="">创建新的身份池：先建一个 Workload Identity Pool，它像一个“外层容器”，用来容纳来自 GitHub 的外部身份。</li>
<li class="">配置映射并添加条件：在这个池里建一个 OIDC Provider，把 GitHub 发来的 OIDC claims 映射成 Google 可识别的属性，并加一个准入条件，限制只有你指定的 GitHub 组织/仓库/分支能进来。</li>
<li class="">将新池连接到服务帐户：这一步不是点一个“连接”按钮，而是给目标 Service Account 加一条 IAM policy binding，让来自这个池中、满足条件的 GitHub principal 能以 roles/iam.workloadIdentityUser 身份冒充这个服务账号。</li>
</ul>
<p>对于“GitHub Actions 操作 GCE”，建议直接走 Workload Identity Federation through a Service Account，不要用长期 JSON key。Google 的 auth Action 文档把它列为推荐路径之一；而且如果要生成 OAuth 2.0 access token 或用 gcloud 操作资源，通常都要提供 service account。直接给 pool/resource 绑定权限的方式虽然可行，但并不是所有资源都支持 principalSet，并且直接 WIF 的 token 生命周期还有更严格限制。</p>
<ol start="2">
<li class="">前置条件:
你至少要有这些权限：</li>
</ol>
<ul>
<li class="">配置 Workload Identity Pool / Provider：roles/iam.workloadIdentityPoolAdmin</li>
<li class="">创建 Service Account：roles/iam.serviceAccountCreator</li>
<li class="">修改 Service Account 的 IAM 访问策略：roles/iam.serviceAccountAdmin (docs.cloud.google.com)
另外，如果你的项目还没开相关 API，至少要确保 IAM API 和 Compute Engine API 已启用；Compute Engine API 的服务名是 compute.googleapis.com，IAM API 会处理 service account 相关能力。</li>
</ul>
<ol start="3">
<li class="">资源准备:
先假设已有或需要准备这些资源值：</li>
</ol>
<ul>
<li class="">Github Organization or User, Github 组织或用户名. 比如 myorg</li>
<li class="">Github Repository, Github 仓库地址. 比如 myorg/myrepo</li>
<li class="">GCP Project ID, Google Cloud 项目ID. 比如 my-gcp-project</li>
<li class="">GCP Project Number, Google Cloud 项目编号. 比如 123456789012</li>
<li class="">GCP Workload Identity Pool ID, 需要命名并创建. 比如 github-actions</li>
<li class="">GCP Workload Identity Provider ID, 需要命名并创建. 比如 github-myorg-myrepo</li>
<li class="">GCP Service Account, 现有 GCE 实例关联的 Service Account. 比如自动生成的 123456789012-compute</li>
<li class="">GCP Service Account Email, 现有 GCE 实例关联的 Service Account Email. 比如自动生成的 <a href="mailto:123456789012-compute@developer.gserviceaccount.com" target="_blank" rel="noopener noreferrer" class="">123456789012-compute@developer.gserviceaccount.com</a></li>
</ul>
<ol start="4">
<li class="">安全优势
使用 OIDC Workload Identity Federation 相比传统 SSH 密钥方式有以下优势：</li>
</ol>
<ul>
<li class=""><strong>无需长期密钥</strong>：不再需要在 GitHub Secrets 中存储 SSH 私钥，认证令牌是短期的，自动过期</li>
<li class=""><strong>细粒度权限控制</strong>：可以通过 GCP IAM 精细控制部署权限</li>
<li class=""><strong>审计追踪</strong>：所有认证和操作都会记录在 GCP Cloud Audit Logs 中</li>
<li class=""><strong>条件约束</strong>：可以限制只允许特定仓库、分支触发部署</li>
<li class=""><strong>权限分离</strong>：SA 用户仅负责 SSH 登录和文件传输，实际部署以 OS 用户身份执行，遵循最小权限原则</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-google-cloud-设置">1. Google Cloud 设置<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#1-google-cloud-%E8%AE%BE%E7%BD%AE" class="hash-link" aria-label="Direct link to 1. Google Cloud 设置" title="Direct link to 1. Google Cloud 设置" translate="no">​</a></h2>
<p>登录 Google Cloud -&gt; <a href="https://console.cloud.google.com/iam-admin/workload-identity-pools" target="_blank" rel="noopener noreferrer" class="">IAM &amp; Admin / Wordload Identity Federation</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-创建和配置-workload-identity-pool-和-provider">1.1. 创建和配置 Workload Identity Pool 和 Provider<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#11-%E5%88%9B%E5%BB%BA%E5%92%8C%E9%85%8D%E7%BD%AE-workload-identity-pool-%E5%92%8C-provider" class="hash-link" aria-label="Direct link to 1.1. 创建和配置 Workload Identity Pool 和 Provider" title="Direct link to 1.1. 创建和配置 Workload Identity Pool 和 Provider" translate="no">​</a></h3>
<ol>
<li class="">如果没有 Workload Identity Pool, 点击<code>Create pool</code>根据需要创建一个
<img decoding="async" loading="lazy" src="https://ittour.net/assets/images/create-identity-pool-981a5905288586c758b6d8bf349604d9.png" width="804" height="780" class="img_ev3q">
输入 Pool 名称, Pool ID 会自动生成, 也可以修改, 点击 Continue 继续.</li>
</ol>
<p>对 gcloud cli 熟悉也可以通过 cli 创建. 示例:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">gcloud iam workload-identity-pools create "github-actions" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --project="${GCP_PROJECT_ID}" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --location="global" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --display-name="GitHub Actions"</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">
<p>继续创建 Provider, Provider 类型选择 <code>OpenID Connect (OIDC)</code>, 输入 Provider 名称, Issuer 填入 GitHub 官方 OIDC issuer <code>https://token.actions.githubusercontent.com</code>, 其它不变
<img decoding="async" loading="lazy" src="https://ittour.net/assets/images/add-a-provider-to-pool-b1b6f91fd4dc4dbfd551451f29c381b7.png" width="542" height="674" class="img_ev3q"></p>
</li>
<li class="">
<p>创建 Provider 属性映射, 映射/mapping 是"把 claim 变成可引用属性"
<img decoding="async" loading="lazy" src="https://ittour.net/assets/images/configure-provider-attributes-mapping-34ca3874629d12d69aa77d775088295d.png" width="552" height="820" class="img_ev3q"></p>
</li>
</ol>
<ul>
<li class=""><code>google.subject</code> -&gt; <code>assertion.sub</code></li>
<li class=""><code>attribute.repository</code> -&gt; <code>assertion.repository</code></li>
<li class=""><code>attribute.repository_owner</code> -&gt; <code>assertion.repository_owner</code></li>
<li class=""><code>attribute.actor</code> -&gt; <code>assertion.actor</code></li>
<li class=""><code>attribute.ref</code> -&gt; <code>assertion.ref</code></li>
</ul>
<p>具体字段细节请参考: <a href="https://docs.cloud.google.com/iam/docs/workload-identity-federation#mapping" target="_blank" rel="noopener noreferrer" class="">https://docs.cloud.google.com/iam/docs/workload-identity-federation#mapping</a></p>
<ol start="4">
<li class="">设置 Attribute conditions, condition 是"准入规则", 以限制能通过认证的范围. 这里我们设置只有指定的 Owner 和指定的仓库才能通过认证触发相应动作. 最后点击 <code>Save</code> 完成 Provider Pool 创建
<code>assertion.repository_owner == 'GITHUB_ORG_OR_USER' &amp;&amp; attribute.repository == 'GITHUB_ORG_OR_USER/GITHUB_REPO_NAME'</code></li>
</ol>
<p>合并上述 #2/#3/#4 步骤的 gcloud cli 示例:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">gcloud iam workload-identity-pools providers create-oidc "github-actions-provider" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --project="${GCP_PROJECT_ID}" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --location="global" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --workload-identity-pool="github-actions-pool" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --display-name="GitHub Actions Provider" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --attribute-mapping="googled.subject=assertion.sub,attribute.repository=assertion.repository,attribute.repository_owner=assertion.repository_owner,attribute.actor=assertion.actor,attribute.ref=assertion.ref" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --attribute-condition="assertion.repository_owner == 'GITHUB_ORG_OR_USER'" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --issuer-uri="https://token.actions.githubusercontent.com"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-创建和配置-github-actions-的-service-account">1.2. 创建和配置 Github Actions 的 Service Account<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#12-%E5%88%9B%E5%BB%BA%E5%92%8C%E9%85%8D%E7%BD%AE-github-actions-%E7%9A%84-service-account" class="hash-link" aria-label="Direct link to 1.2. 创建和配置 Github Actions 的 Service Account" title="Direct link to 1.2. 创建和配置 Github Actions 的 Service Account" translate="no">​</a></h3>
<ol>
<li class="">
<p>如果你还没有专门给 GitHub Actions 用的 Service Account，先创建一个: IAM &amp; Admin/IAM 和管理 -&gt; Service Accounts/服务账号 -&gt; Create service account/创建服务账号, 创建时只填服务账号名称即可, 权限稍后配置.</p>
</li>
<li class="">
<p>为 Service Account 授于角色</p>
</li>
</ol>
<ul>
<li class="">进入 <a href="https://console.cloud.google.com/iam-admin/iam" target="_blank" rel="noopener noreferrer" class="">IAM &amp; Admin → IAM</a> -&gt; <code>Allow</code> tab</li>
<li class="">找到你刚创建的 service account（邮箱类似 <a href="mailto:gha-gce@PROJECT_ID.iam.gserviceaccount.com" target="_blank" rel="noopener noreferrer" class="">gha-gce@PROJECT_ID.iam.gserviceaccount.com</a>）</li>
<li class="">点击铅笔 Edit principal</li>
<li class="">根据需要在 Assign roles 里增加 相应的Role. 在些我需要让这个 SA 可以 SSH 到 Compute Engine 中执行 sudo, 因此给这个SA 授予<code>Compute Viewer</code>和<code>Compute OS Admin Login</code></li>
<li class="">保存。Google Cloud 的 IAM 策略把角色绑定到 principal 上，项目级角色会影响该项目内资源。</li>
</ul>
<ol start="3">
<li class="">把 Pool “连接”到 Service Account</li>
</ol>
<ul>
<li class="">进入 <a href="https://console.cloud.google.com/iam-admin/serviceaccounts" target="_blank" rel="noopener noreferrer" class="">IAM &amp; Admin -&gt; Service accounts</a></li>
<li class="">找到你刚才创建的 Service Account, 点击进入详细页并切换到<code>Principals with access</code> tab</li>
<li class="">点击<code>Grant access</code>把指定 GitHub repo 的 principal 授权为可以使用该 Service Account:<!-- -->
<ul>
<li class=""><code>New principals</code>字段中填写<code>principalSet://iam.googleapis.com/projects/&lt;GCP_PROJECT_NUMBER&gt;/locations/global/workloadIdentityPools/&lt;IDENTITY_POOL_ID&gt;/attribute.repository/&lt;GITHUB_ORG_OR_USER&gt;/&lt;GITHUB_REPO_NAME&gt;</code> (这背后的意思是: “允许来自这个 pool 且 attribute.repository == &lt;GITHUB_ORG_OR_USER&gt;/&lt;GITHUB_REPO_NAME&gt; 的主体使用这个 service account。”, 这种 principal identifier 格式是 Google IAM 支持的做法)</li>
<li class=""><code>Role</code>选择<code>Workload Identity User</code>. Workload Identity User 允许工作负载身份代表该 service account 获取 access token / OIDC token</li>
<li class="">点击<code>Save</code>完成授权</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="13-检查是否启用-compute-engine-api">1.3. 检查是否启用 Compute Engine API<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#13-%E6%A3%80%E6%9F%A5%E6%98%AF%E5%90%A6%E5%90%AF%E7%94%A8-compute-engine-api" class="hash-link" aria-label="Direct link to 1.3. 检查是否启用 Compute Engine API" title="Direct link to 1.3. 检查是否启用 Compute Engine API" translate="no">​</a></h3>
<p>如果你的项目从没用过 Compute / IAM 相关能力，建议顺手检查 API 是否启用。控制台操作:</p>
<ol>
<li class="">进入<code>APIs &amp; Services</code> -&gt; 点击 <code>Enabled APIs &amp; services</code></li>
<li class="">搜索并启用 <code>Compute Engine API</code></li>
<li class="">与 IAM / Service Account 相关 API（如果页面提示缺失，一并启用）</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="14-授权-github-actions-的-sa-使用-vm-的-sa">1.4. 授权 GitHub Actions 的 SA 使用 VM 的 SA<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#14-%E6%8E%88%E6%9D%83-github-actions-%E7%9A%84-sa-%E4%BD%BF%E7%94%A8-vm-%E7%9A%84-sa" class="hash-link" aria-label="Direct link to 1.4. 授权 GitHub Actions 的 SA 使用 VM 的 SA" title="Direct link to 1.4. 授权 GitHub Actions 的 SA 使用 VM 的 SA" translate="no">​</a></h3>
<p>如果 Github Actions 使用的 Service Account 与 GCP 服务器绑定的 Service Account 不是同一个, 则需要授权 GitHub Actions 的 Service Account 可以使用 VM 绑定的 SA,</p>
<ol>
<li class="">IAM &amp; Admin → Service Accounts, 找到 VM 绑定的 service account, 点击进入详情页</li>
<li class="">切换到 <code>Principals with access</code> tab, 点击Grant access</li>
<li class=""><code>New principals</code>搜索并选择 Github Actions 使用的 Service account</li>
<li class="">在<code>Assign roles</code>中添加<code>Service Account User</code> role</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="15-开启-os-login">1.5. 开启 OS Login<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#15-%E5%BC%80%E5%90%AF-os-login" class="hash-link" aria-label="Direct link to 1.5. 开启 OS Login" title="Direct link to 1.5. 开启 OS Login" translate="no">​</a></h3>
<ol>
<li class="">进入 GCP <code>Comoute Engine</code>控制台并找到需要操作的VM</li>
<li class="">点击<code>Edit</code>修改该VM, 在<code>Metadata</code>中添加 key <code>enable-oslogin</code>, 设置 value 为<code>TRUE</code>后保存</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-github-actions-设置">2. Github Actions 设置<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#2-github-actions-%E8%AE%BE%E7%BD%AE" class="hash-link" aria-label="Direct link to 2. Github Actions 设置" title="Direct link to 2. Github Actions 设置" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-在项目的-githubworkflows-目录下创建-deployyml">2.1. 在项目的 .github/workflows 目录下创建 deploy.yml<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#21-%E5%9C%A8%E9%A1%B9%E7%9B%AE%E7%9A%84-githubworkflows-%E7%9B%AE%E5%BD%95%E4%B8%8B%E5%88%9B%E5%BB%BA-deployyml" class="hash-link" aria-label="Direct link to 2.1. 在项目的 .github/workflows 目录下创建 deploy.yml" title="Direct link to 2.1. 在项目的 .github/workflows 目录下创建 deploy.yml" translate="no">​</a></h3>
<p>一个配置示例:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Build and Deploy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">on</span><span class="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">push</span><span class="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">branches</span><span class="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"> release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">workflow_dispatch</span><span class="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"># Required for requesting the OIDC JWT token</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">permissions</span><span class="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">contents</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> read</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">id-token</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> write</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">jobs</span><span class="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">build-and-deploy</span><span class="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">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">env</span><span class="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">DEPLOY_BASE</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"> secrets.GCP_VM_DEPLOY_BASE </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">DEPLOY_TAR</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /tmp/mywebsite</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">com</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">build.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="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 key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Checkout code</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/checkout@v4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">with</span><span class="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">lfs</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 punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Setup Node.js</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/setup</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">node@v4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">with</span><span class="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">node-version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'20'</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">cache</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'yarn'</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 key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install dependencies</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yarn install </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">frozen</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">lockfile</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 key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Build static files</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yarn build</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 key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Compress build output</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> tar </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">czf build.tar.gz </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">C build .</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 key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Authenticate to Google Cloud via OIDC</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> auth</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> google</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">github</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">actions/auth@v3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">with</span><span class="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">workload_identity_provider</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"> secrets.GCP_WORKLOAD_IDENTITY_PROVIDER </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">service_account</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"> secrets.GCP_SERVICE_ACCOUNT </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><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Set up Cloud SDK</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> google</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">github</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">actions/setup</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gcloud@v2</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 key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Generate release timestamp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> echo "timestamp=$(TZ=Asia/Shanghai date +%Y%m%d%H%M%S)" </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"> "$GITHUB_OUTPUT"</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 key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Upload archive to GCP VM</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</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 scalar string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          gcloud compute scp build.tar.gz \</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">            ${{ secrets.GCP_VM_SA_USER }}@${{ secrets.GCP_VM_INSTANCE_NAME }}:$DEPLOY_TAR \</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">            --zone=${{ secrets.GCP_VM_ZONE }} \</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">            --project=${{ secrets.GCP_PROJECT_ID }}</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 key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deploy</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> switch release</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> and cleanup</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">env</span><span class="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">RELEASE_TS</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"> steps.release.outputs.timestamp </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">run</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 scalar string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          gcloud compute ssh ${{ secrets.GCP_VM_SA_USER }}@${{ secrets.GCP_VM_INSTANCE_NAME }} \</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">            --zone=${{ secrets.GCP_VM_ZONE }} \</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">            --project=${{ secrets.GCP_PROJECT_ID }} \</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">            --command="sudo chown ${{ secrets.GCP_VM_OS_USER }}:${{ secrets.GCP_VM_OS_USER }} $DEPLOY_TAR &amp;&amp; sudo -u ${{ secrets.GCP_VM_OS_USER }} $DEPLOY_BASE/deploy.sh '$DEPLOY_BASE' '$RELEASE_TS' '$DEPLOY_TAR'"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="22-在-github-项目---settings---secrets-and-veriables-下创建相应的-secrets">2.2. 在 github 项目 -&gt; Settings -&gt; Secrets and veriables 下创建相应的 secrets<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#22-%E5%9C%A8-github-%E9%A1%B9%E7%9B%AE---settings---secrets-and-veriables-%E4%B8%8B%E5%88%9B%E5%BB%BA%E7%9B%B8%E5%BA%94%E7%9A%84-secrets" class="hash-link" aria-label="Direct link to 2.2. 在 github 项目 -> Settings -> Secrets and veriables 下创建相应的 secrets" title="Direct link to 2.2. 在 github 项目 -> Settings -> Secrets and veriables 下创建相应的 secrets" translate="no">​</a></h3>
<p>配合 deploy.yml 示例, 提供如下 secrets:</p>
<table><thead><tr><th>Secret 名称</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td><strong>GCP_WORKLOAD_IDENTITY_PROVIDER</strong></td><td>Workload Identity Provider 完整资源名</td><td><code>projects/&lt;GCP_PROJECT_NUMBER&gt;/locations/global/workloadIdentityPools/&lt;IDENTITY_POOL_ID&gt;/providers/&lt;IDENTITY_PROVIDER_ID&gt;</code></td></tr><tr><td><strong>GCP_SERVICE_ACCOUNT</strong></td><td>部署用 GCP Service Account 邮箱</td><td><code>&lt;SERVICE_ACCOUNT_ID&gt;@&lt;GCP_PROJECT_ID&gt;.iam.gserviceaccount.com</code></td></tr><tr><td><strong>GCP_PROJECT_ID</strong></td><td>GCP 项目 ID</td><td><code>my-gcp-project</code></td></tr><tr><td><strong>GCP_VM_INSTANCE_NAME</strong></td><td>目标 GCP VM 实例名称</td><td><code>or01</code></td></tr><tr><td><strong>GCP_VM_ZONE</strong></td><td>VM 实例所在的 GCP 区域</td><td><code>us-west1-a</code></td></tr><tr><td><strong>GCP_VM_SA_USER</strong></td><td>Service Account 的 OS Login 用户名（用于 SSH/SCP）</td><td><code>sa_111929993936969721118</code></td></tr><tr><td><strong>GCP_VM_OS_USER</strong></td><td>VM 上实际执行部署的用户名（deploy.sh 的运行身份）</td><td><code>zhangsan</code></td></tr><tr><td><strong>GCP_VM_DEPLOY_BASE</strong></td><td>VM 上的部署基础路径</td><td><code>/var/www/mywebsite.com</code></td></tr></tbody></table>
<blockquote>
<p><strong>说明</strong>：<code>GCP_VM_SA_USER</code> 是 GCP OS Login 为 Service Account 自动生成的用户名（格式为 <code>sa_&lt;OAuth2 Client ID&gt;</code>），用于 <code>gcloud compute scp/ssh</code> 登录。<code>GCP_VM_OS_USER</code> 是服务器上拥有部署目录权限的实际用户，<code>deploy.sh</code> 会通过 <code>sudo -u</code> 以该用户身份执行。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-gcp-服务器端一次性配置">3. GCP 服务器端一次性配置<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#3-gcp-%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E4%B8%80%E6%AC%A1%E6%80%A7%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="Direct link to 3. GCP 服务器端一次性配置" title="Direct link to 3. GCP 服务器端一次性配置" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="31-创建部署目录结构">3.1. 创建部署目录结构<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#31-%E5%88%9B%E5%BB%BA%E9%83%A8%E7%BD%B2%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84" class="hash-link" aria-label="Direct link to 3.1. 创建部署目录结构" title="Direct link to 3.1. 创建部署目录结构" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">sudo mkdir -p /var/www/mywebsite.com/releases</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo chown -R &lt;deploy_user&gt;:&lt;deploy_user&gt; /var/www/mywebsite.com</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="32-部署-deploysh-脚本">3.2. 部署 deploy.sh 脚本<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#32-%E9%83%A8%E7%BD%B2-deploysh-%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="Direct link to 3.2. 部署 deploy.sh 脚本" title="Direct link to 3.2. 部署 deploy.sh 脚本" translate="no">​</a></h3>
<p>创建脚本 <code>$GCP_VM_DEPLOY_BASE/deploy.sh</code>:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">#!/usr/bin/env bash</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">set -euo pipefail</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">DEPLOY_BASE="$1"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RELEASE_TS="$2"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DEPLOY_TAR="$3"</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">RELEASE_DIR=${DEPLOY_BASE}/releases/${RELEASE_TS}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CURRENT_LINK=${DEPLOY_BASE}/current</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"># Create release directory and extract archive</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mkdir -p ${RELEASE_DIR}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tar -xzf $DEPLOY_TAR -C ${RELEASE_DIR}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rm -f $DEPLOY_TAR</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"># Atomically switch the 'current' symlink to the new release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># ln -sfn is atomic on Linux (single rename syscall)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ln -sfn ${RELEASE_DIR} ${CURRENT_LINK}</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"># Test nginx config</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo /usr/sbin/nginx -t</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"># Reload nginx to pick up any potential config changes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo systemctl reload nginx</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"># Clean up old releases, keeping only the current and previous</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd ${DEPLOY_BASE}/releases</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ls -1dt */ | tail -n +3 | xargs -r rm -rf</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">echo '✅ Deployment completed successfully'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo "📦 Release: ${RELEASE_TS}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo "📂 Path: ${RELEASE_DIR}"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ls -la ${CURRENT_LINK}</span><br></span></code></pre></div></div>
<p>设置脚本权限：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">chmod +x /var/www/mywebsite.com/deploy.sh</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="33-配置-sudoers">3.3. 配置 sudoers<a href="https://ittour.net/blog/2026/03/10/integrate-github-actions-with-gce#33-%E9%85%8D%E7%BD%AE-sudoers" class="hash-link" aria-label="Direct link to 3.3. 配置 sudoers" title="Direct link to 3.3. 配置 sudoers" translate="no">​</a></h3>
<p>在<code>/etc/sudoers.d</code>目录下为 deploy user 创建 sudoer配置文件. 比如 zhangsan_sudoers</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">zhangsan ALL=(root) NOPASSWD: /usr/sbin/nginx -t</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">zhangsan ALL=(root) NOPASSWD: /usr/sbin/nginx -s reload</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">zhangsan ALL=(root) NOPASSWD: /usr/bin/systemctl reload nginx</span><br></span></code></pre></div></div>
<p>将 suders 文件的权限修改为 440</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">sudo chmod 440 /etc/sudoers.d/zhangsan_sudoers</span><br></span></code></pre></div></div>
<p>---全文完---</p>]]></content>
        <category label="github" term="github"/>
        <category label="actions" term="actions"/>
        <category label="gcp" term="gcp"/>
        <category label="oidc" term="oidc"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[共享Android手机屏幕的几种方式(ADB Server + Scrcpy, Sonic)]]></title>
        <id>https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server</id>
        <link href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server"/>
        <updated>2025-11-25T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-通过-adb-server-和-scrcpy-共享手机屏幕">1. 通过 ADB Server 和 Scrcpy 共享手机屏幕<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#1-%E9%80%9A%E8%BF%87-adb-server-%E5%92%8C-scrcpy-%E5%85%B1%E4%BA%AB%E6%89%8B%E6%9C%BA%E5%B1%8F%E5%B9%95" class="hash-link" aria-label="Direct link to 1. 通过 ADB Server 和 Scrcpy 共享手机屏幕" title="Direct link to 1. 通过 ADB Server 和 Scrcpy 共享手机屏幕" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-使用-remote-adb-server-共享-usb设备">1.1. 使用 Remote ADB Server 共享 USB设备<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#11-%E4%BD%BF%E7%94%A8-remote-adb-server-%E5%85%B1%E4%BA%AB-usb%E8%AE%BE%E5%A4%87" class="hash-link" aria-label="Direct link to 1.1. 使用 Remote ADB Server 共享 USB设备" title="Direct link to 1.1. 使用 Remote ADB Server 共享 USB设备" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="111-安装-adb">1.1.1. 安装 ADB<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#111-%E5%AE%89%E8%A3%85-adb" class="hash-link" aria-label="Direct link to 1.1.1. 安装 ADB" title="Direct link to 1.1.1. 安装 ADB" translate="no">​</a></h4>
<p>准备一台 Linux 系统的 PC 机, 推荐 Ubuntu 24.04 LTS, 安装 Android Debug Bridge, 推荐下载最新版<a href="https://developer.android.com/tools/releases/platform-tools" target="_blank" rel="noopener noreferrer" class="">https://developer.android.com/tools/releases/platform-tools</a>:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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 -OL https://dl.google.com/android/repository/platform-tools-latest-linux.zip</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">unzip platform-tools-latest-linux.zip -d ./</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mv platform-tools /usr/lib/android-sdk/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ln /usr/lib/android-sdk/platform-tools/adb /usr/bin/adb</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="112-启动-adb-server">1.1.2. 启动 ADB Server<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#112-%E5%90%AF%E5%8A%A8-adb-server" class="hash-link" aria-label="Direct link to 1.1.2. 启动 ADB Server" title="Direct link to 1.1.2. 启动 ADB Server" translate="no">​</a></h4>
<p>以 systemd 形式启动 ADB Server 监听在所有网络接口</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">cat &gt; /etc/systemd/system/adb-server.service &lt;&lt;'EOF'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Unit]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Description=ADB Server</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">After=network.target</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">[Service]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Type=simple</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStart=/usr/bin/adb -a -P 5037 nodaemon server</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStartPre=/usr/bin/adb kill-server</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Restart=always</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RestartSec=1</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">[Install]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WantedBy=multi-user.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EOF</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">systemctl daemon-reload</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl enable --now adb-server</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="113-通过-usb-数据线连接手机到-adb-server-所在的-linux-pc-并开启手机的-usb-debug">1.1.3. 通过 USB 数据线连接手机到 ADB Server 所在的 Linux PC, 并开启手机的 USB Debug<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#113-%E9%80%9A%E8%BF%87-usb-%E6%95%B0%E6%8D%AE%E7%BA%BF%E8%BF%9E%E6%8E%A5%E6%89%8B%E6%9C%BA%E5%88%B0-adb-server-%E6%89%80%E5%9C%A8%E7%9A%84-linux-pc-%E5%B9%B6%E5%BC%80%E5%90%AF%E6%89%8B%E6%9C%BA%E7%9A%84-usb-debug" class="hash-link" aria-label="Direct link to 1.1.3. 通过 USB 数据线连接手机到 ADB Server 所在的 Linux PC, 并开启手机的 USB Debug" title="Direct link to 1.1.3. 通过 USB 数据线连接手机到 ADB Server 所在的 Linux PC, 并开启手机的 USB Debug" translate="no">​</a></h4>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="114-在其它-pc-上通过-adb-指令使用-adb-server-上的设备">1.1.4. 在其它 PC 上通过 ADB 指令使用 ADB Server 上的设备<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#114-%E5%9C%A8%E5%85%B6%E5%AE%83-pc-%E4%B8%8A%E9%80%9A%E8%BF%87-adb-%E6%8C%87%E4%BB%A4%E4%BD%BF%E7%94%A8-adb-server-%E4%B8%8A%E7%9A%84%E8%AE%BE%E5%A4%87" class="hash-link" aria-label="Direct link to 1.1.4. 在其它 PC 上通过 ADB 指令使用 ADB Server 上的设备" title="Direct link to 1.1.4. 在其它 PC 上通过 ADB 指令使用 ADB Server 上的设备" translate="no">​</a></h4>
<ol>
<li class="">方式1</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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 ADB_SERVER_SOCKET=tcp:&lt;ADB Server IP&gt;:5037</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">adb devices</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">方式2</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">adb -H &lt;ADB Server IP&gt; -P 5037 devices</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-通过-scrcpy-投屏到电脑">1.2. 通过 scrcpy 投屏到电脑<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#12-%E9%80%9A%E8%BF%87-scrcpy-%E6%8A%95%E5%B1%8F%E5%88%B0%E7%94%B5%E8%84%91" class="hash-link" aria-label="Direct link to 1.2. 通过 scrcpy 投屏到电脑" title="Direct link to 1.2. 通过 scrcpy 投屏到电脑" translate="no">​</a></h3>
<ol>
<li class="">下载最新的 scrcpy 3.3.3: <a href="https://github.com/Genymobile/scrcpy/releases" target="_blank" rel="noopener noreferrer" class="">https://github.com/Genymobile/scrcpy/releases</a></li>
</ol>
<p>Linux 也可以从源码编译安装, 参考: <a href="https://github.com/Genymobile/scrcpy/blob/master/doc/linux.md" target="_blank" rel="noopener noreferrer" class="">https://github.com/Genymobile/scrcpy/blob/master/doc/linux.md</a></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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"># for Debian/Ubuntu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo apt install ffmpeg libsdl2-2.0-0 adb wget \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                 gcc git pkg-config meson ninja-build libsdl2-dev \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                 libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                 libswresample-dev libusb-1.0-0 libusb-1.0-0-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">git clone https://github.com/Genymobile/scrcpy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd scrcpy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./install_release.sh</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">执行 scrcpy 并把 --tunnel-host 参数指向 ADB Server, 确保能访问 ADB Server 上的 27183 到 27199 端口, Android 手机的投屏将会显示在 scrcpy 运行的PC上</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">scrcpy -s &lt;设备 ID&gt;--tunnel-host &lt;ADB Server IP&gt; --tunnel-port=27183</span><br></span></code></pre></div></div>
<ol>
<li class="">参数说明<!-- -->
<ol>
<li class="">-s 参数在只有一台设备时可以省略</li>
<li class="">--tunnel-host 参数指向连接手机的 ADB Server</li>
<li class="">--tunnel-port 参数可以省略, 默认值是 27183</li>
</ol>
</li>
<li class="">scrcpy 启动时，将会:<!-- -->
<ol>
<li class="">向设备 /data/local/tmp 推送 scrcpy-server. 等同指令:</li>
</ol>
</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">adb -s &lt;设备 ID&gt; push scrcpy-server /data/local/tmp/scrcpy-server.jar</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">在设备上启动 scrcpy-server, 等同指令:</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">adb -s &lt;设备 ID&gt; shell CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 3.3.3 scid=23d1ac65 log_level=info tunnel_forward=true</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">scrcpy-server 会在设备中创建unix socket, 用于 scrcpy-server与 adbd 之间的 音频/视频/控制 数据的转发:</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">$ cat /proc/net/unix | grep scrcpy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">0000000000000000: 00000003 00000000 00000000 0001 03 1750017 @scrcpy_0801e049</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">0000000000000000: 00000003 00000000 00000000 0001 03 1748184 @scrcpy_0801e049</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">0000000000000000: 00000003 00000000 00000000 0001 03 1748188 @scrcpy_0801e049</span><br></span></code></pre></div></div>
<ol start="4">
<li class="">启动 scrcpy 连接 ADB 转发隧道, 获取视频流并展示在 scrcpy 客户端 PC, 并接收用户指令转发给 adb, 经 adbd 转发给设备</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-基于-linux-gnome-创建一个手机屏幕监控">2. 基于 Linux gnome 创建一个手机屏幕监控<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#2-%E5%9F%BA%E4%BA%8E-linux-gnome-%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%89%8B%E6%9C%BA%E5%B1%8F%E5%B9%95%E7%9B%91%E6%8E%A7" class="hash-link" aria-label="Direct link to 2. 基于 Linux gnome 创建一个手机屏幕监控" title="Direct link to 2. 基于 Linux gnome 创建一个手机屏幕监控" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-写脚本">2.1. 写脚本<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#21-%E5%86%99%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="Direct link to 2.1. 写脚本" title="Direct link to 2.1. 写脚本" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">#!/usr/bin/env bash</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"># auto_scrcpy.sh - Android设备自动投屏监控脚本</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">#   - 自动检测ADB设备插拔，动态启动/停止scrcpy投屏</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">#   - Ctrl+C退出时自动清理所有进程，无残留</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">#   chmod +x auto_scrcpy.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#   ./auto_scrcpy.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#   (按 Ctrl+C 停止)</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">#   - 已安装 adb 和 scrcpy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#   - Android设备开启USB调试并连接</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">#   X_OFFSET=40           # 窗口水平间距(px)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#   Y_OFFSET=60           # 窗口垂直起始位置(px)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#   WINDOW_WIDTH=428      # 窗口宽度(px)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#   RECHECK_INTERVAL=2    # 设备检测间隔(秒)</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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">X_OFFSET=40</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Y_OFFSET=60</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WINDOW_WIDTH=428</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RECHECK_INTERVAL=2</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">declare -A MON_PID        # 监控器进程 PID: MON_PID[$serial]=pid</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">calc_x() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    local idx=$1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    echo $(( X_OFFSET*(idx+1) + WINDOW_WIDTH*idx ))</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">is_process_alive() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    local pid=$1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    kill -0 "$pid" 2&gt;/dev/null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    return $?</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">get_device_index() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    local serial=$1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    local -n arr=$2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    for i in "${!arr[@]}"; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        if [ "${arr[$i]}" == "$serial" ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            echo $i</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            return</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">    done</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    echo -1</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">start_monitor_for() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    local serial=$1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    local idx=$2</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">    if [ -n "${MON_PID[$serial]}" ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        if is_process_alive "${MON_PID[$serial]}"; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            echo "[MAIN] monitor for $serial already running (pid ${MON_PID[$serial]})"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            return</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">            echo "[MAIN] cleaning stale monitor pid ${MON_PID[$serial]} for $serial"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            unset MON_PID["$serial"]</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">    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">    # 先计算好X坐标</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    local x_pos=$(calc_x $idx)</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">    (</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        setsid bash -c -- "</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            while true; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                X=$x_pos</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Y=$Y_OFFSET</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                echo \"[MONITOR][$serial] start scrcpy at \$X,\$Y (index=$idx)\"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                scrcpy -s \"$serial\" --window-x=\$X --window-y=\$Y &amp;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                child=\$!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                echo \$child &gt; /tmp/auto_scrcpy_${serial}.pid</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                wait \$child</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                echo \"[MONITOR][$serial] scrcpy (\$child) exited, restart after 1s\"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                rm -f /tmp/auto_scrcpy_${serial}.pid</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                sleep 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            done</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">    ) &amp;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    local mpid=$!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    MON_PID["$serial"]=$mpid</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    echo "[MAIN] started monitor for $serial (pid $mpid, X=$x_pos)"</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">stop_monitor_for() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    local serial=$1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    local mpid=${MON_PID[$serial]}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    if [ -z "$mpid" ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        return</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">    echo "[MAIN] stopping monitor for $serial (monitor pid $mpid)"</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) 杀 scrcpy 子进程</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    local pidfile="/tmp/auto_scrcpy_${serial}.pid"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    if [ -f "$pidfile" ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        childpid=$(cat "$pidfile" 2&gt;/dev/null)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        if [ -n "$childpid" ] &amp;&amp; is_process_alive "$childpid"; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            echo "[MAIN] killing scrcpy pid $childpid for $serial"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            kill $childpid 2&gt;/dev/null || true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            sleep 0.2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            kill -9 $childpid 2&gt;/dev/null || true</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">        rm -f "$pidfile"</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">    # 2) 杀 monitor 的所有子进程（包括孤儿进程）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    pchildren=$(pgrep -P $mpid 2&gt;/dev/null || true)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    if [ -n "$pchildren" ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        echo "[MAIN] killing child processes of monitor $mpid: $pchildren"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        for c in $pchildren; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            kill $c 2&gt;/dev/null || true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            sleep 0.05</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            kill -9 $c 2&gt;/dev/null || true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        done</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">    # 3) 杀 monitor 本身（使用进程组杀死，确保 setsid 创建的会话也被清理）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    if is_process_alive "$mpid"; then</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">        pgid=$(ps -o pgid= -p $mpid 2&gt;/dev/null | tr -d ' ')</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        if [ -n "$pgid" ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            echo "[MAIN] killing process group $pgid for monitor $mpid"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            kill -- -$pgid 2&gt;/dev/null || true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            sleep 0.2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            kill -9 -- -$pgid 2&gt;/dev/null || true</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">        # 再单独杀 monitor 进程</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        kill $mpid 2&gt;/dev/null || true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        sleep 0.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        kill -9 $mpid 2&gt;/dev/null || true</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">    unset MON_PID["$serial"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rm -f /tmp/auto_scrcpy_${serial}.pid</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">stop_all() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    echo "[MAIN] stopping all monitors..."</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    for s in "${!MON_PID[@]}"; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        stop_monitor_for "$s"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    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">    # 额外清理：查找所有可能残留的 scrcpy 进程</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    echo "[MAIN] cleaning up any remaining scrcpy processes..."</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    pkill -f "scrcpy -s" 2&gt;/dev/null || 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">    # 清理所有临时文件</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rm -f /tmp/auto_scrcpy_*.pid</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">    MON_PID=()</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">get_device_array() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    local -n out=$1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    mapfile -t out &lt; &lt;(adb devices | awk 'NR&gt;1 &amp;&amp; $2=="device"{print $1}' | tac)</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">cleanup_on_exit() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    echo ""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    echo "[MAIN] received exit signal, cleaning up..."</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    stop_all</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    echo "[MAIN] cleanup complete, exiting"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exit 0</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">trap cleanup_on_exit SIGINT SIGTERM 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"># 主循环</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">declare -a last_devices=()</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">echo "[MAIN] auto_scrcpy monitor started"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo "[MAIN] press Ctrl+C to stop"</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">while true; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sleep $RECHECK_INTERVAL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    declare -a cur_devices=()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    get_device_array cur_devices</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">    declare -A set_last=()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    declare -A set_cur=()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    for d in "${last_devices[@]}"; do set_last["$d"]=1; done</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    for d in "${cur_devices[@]}"; do set_cur["$d"]=1; 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">    # 处理移除的设备</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    for d in "${last_devices[@]}"; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        if [ -z "${set_cur[$d]}" ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            echo "[EVENT] device removed: $d"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            stop_monitor_for "$d"</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">    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">    # 处理新增的设备</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    for d in "${cur_devices[@]}"; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        if [ -z "${set_last[$d]}" ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            echo "[EVENT] device added: $d"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            idx=$(get_device_index "$d" cur_devices)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            if [ $idx -ge 0 ]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                start_monitor_for "$d" "$idx"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                sleep 0.2</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">        fi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    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">    # 更新设备列表</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    last_devices=("${cur_devices[@]}")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">done</span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">chmod 755 /opt/screen-manager/auto_scrcpy.sh</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="22-创建桌面登录后启动项">2.2. 创建桌面登录后启动项<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#22-%E5%88%9B%E5%BB%BA%E6%A1%8C%E9%9D%A2%E7%99%BB%E5%BD%95%E5%90%8E%E5%90%AF%E5%8A%A8%E9%A1%B9" class="hash-link" aria-label="Direct link to 2.2. 创建桌面登录后启动项" title="Direct link to 2.2. 创建桌面登录后启动项" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">cat &gt; ~/.config/autostart/scrcpy-manager.desktop &lt;&lt;EOF</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Desktop Entry]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Type=Application</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Name=SCRCPY Manager</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Exec=/opt/screen-manager/auto_scrcpy.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">X-GNOME-Autostart-enabled=true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-基于-ssh-的加密端口转发共享屏幕">3. 基于 SSH 的加密端口转发共享屏幕<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#3-%E5%9F%BA%E4%BA%8E-ssh-%E7%9A%84%E5%8A%A0%E5%AF%86%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E5%85%B1%E4%BA%AB%E5%B1%8F%E5%B9%95" class="hash-link" aria-label="Direct link to 3. 基于 SSH 的加密端口转发共享屏幕" title="Direct link to 3. 基于 SSH 的加密端口转发共享屏幕" translate="no">​</a></h2>
<p>参考: <a href="https://github.com/Genymobile/scrcpy/blob/master/doc/tunnels.md" target="_blank" rel="noopener noreferrer" class="">https://github.com/Genymobile/scrcpy/blob/master/doc/tunnels.md</a></p>
<p>先来了解一下 scrcpy 基于 adb 的数据转发方式:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">======================== CONTROL FLOW ========================</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      PC (adb client)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          |  TCP connect to PC:5037</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          v</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      PC (adb server :5037)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          |  USB ADB protocol</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          v</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      手机 (adbd)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          |  ADB internal socket</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          v</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      手机 (scrcpy-server)</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">======================== VIDEO FLOW ==========================</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      手机 (scrcpy-server)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          |  localabstract:scrcpy  (video source)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          v</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      手机 (adbd)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          |  via USB (adb reverse)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          v</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      PC (adb server listens on :27183)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          | TCP forwarding (your network)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          v</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      PC (scrcpy client: connects to 27183)</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></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="31-环境">3.1. 环境<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#31-%E7%8E%AF%E5%A2%83" class="hash-link" aria-label="Direct link to 3.1. 环境" title="Direct link to 3.1. 环境" translate="no">​</a></h3>
<ol>
<li class="">PC1 环境: 启动了 adb server: <code>adb start-server</code>, USB连接了手机</li>
<li class="">PC2 环境: ADB client, scrcpy</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="32-步骤">3.2. 步骤<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#32-%E6%AD%A5%E9%AA%A4" class="hash-link" aria-label="Direct link to 3.2. 步骤" title="Direct link to 3.2. 步骤" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="321-隧道方式1">3.2.1. 隧道方式1:<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#321-%E9%9A%A7%E9%81%93%E6%96%B9%E5%BC%8F1" class="hash-link" aria-label="Direct link to 3.2.1. 隧道方式1:" title="Direct link to 3.2.1. 隧道方式1:" translate="no">​</a></h4>
<ol>
<li class="">在 PC2 上执行 ssh, 建立到 PC1的 隧道:</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">ssh -CN -L5037:localhost:5037 -R27183:localhost:27183 root@&lt;PC1 IP&gt;</span><br></span></code></pre></div></div>
<p>作用:</p>
<ul>
<li class="">在本地打开一个 5037 → 远程 5037 的正向转发</li>
<li class="">在远程打开一个 27183 → 本地 27183 的反向转发</li>
</ul>
<ol start="2">
<li class="">在 PC2 上启动客户端, 可直接投屏呈现手机屏幕:</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">scrcpy</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="322-隧道方式2">3.2.2. 隧道方式2：<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#322-%E9%9A%A7%E9%81%93%E6%96%B9%E5%BC%8F2" class="hash-link" aria-label="Direct link to 3.2.2. 隧道方式2：" title="Direct link to 3.2.2. 隧道方式2：" translate="no">​</a></h4>
<ol>
<li class="">在 PC2 上执行</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">ssh -CN -L5037:localhost:5037 -L27183:localhost:27183 root@&lt;PC1 IP&gt;</span><br></span></code></pre></div></div>
<p>作用:</p>
<ul>
<li class="">在本地打开一个 5037 → 远程 5037 的正向转发</li>
<li class="">在本地打开一个 27183 → 远程 27183 的正向转发</li>
</ul>
<ol start="2">
<li class="">在 PC2 上 添加 --force-adb-forward 参数启动 scrcpy 客户端, 可直接投屏呈现手机屏幕:</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">scrcpy --force-adb-forward</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-通过-sonic-server-管理手机和-web-投屏">4. 通过 Sonic Server 管理手机和 Web 投屏<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#4-%E9%80%9A%E8%BF%87-sonic-server-%E7%AE%A1%E7%90%86%E6%89%8B%E6%9C%BA%E5%92%8C-web-%E6%8A%95%E5%B1%8F" class="hash-link" aria-label="Direct link to 4. 通过 Sonic Server 管理手机和 Web 投屏" title="Direct link to 4. 通过 Sonic Server 管理手机和 Web 投屏" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="41-开发编译环境搭建">4.1. 开发编译环境搭建<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#41-%E5%BC%80%E5%8F%91%E7%BC%96%E8%AF%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA" class="hash-link" aria-label="Direct link to 4.1. 开发编译环境搭建" title="Direct link to 4.1. 开发编译环境搭建" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="411-sonic-server">4.1.1. Sonic Server<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#411-sonic-server" class="hash-link" aria-label="Direct link to 4.1.1. Sonic Server" title="Direct link to 4.1.1. Sonic Server" translate="no">​</a></h4>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="4111-install-jdk-and-maven">4.1.1.1. Install JDK and Maven<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#4111-install-jdk-and-maven" class="hash-link" aria-label="Direct link to 4.1.1.1. Install JDK and Maven" title="Direct link to 4.1.1.1. Install JDK and Maven" translate="no">​</a></h5>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">sudo apt install openjdk-17-jdk -y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">java --version</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo apt install maven -y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mvn --version</span><br></span></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="4112-调试运行">4.1.1.2. 调试运行<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#4112-%E8%B0%83%E8%AF%95%E8%BF%90%E8%A1%8C" class="hash-link" aria-label="Direct link to 4.1.1.2. 调试运行" title="Direct link to 4.1.1.2. 调试运行" translate="no">​</a></h5>
<p>下载源码, 进入源码根目录</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">git clone git@github.com:ylhyh/sonic-server.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd sonic-server</span><br></span></code></pre></div></div>
<p>开发环境启动 eureka</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">cd sonic-server-eureka</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mvn spring-boot:run -DSONIC_VERSION=2.7.3</span><br></span></code></pre></div></div>
<p>开发环境启动 controller</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">cd sonic-server-controller</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">export MYSQL_HOST=172.16.126.26</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export MYSQL_DATABASE=sonic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export MYSQL_PORT=3306</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export MYSQL_USERNAME=sonic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export MYSQL_PASSWORD=xxxxxx</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">mvn spring-boot:run -DSONIC_VERSION=2.7.3</span><br></span></code></pre></div></div>
<p>开发环境启动 gateway</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">cd sonic-server-gateway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mvn spring-boot:run -DSONIC_VERSION=2.7.3</span><br></span></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="4113-编译打包安装">4.1.1.3. 编译打包安装<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#4113-%E7%BC%96%E8%AF%91%E6%89%93%E5%8C%85%E5%AE%89%E8%A3%85" class="hash-link" aria-label="Direct link to 4.1.1.3. 编译打包安装" title="Direct link to 4.1.1.3. 编译打包安装" translate="no">​</a></h5>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">mvn clean install -Dplatform=linux-x86_64 -DskipTests -DSONIC_VERSION=2.7.3</span><br></span></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="4114-构建-docker-镜像">4.1.1.4. 构建 Docker 镜像<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#4114-%E6%9E%84%E5%BB%BA-docker-%E9%95%9C%E5%83%8F" class="hash-link" aria-label="Direct link to 4.1.1.4. 构建 Docker 镜像" title="Direct link to 4.1.1.4. 构建 Docker 镜像" translate="no">​</a></h5>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">cd sonic-server</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker build -t ylhyh/sonic-server-folder:v2.7.3 -f sonic-server-folder/src/main/docker/Dockerfile .</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker build -t ylhyh/sonic-server-gateway:v2.7.3 -f sonic-server-gateway/src/main/docker/Dockerfile .</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker build -t ylhyh/sonic-server-eureka:v2.7.3 -f sonic-server-eureka/src/main/docker/Dockerfile .</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker build -t ylhyh/sonic-server-controller:v2.7.3 -f sonic-server-controller/src/main/docker/Dockerfile .</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="412-sonic-web">4.1.2. Sonic Web<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#412-sonic-web" class="hash-link" aria-label="Direct link to 4.1.2. Sonic Web" title="Direct link to 4.1.2. Sonic Web" translate="no">​</a></h4>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="4121-安装-nvm-npm">4.1.2.1. 安装 nvm npm<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#4121-%E5%AE%89%E8%A3%85-nvm-npm" class="hash-link" aria-label="Direct link to 4.1.2.1. 安装 nvm npm" title="Direct link to 4.1.2.1. 安装 nvm npm" translate="no">​</a></h5>
<p>安装 npm 18</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">nvm install 18</span><br></span></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="4122调试运行">4.1.2.2.调试运行<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#4122%E8%B0%83%E8%AF%95%E8%BF%90%E8%A1%8C" class="hash-link" aria-label="Direct link to 4.1.2.2.调试运行" title="Direct link to 4.1.2.2.调试运行" translate="no">​</a></h5>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">git clone git@github.com:ylhyh/sonic-client-web.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd sonic-client-web</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nvm use 18</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nvm alias default 18</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npm install</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npm run dev</span><br></span></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="4123-编译打包">4.1.2.3. 编译打包<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#4123-%E7%BC%96%E8%AF%91%E6%89%93%E5%8C%85" class="hash-link" aria-label="Direct link to 4.1.2.3. 编译打包" title="Direct link to 4.1.2.3. 编译打包" translate="no">​</a></h5>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">cd sonic-client-web</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npm run build</span><br></span></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="4124-构建-docker-镜像">4.1.2.4. 构建 Docker 镜像<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#4124-%E6%9E%84%E5%BB%BA-docker-%E9%95%9C%E5%83%8F" class="hash-link" aria-label="Direct link to 4.1.2.4. 构建 Docker 镜像" title="Direct link to 4.1.2.4. 构建 Docker 镜像" translate="no">​</a></h5>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">cd sonic-client-web</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">docker build -t ylhyh/sonic-client-web:v2.7.3 .</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="413-sonic-agent">4.1.3. Sonic Agent<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#413-sonic-agent" class="hash-link" aria-label="Direct link to 4.1.3. Sonic Agent" title="Direct link to 4.1.3. Sonic Agent" translate="no">​</a></h4>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="4131-调试运行">4.1.3.1. 调试运行<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#4131-%E8%B0%83%E8%AF%95%E8%BF%90%E8%A1%8C" class="hash-link" aria-label="Direct link to 4.1.3.1. 调试运行" title="Direct link to 4.1.3.1. 调试运行" translate="no">​</a></h5>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">git clone git@github.com:ylhyh/sonic-agent.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd sonic-agent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mvn spring-boot:run -DSONIC_VERSION=2.7.3</span><br></span></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="4132-编译-jar-包并运行">4.1.3.2. 编译 jar 包并运行<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#4132-%E7%BC%96%E8%AF%91-jar-%E5%8C%85%E5%B9%B6%E8%BF%90%E8%A1%8C" class="hash-link" aria-label="Direct link to 4.1.3.2. 编译 jar 包并运行" title="Direct link to 4.1.3.2. 编译 jar 包并运行" translate="no">​</a></h5>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">mvn clean package -Dplatform=linux-x86_64 -DskipTests -DSONIC_VERSION=2.7.3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">java -Dfile.encoding=utf-8 -jar sonic-agent-linux-x86_64.jar</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="42-部署">4.2. 部署<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#42-%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="Direct link to 4.2. 部署" title="Direct link to 4.2. 部署" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="421-服务端部署">4.2.1. 服务端部署<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#421-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="Direct link to 4.2.1. 服务端部署" title="Direct link to 4.2.1. 服务端部署" translate="no">​</a></h4>
<p>参考: <a href="https://github.com/ylhyh/sonic-server/blob/main/k8s-all-in-one.md" target="_blank" rel="noopener noreferrer" class="">https://github.com/ylhyh/sonic-server/blob/main/k8s-all-in-one.md</a></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="422-agent-部署">4.2.2. Agent 部署<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#422-agent-%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="Direct link to 4.2.2. Agent 部署" title="Direct link to 4.2.2. Agent 部署" translate="no">​</a></h4>
<ol>
<li class="">配置 sonic-agent service</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">cat &gt; /etc/systemd/system/sonic-agent.service &lt;&lt;'EOF'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Unit]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Description=Sonic Agent Service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">After=network-online.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Wants=network-online.target</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">[Service]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Type=simple</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"># 使用 root 用户（设备管理需要）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">User=root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Group=root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WorkingDirectory=/opt/sonic-agent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStart=/usr/bin/java -Dfile.encoding=utf-8 -Xms512m -Xmx1024m -jar /opt/sonic-agent/sonic-agent-linux-x86_64.jar</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">Restart=on-failure</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RestartSec=10</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">StartLimitInterval=300</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">StartLimitBurst=5</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">LimitNOFILE=65536</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">TimeoutStartSec=90</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">[Install]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WantedBy=multi-user.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EOF</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">systemctl daemon-reload</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl enable --now sonic-agent</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="423-android-设备---在-agent-上-配置-adb-server">4.2.3. Android 设备 -&gt; 在 Agent 上 配置 ADB Server<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#423-android-%E8%AE%BE%E5%A4%87---%E5%9C%A8-agent-%E4%B8%8A-%E9%85%8D%E7%BD%AE-adb-server" class="hash-link" aria-label="Direct link to 4.2.3. Android 设备 -> 在 Agent 上 配置 ADB Server" title="Direct link to 4.2.3. Android 设备 -> 在 Agent 上 配置 ADB Server" translate="no">​</a></h4>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="424-ios-设备---在-agent-上配置-usbmuxd">4.2.4. iOS 设备 -&gt; 在 Agent 上配置 usbmuxd<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#424-ios-%E8%AE%BE%E5%A4%87---%E5%9C%A8-agent-%E4%B8%8A%E9%85%8D%E7%BD%AE-usbmuxd" class="hash-link" aria-label="Direct link to 4.2.4. iOS 设备 -> 在 Agent 上配置 usbmuxd" title="Direct link to 4.2.4. iOS 设备 -> 在 Agent 上配置 usbmuxd" translate="no">​</a></h4>
<ol>
<li class="">安装 usbmuxd</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">sudo apt install usbmuxd libimobiledevice-utils -y</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">在 Agent 所在 PC 上通过 USB 连接 iOS 手机, 在手机弹窗中选择信任该电脑</li>
<li class="">运行 agent 包中的 sonic-ios-bridge (sib) 查看 USB 中的 iOS 设备</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">/opt/sonic-agent/plugins/sonic-ios-bridge devices</span><br></span></code></pre></div></div>
<blockquote>
<p>iOS手机的投屏需要通过 macOS + 开发者账号在手机中安装 WebDriverAgent</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-其它投屏玩法-通过-x11-转发手机屏幕">5. 其它投屏玩法: 通过 X11 转发手机屏幕<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#5-%E5%85%B6%E5%AE%83%E6%8A%95%E5%B1%8F%E7%8E%A9%E6%B3%95-%E9%80%9A%E8%BF%87-x11-%E8%BD%AC%E5%8F%91%E6%89%8B%E6%9C%BA%E5%B1%8F%E5%B9%95" class="hash-link" aria-label="Direct link to 5. 其它投屏玩法: 通过 X11 转发手机屏幕" title="Direct link to 5. 其它投屏玩法: 通过 X11 转发手机屏幕" translate="no">​</a></h2>
<blockquote>
<p>前提: 有 ADB Server 的 ssh 权限</p>
</blockquote>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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"># 在客户端上通过 SSH X11转发连接</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ssh -X root@172.16.136.98</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># SSH到 ADB Server上执行</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">scrcpy</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-附录">6. 附录<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#6-%E9%99%84%E5%BD%95" class="hash-link" aria-label="Direct link to 6. 附录" title="Direct link to 6. 附录" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="61-scrcpy-使用小技巧">6.1. Scrcpy 使用小技巧<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#61-scrcpy-%E4%BD%BF%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7" class="hash-link" aria-label="Direct link to 6.1. Scrcpy 使用小技巧" title="Direct link to 6.1. Scrcpy 使用小技巧" translate="no">​</a></h3>
<ol>
<li class="">打开手机摄像头录制视频到文件</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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"> scrcpy --video-source=camera --video-codec=h265 --camera-size=1920x1080 --record=file.mp4</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">打开手机前置摄像头录制视频</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">scrcpy --video-source=camera --video-codec=h265 --camera-size=1920x1080 --camera-facing=front</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">使用前置摄像头把实时手机画面写入 V4L2 虚拟摄像头用于直播、会议、OBS 推流等 Webcam 场景:</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">scrcpy --video-source=camera --camera-size=1920x1080 --camera-facing=front --v4l2-sink=/dev/video2 --no-playback</span><br></span></code></pre></div></div>
<blockquote>
<p>使用前提要先通过 v4l2loopback 创建虚拟摄像头, 类似 sudo modprobe v4l2loopback video_nr=2</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="62-通过-usbip-远程-attach-usb-设备">6.2. 通过 USBIP 远程 attach USB 设备<a href="https://ittour.net/blog/2025/11/25/serveral-methods-share-phone-screen-adb-scrcpy-sonic-server#62-%E9%80%9A%E8%BF%87-usbip-%E8%BF%9C%E7%A8%8B-attach-usb-%E8%AE%BE%E5%A4%87" class="hash-link" aria-label="Direct link to 6.2. 通过 USBIP 远程 attach USB 设备" title="Direct link to 6.2. 通过 USBIP 远程 attach USB 设备" translate="no">​</a></h3>
<blockquote>
<p>USBIP 远程 attach USB 设备适用于 摄像头、U盘、USB键盘、鼠标等通用设备, 不适用于 ADB</p>
</blockquote>
<ol>
<li class="">安装新版的 USBIP</li>
</ol>
<p>usbip 是 linux内核自带的 lib, 也可以从源码编译安装最新版</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">sudo apt update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo apt install -y build-essential git linux-headers-$(uname -r) libudev-dev libwrap0-dev libtool automake autoconf pkg-config</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git clone https://github.com/torvalds/linux.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd linux/tools/usb/usbip</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./autogen.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./configure</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">make</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">make install</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ldconfig</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">以 systemd 模式运行 USBIPD</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">cat &gt; /etc/systemd/system/usbipd.service &lt;&lt;'EOF'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Unit]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Description=USB/IP daemon</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">After=network.target</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">[Service]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Type=simple</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStartPre=/sbin/modprobe usbip_core</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStartPre=/sbin/modprobe usbip_host</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStartPre=/sbin/modprobe vhci_hcd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStart=/usr/sbin/usbipd -D</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Restart=on-failure</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">[Install]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WantedBy=multi-user.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EOF</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">systemctl daemon-reload</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl enable --now usbipd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<ol start="3">
<li class="">在 USBIPD 中绑定 USB 设备</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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"># 绑定指定的 busid 到 USBIPD</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/usr/local/sbin/usbip bind -b 1-13</span><br></span></code></pre></div></div>
<ol start="4">
<li class="">在 客户端 PC 上 attach USBIPD export 出来的 usb 设备</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">usbip attach -r &lt;HostPC_IP&gt; -b 1-3</span><br></span></code></pre></div></div>]]></content>
        <category label="android" term="android"/>
        <category label="scrcpy" term="scrcpy"/>
        <category label="adb" term="adb"/>
        <category label="sonic" term="sonic"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Ollama 安装配置, 轻松把大模型跑在本地]]></title>
        <id>https://ittour.net/blog/2026/03/23/ollama-install-and-configure</id>
        <link href="https://ittour.net/blog/2026/03/23/ollama-install-and-configure"/>
        <updated>2025-11-25T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Ollama 是一个"让开源大模型可以像本地软件一样被安装、运行和调用"的工具。Ollama 可以理解为一个本地大模型运行平台 + 模型管理器 + API 服务层, 把本地跑 AI 这件事做得足够简单。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-安装">1. 安装<a href="https://ittour.net/blog/2026/03/23/ollama-install-and-configure#1-%E5%AE%89%E8%A3%85" class="hash-link" aria-label="Direct link to 1. 安装" title="Direct link to 1. 安装" translate="no">​</a></h2>
<p>Ollama 的安装非常简单快捷, 以 WSL2/Debian 系统为例.</p>
<ol>
<li class="">首先安装 zstd, 因为 Ollama 依赖它</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">sudo apt-get install zstd</span><br></span></code></pre></div></div>
<blockquote>
<p>没有安装 zstd 在安装 Ollama 时会将看到如下错误:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">ERROR: This version requires zstd for extraction. Please install zstd  &gt; and try again:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - Debian/Ubuntu: sudo apt-get install zstd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - RHEL/CentOS/Fedora: sudo dnf install zstd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - Arch: sudo pacman -S zstd</span><br></span></code></pre></div></div>
</blockquote>
<ol start="2">
<li class="">然后运行<code>curl -fsSL https://ollama.com/install.sh | sh</code>即可完成安装
官方文档参考: <a href="https://docs.ollama.com/linux" target="_blank" rel="noopener noreferrer" class="">https://docs.ollama.com/linux</a></li>
</ol>
<p>安装过程示例:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">$ curl -fsSL https://ollama.com/install.sh | sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; Cleaning up old version at /usr/local/lib/ollama</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; Installing ollama to /usr/local</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; Downloading ollama-linux-amd64.tar.zst</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">######################################################################## 100.0%</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; Creating ollama user...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; Adding ollama user to render group...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; Adding ollama user to video group...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; Adding current user to ollama group...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; Creating ollama systemd service...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; Enabling and starting ollama service...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Created symlink /etc/systemd/system/default.target.wants/ollama.service → /etc/systemd/system/ollama.service.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; Nvidia GPU detected.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; The Ollama API is now available at 127.0.0.1:11434.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; Install complete. Run "ollama" from the command line.</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">验证安装后的运行状态</li>
</ol>
<p>Ollama 将被安装成一个 systemd service, 安装完成后可查看 Ollama 服务状态:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">systemctl status ollama</span><br></span></code></pre></div></div>
<p>安装后的Ollama 服务将会默认监听在 127.0.0.1 的 11434 端口, 可以通过浏览器或 curl 访问<code>http://127.0.0.1:11434</code>, Ollama 运行正常时会返回<code>Ollama is running</code></p>
<p>安装完成后可以修改 ollama 的 Service 文件通过环境变量 <code>OLLAMA_HOST</code> 修改其监听地址的端口. 比如在<code>[Service]</code>下添加一行<code>Environment=OLLAMA_HOST=0.0.0.0:25000</code>让其运行在可供外部访问的 25000 端口.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-部署模型">2. 部署模型<a href="https://ittour.net/blog/2026/03/23/ollama-install-and-configure#2-%E9%83%A8%E7%BD%B2%E6%A8%A1%E5%9E%8B" class="hash-link" aria-label="Direct link to 2. 部署模型" title="Direct link to 2. 部署模型" translate="no">​</a></h2>
<p>访问 <a href="https://ollama.com/library" target="_blank" rel="noopener noreferrer" class="">https://ollama.com/library</a>, 查看可用模型, 然后通过<code>ollama pull</code>指令下载:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">ollama pull qwen3.5:4b</span><br></span></code></pre></div></div>
<p>通过<code>ollama list</code>可查看本地可以模型</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">$ ollama list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME                       ID              SIZE      MODIFIED</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">qwen3-embedding:4b         df5bd2e3c74c    2.5 GB    28 minutes ago</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">qwen3.5:2b                 324d162be6ca    2.7 GB    7 days ago</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">qwen2.5:3b                 357c53fb659c    1.9 GB    7 days ago</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nomic-embed-text:latest    0a109f422b47    274 MB    7 days ago</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">qwen3.5:4b                 2a654d98e6fb    3.4 GB    7 days ago</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">qwen3:4b                   359d7dd4bcda    2.5 GB    7 days ago</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">qwen3:8b                   500a1f067a9f    5.2 GB    7 days ago</span><br></span></code></pre></div></div>
<p>可通过<code>ollama run</code>指令运行一个模型并进入交互状态与AI对话, 也可以通过子命令查看模型信息</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">$ ollama run qwen3.5:2b</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; /?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Available Commands:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /set            Set session variables</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /show           Show model information</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /load &lt;model&gt;   Load a session or model</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /save &lt;model&gt;   Save your current session</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /clear          Clear session context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /bye            Exit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /?, /help       Help for a command</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /? shortcuts    Help for keyboard shortcuts</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">Use """ to begin a multi-line message.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Use /path/to/file to include .jpg, .png, or .webp images.</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">&gt;&gt;&gt; /show info</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Model</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    architecture        qwen35</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    parameters          2.3B</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">    embedding length    2048</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    quantization        Q8_0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    requires            0.17.1</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">  Capabilities</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    completion</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    vision</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tools</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    thinking</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">  Parameters</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    presence_penalty    1.5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    temperature         1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    top_k               20</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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  License</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Apache License</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version 2.0, January 2004</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">&gt;&gt;&gt; Send a message (/? for help)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-对外服务">3. 对外服务<a href="https://ittour.net/blog/2026/03/23/ollama-install-and-configure#3-%E5%AF%B9%E5%A4%96%E6%9C%8D%E5%8A%A1" class="hash-link" aria-label="Direct link to 3. 对外服务" title="Direct link to 3. 对外服务" translate="no">​</a></h2>
<p>Ollama 提供 兼容 OpenAI 和 Anthropic 的 API, 可以直接在应用系统中调用</p>
<ol>
<li class="">如果没有修改端口, 默认 base url 是: <a href="http://127.0.0.1:11434/v1" target="_blank" rel="noopener noreferrer" class="">http://127.0.0.1:11434/v1</a></li>
<li class="">默认没有开启认证, 如果需要可设置环境变量<code>OLLAMA_API_KEY</code>, 然后在 HTTP Header 中以<code>Authorization: Bearer $OLLAMA_API_KEY</code>的方式认证</li>
</ol>
<p>通过 curl 并指定模型<code>qwen2.5:3b</code>进行测试:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">curl http://127.0.0.1:11434/api/generate -d '{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "model": "qwen2.5:3b",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "prompt": "天空为什么是蓝色的?",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "stream": false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }'</span><br></span></code></pre></div></div>
<p>参考文档:</p>
<ol>
<li class=""><a href="https://docs.ollama.com/api/openai-compatibility" target="_blank" rel="noopener noreferrer" class="">OpenAI compatibility</a></li>
<li class=""><a href="https://docs.ollama.com/api/anthropic-compatibility" target="_blank" rel="noopener noreferrer" class="">Anthropic compatibility</a></li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-运行监控">4. 运行监控<a href="https://ittour.net/blog/2026/03/23/ollama-install-and-configure#4-%E8%BF%90%E8%A1%8C%E7%9B%91%E6%8E%A7" class="hash-link" aria-label="Direct link to 4. 运行监控" title="Direct link to 4. 运行监控" translate="no">​</a></h2>
<p>可通过<code>ollama ps</code>指令查看正在使用中的模型或资源使用情况.</p>
<p>理想状态下是把模型完全运行中显存中, 对应的 PROCESSOR 是 <code>100% GPU</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">$ ollama ps</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME          ID              SIZE      PROCESSOR    CONTEXT    UNTIL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">qwen2.5:3b    357c53fb659c    2.4 GB    100% GPU     4096       4 minutes from now</span><br></span></code></pre></div></div>
<p>但如果显存不足, 就会出现溢出到内存的情况, 拖慢系统运行速度, PROCESSOR 中可以看到部分 CPU 部分 GPU 的情况:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">$ ollama ps</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME          ID              SIZE      PROCESSOR          CONTEXT    UNTIL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">qwen3.5:2b    324d162be6ca    4.5 GB    42%/58% CPU/GPU    4096       4 minutes from now</span><br></span></code></pre></div></div>]]></content>
        <category label="Ollama" term="Ollama"/>
        <category label="wsl" term="wsl"/>
        <category label="wsl2" term="wsl2"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Can not connect to docker daemon in WSL2 when using the latest Docker Desktop]]></title>
        <id>https://ittour.net/blog/2025/06/30/cant-connect-to-docker-daemon-via-docker-in-wsl2</id>
        <link href="https://ittour.net/blog/2025/06/30/cant-connect-to-docker-daemon-via-docker-in-wsl2"/>
        <updated>2025-06-30T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Docker version:</p>
<ul>
<li class="">Docker desktop: 4.42.1(196648)</li>
<li class="">Engine: 28.2.2</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://ittour.net/assets/images/2025-06-30-connect-to-docker-daemon-wsl2-1-9e5ab2501a74dada262cc6a3ae7bfbed.png" width="760" height="530" class="img_ev3q"></p>
<p>Docker daemon is runing in linux mode:</p>
<p><img decoding="async" loading="lazy" src="https://ittour.net/assets/images/2025-06-30-connect-to-docker-daemon-wsl2-2-f8e8a07be0a548ec1629abce255a7911.png" width="349" height="599" class="img_ev3q"></p>
<p>Ingrated with the default WSL2 distro: Debian
<img decoding="async" loading="lazy" src="https://ittour.net/assets/images/2025-06-30-connect-to-docker-daemon-wsl2-3-5f6685514434a04cfd974567ec469a57.png" width="799" height="384" class="img_ev3q"></p>
<h1>Issues:</h1>
<p>Can't connect to docker daemon from the WSL2 CLI:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">$ sudo docker ps</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?</span><br></span></code></pre></div></div>
<p>But able to connect to the Docker daemon from the Windows CLI:</p>
<div class="language-bat codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bat 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">C:\&gt;docker info</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Client:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Version:    28.2.2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Context:    desktop-linux</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Debug Mode: false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Plugins:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ai: Docker AI Agent - Ask Gordon (Docker Inc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version:  v1.4.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Path:     C:\Program Files\Docker\cli-plugins\docker-ai.exe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  buildx: Docker Buildx (Docker Inc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version:  v0.24.0-desktop.2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Path:     C:\Program Files\Docker\cli-plugins\docker-buildx.exe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  cloud: Docker Cloud (Docker Inc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version:  v0.3.9</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Path:     C:\Program Files\Docker\cli-plugins\docker-cloud.exe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  compose: Docker Compose (Docker Inc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version:  v2.37.1-desktop.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Path:     C:\Program Files\Docker\cli-plugins\docker-compose.exe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  debug: Get a shell into any image or container (Docker Inc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version:  0.0.41</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Path:     C:\Program Files\Docker\cli-plugins\docker-debug.exe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  desktop: Docker Desktop commands (Docker Inc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version:  v0.1.9</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Path:     C:\Program Files\Docker\cli-plugins\docker-desktop.exe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  extension: Manages Docker extensions (Docker Inc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version:  v0.2.29</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Path:     C:\Program Files\Docker\cli-plugins\docker-extension.exe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  init: Creates Docker-related starter files for your project (Docker Inc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version:  v1.4.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Path:     C:\Program Files\Docker\cli-plugins\docker-init.exe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  mcp: Docker MCP Plugin (Docker Inc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version:  dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Path:     C:\Program Files\Docker\cli-plugins\docker-mcp.exe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  model: Docker Model Runner (Docker Inc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version:  v0.1.24</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Path:     C:\Program Files\Docker\cli-plugins\docker-model.exe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version:  0.6.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Path:     C:\Program Files\Docker\cli-plugins\docker-sbom.exe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  scout: Docker Scout (Docker Inc.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Version:  v1.18.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Path:     C:\Program Files\Docker\cli-plugins\docker-scout.exe</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">Server:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Containers: 41</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Running: 36</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Paused: 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Stopped: 5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Images: 69</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Server Version: 28.2.2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Storage Driver: overlay2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Backing Filesystem: extfs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Supports d_type: true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Using metacopy: false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Native Overlay Diff: true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  userxattr: false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Logging Driver: json-file</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Cgroup Driver: cgroupfs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Cgroup Version: 2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Plugins:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Volume: local</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Network: bridge host ipvlan macvlan null overlay</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> CDI spec directories:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /etc/cdi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /var/run/cdi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Discovered Devices:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  cdi: docker.com/gpu=webgpu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Swarm: inactive</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Runtimes: io.containerd.runc.v2 nvidia runc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Default Runtime: runc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Init Binary: docker-init</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> containerd version: 05044ec0a9a75232cad458027ca83437aae3f4da</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> runc version: v1.2.5-0-g59923ef</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> init version: de40ad0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Security Options:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  seccomp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   Profile: builtin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  cgroupns</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Kernel Version: 6.6.87.2-microsoft-standard-WSL2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Operating System: Docker Desktop</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> OSType: linux</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Architecture: x86_64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> CPUs: 16</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Total Memory: 15.58GiB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Name: docker-desktop</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ID: 2c8fd2c6-1faf-411d-87e5-ea3647b987ec</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Docker Root Dir: /var/lib/docker</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Debug Mode: false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> HTTP Proxy: http.docker.internal:3128</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> HTTPS Proxy: http.docker.internal:3128</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> No Proxy: hubproxy.docker.internal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Labels:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  com.docker.desktop.address=npipe://\\.\pipe\docker_cli</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Experimental: false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Insecure Registries:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  hubproxy.docker.internal:5555</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ::1/128</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  127.0.0.0/8</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Live Restore 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">WARNING: DOCKER_INSECURE_NO_IPTABLES_RAW is set</span><br></span></code></pre></div></div>
<p>After searching the WSL file system, found a unix socket located at <code>/mnt/wsl/docker-desktop/shared-sockets/host-services/docker.proxy.sock</code>, so created a symlink so that I could connect to docker daemon from the WSL2 CLI:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">$ sudo ln -s /mnt/wsl/docker-desktop/shared-sockets/host-services/docker.proxy.sock /var/run/docker.sock</span><br></span></code></pre></div></div>
<h1>Background:</h1>
<p>The daemon of the newer version of Docker Desktop runs in a separate docker-desktop subsystem. All WSL subsystems share a docker daemon through a proxy.
<img decoding="async" loading="lazy" src="https://ittour.net/assets/images/2025-06-30-connect-to-docker-daemon-wsl2-4-06a1bbaa699953d7b0d81b2b56487098.png" width="1536" height="1024" class="img_ev3q"></p>]]></content>
        <category label="docker" term="docker"/>
        <category label="wsl" term="wsl"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Migrate wordpress web content to docusaurus markdown]]></title>
        <id>https://ittour.net/blog/2024/10/15/migrate-wordpress-to-docusarus</id>
        <link href="https://ittour.net/blog/2024/10/15/migrate-wordpress-to-docusarus"/>
        <updated>2024-10-15T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<ol>
<li class="">Export your wordpress content to xml</li>
<li class="">Login to Wordpress</li>
<li class="">Tools</li>
<li class="">Export all content to a xml file</li>
</ol>
<ol start="2">
<li class="">Install yarn to your PC(Ubuntu as example)</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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 -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo apt update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo apt install yarn</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">yarn --version</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">Clone <a href="https://github.com/stnor/wordpress-to-docusarus-markdown" target="_blank" rel="noopener noreferrer" class="">https://github.com/stnor/wordpress-to-docusarus-markdown</a></li>
<li class="">Modify convert.js of "wordpress-to-docusarus-markdown", change line #27, point to your exported xml file</li>
<li class="">Execute yarn to install reqiure package, and then execute convert</li>
</ol>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">yarn</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">yarn convert</span><br></span></code></pre></div></div>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Modify Git commit messages in Gitlab]]></title>
        <id>https://ittour.net/blog/2024/10/15/update-git-commit-messages-in-gitlab</id>
        <link href="https://ittour.net/blog/2024/10/15/update-git-commit-messages-in-gitlab"/>
        <updated>2024-10-15T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<ol>
<li class="">Refer to : <a href="https://docs.gitlab.com/ee/tutorials/update_commit_messages/" target="_blank" rel="noopener noreferrer" class="">https://docs.gitlab.com/ee/tutorials/update_commit_messages/</a></li>
<li class="">Clone your repository</li>
<li class="">git fetch origin my-branch-name</li>
<li class="">git checkout my-branch-name</li>
<li class="">git rebase -i HEAD~4</li>
<li class="">Change pick to reword for the lines which you wanna change it, save</li>
<li class="">Change commit message in the popped new editor window, save</li>
<li class="">git push -f origin</li>
</ol>]]></content>
        <category label="git" term="git"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[iBus not working on Ubuntu 20.04.4 LTS, 无法在Ubuntu中输入中文]]></title>
        <id>https://ittour.net/blog/2022/03/10/ibus-not-working-on-ubuntu-20-04-4-lts-无法在ubuntu中输入中文</id>
        <link href="https://ittour.net/blog/2022/03/10/ibus-not-working-on-ubuntu-20-04-4-lts-无法在ubuntu中输入中文"/>
        <updated>2024-04-15T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="问题现象">问题现象<a href="https://ittour.net/blog/2022/03/10/ibus-not-working-on-ubuntu-20-04-4-lts-%E6%97%A0%E6%B3%95%E5%9C%A8ubuntu%E4%B8%AD%E8%BE%93%E5%85%A5%E4%B8%AD%E6%96%87#%E9%97%AE%E9%A2%98%E7%8E%B0%E8%B1%A1" class="hash-link" aria-label="Direct link to 问题现象" title="Direct link to 问题现象" translate="no">​</a></h3>
<ul>
<li class="">Ubuntu 20.04.4 LTS</li>
<li class="">添加汉语语言</li>
<li class="">安装完 iBus 及相关的输入法 (ibus-pinyin, ibus-table-wubi)后，就算是切换到 zh 语言也无法输入中文字符</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="换成-fcitx-后解决">换成 fcitx 后解决:<a href="https://ittour.net/blog/2022/03/10/ibus-not-working-on-ubuntu-20-04-4-lts-%E6%97%A0%E6%B3%95%E5%9C%A8ubuntu%E4%B8%AD%E8%BE%93%E5%85%A5%E4%B8%AD%E6%96%87#%E6%8D%A2%E6%88%90-fcitx-%E5%90%8E%E8%A7%A3%E5%86%B3" class="hash-link" aria-label="Direct link to 换成 fcitx 后解决:" title="Direct link to 换成 fcitx 后解决:" translate="no">​</a></h3>
<ul>
<li class="">安装 fcitx:</li>
</ul>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">$ sudo apt install fcitx</span><br></span></code></pre></div></div>
<ul>
<li class="">打开工具 Language Support/语言支持, 把 Keyboard input method system 改成 fcitx <img decoding="async" loading="lazy" src="https://ittour.net/assets/images/fcitx-9ac7414f3d3670f5311a03013c9dbd86.png" width="513" height="475" class="img_ev3q"></li>
<li class="">安装五笔输入法</li>
</ul>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">$ sudo apt install fcitx-table-wubi</span><br></span></code></pre></div></div>
<ul>
<li class="">按 Ctrl + Space 或 Left Shift 在中英文之间切换</li>
<li class="">按 Ctrl + Shift 在不同的中文输入法之间切换</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Powershell does not support pass Boolean parameter when -File parameter is used]]></title>
        <id>https://ittour.net/blog/2022/03/10/powershell-do-not-support-pass-boolean-parameter-when-file-parameter-is-used</id>
        <link href="https://ittour.net/blog/2022/03/10/powershell-do-not-support-pass-boolean-parameter-when-file-parameter-is-used"/>
        <updated>2024-03-10T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Let’s say there is a Powershell script file named test.ps1 with the following content:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell 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">param ([Boolean] $FromSchTask)</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">if ($FromSchTask)</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">    echo Yes</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">    echo No</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>When I run this script with -File parameter in command prompt by powershell.exe, for example:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell 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">C:\&gt;powershell.exe -ExecutionPolicy bypass -File ./test.ps1 -FromSchTask $True</span><br></span></code></pre></div></div>
<p>It will throw the following error message:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell 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">C:\test.ps1 : Cannot process argument transformation on parameter 'FromSchTask'. Cannot convert value "System.String" to type</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">"System.Boolean". Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    + CategoryInfo          : InvalidData: (:) [test.ps1], ParentContainsErrorRecordException</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    + FullyQualifiedErrorId : ParameterArgumentTransformationError,test.ps1</span><br></span></code></pre></div></div>
<p>As mentioned in this comments in stackoverflow: <a href="https://stackoverflow.com/a/7302626/9657874" target="_blank" rel="noopener noreferrer" class="">https://stackoverflow.com/a/7302626/9657874</a>, it seems the -File parameter does not support pass Boolean parameter to script file. After change -File to -Command, it works like a clarm:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell 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">C:\&gt;powershell.exe -ExecutionPolicy bypass -Command ./test.ps1 -FromSchTask $True</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Yes</span><br></span></code></pre></div></div>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Install SSHD on Windows Server offline]]></title>
        <id>https://ittour.net/blog/2022/12/13/install-sshd-on-windows-server-offline</id>
        <link href="https://ittour.net/blog/2022/12/13/install-sshd-on-windows-server-offline"/>
        <updated>2022-12-13T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Download installaction package from: <a href="https://github.com/PowerShell/Win32-OpenSSH/releases/" target="_blank" rel="noopener noreferrer" class="">https://github.com/PowerShell/Win32-OpenSSH/releases/</a></p>
<p>Ref: <a href="https://serverfault.com/questions/898934/install-openssh-client-in-windows-without-internet-access/1108375#1108375" target="_blank" rel="noopener noreferrer" class="">https://serverfault.com/questions/898934/install-openssh-client-in-windows-without-internet-access/1108375#1108375</a></p>]]></content>
        <category label="Windows" term="Windows"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Collecting User-Mode Dumps for Windows Applications]]></title>
        <id>https://ittour.net/blog/2022/12/05/collecting-user-mode-dumps-for-windows-applications</id>
        <link href="https://ittour.net/blog/2022/12/05/collecting-user-mode-dumps-for-windows-applications"/>
        <updated>2022-12-05T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>By the sytem: <a href="https://learn.microsoft.com/zh-cn/windows/win32/wer/collecting-user-mode-dumps" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/zh-cn/windows/win32/wer/collecting-user-mode-dumps</a></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 2 /f</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpCount /t REG_DWORD /d 3 /f</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d C:\app\CrashDumps /f</span><br></span></code></pre></div></div>
<p>By programmatical:
<a href="https://stackoverflow.com/questions/1547211/how-to-create-minidump-for-my-process-when-it-crashes#1547251" target="_blank" rel="noopener noreferrer" class="">https://stackoverflow.com/questions/1547211/how-to-create-minidump-for-my-process-when-it-crashes#1547251</a></p>]]></content>
        <category label="Windows" term="Windows"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Install Docker EE on Windows Server by Powershell]]></title>
        <id>https://ittour.net/blog/2022/10/17/install-docker-ee-on-windows-server-by-powershell</id>
        <link href="https://ittour.net/blog/2022/10/17/install-docker-ee-on-windows-server-by-powershell"/>
        <updated>2022-10-17T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell 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">Enable-WindowsOptionalFeature -Online -FeatureName containers –All</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">Install-Module -Name DockerMsftProvider -Repository PSGallery –Force</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">Install-Package -Name docker -ProviderName DockerMsftProvider –verbose</span><br></span></code></pre></div></div>]]></content>
        <category label="docker" term="docker"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Suppress console output in PowerShell/Batch]]></title>
        <id>https://ittour.net/blog/2022/09/14/suppress-console-output-in-powershell-batch</id>
        <link href="https://ittour.net/blog/2022/09/14/suppress-console-output-in-powershell-batch"/>
        <updated>2022-09-14T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Powershell
When exception is occured, Out-Null is actually not worked, so uses</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell 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">Get-ChildItem aaa &gt;$null 2&gt;&amp;1</span><br></span></code></pre></div></div>
<p>Or in Powershell 3</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell 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">Get-ChildItem aaa *&gt;$null</span><br></span></code></pre></div></div>
<p>Batch/Dos</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">dir aaa &gt;nul 2&gt;&amp;1</span><br></span></code></pre></div></div>]]></content>
        <category label="Powershell" term="Powershell"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Gitlab pages throws 502]]></title>
        <id>https://ittour.net/blog/2022/05/09/gitlab-pages-throws-502</id>
        <link href="https://ittour.net/blog/2022/05/09/gitlab-pages-throws-502"/>
        <updated>2022-05-09T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Intermittent 502 errors or after a few days
If you run Pages on a system that uses systemd and tmpfiles.d, you may encounter intermittent 502 errors trying to serve Pages with an error similar to:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">dial tcp: lookup gitlab.example.com on [::1]:53: dial udp [::1]:53: connect: no route to host"</span><br></span></code></pre></div></div>
<p>GitLab Pages creates a bind mount inside /tmp/gitlab-pages-* that includes files like /etc/hosts. However, systemd may clean the /tmp/ directory on a regular basis so the DNS configuration may be lost.</p>
<ol>
<li class="">To stop systemd from cleaning the Pages related content: 1. Tell tmpfiles.d to not remove the Pages /tmp directory:</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">echo 'x /tmp/gitlab-pages-*' &gt;&gt; /etc/tmpfiles.d/gitlab-pages-jail.conf</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">Restart GitLab Pages:</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">sudo gitlab-ctl restart gitlab-pages</span><br></span></code></pre></div></div>]]></content>
        <category label="Gitlab" term="Gitlab"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Powershell: Copy-Item doesn’t work when file name contains square bracket ([]) characters]]></title>
        <id>https://ittour.net/blog/2022/03/20/powershell-copy-item-doesnt-work-when-file-name-contain-characters</id>
        <link href="https://ittour.net/blog/2022/03/20/powershell-copy-item-doesnt-work-when-file-name-contain-characters"/>
        <updated>2022-03-20T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>I have a file whose name contains square bracket characters, and I want to copy the file to another location via Powershell.</p>
<p>So I use the Copy-Item founcation to do this. like this:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell 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">Copy-Item -Path "C:\FileTest\1\[Control]Test.txt" -Destination "C:\FileTest\2\[Control]Update.txt"</span><br></span></code></pre></div></div>
<p>No errors occurred when executing the script, but the target file was not copied either.</p>
<p>After looking through the official document, I found that changing the -Path parameter to the -LiteralPath parameter will make the script work. It is because the -Path parameter allows wildcard characters, square bracket characters will be treated as special usage. For example:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell 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">Copy-Item -LiteralPath "C:\FileTest\1\[Control]Test.txt" -Destination "C:\FileTest\2\[Control]Update.txt"</span><br></span></code></pre></div></div>
<p>References:</p>
<ul>
<li class=""><a href="https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.management/copy-item" target="_blank" rel="noopener noreferrer" class="">https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.management/copy-item</a></li>
<li class=""><a href="https://stackoverflow.com/questions/19000033/copy-item-a-file-with-strange-characters-in-filename-i-e" target="_blank" rel="noopener noreferrer" class="">https://stackoverflow.com/questions/19000033/copy-item-a-file-with-strange-characters-in-filename-i-e</a></li>
</ul>]]></content>
        <category label="Powershell" term="Powershell"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Follow the official document to install docker on debian/jessie meets an error]]></title>
        <id>https://ittour.net/blog/2022/03/14/follow-the-official-document-to-install-docker-on-debian-jessie-meets-an-error</id>
        <link href="https://ittour.net/blog/2022/03/14/follow-the-official-document-to-install-docker-on-debian-jessie-meets-an-error"/>
        <updated>2022-03-14T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Update the apt package index and install packages to allow apt to use repository over HTTPS:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">apt-get update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">apt-get install \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ca-certificates \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    curl \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    gnupg \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    lsb-release</span><br></span></code></pre></div></div>
<p>Add Docker’s official GPG key:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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 -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span><br></span></code></pre></div></div>
<p>Use the following command to set up the stable repository</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">echo \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list &gt; /dev/null</span><br></span></code></pre></div></div>
<p>Install Docker Engine</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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">apt-get update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">apt-get install docker-ce docker-ce-cli containerd.io</span><br></span></code></pre></div></div>
<p>When execute apt-get upate, it’s occurs an error:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">Get:12 https://download.docker.com jessie/stable Translation-en [391 B]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ign https://download.docker.com jessie/stable Translation-en</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Fetched 44.8 kB in 3s (14.7 kB/s)                      </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Reading package lists... Done</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">W: GPG error: https://download.docker.com jessie InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8</span><br></span></code></pre></div></div>
<p>Execute the following scripts can easily fix this error:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell 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 -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -</span><br></span></code></pre></div></div>
<p>But you may also encounter other errors during the installation that requires more follow-up. So the better solution is update debian jessie 8 to stretch 9, then to install docker again.</p>
<p>reference: <a href="https://stackoverflow.com/questions/60137344/docker-how-to-solve-the-public-key-error-in-ubuntu-while-installing-docker" target="_blank" rel="noopener noreferrer" class="">https://stackoverflow.com/questions/60137344/docker-how-to-solve-the-public-key-error-in-ubuntu-while-installing-docker</a></p>]]></content>
        <category label="docker" term="docker"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[USB specifications and aliases of USB3]]></title>
        <id>https://ittour.net/blog/2022/02/02/usb-specifications-and-aliases-of-usb3</id>
        <link href="https://ittour.net/blog/2022/02/02/usb-specifications-and-aliases-of-usb3"/>
        <updated>2022-02-02T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<table><thead><tr><th>Specification</th><th>Previous Term</th><th>Technical Term</th><th>Marketing Term</th></tr></thead><tbody><tr><td>USB 3.2</td><td>N/A</td><td>USB 3.2 Gen 2x2</td><td>SuperSpeed USB 20Gbps</td></tr><tr><td>USB 3.1</td><td>USB 3.1 Gen 2</td><td>USB 3.2 Gen 2</td><td>SuperSpeed USB 10Gbps</td></tr><tr><td>USB 3.0</td><td>USB 3.1 Gen 1</td><td>USB 3.2 Gen 1</td><td>SuperSpeed USB</td></tr></tbody></table>
<p><img decoding="async" loading="lazy" src="https://ittour.net/assets/images/1591244658654551-111f0f9c855f2610e07905c958eef94a.jpg" width="2000" height="1740" class="img_ev3q"></p>
<p>References: <a href="https://www.tomshardware.com/news/usb-3.0-usb-3.1-becomes-usb-3.2,38699.html" target="_blank" rel="noopener noreferrer" class="">Forget USB 3.0 &amp; USB 3.1: USB 3.2 Moving Forward</a> <a href="https://www.spill.hk/glossary/usb-4/" target="_blank" rel="noopener noreferrer" class="">USB 4.0：支援 Thunderbolt 3、DP 2.0、16K 超解像的「一統天下」制式</a></p>]]></content>
        <category label="Hardware" term="Hardware"/>
        <category label="USB" term="USB"/>
        <category label="USB3" term="USB3"/>
        <category label="USB4" term="USB4"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Aliyun SLS 日志加工高级参数]]></title>
        <id>https://ittour.net/blog/2022/01/20/aliyun-sls-log-process-advanced-parameters</id>
        <link href="https://ittour.net/blog/2022/01/20/aliyun-sls-log-process-advanced-parameters"/>
        <updated>2022-01-20T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-systemcontrolfilter_pack_id">1. system.control.filter_pack_id<a href="https://ittour.net/blog/2022/01/20/aliyun-sls-log-process-advanced-parameters#1-systemcontrolfilter_pack_id" class="hash-link" aria-label="Direct link to 1. system.control.filter_pack_id" title="Direct link to 1. system.control.filter_pack_id" translate="no">​</a></h2>
<blockquote>
<p>控制数据加工后是否过滤掉 pack_id 字段, 该字段用于日志条目的上下文查询 - 默认值: true - 如果日志加工后想保留 pack_id 字段, 把该字段设置为 false</p>
</blockquote>]]></content>
        <category label="Aliyun" term="Aliyun"/>
        <category label="SLS" term="SLS"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The type initializer for 'Microsoft.EntityFrameworkCore.EnumerableMethods' threw an exception - InvalidOperationException: Sequence contains more than one matching element]]></title>
        <id>https://ittour.net/blog/2022/01/10/the-type-initializer-for-microsoftentityframeworkcoreenumerablemethods-threw-an-exception-invalidoperationexception-sequence-contains-more-than-one-matching-element</id>
        <link href="https://ittour.net/blog/2022/01/10/the-type-initializer-for-microsoftentityframeworkcoreenumerablemethods-threw-an-exception-invalidoperationexception-sequence-contains-more-than-one-matching-element"/>
        <updated>2022-01-10T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>net6.0</p>
<p>MySql.Data.EntityFrameworkCore [Version=8.0.22]</p>
<p>This package has been deprecated.</p>
<p>Microsoft.EntityFrameworkCore</p>
<p>Upgrade Microsoft.EntityFrameworkCore to 6.0.1</p>
<p>Install the new package "MySql.EntityFrameworkCore" version 5.0.8 to resolved</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">    System.TypeInitializationException</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      HResult=0x80131534</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      Message=The type initializer for 'Microsoft.EntityFrameworkCore.EnumerableMethods' threw an exception.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      Source=Microsoft.EntityFrameworkCore</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      StackTrace:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.EntityFrameworkCore.EnumerableMethods.get_AnyWithPredicate()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.EntityFrameworkCore.Query.Internal.AllAnyToContainsRewritingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.EntityFrameworkCore.Query.QueryTranslationPreprocessor.Process(Expression query)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.&lt;&gt;c__DisplayClass9_0`1.&lt;Execute&gt;b__0()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey, Func`1 compiler)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at System.Linq.Queryable.Any[TSource](IQueryable`1 source)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Q1.AutoOps.ResCleaner.Services.RabbitMQCleaner.StartAsync(CancellationToken cancellationToken) in D:\Projects\DevOps\AutoOps\Q1.AutoOps.ResCleaner\src\Q1.AutoOps.ResCleaner\Services\RabbitMQCleaner.cs:line 69</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.Extensions.Hosting.Internal.Host.&lt;StartAsync&gt;d__12.MoveNext()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.&lt;RunAsync&gt;d__4.MoveNext()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.&lt;RunAsync&gt;d__4.MoveNext()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at System.Runtime.CompilerServices.TaskAwaiter.GetResult()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       at Program.&lt;Main&gt;$(String[] args) in D:\Projects\DevOps\AutoOps\Q1.AutoOps.ResCleaner\src\Q1.AutoOps.ResCleaner\Program.cs:line 29</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">      This exception was originally thrown at this call stack:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        [External Code]</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">    Inner Exception 1:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    InvalidOperationException: Sequence contains more than one matching element</span><br></span></code></pre></div></div>
<p>Reference: - <a href="https://docs.microsoft.com/en-us/answers/questions/622611/net-6-upgrade.html" target="_blank" rel="noopener noreferrer" class="">https://docs.microsoft.com/en-us/answers/questions/622611/net-6-upgrade.html</a></p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Two methods to resolve StackExchange.Redis.RedisTimeoutException in C#]]></title>
        <id>https://ittour.net/blog/2021/12/21/two-methods-to-resolve-stackexchange-redis-redistimeoutexception-in-c</id>
        <link href="https://ittour.net/blog/2021/12/21/two-methods-to-resolve-stackexchange-redis-redistimeoutexception-in-c"/>
        <updated>2021-12-21T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">StackExchange.Redis.RedisTimeoutException: Timeout performing SETEX (5000ms), next: SETEX AutoOps:PodLauncher:2109:LWSY:75:85001:IsMainServerRunning, inst: 0, qu: 0, qs: 1, aw: False, rs: ReadAsync, ws: Idle, in: 0, in-pipe: 0, out-pipe: 0, serverEndpoint: r-bp1je5yrr7ctdzwhmk.redis.rds.aliyuncs.com:6379, mc: 1/1/0, mgr: 10 of 10 available, clientName: 2109-85001-0, IOCP: (Busy=1,Free=999,Min=4,Max=1000), WORKER: (Busy=2,Free=32765,Min=32,Max=32767), v: 2.1.28.64774 (Please take a look at this article for some common client-side issues that can cause timeouts: https://stackexchange.github.io/StackExchange.Redis/Timeouts)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) in /_/src/StackExchange.Redis/ConnectionMultiplexer.cs:line 2616</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) in /_/src/StackExchange.Redis/RedisBase.cs:line 54</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   at StackExchange.Redis.RedisDatabase.StringSet(RedisKey key, RedisValue value, Nullable`1 expiry, When when, CommandFlags flags) in /_/src/StackExchange.Redis/RedisDatabase.cs:line 2500</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   at Q1.Foundation.RepoLibs.RedisLib.StringSet(RedisKey key, RedisValue value, Nullable`1 expiry, When when, CommandFlags flags)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   at GameSvrLauncher.Lib.RedisCache.&lt;&gt;c__DisplayClass27_0.&lt;set_IsMainServerRunning&gt;b__0(ILogger logger)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   at GameSvrLauncher.Lib.Utils.RetryAction(Action`1 func, String actionDesc, ILogger logger, Int32 executeTimes, Int32 sleepTimes, Action`2 warnCallback, Action`2 faultCallback)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-1">Method #1:<a href="https://ittour.net/blog/2021/12/21/two-methods-to-resolve-stackexchange-redis-redistimeoutexception-in-c#method-1" class="hash-link" aria-label="Direct link to Method #1:" title="Direct link to Method #1:" translate="no">​</a></h2>
<p>Set minimal worker threads:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="way-1-by-environment-variables">Way #1: By environment variables<a href="https://ittour.net/blog/2021/12/21/two-methods-to-resolve-stackexchange-redis-redistimeoutexception-in-c#way-1-by-environment-variables" class="hash-link" aria-label="Direct link to Way #1: By environment variables" title="Direct link to Way #1: By environment variables" translate="no">​</a></h3>
<p>Before .net 6:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">COMPlus_ThreadPool_ForceMinWorkerThreads</span><br></span></code></pre></div></div>
<p>.net 6</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">DOTNET_ThreadPool_ForceMinWorkerThreads</span><br></span></code></pre></div></div>
<p>NOTES: The value is in hexadecimal format</p>
<p>ref docs: <a href="https://docs.microsoft.com/en-us/dotnet/core/run-time-config/threading" target="_blank" rel="noopener noreferrer" class="">https://docs.microsoft.com/en-us/dotnet/core/run-time-config/threading</a> <a href="https://github.com/dotnet/runtime/issues/11774" target="_blank" rel="noopener noreferrer" class="">https://github.com/dotnet/runtime/issues/11774</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="way-2by-systemthreadingthreadpoolsetminthreads-methods">Way #2：By System.Threading.ThreadPool.SetMinThreads methods<a href="https://ittour.net/blog/2021/12/21/two-methods-to-resolve-stackexchange-redis-redistimeoutexception-in-c#way-2by-systemthreadingthreadpoolsetminthreads-methods" class="hash-link" aria-label="Direct link to Way #2：By System.Threading.ThreadPool.SetMinThreads methods" title="Direct link to Way #2：By System.Threading.ThreadPool.SetMinThreads methods" translate="no">​</a></h3>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-2">Method #2:<a href="https://ittour.net/blog/2021/12/21/two-methods-to-resolve-stackexchange-redis-redistimeoutexception-in-c#method-2" class="hash-link" aria-label="Direct link to Method #2:" title="Direct link to Method #2:" translate="no">​</a></h2>
<p>Set sync timeout for redis connection.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><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">"172.16.127.229:6379,defaultDatabase=1,syncTimeout=10000"</span><br></span></code></pre></div></div>
<p>the default sync timeout is 5000 ms. ref docs: <a href="https://stackexchange.github.io/StackExchange.Redis/Configuration.html" target="_blank" rel="noopener noreferrer" class="">https://stackexchange.github.io/StackExchange.Redis/Configuration.html</a></p>]]></content>
        <category label="C#" term="C#"/>
    </entry>
</feed>