97 lines
2.4 KiB
Python
97 lines
2.4 KiB
Python
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
|