refactor: 更新ComfyWorkflow类的构造函数,简化工作流数据处理逻辑,并在相关API调用中应用新结构
This commit is contained in:
@@ -258,12 +258,12 @@ class WorkflowQueueManager:
|
||||
if not workflow_run:
|
||||
raise Exception(f"找不到工作流运行记录: {workflow_run_id}")
|
||||
|
||||
workflow_data = json.loads(workflow_run["workflow_json"])
|
||||
request_data = json.loads(workflow_run["request_data"])
|
||||
|
||||
workflow_data = json.loads(workflow_run.workflow_json)
|
||||
request_data = json.loads(workflow_run.request_data)
|
||||
workflow = ComfyWorkflow(workflow_run.workflow_name, workflow_data)
|
||||
# 执行工作流
|
||||
result = await _execute_prompt_on_server(
|
||||
workflow_data, request_data, server, workflow_run_id
|
||||
workflow, request_data, server, workflow_run_id
|
||||
)
|
||||
|
||||
# 保存处理后的结果到数据库
|
||||
@@ -307,19 +307,19 @@ class WorkflowQueueManager:
|
||||
|
||||
result = {
|
||||
"id": workflow_run_id,
|
||||
"status": workflow_run["status"],
|
||||
"created_at": workflow_run["created_at"],
|
||||
"started_at": workflow_run["started_at"],
|
||||
"completed_at": workflow_run["completed_at"],
|
||||
"server_url": workflow_run["server_url"],
|
||||
"error_message": workflow_run["error_message"],
|
||||
"status": workflow_run.status,
|
||||
"created_at": workflow_run.created_at,
|
||||
"started_at": workflow_run.started_at,
|
||||
"completed_at": workflow_run.completed_at,
|
||||
"server_url": workflow_run.server_url,
|
||||
"error_message": workflow_run.error_message,
|
||||
"nodes": nodes,
|
||||
}
|
||||
|
||||
# 如果任务完成,从数据库获取结果
|
||||
if workflow_run["status"] == "completed" and workflow_run.get("result"):
|
||||
if workflow_run.status == "completed" and workflow_run.result:
|
||||
try:
|
||||
result["result"] = json.loads(workflow_run["result"])
|
||||
result["result"] = json.loads(workflow_run.result)
|
||||
except (json.JSONDecodeError, TypeError):
|
||||
result["result"] = None
|
||||
|
||||
@@ -369,7 +369,7 @@ queue_manager = WorkflowQueueManager(monitor_interval=5)
|
||||
|
||||
|
||||
async def _execute_prompt_on_server(
|
||||
workflow_data: dict,
|
||||
workflow: ComfyWorkflow,
|
||||
request_data: dict,
|
||||
server: ComfyUIServerInfo,
|
||||
workflow_run_id: str,
|
||||
@@ -381,8 +381,7 @@ async def _execute_prompt_on_server(
|
||||
client_id = str(uuid.uuid4())
|
||||
|
||||
# 构建prompt
|
||||
flow = ComfyWorkflow(workflow_data)
|
||||
prompt = await flow.build_prompt(server, request_data)
|
||||
prompt = await workflow.build_prompt(server, request_data)
|
||||
|
||||
# 更新工作流运行状态,记录prompt_id和client_id
|
||||
await update_workflow_run_status(
|
||||
@@ -394,7 +393,7 @@ async def _execute_prompt_on_server(
|
||||
)
|
||||
|
||||
# 提交到ComfyUI
|
||||
prompt_id = await _queue_prompt(workflow_data, prompt, client_id, server.http_url)
|
||||
prompt_id = await _queue_prompt(workflow, prompt, client_id, server.http_url)
|
||||
|
||||
# 更新prompt_id
|
||||
await update_workflow_run_status(
|
||||
@@ -407,13 +406,13 @@ async def _execute_prompt_on_server(
|
||||
|
||||
# 获取执行结果,现在支持节点级别的状态跟踪
|
||||
results = await _get_execution_results(
|
||||
workflow_data, prompt_id, client_id, server.ws_url, workflow_run_id
|
||||
workflow, prompt_id, client_id, server.ws_url, workflow_run_id
|
||||
)
|
||||
return results
|
||||
|
||||
|
||||
async def _queue_prompt(
|
||||
workflow: dict, prompt: dict, client_id: str, http_url: str
|
||||
workflow: ComfyWorkflow, prompt: dict, client_id: str, http_url: str
|
||||
) -> str:
|
||||
"""通过HTTP POST将工作流任务提交到指定的ComfyUI服务器。"""
|
||||
for node_id in prompt:
|
||||
@@ -423,7 +422,7 @@ async def _queue_prompt(
|
||||
"client_id": client_id,
|
||||
"extra_data": {
|
||||
"api_key_comfy_org": "",
|
||||
"extra_pnginfo": {"workflow": workflow},
|
||||
"extra_pnginfo": {"workflow": workflow.workflow_data.model_dump()},
|
||||
},
|
||||
}
|
||||
async with aiohttp.ClientSession(timeout=ClientTimeout(total=90)) as session:
|
||||
@@ -443,7 +442,7 @@ async def _queue_prompt(
|
||||
|
||||
|
||||
async def _get_execution_results(
|
||||
workflow_data: Dict,
|
||||
workflow: ComfyWorkflow,
|
||||
prompt_id: str,
|
||||
client_id: str,
|
||||
ws_url: str,
|
||||
@@ -511,17 +510,17 @@ async def _get_execution_results(
|
||||
node = next(
|
||||
(
|
||||
x
|
||||
for x in workflow_data["nodes"]
|
||||
if str(x["id"]) == node_id
|
||||
for x in workflow.workflow_data.nodes
|
||||
if str(x.id) == node_id
|
||||
),
|
||||
None,
|
||||
)
|
||||
if (
|
||||
node
|
||||
and node.get("title", "")
|
||||
and node["title"].startswith(API_OUTPUT_PREFIX)
|
||||
and node.title
|
||||
and node.title.startswith(API_OUTPUT_PREFIX)
|
||||
):
|
||||
title = node["title"].replace(API_OUTPUT_PREFIX, "")
|
||||
title = node.title.replace(API_OUTPUT_PREFIX, "")
|
||||
aggregated_outputs[title] = output_data
|
||||
logger.info(
|
||||
f"收到节点 {node_id} 的输出 (Prompt ID: {prompt_id})"
|
||||
|
||||
Reference in New Issue
Block a user