142 lines
4.7 KiB
Python
142 lines
4.7 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
项目配置管理模块
|
|
从环境变量 (.env) 文件中安全地加载配置和密钥。
|
|
"""
|
|
|
|
import os
|
|
from typing import Optional, Dict, Any
|
|
from pathlib import Path
|
|
|
|
# 确保 .env 文件在项目根目录被加载
|
|
try:
|
|
from dotenv import load_dotenv
|
|
# 构建到项目根目录的路径 (假设此文件在 config/ 目录下)
|
|
env_path = Path(__file__).resolve().parents[1] / '.env'
|
|
if env_path.exists():
|
|
load_dotenv(dotenv_path=env_path)
|
|
else:
|
|
print("Warning: .env file not found at project root. Relying on system environment variables.")
|
|
except ImportError:
|
|
print("Warning: python-dotenv not installed. Relying on system environment variables.")
|
|
pass
|
|
|
|
def get_secret(key: str, default: Optional[str] = None) -> str:
|
|
"""
|
|
从环境变量获取密钥。
|
|
|
|
Args:
|
|
key: 密钥名称
|
|
default: 如果未找到密钥,则返回的默认值
|
|
|
|
Returns:
|
|
密钥值
|
|
|
|
Raises:
|
|
ValueError: 如果密钥未找到且没有提供默认值。
|
|
"""
|
|
value = os.getenv(key)
|
|
if value is not None:
|
|
return value
|
|
|
|
if default is not None:
|
|
return default
|
|
|
|
raise ValueError(f"Required secret '{key}' not found in environment variables. "
|
|
"Please ensure it is set in your .env file or system environment.")
|
|
|
|
def get_rapidapi_key() -> str:
|
|
return get_secret('RAPIDAPI_KEY')
|
|
|
|
def get_openrouter_key() -> str:
|
|
return get_secret('OPENROUTER_API_KEY_1')
|
|
|
|
def get_google_api_key() -> str:
|
|
return get_secret('GOOGLE_API_KEY')
|
|
|
|
def get_google_genai_config() -> Dict[str, Any]:
|
|
"""
|
|
获取Google GenAI完整配置
|
|
"""
|
|
use_vertex_ai = get_secret('GOOGLE_GENAI_USE_VERTEXAI', 'FALSE').upper() == 'TRUE'
|
|
return {
|
|
'api_key': get_secret('GOOGLE_API_KEY', '') if not use_vertex_ai else '',
|
|
'use_vertex_ai': use_vertex_ai,
|
|
'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').upper() == 'TRUE',
|
|
'service_account_key': get_secret('GOOGLE_SERVICE_ACCOUNT_KEY', '')
|
|
}
|
|
|
|
def get_cloudflare_config() -> Dict[str, str]:
|
|
"""
|
|
获取Cloudflare配置
|
|
"""
|
|
return {
|
|
'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]:
|
|
"""
|
|
获取数据库配置
|
|
"""
|
|
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:
|
|
"""
|
|
验证必要的配置是否存在
|
|
"""
|
|
print(f"🔧 Validating configuration for mode: {mode}")
|
|
try:
|
|
if mode == "openrouter":
|
|
get_openrouter_key()
|
|
print("✅ OpenRouter configuration is valid.")
|
|
elif mode == "google_adk":
|
|
config = get_google_genai_config()
|
|
if not config['use_vertex_ai']:
|
|
get_google_api_key()
|
|
else:
|
|
if not config['project_id']:
|
|
raise ValueError("GOOGLE_CLOUD_PROJECT_ID is required for Vertex AI")
|
|
print("✅ Google ADK configuration is valid.")
|
|
elif mode == "hybrid":
|
|
# In hybrid, we just need at least one to be available
|
|
key_found = False
|
|
try:
|
|
get_openrouter_key()
|
|
print("✅ OpenRouter key found.")
|
|
key_found = True
|
|
except ValueError:
|
|
pass # It's ok if this one is missing
|
|
|
|
try:
|
|
google_config = get_google_genai_config()
|
|
if not google_config['use_vertex_ai']:
|
|
get_google_api_key()
|
|
print("✅ Google ADK key found.")
|
|
key_found = True
|
|
except ValueError:
|
|
pass # It's ok if this one is missing
|
|
|
|
if not key_found:
|
|
raise ValueError("In hybrid mode, at least one AI provider key (OpenRouter or Google) must be configured.")
|
|
print("✅ Hybrid mode configuration is valid.")
|
|
|
|
return True
|
|
except ValueError as e:
|
|
print(f"❌ Configuration validation failed: {e}")
|
|
return False
|
|
|
|
if __name__ == "__main__":
|
|
print("🔧 Running configuration validation...")
|
|
validate_config()
|