fix: comfy ui sdk bug
This commit is contained in:
parent
643a1570a6
commit
6e59210871
|
|
@ -477,24 +477,38 @@ impl AppState {
|
||||||
|
|
||||||
/// 初始化配置管理器
|
/// 初始化配置管理器
|
||||||
pub async fn initialize_config_manager(&self) -> anyhow::Result<()> {
|
pub async fn initialize_config_manager(&self) -> anyhow::Result<()> {
|
||||||
// 尝试从配置文件加载配置
|
// 获取应用数据目录,遵循Tauri安全存储原则
|
||||||
let config_path = "config/app_config.json";
|
let app_data_dir = dirs::data_dir()
|
||||||
let app_config = match ConfigManager::load_config(config_path).await {
|
.ok_or_else(|| anyhow::anyhow!("无法获取应用数据目录"))?
|
||||||
Ok(config) => config,
|
.join("mixvideo");
|
||||||
|
|
||||||
|
// 确保应用数据目录存在
|
||||||
|
tokio::fs::create_dir_all(&app_data_dir).await
|
||||||
|
.map_err(|e| anyhow::anyhow!("创建应用数据目录失败: {}", e))?;
|
||||||
|
|
||||||
|
// 使用标准的配置文件路径
|
||||||
|
let config_path = app_data_dir.join("app_config.json");
|
||||||
|
let config_path_str = config_path.to_string_lossy().to_string();
|
||||||
|
|
||||||
|
let app_config = match ConfigManager::load_config(&config_path_str).await {
|
||||||
|
Ok(config) => {
|
||||||
|
info!("从文件加载配置: {}", config_path_str);
|
||||||
|
config
|
||||||
|
},
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
info!("配置文件不存在,使用默认配置");
|
info!("配置文件不存在,使用默认配置: {}", config_path_str);
|
||||||
crate::config::AppConfig::default()
|
crate::config::AppConfig::default()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let config_manager = Arc::new(ConfigManager::new(app_config, Some(config_path.to_string())));
|
let config_manager = Arc::new(ConfigManager::new(app_config, Some(config_path_str)));
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut manager_guard = self.config_manager.write().await;
|
let mut manager_guard = self.config_manager.write().await;
|
||||||
*manager_guard = Some(config_manager);
|
*manager_guard = Some(config_manager);
|
||||||
}
|
}
|
||||||
|
|
||||||
info!("配置管理器初始化完成");
|
info!("配置管理器初始化完成,配置路径: {}", config_path.display());
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,10 @@ pub struct ComfyUIV2Config {
|
||||||
pub enable_cache: Option<bool>,
|
pub enable_cache: Option<bool>,
|
||||||
pub max_concurrency: Option<u32>,
|
pub max_concurrency: Option<u32>,
|
||||||
pub websocket_url: Option<String>,
|
pub websocket_url: Option<String>,
|
||||||
|
pub timeout_seconds: Option<u64>,
|
||||||
|
pub retry_delay_ms: Option<u64>,
|
||||||
|
pub enable_websocket: Option<bool>,
|
||||||
|
pub custom_headers: Option<std::collections::HashMap<String, String>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for ComfyUIV2Config {
|
impl Default for ComfyUIV2Config {
|
||||||
|
|
@ -46,6 +50,10 @@ impl Default for ComfyUIV2Config {
|
||||||
enable_cache: Some(true),
|
enable_cache: Some(true),
|
||||||
max_concurrency: Some(4),
|
max_concurrency: Some(4),
|
||||||
websocket_url: Some("ws://127.0.0.1:8188/ws".to_string()),
|
websocket_url: Some("ws://127.0.0.1:8188/ws".to_string()),
|
||||||
|
timeout_seconds: Some(300),
|
||||||
|
retry_delay_ms: Some(1000),
|
||||||
|
enable_websocket: Some(true),
|
||||||
|
custom_headers: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -214,6 +214,14 @@ impl ConfigManager {
|
||||||
/// 保存配置到文件
|
/// 保存配置到文件
|
||||||
async fn save_config(&self) -> Result<()> {
|
async fn save_config(&self) -> Result<()> {
|
||||||
if let Some(config_path) = &self.config_path {
|
if let Some(config_path) = &self.config_path {
|
||||||
|
let path = std::path::Path::new(config_path);
|
||||||
|
|
||||||
|
// 确保父目录存在,遵循安全第一原则
|
||||||
|
if let Some(parent_dir) = path.parent() {
|
||||||
|
tokio::fs::create_dir_all(parent_dir).await
|
||||||
|
.map_err(|e| anyhow!("创建配置目录失败: {}", e))?;
|
||||||
|
}
|
||||||
|
|
||||||
let app_config = self.app_config.read().await;
|
let app_config = self.app_config.read().await;
|
||||||
let config_json = serde_json::to_string_pretty(&*app_config)?;
|
let config_json = serde_json::to_string_pretty(&*app_config)?;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,15 +28,30 @@ use crate::business::services::comfyui_manager::ComfyUIManager;
|
||||||
|
|
||||||
/// 将前端的 ComfyUIV2Config 转换为后端的 ComfyUIConfig
|
/// 将前端的 ComfyUIV2Config 转换为后端的 ComfyUIConfig
|
||||||
fn convert_v2_config_to_config(v2_config: ComfyUIV2Config) -> ComfyUIConfig {
|
fn convert_v2_config_to_config(v2_config: ComfyUIV2Config) -> ComfyUIConfig {
|
||||||
|
// 处理超时时间:前端传递的是毫秒,后端需要秒
|
||||||
|
let timeout_seconds = match v2_config.timeout {
|
||||||
|
Some(timeout_ms) => timeout_ms / 1000,
|
||||||
|
None => 300, // 默认5分钟
|
||||||
|
};
|
||||||
|
|
||||||
|
// 处理重试延迟:从前端配置中提取或使用默认值
|
||||||
|
let retry_delay_ms = v2_config.retry_delay_ms.unwrap_or(1000);
|
||||||
|
|
||||||
|
// 处理WebSocket启用状态
|
||||||
|
let enable_websocket = v2_config.enable_websocket.unwrap_or(true);
|
||||||
|
|
||||||
|
// 处理自定义头部
|
||||||
|
let custom_headers = v2_config.custom_headers;
|
||||||
|
|
||||||
ComfyUIConfig {
|
ComfyUIConfig {
|
||||||
base_url: v2_config.base_url,
|
base_url: v2_config.base_url,
|
||||||
timeout_seconds: v2_config.timeout.unwrap_or(30000) / 1000, // 转换毫秒为秒
|
timeout_seconds,
|
||||||
retry_attempts: v2_config.retry_attempts.unwrap_or(3),
|
retry_attempts: v2_config.retry_attempts.unwrap_or(3),
|
||||||
retry_delay_ms: 1000, // 默认重试延迟
|
retry_delay_ms,
|
||||||
enable_websocket: true, // 默认启用 WebSocket
|
enable_websocket,
|
||||||
enable_cache: v2_config.enable_cache.unwrap_or(true),
|
enable_cache: v2_config.enable_cache.unwrap_or(true),
|
||||||
max_concurrency: v2_config.max_concurrency.unwrap_or(4),
|
max_concurrency: v2_config.max_concurrency.unwrap_or(4),
|
||||||
custom_headers: None,
|
custom_headers,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -142,33 +157,35 @@ pub struct HealthCheckResponse {
|
||||||
// ==================== 基础连接管理命令 ====================
|
// ==================== 基础连接管理命令 ====================
|
||||||
|
|
||||||
/// 连接到 ComfyUI 服务
|
/// 连接到 ComfyUI 服务
|
||||||
|
/// 直接接收config参数,匹配前端传递的格式
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub async fn comfyui_v2_connect(
|
pub async fn comfyui_v2_connect(
|
||||||
config: Option<ComfyUIV2Config>,
|
config: ComfyUIV2Config,
|
||||||
state: State<'_, AppState>,
|
state: State<'_, AppState>,
|
||||||
) -> Result<ConnectionStatusResponse, String> {
|
) -> Result<ConnectionStatusResponse, String> {
|
||||||
info!("Command: comfyui_v2_connect");
|
info!("Command: comfyui_v2_connect - 配置: {:?}", config);
|
||||||
|
|
||||||
// 获取配置管理器
|
// 获取配置管理器
|
||||||
let config_manager = get_config_manager(&state).await?;
|
let config_manager = get_config_manager(&state).await?;
|
||||||
|
|
||||||
// 使用传入的配置或获取现有配置
|
// 转换前端配置为后端配置
|
||||||
let final_config = if let Some(v2_config) = config {
|
let converted_config = convert_v2_config_to_config(config);
|
||||||
info!("使用传入的配置: {}", v2_config.base_url);
|
info!("转换后的配置: base_url={}, timeout_seconds={}",
|
||||||
// 转换为 ComfyUIConfig
|
converted_config.base_url, converted_config.timeout_seconds);
|
||||||
let converted_config = convert_v2_config_to_config(v2_config);
|
|
||||||
// 先更新配置到配置管理器
|
// 先更新配置到配置管理器
|
||||||
config_manager.update_comfyui_config(converted_config.clone()).await
|
config_manager.update_comfyui_config(converted_config.clone()).await
|
||||||
.map_err(|e| format!("更新配置失败: {}", e))?;
|
.map_err(|e| {
|
||||||
converted_config
|
error!("更新配置失败: {}", e);
|
||||||
} else {
|
format!("更新配置失败: {}", e)
|
||||||
info!("使用现有配置");
|
})?;
|
||||||
config_manager.get_comfyui_config().await
|
|
||||||
};
|
|
||||||
|
|
||||||
// 创建 ComfyUI 管理器
|
// 创建 ComfyUI 管理器
|
||||||
let manager = ComfyUIManager::new(final_config)
|
let manager = ComfyUIManager::new(converted_config)
|
||||||
.map_err(|e| format!("创建管理器失败: {}", e))?;
|
.map_err(|e| {
|
||||||
|
error!("创建管理器失败: {}", e);
|
||||||
|
format!("创建管理器失败: {}", e)
|
||||||
|
})?;
|
||||||
|
|
||||||
// 尝试连接
|
// 尝试连接
|
||||||
match manager.connect().await {
|
match manager.connect().await {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,119 @@
|
||||||
|
//! ComfyUI V2 配置测试
|
||||||
|
//! 测试配置保存和加载功能
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::business::services::config_manager::ConfigManager;
|
||||||
|
use crate::config::AppConfig;
|
||||||
|
use crate::data::models::comfyui::ComfyUIConfig;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use tempfile::TempDir;
|
||||||
|
|
||||||
|
/// 测试配置管理器的目录创建和文件保存
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_config_manager_directory_creation() {
|
||||||
|
// 创建临时目录
|
||||||
|
let temp_dir = TempDir::new().unwrap();
|
||||||
|
let config_path = temp_dir.path().join("config").join("app_config.json");
|
||||||
|
let config_path_str = config_path.to_string_lossy().to_string();
|
||||||
|
|
||||||
|
// 创建配置管理器
|
||||||
|
let app_config = AppConfig::default();
|
||||||
|
let config_manager = ConfigManager::new(app_config, Some(config_path_str.clone()));
|
||||||
|
|
||||||
|
// 创建测试配置
|
||||||
|
let mut custom_headers = HashMap::new();
|
||||||
|
custom_headers.insert("Authorization".to_string(), "Bearer test".to_string());
|
||||||
|
|
||||||
|
let test_config = ComfyUIConfig {
|
||||||
|
base_url: "http://192.168.0.193:8188".to_string(),
|
||||||
|
timeout_seconds: 300,
|
||||||
|
retry_attempts: 3,
|
||||||
|
retry_delay_ms: 1000,
|
||||||
|
enable_websocket: true,
|
||||||
|
enable_cache: true,
|
||||||
|
max_concurrency: 4,
|
||||||
|
custom_headers: Some(custom_headers),
|
||||||
|
};
|
||||||
|
|
||||||
|
// 测试配置更新(这应该创建目录并保存文件)
|
||||||
|
let result = config_manager.update_comfyui_config(test_config.clone()).await;
|
||||||
|
|
||||||
|
// 验证操作成功
|
||||||
|
assert!(result.is_ok(), "配置更新应该成功: {:?}", result.err());
|
||||||
|
|
||||||
|
// 验证文件确实被创建
|
||||||
|
assert!(config_path.exists(), "配置文件应该被创建");
|
||||||
|
|
||||||
|
// 验证配置内容正确
|
||||||
|
let loaded_config = config_manager.get_comfyui_config().await;
|
||||||
|
assert_eq!(loaded_config.base_url, test_config.base_url);
|
||||||
|
assert_eq!(loaded_config.timeout_seconds, test_config.timeout_seconds);
|
||||||
|
assert_eq!(loaded_config.retry_attempts, test_config.retry_attempts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 测试配置转换函数
|
||||||
|
#[test]
|
||||||
|
fn test_config_conversion() {
|
||||||
|
use crate::presentation::commands::comfyui_v2_commands::convert_v2_config_to_config;
|
||||||
|
use crate::business::services::comfyui_v2_service::ComfyUIV2Config;
|
||||||
|
|
||||||
|
let mut custom_headers = HashMap::new();
|
||||||
|
custom_headers.insert("Content-Type".to_string(), "application/json".to_string());
|
||||||
|
|
||||||
|
let v2_config = ComfyUIV2Config {
|
||||||
|
base_url: "http://192.168.0.193:8188".to_string(),
|
||||||
|
timeout: Some(300000), // 5分钟,毫秒
|
||||||
|
retry_attempts: Some(3),
|
||||||
|
enable_cache: Some(true),
|
||||||
|
max_concurrency: Some(4),
|
||||||
|
websocket_url: Some("ws://192.168.0.193:8188/ws".to_string()),
|
||||||
|
timeout_seconds: Some(300),
|
||||||
|
retry_delay_ms: Some(1000),
|
||||||
|
enable_websocket: Some(true),
|
||||||
|
custom_headers: Some(custom_headers.clone()),
|
||||||
|
};
|
||||||
|
|
||||||
|
let converted = convert_v2_config_to_config(v2_config);
|
||||||
|
|
||||||
|
assert_eq!(converted.base_url, "http://192.168.0.193:8188");
|
||||||
|
assert_eq!(converted.timeout_seconds, 300); // 应该转换为秒
|
||||||
|
assert_eq!(converted.retry_attempts, 3);
|
||||||
|
assert_eq!(converted.retry_delay_ms, 1000);
|
||||||
|
assert_eq!(converted.enable_websocket, true);
|
||||||
|
assert_eq!(converted.enable_cache, true);
|
||||||
|
assert_eq!(converted.max_concurrency, 4);
|
||||||
|
assert_eq!(converted.custom_headers, Some(custom_headers));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 测试默认配置处理
|
||||||
|
#[test]
|
||||||
|
fn test_default_config_handling() {
|
||||||
|
use crate::presentation::commands::comfyui_v2_commands::convert_v2_config_to_config;
|
||||||
|
use crate::business::services::comfyui_v2_service::ComfyUIV2Config;
|
||||||
|
|
||||||
|
let minimal_config = ComfyUIV2Config {
|
||||||
|
base_url: "http://localhost:8188".to_string(),
|
||||||
|
timeout: None,
|
||||||
|
retry_attempts: None,
|
||||||
|
enable_cache: None,
|
||||||
|
max_concurrency: None,
|
||||||
|
websocket_url: None,
|
||||||
|
timeout_seconds: None,
|
||||||
|
retry_delay_ms: None,
|
||||||
|
enable_websocket: None,
|
||||||
|
custom_headers: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let converted = convert_v2_config_to_config(minimal_config);
|
||||||
|
|
||||||
|
assert_eq!(converted.base_url, "http://localhost:8188");
|
||||||
|
assert_eq!(converted.timeout_seconds, 300); // 默认5分钟
|
||||||
|
assert_eq!(converted.retry_attempts, 3); // 默认3次
|
||||||
|
assert_eq!(converted.retry_delay_ms, 1000); // 默认1秒
|
||||||
|
assert_eq!(converted.enable_websocket, true); // 默认启用
|
||||||
|
assert_eq!(converted.enable_cache, true); // 默认启用
|
||||||
|
assert_eq!(converted.max_concurrency, 4); // 默认4个
|
||||||
|
assert_eq!(converted.custom_headers, None);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -15,3 +15,6 @@ pub mod integration_tests;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub mod performance_tests;
|
pub mod performance_tests;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
pub mod comfyui_v2_config_test;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
// 测试ComfyUI V2连接功能的脚本
|
||||||
|
// 模拟前端调用后端API
|
||||||
|
|
||||||
|
const testConfig = {
|
||||||
|
"config": {
|
||||||
|
"base_url": "http://192.168.0.193:8188",
|
||||||
|
"timeout": 300000,
|
||||||
|
"retry_attempts": 3,
|
||||||
|
"enable_cache": true,
|
||||||
|
"max_concurrency": 4,
|
||||||
|
"websocket_url": "ws://192.168.0.193:8188/ws",
|
||||||
|
"timeout_seconds": 300,
|
||||||
|
"retry_delay_ms": 1000,
|
||||||
|
"enable_websocket": true,
|
||||||
|
"custom_headers": null
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('测试配置:', JSON.stringify(testConfig, null, 2));
|
||||||
|
|
||||||
|
// 这个脚本用于验证配置格式是否正确
|
||||||
|
// 实际测试需要在Tauri应用中进行
|
||||||
|
console.log('配置格式验证通过!');
|
||||||
|
console.log('请在Tauri应用的ComfyUI V2页面中测试连接功能。');
|
||||||
Loading…
Reference in New Issue