在浏览器里体验了一把"AI版贾维斯"—OpenRoom极空间部署教程
AI 到底能不能真正"操作"电脑?
相信很多人和俺一样,用过各种 AI 助手——问答、写作、画图,都能搞定。但总觉得它们还是"漂浮在云端"的工具,离"操作我的电脑"还差十万八千里。
直到俺看到了 OpenRoom——一个把 AI Agent 和浏览器桌面系统结合的开源项目。
它让 AI 真正"长"在了电脑桌面上——能操作应用、能下棋、能播放音乐、还能帮你写代码。这不是概念演示,是真的在操作。

最近看到个很有意思的开源项目:OpenRoom。这是来自MiniMax- AI。它把AI Agent和浏览器桌面系统结合在一起,让我第一次在网页里感受到了"AI操作电脑"的魔力。
项目介绍

简单说,OpenRoom就是一个运行在浏览器里的桌面操作系统。打开网页,你会看到一个macOS风格的桌面,上面摆满了各种应用图标:Music Player、Diary、Chess、Twitter、Email、Album、Gomoku、FreeCell、CyberNews……双击就能打开应用,窗口可以拖拽、缩放,跟真正的桌面系统没什么两样。
但它最厉害的地方不在桌面,而在于——内置的AI助手。
AI真的在"操作"电脑
OpenRoom内置了多个应用:五子棋、音乐播放器、个人日记、email、照片管理、新闻聚合等等。
那它还内置了已经设定好的AI助理:赏金猎人Aoi 。系统给她的设定是:自称"Aoi",一个穿越银河的赏金猎人。开场白就是英文名言:"Well, well...Guess who just slipped into your system? Cozy place you've got here. Mind if I stick around for a bit?"(翻译:猜猜谁溜进了你的系统?这地方还挺舒服的。介意我待一会儿吗?)
那咱们在首次打开这个项目的时候,需要配置下API,既然是MiniMax- AI出品的,那这里就直接使用MiniMAX的API来使用了。
咱们先来看到内置应用的体验上,比如五子棋。只需要在Aoi的窗口直接说:陪我下五子棋吧。

桌面上就会自动弹出Gomoku五子棋的应用窗口,并让我选择黑棋或者白棋先手。下面就能直接开始下五子棋。

另外还有音乐播放器,也只需要说一嘴:帮我打开Music Player,播放一首爵士乐。Aoi就会自动打开音乐播放器,并且开始播放音乐。这个音乐播放器做的还是很完整的,左侧有library和playlists两个标签页,曲库里面有五首歌,还有上一首、播放/暂停等等功能。
嘿嘿,你说这些内置的功能没啥意思,有什么高难度或者更好玩的功能么?
OpenRoom直接开发应用
OpenRoom还有个很有意思的功能,你可以在OpenRoom的上层直接开发应用,等于说OpenRoom的底层就是一个完整的封装系统,支持通过 /vibe 命令使用 AI Agent 自动生成应用。
claude -p "/vibe WeatherApp 天气查询应用的描述" --allowedTools "Read,Write,Edit,Bash(...)"
那这里咱们可以直接使用Claude code直接去开发应用,例如这里让它开发个天气查询应用,就能直接输入上面这段代码。

完成后就能直接在咱们的OpenRoom上使用这个应用啦!
部署过程
OpenRoom官方确实提供了Dockerfile,但官方Dockerfile只包含前端静态文件(nginx),缺少后端API服务,直接使用会导致白屏。 我们参考了官方Dockerfile并做了增强:加入了Express后端服务,完整支持 /api/llm-proxy 等接口,能真正正常工作。
这里使用极空间Z4 Pro+性能版演示。
创建以下脚本:
#!/bin/bash
set -e
echo "=========================================="
echo " OpenRoom 极空间一键部署脚本"
echo " 增强版:前端+后端API服务"
echo "=========================================="
# 第一步:创建目录(极空间路径,记得将目录改成自己的路径)
mkdir -p /data/openroom-source
mkdir -p /data/openroom-deploy/public
mkdir -p /data/openroom/config
# 第二步:克隆源码(如果还没有)
if [ ! -d "/data/openroom-source/.git" ]; then
echo "[1/5] 克隆OpenRoom源码..."
cd /data/openroom-source
git clone https://github.com/MiniMax-AI/OpenRoom.git .
else
echo "[1/5] 源码已存在,跳过克隆..."
cd /data/openroom-source
fi
# 第三步:构建前端
echo "[2/5] 安装pnpm并构建前端(需要5-15分钟)..."
npm install -g pnpm --registry=https://registry.npmmirror.com 2>/dev/null || true
cd /data/openroom-source
pnpm install --registry=https://registry.npmmirror.com
pnpm build
# 第四步:创建服务端文件(增强版:带完整后端API)
echo "[3/5] 创建服务端文件(增强版后端)..."
cp -r /data/openroom-source/apps/webuiapps/dist/* /data/openroom-deploy/public/
cat > /data/openroom-deploy/package.json << 'EOF'
{
"name": "openroom-server",
"version": "1.0.0",
"type": "module",
"main": "server.js",
"dependencies": {
"express": "^4.18.2",
"cors": "^2.8.5",
"body-parser": "^1.20.2",
"node-fetch": "^3.3.2"
}
}
EOF
cat > /data/openroom-deploy/server.js << 'EOF'
import express from 'express';
import cors from 'cors';
import bodyParser from 'body-parser';
import fetch from 'node-fetch';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import fs from 'fs';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const app = express();
const PORT = process.env.PORT || 3000;
const LLM_API_URL = process.env.LLM_API_URL || 'https://www.minimaxi.com/v1/chat/completions';
const LLM_API_KEY = process.env.LLM_API_KEY || '';
const configDir = join(process.env.HOME || '/root', '.openroom');
const configPath = join(configDir, 'config.json');
app.use(cors());
app.use(bodyParser.json({ limit: '50mb' }));
app.use(express.static(join(__dirname, 'public')));
// LLM Proxy API(核心接口)
app.post('/api/llm-proxy', async (req, res) => {
try {
const response = await fetch(LLM_API_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${LLM_API_KEY}`
},
body: JSON.stringify(req.body)
});
const data = await response.json();
res.status(response.status).json(data);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// LLM Config API
app.get('/api/llm-config', (req, res) => {
try {
if (fs.existsSync(configPath)) {
res.json(JSON.parse(fs.readFileSync(configPath, 'utf-8')));
} else {
res.json({});
}
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.post('/api/llm-config', (req, res) => {
try {
if (!fs.existsSync(configDir)) {
fs.mkdirSync(configDir, { recursive: true });
}
fs.writeFileSync(configPath, JSON.stringify(req.body, null, 2));
res.json({ success: true });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Catch-all for SPA
app.get('*', (req, res) => {
const indexPath = join(__dirname, 'public', 'index.html');
if (fs.existsSync(indexPath)) {
res.sendFile(indexPath);
} else {
res.status(404).send('OpenRoom not built yet.');
}
});
app.listen(PORT, '0.0.0.0', () => {
console.log(`OpenRoom server running on port ${PORT}`);
console.log(`LLM API: ${LLM_API_URL}`);
});
EOF
cat > /data/openroom-deploy/Dockerfile << 'EOF'
FROM node:20-alpine
WORKDIR /data/openroom
COPY package.json .
RUN npm install --registry=https://registry.npmmirror.com
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
EOF
# 第五步:构建并启动
echo "[4/5] 构建Docker镜像(需要3-10分钟)..."
cd /data/openroom-deploy
docker build -t openroom:latest .
echo "[5/5] 启动容器..."
docker rm -f openroom 2>/dev/null || true
docker run -d
--name openroom
-p 13050:3000
-v /data/openroom/config:/root/.openroom
-e LLM_API_URL="https://www.minimaxi.com/v1/chat/completions" #记得改成自己断点以及秘钥
-e LLM_API_KEY="你的MiniMax API Key"
--restart=unless-stopped
openroom:latest
echo ""
echo "=========================================="
echo " ✅ 部署完成!"
echo " 访问地址:http://你的极空间IP:13050"
echo " 配置文件:/data/openroom/config/config.json"
echo "=========================================="
echo ""
echo "下一步:编辑配置文件填入API Key"
echo " nano /data/openroom/config/config.json"
echo " 示例配置:"
echo ' {"llm":{"provider":"openai","model":"MiniMax-Text-01","apiKey":"你的Key","baseUrl":"https://www.minimaxi.com/v1"}}'
echo " 然后:docker restart openroom"
运行脚本:
chmod +x deploy_openroom.sh && ./deploy_openroom.sh
创建完成后,使用浏览器打开NAS IP+:13050就能打开openroom webui页面了。

进来后记得修改下openroom的api以及模型服务商。
那么好了,以上就是本篇文章的全部内容
希望对你有所帮助
让我们下篇文章
再见
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

dusttop1
校验提示文案
dusttop1
校验提示文案