feat: 配置OpenRouter和RapidAPI密钥管理

- 统一密钥管理:创建 .env 文件集中管理所有API密钥
- 添加 OpenRouter 支持:配置 GPT-4o-mini 和 Claude 3.5 Sonnet 模型
- 添加 RapidAPI 支持:配置数据接入服务的 RapidAPI Key
- 修复 LiteLLM Prisma 兼容性:降级到 Prisma 5.8.0
- 修复模型 ID:更正 Claude 模型 ID 为 claude-3.5-sonnet
- 优化配置:调整 max_tokens 参数避免超限
- 文档更新:添加环境变量配置说明文档

测试状态:
- Claude 3.5 Sonnet: ✅ 正常
- GPT-4o-mini: ✅ 正常
- Data Ingestion: ✅ 正常
This commit is contained in:
2025-12-21 15:20:21 +00:00
parent 1eeec711cd
commit 456bdaec8b
6 changed files with 348 additions and 17 deletions
+35
View File
@@ -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
+166
View File
@@ -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
```
+15 -6
View File
@@ -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
+6 -2
View File
@@ -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/
+87 -7
View File
@@ -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:
@@ -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"