From d25f43e25b68ab9ee0d1715a57725aa2f928e459 Mon Sep 17 00:00:00 2001 From: zhanggangyong Date: Tue, 13 Jan 2026 08:49:39 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20XMind=20=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E4=BE=9B=E5=BA=94=E5=95=86=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 XMind OpenAI 兼容模型(11个模型) - 添加 XMind Anthropic 兼容模型(5个模型) - 添加 XMind Vertex AI 兼容模型(3个模型,使用 OpenAI 格式) - 更新 deploy.sh 支持 XMind API 密钥环境变量 - 添加 build-and-push.sh 脚本用于构建和推送 Docker 镜像 - 更新 README.md 文档说明 --- README.md | 58 +++++++++++- build-and-push.sh | 64 +++++++++++++ config.yaml | 225 ++++++++++++++++++++++++++++++++++++++++++---- deploy.sh | 11 +++ 4 files changed, 336 insertions(+), 22 deletions(-) create mode 100755 build-and-push.sh diff --git a/README.md b/README.md index 8a450b3..c06afc7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # LiteLLM Azure Container Apps 部署 -本项目用于在 Azure Container Apps 上部署 LiteLLM 代理服务器,支持 Taiji AI Cloud 和 OpenRouter 两个模型供应商。 +本项目用于在 Azure Container Apps 上部署 LiteLLM 代理服务器,支持 Taiji AI Cloud、OpenRouter 和 XMind 三个模型供应商。 ## 架构概览 @@ -25,12 +25,13 @@ │ Cache (SSL) │ │ (SSL) │ │ │ │ Port 10000 │ │ Port 5432 │ │ • Taiji AI Cloud│ └─────────────────┘ └─────────────────┘ │ • OpenRouter │ + │ • XMind │ └─────────────────┘ ``` ## 功能特性 -- ✅ **多模型供应商支持**: Taiji AI Cloud 和 OpenRouter +- ✅ **多模型供应商支持**: Taiji AI Cloud、OpenRouter 和 XMind - ✅ **通配符路由**: 支持 `taiji/*` 和 `openrouter/*` 动态模型路由 - ✅ **Redis SSL 连接**: 安全连接 Azure Redis Cache - ✅ **PostgreSQL 数据库**: 持久化存储 API 密钥和使用记录 @@ -67,6 +68,21 @@ vim .env ### 2. 构建并推送镜像 +#### 方法一:使用快速脚本(推荐) + +```bash +# 赋予脚本执行权限 +chmod +x build-and-push.sh + +# 构建并推送到 ACR(使用 latest 标签) +./build-and-push.sh + +# 或指定标签 +./build-and-push.sh v1.0.0 +``` + +#### 方法二:使用完整部署脚本 + ```bash # 赋予脚本执行权限 chmod +x deploy.sh @@ -140,6 +156,37 @@ curl -X POST https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps }' ``` +#### 使用 XMind 模型 + +```bash +# OpenAI 兼容模型 +curl -X POST https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps.io/chat/completions \ + -H "Authorization: Bearer sk-litellm-master-key" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "xmind/gpt-4o", + "messages": [{"role": "user", "content": "Hello!"}] + }' + +# Anthropic 兼容模型 +curl -X POST https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps.io/chat/completions \ + -H "Authorization: Bearer sk-litellm-master-key" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "xmind/claude-3.7-sonnet", + "messages": [{"role": "user", "content": "Hello!"}] + }' + +# Vertex AI 兼容模型 +curl -X POST https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps.io/chat/completions \ + -H "Authorization: Bearer sk-litellm-master-key" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "xmind/gemini-2.5-pro", + "messages": [{"role": "user", "content": "Hello!"}] + }' +``` + ### 环境变量说明 | 变量 | 说明 | 必需 | @@ -153,6 +200,10 @@ curl -X POST https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps | `REDIS_SSL` | 启用 Redis SSL(true/false) | ✅ | | `TAIJI_API_KEY` | Taiji AI Cloud API 密钥 | ✅ | | `OPENROUTER_API_KEY` | OpenRouter API 密钥 | ✅ | +| `XMIND_API_KEY_OPENAI` | XMind OpenAI 兼容 API 密钥(有默认值) | ❌ | +| `XMIND_API_KEY_ANTHROPIC` | XMind Anthropic 兼容 API 密钥(有默认值) | ❌ | +| `XMIND_API_KEY_VERTEX_AI` | XMind Vertex AI 兼容 API 密钥(有默认值) | ❌ | +| `ACR_PASSWORD` | Azure Container Registry 密码(用于推送镜像) | ✅ | | `UI_USERNAME` | Admin UI 用户名 | ❌ | | `UI_PASSWORD` | Admin UI 密码 | ❌ | @@ -238,7 +289,8 @@ litellm/ ├── config.yaml # LiteLLM 主配置文件 ├── Dockerfile # Docker 构建文件 ├── .env.example # 环境变量示例 -├── deploy.sh # 部署脚本 +├── deploy.sh # 完整部署脚本(构建、推送、部署) +├── build-and-push.sh # 快速构建并推送镜像脚本 └── README.md # 本文档 ``` diff --git a/build-and-push.sh b/build-and-push.sh new file mode 100755 index 0000000..ec63559 --- /dev/null +++ b/build-and-push.sh @@ -0,0 +1,64 @@ +#!/bin/bash +# 快速构建并推送镜像到 Azure Container Registry +# 使用方法: ./build-and-push.sh [tag] + +set -e + +# 加载环境变量 +if [ -f .env ]; then + export $(cat .env | grep -v '^#' | xargs) +fi + +# 配置 +ACR_SERVER="${ACR_SERVER:-agnettaiji.azurecr.io}" +ACR_USERNAME="${ACR_USERNAME:-agnettaiji}" +IMAGE_NAME="${IMAGE_NAME:-litellm}" + +# 如果没有提供标签,使用时间戳格式: vYYYYMMDDHHMMSS +if [ -z "$1" ]; then + IMAGE_TAG="v$(date +%Y%m%d%H%M%S)" +else + IMAGE_TAG="$1" +fi + +FULL_IMAGE_NAME="${ACR_SERVER}/${IMAGE_NAME}:${IMAGE_TAG}" + +echo "==========================================" +echo "构建并推送 Docker 镜像到 ACR" +echo "==========================================" +echo "镜像名称: ${FULL_IMAGE_NAME}" +echo "" + +# 检查 ACR 密码 +if [ -z "$ACR_PASSWORD" ]; then + echo "错误: 未设置 ACR_PASSWORD 环境变量" + echo "请设置 ACR_PASSWORD 或创建 .env 文件" + exit 1 +fi + +# 构建镜像(同时打 latest 标签,方便快速引用) +echo "步骤 1/2: 构建 Docker 镜像..." +docker build -t "${FULL_IMAGE_NAME}" -t "${ACR_SERVER}/${IMAGE_NAME}:latest" . + +# 登录 ACR +echo "" +echo "步骤 2/2: 推送镜像到 ACR..." +echo "${ACR_PASSWORD}" | docker login "${ACR_SERVER}" -u "${ACR_USERNAME}" --password-stdin + +# 推送镜像(推送带版本号的标签和 latest 标签) +docker push "${FULL_IMAGE_NAME}" +docker push "${ACR_SERVER}/${IMAGE_NAME}:latest" + +echo "" +echo "==========================================" +echo "完成!镜像已推送到: ${FULL_IMAGE_NAME}" +echo "同时更新了 latest 标签: ${ACR_SERVER}/${IMAGE_NAME}:latest" +echo "==========================================" +echo "" +echo "镜像标签: ${IMAGE_TAG}" +echo "" +echo "下一步: 运行以下命令部署应用:" +echo " ./deploy.sh update" +echo "" +echo "或者运行完整部署:" +echo " ./deploy.sh deploy" diff --git a/config.yaml b/config.yaml index a4707be..0a691c5 100644 --- a/config.yaml +++ b/config.yaml @@ -25,6 +25,37 @@ general_settings: # VPC 内允许请求继续处理(即使数据库不可用) allow_requests_on_db_unavailable: true + + # ========================================================================== + # 健康检查设置 - 完全禁用 + # ========================================================================== + # 禁用所有后台健康检查(不对模型供应商发起健康检测请求) + background_health_checks: false + # 健康检查间隔设置为 0 完全禁用 + health_check_interval: 0 + +# ============================================================================= +# 回调设置 - 计费 Webhook +# ============================================================================= +litellm_settings: + # 启用回调 - 使用 custom_callback_api 发送到 GENERIC_LOGGER_ENDPOINT + success_callback: ["custom_callback_api"] + failure_callback: ["custom_callback_api"] + + # 请求超时(秒) + request_timeout: 600 + + # 日志设置 + set_verbose: false + json_logs: true + + # 缓存配置 + cache: true + cache_params: + type: redis + host: os.environ/REDIS_HOST + port: os.environ/REDIS_PORT + password: os.environ/REDIS_PASSWORD # ============================================================================= # 模型列表配置 @@ -4491,6 +4522,178 @@ model_list: model_info: disable_background_health_check: true + # ------------------------------------------------------------------------- + # XMind 模型(OpenAI 兼容) + # 总计: 12 个模型 + # ------------------------------------------------------------------------- + - model_name: xmind/gpt-4o-mini + litellm_params: + model: openai/gpt-4o-mini + api_base: https://apis.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_OPENAI + model_info: + disable_background_health_check: true + + - model_name: xmind/gpt-4o + litellm_params: + model: openai/gpt-4o + api_base: https://apis.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_OPENAI + model_info: + disable_background_health_check: true + + - model_name: xmind/gpt-4.1 + litellm_params: + model: openai/gpt-4.1 + api_base: https://apis.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_OPENAI + model_info: + disable_background_health_check: true + + - model_name: xmind/gpt-image-1 + litellm_params: + model: openai/gpt-image-1 + api_base: https://apis.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_OPENAI + model_info: + disable_background_health_check: true + + - model_name: xmind/gpt-5-nano + litellm_params: + model: openai/gpt-5-nano + api_base: https://apis.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_OPENAI + model_info: + disable_background_health_check: true + + - model_name: xmind/gpt-5-mini + litellm_params: + model: openai/gpt-5-mini + api_base: https://apis.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_OPENAI + model_info: + disable_background_health_check: true + + - model_name: xmind/gpt-5 + litellm_params: + model: openai/gpt-5 + api_base: https://apis.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_OPENAI + model_info: + disable_background_health_check: true + + - model_name: xmind/gpt-5.1-chat + litellm_params: + model: openai/gpt-5.1-chat + api_base: https://apis.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_OPENAI + model_info: + disable_background_health_check: true + + - model_name: xmind/gpt-5.1 + litellm_params: + model: openai/gpt-5.1 + api_base: https://apis.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_OPENAI + model_info: + disable_background_health_check: true + + - model_name: xmind/gpt-5.2 + litellm_params: + model: openai/gpt-5.2 + api_base: https://apis.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_OPENAI + model_info: + disable_background_health_check: true + + - model_name: xmind/gpt-5.2-chat + litellm_params: + model: openai/gpt-5.2-chat + api_base: https://apis.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_OPENAI + model_info: + disable_background_health_check: true + + # ------------------------------------------------------------------------- + # XMind 模型(Anthropic 兼容) + # 总计: 5 个模型 + # 端点: https://anthropic.openroutex.com/v1/messages + # 请求头: x-api-key (API 密钥), anthropic-version (API 版本,例如 2023-06-01) + # 注意: 使用 anthropic provider,api_base 设置为完整端点路径 + # 模型名称必须使用完整的模型 ID,包括日期后缀 + # ------------------------------------------------------------------------- + - model_name: xmind/claude-3.7-sonnet + litellm_params: + model: anthropic/claude-3-7-sonnet-20250219 + api_base: https://anthropic.openroutex.com/v1/messages + api_key: os.environ/XMIND_API_KEY_ANTHROPIC + model_info: + disable_background_health_check: true + + - model_name: xmind/claude-opus-4.1 + litellm_params: + model: anthropic/claude-opus-4-1-20250805 + api_base: https://anthropic.openroutex.com/v1/messages + api_key: os.environ/XMIND_API_KEY_ANTHROPIC + model_info: + disable_background_health_check: true + + - model_name: xmind/claude-sonnet-4.5 + litellm_params: + model: anthropic/claude-sonnet-4-5-20250929 + api_base: https://anthropic.openroutex.com/v1/messages + api_key: os.environ/XMIND_API_KEY_ANTHROPIC + model_info: + disable_background_health_check: true + + - model_name: xmind/claude-haiku-4.5 + litellm_params: + model: anthropic/claude-haiku-4-5-20251001 + api_base: https://anthropic.openroutex.com/v1/messages + api_key: os.environ/XMIND_API_KEY_ANTHROPIC + model_info: + disable_background_health_check: true + + - model_name: xmind/claude-opus-4.5 + litellm_params: + model: anthropic/claude-opus-4-5-20251101 + api_base: https://anthropic.openroutex.com/v1/messages + api_key: os.environ/XMIND_API_KEY_ANTHROPIC + model_info: + disable_background_health_check: true + + # ------------------------------------------------------------------------- + # XMind 模型(Google Vertex AI 兼容 - OpenAI 格式) + # 总计: 3 个模型 + # 端点: https://vertexai.openroutex.com/oai/v1/chat/completions + # 请求头: Authorization: Bearer {api_key} + # 注意: 使用标准的 OpenAI 兼容 API 格式,使用 openai provider + # 模型名称直接使用模型 ID(如 gemini-2.5-pro) + # ------------------------------------------------------------------------- + - model_name: xmind/gemini-2.5-pro + litellm_params: + model: openai/gemini-2.5-pro + api_base: https://vertexai.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_VERTEX_AI + model_info: + disable_background_health_check: true + + - model_name: xmind/gemini-2.5-flash + litellm_params: + model: openai/gemini-2.5-flash + api_base: https://vertexai.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_VERTEX_AI + model_info: + disable_background_health_check: true + + - model_name: xmind/gemini-3-pro-preview + litellm_params: + model: openai/gemini-3-pro-preview + api_base: https://vertexai.openroutex.com/oai/v1 + api_key: os.environ/XMIND_API_KEY_VERTEX_AI + model_info: + disable_background_health_check: true + # ============================================================================= # 路由器设置 # ============================================================================= @@ -4508,25 +4711,6 @@ router_settings: cooldown_time: 30 retry_after: 10 -# ============================================================================= -# LiteLLM 设置 -# ============================================================================= -litellm_settings: - # 请求超时(秒) - request_timeout: 600 - - # 日志设置 - set_verbose: false - json_logs: true - - # 缓存配置 - cache: true - cache_params: - type: redis - host: os.environ/REDIS_HOST - port: os.environ/REDIS_PORT - password: os.environ/REDIS_PASSWORD - # ============================================================================= # 环境变量说明 # ============================================================================= @@ -4540,3 +4724,6 @@ litellm_settings: # - REDIS_SSL: 是否启用 Redis SSL(true/false) # - TAIJI_API_KEY: Taiji AI Cloud API 密钥 # - OPENROUTER_API_KEY: OpenRouter API 密钥 +# - XMIND_API_KEY_OPENAI: XMind OpenAI 兼容 API 密钥(默认: 6b761f38b4bf4c829390d82a43f8f32f) +# - XMIND_API_KEY_ANTHROPIC: XMind Anthropic 兼容 API 密钥(默认: 9b123e68b3734856a6983fa229a1f94d) +# - XMIND_API_KEY_VERTEX_AI: XMind Vertex AI 兼容 API 密钥(默认: 854a5b589db44fb0a08c988dd2dd57f8) \ No newline at end of file diff --git a/deploy.sh b/deploy.sh index 798dc3e..056fcdb 100755 --- a/deploy.sh +++ b/deploy.sh @@ -26,6 +26,11 @@ IMAGE_TAG="${IMAGE_TAG:-latest}" # 完整镜像名称 FULL_IMAGE_NAME="${ACR_SERVER}/${IMAGE_NAME}:${IMAGE_TAG}" +# XMind API 密钥(可选,有默认值) +XMIND_API_KEY_OPENAI="${XMIND_API_KEY_OPENAI:-6b761f38b4bf4c829390d82a43f8f32f}" +XMIND_API_KEY_ANTHROPIC="${XMIND_API_KEY_ANTHROPIC:-9b123e68b3734856a6983fa229a1f94d}" +XMIND_API_KEY_VERTEX_AI="${XMIND_API_KEY_VERTEX_AI:-854a5b589db44fb0a08c988dd2dd57f8}" + # ============================================================================= # 辅助函数 # ============================================================================= @@ -102,6 +107,9 @@ cmd_update() { "REDIS_SSL=true" \ "TAIJI_API_KEY=secretref:taiji-api-key" \ "OPENROUTER_API_KEY=secretref:openrouter-api-key" \ + "XMIND_API_KEY_OPENAI=secretref:xmind-api-key-openai" \ + "XMIND_API_KEY_ANTHROPIC=secretref:xmind-api-key-anthropic" \ + "XMIND_API_KEY_VERTEX_AI=secretref:xmind-api-key-vertex-ai" \ "LITELLM_MODE=PRODUCTION" \ "LITELLM_LOG=ERROR" \ "UI_USERNAME=${UI_USERNAME:-admin}" \ @@ -127,6 +135,9 @@ cmd_secrets() { "redis-password=${REDIS_PASSWORD}" \ "taiji-api-key=${TAIJI_API_KEY}" \ "openrouter-api-key=${OPENROUTER_API_KEY}" \ + "xmind-api-key-openai=${XMIND_API_KEY_OPENAI}" \ + "xmind-api-key-anthropic=${XMIND_API_KEY_ANTHROPIC}" \ + "xmind-api-key-vertex-ai=${XMIND_API_KEY_VERTEX_AI}" \ "ui-password=${UI_PASSWORD:-TaijiLiteLLM@2026!}" log_info "Secrets 更新完成"