Claude Code 接入
Claude Code 是 Anthropic 的编码 Agent。它可以理解项目、修改文件、运行命令并完成多步骤开发任务。通过 Claude Code 的 LLM Gateway 能力,可以让这些请求经由 Lumoswitch 调度。
配置 API 必须启用 Anthropic 输出,目标模型也必须真实支持 Anthropic Messages 的流式响应与 Tool Use。以下 CLI 命令适用于 macOS、Linux 的 Bash / Zsh;开始前请确认 claude --version 能返回版本号。
方式总览
| 方式 | 适合什么情况 | 会写入什么 | 退出后是否保留 |
|---|---|---|---|
| 仅本次启动 | 临时测试一个地址、Key 或模型 | Lumoswitch 临时设置文件 | 否 |
| 永久使用 | 日常从终端启动 Claude Code | Claude 用户设置与可选维护启动器 | 是 |
| Claude Desktop | 在 Claude Desktop 的 Code 页面使用 | 应用单独保存的 Gateway 配置 | 是 |
CLI 和 Claude Desktop 是不同的启动入口。CLI 的临时参数不会自动变成 Desktop 配置,Desktop 也没有等价的临时启动命令,原因见下文。
准备连接信息
| 占位符 | 应填写的内容 |
|---|---|
{{api_base_url}} | 配置 API 显示的 Anthropic 请求地址,不要自行追加路径 |
{{access_key}} | 配置 API 的 Access Key |
{{model}} | 配置 API 显示的下游模型名称 |
{{claude_settings_json}} | 按有效推理能力生成的 Claude Code 设置 JSON |
{{claude_model_capabilities}} | 按所选模型生成的 Claude Code 能力声明 |
从控制台复制的命令会自动填入真实值。{{claude_settings_json}} 会同时写入完整模型列表,并且只在默认模型的有效推理能力允许时设置 effortLevel。直接使用本文模板时,不要填写上游供应商的原始模型 ID。
仅本次启动
这条命令会为新启动的 Claude Code 进程创建临时模型目录。退出 Claude Code 后文件立即删除,不会污染当前终端,也不会修改 Claude Code 原有设置。
(
set -e
LUMOSWITCH_CLAUDE_SETTINGS="$(mktemp "${TMPDIR:-/tmp}/lumoswitch-claude.XXXXXX")"
trap 'rm -f "$LUMOSWITCH_CLAUDE_SETTINGS"' EXIT
cat > "$LUMOSWITCH_CLAUDE_SETTINGS" <<'LUMOSWITCH_EOF'
{{claude_settings_json}}
LUMOSWITCH_EOF
chmod 600 "$LUMOSWITCH_CLAUDE_SETTINGS"
env \
ANTHROPIC_BASE_URL="{{api_base_url}}" \
ANTHROPIC_AUTH_TOKEN="{{access_key}}" \
ANTHROPIC_MODEL="{{model}}" \
ANTHROPIC_DEFAULT_FABLE_MODEL="{{model}}" \
ANTHROPIC_DEFAULT_OPUS_MODEL="{{model}}" \
ANTHROPIC_DEFAULT_SONNET_MODEL="{{model}}" \
ANTHROPIC_DEFAULT_HAIKU_MODEL="{{model}}" \
CLAUDE_CODE_SUBAGENT_MODEL="{{model}}" \
ANTHROPIC_CUSTOM_MODEL_OPTION="{{model}}" \
ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES="{{claude_model_capabilities}}" \
CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY="1" \
claude --settings "$LUMOSWITCH_CLAUDE_SETTINGS" --model "{{model}}"
)这里必须使用 ANTHROPIC_AUTH_TOKEN,不要替换成 ANTHROPIC_API_KEY。模型族与子 Agent 变量会让主会话、Fable / Opus / Sonnet / Haiku 别名、后台任务和子 Agent 使用同一个下游模型;Gateway discovery 从 /v1/models 读取目录,生成的能力声明只启用所选路由已核验的推理控制。
永久使用
首次设置或地址、Access Key、模型发生变化时,运行下面的完整命令。它会先保留现有 Claude Code 用户设置用于清理恢复,再写入原生持久化设置,并保存可选的 Lumoswitch 维护启动器。
永久导入会把 Access Key 保存到仅当前用户可读的受管环境或 Agent 配置文件中。请只在可信的个人设备上使用。
set -e
LUMOSWITCH_ROOT="$HOME/.config/lumoswitch/agents/claude-code"
LUMOSWITCH_ENV="$LUMOSWITCH_ROOT/env.sh"
LUMOSWITCH_LAUNCHER="$HOME/.local/bin/lumoswitch-claude-code"
mkdir -p "$LUMOSWITCH_ROOT/original" "$(dirname "$LUMOSWITCH_LAUNCHER")"
umask 077
preserve_lumoswitch_original() {
LUMOSWITCH_NATIVE_FILE="$1"
LUMOSWITCH_ORIGINAL_NAME="$2"
LUMOSWITCH_STATE="$LUMOSWITCH_ROOT/original/$LUMOSWITCH_ORIGINAL_NAME.state"
if [ -f "$LUMOSWITCH_STATE" ]; then return; fi
if [ -f "$LUMOSWITCH_NATIVE_FILE" ]; then
cp "$LUMOSWITCH_NATIVE_FILE" "$LUMOSWITCH_ROOT/original/$LUMOSWITCH_ORIGINAL_NAME"
printf '%s\n' present > "$LUMOSWITCH_STATE"
else
printf '%s\n' absent > "$LUMOSWITCH_STATE"
fi
}
if [ -f "$LUMOSWITCH_LAUNCHER" ]; then
LUMOSWITCH_BACKUP="$LUMOSWITCH_LAUNCHER.backup.$(date +%Y%m%d-%H%M%S)-$$"
cp "$LUMOSWITCH_LAUNCHER" "$LUMOSWITCH_BACKUP"
chmod 600 "$LUMOSWITCH_BACKUP"
fi
LUMOSWITCH_CLAUDE_SETTINGS="$HOME/.claude/settings.json"
mkdir -p "$(dirname "$LUMOSWITCH_CLAUDE_SETTINGS")"
preserve_lumoswitch_original "$LUMOSWITCH_CLAUDE_SETTINGS" settings
cat > "$LUMOSWITCH_CLAUDE_SETTINGS" <<'LUMOSWITCH_CONFIG_EOF'
{{claude_settings_json}}
LUMOSWITCH_CONFIG_EOF
cat > "$LUMOSWITCH_ENV" <<'LUMOSWITCH_ENV_EOF'
export ANTHROPIC_BASE_URL="{{api_base_url}}"
export ANTHROPIC_AUTH_TOKEN="{{access_key}}"
export ANTHROPIC_MODEL="{{model}}"
export ANTHROPIC_DEFAULT_FABLE_MODEL="{{model}}"
export ANTHROPIC_DEFAULT_OPUS_MODEL="{{model}}"
export ANTHROPIC_DEFAULT_SONNET_MODEL="{{model}}"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="{{model}}"
export CLAUDE_CODE_SUBAGENT_MODEL="{{model}}"
export ANTHROPIC_CUSTOM_MODEL_OPTION="{{model}}"
export ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES="{{claude_model_capabilities}}"
export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY="1"
LUMOSWITCH_ENV_EOF
case "$SHELL" in
*/zsh) LUMOSWITCH_PROFILE="$HOME/.zshrc" ;;
*/bash) LUMOSWITCH_PROFILE="$HOME/.bashrc" ;;
*) LUMOSWITCH_PROFILE="$HOME/.profile" ;;
esac
touch "$LUMOSWITCH_PROFILE"
LUMOSWITCH_PROFILE_MARKER='# Lumoswitch Agent: claude-code'
LUMOSWITCH_SOURCE_LINE='[ -f "$HOME/.config/lumoswitch/agents/claude-code/env.sh" ] && . "$HOME/.config/lumoswitch/agents/claude-code/env.sh"'
if ! grep -Fqx "$LUMOSWITCH_SOURCE_LINE" "$LUMOSWITCH_PROFILE"; then
printf '\n%s\n%s\n' "$LUMOSWITCH_PROFILE_MARKER" "$LUMOSWITCH_SOURCE_LINE" >> "$LUMOSWITCH_PROFILE"
fi
printf '%s\n' "$LUMOSWITCH_PROFILE" > "$LUMOSWITCH_ROOT/profile-path"
cat > "$LUMOSWITCH_LAUNCHER" <<'LUMOSWITCH_LAUNCHER_EOF'
#!/usr/bin/env bash
set -e
LUMOSWITCH_ROOT="$HOME/.config/lumoswitch/agents/claude-code"
LUMOSWITCH_ENV="$LUMOSWITCH_ROOT/env.sh"
LUMOSWITCH_LAUNCHER="$HOME/.local/bin/lumoswitch-claude-code"
restore_lumoswitch_original() {
LUMOSWITCH_NATIVE_FILE="$1"
LUMOSWITCH_ORIGINAL_NAME="$2"
LUMOSWITCH_STATE="$LUMOSWITCH_ROOT/original/$LUMOSWITCH_ORIGINAL_NAME.state"
if [ ! -f "$LUMOSWITCH_STATE" ]; then return; fi
if [ "$(cat "$LUMOSWITCH_STATE")" = present ]; then
mkdir -p "$(dirname "$LUMOSWITCH_NATIVE_FILE")"
cp "$LUMOSWITCH_ROOT/original/$LUMOSWITCH_ORIGINAL_NAME" "$LUMOSWITCH_NATIVE_FILE"
else
rm -f "$LUMOSWITCH_NATIVE_FILE"
fi
}
if [ "$1" = "--lumoswitch-clean" ]; then
if [ -f "$LUMOSWITCH_ROOT/profile-path" ]; then
LUMOSWITCH_PROFILE="$(cat "$LUMOSWITCH_ROOT/profile-path")"
if [ -f "$LUMOSWITCH_PROFILE" ]; then
LUMOSWITCH_PROFILE_MARKER='# Lumoswitch Agent: claude-code'
LUMOSWITCH_SOURCE_LINE='[ -f "$HOME/.config/lumoswitch/agents/claude-code/env.sh" ] && . "$HOME/.config/lumoswitch/agents/claude-code/env.sh"'
LUMOSWITCH_PROFILE_TMP="$LUMOSWITCH_PROFILE.lumoswitch.$$"
awk -v marker="$LUMOSWITCH_PROFILE_MARKER" -v source="$LUMOSWITCH_SOURCE_LINE" '$0 != marker && $0 != source' "$LUMOSWITCH_PROFILE" > "$LUMOSWITCH_PROFILE_TMP"
mv "$LUMOSWITCH_PROFILE_TMP" "$LUMOSWITCH_PROFILE"
fi
fi
restore_lumoswitch_original "$HOME/.claude/settings.json" settings
if [ -d "$LUMOSWITCH_ROOT" ]; then
find "$LUMOSWITCH_ROOT" -depth \( -type f -o -type l \) -delete
find "$LUMOSWITCH_ROOT" -depth -type d -exec rmdir {} \; 2>/dev/null || true
fi
find "$(dirname "$LUMOSWITCH_LAUNCHER")" -maxdepth 1 -type f -name 'lumoswitch-claude-code.backup.*' -delete
rm -f "$LUMOSWITCH_LAUNCHER"
printf '%s\n' 'Lumoswitch native setup and optional launcher removed. Open a new terminal to refresh the environment.'
exit 0
fi
if [ -f "$LUMOSWITCH_ENV" ]; then . "$LUMOSWITCH_ENV"; fi
exec claude "$@"
LUMOSWITCH_LAUNCHER_EOF
chmod 600 "$LUMOSWITCH_ENV"
find "$LUMOSWITCH_ROOT" -type f -exec chmod 600 {} \;
chmod 700 "$LUMOSWITCH_LAUNCHER"
. "$LUMOSWITCH_ENV"
printf '%s\n' 'Native Lumoswitch setup saved. Future command: claude'
printf '%s\n' 'Optional maintenance launcher: ~/.local/bin/lumoswitch-claude-code'
claude以后在任意项目目录运行:
claude原生 claude 命令会直接读取受管设置与环境,不显示 Access Key。更新时会保留一份带时间戳、权限为 0600 的旧维护启动器备份,再以 0700 权限写入新文件。
Windows PowerShell 原生导入
以下命令在 Windows PowerShell 中原生运行,不需要 WSL。它们与本页的 macOS/Linux 模板使用同一组连接值。
仅本次使用(Windows)
& {
$ErrorActionPreference = 'Stop'
$lumoswitchConfig = Join-Path ([IO.Path]::GetTempPath()) ('lumoswitch-' + [Guid]::NewGuid().ToString('N') + '.json')
$lumoswitchConfigContent = @'
{{claude_settings_json}}
'@
[IO.File]::WriteAllText($lumoswitchConfig, $lumoswitchConfigContent, [Text.UTF8Encoding]::new($false))
$lumoswitchEnvironmentNames = @('ANTHROPIC_BASE_URL', 'ANTHROPIC_AUTH_TOKEN', 'ANTHROPIC_MODEL', 'ANTHROPIC_DEFAULT_FABLE_MODEL', 'ANTHROPIC_DEFAULT_OPUS_MODEL', 'ANTHROPIC_DEFAULT_SONNET_MODEL', 'ANTHROPIC_DEFAULT_HAIKU_MODEL', 'CLAUDE_CODE_SUBAGENT_MODEL', 'ANTHROPIC_CUSTOM_MODEL_OPTION', 'ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES', 'CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY')
$lumoswitchPreviousEnvironment = @{}
foreach ($lumoswitchName in $lumoswitchEnvironmentNames) {
$lumoswitchPreviousEnvironment[$lumoswitchName] = [Environment]::GetEnvironmentVariable($lumoswitchName, 'Process')
}
$lumoswitchExitCode = 0
try {
[Environment]::SetEnvironmentVariable('ANTHROPIC_BASE_URL', '{{api_base_url}}', 'Process')
[Environment]::SetEnvironmentVariable('ANTHROPIC_AUTH_TOKEN', '{{access_key}}', 'Process')
[Environment]::SetEnvironmentVariable('ANTHROPIC_MODEL', '{{model}}', 'Process')
[Environment]::SetEnvironmentVariable('ANTHROPIC_DEFAULT_FABLE_MODEL', '{{model}}', 'Process')
[Environment]::SetEnvironmentVariable('ANTHROPIC_DEFAULT_OPUS_MODEL', '{{model}}', 'Process')
[Environment]::SetEnvironmentVariable('ANTHROPIC_DEFAULT_SONNET_MODEL', '{{model}}', 'Process')
[Environment]::SetEnvironmentVariable('ANTHROPIC_DEFAULT_HAIKU_MODEL', '{{model}}', 'Process')
[Environment]::SetEnvironmentVariable('CLAUDE_CODE_SUBAGENT_MODEL', '{{model}}', 'Process')
[Environment]::SetEnvironmentVariable('ANTHROPIC_CUSTOM_MODEL_OPTION', '{{model}}', 'Process')
[Environment]::SetEnvironmentVariable('ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES', '{{claude_model_capabilities}}', 'Process')
[Environment]::SetEnvironmentVariable('CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY', '1', 'Process')
$lumoswitchArguments = @('--settings', $lumoswitchConfig, '--model', '{{model}}')
$lumoswitchExecutable = Get-Command 'claude.cmd' -CommandType Application -ErrorAction SilentlyContinue
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'claude' -CommandType Application -ErrorAction Stop }
& $lumoswitchExecutable.Path @lumoswitchArguments
if ($null -ne $LASTEXITCODE) { $lumoswitchExitCode = $LASTEXITCODE }
} finally {
foreach ($lumoswitchName in $lumoswitchEnvironmentNames) {
[Environment]::SetEnvironmentVariable($lumoswitchName, $lumoswitchPreviousEnvironment[$lumoswitchName], 'Process')
}
Remove-Item -LiteralPath $lumoswitchConfig -Force -ErrorAction SilentlyContinue
}
if ($lumoswitchExitCode -ne 0) { throw 'claude exited with code ' + $lumoswitchExitCode }
}永久使用(Windows)
该命令会备份已有的 Lumoswitch 专用文件,并为配置和启动器收紧当前用户的访问权限。
& {
$ErrorActionPreference = 'Stop'
$lumoswitchRoot = Join-Path $env:LOCALAPPDATA 'Lumoswitch\agents\claude-code'
$lumoswitchLauncher = Join-Path $env:LOCALAPPDATA 'Lumoswitch\bin\lumoswitch-claude-code.ps1'
$lumoswitchBackupSuffix = (Get-Date -Format 'yyyyMMdd-HHmmss') + '-' + $PID
function Protect-LumoswitchFile([string] $Path) {
$lumoswitchSid = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value
& icacls.exe $Path '/inheritance:r' '/grant:r' ('*' + $lumoswitchSid + ':(F)') '*S-1-5-18:(F)' '*S-1-5-32-544:(F)' | Out-Null
if ($LASTEXITCODE -ne 0) { throw "Could not restrict access to $Path" }
}
function Install-LumoswitchFile([string] $Path, [string] $Content) {
[IO.Directory]::CreateDirectory((Split-Path -Parent $Path)) | Out-Null
if (Test-Path -LiteralPath $Path) {
$lumoswitchItem = Get-Item -LiteralPath $Path -Force
if ($lumoswitchItem.PSIsContainer -or ($lumoswitchItem.Attributes -band [IO.FileAttributes]::ReparsePoint)) {
throw "Lumoswitch refused to replace a directory or link: $Path"
}
$lumoswitchBackup = $Path + '.backup.' + $lumoswitchBackupSuffix
Copy-Item -LiteralPath $Path -Destination $lumoswitchBackup
Protect-LumoswitchFile $lumoswitchBackup
}
$lumoswitchTemporary = $Path + '.' + [Guid]::NewGuid().ToString('N') + '.tmp'
try {
[IO.File]::WriteAllText($lumoswitchTemporary, $Content, [Text.UTF8Encoding]::new($false))
Move-Item -LiteralPath $lumoswitchTemporary -Destination $Path -Force
Protect-LumoswitchFile $Path
} finally {
Remove-Item -LiteralPath $lumoswitchTemporary -Force -ErrorAction SilentlyContinue
}
}
function Preserve-LumoswitchOriginal([string] $Path, [string] $Name) {
$lumoswitchOriginalRoot = Join-Path $lumoswitchRoot 'original'
$lumoswitchState = Join-Path $lumoswitchOriginalRoot ($Name + '.state')
if (Test-Path -LiteralPath $lumoswitchState -PathType Leaf) { return }
[IO.Directory]::CreateDirectory($lumoswitchOriginalRoot) | Out-Null
if (Test-Path -LiteralPath $Path -PathType Leaf) {
$lumoswitchOriginal = Join-Path $lumoswitchOriginalRoot $Name
Copy-Item -LiteralPath $Path -Destination $lumoswitchOriginal
Protect-LumoswitchFile $lumoswitchOriginal
[IO.File]::WriteAllText($lumoswitchState, 'present', [Text.UTF8Encoding]::new($false))
} else {
[IO.File]::WriteAllText($lumoswitchState, 'absent', [Text.UTF8Encoding]::new($false))
}
Protect-LumoswitchFile $lumoswitchState
}
[IO.Directory]::CreateDirectory($lumoswitchRoot) | Out-Null
$lumoswitchConfig = Join-Path $HOME '.claude\settings.json'
Preserve-LumoswitchOriginal $lumoswitchConfig 'settings'
$lumoswitchConfigContent = @'
{{claude_settings_json}}
'@
Install-LumoswitchFile $lumoswitchConfig $lumoswitchConfigContent
$lumoswitchEnvironment = [ordered]@{}
$lumoswitchEnvironment['ANTHROPIC_BASE_URL'] = '{{api_base_url}}'
$lumoswitchEnvironment['ANTHROPIC_AUTH_TOKEN'] = '{{access_key}}'
$lumoswitchEnvironment['ANTHROPIC_MODEL'] = '{{model}}'
$lumoswitchEnvironment['ANTHROPIC_DEFAULT_FABLE_MODEL'] = '{{model}}'
$lumoswitchEnvironment['ANTHROPIC_DEFAULT_OPUS_MODEL'] = '{{model}}'
$lumoswitchEnvironment['ANTHROPIC_DEFAULT_SONNET_MODEL'] = '{{model}}'
$lumoswitchEnvironment['ANTHROPIC_DEFAULT_HAIKU_MODEL'] = '{{model}}'
$lumoswitchEnvironment['CLAUDE_CODE_SUBAGENT_MODEL'] = '{{model}}'
$lumoswitchEnvironment['ANTHROPIC_CUSTOM_MODEL_OPTION'] = '{{model}}'
$lumoswitchEnvironment['ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES'] = '{{claude_model_capabilities}}'
$lumoswitchEnvironment['CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY'] = '1'
foreach ($lumoswitchEntry in $lumoswitchEnvironment.GetEnumerator()) {
[Environment]::SetEnvironmentVariable($lumoswitchEntry.Key, $lumoswitchEntry.Value, 'User')
[Environment]::SetEnvironmentVariable($lumoswitchEntry.Key, $lumoswitchEntry.Value, 'Process')
}
$lumoswitchLauncherContent = @'
param([Parameter(ValueFromRemainingArguments = $true)][string[]] $AgentArgs)
$ErrorActionPreference = 'Stop'
$lumoswitchRoot = Join-Path $env:LOCALAPPDATA 'Lumoswitch\agents\claude-code'
$lumoswitchLauncher = Join-Path $env:LOCALAPPDATA 'Lumoswitch\bin\lumoswitch-claude-code.ps1'
function Remove-LumoswitchFile([string] $Path) {
if (-not (Test-Path -LiteralPath $Path)) { return }
$lumoswitchItem = Get-Item -LiteralPath $Path -Force
if ($lumoswitchItem.PSIsContainer -or ($lumoswitchItem.Attributes -band [IO.FileAttributes]::ReparsePoint)) {
throw "Lumoswitch refused to remove a directory or link: $Path"
}
Remove-Item -LiteralPath $Path -Force
}
function Restore-LumoswitchOriginal([string] $Path, [string] $Name) {
$lumoswitchOriginalRoot = Join-Path $lumoswitchRoot 'original'
$lumoswitchState = Join-Path $lumoswitchOriginalRoot ($Name + '.state')
if (-not (Test-Path -LiteralPath $lumoswitchState -PathType Leaf)) { return }
if ((Get-Content -LiteralPath $lumoswitchState -Raw).Trim() -eq 'present') {
[IO.Directory]::CreateDirectory((Split-Path -Parent $Path)) | Out-Null
Copy-Item -LiteralPath (Join-Path $lumoswitchOriginalRoot $Name) -Destination $Path -Force
} else {
Remove-LumoswitchFile $Path
}
}
if ($AgentArgs.Count -gt 0 -and $AgentArgs[0] -eq '--lumoswitch-clean') {
foreach ($lumoswitchName in @('ANTHROPIC_BASE_URL', 'ANTHROPIC_AUTH_TOKEN', 'ANTHROPIC_MODEL', 'ANTHROPIC_DEFAULT_FABLE_MODEL', 'ANTHROPIC_DEFAULT_OPUS_MODEL', 'ANTHROPIC_DEFAULT_SONNET_MODEL', 'ANTHROPIC_DEFAULT_HAIKU_MODEL', 'CLAUDE_CODE_SUBAGENT_MODEL', 'ANTHROPIC_CUSTOM_MODEL_OPTION', 'ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES', 'CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY')) {
[Environment]::SetEnvironmentVariable($lumoswitchName, $null, 'User')
[Environment]::SetEnvironmentVariable($lumoswitchName, $null, 'Process')
}
Restore-LumoswitchOriginal (Join-Path $HOME '.claude\settings.json') 'settings'
# No external Lumoswitch file needs removal.
if (Test-Path -LiteralPath $lumoswitchRoot -PathType Container) {
$lumoswitchRootItem = Get-Item -LiteralPath $lumoswitchRoot -Force
if ($lumoswitchRootItem.Attributes -band [IO.FileAttributes]::ReparsePoint) { throw 'Lumoswitch refused to clean through a linked directory.' }
foreach ($lumoswitchFile in @(Get-ChildItem -LiteralPath $lumoswitchRoot -File -Recurse -Force)) { Remove-LumoswitchFile $lumoswitchFile.FullName }
foreach ($lumoswitchDirectory in @(Get-ChildItem -LiteralPath $lumoswitchRoot -Directory -Recurse -Force | Sort-Object FullName -Descending)) {
if ($null -eq (Get-ChildItem -LiteralPath $lumoswitchDirectory.FullName -Force | Select-Object -First 1)) { Remove-Item -LiteralPath $lumoswitchDirectory.FullName -Force }
}
if ($null -eq (Get-ChildItem -LiteralPath $lumoswitchRoot -Force | Select-Object -First 1)) { Remove-Item -LiteralPath $lumoswitchRoot -Force }
}
$lumoswitchBin = Split-Path -Parent $lumoswitchLauncher
if (Test-Path -LiteralPath $lumoswitchBin -PathType Container) {
foreach ($lumoswitchBackup in @(Get-ChildItem -LiteralPath $lumoswitchBin -Filter 'lumoswitch-claude-code.ps1.backup.*' -File -Force)) { Remove-LumoswitchFile $lumoswitchBackup.FullName }
}
Remove-LumoswitchFile $lumoswitchLauncher
Write-Host 'Lumoswitch native setup and optional launcher removed. Open a new terminal to refresh the environment.'
exit 0
}
$lumoswitchEnvironment = [ordered]@{}
$lumoswitchEnvironment['ANTHROPIC_BASE_URL'] = '{{api_base_url}}'
$lumoswitchEnvironment['ANTHROPIC_AUTH_TOKEN'] = '{{access_key}}'
$lumoswitchEnvironment['ANTHROPIC_MODEL'] = '{{model}}'
$lumoswitchEnvironment['ANTHROPIC_DEFAULT_FABLE_MODEL'] = '{{model}}'
$lumoswitchEnvironment['ANTHROPIC_DEFAULT_OPUS_MODEL'] = '{{model}}'
$lumoswitchEnvironment['ANTHROPIC_DEFAULT_SONNET_MODEL'] = '{{model}}'
$lumoswitchEnvironment['ANTHROPIC_DEFAULT_HAIKU_MODEL'] = '{{model}}'
$lumoswitchEnvironment['CLAUDE_CODE_SUBAGENT_MODEL'] = '{{model}}'
$lumoswitchEnvironment['ANTHROPIC_CUSTOM_MODEL_OPTION'] = '{{model}}'
$lumoswitchEnvironment['ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES'] = '{{claude_model_capabilities}}'
$lumoswitchEnvironment['CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY'] = '1'
foreach ($lumoswitchEntry in $lumoswitchEnvironment.GetEnumerator()) {
[Environment]::SetEnvironmentVariable($lumoswitchEntry.Key, $lumoswitchEntry.Value, 'Process')
}
$lumoswitchExecutable = Get-Command 'claude.cmd' -CommandType Application -ErrorAction SilentlyContinue
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'claude.exe' -CommandType Application -ErrorAction SilentlyContinue }
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'claude' -CommandType Application -ErrorAction Stop }
$lumoswitchArguments = @()
& $lumoswitchExecutable.Path @lumoswitchArguments @AgentArgs
if ($null -ne $LASTEXITCODE) { exit $LASTEXITCODE }
'@
Install-LumoswitchFile $lumoswitchLauncher $lumoswitchLauncherContent
Write-Host 'Native Lumoswitch setup saved. Future command: claude'
Write-Host 'Optional maintenance launcher:' $lumoswitchLauncher
$lumoswitchExecutable = Get-Command 'claude.cmd' -CommandType Application -ErrorAction SilentlyContinue
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'claude.exe' -CommandType Application -ErrorAction SilentlyContinue }
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'claude' -CommandType Application -ErrorAction Stop }
$lumoswitchArguments = @()
& $lumoswitchExecutable.Path @lumoswitchArguments
if ($null -ne $LASTEXITCODE -and $LASTEXITCODE -ne 0) { throw 'claude exited with code ' + $LASTEXITCODE }
}导入会写入 Agent 支持的持久化配置,并直接启动 claude。保存的 Lumoswitch 维护脚本不是启动 Agent 的必需入口;需要恢复或移除此接入时,运行它并追加 --lumoswitch-clean。
清除 Lumoswitch 接入
Windows PowerShell
先退出该 Agent 的所有 Lumoswitch 会话,再运行下面的命令。可选维护启动器会删除受管原生配置、恢复已保留的共享文件、清除 Lumoswitch 用户环境变量,并移除自身。
& {
$lumoswitchLauncher = Join-Path $env:LOCALAPPDATA 'Lumoswitch\bin\lumoswitch-claude-code.ps1'
if (-not (Test-Path -LiteralPath $lumoswitchLauncher -PathType Leaf)) {
throw 'The optional Lumoswitch maintenance launcher is missing. Run persistent import again before cleanup.'
}
& powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File $lumoswitchLauncher --lumoswitch-clean
}macOS / Linux
下面的命令会停用 CLI 永久接入,恢复已保留的 Claude 用户设置,并清除受管环境与可选维护启动器。它不会删除 Claude Code 的账号、会话、项目记忆或原有配置。
"$HOME/.local/bin/lumoswitch-claude-code" --lumoswitch-clean临时命令的变量只属于 Claude Code 子进程,退出后无需清理。清除后直接运行 claude,即可回到 Claude Code 原来的登录或提供方配置。
Claude Desktop 与 IDE
Claude Desktop
Claude Desktop 的 Code 页面是官方图形界面,但不会读取上面的 CLI 启动参数。需要在 Developer → Configure Third-Party Inference 中单独选择 Gateway,并填写 Lumoswitch 的地址、Access Key 和下游模型名称。
这里仅提供永久接入,没有临时命令:Desktop 从应用自身的持久配置启动,不接受 claude --model ... 这类单次 CLI 参数。要清除时,也必须在 Desktop 的第三方推理设置中恢复默认提供方或移除 Gateway;删除 CLI 启动器不会清除 Desktop 配置。
此入口要求 Gateway 支持 POST /v1/messages、流式输出与 Tool Use。普通 Claude Chat / Cowork 不等同于 Claude Code。参见 Claude Desktop Gateway。
VS Code 与 JetBrains
Claude Code 提供官方 VS Code 和 JetBrains 集成。临时命令只影响它启动的 CLI 进程;永久导入后请重启 IDE,使集成终端和图形界面继承原生设置与受管环境。
Claude Code 的 CLI 与 IDE 扩展共享 ~/.claude/settings.json。永久导入会先完整保留原文件,再仅在 Lumoswitch 启用期间替换它,清理时精确恢复;临时导入不会修改该文件。若之后在 IDE 专属设置中另存了 Lumoswitch 环境变量,断开时还需单独删除对应项。参见 Claude Code IDE 集成。
验证与排查
- Base URL 使用配置 API 给出的地址,不要自行追加
/v1或/messages。 - 如果仍出现 Claude 登录,确认没有把
ANTHROPIC_AUTH_TOKEN写成ANTHROPIC_API_KEY。 - 协议转换不能补齐模型缺失的工具能力,正式使用前应验证流式输出、文件编辑和子 Agent。
参考:LLM Gateway、模型配置和环境变量。
维护者发布字段
- 平台 ID:
claude-code - 展示名称:
Claude Code CLI - 下游协议:
anthropic commandTemplate:复制「仅本次启动」代码框的完整内容- 永久策略:
native persistentCommandTemplate:复制「永久使用」代码框的完整内容futureCommand:claude- 展示顺序:
20 - 最近核验:
2026-08-27