diff --git a/claude-dev-stack/.env.example b/claude-dev-stack/.env.example index 000b3b1..1ad0cf9 100644 --- a/claude-dev-stack/.env.example +++ b/claude-dev-stack/.env.example @@ -3,19 +3,23 @@ # 复制为 .env 并按需填写 # ============================================================= -# ── Claude / Anthropic API ────────────────────────────────── -# Anthropic 官方 API Key(从 https://console.anthropic.com 获取) -ANTHROPIC_API_KEY= +# ── Claude / API 配置 ──────────────────────────────────────── +# 推荐:灵眸 AI(国内直连,无需代理)https://docs.lmuai.com/docs/tools/claude-code +ANTHROPIC_AUTH_TOKEN=sk-你的灵眸API密钥 +ANTHROPIC_BASE_URL=https://api.lmuai.com -# API Base URL(默认使用 Anthropic 官方;若使用中转代理请修改) -# 示例(DeepSeek 兼容接口): -# ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic -ANTHROPIC_BASE_URL=https://api.anthropic.com +# 备选:Anthropic 官方 API Key(海外直连) +# ANTHROPIC_API_KEY= +# ANTHROPIC_BASE_URL=https://api.anthropic.com + +# 备选:DeepSeek 兼容接口 +# ANTHROPIC_API_KEY= +# ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic # 默认使用的模型 -# 可选:claude-opus-4-5 | claude-sonnet-4-5 | claude-haiku-4-5 -# deepseek-v3-0324(配合 DeepSeek 接口使用) -CLAUDE_MODEL=claude-opus-4-5 +# 灵眸可选:claude-opus-4-7 | claude-sonnet-4-5 | claude-haiku-4-5 +# DeepSeek可选:deepseek-v4-pro +CLAUDE_MODEL=claude-opus-4-7 # ── WSL2 ──────────────────────────────────────────────────── # WSL2 发行版名称(wsl --list 查看已安装发行版) diff --git a/claude-dev-stack/README.md b/claude-dev-stack/README.md index d3d168a..d1911f7 100644 --- a/claude-dev-stack/README.md +++ b/claude-dev-stack/README.md @@ -43,14 +43,14 @@ WSL2 Ubuntu 首次启动若弹出用户创建提示,可直接跳过或按提 # 1. 以管理员身份运行 PowerShell cd path\to\claude-dev-stack -# 2. 复制配置文件,填写 ANTHROPIC_API_KEY +# 2. 复制配置文件,填写灵眸 API Key(推荐)或 Anthropic API Key cp .env.example .env notepad .env -# 3. 运行部署脚本(自动检测 v2rayN 代理) +# 3. 运行部署脚本(灵眸模式自动跳过代理检测) pwsh .\deploy.ps1 -# 手动指定代理端口 +# 手动指定代理端口(使用官方 Anthropic API 时需要) pwsh .\deploy.ps1 -ProxyPort 10809 # 不使用代理(直连) @@ -115,11 +115,29 @@ WSL2 Ubuntu ## 配置说明(`.env`) +### 推荐:灵眸 AI(国内直连,无需代理) + +| 变量 | 默认值 | 说明 | +|------|--------|------| +| `ANTHROPIC_AUTH_TOKEN` | _(必填)_ | 灵眸 API Key,从 [lmuai.com](https://lmuai.com) 获取 | +| `ANTHROPIC_BASE_URL` | `https://api.lmuai.com` | 灵眸 API 基础 URL | +| `CLAUDE_MODEL` | `claude-opus-4-7` | 可选:`claude-opus-4-7` / `claude-sonnet-4-5` / `claude-haiku-4-5` | + +> **灵眸模式行为**: +> - API Token 自动写入 `~/.claude/settings.json` 的 `env` 块(不写入 `~/.bashrc`,避免冲突) +> - 部署脚本自动跳过代理检测(国内直连无需代理) +> - 旧 `ANTHROPIC_API_KEY` / `ANTHROPIC_BASE_URL` 变量从 `~/.bashrc` 清除 + +### 备选:Anthropic 官方 API + | 变量 | 默认值 | 说明 | |------|--------|------| | `ANTHROPIC_API_KEY` | _(空)_ | Anthropic API Key,从 [console.anthropic.com](https://console.anthropic.com) 获取 | -| `ANTHROPIC_BASE_URL` | `https://api.anthropic.com` | API 基础 URL;中转代理可改为 DeepSeek 等兼容接口 | -| `CLAUDE_MODEL` | `claude-opus-4-5` | 默认使用的模型 | +| `ANTHROPIC_BASE_URL` | `https://api.anthropic.com` | API 基础 URL;DeepSeek 等中转可改为对应 URL | +| `CLAUDE_MODEL` | `claude-opus-4-7` | 默认使用的模型 | + +| 变量 | 默认值 | 说明 | +|------|--------|------| | `WSL_DISTRO` | `Ubuntu` | WSL2 发行版名称 | | `SKIP_WSL_INSTALL` | `false` | `true` 跳过 WSL2 安装步骤 | diff --git a/claude-dev-stack/deploy.ps1 b/claude-dev-stack/deploy.ps1 index 8dac13d..6e6988c 100644 --- a/claude-dev-stack/deploy.ps1 +++ b/claude-dev-stack/deploy.ps1 @@ -78,11 +78,15 @@ if (Test-Path $EnvFile) { } $ANTHROPIC_API_KEY = if ($Config["ANTHROPIC_API_KEY"]) { $Config["ANTHROPIC_API_KEY"] } else { "" } -$ANTHROPIC_BASE_URL = if ($Config["ANTHROPIC_BASE_URL"]) { $Config["ANTHROPIC_BASE_URL"] } else { "https://api.anthropic.com" } -$CLAUDE_MODEL = if ($Config["CLAUDE_MODEL"]) { $Config["CLAUDE_MODEL"] } else { "claude-opus-4-5" } +$ANTHROPIC_AUTH_TOKEN = if ($Config["ANTHROPIC_AUTH_TOKEN"]) { $Config["ANTHROPIC_AUTH_TOKEN"] } else { "" } +$ANTHROPIC_BASE_URL = if ($Config["ANTHROPIC_BASE_URL"]) { $Config["ANTHROPIC_BASE_URL"] } else { "https://api.lmuai.com" } +$CLAUDE_MODEL = if ($Config["CLAUDE_MODEL"]) { $Config["CLAUDE_MODEL"] } else { "claude-opus-4-7" } $WSL_DISTRO = if ($Config["WSL_DISTRO"]) { $Config["WSL_DISTRO"] } else { "Ubuntu" } $SKIP_WSL_INSTALL = if ($Config["SKIP_WSL_INSTALL"]) { $Config["SKIP_WSL_INSTALL"] } else { "false" } +# 判断认证方式:灵眸/中转用 AUTH_TOKEN,官方用 API_KEY +$UseLmuAuth = ($ANTHROPIC_AUTH_TOKEN -ne "" -and $ANTHROPIC_BASE_URL -ne "https://api.anthropic.com") + # ────────────────────────────────────────────────────────────── # Banner # ────────────────────────────────────────────────────────────── @@ -162,6 +166,13 @@ function Clear-WindowsProxy { $resolvedProxyPort = 0 +# 灵眸 AI 国内直连无需代理,主动跳过 +if ($UseLmuAuth -and $ProxyPort -ne -1) { + Write-Info "灵眸 AI 模式:国内直连,自动跳过代理配置" + Write-Info "如需为其他服务(git/npm)使用代理,请手动指定 -ProxyPort" + $ProxyPort = -1 +} + if ($ProxyPort -eq -1) { Write-Warn "已跳过代理配置(-ProxyPort -1)" } elseif ($ProxyPort -gt 0) { @@ -510,8 +521,22 @@ $mcpAllowedTools = @( "mcp__unity-mcp__unity_list_instances","mcp__unity-mcp__unity_select_instance", "mcp__unity-mcp__unity_get_project_context" ) -$claudeSettingsJson = [ordered]@{ model = $CLAUDE_MODEL; allowedTools = $mcpAllowedTools } | - ConvertTo-Json -Depth 3 +$claudeSettingsJson = if ($UseLmuAuth) { + # 灵眸 / 中转 API:使用 env.ANTHROPIC_AUTH_TOKEN(避免与 ANTHROPIC_API_KEY 冲突) + [ordered]@{ + env = [ordered]@{ + ANTHROPIC_BASE_URL = $ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN = $ANTHROPIC_AUTH_TOKEN + API_TIMEOUT_MS = "3000000" + CLAUDE_CODE_ATTRIBUTION_HEADER = "0" + } + model = $CLAUDE_MODEL + allowedTools = $mcpAllowedTools + } | ConvertTo-Json -Depth 4 +} else { + # Anthropic 官方:使用 model + allowedTools,API Key 由环境变量注入 + [ordered]@{ model = $CLAUDE_MODEL; allowedTools = $mcpAllowedTools } | ConvertTo-Json -Depth 3 +} $writeClaudeSettingsCmd = @" mkdir -p ~/.claude cat > ~/.claude/settings.json << 'SETTINGS' @@ -522,22 +547,38 @@ true Invoke-WSL $writeClaudeSettingsCmd -IgnoreError | Out-Null # 写入 bash 环境变量(WSL2 侧) -$profBlock = "" -if ($ANTHROPIC_API_KEY) { $profBlock += "export ANTHROPIC_API_KEY='$ANTHROPIC_API_KEY'\n" } -if ($ANTHROPIC_BASE_URL) { $profBlock += "export ANTHROPIC_BASE_URL='$ANTHROPIC_BASE_URL'\n" } -$profBlock += "export CLAUDE_MODEL='$CLAUDE_MODEL'\n" -$addEnvCmd = @" -if ! grep -q 'ANTHROPIC_API_KEY' ~/.bashrc 2>/dev/null; then - printf '\n# Claude Code CLI\n$profBlock' >> ~/.bashrc -fi +# 灵眸模式:auth token 已在 settings.json env 块中,清理旧 bashrc 变量避免冲突 +# 官方模式:写入 ANTHROPIC_API_KEY 到 bashrc +$cleanOldVarsCmd = @' +sed -i '/ANTHROPIC_API_KEY/d' ~/.bashrc ~/.profile 2>/dev/null || true +sed -i '/ANTHROPIC_BASE_URL/d' ~/.bashrc ~/.profile 2>/dev/null || true +sed -i '/CLAUDE_MODEL/d' ~/.bashrc ~/.profile 2>/dev/null || true +sed -i '/# Claude Code CLI/d' ~/.bashrc ~/.profile 2>/dev/null || true +true +'@ +Invoke-WSL $cleanOldVarsCmd -IgnoreError | Out-Null + +if (-not $UseLmuAuth -and $ANTHROPIC_API_KEY) { + $profBlock = "export ANTHROPIC_API_KEY='$ANTHROPIC_API_KEY'\n" + $profBlock += "export ANTHROPIC_BASE_URL='$ANTHROPIC_BASE_URL'\n" + $profBlock += "export CLAUDE_MODEL='$CLAUDE_MODEL'\n" + $addEnvCmd = @" +printf '\n# Claude Code CLI\n$profBlock' >> ~/.bashrc +true "@ -Invoke-WSL $addEnvCmd -IgnoreError | Out-Null + Invoke-WSL $addEnvCmd -IgnoreError | Out-Null +} # Windows 侧 Claude 配置 $claudeDir = "$env:USERPROFILE\.claude" if (-not (Test-Path $claudeDir)) { New-Item -ItemType Directory -Path $claudeDir | Out-Null } $claudeSettingsJson | Set-Content "$claudeDir\settings.json" -Encoding UTF8 -if ($ANTHROPIC_API_KEY) { +if ($UseLmuAuth) { + # 灵眸:token 已在 settings.json 中,清除可能冲突的 Windows 用户级变量 + [System.Environment]::SetEnvironmentVariable("ANTHROPIC_API_KEY", $null, "User") + [System.Environment]::SetEnvironmentVariable("ANTHROPIC_BASE_URL", $null, "User") + [System.Environment]::SetEnvironmentVariable("CLAUDE_MODEL", $null, "User") +} elseif ($ANTHROPIC_API_KEY) { [System.Environment]::SetEnvironmentVariable("ANTHROPIC_API_KEY", $ANTHROPIC_API_KEY, "User") [System.Environment]::SetEnvironmentVariable("ANTHROPIC_BASE_URL", $ANTHROPIC_BASE_URL, "User") [System.Environment]::SetEnvironmentVariable("CLAUDE_MODEL", $CLAUDE_MODEL, "User")