diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..13104a9 --- /dev/null +++ b/.env.example @@ -0,0 +1,35 @@ +# taiji-AI-PAD 环境变量配置模板 +# 复制此文件为 .env 并填写实际的密钥值 +# cp .env.example .env + +# ========== 数据库配置 ========== +POSTGRES_DB=taiji_db +POSTGRES_USER=taiji_user +POSTGRES_PASSWORD=taiji_pass + +# ========== LiteLLM 网关配置 ========== +LITELLM_MASTER_KEY=sk-taiji-master-key + +# ========== OpenRouter 配置 ========== +OPENROUTER_API_KEY=your-openrouter-api-key-here +OPENROUTER_BASE_URL=https://openrouter.ai/api/v1 + +# ========== RapidAPI 配置 ========== +RAPIDAPI_KEY=your-rapidapi-key-here +RAPIDAPI_HOST=rapidapi.com + +# ========== OpenAI 配置(可选)========== +# OPENAI_API_KEY=your-openai-api-key-here + +# ========== Anthropic 配置(可选)========== +# ANTHROPIC_API_KEY=your-anthropic-api-key-here + +# ========== Langfuse 配置(可选,用于监控)========== +# LANGFUSE_PUBLIC_KEY=your-langfuse-public-key +# LANGFUSE_SECRET_KEY=your-langfuse-secret-key +# LANGFUSE_HOST=https://cloud.langfuse.com + +# ========== 其他服务配置 ========== +REDIS_URL=redis://redis:6379 +NATS_URL=nats://nats:4222 +DATABASE_URL=postgresql://taiji_user:taiji_pass@postgres:5432/taiji_db diff --git a/Docs/环境变量配置说明.md b/Docs/环境变量配置说明.md new file mode 100644 index 0000000..eb15f58 --- /dev/null +++ b/Docs/环境变量配置说明.md @@ -0,0 +1,166 @@ +# taiji-AI-PAD 环境变量配置说明 + +## 📋 概述 + +为了简化配置管理,所有 API Key 和敏感信息现在统一在 `.env` 文件中管理。您只需要在一个地方填写所有密钥,无需在多个配置文件中重复填写。 + +## 🚀 快速开始 + +### 1. 创建环境变量文件 + +如果项目中没有 `.env` 文件,请复制模板: + +```bash +cp .env.example .env +``` + +### 2. 编辑 `.env` 文件 + +打开 `.env` 文件,填写您的实际 API Key: + +```bash +nano .env +# 或使用您喜欢的编辑器 +``` + +### 3. 配置项说明 + +#### 必需配置项 + +| 配置项 | 说明 | 示例 | +|--------|------|------| +| `OPENROUTER_API_KEY` | OpenRouter API 密钥 | `sk-or-v1-...` | +| `RAPIDAPI_KEY` | RapidAPI 密钥 | `33902cc39dmsh...` | +| `LITELLM_MASTER_KEY` | LiteLLM 主密钥 | `sk-taiji-master-key` | + +#### 可选配置项 + +| 配置项 | 说明 | 何时需要 | +|--------|------|----------| +| `OPENAI_API_KEY` | OpenAI API 密钥 | 使用 OpenAI 模型时 | +| `ANTHROPIC_API_KEY` | Anthropic API 密钥 | 使用 Claude 模型时 | +| `LANGFUSE_*` | Langfuse 监控配置 | 启用监控功能时 | + +## 📝 当前配置的密钥位置 + +### ✅ 已统一管理的密钥 + +以下密钥现在都在 `.env` 文件中: + +1. **OpenRouter API Key** - 用于模型网关 +2. **RapidAPI Key** - 用于数据接入服务 +3. **LiteLLM Master Key** - 用于模型网关认证 + +### 📍 配置文件位置 + +- **`.env`** - 实际环境变量文件(包含真实密钥,已加入 .gitignore) +- **`.env.example`** - 配置模板文件(可提交到 Git) +- **`docker-compose.yml`** - 使用 `${VAR}` 语法引用环境变量 + +## 🔧 如何添加新的 API Key + +### 步骤 1: 在 `.env` 文件中添加 + +```bash +# 在 .env 文件中添加 +NEW_API_KEY=your-new-api-key-here +``` + +### 步骤 2: 在 `docker-compose.yml` 中引用 + +```yaml +services: + your-service: + environment: + - NEW_API_KEY=${NEW_API_KEY} +``` + +### 步骤 3: 在代码中读取 + +```python +import os +api_key = os.getenv("NEW_API_KEY", "") +``` + +## 🔒 安全注意事项 + +1. **⚠️ 永远不要提交 `.env` 文件到 Git** + - `.env` 文件已在 `.gitignore` 中 + - 只提交 `.env.example` 作为模板 + +2. **生产环境建议** + - 使用密钥管理服务(如 AWS Secrets Manager) + - 使用环境变量注入(如 Kubernetes Secrets) + - 定期轮换 API Key + +3. **权限控制** + - 确保 `.env` 文件权限为 `600`(仅所有者可读写) + ```bash + chmod 600 .env + ``` + +## 📊 配置项清单 + +### 当前已配置的密钥 + +- ✅ OpenRouter API Key +- ✅ RapidAPI Key +- ✅ LiteLLM Master Key + +### 可选配置的密钥 + +- ⚪ OpenAI API Key(如需要直接使用 OpenAI) +- ⚪ Anthropic API Key(如需要直接使用 Anthropic) +- ⚪ Langfuse 监控密钥(如需要启用监控) + +## 🧪 验证配置 + +配置完成后,验证环境变量是否正确加载: + +```bash +# 检查环境变量 +docker-compose config | grep -E "OPENROUTER|RAPIDAPI|LITELLM" + +# 重启服务以应用新配置 +docker-compose restart litellm-gateway data-ingestion + +# 检查服务健康状态 +curl http://localhost:4000/health # LiteLLM Gateway +curl http://localhost:8001/health # Data Ingestion +``` + +## 📚 相关文档 + +- [Docker Compose 环境变量文档](https://docs.docker.com/compose/environment-variables/) +- [项目 README](../README.md) +- [测试准备说明](./测试准备说明.md) + +## ❓ 常见问题 + +### Q: 为什么需要 `.env` 文件? + +A: `.env` 文件可以: +- 集中管理所有密钥 +- 避免在代码中硬编码敏感信息 +- 方便不同环境使用不同配置 +- 提高安全性(不提交到 Git) + +### Q: 如何在不同环境使用不同配置? + +A: 可以创建多个环境文件: +- `.env.development` - 开发环境 +- `.env.production` - 生产环境 +- `.env.testing` - 测试环境 + +然后使用: +```bash +docker-compose --env-file .env.production up +``` + +### Q: 忘记填写某个 Key 会怎样? + +A: 如果某个环境变量未设置,Docker Compose 会使用空字符串或默认值。服务可能会启动失败或功能受限。请检查服务日志: +```bash +docker-compose logs service-name +``` + diff --git a/docker-compose.yml b/docker-compose.yml index c2613a5..f6ae889 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,8 @@ version: '3.8' +# Docker Compose 会自动从 .env 文件读取环境变量 +# 所有 ${VAR} 形式的变量都会从 .env 文件中获取 + services: # 数据库服务 postgres: @@ -54,9 +57,12 @@ services: ports: - "4000:4000" environment: - - LITELLM_MASTER_KEY=sk-taiji-master-key - - DATABASE_URL=postgresql://taiji_user:taiji_pass@postgres:5432/taiji_db - - REDIS_URL=redis://redis:6379 + - LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY} + - DATABASE_URL=${DATABASE_URL} + - REDIS_URL=${REDIS_URL} + # OpenRouter 配置 + - OPENROUTER_API_KEY=${OPENROUTER_API_KEY} + - OPENROUTER_BASE_URL=${OPENROUTER_BASE_URL} volumes: - ./services/model-gateway/config:/app/config - ./logs:/app/logs @@ -76,9 +82,12 @@ services: ports: - "8001:8000" environment: - - DATABASE_URL=postgresql://taiji_user:taiji_pass@postgres:5432/taiji_db - - REDIS_URL=redis://redis:6379 - - NATS_URL=nats://nats:4222 + - DATABASE_URL=${DATABASE_URL} + - REDIS_URL=${REDIS_URL} + - NATS_URL=${NATS_URL} + # RapidAPI 配置 + - RAPIDAPI_KEY=${RAPIDAPI_KEY} + - RAPIDAPI_HOST=${RAPIDAPI_HOST} volumes: - ./services/data-ingestion:/app - ./logs:/app/logs diff --git a/services/model-gateway/Dockerfile b/services/model-gateway/Dockerfile index cc51546..9db1760 100644 --- a/services/model-gateway/Dockerfile +++ b/services/model-gateway/Dockerfile @@ -19,11 +19,15 @@ WORKDIR /app npm config set registry https://registry.npmmirror.com # 安装LiteLLM和prisma (使用国内源) + # 注意:Prisma Python 客户端 0.12.0 需要 Prisma CLI 5.8.0 + # 需要同时安装 Prisma CLI 和 Python 客户端 RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple \ litellm[proxy]==1.17.0 \ redis==5.0.1 \ - prometheus-client==0.19.0 && \ - npm install -g prisma + prometheus-client==0.19.0 \ + prisma==0.12.0 && \ + (rm -f /usr/local/bin/prisma || true) && \ + npm install -g prisma@5.8.0 # 复制配置文件 COPY config/ ./config/ diff --git a/services/model-gateway/config/litellm.yaml b/services/model-gateway/config/litellm.yaml index 5682546..29f80c5 100644 --- a/services/model-gateway/config/litellm.yaml +++ b/services/model-gateway/config/litellm.yaml @@ -136,6 +136,71 @@ model_list: input_cost_per_token: 0.0 # 本地模型无成本 output_cost_per_token: 0.0 + # OpenRouter 模型组 - 通过 OpenRouter 访问多种模型 + - model_name: "openrouter-gpt-4" + litellm_params: + model: "openrouter/openai/gpt-4" + api_key: "os.environ/OPENROUTER_API_KEY" + api_base: "os.environ/OPENROUTER_BASE_URL" + max_tokens: 8000 + temperature: 0.7 + model_info: + mode: "chat" + supports_function_calling: true + supports_vision: false + max_input_tokens: 8192 + max_output_tokens: 8192 + input_cost_per_token: 0.00003 + output_cost_per_token: 0.00006 + + - model_name: "openrouter-gpt-3.5-turbo" + litellm_params: + model: "openrouter/openai/gpt-3.5-turbo" + api_key: "os.environ/OPENROUTER_API_KEY" + api_base: "os.environ/OPENROUTER_BASE_URL" + max_tokens: 4000 + temperature: 0.7 + model_info: + mode: "chat" + supports_function_calling: true + supports_vision: false + max_input_tokens: 16385 + max_output_tokens: 4096 + input_cost_per_token: 0.0000015 + output_cost_per_token: 0.000002 + + - model_name: "openrouter-claude-3.5-sonnet" + litellm_params: + model: "openrouter/anthropic/claude-3.5-sonnet" + api_key: "os.environ/OPENROUTER_API_KEY" + api_base: "os.environ/OPENROUTER_BASE_URL" + max_tokens: 4000 + temperature: 0.7 + model_info: + mode: "chat" + supports_function_calling: true + supports_vision: true + max_input_tokens: 200000 + max_output_tokens: 4096 + input_cost_per_token: 0.000003 + output_cost_per_token: 0.000015 + + - model_name: "openrouter-claude-3-opus" + litellm_params: + model: "openrouter/anthropic/claude-3-opus" + api_key: "os.environ/OPENROUTER_API_KEY" + api_base: "os.environ/OPENROUTER_BASE_URL" + max_tokens: 4000 + temperature: 0.7 + model_info: + mode: "chat" + supports_function_calling: true + supports_vision: true + max_input_tokens: 200000 + max_output_tokens: 4096 + input_cost_per_token: 0.000015 + output_cost_per_token: 0.000075 + # 路由器配置 router_settings: routing_strategy: "least-busy" # 路由策略: least-busy, round-robin, latency-based @@ -183,13 +248,24 @@ router_settings: weight: 0.3 - model_name: "claude-3-sonnet" weight: 0.3 + + - group_name: "openrouter-group" + models: + - model_name: "openrouter-gpt-4" + weight: 0.3 + - model_name: "openrouter-gpt-3.5-turbo" + weight: 0.3 + - model_name: "openrouter-claude-3.5-sonnet" + weight: 0.25 + - model_name: "openrouter-claude-3-opus" + weight: 0.15 # 用户和权限配置 litellm_settings: # API密钥管理 api_keys: - key: "sk-taiji-mcp-server" - models: ["gpt-3.5-turbo", "gpt-4", "claude-3-haiku", "claude-3-sonnet"] + models: ["gpt-3.5-turbo", "gpt-4", "claude-3-haiku", "claude-3-sonnet", "openrouter-gpt-4", "openrouter-gpt-3.5-turbo", "openrouter-claude-3.5-sonnet"] max_budget: 100.0 budget_duration: "1d" metadata: @@ -197,7 +273,7 @@ litellm_settings: service: "mcp-server" - key: "sk-taiji-data-ingestion" - models: ["gpt-3.5-turbo", "claude-3-haiku", "llama-3-8b"] + models: ["gpt-3.5-turbo", "claude-3-haiku", "llama-3-8b", "openrouter-gpt-3.5-turbo", "openrouter-claude-3.5-sonnet"] max_budget: 50.0 budget_duration: "1d" metadata: @@ -205,7 +281,7 @@ litellm_settings: service: "data-ingestion" - key: "sk-taiji-agent-dev" - models: ["gpt-3.5-group", "claude-group", "fast-models"] + models: ["gpt-3.5-group", "claude-group", "fast-models", "openrouter-group"] max_budget: 20.0 budget_duration: "1d" metadata: @@ -213,7 +289,7 @@ litellm_settings: service: "agent-development" - key: "sk-taiji-premium" - models: ["premium-models", "gpt-4-group"] + models: ["premium-models", "gpt-4-group", "openrouter-group", "openrouter-gpt-4", "openrouter-claude-3-opus", "openrouter-claude-3.5-sonnet"] max_budget: 200.0 budget_duration: "1d" metadata: @@ -278,9 +354,13 @@ error_handling: fallback: enabled: true fallback_models: - "gpt-4": ["gpt-4-turbo", "claude-3-sonnet"] - "claude-3-opus": ["claude-3-sonnet", "gpt-4"] - "gpt-3.5-turbo": ["claude-3-haiku", "llama-3-8b"] + "gpt-4": ["openrouter-gpt-4", "gpt-4-turbo", "claude-3-sonnet", "openrouter-claude-3-sonnet"] + "claude-3-opus": ["openrouter-claude-3-opus", "claude-3-sonnet", "openrouter-claude-3-sonnet", "gpt-4", "openrouter-gpt-4"] + "gpt-3.5-turbo": ["openrouter-gpt-3.5-turbo", "claude-3-haiku", "llama-3-8b"] + "openrouter-gpt-4": ["gpt-4", "gpt-4-turbo", "openrouter-claude-3.5-sonnet"] + "openrouter-gpt-3.5-turbo": ["gpt-3.5-turbo", "claude-3-haiku"] + "openrouter-claude-3.5-sonnet": ["claude-3-sonnet", "gpt-4", "openrouter-gpt-4"] + "openrouter-claude-3-opus": ["claude-3-opus", "claude-3-sonnet", "openrouter-claude-3.5-sonnet"] # 日志配置 logging: diff --git a/services/model-gateway/config/litellm_simple.yaml b/services/model-gateway/config/litellm_simple.yaml index b3d5c01..765bbbf 100644 --- a/services/model-gateway/config/litellm_simple.yaml +++ b/services/model-gateway/config/litellm_simple.yaml @@ -13,7 +13,7 @@ general_settings: # 安全设置 allowed_ips: ["127.0.0.1", "172.20.0.0/16", "0.0.0.0/0"] # 允许所有IP用于测试 -# 模型配置 - 使用测试模型 +# 模型配置 - 使用测试模型和 OpenRouter model_list: # 使用HuggingFace的免费模型进行测试 - model_name: "test-model" @@ -25,6 +25,43 @@ model_list: supports_function_calling: false supports_vision: false + # OpenRouter 模型 - 通过 OpenRouter 访问 + - model_name: "openrouter-gpt-4o-mini" + litellm_params: + model: "openrouter/openai/gpt-4o-mini" + api_key: "os.environ/OPENROUTER_API_KEY" + api_base: "os.environ/OPENROUTER_BASE_URL" + max_tokens: 1000 + temperature: 0.7 + model_info: + mode: "chat" + supports_function_calling: true + supports_vision: false + + - model_name: "openrouter-gpt-3.5-turbo" + litellm_params: + model: "openrouter/openai/gpt-3.5-turbo" + api_key: "os.environ/OPENROUTER_API_KEY" + api_base: "os.environ/OPENROUTER_BASE_URL" + max_tokens: 1000 + temperature: 0.7 + model_info: + mode: "chat" + supports_function_calling: true + supports_vision: false + + - model_name: "openrouter-claude-3.5-sonnet" + litellm_params: + model: "openrouter/anthropic/claude-3.5-sonnet" + api_key: "os.environ/OPENROUTER_API_KEY" + api_base: "os.environ/OPENROUTER_BASE_URL" + max_tokens: 4000 + temperature: 0.7 + model_info: + mode: "chat" + supports_function_calling: true + supports_vision: true + # 路由器配置 router_settings: routing_strategy: "round-robin" @@ -35,7 +72,7 @@ router_settings: litellm_settings: api_keys: - key: "sk-test-key" - models: ["test-model"] + models: ["test-model", "openrouter-gpt-4o-mini", "openrouter-gpt-3.5-turbo", "openrouter-claude-3.5-sonnet"] metadata: user_id: "test-user" service: "testing"