{
  "id": "comfy",
  "enabledByDefault": true,
  "providers": [
    "comfy"
  ],
  "providerAuthEnvVars": {
    "comfy": [
      "COMFY_API_KEY",
      "COMFY_CLOUD_API_KEY"
    ]
  },
  "providerAuthChoices": [
    {
      "provider": "comfy",
      "method": "cloud-api-key",
      "choiceId": "comfy-cloud-api-key",
      "choiceLabel": "Comfy Cloud API key",
      "choiceHint": "Required for cloud workflows",
      "groupId": "comfy",
      "groupLabel": "ComfyUI",
      "groupHint": "Local or cloud workflows",
      "optionKey": "comfyApiKey",
      "cliFlag": "--comfy-api-key",
      "cliOption": "--comfy-api-key <key>",
      "cliDescription": "Comfy Cloud API key",
      "onboardingScopes": [
        "image-generation"
      ]
    }
  ],
  "contracts": {
    "imageGenerationProviders": [
      "comfy"
    ],
    "musicGenerationProviders": [
      "comfy"
    ],
    "videoGenerationProviders": [
      "comfy"
    ]
  },
  "configSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {
      "mode": {
        "type": "string",
        "enum": [
          "local",
          "cloud"
        ]
      },
      "baseUrl": {
        "type": "string"
      },
      "apiKey": {
        "type": [
          "string",
          "object"
        ]
      },
      "allowPrivateNetwork": {
        "type": "boolean"
      },
      "workflowPath": {
        "type": "string"
      },
      "workflow": {
        "type": "object"
      },
      "promptNodeId": {
        "type": "string"
      },
      "promptInputName": {
        "type": "string"
      },
      "inputImageNodeId": {
        "type": "string"
      },
      "inputImageInputName": {
        "type": "string"
      },
      "outputNodeId": {
        "type": "string"
      },
      "pollIntervalMs": {
        "type": "integer",
        "minimum": 100
      },
      "timeoutMs": {
        "type": "integer",
        "minimum": 1000
      },
      "image": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "workflowPath": {
            "type": "string"
          },
          "workflow": {
            "type": "object"
          },
          "promptNodeId": {
            "type": "string"
          },
          "promptInputName": {
            "type": "string"
          },
          "inputImageNodeId": {
            "type": "string"
          },
          "inputImageInputName": {
            "type": "string"
          },
          "outputNodeId": {
            "type": "string"
          },
          "pollIntervalMs": {
            "type": "integer",
            "minimum": 100
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000
          }
        }
      },
      "video": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "workflowPath": {
            "type": "string"
          },
          "workflow": {
            "type": "object"
          },
          "promptNodeId": {
            "type": "string"
          },
          "promptInputName": {
            "type": "string"
          },
          "inputImageNodeId": {
            "type": "string"
          },
          "inputImageInputName": {
            "type": "string"
          },
          "outputNodeId": {
            "type": "string"
          },
          "pollIntervalMs": {
            "type": "integer",
            "minimum": 100
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000
          }
        }
      },
      "music": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "workflowPath": {
            "type": "string"
          },
          "workflow": {
            "type": "object"
          },
          "promptNodeId": {
            "type": "string"
          },
          "promptInputName": {
            "type": "string"
          },
          "outputNodeId": {
            "type": "string"
          },
          "pollIntervalMs": {
            "type": "integer",
            "minimum": 100
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000
          }
        }
      }
    }
  }
}
