本系列其他文章:我在 Win3.1 到 Win11 上跑 AI:7 个版本迭代
背景
我手上有一台 2013 年的台式机,系统 Windows 7 SP1,主要用于跑一些轻量服务。最近想在上面部署 Kimi 的免费 API,用于接入自研的 Agent 项目。
结果踩了 5 个小时的坑。这篇文章完整记录过程,希望能帮到同样在 Win7 上挣扎的人。
最终效果:
- 本地
http://localhost:8000/v1/chat/completions→ 200 - 公网
https://api.xxx.com/v1/chat/completions→ 200 - 开机自启、无窗口、token 自动刷新
- 零成本
第一关:Node.js 的 libuv 崩溃
现象
部署 Kimi-Free-API,npm install 装依赖时报:
arduino
Error: Cannot find module 'fs-extra'
装好依赖后启动,又崩在:
bash
SystemError [ERR_SYSTEM_ERROR]: A system error occurred:
uv_os_gethostname returned ENOSYS (function not implemented)
at node_modules/formidable/src/Formidable.js:17:25
原因
formidable 包在加载时调用了 os.hostname(),底层走 Node.js 的 libuv → Windows API GetHostNameW。
Win7 的 ws2_32.dll 没有 GetHostNameW 函数 (Vista 之前没有,Win8 之后才普及)。libuv 直接抛 ENOSYS。
解法:猴子补丁
在项目根目录创建 patch.js:
js
const os = require('os');
os.hostname = function () { return 'localhost'; };
启动时用 --require 注入:
cmd
node --require ./patch.js dist/index.js
这样 os.hostname() 被短路,formidable 不再崩溃。
第二关:esbuild 的原生编译失败
现象
装依赖时装到 esbuild 时崩溃:
php
Exception 0xc0000005 0x8 0x0 0x0
runtime.asmstdcall(...)
0xc0000005 是 Windows 的"访问违规"错误,通常在程序访问了未映射内存时出现。
原因
esbuild 从 0.14 开始用 Go 重写核心,Go 编译器生成的代码在新版本里依赖一些 Win8+ 的 API。
解法:跳过 scripts
cmd
npm install --ignore-scripts
关键认知 :esbuild 只是编译工具 (把 TS 编译成 JS)。Kimi-Free-API 的 dist/ 目录已经有编译好的 JS 产物,运行时根本不需要 esbuild。
跳过 postinstall 脚本完全不影响运行。
附带问题:mime 包的 ESM 冲突
装完后启动报:
css
Error [ERR_REQUIRE_ESM]: require() of ES Module
node_modules/mime/dist/src/index.js not supported
mime 从 v4 开始是纯 ESM 模块,而 dist/index.js 是 CommonJS 编译产物。降级到 v3.0.0:
cmd
npm install mime@3.0.0 --ignore-scripts
第三关:cloudflared 在 Win7 上崩溃
现象
用 cloudflared 暴露本地服务,启动就崩:
ini
Exception 0xc0000005 0x8 0x0 0x0
PC=0x0
internal/runtime/syscall/windows.asmstdcall(...)
和 esbuild 一模一样的错误。同一个根因:新版 Go 编译器生成的程序调用了 Win8+ 的 API。
解法:用 GoWin7Fixer 打补丁
golangwin7patch 是一个专门给 Go 编译的 Win 程序做兼容性补丁的工具。
下载 GoWin7Fixer.exe,双击打开,拖入 cloudflared.exe,它会自动:
- 扫描二进制里的 Win8+ API 调用
- 替换成 Win7 兼容的等价实现
- 保存备份
.bak
打完补丁后:
cmd
cloudflared --version
:: cloudflared version 2026.10.0
正常了。
番外:尝试降级 Chat2API 的 Electron
既然 Kimi-Free-API 能跑,我又想试试更现代的 Chat2API(带仪表盘、多 provider 支持)。
思路
Chat2API 用 Electron 33 打包,直接在 Win7 上跑会报:
makefile
D:\Chat2API.exe 不是有效的 Win32 应用程序。
Electron 从 23 开始就不再支持 Win7。所以思路是:把 Electron 从 33 降到 22.3.27,重新打包。
操作
修改 package.json:
diff
- "electron": "^33.0.2",
- "electron-builder": "^25.1.8",
- "electron-vite": "^2.3.0",
- "electron-updater": "^6.3.9",
- "electron-store": "^10.0.0",
+ "electron": "22.3.27",
+ "electron-builder": "22.14.13",
+ "electron-vite": "1.0.28",
+ "electron-updater": "5.3.0",
+ "electron-store": "8.2.0",
然后:
cmd
npm install --ignore-scripts
:: 手动补 electron 二进制
node node_modules/electron/install.js
:: 打包
npm run build:win
结果
打包成功,界面也起来了(Dashboard 完整加载)。
但所有 API 请求都返回 500:
bash
POST /v1/chat/completions → 500 Internal Server Error
日志里没有任何堆栈,异常被内部吞掉。尝试了 4 个模型名、重启代理、看 DevTools Console,全部无效。
结论 :降级 Electron 能过编译和启动阶段,但运行时某些依赖(electron-store / electron-updater / Node 版本相关的 API)在 Electron 22 下不存在,抛错被 catch 吞了。
这种问题改不完,第 5 个 catch 之后项目就升级了。放弃,回到 Kimi-Free-API。
效果验证
本地
cmd
curl -X POST http://localhost:8000/v1/chat/completions ^
-H "Authorization: Bearer <your_refresh_token>" ^
-H "Content-Type: application/json" ^
-d "{\"model\":\"kimi-k2-0905-preview\",\"messages\":[{\"role\":\"user\",\"content\":\"hi\"}]}"
返回:
json
{
"choices": [{
"message": {
"content": "Hi there! I'm Kimi, your AI assistant..."
}
}]
}
公网
通过 Cloudflare Named Tunnel 暴露:
bash
https://api.xxx.com/v1/models → 200
https://api.xxx.com/v1/chat/completions → 200
从 4G 网络的手机访问也能通。
开机自启
三样东西都丢进 shell:startup:
kimi-free-api.lnk→ 启动 Kimi-Free-API(无窗口)cloudflared-tunnel.vbs→ 启动 Cloudflare Tunnel(无窗口)- (可选)任何用到 API 的客户端
开机后全自动,屏幕干净。
总结
Win7 的老电脑跑通现代 AI API,关键是认识这三个根因:
| 问题 | 根因 | 解法 |
|---|---|---|
| libuv ENOSYS | Win7 缺 GetHostNameW |
patch.js 覆盖 os.hostname |
| Go 程序崩溃 | 新版 Go 调用 Win8+ API | GoWin7Fixer 打补丁 |
| ESM/CJS 冲突 | 新包默认 ESM | 降级到 CJS 版本 |
三个补丁,让一台 2013 年的台式机,变成了跑 AI 服务的服务器。
完整部署脚本:github.com/doujiaozh/w...
免责声明:本文涉及的逆向 API 仅供个人研究学习,请勿商用或对外提供服务。Kimi 官方 API 更稳定,建议生产环境使用官方版本。