1. 项目概述:这不是一个“装软件”的教程,而是一套可落地的本地智能体工作流
OpenClaw 和 Grok 这两个名字最近在技术圈里频繁出现,但很多人点开 GitHub 仓库后第一反应是:“这到底是个啥?文档里全是英文、依赖一堆、启动命令长得像密码,Windows 用户根本无从下手。”我试过三次——第一次卡在 Python 环境冲突,第二次倒在 Redis 配置失败,第三次终于跑通网页搜索和 Telegram 消息响应,但第二天重启电脑,服务全挂了,自启动没生效,Telegram Bot 也不回话。这才意识到:真正难的不是“装上”,而是“稳住”——稳在 Windows 上,稳在开机那一刻,稳在你关掉 CMD 窗口之后还能继续干活。
这个标题里的【保姆级】三个字,不是营销话术,而是实打实的“手把手盯屏操作”。它覆盖的不是某个孤立功能,而是一条完整闭环:本地大模型能力(Grok)+ 可扩展技能框架(OpenClaw)+ 多端触发入口(网页 + Telegram)+ 系统级持久化(Windows 自启动)。它解决的不是“能不能用”,而是“要不要开电脑就让它自己跑着”——比如你早上泡咖啡时,手机 Telegram 已经收到昨晚爬完的行业简报;你下班前发一句“汇总今天 GitHub trending 的 Python 项目”,回家路上网页端就已生成带链接的摘要。
关键词里,“Windows”是硬约束,意味着不能照搬 Linux 的 systemd 或 Docker Compose up -d;“OpenClaw”不是个 App,而是一个基于 Python 的技能调度中枢,核心在于 skill.yaml 的编写逻辑和插件加载机制;“Grok”在这里特指开源可本地运行的 Grok-1.5 或 Grok-2 轻量量化版本(非 xAI 官方 API),需通过 Ollama、llama.cpp 或 vLLM 托管为 OpenAI 兼容接口;“自启动”在 Windows 下有至少五种实现路径,但只有两种真正可靠:Task Scheduler 带交互会话的登录触发,以及 Windows Service 封装(需 pywin32);“Telegram 接入”本质是 Bot API 的 Webhook 或轮询模式选型,而 OpenClaw 默认用的是 polling,必须确保进程不被 Windows 后台限制策略杀死。
适合谁看?三类人:一是刚接触本地大模型的 Windows 用户,不想碰 WSL、Docker Desktop 或虚拟机;二是已有 Python 项目但总被环境问题拖慢进度的开发者,需要一套“关机重启不丢状态”的部署范式;三是想把 AI 能力嵌入日常办公流的效率实践者——比如用 Telegram 私聊自动查会议纪要、用浏览器输入框直接问“把上周日报转成 PPT 大纲”。它不承诺替代 Claude 或 GPT-4,但能让你在离线、隐私敏感、定制化强的场景下,真正拥有一个“听你话、记得住、不掉线”的本地智能体。
2. 整体设计思路与方案选型依据
2.1 为什么放弃 Docker Desktop?Windows 下的容器不是万能解药
看到标题里有 OpenClaw 和 Grok,很多人的第一反应是“Docker 化”。我确实试过:用 Docker Desktop for Windows 拉取官方 openclaw/openclaw 镜像,再配一个 ollama/ollama 镜像跑 Grok。表面看很干净,但实际踩了三个深坑:
第一,GPU 加速失效。Windows 上 Docker Desktop 默认使用 Hyper-V 虚拟机,NVIDIA GPU 无法直通到容器内,llama.cpp 的 CUDA 后端直接降级为 CPU 推理,Grok-1.5 的单次响应从 8 秒拉长到 42 秒。而原生 Windows Python 环境可直接调用本机 CUDA 驱动(需安装对应版本的torch和nvidia-cublas-cu12),实测吞吐提升 4.8 倍。
第二,自启动可靠性差。Docker Desktop 本身不是 Windows Service,它依赖用户登录后手动启动 GUI,且其后台进程常被 Windows 电源管理策略终止。即使配置docker-compose up -d,一旦宿主机休眠唤醒,容器网络栈大概率损坏,Telegram Bot 连不上 API 端点。我们测试过 17 次休眠-唤醒循环,12 次需手动docker restart才恢复。
第三,调试成本陡增。OpenClaw 的 skill 开发高度依赖实时日志和文件热重载(比如改一行skill.yaml就想立刻测试)。Docker 容器内修改文件需docker cp或挂载卷,而 Windows 文件系统权限和行尾符(CRLF vs LF)又引发 YAML 解析错误。相比之下,原生 Python 环境下openclaw serve --reload一行命令搞定,改完保存,3 秒内新逻辑生效。
所以最终方案明确:Grok 用 llama.cpp + CUDA 后端原生运行,OpenClaw 用标准 Python venv 部署,两者通过 http://localhost:11434(Ollama 兼容端口)或 http://localhost:8000(vLLM 端口)通信,彻底绕过 Docker 抽象层。这不是倒退,而是对 Windows 生态真实约束的尊重。
2.2 为什么选 llama.cpp 而非 Ollama?控制权必须握在自己手里
Ollama 在 macOS/Linux 上体验极佳,但在 Windows 下有两个致命短板:一是其 Windows 版本长期停留在 0.1.x,不支持 Grok-2 的 GGUF 量化格式;二是它把模型加载、上下文管理、CUDA 内存分配全封装成黑盒,出错时只报Error: failed to load model,连具体哪一行 CUDA 初始化失败都不告诉你。
llama.cpp 则完全不同。它是一个纯 C/C++ 实现的推理引擎,Windows 编译版(如llama-server.exe)体积仅 8MB,无任何运行时依赖。更重要的是,它的启动参数就是你的控制面板:
llama-server.exe -m grok-1.5.Q5_K_M.gguf -c 4096 --port 8000 --host 127.0.0.1 --gpu-layers 45 --verbose-prompt这里-c 4096明确指定上下文长度,--gpu-layers 45精确控制有多少层计算卸载到 GPU(我的 RTX 4070 是 46 层,设 45 是为 CPU 留出 token 生成缓冲区),--verbose-prompt开启后能看到每个 token 的 logits 分布——这在调试 OpenClaw 的 system prompt 是否生效时,是唯一可信依据。Ollama 做不到这点。
我们实测对比:同一台机器(i7-12700K + RTX 4070),Grok-1.5-Q5_K_M 模型,llama.cpp 平均首 token 延迟 1.2 秒,Ollama 为 2.7 秒;内存占用 llama.cpp 稳定在 10.3GB,Ollama 波动在 11.8–13.2GB。多出来的 1.5GB 内存,就是 Ollama 额外加载的 Go 运行时和抽象层。
2.3 自启动方案:Task Scheduler 是唯一兼顾“简单”与“可靠”的选择
Windows 自启动有五条路:Startup 文件夹、注册表 Run 键、Shell:startup、Windows Service、Task Scheduler。我们逐个验证:
Startup 文件夹:
C:\Users\{user}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup。问题在于它只在用户登录图形界面时触发,若你用远程桌面连接后锁屏,或系统自动登录但未激活桌面会话,脚本根本不会执行。OpenClaw 进程一启动就被标记为“无交互”,30 秒后被 Windows 终止。注册表 Run 键:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run。同 Startup 文件夹,依赖用户会话,且无法设置延迟启动(Grok 模型加载需 22 秒,OpenClaw 若早于它启动会报连接拒绝)。Shell:startup:命令行输入
shell:startup打开的仍是同一个 Startup 文件夹,无效。Windows Service:用
pywin32将 Python 脚本封装为服务最“正规”,但代价巨大:需处理 Session 0 隔离问题(Windows Vista 后所有服务运行在 Session 0,无法访问用户桌面和 GPU)、需手动配置服务账户权限、每次代码更新都要sc stop+sc start,开发迭代效率归零。Task Scheduler:唯一能同时满足三个条件的方案:① 可设置“用户登录时触发”并勾选“不管用户是否登录都要运行”(需输入密码);② 可配置“延迟 30 秒启动”,完美错开 Grok 加载期;③ 可设置“如果任务失败,每 5 分钟重试,最多 3 次”,这是 OpenClaw 这类网络服务的生命线。
我们最终采用 Task Scheduler + bat 封装的组合。bat 文件不是简单调python app.py,而是包含三重保险:
- 检查
llama-server.exe进程是否存在,不存在则先启动; - 检查
http://127.0.0.1:8000/health返回码是否为 200,超时则等待; - 启动 OpenClaw 前,用
timeout /t 5强制等待 5 秒,避免竞态。
这套逻辑写进.bat,再由 Task Scheduler 调度,比任何 Python 库都更贴近 Windows 底层行为。
2.4 Telegram 接入:Polling 模式是 Windows 下的务实之选
OpenClaw 文档里提到 Webhook 和 Polling 两种 Telegram 接入方式。Webhook 理论上更高效,但要求你的服务器有公网 IP 和 443 端口映射,还要配 SSL 证书。Windows 个人电脑显然不满足。
Polling 模式是 Telegram Bot API 提供的备用方案:Bot 客户端定期(默认 30 秒)向https://api.telegram.org/bot{token}/getUpdates发 GET 请求,拉取新消息。OpenClaw 默认启用此模式,但有个隐藏陷阱:它的polling_interval参数单位是毫秒,而文档写的是“seconds”,导致很多人设polling_interval=30,结果 Bot 每 30 毫秒狂刷 API,10 分钟就被 Telegram 限流封禁。
正确做法是在config.yaml中显式写:
telegram: token: "YOUR_BOT_TOKEN" polling_interval: 30000 # 必须是毫秒!30000 = 30秒 allowed_users: ["123456789"] # 你的 Telegram user_id,防滥用更关键的是,Polling 模式下必须确保 OpenClaw 进程不被 Windows 后台活动限制。我们在 Task Scheduler 的任务属性中,勾选了“配置为:Windows 10”(即使你用 Win11,选 Win10 兼容性更好),并在“条件”页取消勾选“只有在计算机使用交流电源时才启动此任务”——否则笔记本合盖后 Bot 就失联。
3. 核心细节解析与实操要点
3.1 环境准备:Python、CUDA、VS Build Tools 的精准版本锁定
Windows 上 Python 环境混乱是最大拦路虎。OpenClaw 要求 Python ≥3.10,Grok 推理库(llama-cpp-python)要求 Visual Studio Build Tools ≥2019,而 CUDA 12.1 对应的 PyTorch 要求 Python ≤3.11。三者交集只有Python 3.10.12和Python 3.11.9。我们实测 3.11.9 更稳,因为其venv模块对 Windows 路径处理更健壮。
安装步骤必须严格按序:
卸载所有旧 Python:控制面板 → 卸载程序 → 删除所有 Python 3.9 及以下版本。重点检查
C:\Users\{user}\AppData\Local\Programs\Python和C:\Program Files\Python3*,手动删净残留。安装 Python 3.11.9:去 python.org 下载
python-3.11.9-amd64.exe,安装时务必勾选“Add Python to PATH”和“Install pip”,但不要勾选 “Install for all users”(避免权限问题)。安装后打开 CMD,执行:python --version # 应输出 Python 3.11.9 where python # 记下路径,如 C:\Users\name\AppData\Local\Programs\Python\Python311\python.exe安装 Visual Studio Build Tools 2022:不是 VS IDE,而是独立的 Build Tools。去 visualstudio.microsoft.com/downloads/ 搜索 “Build Tools for Visual Studio 2022”,下载
vs_BuildTools.exe。安装时只勾选“C++ build tools”和“.NET desktop build tools”,其他全取消。这一步耗时约 12 分钟,但省去后续 90% 的编译错误。安装 CUDA 12.1:去 developer.nvidia.com/cuda-toolkit-archive 下载
cuda_12.1.1_531.14_windows.exe。安装类型选“Custom (Advanced)”,取消勾选 “NVIDIA GeForce Experience” 和 “NVIDIA HD Audio Driver”,只留 “CUDA Toolkit” 和 “CUDA Samples”。安装后重启电脑,再执行:nvcc --version # 应输出 release 12.1, V12.1.105验证 PyTorch CUDA 支持:
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.device_count())"正确输出应为
True和1。若为False,大概率是 CUDA 版本与 PyTorch 不匹配,此时去 pytorch.org/get-started/locally/ 选 “Windows”、“Pip”、“CUDA 12.1”,复制命令重装。
提示:所有路径中禁止出现中文、空格、特殊符号。
C:\my project\这种路径会导致 llama.cpp 编译失败。统一用C:\openclaw-env\这类纯英文短路径。
3.2 Grok 模型部署:从 GGUF 下载到 CUDA 加速验证
Grok 模型没有官方 Windows 镜像,必须手动下载量化 GGUF 文件。推荐渠道是 Hugging Face 的TheBloke/Grok-1.5-GGUF仓库(注意:不是Grok-2,因 Grok-2 的 GGUF 量化尚未成熟,Q4_K_M 在 4070 上显存溢出)。
下载步骤:
- 打开 https://huggingface.co/TheBloke/Grok-1.5-GGUF/tree/main
- 找到文件名含
Q5_K_M的项(平衡精度与速度),如grok-1.5.Q5_K_M.gguf(约 4.2GB) - 点击右侧 ↓ 图标下载,保存到
C:\openclaw-env\models\
接着下载 llama.cpp Windows 预编译版:去 github.com/ggerganov/llama.cpp/releases 找最新llama-bins-windows-x64.zip,解压到C:\openclaw-env\llama-bin\,得到llama-server.exe。
现在启动 Grok 服务:
cd C:\openclaw-env\llama-bin\ llama-server.exe -m ..\models\grok-1.5.Q5_K_M.gguf -c 4096 --port 8000 --host 127.0.0.1 --gpu-layers 45 --verbose-prompt关键参数解释:
-c 4096:Grok-1.5 原生上下文是 8192,但 Windows 下显存紧张,设 4096 是安全值;若你有 RTX 4090,可试8192。--gpu-layers 45:RTX 4070 有 46 个 SM,设 45 表示 45 层计算在 GPU,最后一层在 CPU 做 logits 归一化,避免显存碎片。--verbose-prompt:启动后会打印[INST]等 prompt 模板的 token ID,确认 system prompt 是否被正确注入。
验证是否成功:打开浏览器访问http://127.0.0.1:8000/health,返回{"status":"ok"}即成功。再试一个推理:
curl -X POST "http://127.0.0.1:8000/completion" \ -H "Content-Type: application/json" \ -d '{ "prompt": "What is the capital of France?", "n_predict": 64, "temperature": 0.2 }'若返回"content":"Paris",说明 CUDA 加速已生效。若返回极慢或报错CUDA error: out of memory,立即降低--gpu-layers值重试。
注意:首次加载模型时,
llama-server.exe会将 GGUF 文件解压到显存,耗时 15–25 秒,CMD 窗口无任何输出,这是正常现象。耐心等待,直到出现llama-server: server listening on http://127.0.0.1:8000日志。
3.3 OpenClaw 配置:skill.yaml 的编写逻辑与 Telegram Token 获取
OpenClaw 的灵魂不在代码,而在skill.yaml。它定义了“你能让 AI 做什么”。以网页搜索为例,一个最小可用的search_skill.yaml长这样:
name: web_search description: Search the web and return concise results trigger: - type: command name: /search description: Search the web for a query - type: web path: /search method: POST input: - name: query type: string required: true description: The search query output: - name: result type: string description: The search result summary action: type: http url: "https://api.duckduckgo.com/?q={{query}}&format=json&no_html=1" method: GET response_path: "AbstractText"这里的关键是response_path: "AbstractText"—— DuckDuckGo API 返回 JSON,AbstractText字段是摘要文本。OpenClaw 会自动提取该字段作为输出。你不需要写一行 Python 代码。
Telegram Token 获取流程(务必按顺序):
- 在 Telegram 搜索
@BotFather,发送/newbot - 按提示输入机器人名称(如
MyOpenClawBot),再输用户名(必须以_bot结尾,如myopenclaw_bot) - BotFather 会返回一串 token,形如
1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef,立即复制保存,这是唯一一次可见机会 - 发送
/setprivacy给 BotFather,选择你的机器人,再发Disable—— 否则 Bot 只能收命令,不能收普通消息 - 发送
/setcommands,选择你的机器人,粘贴以下命令(每行一个,用空格分隔):search - Search the web help - Show help message status - Check OpenClaw status
然后在 OpenClaw 的config.yaml中填入:
llm: provider: openai base_url: "http://127.0.0.1:8000/v1" # 指向 llama-server api_key: "sk-no-key-required" # llama.cpp 不需要 key telegram: token: "1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef" polling_interval: 30000 allowed_users: ["123456789"] # 你的 Telegram user_id,获取方式:用浏览器打开 https://api.telegram.org/bot{token}/getUpdates,看 response 中的 "id"实操心得:
allowed_users是安全底线。不加这行,任何人拿到你的 Bot Token 都能发消息给你服务器。getUpdates返回的 JSON 中,"result":[ {"message":{"from":{"id":123456789,...}}}],那个id就是你的 user_id。
3.4 自启动脚本编写:bat 封装的三层防御机制
start_openclaw.bat不是简单的一行命令,而是包含进程守护、健康检查、错误重试的微型运维脚本:
@echo off setlocal enabledelayedexpansion :: 定义路径 set PYTHON_PATH=C:\Users\name\AppData\Local\Programs\Python\Python311\python.exe set OPENCLAW_PATH=C:\openclaw-env\openclaw set LLAMA_PATH=C:\openclaw-env\llama-bin\llama-server.exe set MODEL_PATH=C:\openclaw-env\models\grok-1.5.Q5_K_M.gguf :: 第一层防御:检查 llama-server 是否运行 tasklist /fi "imagename eq llama-server.exe" 2>nul | find /i "llama-server.exe" >nul if "%errorlevel%"=="0" ( echo llama-server already running. ) else ( echo Starting llama-server... start "" "%LLAMA_PATH%" -m "%MODEL_PATH%" -c 4096 --port 8000 --host 127.0.0.1 --gpu-layers 45 --verbose-prompt >nul 2>&1 timeout /t 25 /nobreak >nul ) :: 第二层防御:等待 llama-server 健康就绪 set COUNT=0 :wait_loop set /a COUNT+=1 curl -s -o nul -w "%%{http_code}" http://127.0.0.1:8000/health | findstr "200" >nul if "%errorlevel%"=="0" ( echo llama-server is healthy. goto start_openclaw ) else ( if !COUNT! LSS 10 ( timeout /t 3 /nobreak >nul goto wait_loop ) else ( echo ERROR: llama-server failed to start after 30 seconds. exit /b 1 ) ) :start_openclaw :: 第三层防御:启动 OpenClaw 并重定向日志 echo Starting OpenClaw... cd /d "%OPENCLAW_PATH%" "%PYTHON_PATH%" -m openclaw serve --config config.yaml > openclaw.log 2>&1这个 bat 的精妙之处在于:
start ""启动llama-server.exe为独立进程,不阻塞后续命令;timeout /t 25给模型加载留足时间,避免curl过早发起请求;curl -w "%%{http_code}"获取 HTTP 状态码,比单纯ping更准确;goto和:label实现简单循环,10 次失败后退出,防止无限等待。
将此 bat 保存为C:\openclaw-env\start_openclaw.bat,下一步就交给 Task Scheduler。
4. 实操过程与核心环节实现
4.1 Task Scheduler 创建全流程:从触发条件到权限配置
打开“任务计划程序”(Win+R →taskschd.msc),右键“任务计划程序库” → “创建基本任务…”:
- 名称:
OpenClaw Auto Start - 描述:
Start OpenClaw and Grok services on login - 触发器:选“当用户登录时”,下一步
- 操作:选“启动程序”,浏览到
C:\openclaw-env\start_openclaw.bat - 完成前勾选:“当完成此向导时,打开该任务属性的对话框”
在弹出的属性窗口中,做四步关键配置:
常规选项卡:
- 勾选“使用最高权限运行”(否则无法绑定 8000 端口)
- 勾选“配置为:Windows 10”(兼容性最佳)
- “安全选项”中,点击“更改用户或组”,输入你的用户名(如
DESKTOP-ABC\name),点“检查名称”确认,再点“确定”
触发器选项卡:
- 选中刚创建的触发器,点“编辑”
- 勾选“延迟任务时间:30 秒”(给系统留出初始化时间)
- 勾选“重复任务间隔:5 分钟”,持续时间:“无限期”(这是心跳检测,确保服务意外崩溃后自动重启)
条件选项卡:
- 取消勾选“只有在计算机使用交流电源时才启动此任务”(笔记本用户必选)
- 取消勾选“只有在计算机处于空闲状态时才启动此任务”
- “开始任务”保持默认 “只要满足上述条件即可”
设置选项卡:
- 勾选“如果任务失败,重新启动任务:每 5 分钟,最多 3 次”(核心容错)
- 勾选“如果过了计划开始时间,立即启动任务”
- “如果任务正在运行,以下规则适用”:选“不启动新实例”(防进程堆积)
点“确定”,输入你的 Windows 登录密码(这是必须的,因任务需最高权限)。至此,任务创建完毕。
验证方法:右键该任务 → “运行”,观察
C:\openclaw-env\openclaw.log是否有INFO: Uvicorn running on http://127.0.0.1:8001日志,同时 Telegram 发/status,应返回OpenClaw is running. LLM connected.。
4.2 网页搜索功能实测:从 Skill 编写到前端调用
OpenClaw 默认提供/docsSwagger UI,但网页搜索需自定义前端。我们用最简 HTML 实现:
<!-- save as C:\openclaw-env\search.html --> <!DOCTYPE html> <html> <head><title>OpenClaw Web Search</title></head> <body> <h2>Web Search via OpenClaw</h2> <input type="text" id="query" placeholder="Enter search query..." style="width:400px;padding:8px;"> <button onclick="doSearch()">Search</button> <div id="result" style="margin-top:20px;padding:10px;background:#f0f0f0;"></div> <script> async function doSearch() { const q = document.getElementById('query').value; const res = document.getElementById('result'); res.innerHTML = 'Searching...'; try { const r = await fetch('http://127.0.0.1:8001/search', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({query: q}) }); const data = await r.json(); res.innerHTML = `<strong>Result:</strong> ${data.result || 'No result'}`; } catch(e) { res.innerHTML = `Error: ${e.message}`; } } </script> </body> </html>关键点:
- OpenClaw 默认监听
http://127.0.0.1:8001,不是 8000(那是 llama-server 的端口); fetch直接调用/search,对应skill.yaml中trigger.type: web的path: /search;- 前端无需鉴权,因服务只监听
127.0.0.1,外部无法访问。
双击打开search.html,在输入框输入latest AI news,点 Search,3 秒后显示 DuckDuckGo 摘要。这就是完整的“网页搜索”闭环。
4.3 Telegram 接入深度调试:Polling 日志分析与限流规避
OpenClaw 的 Telegram polling 日志藏在openclaw.log里,关键行如下:
INFO: Telegram polling started. Interval: 30000ms INFO: Got update from user 123456789: /search quantum computing INFO: Executing skill 'web_search' with input {'query': 'quantum computing'} INFO: HTTP action completed. Status: 200, Response: {"AbstractText":"Quantum computing uses quantum mechanics..."} INFO: Sending reply to user 123456789: Quantum computing uses quantum mechanics...若发现 Bot 不响应,第一步查日志是否有Got update。没有,说明 Telegram API 调用失败,常见原因:
allowed_users未配置或 ID 错误;- 你的网络防火墙拦截了
api.telegram.org(临时关闭防火墙测试); polling_interval设太小(<20000),触发 Telegram 限流。
Telegram 官方限流规则:每 30 秒最多 30 次getUpdates请求。polling_interval=30000是安全值,但若你设10000(10 秒),连续 4 次就会被429 Too Many Requests。
规避技巧:在config.yaml中加retry_delay: 60000(重试前等 60 秒),并确保 Task Scheduler 的“失败重试”间隔大于 60 秒,形成双重保护。
4.4 故障自愈机制:Logrotate 与 Crash Recovery
Windows 没有 logrotate,但openclaw.log会无限增长。我们用 PowerShell 脚本实现简易轮转:
新建C:\openclaw-env\rotate_logs.ps1:
$logPath = "C:\openclaw-env\openclaw.log" $backupPath = "C:\openclaw-env\openclaw.log.$(Get-Date -Format 'yyyyMMddHHmmss')" if (Test-Path $logPath) { Rename-Item $logPath $backupPath # 创建新日志文件 New-Item $logPath -ItemType File -Force | Out-Null } # 保留最近 5 个备份 Get-ChildItem "C:\openclaw-env\openclaw.log.*" | Sort-Object LastWriteTime -Descending | Select-Object -Skip 5 | ForEach-Object { Remove-Item $_.FullName }在 Task Scheduler 中再建一个任务,触发器设为“每天凌晨 2:00”,操作为“启动程序” →powershell.exe,参数为-ExecutionPolicy Bypass -File "C:\openclaw-env\rotate_logs.ps1"。
Crash Recovery 更重要:OpenClaw 进程崩溃后,Task Scheduler 的“失败重试”会拉起新进程,但llama-server.exe还在运行,端口被占。因此start_openclaw.bat中必须加端口检查:
:: 在启动 llama-server 前插入 netstat -ano | findstr ":8000" | findstr "LISTENING" >nul if "%errorlevel%"=="0" ( echo Port 8000 is occupied. Killing process... for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8000" ^| findstr "LISTENING"') do taskkill /f /pid %%a >nul 2>&1 )这段代码会杀掉占用 8000 端口的进程(通常是上次崩溃残留的llama-server.exe),确保每次启动干净。
5. 常见问题与排查技巧实录
5.1 典型问题速查表
| 现象 | 可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
llama-server.exe启动后立即退出,CMD 闪退 | VS Build Tools 未安装或 CUDA 路径错误 | where nvcc、vcvarsall.bat是否存在 | 重装 VS Build Tools 2022,确保C:\Program Files\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat存在 |
OpenClaw 启动报ConnectionRefusedError: [WinError 10061] | llama-server未运行或端口不对 | tasklist /fi "imagename eq llama-server.exe"、curl http://127.0.0.1:8000/health | 检查 bat 中端口是否为8000,确认llama-server进程存在 |
Telegram Bot 收不到消息,openclaw.log无Got update | allowed_usersID 错误或 BotFather 未Disableprivacy | curl "https://api.telegram.org/bot{TOKEN}/getUpdates" | 重新获取 user_id,确认 BotFather 设置Disable |
/search返回空结果,日志显示 `HTTP |