LiteLLM + Claude Code 双窗口启动脚本
版本一:基础版(简单可靠)
@echo off chcp 65001 >nul title Claude Code Launcher echo ======================================== echo 启动 Claude Code 本地模型环境 echo ======================================== echo. :: 检查 Ollama 服务 echo [1/3] 检查 Ollama 服务... curl -s http://localhost:11434/api/tags >nul 2>&1 if errorlevel 1 ( echo [警告] Ollama 服务未运行,正在启动... start "Ollama" cmd /k "ollama serve" echo 等待 Ollama 启动... timeout /t 5 /nobreak >nul ) else ( echo [OK] Ollama 服务已运行 ) echo. echo [2/3] 启动 LiteLLM 服务... :: 启动 LiteLLM 并等待服务就绪 start "LiteLLM" cmd /k "litellm --config C:\Users\xxxxxx\litellm_config.yaml --port 4000 --debug" :: 等待 LiteLLM 服务启动 echo 等待 LiteLLM 服务启动... set MAX_RETRIES=30 set RETRY_COUNT=0 set SERVICE_READY=0 :wait_litellm set /a RETRY_COUNT+=1 timeout /t 2 /nobreak >nul curl -s http://localhost:4000/health >nul 2>&1 if not errorlevel 1 ( set SERVICE_READY=1 echo [OK] LiteLLM 服务已就绪 goto service_ready ) if %RETRY_COUNT% lss %MAX_RETRIES% ( goto wait_litellm ) echo [错误] LiteLLM 服务启动超时 echo 请检查配置文件和端口是否被占用 pause exit /b 1 :service_ready echo. echo [3/3] 启动 Claude Code... :: 设置环境变量并启动 Claude Code set ANTHROPIC_BASE_URL=http://localhost:4000 set ANTHROPIC_AUTH_TOKEN=dummy set CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 :: 在新窗口中启动 Claude Code start "Claude Code" cmd /k "set ANTHROPIC_BASE_URL=http://localhost:4000 && set ANTHROPIC_AUTH_TOKEN=dummy && set CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 && claude --model claude-3-sonnet-20240620" echo. echo ======================================== echo 启动完成! echo - LiteLLM 服务窗口: 请保持运行 echo - Claude Code 窗口: 可以使用 echo ======================================== echo. echo 按任意键关闭此窗口... pause >nul版本二:增强版(带日志和错误处理)
@echo off chcp 65001 >nul title Claude Code Launcher with Logging :: 设置日志文件 set LOG_FILE=%USERPROFILE%\claude_launcher.log echo [%date% %time%] 启动脚本开始 > %LOG_FILE% echo ======================================== echo 启动 Claude Code 本地模型环境 echo ======================================== echo. echo 日志文件: %LOG_FILE% echo. :: 函数:写入日志 :log echo [%time%] %~1 >> %LOG_FILE% if not "%~2"=="silent" echo %~1 goto :eof :: 检查管理员权限 net session >nul 2>&1 if errorlevel 1 ( call :log "[警告] 未以管理员身份运行,可能影响端口绑定" warning ) :: 检查 Ollama 服务 call :log "[1/3] 检查 Ollama 服务..." silent curl -s http://localhost:11434/api/tags >nul 2>&1 if errorlevel 1 ( call :log "[警告] Ollama 服务未运行,正在启动..." warning start "Ollama" cmd /k "ollama serve" call :log "等待 Ollama 启动..." timeout /t 5 /nobreak >nul :: 再次检查 curl -s http://localhost:11434/api/tags >nul 2>&1 if errorlevel 1 ( call :log "[错误] Ollama 服务启动失败" error echo. echo 请手动运行: ollama serve pause exit /b 1 ) else ( call :log "[OK] Ollama 服务启动成功" ) ) else ( call :log "[OK] Ollama 服务已运行" ) echo. :: 检查端口是否被占用 call :log "[2/3] 检查端口 4000..." silent netstat -ano | findstr :4000 >nul if not errorlevel 1 ( call :log "[警告] 端口 4000 已被占用" warning echo 正在尝试清理端口... for /f "tokens=5" %%a in ('netstat -ano ^| findstr :4000') do ( taskkill /F /PID %%a >nul 2>&1 ) timeout /t 2 /nobreak >nul call :log "[OK] 端口已清理" ) else ( call :log "[OK] 端口 4000 可用" ) :: 检查配置文件 call :log "[3/5] 检查配置文件..." silent if not exist "C:\Users\xxxxxx\litellm_config.yaml" ( call :log "[错误] 配置文件不存在: C:\Users\xxxxxx\litellm_config.yaml" error echo. echo 请确认配置文件路径是否正确 pause exit /b 1 ) else ( call :log "[OK] 配置文件存在" ) echo. :: 启动 LiteLLM 服务 call :log "[4/5] 启动 LiteLLM 服务..." start "LiteLLM" cmd /k "litellm --config C:\Users\xxxxxx\litellm_config.yaml --port 4000 --debug 2>&1 | tee %USERPROFILE%\litellm.log" :: 等待 LiteLLM 服务启动(更健壮的检测) call :log "等待 LiteLLM 服务启动..." silent set MAX_RETRIES=60 set RETRY_COUNT=0 set SERVICE_READY=0 :wait_litellm set /a RETRY_COUNT+=1 timeout /t 1 /nobreak >nul :: 尝试多种健康检查方式 curl -s http://localhost:4000/health >nul 2>&1 if not errorlevel 1 ( set SERVICE_READY=1 call :log "[OK] LiteLLM 服务已就绪 (健康检查通过)" goto service_ready ) :: 备用检查:尝试访问根路径 curl -s http://localhost:4000/ >nul 2>&1 if not errorlevel 1 ( set SERVICE_READY=1 call :log "[OK] LiteLLM 服务已就绪 (根路径检查通过)" goto service_ready ) if %RETRY_COUNT% lss %MAX_RETRIES% ( if %RETRY_COUNT% equ 10 call :log " 仍在等待... (已等待10秒)" if %RETRY_COUNT% equ 20 call :log " 仍在等待... (已等待20秒)" if %RETRY_COUNT% equ 30 call :log " 仍在等待... (已等待30秒)" goto wait_litellm ) call :log "[错误] LiteLLM 服务启动超时 (已等待 %MAX_RETRIES% 秒)" error echo. echo 可能的原因: echo 1. 配置文件格式错误 echo 2. Python 依赖缺失 echo 3. 端口被占用 echo. echo 请查看 LiteLLM 窗口的错误信息 echo. pause exit /b 1 :service_ready :: 测试 LiteLLM 是否真的可以处理请求 call :log "[5/5] 测试 LiteLLM API..." silent curl -s -X POST http://localhost:4000/v1/chat/completions ^ -H "Content-Type: application/json" ^ -d "{\"model\":\"claude-3-sonnet-20240620\",\"messages\":[{\"role\":\"user\",\"content\":\"test\"}],\"max_tokens\":5}" >nul 2>&1 if errorlevel 1 ( call :log "[警告] LiteLLM API 测试失败,但服务已启动" warning ) else ( call :log "[OK] LiteLLM API 测试通过" ) echo. :: 启动 Claude Code call :log "启动 Claude Code..." set ANTHROPIC_BASE_URL=http://localhost:4000 set ANTHROPIC_AUTH_TOKEN=dummy set CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 :: 创建临时脚本文件以确保环境变量生效 set TEMP_SCRIPT=%TEMP%\claude_code_%RANDOM%.bat ( echo @echo off echo title Claude Code ^(Local Model^) echo echo ======================================== echo echo Claude Code 已连接到本地 LiteLLM echo echo ======================================== echo echo. echo echo 当前配置: echo echo API URL: http://localhost:4000 echo echo 模型: claude-3-sonnet-20240620 echo echo. echo echo ======================================== echo echo. echo set ANTHROPIC_BASE_URL=http://localhost:4000 echo set ANTHROPIC_AUTH_TOKEN=dummy echo set CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 echo claude --model claude-3-sonnet-20240620 echo echo. echo echo Claude Code 已退出,按任意键关闭... echo pause ) > "%TEMP_SCRIPT%" start "Claude Code" cmd /k "call "%TEMP_SCRIPT%"" echo. echo ======================================== echo 启动完成! echo ======================================== echo. echo LiteLLM 服务窗口: 请保持运行,不要关闭 echo Claude Code 窗口: 可以使用,输入 /model 确认模型 echo. echo 日志文件: %LOG_FILE% echo. echo 按任意键关闭此窗口(不会影响已启动的服务)... pause >nul :: 清理临时文件 del "%TEMP_SCRIPT%" 2>nul版本三:一键启动版(带托盘图标)
@echo off chcp 65001 >nul title Claude Code Service Manager :: 定义颜色 set "GREEN=[92m" set "RED=[91m" set "YELLOW=[93m" set "BLUE=[94m" set "RESET=[0m" echo %BLUE%╔══════════════════════════════════════════════════════════╗%RESET% echo %BLUE%║ Claude Code + LiteLLM 本地模型启动器 ║%RESET% echo %BLUE%╚══════════════════════════════════════════════════════════╝%RESET% echo. :: 检查 Python 环境 python --version >nul 2>&1 if errorlevel 1 ( echo %RED%[错误] 未找到 Python,请安装 Python 3.8+%RESET% pause exit /b 1 ) :: 检查 pip 包 pip show litellm >nul 2>&1 if errorlevel 1 ( echo %YELLOW%[提示] LiteLLM 未安装,正在安装...%RESET% pip install 'litellm[proxy]' if errorlevel 1 ( echo %RED%[错误] LiteLLM 安装失败%RESET% pause exit /b 1 ) ) :: 停止现有服务(可选) echo 是否停止现有服务?(Y/N) choice /c YN /n /m "选择: " if errorlevel 2 goto :start_services if errorlevel 1 ( echo 正在停止现有服务... taskkill /F /FI "WINDOWTITLE eq LiteLLM*" >nul 2>&1 taskkill /F /FI "WINDOWTITLE eq Claude Code*" >nul 2>&1 timeout /t 2 /nobreak >nul ) :start_services :: 确保 Ollama 运行 start "Ollama Service" cmd /k "ollama serve" timeout /t 3 /nobreak >nul :: 启动 LiteLLM(最小化窗口) start "LiteLLM" cmd /k "title LiteLLM Service && litellm --config C:\Users\xxxxxx\litellm_config.yaml --port 4000 --debug" :: 等待服务就绪 echo %YELLOW%等待 LiteLLM 服务启动...%RESET% set WAIT_COUNT=0 :wait_loop timeout /t 2 /nobreak >nul set /a WAIT_COUNT+=1 curl -s http://localhost:4000/health >nul 2>&1 if not errorlevel 1 ( echo %GREEN%LiteLLM 服务已就绪!%RESET% goto :start_claude ) if %WAIT_COUNT% lss 15 goto :wait_loop echo %RED%服务启动超时,但将继续启动 Claude Code%RESET% :start_claude :: 创建快捷启动脚本 set CLAUDE_SCRIPT=%TEMP%\claude_temp.bat ( echo @echo off echo title Claude Code ^(Connected to LiteLLM^) echo set ANTHROPIC_BASE_URL=http://localhost:4000 echo set ANTHROPIC_AUTH_TOKEN=dummy echo set CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 echo echo %GREEN%已连接到 LiteLLM 服务%RESET% echo echo. echo claude --model claude-3-sonnet-20240620 echo if errorlevel 1 ^( echo echo %RED%Claude Code 启动失败%RESET% echo echo 请确认: 1. LiteLLM 服务正在运行 2. 模型名称正确 echo pause echo ^) ) > "%CLAUDE_SCRIPT%" start "Claude Code" cmd /k "call "%CLAUDE_SCRIPT%"" echo. echo %GREEN%========================================%RESET% echo %GREEN% 所有服务已启动!%RESET% echo %GREEN%========================================%RESET% echo. echo 服务状态: echo [√] LiteLLM 服务窗口已打开 echo [√] Claude Code 窗口已打开 echo. echo 使用说明: echo 1. 保持所有窗口运行 echo 2. 在 Claude Code 中输入 /model 确认模型 echo 3. 测试: "写一个 Hello World 程序" echo. echo %YELLOW%按任意键关闭此管理器%RESET% pause >nul :: 清理临时文件 del "%CLAUDE_SCRIPT%" 2>nul使用说明
准备工作
将上述任一脚本保存为
.bat文件,例如:start_claude_lite.bat(版本一)start_claude_advanced.bat(版本二)start_claude_manager.bat(版本三)
确保 LiteLLM 配置文件存在:
C:\Users\xxxxxx\litellm_config.yaml确认 Ollama 已安装并有所需模型:
ollama list# 确保有 qwen2.5-coder:7b 或其他模型
运行脚本
# 直接双击运行,或右键选择"以管理员身份运行"start_claude_lite.bat版本选择建议
| 版本 | 特点 | 适用场景 |
|---|---|---|
| 版本一 | 简洁、稳定 | 日常使用,快速启动 |
| 版本二 | 详细日志、错误处理 | 首次配置,排查问题 |
| 版本三 | 交互式选择、服务管理 | 需要手动控制服务的场景 |
脚本功能说明
所有版本都实现了:
- ✅ 先启动 LiteLLM 服务(第一个 CMD 窗口)
- ✅ 等待服务就绪(健康检查)
- ✅ 服务成功后启动 Claude Code(第二个 CMD 窗口)
- ✅ 自动设置所需的环境变量
版本二额外功能:
- 详细的启动日志
- 端口占用检测和清理
- 配置文件验证
- API 功能测试
- 临时文件自动清理
版本三额外功能:
- Python 环境检查
- LiteLLM 包自动安装
- 服务状态管理
- 彩色输出显示
注意事项
首次运行可能需要管理员权限(用于端口检测和清理)
如果 LiteLLM 服务启动失败,脚本会提示错误信息,请检查:
- 配置文件格式是否正确
- 端口 4000 是否被占用
- Python 依赖是否完整
关闭方式:
- 先关闭 Claude Code 窗口
- 再关闭 LiteLLM 服务窗口
- 管理器窗口可随时关闭
选择你喜欢的版本保存为.bat文件,双击运行即可!
