-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathsetup-openclaw.sh
More file actions
397 lines (355 loc) · 15.1 KB
/
Copy pathsetup-openclaw.sh
File metadata and controls
397 lines (355 loc) · 15.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
#!/usr/bin/env bash
# setup-openclaw.sh
# AI Girlfriend — 四季夏目 · OpenClaw 一键部署 (Linux / macOS / WSL2)
#
# 自动完成:
# 1. 检测 Node.js → 缺失则安装
# 2. 安装 OpenClaw Gateway (via 官方安装脚本)
# 3. 部署 AI Girlfriend 工作区到 OpenClaw workspace
# 4. 应用 config-patch.json (本地 LLM 上下文窗口配置)
# 5. 启动 OpenClaw Gateway daemon
# 6. 验证安装
#
# 用法:
# bash setup-openclaw.sh
# bash setup-openclaw.sh --workspace /path/to/workspace
# bash setup-openclaw.sh --skip-node --skip-deploy --no-onboard
#
# 前置:
# - 已运行 download-models.sh 下载模型
# - (可选) 已运行 setup-llama.sh 配置 llama.cpp
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WORKSPACE_PATH=""
SKIP_NODE=false
SKIP_DEPLOY=false
NO_ONBOARD=false
SKIP_DAEMON=false
# Parse args
while [[ $# -gt 0 ]]; do
case "$1" in
--workspace) WORKSPACE_PATH="$2"; shift 2 ;;
--skip-node) SKIP_NODE=true; shift ;;
--skip-deploy) SKIP_DEPLOY=true; shift ;;
--no-onboard) NO_ONBOARD=true; shift ;;
--skip-daemon) SKIP_DAEMON=true; shift ;;
-h|--help)
echo "Usage: bash setup-openclaw.sh [options]"
echo ""
echo "Options:"
echo " --workspace PATH Target OpenClaw workspace directory"
echo " --skip-node Skip Node.js installation check"
echo " --skip-deploy Skip workspace file deployment"
echo " --no-onboard Skip OpenClaw onboarding wizard"
echo " --skip-daemon Skip Gateway daemon setup"
exit 0
;;
*) echo "Unknown option: $1"; exit 1 ;;
esac
done
# ============================================================================
# Colors
# ============================================================================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
CYAN='\033[0;36m'
MAGENTA='\033[0;35m'
GRAY='\033[0;90m'
WHITE='\033[0;37m'
NC='\033[0m'
# ============================================================================
# Banner
# ============================================================================
echo ""
echo -e "${MAGENTA}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${MAGENTA}║ AI Girlfriend — 四季夏目 · OpenClaw 一键部署 ║${NC}"
echo -e "${MAGENTA}║ Setup OpenClaw Gateway + Deploy AI Girlfriend Workspace ║${NC}"
echo -e "${MAGENTA}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""
# ============================================================================
# Step 1: Check / Install Node.js
# ============================================================================
if $SKIP_NODE; then
echo -e "${GRAY}[1/5] Skipping Node.js check (--skip-node)${NC}"
else
echo -e "${YELLOW}[1/5] Checking Node.js...${NC}"
NODE_VERSION=""
if command -v node &>/dev/null; then
NODE_VERSION=$(node --version 2>/dev/null || echo "")
fi
NEEDS_NODE=false
if [[ -z "$NODE_VERSION" ]]; then
NEEDS_NODE=true
else
MAJOR=$(echo "$NODE_VERSION" | sed 's/v//' | cut -d. -f1)
if [[ "$MAJOR" -lt 22 ]]; then
echo -e " ${YELLOW}Node $NODE_VERSION found, but needs v22.16+ (v24 recommended)${NC}"
NEEDS_NODE=true
fi
fi
if ! $NEEDS_NODE; then
echo -e " ${GREEN}Node.js $NODE_VERSION — OK${NC}"
else
echo -e " ${YELLOW}Installing Node.js via nvm / fnm...${NC}"
# Detect OS
OS_TYPE="$(uname -s)"
# Try fnm (cross-platform, fast)
if command -v fnm &>/dev/null; then
echo -e " ${GRAY}fnm found, installing Node 24...${NC}"
fnm install 24
fnm use 24
elif command -v nvm &>/dev/null; then
echo -e " ${GRAY}nvm found, installing Node 24...${NC}"
nvm install 24
nvm use 24
else
# Install fnm
echo -e " ${GRAY}Installing fnm (Fast Node Manager)...${NC}"
if [[ "$OS_TYPE" == "Darwin" ]]; then
# macOS
if command -v brew &>/dev/null; then
brew install fnm
else
curl -fsSL https://fnm.vercel.app/install | bash
fi
else
# Linux / WSL2
curl -fsSL https://fnm.vercel.app/install | bash
fi
# Source fnm
export FNM_DIR="${HOME}/.fnm"
if [[ -f "$FNM_DIR/fnm" ]]; then
eval "$(fnm env)"
elif [[ -f "$HOME/.local/share/fnm/fnm" ]]; then
export FNM_DIR="$HOME/.local/share/fnm"
eval "$(fnm env)"
fi
if command -v fnm &>/dev/null; then
fnm install 24
fnm use 24
else
echo -e " ${RED}[ERROR] Cannot install Node.js automatically.${NC}"
echo -e " ${RED}Please install manually: https://nodejs.org/ (v22+ or v24+)${NC}"
echo -e " ${YELLOW}After installing, re-run this script.${NC}"
exit 1
fi
fi
echo -e " ${GREEN}Node.js installed!${NC}"
echo ""
echo -e " ${YELLOW}⚠️ You may need to restart your shell and re-run this script.${NC}"
echo -e " ${YELLOW} Or run: source ~/.bashrc (or ~/.zshrc)${NC}"
# If we can continue in this session
if command -v node &>/dev/null; then
echo -e " ${GREEN}Node.js is available in this session.${NC}"
else
echo -e " ${YELLOW}Please restart your shell, then run: bash setup-openclaw.sh${NC}"
exit 0
fi
fi
fi
# ============================================================================
# Step 2: Install OpenClaw
# ============================================================================
echo -e "${YELLOW}[2/5] Installing OpenClaw...${NC}"
if command -v openclaw &>/dev/null; then
OC_VERSION=$(openclaw version 2>&1 || echo "unknown")
OC_PATH=$(command -v openclaw)
echo -e " ${GREEN}OpenClaw already installed: $OC_VERSION${NC}"
echo -e " ${GRAY}Path: $OC_PATH${NC}"
else
echo -e " ${YELLOW}Downloading and installing OpenClaw...${NC}"
echo -e " ${GRAY}Using official install script: https://openclaw.ai/install.sh${NC}"
if $NO_ONBOARD; then
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --no-onboard
else
curl -fsSL https://openclaw.ai/install.sh | bash
fi
# Verify
if command -v openclaw &>/dev/null; then
OC_VERSION=$(openclaw version 2>&1 || true)
echo -e " ${GREEN}OpenClaw installed successfully!${NC}"
echo -e " ${GRAY}Version: $OC_VERSION${NC}"
else
echo -e " ${RED}[ERROR] openclaw CLI not found after install.${NC}"
echo -e " ${YELLOW}Try restarting your terminal and running: openclaw version${NC}"
echo -e " ${YELLOW}If still not found, add npm global bin to PATH:${NC}"
echo -e " ${WHITE} export PATH=\"\$(npm prefix -g)/bin:\$PATH\"${NC}"
exit 1
fi
fi
# ============================================================================
# Step 3: Deploy AI Girlfriend Workspace
# ============================================================================
if $SKIP_DEPLOY; then
echo -e "${GRAY}[3/5] Skipping workspace deployment (--skip-deploy)${NC}"
else
echo -e "${YELLOW}[3/5] Deploying AI Girlfriend workspace...${NC}"
# Determine OpenClaw workspace directory
if [[ -z "$WORKSPACE_PATH" ]]; then
WORKSPACE_PATH="$HOME/.openclaw/workspace"
fi
WORKSPACE_PATH="$(cd "$WORKSPACE_PATH" 2>/dev/null && pwd || echo "$WORKSPACE_PATH")"
echo -e " ${GRAY}Target workspace: $WORKSPACE_PATH${NC}"
# Create workspace directory if needed
mkdir -p "$WORKSPACE_PATH"
# Copy workspace files (non-destructive — won't overwrite existing user-modified files)
deploy_files=(
"AGENTS.md"
"SOUL.md"
"IDENTITY.md"
"USER.md"
"HEARTBEAT.md"
"TOOLS.md"
"config-patch.json"
"config.yaml"
"models.yaml"
".gitignore"
)
echo -e " ${GRAY}Copying workspace config files...${NC}"
for file in "${deploy_files[@]}"; do
src="$SCRIPT_DIR/$file"
dst="$WORKSPACE_PATH/$file"
if [[ -f "$src" ]]; then
if [[ -f "$dst" ]]; then
echo -e " ${GRAY}⏭ $file (already exists, skipped)${NC}"
else
cp "$src" "$dst"
echo -e " ${GREEN}✓ $file${NC}"
fi
else
echo -e " ${YELLOW}✗ $file (source not found)${NC}"
fi
done
# Copy skill directories
skill_dirs=("skills")
echo -e " ${GRAY}Copying skill directories...${NC}"
for dir in "${skill_dirs[@]}"; do
src="$SCRIPT_DIR/$dir"
dst="$WORKSPACE_PATH/$dir"
if [[ -d "$src" ]]; then
mkdir -p "$dst"
cp -r "$src/"* "$dst/" 2>/dev/null || true
echo -e " ${GREEN}✓ $dir/${NC}"
else
echo -e " ${YELLOW}✗ $dir/ (source not found)${NC}"
fi
done
# Create runtime directories
runtime_dirs=(
"$WORKSPACE_PATH/memory"
"$WORKSPACE_PATH/memory/role_play"
"$WORKSPACE_PATH/media/qqbot/audio"
"$WORKSPACE_PATH/media/qqbot/images"
)
echo -e " ${GRAY}Creating runtime directories...${NC}"
for dir in "${runtime_dirs[@]}"; do
if [[ ! -d "$dir" ]]; then
mkdir -p "$dir"
echo -e " ${GREEN}✓ $dir${NC}"
fi
done
echo -e " ${GREEN}Workspace deployed to: $WORKSPACE_PATH${NC}"
echo ""
echo -e " ${YELLOW}⚠️ IMPORTANT — Paths to check in config.yaml:${NC}"
echo -e " ${WHITE} $WORKSPACE_PATH/config.yaml${NC}"
echo -e " ${YELLOW} Configure llama_model_path, comfyui_root, gpt_sovits_dir etc.${NC}"
echo ""
echo -e " ${YELLOW}⚠️ CUDA Compatibility:${NC}"
echo -e " ${WHITE} If you have RTX 50xx GPU + CUDA 13.x:${NC}"
echo -e " ${WHITE} → Use pre-built CUDA 12.4 llama.cpp binary (not self-compiled with 13.x)${NC}"
echo -e " ${WHITE} → See https://github.com/ggml-org/llama.cpp/releases${NC}"
fi
# ============================================================================
# Step 4: Apply Config Patch
# ============================================================================
echo -e "${YELLOW}[4/5] Applying configuration...${NC}"
# Check if Gateway is running
GATEWAY_RUNNING=false
if openclaw gateway status &>/dev/null; then
GATEWAY_RUNNING=true
echo -e " ${GREEN}Gateway is running.${NC}"
else
echo -e " ${YELLOW}Gateway is not running.${NC}"
fi
if $GATEWAY_RUNNING; then
# Apply config patch via gateway
patch_file="$WORKSPACE_PATH/config-patch.json"
if [[ -f "$patch_file" ]]; then
echo -e " ${GRAY}Applying config-patch.json...${NC}"
if openclaw gateway config.patch.apply --file "$patch_file" &>/dev/null; then
echo -e " ${GREEN}Config patch applied.${NC}"
else
echo -e " ${YELLOW}⚠️ Could not auto-apply patch. Manual command:${NC}"
echo -e " ${WHITE} openclaw gateway config.patch.apply${NC}"
fi
else
echo -e " ${YELLOW}config-patch.json not found at $patch_file${NC}"
fi
else
echo ""
echo -e " ${YELLOW}⚠️ Gateway not running. After starting the Gateway, apply the config patch:${NC}"
echo -e " ${WHITE} 1. Start Gateway: openclaw gateway start${NC}"
echo -e " ${WHITE} 2. Apply patch: openclaw gateway config.patch.apply${NC}"
fi
# ============================================================================
# Step 5: Install Gateway Daemon & Start
# ============================================================================
echo -e "${YELLOW}[5/5] Configuring Gateway daemon...${NC}"
if ! $SKIP_DAEMON; then
# Install daemon (systemd on Linux, launchd on macOS)
echo -e " ${GRAY}Installing Gateway daemon (auto-start on login)...${NC}"
if openclaw gateway install &>/dev/null; then
echo -e " ${GREEN}Gateway daemon installed.${NC}"
else
echo -e " ${YELLOW}⚠️ Could not install daemon automatically.${NC}"
echo -e " ${WHITE} Manual: openclaw gateway install${NC}"
fi
# Start Gateway
echo -e " ${GRAY}Starting Gateway...${NC}"
if openclaw gateway start &>/dev/null; then
echo -e " ${GREEN}Gateway started!${NC}"
else
echo -e " ${YELLOW}⚠️ Could not start Gateway.${NC}"
echo -e " ${WHITE} Manual: openclaw gateway start${NC}"
fi
else
echo -e " ${GRAY}Skipping daemon setup (--skip-daemon)${NC}"
fi
# ============================================================================
# Verification
# ============================================================================
echo ""
echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ ✅ OpenClaw + AI Girlfriend Setup Complete! ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e " ${CYAN}Verification commands:${NC}"
echo -e " ${WHITE} openclaw version # Check CLI${NC}"
echo -e " ${WHITE} openclaw doctor # Check configuration${NC}"
echo -e " ${WHITE} openclaw gateway status # Check Gateway status${NC}"
echo ""
echo -e " ${CYAN}Workspace: $WORKSPACE_PATH${NC}"
echo ""
# Final checklist
echo -e " ${YELLOW}📋 Post-setup Checklist:${NC}"
echo -e " ${WHITE} ☐ 1. Update paths in skills/tts/tts_call.py${NC}"
echo -e " ${WHITE} ☐ 2. Update paths in skills/comfyui/comfyui_call.py${NC}"
echo -e " ${WHITE} ☐ 3. Verify llama-server is running: http://127.0.0.1:8080/health${NC}"
echo -e " ${WHITE} ☐ 4. Apply config-patch.json: openclaw gateway config.patch.apply${NC}"
echo -e " ${WHITE} ☐ 5. Configure QQ Bot channel (see README.md)${NC}"
echo -e " ${WHITE} ☐ 6. Test: send a message through your QQ Bot${NC}"
echo ""
# Print next steps
echo -e " ${CYAN}🚀 Quick Start:${NC}"
echo -e " ${GRAY} # Start llama-server (in a separate terminal)${NC}"
echo -e " ${WHITE} bash llama-config/launch-llama.sh${NC}"
echo ""
echo -e " ${GRAY} # Check everything is running${NC}"
echo -e " ${WHITE} openclaw gateway status${NC}"
echo -e " ${WHITE} curl http://127.0.0.1:8080/health${NC}"
echo ""
echo -e " ${GRAY}文档: https://docs.openclaw.ai/zh-CN${NC}"
echo -e " ${GRAY}项目: https://github.com/momori777/openclaw_based_ai_girlfriend${NC}"
echo -e " ${GRAY}模型: https://hf-mirror.com/TAOTAO777/ai-girlfriend-natsume${NC}"
echo ""