# AI Stack 这个项目用 Docker Compose 组合了三个服务: - LiteLLM:作为统一的模型代理层,对外提供 OpenAI 兼容接口 - Open WebUI:作为 Web 端聊天界面,直接连接 LiteLLM - Jupyter:作为 Open WebUI Code Interpreter 的 Python 执行环境,用于生成 Excel 等文件 当前仓库的核心目标,是基于 Gemini 系列模型快速搭一套可本地运行的 AI 网关与聊天界面。 ## 目录结构 - docker-compose.yml:服务编排文件 - litellm/config.yaml:LiteLLM 模型映射与回退策略配置 - .env:本地环境变量文件,至少需要配置 Gemini API Key - app/:预留目录,当前未使用 - open_webui/:Open WebUI 的 Windows 服务配置目录 - install.ps1:Windows 服务安装/卸载/启停脚本(WinSW) - litellm/litellm-service.xml:LiteLLM 的 WinSW 服务配置 - open_webui/openwebui-service.xml:Open WebUI 的 WinSW 服务配置 ## 服务说明 ### 1. LiteLLM LiteLLM 容器暴露 4000 端口,对外提供 OpenAI 兼容接口。 当前配置特点: - 通过环境变量 GEMINI_API_KEY 访问 Gemini 模型 - 读取 litellm/config.yaml 中定义的模型别名 - 为部分高阶模型配置了 fallback,当主模型不可用时自动降级到可用模型 - 容器内默认带有 HTTP_PROXY、HTTPS_PROXY、ALL_PROXY 配置,适合需要代理访问外网模型接口的环境 ### 2. Open WebUI Open WebUI 容器映射到本机 3000 端口。 当前配置特点: - 通过 OPENAI_API_BASE_URL 指向 LiteLLM 的 OpenAI 兼容接口 - OPENAI_API_KEY 使用占位值 dummy,仅用于满足 Open WebUI 接口配置要求 - WEBUI_AUTH=false,默认关闭登录认证,适合内网或本地开发环境 - 使用 Docker Volume 持久化 WebUI 数据 - 已连接 Jupyter Code Interpreter,可让模型运行 Python 生成 .xlsx 等文件 ### 3. Jupyter Jupyter 只在 Docker 内网中提供给 Open WebUI 使用,不暴露到宿主机端口。 当前用途: - 为 Open WebUI 的 Code Interpreter 提供 Python 执行环境 - 支持通过 pandas/openpyxl 等库生成 Excel 文件 - 使用 Docker Volume 持久化工作目录 在 Open WebUI 中导出 Excel 时,可以这样提问: ```text 请使用 Code Interpreter 生成一个 Excel 文件,包含以下字段:姓名、部门、金额,并提供下载链接。 ``` ## 已配置模型 LiteLLM 当前已配置以下 Gemini 模型别名: - gemini-3-pro-preview - gemini-3-flash-preview - gemini-3.1-pro-preview - gemini-3.1-flash-lite-preview - gemini-2.5-pro - gemini-2.5-flash - gemini-2.5-flash-lite - gemini-2.0-flash - gemini-2.0-flash-001 - gemini-2.0-flash-lite - gemini-flash-latest - gemini-flash-lite-latest - gemini-pro-latest 其中部分模型配置了自动回退策略: - gemini-pro-latest 回退到 gemini-2.5-flash、gemini-flash-latest - gemini-3.1-pro-preview 回退到 gemini-2.5-flash、gemini-flash-latest - gemini-3-pro-preview 回退到 gemini-2.5-flash、gemini-flash-latest ## 运行前准备 需要具备以下环境: - Docker - Docker Compose - 可用的 Gemini API Key 建议在 .env 中配置环境变量: ```env GEMINI_API_KEY=你的实际密钥 ``` 如果当前网络环境访问 Gemini 需要代理,可以保留 docker-compose.yml 中的代理配置;如果不需要,应按实际环境修改或删除对应的代理地址。 ## 启动方式 在项目根目录执行: ```bash docker compose up -d ``` 查看运行状态: ```bash docker compose ps ``` 查看日志: ```bash docker compose logs -f ``` 停止服务: ```bash docker compose down ``` ## Windows 下使用 Python 直接运行 如果不想使用 Docker,也可以在 Windows 下通过 Python 分别启动 LiteLLM 和 Open WebUI。 建议环境: - Windows 10 或 11 - Python 3.11 - PowerShell ### 1. 创建虚拟环境并安装依赖 在项目根目录打开 PowerShell,执行: ```powershell py -3.11 -m venv .venv .\.venv\Scripts\Activate.ps1 python -m pip install --upgrade pip pip install "litellm[proxy]" open-webui ``` 如果 PowerShell 默认禁止脚本执行,可以先在当前会话临时放开: ```powershell Set-ExecutionPolicy -Scope Process Bypass ``` ### 2. 启动 LiteLLM 在第一个 PowerShell 窗口中执行: ```powershell .\.venv\Scripts\Activate.ps1 $env:GEMINI_API_KEY="你的实际密钥" # 如果访问 Gemini 需要代理,可以按实际环境设置 $env:HTTP_PROXY="http://127.0.0.1:7890" $env:HTTPS_PROXY="http://127.0.0.1:7890" $env:ALL_PROXY="http://127.0.0.1:7890" litellm --config .\litellm\config.yaml --port 4000 ``` 说明: - litellm/config.yaml 可以直接复用当前仓库里的模型配置 - 如果本机不需要代理,可以删除上面的代理环境变量 - 启动成功后,LiteLLM 默认监听 ### 3. 启动 Open WebUI 在第二个 PowerShell 窗口中执行: ```powershell .\.venv\Scripts\Activate.ps1 $env:OPENAI_API_BASE_URL="http://127.0.0.1:4000/v1" $env:OPENAI_API_KEY="dummy" $env:WEBUI_AUTH="false" $env:DATA_DIR="$PWD\.data\open-webui" $env:PORT="3000" open-webui serve ``` 说明: - OPENAI_API_BASE_URL 指向本地启动的 LiteLLM - OPENAI_API_KEY 保持 dummy 即可,主要用于兼容 OpenAI 风格配置 - DATA_DIR 用于持久化 Open WebUI 本地数据 - PORT 设置为 3000,这样和 Docker 方式下的访问地址保持一致 ### 4. 访问服务 启动完成后可通过以下地址访问: - Open WebUI: - LiteLLM: - LiteLLM OpenAI 兼容接口: ### 5. 停止服务 分别在两个 PowerShell 窗口中按 Ctrl+C 即可停止。 ### 6. 常见问题 - 如果 open-webui 命令不存在,先确认虚拟环境已激活,并重新执行依赖安装 - 如果 LiteLLM 启动失败,优先检查 GEMINI_API_KEY 和 config.yaml 路径是否正确 - 如果 Open WebUI 页面打开但没有模型,优先检查 LiteLLM 是否已在 4000 端口正常启动 ## Windows 下使用 WinSW 注册为系统服务 适用于需要长期稳定运行的场景,解决命令窗口关掉就停止、异常不自动恢复的问题。 WinSW 把 LiteLLM 和 Open WebUI 注册为 Windows Service,具备以下能力: - 开机自动启动 - 进程异常退出后自动重启 - 无需保持终端窗口 - 日志自动滚动,不占满磁盘 - 可以在服务管理器(services.msc)里统一查看和管理 ### 1. 准备工作 确认以下条件已满足: - Python 虚拟环境已经创建,litellm 和 open-webui 已安装 - Python 虚拟环境目录建议为项目根目录下的 `venv`(可按需调整) - 用管理员权限打开 PowerShell ### 2. 下载 WinSW 从官方 GitHub 下载最新版: 下载 `WinSW-x64.exe`,重命名为 `WinSW.exe`,放到项目根目录(与 `install.ps1` 同级)。 ### 3. 修改配置文件 按实际情况修改这两个文件: - `litellm/litellm-service.xml`:修改 GEMINI_API_KEY - `open_webui/openwebui-service.xml`:按需调整端口和数据目录 关键字段说明: - ``:默认使用 `%BASE%` 相对路径(例如 `%BASE%\\..\\venv\\Scripts\\litellm.exe`),复制到任意目录仍可运行 - ``:填写实际密钥 - ``:日志输出目录,目录不存在时安装脚本会自动创建 说明:`%BASE%` 是 WinSW 内置变量,表示当前 WinSW.exe 所在目录。 ### 4. 安装服务 在管理员 PowerShell 中,切换到项目根目录执行: ```powershell cd 你的项目目录 Set-ExecutionPolicy -Scope Process Bypass .\install.ps1 ``` 安装成功后会自动启动两个服务,并输出访问地址。 ### 5. 日常管理 ```powershell # 查看服务状态 .\install.ps1 -Status # 停止服务 .\install.ps1 -Stop # 启动服务 .\install.ps1 -Start # 卸载服务 .\install.ps1 -Uninstall ``` 也可以通过 Windows 服务管理器(`Win+R` 输入 `services.msc`)可视化管理, 服务名称分别为 `AI Stack - LiteLLM` 和 `AI Stack - Open WebUI`。 ### 6. 日志位置 - LiteLLM 日志:`项目根目录\\logs\\litellm\\` - Open WebUI 日志:`项目根目录\\logs\\openwebui\\` 日志文件为滚动模式,单文件超过 10MB 自动轮转,最多保留 5 个历史文件。 ### 7. 修改配置后更新服务 修改 XML 文件后无需卸载重装,执行 refresh 即可: ```powershell .\litellm\WinSW.exe refresh .\litellm\litellm-service.xml .\open_webui\WinSW.exe refresh .\open_webui\openwebui-service.xml ``` ## 访问入口 - Open WebUI: - LiteLLM API: - LiteLLM OpenAI 兼容接口前缀: ## 使用方式 ### 在 Open WebUI 中使用 启动后直接访问 Open WebUI 页面即可,通过 Web 界面选择 LiteLLM 暴露出来的模型进行对话。 ### 通过 OpenAI 兼容接口调用 可以把 LiteLLM 当作 OpenAI 兼容网关使用,只需要把 Base URL 指向本机的 /v1 接口。 示例: ```bash curl http://localhost:4000/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer dummy" \ -d '{ "model": "gemini-2.5-flash", "messages": [ {"role": "user", "content": "你好"} ] }' ``` 说明:LiteLLM 实际调用 Gemini 时使用的是服务端环境变量中的 GEMINI_API_KEY;示例中的 Bearer dummy 只是为了满足 OpenAI 风格客户端的请求格式。 ## 配置说明 ### 模型配置 LiteLLM 的模型配置位于 litellm/config.yaml,可以按以下方式扩展: - 新增或删除模型别名 - 调整别名对应的真实模型 - 配置 fallback 策略 ### 服务配置 服务端口与环境变量位于 docker-compose.yml,可以根据部署环境调整: - 端口映射 - 代理配置 - WebUI 认证开关 - 挂载目录和数据卷 ## 注意事项 - 当前 WEBUI_AUTH=false,默认无登录认证,不建议直接暴露到公网 - .env 中包含真实密钥时,不应提交到公开仓库 - 如果代理地址不可用,LiteLLM 可能无法正常访问 Gemini 接口 - app/ 和 open_webui/ 目录当前未承载实际代码,主要运行逻辑集中在 docker-compose.yml 与 litellm/config.yaml ## 故障排查 ### Open WebUI 无法加载模型 优先检查: - LiteLLM 容器是否正常启动 - OPENAI_API_BASE_URL 是否仍然指向 - GEMINI_API_KEY 是否配置正确 ### 模型调用失败 优先检查: - 当前 API Key 是否有效 - 代理是否可用 - LiteLLM 日志中是否有上游模型接口错误 可使用以下命令查看日志: ```bash docker compose logs -f litellm docker compose logs -f open-webui ```