diff --git a/.gitignore b/.gitignore index b7bddd6..a5261ab 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ u-claw-app/resources/runtime/ # ── Bootable USB build artifacts (scripts are tracked, downloads are not) ── bootable/.download-cache/ + +# ── Install module cache ── +install/.download-cache/ diff --git a/CLAUDE.md b/CLAUDE.md index 0303911..bb51e3e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -16,10 +16,11 @@ U 盘 = 插上就能用 The repo is NOT a "build tool" or "generator" — it IS the USB structure. `setup.sh` only fills in large deps that can't go in git. After `setup.sh`, the `portable/` folder is directly copyable to a USB drive. -Three distribution forms: +Four distribution forms: 1. **Portable USB** (`portable/`): Run from USB on existing Mac/Windows, zero install. 2. **Electron desktop app** (`u-claw-app/`): Install-to-computer version, packaged as DMG/EXE. 3. **Bootable Linux USB** (`bootable/`): Ventoy + Ubuntu 24.04 — boots any x86_64 PC from USB, no OS needed. +4. **One-line install** (`install/`): `curl | bash` or `irm | iex` — download and install from network, no USB needed. ## Development Commands @@ -68,8 +69,14 @@ bootable/ Linux 可启动 U 盘模块(完全独立,不依赖其他 linux-setup/ — setup-openclaw.sh 安装到 /opt/u-claw/ 独立仓库镜像: github.com/dongsheng123132/u-claw-linux +install/ 一键在线安装模块(curl | bash / irm | iex) + install.sh (Mac/Linux) + install.ps1 (Windows) + 7 步流程: 系统检测 → Node.js → OpenClaw → QQ插件 → 技能 → 模型配置 → 启动脚本 + 安装到 ~/.uclaw/,与 Mac-Install.command 结果相同 + website/ Static HTML deployed to u-claw.org via Vercel vercel.json sets outputDirectory: "website" + install.sh / install.ps1 — 复制自 install/,供 curl 下载 ``` Both portable and desktop versions auto-find a free port in range 18789–18799 and start the OpenClaw gateway. On first run, they detect whether a model is configured — if not, they open Config.html; otherwise, they open the dashboard. diff --git a/README.md b/README.md index 585c057..14dc937 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,22 @@ > 📖 **[完整教程](https://u-claw.org/tutorial.html)** — 从零开始的手工安装指南、模型配置、聊天平台接入,小白也能看懂。 +### 一键安装(推荐) + +不需要 U 盘,一行命令直接装到电脑: + +```bash +# Mac / Linux +curl -fsSL https://u-claw.org/install.sh | bash + +# Windows (PowerShell 管理员) +irm https://u-claw.org/install.ps1 | iex +``` + +自动完成: Node.js 下载 → OpenClaw 安装 → 10 个中国技能 → 模型配置 → 启动脚本生成。全程国内镜像,无需翻墙。 + +详见 [`install/README.md`](install/README.md)。 + ### 快速开始:制作便携版 U 盘 ```bash @@ -194,6 +210,22 @@ The codebase itself is the USB file skeleton. Run `setup.sh` to download large d > 📖 **[Full Tutorial](https://u-claw.org/tutorial.html)** — Step-by-step manual installation, model setup, chat platform integration. +### One-Line Install (Recommended) + +No USB needed — install directly to your computer: + +```bash +# Mac / Linux +curl -fsSL https://u-claw.org/install.sh | bash + +# Windows (PowerShell as Admin) +irm https://u-claw.org/install.ps1 | iex +``` + +Automatically downloads Node.js, installs OpenClaw, configures 10 Chinese-optimized skills, and sets up your AI model. All downloads use China mirrors. + +See [`install/README.md`](install/README.md) for details. + ### Quick Start: Build a Portable USB ```bash diff --git a/install/README.md b/install/README.md new file mode 100644 index 0000000..f331a33 --- /dev/null +++ b/install/README.md @@ -0,0 +1,119 @@ +# U-Claw 一键安装 / One-Line Install + +> 一行命令安装 OpenClaw + 技能包 + 模型配置 +> One command to install OpenClaw + skills + model config + +## 安装 / Install + +### Mac / Linux + +```bash +curl -fsSL https://u-claw.org/install.sh | bash +``` + +### Windows (PowerShell 管理员) + +```powershell +irm https://u-claw.org/install.ps1 | iex +``` + +### 本地运行 + +```bash +# Mac/Linux +bash install/install.sh + +# Windows +powershell -ExecutionPolicy Bypass -File install\install.ps1 +``` + +## 安装流程 (7 步) + +| 步骤 | 内容 | 说明 | +|------|------|------| +| 1 | Banner + 系统检测 | 自动识别 OS/Arch | +| 2 | Node.js v22 | 安装到 `~/.uclaw/runtime/`,系统有 v20+ 则复用 | +| 3 | OpenClaw | npm 安装到 `~/.uclaw/core/` | +| 4 | QQ 插件 | 非致命,失败不影响主功能 | +| 5 | 10 个中国技能 | 小红书、B站、微博等内容创作技能 | +| 6 | 模型配置 | 中文交互菜单,默认 DeepSeek | +| 7 | 启动脚本 + 验证 | 生成 start.command / start.bat | + +## 支持的 AI 模型 + +### 国内(无需翻墙) + +| 编号 | 模型 | 说明 | +|------|------|------| +| 1 | DeepSeek | ⭐ 推荐,性价比最高 | +| 2 | Kimi/月之暗面 | 长文档 | +| 3 | 通义千问 | 有免费额度 | +| 4 | 智谱GLM | 学术场景 | +| 5 | MiniMax | 多模态 | +| 6 | 豆包 | 火山引擎 | +| 7 | 硅基流动 | 聚合多模型 | + +### 海外 + +| 编号 | 模型 | +|------|------| +| 8 | Claude | +| 9 | GPT | + +### 本地 + +| 编号 | 模型 | +|------|------| +| 10 | Ollama | + +## 安装目录结构 + +``` +~/.uclaw/ +├── runtime/node-{platform}/ # Node.js v22 +├── core/ # OpenClaw + QQ 插件 +│ ├── package.json +│ └── node_modules/ +│ └── openclaw/skills/ ← 技能在这里 +├── data/ +│ ├── .openclaw/openclaw.json ← 模型配置 +│ ├── memory/ ← AI 记忆 +│ └── backups/ ← 备份 +├── start.command (Mac) ← 启动脚本 +└── start.bat (Windows) ← 启动脚本 +``` + +## 技术细节 + +- **Node.js**: 只装到 `~/.uclaw/runtime/`,不动系统 Node;系统已有 v20+ 则复用 +- **镜像**: 全走 `npmmirror.com`(Node 二进制 + npm 包),国内无需翻墙 +- **Windows 编码**: `chcp 65001` + UTF8 输出确保中文显示 +- **管道模式**: `curl | bash` 时自动跳过交互,使用默认配置 +- **卸载**: `rm -rf ~/.uclaw` (Mac/Linux) 或删除 `%USERPROFILE%\.uclaw` (Windows) + +## 包含技能 + +| 技能 | 用途 | +|------|------| +| xiaohongshu-writer | 小红书笔记写作 | +| bilibili-helper | B站视频优化 | +| weibo-poster | 微博内容创作 | +| wechat-article | 微信公众号文章 | +| zhihu-writer | 知乎回答/文章 | +| douyin-script | 抖音短视频脚本 | +| china-search | 国内搜索引擎 | +| china-translate | 中英互译 | +| china-weather | 天气查询 | +| deepseek-helper | DeepSeek API 助手 | + +## 与其他分发形式的关系 + +``` +install/ ← 一键在线安装(本模块) +portable/ ← U 盘便携版 +u-claw-app/ ← Electron 桌面版 +bootable/ ← Linux 可启动 U 盘 +``` + +install/ 安装的结果与 portable/ 的 Mac-Install.command 相同, +区别是不需要 U 盘,直接从网络下载所有组件。 diff --git a/install/install.ps1 b/install/install.ps1 new file mode 100644 index 0000000..a174e02 --- /dev/null +++ b/install/install.ps1 @@ -0,0 +1,628 @@ +# ============================================================ +# U-Claw 一键安装脚本 (Windows PowerShell) +# 用法: irm https://u-claw.org/install.ps1 | iex +# 或: powershell -ExecutionPolicy Bypass -File install.ps1 +# ============================================================ + +# 编码 + 执行策略 +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 +$OutputEncoding = [System.Text.Encoding]::UTF8 +try { chcp 65001 | Out-Null } catch {} +Set-ExecutionPolicy Bypass -Scope Process -Force -ErrorAction SilentlyContinue + +$ErrorActionPreference = "Stop" + +# ---- 常量 ---- +$UCLAW_DIR = "$env:USERPROFILE\.uclaw" +$RUNTIME_DIR = "$UCLAW_DIR\runtime" +$CORE_DIR = "$UCLAW_DIR\core" +$DATA_DIR = "$UCLAW_DIR\data" +$CONFIG_PATH = "$DATA_DIR\.openclaw\openclaw.json" +$NODE_VERSION = "v22.14.0" +$MIRROR = "https://registry.npmmirror.com" +$NODE_MIRROR = "https://npmmirror.com/mirrors/node" + +# ---- 颜色函数 ---- +function Write-Green($msg) { Write-Host $msg -ForegroundColor Green } +function Write-Cyan($msg) { Write-Host $msg -ForegroundColor Cyan } +function Write-Yellow($msg) { Write-Host $msg -ForegroundColor Yellow } +function Write-Red($msg) { Write-Host $msg -ForegroundColor Red } + +# ============================================================ +# Step 1: Banner + 系统检测 +# ============================================================ +Clear-Host +Write-Host "" +Write-Cyan " ╔══════════════════════════════════════════╗" +Write-Cyan " ║ 🦞 U-Claw 一键安装 (Windows) ║" +Write-Cyan " ║ 让 AI 助手一行命令装好 ║" +Write-Cyan " ╚══════════════════════════════════════════╝" +Write-Host "" + +# 系统检测 +$ARCH = $env:PROCESSOR_ARCHITECTURE +if ($ARCH -eq "AMD64" -or $ARCH -eq "x86_64") { + $PLATFORM = "win-x64" + Write-Green " 系统: Windows x64 ✓" +} elseif ($ARCH -eq "ARM64") { + $PLATFORM = "win-arm64" + Write-Green " 系统: Windows ARM64 ✓" +} else { + Write-Red " 不支持的架构: $ARCH" + exit 1 +} + +Write-Host " 安装目录: $UCLAW_DIR" -ForegroundColor Cyan +Write-Host "" + +# 检查已有安装 +if (Test-Path "$CORE_DIR\node_modules\openclaw") { + Write-Yellow " 检测到已有安装: $UCLAW_DIR" + $overwrite = Read-Host " 覆盖安装?(y/n) [y]" + if ($overwrite -eq "n" -or $overwrite -eq "N") { + Write-Host " 已取消" -ForegroundColor DarkGray + exit 0 + } + Write-Host "" +} + +# 创建目录 +New-Item -ItemType Directory -Force -Path $RUNTIME_DIR | Out-Null +New-Item -ItemType Directory -Force -Path $CORE_DIR | Out-Null +New-Item -ItemType Directory -Force -Path "$DATA_DIR\.openclaw" | Out-Null +New-Item -ItemType Directory -Force -Path "$DATA_DIR\memory" | Out-Null +New-Item -ItemType Directory -Force -Path "$DATA_DIR\backups" | Out-Null + +# ============================================================ +# Step 2: Node.js v22 安装 +# ============================================================ +Write-Host " [1/7] 安装 Node.js $NODE_VERSION ..." -ForegroundColor White + +$NODE_INSTALL_DIR = "$RUNTIME_DIR\node-$PLATFORM" +$INSTALL_NODE = "" +$INSTALL_NPM = "" +$USE_SYSTEM_NODE = $false + +# 检查系统 Node.js +$sysNode = Get-Command node -ErrorAction SilentlyContinue +if ($sysNode) { + $sysVer = & node --version 2>$null + $major = [int]($sysVer -replace 'v','').Split('.')[0] + if ($major -ge 20) { + Write-Green " ✓ 系统已有 Node.js $sysVer,复用" + $INSTALL_NODE = "node" + $INSTALL_NPM = "npm" + $USE_SYSTEM_NODE = $true + } +} + +if (-not $USE_SYSTEM_NODE) { + if (Test-Path "$NODE_INSTALL_DIR\node.exe") { + Write-Green " ✓ Node.js 已存在,跳过下载" + $INSTALL_NODE = "$NODE_INSTALL_DIR\node.exe" + $INSTALL_NPM = "$NODE_INSTALL_DIR\npm.cmd" + } else { + Write-Cyan " ↓ 从国内镜像下载 Node.js $NODE_VERSION ($PLATFORM)..." + $zipName = "node-$NODE_VERSION-$PLATFORM.zip" + $url = "$NODE_MIRROR/$NODE_VERSION/$zipName" + $tempZip = "$env:TEMP\$zipName" + $tempExtract = "$env:TEMP\node-extract-uclaw" + + # 下载 + Write-Host " $url" + try { + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + $ProgressPreference = 'SilentlyContinue' + Invoke-WebRequest -Uri $url -OutFile $tempZip -UseBasicParsing + } catch { + # 尝试 curl + try { + & curl.exe -# -L $url -o $tempZip + } catch { + Write-Red " ✗ 下载失败!请检查网络连接" + exit 1 + } + } + + # 解压 + Write-Host " 解压中..." + if (Test-Path $tempExtract) { Remove-Item -Recurse -Force $tempExtract } + Expand-Archive -Path $tempZip -DestinationPath $tempExtract -Force + $extractedDir = Get-ChildItem $tempExtract | Select-Object -First 1 + New-Item -ItemType Directory -Force -Path $NODE_INSTALL_DIR | Out-Null + Copy-Item -Recurse -Force "$($extractedDir.FullName)\*" $NODE_INSTALL_DIR + + # 清理 + Remove-Item -Force $tempZip -ErrorAction SilentlyContinue + Remove-Item -Recurse -Force $tempExtract -ErrorAction SilentlyContinue + + if (Test-Path "$NODE_INSTALL_DIR\node.exe") { + Write-Green " ✓ Node.js 安装完成" + $INSTALL_NODE = "$NODE_INSTALL_DIR\node.exe" + $INSTALL_NPM = "$NODE_INSTALL_DIR\npm.cmd" + } else { + Write-Red " ✗ Node.js 下载失败" + exit 1 + } + } +} + +Write-Host "" + +# ============================================================ +# Step 3: OpenClaw 安装 +# ============================================================ +Write-Host " [2/7] 安装 OpenClaw ..." -ForegroundColor White + +if (Test-Path "$CORE_DIR\node_modules\openclaw") { + Write-Green " ✓ OpenClaw 已安装,跳过" +} else { + if (-not (Test-Path "$CORE_DIR\package.json")) { + @' +{ + "name": "u-claw-core", + "version": "1.0.0", + "private": true, + "dependencies": { + "openclaw": "latest" + } +} +'@ | Out-File -Encoding utf8 "$CORE_DIR\package.json" + } + + Write-Cyan " ↓ 从国内镜像安装..." + Push-Location $CORE_DIR + & $INSTALL_NODE $INSTALL_NPM install --registry=$MIRROR 2>&1 | Select-Object -Last 5 + Pop-Location + Write-Green " ✓ OpenClaw 安装完成" +} + +Write-Host "" + +# ============================================================ +# Step 4: QQ 插件 +# ============================================================ +Write-Host " [3/7] 安装 QQ 插件 ..." -ForegroundColor White + +if (Test-Path "$CORE_DIR\node_modules\@sliverp\qqbot") { + Write-Green " ✓ QQ 插件已安装,跳过" +} else { + Write-Cyan " ↓ 安装 QQ 插件..." + try { + Push-Location $CORE_DIR + & $INSTALL_NODE $INSTALL_NPM install "@sliverp/qqbot@latest" --registry=$MIRROR 2>&1 | Out-Null + Pop-Location + Write-Green " ✓ QQ 插件安装完成" + } catch { + Write-Yellow " ⚠ QQ 插件安装失败(不影响主功能)" + } +} + +Write-Host "" + +# ============================================================ +# Step 5: 写入 10 个中国技能 +# ============================================================ +Write-Host " [4/7] 安装中国本地化技能 (10个) ..." -ForegroundColor White + +$SKILLS_TARGET = "$CORE_DIR\node_modules\openclaw\skills" +if (-not (Test-Path $SKILLS_TARGET)) { New-Item -ItemType Directory -Force -Path $SKILLS_TARGET | Out-Null } + +$skillCount = 0 + +$skills = @{ + "bilibili-helper" = @' +--- +name: bilibili-helper +description: "B站内容助手 - 视频标题描述优化、标签策略、封面设计建议、分区选择、评论互动" +metadata: { "openclaw": { "emoji": "📺" } } +--- + +# B站内容助手 + +帮助 UP 主优化视频标题、描述、标签和封面,提升视频在 B 站的推荐和互动表现。 + +## 标题公式 + +1. **疑问式**: "为什么XX?看完你就懂了" +2. **教程式**: "XX教程|从零开始手把手教学" +3. **测评式**: "花了XX元买了XX,值不值?" +4. **挑战式**: "挑战XX天只用XX" +5. **盘点式**: "XX年度十大XX盘点" + +## 分区选择指南 + +| 内容类型 | 推荐分区 | +|---------|---------| +| 编程教程 | 科技 → 计算机技术 | +| 日常 vlog | 生活 → 日常 | +| 游戏实况 | 游戏 → 单机/网游 | +| 知识科普 | 知识 → 社科人文/科学科普 | +| AI/数码 | 科技 → 软件应用 | +'@ + + "china-search" = @' +--- +name: china-search +description: "国内搜索引擎 - 百度、搜狗、Bing中国搜索,绕过GFW限制" +metadata: { "openclaw": { "emoji": "🔍" } } +--- + +# 国内搜索引擎助手 + +通过 curl 调用百度、搜狗、Bing 中国等国内搜索引擎获取信息。 + +## 搜索命令 + +```bash +curl -s -L "https://www.baidu.com/s?wd=关键词" -H "User-Agent: Mozilla/5.0" +curl -s -L "https://weixin.sogou.com/weixin?query=关键词" -H "User-Agent: Mozilla/5.0" +curl -s -L "https://cn.bing.com/search?q=关键词" -H "User-Agent: Mozilla/5.0" +``` +'@ + + "china-translate" = @' +--- +name: china-translate +description: "中英互译 + 本地化 - 技术翻译、UI本地化、文化适配、避免机翻腔" +metadata: { "openclaw": { "emoji": "🌐" } } +--- + +# 中英互译 + 本地化助手 + +专业的中英双向翻译工具,专注技术文档翻译、产品本地化和文化适配。 + +## 常见术语对照 + +| English | 中文 | +|---------|------| +| Deploy | 部署 | +| Repository | 仓库 | +| Container | 容器 | +| Middleware | 中间件 | +| Render | 渲染 | +| Token | Token / 令牌 | +| Prompt | 提示词 | +| Fine-tune | 微调 | +'@ + + "china-weather" = @' +--- +name: china-weather +description: "中国城市天气查询 - 支持中文城市名、wttr.in接口" +metadata: { "openclaw": { "emoji": "🌤️" } } +--- + +# 中国城市天气查询 + +```bash +curl -s "wttr.in/深圳?lang=zh" +curl -s "wttr.in/深圳?format=j1" +``` +'@ + + "deepseek-helper" = @' +--- +name: deepseek-helper +description: "DeepSeek API 助手 - 编程辅助、模型选择、API调用指南、定价信息" +metadata: { "openclaw": { "emoji": "🤖" } } +--- + +# DeepSeek API 助手 + +## 模型对比 + +| 模型 | 适用场景 | 上下文 | +|------|---------|--------| +| deepseek-chat | 日常对话、文案 | 32K | +| deepseek-coder | 代码生成 | 16K | +| deepseek-reasoner | 复杂推理 | 64K | + +- API 兼容 OpenAI 格式,base_url: https://api.deepseek.com +- 国内直连,API Key: https://platform.deepseek.com +'@ + + "douyin-script" = @' +--- +name: douyin-script +description: "抖音/快手短视频脚本 - 前3秒hook、脚本结构、话题标签策略" +metadata: { "openclaw": { "emoji": "🎬" } } +--- + +# 抖音/快手短视频脚本助手 + +## 前3秒 Hook 公式 + +1. 反常识: "你一直在做的XX其实是错的" +2. 数字冲击: "只花了100块,效果比1000块的还好" +3. 悬念提问: "猜猜这个东西是干什么的?" +4. 情绪共鸣: "打工人看完都沉默了..." +5. 结果前置: "最终效果太绝了!" + +## 话题标签: 大+中+小话题,共5-8个 +## 黄金时段: 早7-9、午12-14、晚18-22 +'@ + + "wechat-article" = @' +--- +name: wechat-article +description: "微信公众号文章写作 - 文章结构、排版规范、阅读转化优化" +metadata: { "openclaw": { "emoji": "💚" } } +--- + +# 微信公众号文章写作助手 + +## 排版规范 + +- 正文字号 15-16px,行间距 1.75-2x +- 正文色 #3f3f3f,强调色 #007AFF +- 每段 3-5 行,每 300 字配一张图 +- 标题 30 字以内,前 15 字抓眼球 +'@ + + "weibo-poster" = @' +--- +name: weibo-poster +description: "微博内容创作 - 140字优化、话题热搜、配图描述、发布时机" +metadata: { "openclaw": { "emoji": "🔴" } } +--- + +# 微博内容创作助手 + +## 140字技巧: 先写后删,一条一观点,金句收尾 +## 配图: 1张突出/3张对比/6张叙述/9张九宫格 +## 发布: 工作日午休+下班后,周末上午+晚上 +'@ + + "xiaohongshu-writer" = @' +--- +name: xiaohongshu-writer +description: "小红书笔记写作助手 - 标题优化、emoji策略、话题标签、笔记结构" +metadata: { "openclaw": { "emoji": "📕" } } +--- + +# 小红书笔记写作助手 + +## 标题公式 + +1. 数字法: "5个/10种/100元以内" +2. 反差法: "月薪3千 vs 月薪3万" +3. 测评法: "亲测有效!" +4. 合集法: "XX合集|一篇搞定" + +## 写作要点: 每段≤3行,emoji每段1-2个,标签3-8个 +'@ + + "zhihu-writer" = @' +--- +name: zhihu-writer +description: "知乎回答/文章写作 - 回答结构、专业语气、引用规范" +metadata: { "openclaw": { "emoji": "📝" } } +--- + +# 知乎回答/文章写作助手 + +## 回答结构: 先说结论 → 分点论证 → 总结升华 +## 风格: 自信不傲慢,专业但易懂,有态度但包容 +## 盐值: 500-3000字,原创,回复评论,专注2-3个话题 +'@ +} + +foreach ($skillName in $skills.Keys) { + $skillDir = "$SKILLS_TARGET\$skillName" + if (-not (Test-Path $skillDir)) { + New-Item -ItemType Directory -Force -Path $skillDir | Out-Null + $skills[$skillName] | Out-File -Encoding utf8 "$skillDir\SKILL.md" + $skillCount++ + } +} + +Write-Green " ✓ 中国技能安装完成 (+$skillCount 个)" +Write-Host "" + +# ============================================================ +# Step 6: 交互式模型配置 +# ============================================================ +Write-Host " [5/7] 配置 AI 模型 ..." -ForegroundColor White +Write-Host "" + +$hasConfig = (Test-Path $CONFIG_PATH) -and (Select-String -Path $CONFIG_PATH -Pattern "apiKey" -Quiet -ErrorAction SilentlyContinue) + +if ($hasConfig) { + Write-Green " ✓ 已有模型配置,跳过" +} else { + Write-Host " 请选择 AI 模型:" -ForegroundColor White + Write-Host "" + Write-Host " ── 国内推荐(无需翻墙)──" -ForegroundColor White + Write-Host " 1) DeepSeek ⭐ 推荐,性价比最高" -ForegroundColor Green + Write-Host " 2) Kimi/月之暗面" + Write-Host " 3) 通义千问/阿里" + Write-Host " 4) 智谱GLM" + Write-Host " 5) MiniMax" + Write-Host " 6) 豆包/火山引擎" + Write-Host " 7) 硅基流动" + Write-Host "" + Write-Host " ── 海外模型 ──" -ForegroundColor White + Write-Host " 8) Claude 9) GPT" + Write-Host "" + Write-Host " ── 本地 ──" -ForegroundColor White + Write-Host " 10) Ollama 本地模型" + Write-Host "" + + $choice = Read-Host " 请输入编号 [1]" + if ([string]::IsNullOrEmpty($choice)) { $choice = "1" } + + $modelConfigs = @{ + "1" = @{ model="deepseek-chat"; baseUrl="https://api.deepseek.com/v1"; provider="custom"; label="DeepSeek API Key"; hint="获取: https://platform.deepseek.com/api_keys"; needKey=$true } + "2" = @{ model="moonshot-v1-auto"; baseUrl="https://api.moonshot.cn/v1"; provider="custom"; label="Moonshot API Key"; hint="获取: https://platform.moonshot.cn/console/api-keys"; needKey=$true } + "3" = @{ model="qwen-plus"; baseUrl="https://dashscope.aliyuncs.com/compatible-mode/v1"; provider="custom"; label="通义千问 API Key"; hint="获取: https://dashscope.console.aliyun.com/apiKey(有免费额度)"; needKey=$true } + "4" = @{ model="glm-4-plus"; baseUrl="https://open.bigmodel.cn/api/paas/v4"; provider="custom"; label="智谱 API Key"; hint="获取: https://open.bigmodel.cn/usercenter/apikeys"; needKey=$true } + "5" = @{ model="abab6.5s-chat"; baseUrl="https://api.minimax.chat/v1"; provider="custom"; label="MiniMax API Key"; hint="获取: https://platform.minimaxi.com/"; needKey=$true } + "6" = @{ model="doubao-pro-256k"; baseUrl="https://ark.cn-beijing.volces.com/api/v3"; provider="custom"; label="火山引擎 API Key"; hint="获取: https://console.volcengine.com/ark"; needKey=$true } + "7" = @{ model="deepseek-ai/DeepSeek-V3"; baseUrl="https://api.siliconflow.cn/v1"; provider="custom"; label="硅基流动 API Key"; hint="获取: https://cloud.siliconflow.cn/account/ak"; needKey=$true } + "8" = @{ model="claude-sonnet-4-20250514"; baseUrl=""; provider="anthropic"; label="Anthropic API Key"; hint="获取: https://console.anthropic.com/settings/keys(需翻墙)"; needKey=$true } + "9" = @{ model="gpt-4o"; baseUrl=""; provider="openai"; label="OpenAI API Key"; hint="获取: https://platform.openai.com/api-keys(需翻墙)"; needKey=$true } + "10" = @{ model="llama3.2"; baseUrl="http://127.0.0.1:11434/v1"; provider="custom"; label=""; hint="先安装 Ollama (https://ollama.com),运行: ollama run llama3.2"; needKey=$false } + } + + $cfg = $modelConfigs[$choice] + if (-not $cfg) { + Write-Yellow " 未知选项,使用默认 DeepSeek" + $cfg = $modelConfigs["1"] + } + + Write-Host "" + Write-Cyan " $($cfg.hint)" + Write-Host "" + + $apiKey = "" + if ($cfg.needKey) { + $apiKey = Read-Host " 请输入 $($cfg.label)" + if ([string]::IsNullOrEmpty($apiKey)) { + Write-Yellow " ⚠ 未输入 API Key,稍后可通过 Config.html 配置" + } + } + + # 写配置 + if ($cfg.provider -eq "custom" -and $cfg.baseUrl) { + $configJson = @" +{ + "gateway": { + "mode": "local", + "auth": { "token": "uclaw" } + }, + "agent": { + "model": "$($cfg.model)", + "apiKey": "$apiKey", + "baseUrl": "$($cfg.baseUrl)" + } +} +"@ + } else { + $configJson = @" +{ + "gateway": { + "mode": "local", + "auth": { "token": "uclaw" } + }, + "agent": { + "model": "$($cfg.model)", + "apiKey": "$apiKey", + "provider": "$($cfg.provider)" + } +} +"@ + } + + $configJson | Out-File -Encoding utf8 $CONFIG_PATH + Write-Green " ✓ 模型配置完成: $($cfg.model)" +} + +Write-Host "" + +# ============================================================ +# Step 7: 生成启动脚本 + 验证 + 摘要 +# ============================================================ +Write-Host " [6/7] 生成启动脚本 ..." -ForegroundColor White + +$startBat = @' +@echo off +setlocal EnableDelayedExpansion +chcp 65001 >nul 2>&1 +title U-Claw + +set "DIR=%~dp0" +set "NODE_BIN=%DIR%runtime\node-win-x64\node.exe" +if not exist "%NODE_BIN%" set "NODE_BIN=node" + +set "OPENCLAW_MJS=%DIR%core\node_modules\openclaw\openclaw.mjs" +set "OPENCLAW_HOME=%DIR%data" +set "OPENCLAW_STATE_DIR=%DIR%data\.openclaw" +set "OPENCLAW_CONFIG_PATH=%DIR%data\.openclaw\openclaw.json" + +REM Find available port +set PORT=18789 +:check_port +netstat -an | findstr ":%PORT% " | findstr "LISTENING" >nul 2>&1 +if %errorlevel%==0 ( + set /a PORT+=1 + if !PORT! gtr 18799 (echo 没有可用端口 & pause & exit /b 1) + goto :check_port +) + +cd /d "%DIR%core" +start /B "" cmd /c "timeout /t 3 /nobreak >nul && start http://127.0.0.1:!PORT!/#token=uclaw" +"%NODE_BIN%" "%OPENCLAW_MJS%" gateway run --allow-unconfigured --force --port !PORT! +pause +'@ + +$startBat | Out-File -Encoding ascii "$UCLAW_DIR\start.bat" + +Write-Green " ✓ 启动脚本已生成" +Write-Host "" + +# ============================================================ +# 验证 +# ============================================================ +Write-Host " [7/7] 验证安装 ..." -ForegroundColor White +Write-Host "" + +# Node.js +try { + $nodeVer = & $INSTALL_NODE --version 2>$null + Write-Green " [✓] Node.js $nodeVer" +} catch { + Write-Red " [✗] Node.js" +} + +# OpenClaw +if (Test-Path "$CORE_DIR\node_modules\openclaw\openclaw.mjs") { + Write-Green " [✓] OpenClaw 已安装" +} else { + Write-Red " [✗] OpenClaw" +} + +# QQ 插件 +if (Test-Path "$CORE_DIR\node_modules\@sliverp\qqbot") { + Write-Green " [✓] QQ 插件" +} else { + Write-Yellow " [⚠] QQ 插件(未安装,不影响主功能)" +} + +# 技能 +$installedSkills = (Get-ChildItem -Directory $SKILLS_TARGET -ErrorAction SilentlyContinue).Count +Write-Green " [✓] 中国技能 (${installedSkills}个)" + +# 配置 +if (Test-Path $CONFIG_PATH) { + Write-Green " [✓] 配置文件" +} else { + Write-Yellow " [⚠] 配置文件(需启动后配置)" +} + +Write-Host "" + +# ============================================================ +# 摘要 +# ============================================================ +$installSize = "{0:N0} MB" -f ((Get-ChildItem -Recurse $UCLAW_DIR -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1MB) + +Write-Host "" +Write-Green " ╔══════════════════════════════════════════╗" +Write-Green " ║ ✅ U-Claw 安装成功! ║" +Write-Green " ╚══════════════════════════════════════════╝" +Write-Host "" +Write-Host " 安装位置: $UCLAW_DIR" -ForegroundColor White +Write-Host " 大小: $installSize" -ForegroundColor White +Write-Host "" +Write-Host " 启动方式:" -ForegroundColor White +Write-Host " 双击 $UCLAW_DIR\start.bat" -ForegroundColor Cyan +Write-Host "" +Write-Host " 打开后:" -ForegroundColor White +Write-Host " 浏览器自动打开 → 开始和 AI 对话" -ForegroundColor White +Write-Host "" +Write-Host " 如需重新配置模型,编辑 $CONFIG_PATH" -ForegroundColor DarkGray +Write-Host " 卸载: 删除 $UCLAW_DIR 文件夹" -ForegroundColor DarkGray +Write-Host "" +Write-Host " 按回车关闭..." -ForegroundColor DarkGray +Read-Host diff --git a/install/install.sh b/install/install.sh new file mode 100755 index 0000000..3e9d225 --- /dev/null +++ b/install/install.sh @@ -0,0 +1,1122 @@ +#!/bin/bash +# ============================================================ +# U-Claw 一键安装脚本 (Mac/Linux) +# 用法: curl -fsSL https://u-claw.org/install.sh | bash +# 或: bash install.sh +# ============================================================ + +set -e + +# ---- 颜色定义 ---- +GREEN='\033[0;32m' +CYAN='\033[0;36m' +RED='\033[0;31m' +YELLOW='\033[1;33m' +BOLD='\033[1m' +DIM='\033[2m' +NC='\033[0m' + +# ---- 常量 ---- +UCLAW_DIR="$HOME/.uclaw" +RUNTIME_DIR="$UCLAW_DIR/runtime" +CORE_DIR="$UCLAW_DIR/core" +DATA_DIR="$UCLAW_DIR/data" +CONFIG_PATH="$DATA_DIR/.openclaw/openclaw.json" +NODE_VERSION="v22.14.0" +MIRROR="https://registry.npmmirror.com" +NODE_MIRROR="https://npmmirror.com/mirrors/node" + +# ============================================================ +# Step 1: Banner + 系统检测 +# ============================================================ +clear 2>/dev/null || true +echo "" +echo -e "${CYAN}${BOLD}" +cat << 'BANNER' + ╔══════════════════════════════════════════╗ + ║ 🦞 U-Claw 一键安装 ║ + ║ 让 AI 助手一行命令装好 ║ + ╚══════════════════════════════════════════╝ +BANNER +echo -e "${NC}" + +# 系统检测 +OS=$(uname -s) +ARCH=$(uname -m) + +if [ "$OS" = "Darwin" ]; then + if [ "$ARCH" = "arm64" ]; then + PLATFORM="darwin-arm64" + NODE_DIR="node-mac-arm64" + echo -e " 系统: ${GREEN}macOS Apple Silicon (M 系列) ✓${NC}" + else + PLATFORM="darwin-x64" + NODE_DIR="node-mac-x64" + echo -e " 系统: ${GREEN}macOS Intel ✓${NC}" + fi +elif [ "$OS" = "Linux" ]; then + if [ "$ARCH" = "x86_64" ]; then + PLATFORM="linux-x64" + NODE_DIR="node-linux-x64" + echo -e " 系统: ${GREEN}Linux x64 ✓${NC}" + elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then + PLATFORM="linux-arm64" + NODE_DIR="node-linux-arm64" + echo -e " 系统: ${GREEN}Linux ARM64 ✓${NC}" + else + echo -e " ${RED}不支持的架构: $ARCH${NC}" + exit 1 + fi +else + echo -e " ${RED}不支持的系统: $OS${NC}" + echo -e " ${YELLOW}Windows 请使用 PowerShell: irm https://u-claw.org/install.ps1 | iex${NC}" + exit 1 +fi + +echo -e " 安装目录: ${CYAN}$UCLAW_DIR${NC}" +echo "" + +# 检查已有安装 +if [ -d "$UCLAW_DIR/core/node_modules/openclaw" ]; then + echo -e " ${YELLOW}检测到已有安装: $UCLAW_DIR${NC}" + if [ -t 0 ]; then + read -p " 覆盖安装?(y/n) [y]: " -n 1 OVERWRITE + echo "" + if [ "$OVERWRITE" = "n" ] || [ "$OVERWRITE" = "N" ]; then + echo -e " ${DIM}已取消${NC}" + exit 0 + fi + else + echo -e " ${CYAN}管道模式,自动覆盖安装${NC}" + fi + echo "" +fi + +# 创建目录结构 +mkdir -p "$RUNTIME_DIR" "$CORE_DIR" "$DATA_DIR/.openclaw" "$DATA_DIR/memory" "$DATA_DIR/backups" + +# ============================================================ +# Step 2: Node.js v22 安装 +# ============================================================ +echo -e " ${BOLD}[1/7] 安装 Node.js $NODE_VERSION ...${NC}" + +NODE_INSTALL_DIR="$RUNTIME_DIR/$NODE_DIR" +INSTALL_NODE="" +INSTALL_NPM="" + +# 检查系统 Node.js +USE_SYSTEM_NODE=false +if command -v node >/dev/null 2>&1; then + SYS_VER=$(node --version) + MAJOR=$(echo "$SYS_VER" | sed 's/v//' | cut -d. -f1) + if [ "$MAJOR" -ge 20 ] 2>/dev/null; then + echo -e " ${GREEN}✓${NC} 系统已有 Node.js $SYS_VER,复用" + INSTALL_NODE="$(which node)" + INSTALL_NPM="$(which npm)" + USE_SYSTEM_NODE=true + fi +fi + +if [ "$USE_SYSTEM_NODE" = "false" ]; then + if [ -f "$NODE_INSTALL_DIR/bin/node" ]; then + echo -e " ${GREEN}✓${NC} Node.js 已存在,跳过下载" + INSTALL_NODE="$NODE_INSTALL_DIR/bin/node" + INSTALL_NPM="$NODE_INSTALL_DIR/bin/npm" + else + echo -e " ${CYAN}↓${NC} 从国内镜像下载 Node.js $NODE_VERSION ($PLATFORM)..." + TARBALL="node-${NODE_VERSION}-${PLATFORM}.tar.gz" + URL="${NODE_MIRROR}/${NODE_VERSION}/${TARBALL}" + + mkdir -p "$NODE_INSTALL_DIR" + if command -v curl >/dev/null 2>&1; then + curl -# -L "$URL" -o "/tmp/$TARBALL" + elif command -v wget >/dev/null 2>&1; then + wget -q --show-progress "$URL" -O "/tmp/$TARBALL" + else + echo -e " ${RED}✗ 未找到 curl 或 wget,请先安装${NC}" + exit 1 + fi + + tar -xzf "/tmp/$TARBALL" -C "$NODE_INSTALL_DIR" --strip-components=1 + rm -f "/tmp/$TARBALL" + chmod +x "$NODE_INSTALL_DIR/bin/node" + + if [ -f "$NODE_INSTALL_DIR/bin/node" ]; then + echo -e " ${GREEN}✓${NC} Node.js 安装完成" + INSTALL_NODE="$NODE_INSTALL_DIR/bin/node" + INSTALL_NPM="$NODE_INSTALL_DIR/bin/npm" + else + echo -e " ${RED}✗ Node.js 下载失败${NC}" + exit 1 + fi + fi +fi + +echo "" + +# ============================================================ +# Step 3: OpenClaw 安装 +# ============================================================ +echo -e " ${BOLD}[2/7] 安装 OpenClaw ...${NC}" + +if [ -d "$CORE_DIR/node_modules/openclaw" ]; then + echo -e " ${GREEN}✓${NC} OpenClaw 已安装,跳过" +else + if [ ! -f "$CORE_DIR/package.json" ]; then + cat > "$CORE_DIR/package.json" << 'PKGJSON' +{ + "name": "u-claw-core", + "version": "1.0.0", + "private": true, + "dependencies": { + "openclaw": "latest" + } +} +PKGJSON + fi + + echo -e " ${CYAN}↓${NC} 从国内镜像安装..." + "$INSTALL_NODE" "$INSTALL_NPM" install --prefix "$CORE_DIR" --registry="$MIRROR" 2>&1 | tail -5 + echo -e " ${GREEN}✓${NC} OpenClaw 安装完成" +fi + +echo "" + +# ============================================================ +# Step 4: QQ 插件(非致命) +# ============================================================ +echo -e " ${BOLD}[3/7] 安装 QQ 插件 ...${NC}" + +if [ -d "$CORE_DIR/node_modules/@sliverp/qqbot" ]; then + echo -e " ${GREEN}✓${NC} QQ 插件已安装,跳过" +else + echo -e " ${CYAN}↓${NC} 安装 QQ 插件..." + "$INSTALL_NODE" "$INSTALL_NPM" install @sliverp/qqbot@latest --prefix "$CORE_DIR" --registry="$MIRROR" 2>/dev/null || { + echo -e " ${YELLOW}⚠${NC} QQ 插件安装失败(不影响主功能)" + } + if [ -d "$CORE_DIR/node_modules/@sliverp/qqbot" ]; then + echo -e " ${GREEN}✓${NC} QQ 插件安装完成" + fi +fi + +echo "" + +# ============================================================ +# Step 5: 写入 10 个中国技能 +# ============================================================ +echo -e " ${BOLD}[4/7] 安装中国本地化技能 (10个) ...${NC}" + +SKILLS_TARGET="$CORE_DIR/node_modules/openclaw/skills" +if [ ! -d "$SKILLS_TARGET" ]; then + mkdir -p "$SKILLS_TARGET" +fi + +SKILL_COUNT=0 + +# ---- bilibili-helper ---- +if [ ! -d "$SKILLS_TARGET/bilibili-helper" ]; then +mkdir -p "$SKILLS_TARGET/bilibili-helper" +cat > "$SKILLS_TARGET/bilibili-helper/SKILL.md" << 'SKILLEOF' +--- +name: bilibili-helper +description: "B站内容助手 - 视频标题描述优化、标签策略、封面设计建议、分区选择、评论互动" +metadata: { "openclaw": { "emoji": "📺" } } +--- + +# B站内容助手 + +帮助 UP 主优化视频标题、描述、标签和封面,提升视频在 B 站的推荐和互动表现。 + +## 功能概述 + +- **标题优化**: 符合 B 站用户口味的标题写法 +- **描述撰写**: 含时间轴、关键词、引导语的视频简介 +- **标签策略**: 精准标签 + 热门标签组合,提升推荐 +- **分区建议**: 根据内容推荐最佳投稿分区 +- **封面设计**: 封面构图、文字、配色建议 +- **评论互动**: 置顶评论话术,提升互动率 + +## 使用示例 + +### 写标题和描述 +``` +我做了一个"用AI写代码"的教程视频,帮我写标题和描述 +``` + +### 分区推荐 +``` +我的视频内容是游戏+编程结合,应该投哪个分区? +``` + +### 封面建议 +``` +视频主题是"大学生省钱攻略",帮我设计封面方案 +``` + +## 标题公式 + +1. **疑问式**: "为什么XX?看完你就懂了" +2. **教程式**: "XX教程|从零开始手把手教学" +3. **测评式**: "花了XX元买了XX,值不值?" +4. **挑战式**: "挑战XX天只用XX" +5. **盘点式**: "XX年度十大XX盘点" +6. **震惊式**: "这也太XX了吧!"(B站经典体) + +## 描述模板 + +``` +【视频简介】 +一句话概括视频内容 + +【时间轴】 +00:00 开场 +01:23 第一部分 +05:00 第二部分 +08:30 总结 + +【相关链接】 +工具/资源链接 + +【关于我】 +一句话介绍 + 更新频率 + +三连支持一下吧~ 有问题评论区见! +``` + +## 分区选择指南 + +| 内容类型 | 推荐分区 | +|---------|---------| +| 编程教程 | 科技 → 计算机技术 | +| 日常 vlog | 生活 → 日常 | +| 游戏实况 | 游戏 → 单机/网游 | +| 知识科普 | 知识 → 社科人文/科学科普 | +| 美食制作 | 生活 → 美食圈 | +| AI/数码 | 科技 → 软件应用 | + +## 标签策略 + +- **核心标签**: 精确描述视频内容(2-3个) +- **分区热门**: 当前分区下的热门标签(2-3个) +- **全站热门**: B站当前热点话题(1-2个) +- **长尾标签**: 细分领域关键词(2-3个) +- 总计 8-12 个标签效果最佳 + +## 封面设计要点 + +- **尺寸**: 16:10(推荐 1146x717) +- **文字**: 不超过 10 字,字体加粗加描边 +- **表情**: 人物表情夸张更吸引点击 +- **配色**: 高饱和度,与B站粉色/蓝色背景形成对比 +- **避免**: 过多文字、低分辨率、与内容无关的封面 +SKILLEOF +SKILL_COUNT=$((SKILL_COUNT + 1)) +fi + +# ---- china-search ---- +if [ ! -d "$SKILLS_TARGET/china-search" ]; then +mkdir -p "$SKILLS_TARGET/china-search" +cat > "$SKILLS_TARGET/china-search/SKILL.md" << 'SKILLEOF' +--- +name: china-search +description: "国内搜索引擎 - 百度、搜狗、Bing中国搜索,绕过GFW限制" +metadata: { "openclaw": { "emoji": "🔍" } } +--- + +# 国内搜索引擎助手 + +在无法访问 Google 的环境下,通过 curl 调用百度、搜狗、Bing 中国等国内搜索引擎获取信息。 + +## 功能概述 + +- **百度搜索**: 中文信息最全的搜索引擎 +- **搜狗搜索**: 微信公众号文章搜索利器 +- **Bing 中国**: 国际信息 + 国内可访问 + +## 搜索命令 + +### 百度搜索 +```bash +curl -s -L "https://www.baidu.com/s?wd=关键词" \ + -H "User-Agent: Mozilla/5.0" | head -200 +``` + +### 搜狗搜索(含微信文章) +```bash +curl -s -L "https://weixin.sogou.com/weixin?query=关键词" \ + -H "User-Agent: Mozilla/5.0" +``` + +### Bing 中国搜索 +```bash +curl -s -L "https://cn.bing.com/search?q=关键词" \ + -H "User-Agent: Mozilla/5.0" +``` + +## 搜索技巧 + +| 语法 | 说明 | 示例 | +|-----|------|------| +| "" | 精确匹配 | "人工智能" | +| site: | 限定网站 | site:zhihu.com AI | +| filetype: | 限定文件类型 | filetype:pdf 机器学习 | +| - | 排除关键词 | 苹果 -手机 | +SKILLEOF +SKILL_COUNT=$((SKILL_COUNT + 1)) +fi + +# ---- china-translate ---- +if [ ! -d "$SKILLS_TARGET/china-translate" ]; then +mkdir -p "$SKILLS_TARGET/china-translate" +cat > "$SKILLS_TARGET/china-translate/SKILL.md" << 'SKILLEOF' +--- +name: china-translate +description: "中英互译 + 本地化 - 技术翻译、UI本地化、文化适配、避免机翻腔" +metadata: { "openclaw": { "emoji": "🌐" } } +--- + +# 中英互译 + 本地化助手 + +专业的中英双向翻译工具,专注技术文档翻译、产品本地化和文化适配,杜绝机翻腔。 + +## 功能概述 + +- **技术翻译**: 编程/AI/互联网领域的专业术语翻译 +- **UI 本地化**: 将英文界面文案翻译为符合中文习惯的表达 +- **文化适配**: 处理中西文化差异,避免直译造成的误解 +- **去机翻腔**: 将僵硬的机器翻译改写为自然流畅的中文 + +## 常见术语对照表 + +| English | 中文(推荐) | 避免使用 | +|---------|------------|---------| +| Machine Learning | 机器学习 | 机械学习 | +| Deploy | 部署 | 配置/展开 | +| Repository | 仓库 / 代码仓库 | 存储库 | +| Pull Request | PR / 合并请求 | 拉取请求 | +| Container | 容器 | 集装箱 | +| Middleware | 中间件 | 中间软件 | +| Render | 渲染 | 呈现 | +| Token | Token / 令牌 | 代币(非区块链语境) | +| Prompt | 提示词 / Prompt | 提示语 | +| Fine-tune | 微调 | 精调 | + +## UI 本地化指南 + +- "Submit" → "提交" +- "Cancel" → "取消" +- "Get Started" → "立即开始" +- "Learn More" → "了解更多" +- "Sign Up" → "注册" +- 中文 UI 不需要句号(按钮、标签) +- 中英文之间加半角空格 +SKILLEOF +SKILL_COUNT=$((SKILL_COUNT + 1)) +fi + +# ---- china-weather ---- +if [ ! -d "$SKILLS_TARGET/china-weather" ]; then +mkdir -p "$SKILLS_TARGET/china-weather" +cat > "$SKILLS_TARGET/china-weather/SKILL.md" << 'SKILLEOF' +--- +name: china-weather +description: "中国城市天气查询 - 支持中文城市名、农历日期、wttr.in接口" +metadata: { "openclaw": { "emoji": "🌤️" } } +--- + +# 中国城市天气查询 + +通过 wttr.in 查询中国各城市天气信息,支持中文城市名输入。 + +## 查询方式 + +```bash +# 基础查询(中文输出) +curl -s "wttr.in/深圳?lang=zh" + +# 精简单行格式 +curl -s "wttr.in/深圳?format=3&lang=zh" + +# JSON 格式(便于解析) +curl -s "wttr.in/深圳?format=j1" +``` + +## 使用示例 + +- 深圳今天天气怎么样? +- 明天要去杭州出差,需要带伞吗? +- 北京和上海这周末天气哪个好? + +## 注意事项 + +- wttr.in 为免费服务,偶尔可能响应较慢 +- 温度默认摄氏度,风速默认 km/h +SKILLEOF +SKILL_COUNT=$((SKILL_COUNT + 1)) +fi + +# ---- deepseek-helper ---- +if [ ! -d "$SKILLS_TARGET/deepseek-helper" ]; then +mkdir -p "$SKILLS_TARGET/deepseek-helper" +cat > "$SKILLS_TARGET/deepseek-helper/SKILL.md" << 'SKILLEOF' +--- +name: deepseek-helper +description: "DeepSeek API 助手 - 编程辅助、模型选择、API调用指南、定价信息" +metadata: { "openclaw": { "emoji": "🤖" } } +--- + +# DeepSeek API 助手 + +帮助用户高效使用 DeepSeek 系列模型,包括模型选择建议、API 调用示例和定价计算。 + +## 模型对比 + +| 模型 | 适用场景 | 上下文长度 | +|------|---------|-----------| +| deepseek-chat | 日常对话、文案写作、知识问答 | 32K | +| deepseek-coder | 代码生成、代码审查、技术文档 | 16K | +| deepseek-reasoner | 复杂推理、数学、逻辑分析 | 64K | + +## 关键提示 + +- DeepSeek API 兼容 OpenAI 格式,base_url 改为 `https://api.deepseek.com` +- 国内访问无需翻墙,延迟低 +- 支持 function calling 和 JSON mode +- API Key 申请地址: https://platform.deepseek.com +SKILLEOF +SKILL_COUNT=$((SKILL_COUNT + 1)) +fi + +# ---- douyin-script ---- +if [ ! -d "$SKILLS_TARGET/douyin-script" ]; then +mkdir -p "$SKILLS_TARGET/douyin-script" +cat > "$SKILLS_TARGET/douyin-script/SKILL.md" << 'SKILLEOF' +--- +name: douyin-script +description: "抖音/快手短视频脚本 - 前3秒hook、脚本结构、热门音乐建议、话题标签策略" +metadata: { "openclaw": { "emoji": "🎬" } } +--- + +# 抖音/快手短视频脚本助手 + +帮你写出完播率高、互动强的短视频脚本。 + +## 脚本结构模板 + +### 15秒脚本 +``` +【0-3秒】Hook: 抛出反常识/痛点 +【3-10秒】核心内容: 快速讲解 +【10-15秒】CTA: 引导互动 +``` + +### 60秒脚本 +``` +【0-3秒】Hook: 强烈的情绪/悬念 +【3-15秒】背景铺垫 +【15-40秒】内容展开 +【40-50秒】反转/高潮 +【50-60秒】CTA + 话题标签 +``` + +## 前3秒 Hook 公式 + +1. **反常识**: "你一直在做的XX其实是错的" +2. **数字冲击**: "只花了100块,效果比1000块的还好" +3. **悬念提问**: "猜猜这个东西是干什么的?" +4. **情绪共鸣**: "打工人看完都沉默了..." +5. **结果前置**: "最终效果太绝了!往下看做法" + +## 话题标签策略 + +- **大话题**: #抖音热门 #今日份分享(1-2个) +- **中话题**: #健身打卡 #美食教程(2-3个) +- **小话题**: #深圳探店 #程序员日常(2-3个) + +## 发布建议 + +- **黄金时段**: 早7-9点、午12-14点、晚18-22点 +- **封面**: 竖屏 9:16,文字大且少(不超过8字) +SKILLEOF +SKILL_COUNT=$((SKILL_COUNT + 1)) +fi + +# ---- wechat-article ---- +if [ ! -d "$SKILLS_TARGET/wechat-article" ]; then +mkdir -p "$SKILLS_TARGET/wechat-article" +cat > "$SKILLS_TARGET/wechat-article/SKILL.md" << 'SKILLEOF' +--- +name: wechat-article +description: "微信公众号文章写作 - 文章结构、排版规范、阅读转化优化、封面建议" +metadata: { "openclaw": { "emoji": "💚" } } +--- + +# 微信公众号文章写作助手 + +帮助运营者写出高阅读、高转发的微信公众号文章。 + +## 文章结构模板 + +``` +【标题】控制在 30 字以内,前 15 字抓眼球 +【摘要】出现在分享卡片,控制在 54 字 + +【引言】1-2 段,建立共鸣或抛出问题 + +【正文】 +## 小标题一 +内容段落...(每段 3-5 行) + +## 小标题二 +内容段落... + +【总结】回扣主题,升华观点 + +【尾部】 +觉得有收获?点个「在看」让更多人看到 +``` + +## 微信排版规范 + +- **正文字号**: 15-16px +- **行间距**: 1.75-2倍 +- **段间距**: 空一行 +- **配色**: 正文 #3f3f3f,强调 #007AFF +- **图片**: 宽度 100%,JPG,单张不超过 5MB + +## 标题技巧 + +1. **数字开头**: "3个方法/5分钟学会" +2. **疑问式**: "为什么XX?答案出乎意料" +3. **对比式**: "XX和XX的差距,在于这一点" +4. **紧迫感**: "再不XX就晚了" +SKILLEOF +SKILL_COUNT=$((SKILL_COUNT + 1)) +fi + +# ---- weibo-poster ---- +if [ ! -d "$SKILLS_TARGET/weibo-poster" ]; then +mkdir -p "$SKILLS_TARGET/weibo-poster" +cat > "$SKILLS_TARGET/weibo-poster/SKILL.md" << 'SKILLEOF' +--- +name: weibo-poster +description: "微博内容创作 - 140字优化、话题热搜、@提及策略、配图描述、发布时机" +metadata: { "openclaw": { "emoji": "🔴" } } +--- + +# 微博内容创作助手 + +帮你写出高转发、高互动的微博内容。 + +## 微博内容模板 + +### 短微博(140字以内) +``` +【观点/金句】一句话表达核心观点 +【补充说明】1-2句展开 +【话题标签】#话题一# #话题二# +``` + +## 140字写作技巧 + +- **先写后删**: 先完整表达,再精简到 140 字 +- **一条一观点**: 不要在一条微博里讲太多 +- **金句收尾**: 最后一句要值得被转发 + +## 配图建议 + +- **1张图**: 重点突出,适合海报/截图 +- **3张图**: 对比/过程展示 +- **6张图**: 故事叙述 +- **9张图**: 九宫格,视觉冲击力最强 + +## 发布时间建议 + +- **工作日**: 午休 12:00-13:00、下班后 18:00-20:00 +- **周末**: 上午 10:00-11:00、晚上 20:00-22:00 +SKILLEOF +SKILL_COUNT=$((SKILL_COUNT + 1)) +fi + +# ---- xiaohongshu-writer ---- +if [ ! -d "$SKILLS_TARGET/xiaohongshu-writer" ]; then +mkdir -p "$SKILLS_TARGET/xiaohongshu-writer" +cat > "$SKILLS_TARGET/xiaohongshu-writer/SKILL.md" << 'SKILLEOF' +--- +name: xiaohongshu-writer +description: "小红书笔记写作助手 - 标题优化、emoji策略、话题标签、封面文案、笔记结构" +metadata: { "openclaw": { "emoji": "📕" } } +--- + +# 小红书笔记写作助手 + +专业的小红书内容创作工具,帮你写出高互动、高收藏的爆款笔记。 + +## 笔记结构模板 + +``` +【标题】数字 + 痛点/好奇心 + emoji +例: 打工人必看!5个让老板刮目相看的汇报技巧 💼 + +【开头 Hook】1-2句直击痛点 +【正文】分点罗列,每点 2-3 行 +1️⃣ 第一点... +2️⃣ 第二点... + +【结尾 CTA】 +觉得有用就 ❤️ 收藏起来慢慢看! + +【话题标签】 +#职场干货 #汇报技巧 #打工人必看 +``` + +## 标题公式 + +1. **数字法**: "5个/10种/100元以内" + 关键词 +2. **反差法**: "月薪3千 vs 月薪3万的区别" +3. **身份法**: "作为XX人/XX年经验告诉你" +4. **测评法**: "亲测有效!" + 结果 +5. **合集法**: "XX合集|一篇搞定" + +## 写作要点 + +- 每段不超过 3 行 +- emoji 不要堆砌,每段 1-2 个 +- 话题标签 3-8 个为佳 +- 封面文案控制在 10 字以内 +- 发布时间: 早7-9点、午12-14点、晚20-22点 +SKILLEOF +SKILL_COUNT=$((SKILL_COUNT + 1)) +fi + +# ---- zhihu-writer ---- +if [ ! -d "$SKILLS_TARGET/zhihu-writer" ]; then +mkdir -p "$SKILLS_TARGET/zhihu-writer" +cat > "$SKILLS_TARGET/zhihu-writer/SKILL.md" << 'SKILLEOF' +--- +name: zhihu-writer +description: "知乎回答/文章写作 - 回答结构、专业语气、引用规范、话题关联、盐值优化" +metadata: { "openclaw": { "emoji": "📝" } } +--- + +# 知乎回答/文章写作助手 + +帮助创作者写出高赞、高收藏的知乎内容。 + +## 回答结构模板 + +``` +【开头】直接回答问题 + 亮明立场 +"作为一个做了5年XX的人,我的回答是:..." + +--- + +【正文】分点论述,有理有据 +一、第一个论点 + 数据/案例 +二、第二个论点 + 个人经验 +三、第三个论点 + 行业分析 + +【总结】回扣问题,给出实操建议 +``` + +## 知乎写作风格 + +- **自信但不傲慢**: "以我的经验来看" +- **专业但易懂**: 术语需要解释 +- **有态度但包容**: 尊重不同立场 +- **真诚分享**: 多用个人经验和案例 + +## 盐值优化 + +- 回答字数建议 500-3000 字 +- 避免复制粘贴,用自己的语言 +- 回复评论,参与讨论 +- 持续在 2-3 个话题下创作 +SKILLEOF +SKILL_COUNT=$((SKILL_COUNT + 1)) +fi + +echo -e " ${GREEN}✓${NC} 中国技能安装完成 (+${SKILL_COUNT} 个)" +echo "" + +# ============================================================ +# Step 6: 交互式模型配置 +# ============================================================ +echo -e " ${BOLD}[5/7] 配置 AI 模型 ...${NC}" +echo "" + +# 如果已有配置且包含 apiKey,跳过 +if [ -f "$CONFIG_PATH" ] && grep -q '"apiKey"' "$CONFIG_PATH" 2>/dev/null; then + echo -e " ${GREEN}✓${NC} 已有模型配置,跳过" +else + # 检测是否可交互 + if [ -t 0 ]; then + echo -e " 请选择 AI 模型:" + echo "" + echo -e " ${BOLD}── 国内推荐(无需翻墙)──${NC}" + echo -e " ${GREEN}1)${NC} DeepSeek ⭐ 推荐,性价比最高" + echo -e " ${NC}2)${NC} Kimi/月之暗面" + echo -e " ${NC}3)${NC} 通义千问/阿里" + echo -e " ${NC}4)${NC} 智谱GLM" + echo -e " ${NC}5)${NC} MiniMax" + echo -e " ${NC}6)${NC} 豆包/火山引擎" + echo -e " ${NC}7)${NC} 硅基流动" + echo "" + echo -e " ${BOLD}── 海外模型 ──${NC}" + echo -e " ${NC}8)${NC} Claude ${NC}9)${NC} GPT" + echo "" + echo -e " ${BOLD}── 本地 ──${NC}" + echo -e " ${NC}10)${NC} Ollama 本地模型" + echo "" + read -p " 请输入编号 [1]: " MODEL_CHOICE + MODEL_CHOICE=${MODEL_CHOICE:-1} + + # 模型配置映射 + case $MODEL_CHOICE in + 1) + MODEL_NAME="deepseek-chat" + BASE_URL="https://api.deepseek.com/v1" + PROVIDER="custom" + KEY_LABEL="DeepSeek API Key" + KEY_HINT="获取地址: https://platform.deepseek.com/api_keys" + NEED_KEY=true + ;; + 2) + MODEL_NAME="moonshot-v1-auto" + BASE_URL="https://api.moonshot.cn/v1" + PROVIDER="custom" + KEY_LABEL="Moonshot API Key" + KEY_HINT="获取地址: https://platform.moonshot.cn/console/api-keys" + NEED_KEY=true + ;; + 3) + MODEL_NAME="qwen-plus" + BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1" + PROVIDER="custom" + KEY_LABEL="通义千问 API Key" + KEY_HINT="获取地址: https://dashscope.console.aliyun.com/apiKey(有免费额度)" + NEED_KEY=true + ;; + 4) + MODEL_NAME="glm-4-plus" + BASE_URL="https://open.bigmodel.cn/api/paas/v4" + PROVIDER="custom" + KEY_LABEL="智谱 API Key" + KEY_HINT="获取地址: https://open.bigmodel.cn/usercenter/apikeys" + NEED_KEY=true + ;; + 5) + MODEL_NAME="abab6.5s-chat" + BASE_URL="https://api.minimax.chat/v1" + PROVIDER="custom" + KEY_LABEL="MiniMax API Key" + KEY_HINT="获取地址: https://platform.minimaxi.com/" + NEED_KEY=true + ;; + 6) + MODEL_NAME="doubao-pro-256k" + BASE_URL="https://ark.cn-beijing.volces.com/api/v3" + PROVIDER="custom" + KEY_LABEL="火山引擎 API Key" + KEY_HINT="获取地址: https://console.volcengine.com/ark" + NEED_KEY=true + ;; + 7) + MODEL_NAME="deepseek-ai/DeepSeek-V3" + BASE_URL="https://api.siliconflow.cn/v1" + PROVIDER="custom" + KEY_LABEL="硅基流动 API Key" + KEY_HINT="获取地址: https://cloud.siliconflow.cn/account/ak" + NEED_KEY=true + ;; + 8) + MODEL_NAME="claude-sonnet-4-20250514" + BASE_URL="" + PROVIDER="anthropic" + KEY_LABEL="Anthropic API Key" + KEY_HINT="获取地址: https://console.anthropic.com/settings/keys(需翻墙)" + NEED_KEY=true + ;; + 9) + MODEL_NAME="gpt-4o" + BASE_URL="" + PROVIDER="openai" + KEY_LABEL="OpenAI API Key" + KEY_HINT="获取地址: https://platform.openai.com/api-keys(需翻墙)" + NEED_KEY=true + ;; + 10) + MODEL_NAME="llama3.2" + BASE_URL="http://127.0.0.1:11434/v1" + PROVIDER="custom" + KEY_LABEL="" + KEY_HINT="先安装 Ollama (https://ollama.com),然后运行: ollama run llama3.2" + NEED_KEY=false + ;; + *) + echo -e " ${YELLOW}未知选项,使用默认 DeepSeek${NC}" + MODEL_NAME="deepseek-chat" + BASE_URL="https://api.deepseek.com/v1" + PROVIDER="custom" + KEY_LABEL="DeepSeek API Key" + KEY_HINT="获取地址: https://platform.deepseek.com/api_keys" + NEED_KEY=true + ;; + esac + + echo "" + + # 输入 API Key + API_KEY="" + if [ "$NEED_KEY" = "true" ]; then + echo -e " ${CYAN}$KEY_HINT${NC}" + echo "" + read -p " 请输入 $KEY_LABEL: " API_KEY + if [ -z "$API_KEY" ]; then + echo -e " ${YELLOW}⚠ 未输入 API Key,稍后可通过 Config.html 配置${NC}" + fi + else + echo -e " ${CYAN}$KEY_HINT${NC}" + fi + + # 写配置文件 + if [ "$PROVIDER" = "custom" ] && [ -n "$BASE_URL" ]; then + cat > "$CONFIG_PATH" << CFGEOF +{ + "gateway": { + "mode": "local", + "auth": { "token": "uclaw" } + }, + "agent": { + "model": "$MODEL_NAME", + "apiKey": "$API_KEY", + "baseUrl": "$BASE_URL" + } +} +CFGEOF + elif [ "$PROVIDER" = "anthropic" ]; then + cat > "$CONFIG_PATH" << CFGEOF +{ + "gateway": { + "mode": "local", + "auth": { "token": "uclaw" } + }, + "agent": { + "model": "$MODEL_NAME", + "apiKey": "$API_KEY", + "provider": "anthropic" + } +} +CFGEOF + elif [ "$PROVIDER" = "openai" ]; then + cat > "$CONFIG_PATH" << CFGEOF +{ + "gateway": { + "mode": "local", + "auth": { "token": "uclaw" } + }, + "agent": { + "model": "$MODEL_NAME", + "apiKey": "$API_KEY", + "provider": "openai" + } +} +CFGEOF + fi + + echo -e " ${GREEN}✓${NC} 模型配置完成: $MODEL_NAME" + else + # 非交互模式,写默认配置 + echo -e " ${YELLOW}⚠${NC} 管道模式,跳过模型选择" + echo -e " ${DIM}启动后用 Config.html 配置模型${NC}" + if [ ! -f "$CONFIG_PATH" ]; then + cat > "$CONFIG_PATH" << 'CFGEOF' +{ + "gateway": { + "mode": "local", + "auth": { "token": "uclaw" } + } +} +CFGEOF + fi + fi +fi + +echo "" + +# ============================================================ +# Step 7: 生成启动脚本 + 验证 + 摘要 +# ============================================================ +echo -e " ${BOLD}[6/7] 生成启动脚本 ...${NC}" + +# Mac 启动脚本 +cat > "$UCLAW_DIR/start.command" << 'STARTEOF' +#!/bin/bash +DIR="$(cd "$(dirname "$0")" && pwd)" +ARCH=$(uname -m) + +# Find Node.js +if [ "$ARCH" = "arm64" ]; then + NODE_BIN="$DIR/runtime/node-mac-arm64/bin/node" +else + NODE_BIN="$DIR/runtime/node-mac-x64/bin/node" +fi +[ ! -f "$NODE_BIN" ] && NODE_BIN="$(which node 2>/dev/null)" + +if [ -z "$NODE_BIN" ] || [ ! -f "$NODE_BIN" ]; then + echo "错误: 未找到 Node.js" + exit 1 +fi + +OPENCLAW_MJS="$DIR/core/node_modules/openclaw/openclaw.mjs" +if [ ! -f "$OPENCLAW_MJS" ]; then + echo "错误: 未找到 OpenClaw" + exit 1 +fi + +export OPENCLAW_HOME="$DIR/data" +export OPENCLAW_STATE_DIR="$DIR/data/.openclaw" +export OPENCLAW_CONFIG_PATH="$DIR/data/.openclaw/openclaw.json" + +# Find available port +PORT=18789 +while lsof -i :$PORT >/dev/null 2>&1; do + PORT=$((PORT + 1)) + [ $PORT -gt 18799 ] && echo "没有可用端口 (18789-18799)" && exit 1 +done + +cd "$DIR/core" +"$NODE_BIN" "$OPENCLAW_MJS" gateway run --allow-unconfigured --force --port $PORT & +PID=$! + +# Wait for gateway to start, then open browser +for i in $(seq 1 30); do + sleep 0.5 + if curl -s -o /dev/null "http://127.0.0.1:$PORT/" 2>/dev/null; then + open "http://127.0.0.1:$PORT/#token=uclaw" 2>/dev/null || true + break + fi +done + +echo "" +echo " 🦞 U-Claw 正在运行: http://127.0.0.1:$PORT/#token=uclaw" +echo " 按 Ctrl+C 停止" +echo "" + +wait $PID +STARTEOF +chmod +x "$UCLAW_DIR/start.command" + +# Linux 启动脚本 +if [ "$OS" = "Linux" ]; then +cat > "$UCLAW_DIR/start.sh" << 'STARTEOF' +#!/bin/bash +DIR="$(cd "$(dirname "$0")" && pwd)" +ARCH=$(uname -m) + +if [ "$ARCH" = "x86_64" ]; then + NODE_BIN="$DIR/runtime/node-linux-x64/bin/node" +elif [ "$ARCH" = "aarch64" ]; then + NODE_BIN="$DIR/runtime/node-linux-arm64/bin/node" +fi +[ ! -f "$NODE_BIN" ] && NODE_BIN="$(which node 2>/dev/null)" + +OPENCLAW_MJS="$DIR/core/node_modules/openclaw/openclaw.mjs" + +export OPENCLAW_HOME="$DIR/data" +export OPENCLAW_STATE_DIR="$DIR/data/.openclaw" +export OPENCLAW_CONFIG_PATH="$DIR/data/.openclaw/openclaw.json" + +PORT=18789 +while ss -tln | grep -q ":$PORT "; do + PORT=$((PORT + 1)) + [ $PORT -gt 18799 ] && echo "没有可用端口" && exit 1 +done + +cd "$DIR/core" +"$NODE_BIN" "$OPENCLAW_MJS" gateway run --allow-unconfigured --force --port $PORT & +PID=$! + +sleep 2 +echo "" +echo " 🦞 U-Claw 正在运行: http://127.0.0.1:$PORT/#token=uclaw" +echo " 按 Ctrl+C 停止" +echo "" + +xdg-open "http://127.0.0.1:$PORT/#token=uclaw" 2>/dev/null || true +wait $PID +STARTEOF +chmod +x "$UCLAW_DIR/start.sh" +fi + +echo -e " ${GREEN}✓${NC} 启动脚本已生成" +echo "" + +# ============================================================ +# 验证 +# ============================================================ +echo -e " ${BOLD}[7/7] 验证安装 ...${NC}" +echo "" + +# Node.js +if [ -n "$INSTALL_NODE" ] && "$INSTALL_NODE" --version >/dev/null 2>&1; then + NODE_VER_STR=$("$INSTALL_NODE" --version) + echo -e " ${GREEN}[✓]${NC} Node.js $NODE_VER_STR" +else + echo -e " ${RED}[✗]${NC} Node.js" +fi + +# OpenClaw +if [ -f "$CORE_DIR/node_modules/openclaw/openclaw.mjs" ]; then + echo -e " ${GREEN}[✓]${NC} OpenClaw 已安装" +else + echo -e " ${RED}[✗]${NC} OpenClaw" +fi + +# QQ 插件 +if [ -d "$CORE_DIR/node_modules/@sliverp/qqbot" ]; then + echo -e " ${GREEN}[✓]${NC} QQ 插件" +else + echo -e " ${YELLOW}[⚠]${NC} QQ 插件(未安装,不影响主功能)" +fi + +# 技能 +INSTALLED_SKILLS=$(ls -d "$SKILLS_TARGET"/*/ 2>/dev/null | wc -l | tr -d ' ') +echo -e " ${GREEN}[✓]${NC} 中国技能 (${INSTALLED_SKILLS}个)" + +# 配置文件 +if [ -f "$CONFIG_PATH" ]; then + echo -e " ${GREEN}[✓]${NC} 配置文件" +else + echo -e " ${YELLOW}[⚠]${NC} 配置文件(需启动后配置)" +fi + +echo "" + +# ============================================================ +# 摘要 +# ============================================================ +INSTALL_SIZE=$(du -sh "$UCLAW_DIR" 2>/dev/null | cut -f1) + +echo -e "${GREEN}${BOLD}" +echo " ╔══════════════════════════════════════════╗" +echo " ║ ✅ U-Claw 安装成功! ║" +echo " ╚══════════════════════════════════════════╝" +echo -e "${NC}" +echo -e " ${BOLD}安装位置:${NC} $UCLAW_DIR" +echo -e " ${BOLD}大小:${NC} $INSTALL_SIZE" +echo "" +echo -e " ${BOLD}启动方式:${NC}" +if [ "$OS" = "Darwin" ]; then + echo -e " 双击 ${CYAN}~/.uclaw/start.command${NC}" + echo -e " 或终端: ${CYAN}bash ~/.uclaw/start.command${NC}" +else + echo -e " 终端: ${CYAN}bash ~/.uclaw/start.sh${NC}" +fi +echo "" +echo -e " ${BOLD}打开后:${NC}" +echo -e " 浏览器自动打开 → 开始和 AI 对话" +echo "" +echo -e " ${DIM}如需重新配置模型,编辑 ~/.uclaw/data/.openclaw/openclaw.json${NC}" +echo -e " ${DIM}卸载: rm -rf ~/.uclaw${NC}" +echo "" diff --git a/website/guide.html b/website/guide.html index 7d3ef03..60d62e6 100644 --- a/website/guide.html +++ b/website/guide.html @@ -97,6 +97,7 @@ ul{padding-left:20px}