Files
tw/run.py

222 lines
7.6 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
AI 客服系统 - 统一启动器
用法:
python run.py # WebSocket 客服模式(默认)
python run.py --tianwang # 完整版HTTP API + WebSocket + AI Agent
python run.py --tianwang-multi -w 4 # 天网 + 多进程HTTP API + 多进程 WebSocket
python run.py --api-only # 仅 HTTP API不含 WebSocket / AI Agent
python run.py --no-agent # 不启用 AI Agent
python run.py --multi -w 4 # 多进程模式4 个 Worker
python run.py --port 6060 # 指定 HTTP API 端口
"""
import sys
import os
import signal
import logging
import argparse
from pathlib import Path
_root = Path(__file__).resolve().parent
if str(_root) not in sys.path:
sys.path.insert(0, str(_root))
logging.basicConfig(
level=logging.INFO,
format='[%(asctime)s] %(levelname)s: %(message)s'
)
logger = logging.getLogger(__name__)
DEFAULT_HTTP_PORT = 6060
DEFAULT_HTTP_HOST = "127.0.0.1"
def _print_api_info(host: str, port: int):
logger.info(f"HTTP API 服务器已启动http://{host}:{port}")
logger.info("")
logger.info("天网任务接口:")
logger.info(" POST /api/task/receive - 接收任务")
logger.info(" POST /api/task/cancel - 取消任务")
logger.info(" GET /api/task/status/:id - 查询任务状态")
logger.info(" GET /api/task/list - 任务列表")
logger.info(" GET /api/health - 健康检查")
def run_websocket(enable_agent: bool):
"""WebSocket 客服模式(默认)"""
import asyncio
from core.websocket_client import QingjianAPIClient
logger.info("=" * 60)
logger.info("AI 客服系统 - WebSocket 模式")
logger.info(f"AI Agent: {'已启用' if enable_agent else '未启用'}")
logger.info("=" * 60)
client = QingjianAPIClient(enable_agent=enable_agent)
try:
asyncio.run(client.run())
except KeyboardInterrupt:
logger.info("已停止")
def run_tianwang(enable_agent: bool, host: str, port: int):
"""完整版: HTTP API + WebSocket + AI Agent"""
import asyncio
from api.http_server import start_http_server
from core.websocket_client import QingjianAPIClient
logger.info("=" * 60)
logger.info("AI 客服系统 - 天网协作版(完整)")
logger.info("=" * 60)
start_http_server(host=host, port=port)
_print_api_info(host, port)
logger.info("=" * 60)
logger.info("正在连接轻简 API...")
client = QingjianAPIClient(enable_agent=enable_agent)
logger.info(f"AI Agent: {'已启用' if enable_agent else '未启用'}")
logger.info("=" * 60)
logger.info("系统已就绪,等待消息和任务...")
def _signal_handler(signum, frame):
logger.info("收到退出信号,正在停止...")
if hasattr(client, 'task_scheduler'):
asyncio.run(client.task_scheduler.stop())
sys.exit(0)
signal.signal(signal.SIGINT, _signal_handler)
signal.signal(signal.SIGTERM, _signal_handler)
try:
asyncio.run(client.connect())
except KeyboardInterrupt:
logger.info("已停止")
except Exception as e:
logger.error(f"运行异常:{e}")
sys.exit(1)
def run_api_only(host: str, port: int):
"""仅 HTTP API不含 WebSocket / AI Agent"""
import time
from api.http_server import start_http_server
logger.info("=" * 60)
logger.info("AI 客服系统 - 天网协作版(仅 API")
logger.info("=" * 60)
start_http_server(host=host, port=port)
_print_api_info(host, port)
logger.info("=" * 60)
logger.info("系统已就绪,等待天网任务...")
def _signal_handler(signum, frame):
logger.info("收到退出信号")
sys.exit(0)
signal.signal(signal.SIGINT, _signal_handler)
signal.signal(signal.SIGTERM, _signal_handler)
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
logger.info("已停止")
def run_multi_process(num_workers: int, enable_agent: bool):
"""多进程模式"""
from scripts.multi_process_launcher import Coordinator
logger.info("=" * 60)
logger.info("AI 客服系统 - 多进程异步并行模式")
logger.info(f"工作进程数:{num_workers}")
logger.info(f"AI Agent: {'已启用' if enable_agent else '未启用'}")
logger.info("=" * 60)
coordinator = Coordinator(num_workers=num_workers, enable_agent=enable_agent)
try:
coordinator.start()
except KeyboardInterrupt:
logger.info("已停止")
coordinator.stop()
def run_tianwang_multi(num_workers: int, enable_agent: bool, host: str, port: int):
"""天网 + 多进程HTTP API + 多进程 WebSocket 客户端"""
from api.http_server import start_http_server
from scripts.multi_process_launcher import Coordinator
logger.info("=" * 60)
logger.info("AI 客服系统 - 天网协作版HTTP API + 多进程模式")
logger.info("=" * 60)
start_http_server(host=host, port=port)
_print_api_info(host, port)
logger.info("=" * 60)
logger.info(f"工作进程数:{num_workers}")
logger.info(f"AI Agent: {'已启用' if enable_agent else '未启用'}")
logger.info("=" * 60)
coordinator = Coordinator(num_workers=num_workers or 0, enable_agent=enable_agent)
def _signal_handler(signum, frame):
logger.info("收到退出信号,正在停止多进程协调器...")
coordinator.stop()
sys.exit(0)
signal.signal(signal.SIGINT, _signal_handler)
signal.signal(signal.SIGTERM, _signal_handler)
try:
coordinator.start()
except KeyboardInterrupt:
logger.info("已停止")
coordinator.stop()
def main():
parser = argparse.ArgumentParser(
description='AI 客服系统启动器',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
启动模式:
(默认) WebSocket 客服模式
--tianwang HTTP API + WebSocket天网完整版
--tianwang-multi HTTP API + 多进程 WebSocket
--api-only 仅 HTTP API不含 WebSocket / AI Agent
--multi 多进程模式
"""
)
mode = parser.add_mutually_exclusive_group()
mode.add_argument('--tianwang', action='store_true', help='天网完整版HTTP API + WebSocket')
mode.add_argument('--tianwang-multi', action='store_true', help='天网 + 多进程HTTP API + 多进程 WebSocket')
mode.add_argument('--api-only', action='store_true', help='仅 HTTP API不含 WebSocket / AI Agent')
mode.add_argument('--multi', action='store_true', help='多进程模式')
parser.add_argument('--no-agent', action='store_true', help='不启用 AI Agent')
parser.add_argument('--host', type=str, default=DEFAULT_HTTP_HOST, help=f'HTTP API 监听地址(默认 {DEFAULT_HTTP_HOST}')
parser.add_argument('--port', '-p', type=int, default=DEFAULT_HTTP_PORT, help=f'HTTP API 端口(默认 {DEFAULT_HTTP_PORT}')
parser.add_argument('--workers', '-w', type=int, default=None, help='工作进程数(仅多进程模式,默认 CPU 核心数)')
args = parser.parse_args()
enable_agent = not args.no_agent
if args.api_only:
run_api_only(host=args.host, port=args.port)
elif args.tianwang:
run_tianwang(enable_agent=enable_agent, host=args.host, port=args.port)
elif args.tianwang_multi:
run_tianwang_multi(num_workers=args.workers, enable_agent=enable_agent, host=args.host, port=args.port)
elif args.multi:
run_multi_process(num_workers=args.workers, enable_agent=enable_agent)
else:
run_websocket(enable_agent=enable_agent)
if __name__ == "__main__":
main()