173 lines
6.1 KiB
Rust
173 lines
6.1 KiB
Rust
use std::collections::HashMap;
|
||
use std::time::Duration;
|
||
use tokio::time::sleep;
|
||
use uni_comfyui_sdk::{
|
||
UniComfyUIClient, ComfyUIError, Result, ServerHeartbeatRequest, ServerRegistrationRequest,
|
||
ServerUnregisterRequest,
|
||
};
|
||
|
||
#[tokio::main]
|
||
async fn main() -> Result<()> {
|
||
let client = UniComfyUIClient::new("http://192.168.0.148:18000")?;
|
||
|
||
// Demonstrate comprehensive server management
|
||
println!("=== Server Management Demo ===");
|
||
|
||
// Register a new server
|
||
let server_name = "demo-server";
|
||
let registration = ServerRegistrationRequest {
|
||
name: server_name.to_string(),
|
||
http_url: "http://192.168.0.148:8188".to_string(),
|
||
ws_url: "ws://192.168.0.148:8188".to_string(),
|
||
};
|
||
|
||
match client.register_server(registration).await {
|
||
Ok(response) => println!("✓ Server registered: {:?}", response),
|
||
Err(ComfyUIError::Api { status: 409, .. }) => {
|
||
println!("ℹ Server already exists (409 conflict)")
|
||
}
|
||
Err(e) => println!("✗ Failed to register server: {}", e),
|
||
}
|
||
|
||
// Send heartbeat
|
||
let heartbeat = ServerHeartbeatRequest {
|
||
name: server_name.to_string(),
|
||
};
|
||
|
||
match client.update_heartbeat(heartbeat).await {
|
||
Ok(response) => println!("✓ Heartbeat sent: {:?}", response),
|
||
Err(e) => println!("✗ Failed to send heartbeat: {}", e),
|
||
}
|
||
|
||
// List all servers
|
||
match client.list_all_servers().await {
|
||
Ok(servers) => {
|
||
println!("✓ Found {} servers:", servers.len());
|
||
for server in servers {
|
||
println!(" - {}: {} ({})", server.name, server.http_url, server.status);
|
||
}
|
||
}
|
||
Err(e) => println!("✗ Failed to list servers: {}", e),
|
||
}
|
||
|
||
// Demonstrate workflow management
|
||
println!("\n=== Workflow Management Demo ===");
|
||
|
||
// Get all workflows
|
||
match client.get_all_workflows().await {
|
||
Ok(workflows) => println!("✓ Found {} workflows", workflows.len()),
|
||
Err(e) => println!("✗ Failed to get workflows: {}", e),
|
||
}
|
||
|
||
// Publish a sample workflow
|
||
let mut sample_workflow = HashMap::new();
|
||
sample_workflow.insert("name".to_string(), serde_json::json!("demo_workflow"));
|
||
sample_workflow.insert("version".to_string(), serde_json::json!("1.0.0"));
|
||
sample_workflow.insert(
|
||
"description".to_string(),
|
||
serde_json::json!("A demo workflow for testing"),
|
||
);
|
||
|
||
match client.publish_workflow(sample_workflow).await {
|
||
Ok(_) => println!("✓ Workflow published successfully"),
|
||
Err(e) => println!("✗ Failed to publish workflow: {}", e),
|
||
}
|
||
|
||
// Demonstrate workflow execution
|
||
println!("\n=== Workflow Execution Demo ===");
|
||
|
||
let mut execution_data = HashMap::new();
|
||
execution_data.insert("input_text".to_string(), serde_json::json!("Hello, ComfyUI!"));
|
||
execution_data.insert("steps".to_string(), serde_json::json!(20));
|
||
execution_data.insert("seed".to_string(), serde_json::json!(42));
|
||
|
||
match client
|
||
.run_workflow("demo_workflow", Some("1.0.0"), execution_data)
|
||
.await
|
||
{
|
||
Ok(response) => {
|
||
println!("✓ Workflow execution started");
|
||
|
||
// Try to extract run ID from response for status checking
|
||
if let Some(run_id) = response.get("run_id").and_then(|v| v.as_str()) {
|
||
println!(" Run ID: {}", run_id);
|
||
|
||
// Poll for status (demo - in real usage you'd want better polling logic)
|
||
for i in 1..=3 {
|
||
sleep(Duration::from_secs(2)).await;
|
||
match client.get_run_status(run_id).await {
|
||
Ok(status) => {
|
||
println!(" Status check {}: {:?}", i, status);
|
||
}
|
||
Err(e) => println!(" Status check {} failed: {}", i, e),
|
||
}
|
||
}
|
||
}
|
||
}
|
||
Err(e) => println!("✗ Failed to start workflow: {}", e),
|
||
}
|
||
|
||
// Demonstrate monitoring
|
||
println!("\n=== Monitoring Demo ===");
|
||
|
||
// System health
|
||
match client.get_system_health().await {
|
||
Ok(health) => println!("✓ System health: {:?}", health),
|
||
Err(e) => println!("✗ Failed to get system health: {}", e),
|
||
}
|
||
|
||
// System stats
|
||
match client.get_system_stats().await {
|
||
Ok(stats) => println!("✓ System stats retrieved"),
|
||
Err(e) => println!("✗ Failed to get system stats: {}", e),
|
||
}
|
||
|
||
// Recent tasks
|
||
match client.get_recent_tasks(Some(5)).await {
|
||
Ok(tasks) => println!("✓ Found {} recent tasks", tasks.len()),
|
||
Err(e) => println!("✗ Failed to get recent tasks: {}", e),
|
||
}
|
||
|
||
// Force health check
|
||
match client.force_health_check().await {
|
||
Ok(response) => println!("✓ Health check forced: {:?}", response),
|
||
Err(e) => println!("✗ Failed to force health check: {}", e),
|
||
}
|
||
|
||
// Demonstrate RunX endpoints
|
||
println!("\n=== RunX Demo ===");
|
||
|
||
// Get schema for model_with_multi_dress
|
||
match client.model_with_multi_dress_json_schema().await {
|
||
Ok(schema) => println!("✓ Got model_with_multi_dress schema"),
|
||
Err(e) => println!("✗ Failed to get schema: {}", e),
|
||
}
|
||
|
||
// Try to run model_with_multi_dress workflow
|
||
let mut dress_data = HashMap::new();
|
||
dress_data.insert("model_image".to_string(), serde_json::json!("base64_image_data"));
|
||
dress_data.insert("dress_images".to_string(), serde_json::json!(["dress1.jpg", "dress2.jpg"]));
|
||
|
||
match client
|
||
.model_with_multi_dress(None, dress_data)
|
||
.await
|
||
{
|
||
Ok(response) => println!("✓ Model with multi dress executed: {:?}", response),
|
||
Err(e) => println!("✗ Failed to execute model with multi dress: {}", e),
|
||
}
|
||
|
||
// Cleanup: Unregister the demo server
|
||
println!("\n=== Cleanup ===");
|
||
let unregister = ServerUnregisterRequest {
|
||
name: server_name.to_string(),
|
||
};
|
||
|
||
match client.unregister_server(unregister).await {
|
||
Ok(response) => println!("✓ Server unregistered: {:?}", response),
|
||
Err(e) => println!("✗ Failed to unregister server: {}", e),
|
||
}
|
||
|
||
println!("\n=== Demo Complete ===");
|
||
Ok(())
|
||
}
|