245 lines
7.4 KiB
Python
245 lines
7.4 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Doppler配置管理模块
|
||
安全地从Doppler获取配置和密钥
|
||
"""
|
||
|
||
import os
|
||
from typing import Optional, Dict, Any
|
||
|
||
# 新增:优先加载 .env(若存在)
|
||
try:
|
||
from dotenv import load_dotenv, find_dotenv # type: ignore
|
||
_env_path = find_dotenv()
|
||
if _env_path:
|
||
load_dotenv(_env_path)
|
||
else:
|
||
# 尝试从项目根目录加载 .env
|
||
from pathlib import Path
|
||
root_env = Path(__file__).resolve().parents[1] / '.env'
|
||
if root_env.exists():
|
||
load_dotenv(root_env)
|
||
except Exception:
|
||
# 若未安装 python-dotenv 或加载失败,则跳过
|
||
pass
|
||
|
||
def get_secret(key: str, default: Optional[str] = None) -> Optional[str]:
|
||
"""
|
||
从Doppler或环境变量获取密钥
|
||
|
||
Args:
|
||
key: 密钥名称
|
||
default: 默认值
|
||
|
||
Returns:
|
||
密钥值或默认值
|
||
"""
|
||
# 临时的、不安全的解决方案,仅用于测试
|
||
temp_secrets = {
|
||
"RAPIDAPI_KEY": "your_rapidapi_key_here",
|
||
"OPENROUTER_API_KEY_1": "your_openrouter_key_here",
|
||
"GOOGLE_API_KEY": "your_google_api_key_here"
|
||
}
|
||
|
||
# 首先尝试从环境变量获取(Doppler会注入到环境变量,或由 .env 加载)
|
||
value = os.getenv(key)
|
||
|
||
if not value:
|
||
value = temp_secrets.get(key, default)
|
||
|
||
if not value and default is None:
|
||
raise ValueError(f"Required secret '{key}' not found in environment variables or temp_secrets")
|
||
|
||
return value
|
||
|
||
def get_rapidapi_key() -> str:
|
||
"""
|
||
获取RapidAPI密钥
|
||
|
||
Returns:
|
||
RapidAPI密钥
|
||
|
||
Raises:
|
||
ValueError: 如果密钥未找到
|
||
"""
|
||
return get_secret('RAPIDAPI_KEY')
|
||
|
||
def get_openrouter_key() -> str:
|
||
"""
|
||
获取OpenRouter API密钥
|
||
|
||
Returns:
|
||
OpenRouter API密钥
|
||
|
||
Raises:
|
||
ValueError: 如果密钥未找到
|
||
"""
|
||
return get_secret('OPENROUTER_API_KEY_1')
|
||
|
||
def get_google_api_key() -> str:
|
||
"""
|
||
获取Google API密钥 (用于 Gemini/ADK)
|
||
|
||
Returns:
|
||
Google API密钥
|
||
|
||
Raises:
|
||
ValueError: 如果密钥未找到
|
||
"""
|
||
return get_secret('GOOGLE_API_KEY')
|
||
|
||
def get_google_genai_config() -> Dict[str, str]:
|
||
"""
|
||
获取Google GenAI完整配置
|
||
|
||
Returns:
|
||
Google GenAI配置字典
|
||
"""
|
||
use_vertex_ai = get_secret('GOOGLE_GENAI_USE_VERTEXAI', 'FALSE').upper() == 'TRUE'
|
||
api_key = '' if use_vertex_ai else get_secret('GOOGLE_API_KEY', '')
|
||
|
||
return {
|
||
'api_key': api_key,
|
||
'use_vertex_ai': str(use_vertex_ai).upper(),
|
||
'project_id': get_secret('GOOGLE_CLOUD_PROJECT_ID', ''),
|
||
'location': get_secret('GOOGLE_CLOUD_LOCATION', 'us-central1'),
|
||
'memory_bank_enabled': get_secret('VERTEX_MEMORY_BANK_ENABLED', 'TRUE'),
|
||
'service_account_key': get_secret('GOOGLE_SERVICE_ACCOUNT_KEY', '')
|
||
}
|
||
|
||
def get_cloudflare_config() -> Dict[str, str]:
|
||
"""
|
||
获取Cloudflare配置
|
||
|
||
Returns:
|
||
Cloudflare配置字典
|
||
"""
|
||
return {
|
||
# 敏感信息从Doppler获取
|
||
'account_id': get_secret('CLOUDFLARE_ACCOUNT_ID', ''),
|
||
'api_token': get_secret('CLOUDFLARE_API_TOKEN', ''),
|
||
|
||
# 非敏感配置,明文写在代码里
|
||
'vectorize_index': 'autorag-shy-cherry-f1fb',
|
||
'embed_model': '@cf/baai/bge-m3',
|
||
'autorag_domain': 'autorag.seekkey.tech'
|
||
}
|
||
|
||
def get_database_config() -> Dict[str, str]:
|
||
"""
|
||
获取数据库配置
|
||
|
||
Returns:
|
||
数据库配置字典
|
||
"""
|
||
return {
|
||
'postgres_url': get_secret('POSTGRES_URL', ''),
|
||
'mongodb_url': get_secret('MONGODB_URL', ''),
|
||
'zilliz_url': get_secret('ZILLIZ_URL', ''),
|
||
'zilliz_token': get_secret('ZILLIZ_TOKEN', '')
|
||
}
|
||
|
||
def validate_config(mode: str = "hybrid") -> bool:
|
||
"""
|
||
验证必要的配置是否存在
|
||
|
||
Args:
|
||
mode: 验证模式 ("openrouter", "google_adk", "hybrid")
|
||
|
||
Returns:
|
||
配置是否有效
|
||
"""
|
||
print(f"🔧 当前模式: {mode}")
|
||
|
||
required_keys = []
|
||
|
||
# 模式特定配置
|
||
if mode == "openrouter":
|
||
required_keys.extend(['RAPIDAPI_KEY', 'OPENROUTER_API_KEY_1'])
|
||
# 验证 OpenRouter 配置
|
||
openrouter_key = get_secret('OPENROUTER_API_KEY_1', '')
|
||
if not openrouter_key:
|
||
print("❌ OpenRouter API Key 未配置")
|
||
return False
|
||
print("✅ OpenRouter 配置验证通过")
|
||
|
||
elif mode == "google_adk":
|
||
genai_config = get_google_genai_config()
|
||
use_vertex = genai_config.get('use_vertex_ai', 'FALSE').upper() == 'TRUE'
|
||
|
||
if not use_vertex:
|
||
required_keys.extend(['GOOGLE_API_KEY'])
|
||
# 验证 Google ADK 配置
|
||
google_key = get_secret('GOOGLE_API_KEY', '')
|
||
if not google_key:
|
||
print("❌ Google API Key 未配置")
|
||
print("请访问 https://aistudio.google.com/ 获取 API 密钥")
|
||
print("然后运行: doppler secrets set GOOGLE_API_KEY=your_key")
|
||
return False
|
||
print(f"✅ Google ADK 配置验证通过 (密钥长度: {len(google_key)} 字符)")
|
||
else:
|
||
print("✅ Google ADK (Vertex AI) 配置验证通过")
|
||
|
||
# 显示 Google GenAI 配置
|
||
print(f"📱 Google GenAI 配置:")
|
||
if not use_vertex:
|
||
print(f" - API Key: 已配置")
|
||
print(f" - Use Vertex AI: {genai_config.get('use_vertex_ai', False)}")
|
||
if genai_config.get('project_id'):
|
||
print(f" - Project ID: {genai_config['project_id']}")
|
||
if genai_config.get('location'):
|
||
print(f" - Location: {genai_config['location']}")
|
||
|
||
else: # hybrid mode
|
||
required_keys.extend(['RAPIDAPI_KEY'])
|
||
# 检查至少有一个AI API密钥
|
||
ai_keys = ['OPENROUTER_API_KEY_1', 'GOOGLE_API_KEY']
|
||
if not any(os.getenv(key) for key in ai_keys):
|
||
print("❌ 需要至少配置一个AI API密钥:")
|
||
print(" - OPENROUTER_API_KEY_1 (OpenRouter模式)")
|
||
print(" - GOOGLE_API_KEY (Google ADK模式)")
|
||
return False
|
||
|
||
# 验证混合模式配置
|
||
openrouter_key = get_secret('OPENROUTER_API_KEY_1', '')
|
||
google_key = get_secret('GOOGLE_API_KEY', '')
|
||
|
||
available_services = []
|
||
if openrouter_key:
|
||
available_services.append("OpenRouter")
|
||
if google_key:
|
||
available_services.append("Google ADK")
|
||
|
||
print(f"✅ 混合模式配置验证通过,可用服务: {', '.join(available_services)}")
|
||
|
||
missing_keys = []
|
||
for key in required_keys:
|
||
if not os.getenv(key):
|
||
missing_keys.append(key)
|
||
|
||
if missing_keys:
|
||
print(f"❌ 缺少必要的配置: {', '.join(missing_keys)}")
|
||
print("请确保已正确配置Doppler或环境变量")
|
||
return False
|
||
|
||
# 显示配置状态
|
||
print("✅ 配置验证通过")
|
||
print(f"📋 当前模式: {mode}")
|
||
|
||
# 显示可用的AI服务
|
||
ai_services = []
|
||
if os.getenv('OPENROUTER_API_KEY_1'):
|
||
ai_services.append("OpenRouter")
|
||
if os.getenv('GOOGLE_API_KEY'):
|
||
ai_services.append("Google ADK")
|
||
|
||
if ai_services:
|
||
print(f"🤖 可用AI服务: {', '.join(ai_services)}")
|
||
|
||
return True
|
||
|
||
if __name__ == "__main__":
|
||
# 配置验证脚本
|
||
print("🔧 验证配置...")
|
||
validate_config()
|