fix: 修复ComfyUI队列API响应格式解析问题

- 修复WebSocket错误消息解析失败问题,支持更多错误字段格式
- 改进执行错误处理,收到错误时立即中断而不是等待超时
- 修复ComfyUI队列API响应格式不匹配问题,支持数组格式的队列数据
- 添加灵活的队列项解析逻辑,支持整数和字符串类型的prompt_id
- 在EventEmitter中添加错误存储功能,支持实时错误状态检查
- 更新所有相关的队列状态转换代码

解决的问题:
1. WebSocket消息解析错误:missing field 'message'
2. 执行错误后仍等待超时的问题
3. 队列API响应解析错误:invalid type integer/string expected
4. 批量处理中错误统计不准确的问题
This commit is contained in:
imeepos
2025-08-11 11:09:27 +08:00
parent b1e7191c10
commit 2075a731d2
9 changed files with 224 additions and 17 deletions

View File

@@ -9,6 +9,7 @@ use crate::types::{ExecutionProgress, ExecutionResult, ExecutionError, Execution
#[derive(Clone)]
pub struct EventEmitter {
callbacks: Arc<RwLock<HashMap<String, Arc<dyn ExecutionCallbacks>>>>,
last_error: Arc<RwLock<Option<ExecutionError>>>,
}
impl EventEmitter {
@@ -16,6 +17,7 @@ impl EventEmitter {
pub fn new() -> Self {
Self {
callbacks: Arc::new(RwLock::new(HashMap::new())),
last_error: Arc::new(RwLock::new(None)),
}
}
@@ -57,6 +59,12 @@ impl EventEmitter {
/// Emits an error event
pub async fn emit_error(&self, error: ExecutionError) {
// Store the error for later retrieval
{
let mut last_error_guard = self.last_error.write().await;
*last_error_guard = Some(error.clone());
}
let callbacks_map = self.callbacks.read().await;
for callback in callbacks_map.values() {
callback.on_error(error.clone());
@@ -74,6 +82,18 @@ impl EventEmitter {
let mut callbacks_map = self.callbacks.write().await;
callbacks_map.clear();
}
/// Gets the last execution error and clears it
pub async fn get_last_error(&self) -> Option<ExecutionError> {
let mut error_guard = self.last_error.write().await;
error_guard.take()
}
/// Clears the last error
pub async fn clear_last_error(&self) {
let mut error_guard = self.last_error.write().await;
*error_guard = None;
}
}
impl Default for EventEmitter {