2025-07-30 09:16:53 +08:00

148 lines
4.5 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Travel Content Creator API v2 Startup Script
旅游内容创作API v2 启动脚本
"""
import os
import sys
import logging
import argparse
from pathlib import Path
# 添加项目根目录到Python路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
def setup_logging(log_level: str = "INFO"):
"""设置日志配置"""
log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
logging.basicConfig(
level=getattr(logging, log_level.upper()),
format=log_format,
handlers=[
logging.StreamHandler(sys.stdout),
logging.FileHandler('api_v2.log', encoding='utf-8')
]
)
def check_environment():
"""检查环境配置"""
required_env_vars = [
'AI_API_KEY',
]
missing_vars = []
for var in required_env_vars:
if not os.getenv(var):
missing_vars.append(var)
if missing_vars:
print(f"⚠️ 警告: 缺少环境变量: {', '.join(missing_vars)}")
print("请在 .env 文件中设置这些变量或通过环境变量传递")
# 提供默认值建议
env_examples = {
'AI_API_KEY': 'your_ai_api_key_here',
'AI_BASE_URL': 'https://dashscope.aliyuncs.com/compatible-mode/v1',
'AI_MODEL': 'qwen-plus'
}
print("\n示例 .env 文件内容:")
for var, example in env_examples.items():
print(f"{var}={example}")
def check_dependencies():
"""检查依赖项"""
try:
import fastapi
import uvicorn
import pydantic
print("✅ 基础依赖检查通过")
except ImportError as e:
print(f"❌ 缺少依赖: {e}")
print("请运行: pip install -r requirements.txt")
sys.exit(1)
# 检查算法包
try:
sys.path.insert(0, str(project_root / "travel-algorithms"))
import travel_algorithms
print("✅ 算法包检查通过")
except ImportError as e:
print(f"❌ 算法包导入失败: {e}")
print("请确保 travel-algorithms 包已正确安装")
print("运行: cd travel-algorithms && pip install -e .")
sys.exit(1)
def main():
"""主函数"""
parser = argparse.ArgumentParser(description='Travel Content Creator API v2')
parser.add_argument('--host', default='0.0.0.0', help='服务器地址')
parser.add_argument('--port', type=int, default=8000, help='服务器端口')
parser.add_argument('--reload', action='store_true', help='开发模式(自动重载)')
parser.add_argument('--log-level', default='INFO',
choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'],
help='日志级别')
parser.add_argument('--workers', type=int, default=1, help='工作进程数量')
parser.add_argument('--check-only', action='store_true', help='仅检查环境,不启动服务')
args = parser.parse_args()
# 设置日志
setup_logging(args.log_level)
logger = logging.getLogger(__name__)
print("🚀 Travel Content Creator API v2")
print("=" * 50)
# 检查环境
logger.info("检查运行环境...")
check_environment()
check_dependencies()
if args.check_only:
print("✅ 环境检查完成")
return
# 设置环境变量
os.environ.setdefault('PORT', str(args.port))
# 启动服务器
try:
import uvicorn
logger.info(f"启动API服务器...")
print(f"🌐 服务地址: http://{args.host}:{args.port}")
print(f"📚 API文档: http://{args.host}:{args.port}/docs")
print(f"🔧 健康检查: http://{args.host}:{args.port}/health")
print("=" * 50)
# 构建uvicorn配置
uvicorn_config = {
"app": "api_v2.main:app",
"host": args.host,
"port": args.port,
"log_level": args.log_level.lower(),
"access_log": True,
}
if args.reload:
uvicorn_config["reload"] = True
uvicorn_config["reload_dirs"] = [str(project_root)]
else:
uvicorn_config["workers"] = args.workers
uvicorn.run(**uvicorn_config)
except KeyboardInterrupt:
logger.info("收到中断信号,正在关闭服务器...")
print("\n👋 服务器已关闭")
except Exception as e:
logger.error(f"启动失败: {e}", exc_info=True)
sys.exit(1)
if __name__ == "__main__":
main()