| """ |
| MCP Tool: run_imagegen |
| Unified image generation task submission and execution interface. |
| """ |
|
|
| import time |
| import uuid |
| import threading |
| from .common import ( |
| _load_yaml, |
| _MODEL_LIST_PATH, |
| _TASK_DEFINITIONS, |
| _TASKS_DB, |
| _execute_imagegen_pipeline, |
| ) |
| from .error_schema import make_validation_error, make_not_found_error |
|
|
|
|
| def handle_run_imagegen(params: dict) -> dict: |
| """Unified image generation task execution interface.""" |
| if not isinstance(params, dict): |
| return make_validation_error("Request params must be an object.") |
|
|
| missing = [] |
| for req_field in ["task_type", "model", "prompt"]: |
| if req_field not in params or not params[req_field]: |
| missing.append(req_field) |
| if missing: |
| return make_validation_error( |
| f"Missing required parameter(s): {', '.join(missing)}", |
| missing_fields=missing, |
| ) |
|
|
| task_type = params["task_type"] |
| valid_tasks = [t["task_type"] for t in _TASK_DEFINITIONS] |
| if task_type not in valid_tasks: |
| return make_validation_error( |
| f"Invalid task_type '{task_type}'. Must be one of {valid_tasks}.", |
| invalid_fields={"task_type": f"Must be in {valid_tasks}"}, |
| ) |
|
|
| model_list = _load_yaml(_MODEL_LIST_PATH) |
| checkpoints = model_list.get("Checkpoint", {}) |
| all_models = set() |
| for arch_name, arch_data in checkpoints.items(): |
| if isinstance(arch_data, dict): |
| for m in arch_data.get("models", []): |
| all_models.add(m.get("display_name")) |
|
|
| if params["model"] not in all_models: |
| return make_not_found_error("model", params["model"]) |
|
|
| task_id = f"img_task_{uuid.uuid4().hex[:10]}" |
| created_at = int(time.time()) |
|
|
| _TASKS_DB[task_id] = { |
| "task_id": task_id, |
| "status": "queued", |
| "progress": 0, |
| "created_at": created_at, |
| } |
|
|
| async_exec = params.get("async_execution", False) |
|
|
| if async_exec: |
| t = threading.Thread(target=_execute_imagegen_pipeline, args=(task_id, params), daemon=True) |
| t.start() |
| return { |
| "status": "queued", |
| "task_id": task_id, |
| "poll_interval_ms": 2000, |
| "message": "Task queued successfully. Poll get_task_status for results.", |
| } |
| else: |
| _execute_imagegen_pipeline(task_id, params) |
| return _TASKS_DB[task_id] |
|
|