File size: 4,215 Bytes
29482b8
 
ab8b793
 
29482b8
 
 
 
 
 
ab8b793
 
 
 
 
 
 
 
 
 
 
 
 
 
29482b8
 
 
ab8b793
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29482b8
 
ab8b793
29482b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import uvicorn
import logging
import json
import os
from .app import app, key_manager
from .config import Config

# 获取日志记录器
logger = logging.getLogger("sora-api.main")

def ensure_bearer_prefix(key):
    """确保API密钥包含Bearer前缀"""
    if key and not key.startswith("Bearer "):
        return f"Bearer {key}"
    return key

def format_api_keys_json(keys):
    """格式化API密钥为JSON字符串,确保包含Bearer前缀"""
    if isinstance(keys, list):
        for i, key_info in enumerate(keys):
            if isinstance(key_info, dict) and "key" in key_info:
                keys[i]["key"] = ensure_bearer_prefix(key_info["key"])
    return json.dumps(keys)

def init_app():
    """初始化应用程序"""
    try:
        # 从环境变量加载API密钥
        api_keys_loaded = False
        
        # 从API_AUTH_TOKEN环境变量加载密钥
        api_auth_token = os.getenv("API_AUTH_TOKEN", "")
        if api_auth_token:
            logger.info(f"从环境变量API_AUTH_TOKEN读取,长度: {len(api_auth_token)}")
            
            # 尝试解析为JSON(多个密钥)
            try:
                api_keys_data = json.loads(api_auth_token)
                logger.info(f"API_AUTH_TOKEN包含JSON数据,尝试解析为密钥列表")
                
                # 清空现有密钥并设置新密钥
                key_manager.keys = []
                key_manager.usage_stats = {}
                
                # 如果是列表,作为多个密钥处理
                if isinstance(api_keys_data, list):
                    key_manager._process_keys_data(api_keys_data)
                    logger.info(f"已从API_AUTH_TOKEN加载 {len(key_manager.keys)} 个API密钥")
                    api_keys_loaded = True
                # 如果是字典,检查是否包含keys字段
                elif isinstance(api_keys_data, dict) and "keys" in api_keys_data:
                    key_manager._process_keys_data(api_keys_data["keys"])
                    logger.info(f"已从API_AUTH_TOKEN加载 {len(key_manager.keys)} 个API密钥")
                    api_keys_loaded = True
                else:
                    logger.warning(f"API_AUTH_TOKEN包含JSON数据,但格式不是密钥列表")
            except json.JSONDecodeError:
                # 不是JSON,作为单个密钥处理
                logger.info(f"API_AUTH_TOKEN不是JSON格式,作为单个密钥处理")
                
                # 清空现有密钥并设置新密钥
                key_manager.keys = []
                key_manager.usage_stats = {}
                
                # 添加从环境变量读取的单个密钥
                key_manager.add_key(
                    key_value=ensure_bearer_prefix(api_auth_token),
                    name="环境变量密钥",
                    weight=1,
                    rate_limit=60
                )
                
                logger.info(f"已将API_AUTH_TOKEN作为单个密钥设置")
                api_keys_loaded = True
        
        # 保存密钥到文件
        if api_keys_loaded:
            key_manager._save_keys()
        
        # 检查是否有可用的密钥
        if not key_manager.keys:
            logger.warning("未从环境变量加载到API密钥,将使用测试密钥")
            key_manager.add_key(
                key_value="Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjE5MzQ0ZTY1LWJiYzktNDRkMS1hOWQwLWY5NTdiMDc5YmQwZSIsInR5cCI6IkpXVCJ9...",
                name="默认测试密钥"
            )
        
        logger.info(f"API服务初始化完成,已加载 {len(key_manager.keys)} 个API key")
    except Exception as e:
        logger.error(f"API服务初始化失败: {str(e)}")
        raise

def start():
    """启动API服务"""
    # 初始化应用
    init_app()
    
    # 打印配置信息
    Config.print_config()
    
    # 启动服务
    logger.info(f"启动服务: {Config.HOST}:{Config.PORT}")
    uvicorn.run(
        "src.app:app",
        host=Config.HOST,
        port=Config.PORT,
        reload=Config.VERBOSE_LOGGING  # 仅在调试模式下开启自动重载
    )

if __name__ == "__main__":
    start()