import asyncio from datetime import datetime from typing import List import aiohttp from fastapi import APIRouter, HTTPException, Path from pydantic import BaseModel from app.comfy.comfy_queue import queue_manager from app.comfy.comfy_server import server_manager from app.config import Settings settings = Settings() service_router = APIRouter( prefix="/api/service", tags=["Status"], ) class ServerQueueDetails(BaseModel): running_count: int pending_count: int class ServerStatus(BaseModel): server_index: int http_url: str ws_url: str is_reachable: bool is_free: bool queue_details: ServerQueueDetails class FileDetails(BaseModel): name: str size_kb: float modified_at: datetime class ServerFiles(BaseModel): server_index: int http_url: str input_files: List[FileDetails] output_files: List[FileDetails] @service_router.get("/metrics") async def get_metrics(): """ 获取队列状态概览。 """ try: pending_count = len(queue_manager.pending_tasks) running_count = len(queue_manager.running_tasks) return { "pending_tasks": pending_count, "running_tasks": running_count, "total_servers": len(queue_manager.running_tasks), "queue_manager_status": "active", } except Exception as e: raise HTTPException(status_code=500, detail=f"获取队列状态失败: {str(e)}") @service_router.get("/servers_status", response_model=List[ServerStatus]) async def get_servers_status(): """ 获取所有已配置的ComfyUI服务器的配置信息和实时状态。 """ servers = await server_manager.get_all_servers() if not servers: return [] async with aiohttp.ClientSession() as session: status_tasks = [ queue_manager.get_server_status(server, session) for server in servers ] live_statuses = await asyncio.gather(*status_tasks) response_list = [] for i, server_config in enumerate(servers): status_data = live_statuses[i] response_list.append( ServerStatus( server_index=i, http_url=server_config.http_url, ws_url=server_config.ws_url, is_reachable=status_data["is_reachable"], is_free=status_data["is_free"], queue_details=status_data["queue_details"], ) ) return response_list