Repository navigation
Expand file tree
/
Copy pathrun_api.py
More file actions
103 lines (88 loc) · 2.67 KB
/
Copy pathrun_api.py
File metadata and controls
103 lines (88 loc) · 2.67 KB
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
#!/usr/bin/env python
"""Run the FastAPI server."""
import os
import sys
import argparse
from pathlib import Path
import uvicorn
from dotenv import load_dotenv
# Add project root to path
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))
# Load environment variables
env_file = project_root / ".env.api"
if env_file.exists():
load_dotenv(env_file)
from src.utils.logger import get_logger
logger = get_logger(__name__)
def main():
"""Main entry point."""
parser = argparse.ArgumentParser(
description="Run AI-RAG-Chatbot FastAPI server"
)
parser.add_argument(
"--host",
default=os.getenv("API_HOST", "0.0.0.0"),
help="Host to bind to (default: 0.0.0.0)",
)
parser.add_argument(
"--port",
type=int,
default=int(os.getenv("API_PORT", 8000)),
help="Port to bind to (default: 8000)",
)
parser.add_argument(
"--reload",
action="store_true",
default=os.getenv("API_RELOAD", "true").lower() == "true",
help="Enable auto-reload on code changes",
)
parser.add_argument(
"--workers",
type=int,
default=int(os.getenv("API_WORKERS", 1)),
help="Number of worker processes (default: 1, auto-reload forces 1)",
)
parser.add_argument(
"--log-level",
default="info",
choices=["debug", "info", "warning", "error"],
help="Logging level (default: info)",
)
args = parser.parse_args()
# Validate arguments
if args.port < 1 or args.port > 65535:
logger.error(f"Invalid port: {args.port}")
sys.exit(1)
if args.workers < 1:
logger.error(f"Invalid workers: {args.workers}")
sys.exit(1)
# Display startup info
logger.info("=" * 70)
logger.info("AI-RAG-Chatbot FastAPI Server")
logger.info("=" * 70)
logger.info(f"Host: {args.host}")
logger.info(f"Port: {args.port}")
logger.info(f"Reload: {args.reload}")
logger.info(f"Workers: {args.workers if not args.reload else 1}")
logger.info(f"Log Level: {args.log_level}")
logger.info(f"Documentation: http://{args.host}:{args.port}/docs")
logger.info("=" * 70)
# Start server
try:
uvicorn.run(
"src.api.main:app",
host=args.host,
port=args.port,
reload=args.reload,
workers=1 if args.reload else args.workers,
log_level=args.log_level,
)
except KeyboardInterrupt:
logger.info("Server shutdown requested")
sys.exit(0)
except Exception as e:
logger.error(f"Failed to start server: {e}")
sys.exit(1)
if __name__ == "__main__":
main()