diff --git a/custom_routes.py b/custom_routes.py index 68cbe7e..f14563e 100644 --- a/custom_routes.py +++ b/custom_routes.py @@ -193,6 +193,9 @@ bypass_upload = os.environ.get('CD_BYPASS_UPLOAD', 'false').lower() == 'true' logger.info(f"CD_BYPASS_UPLOAD {bypass_upload}") +create_native_run_endpoint = None +status_endpoint = None +file_upload_endpoint = None def clear_current_prompt(sid): prompt_server = server.PromptServer.instance @@ -367,11 +370,39 @@ def send_prompt(sid: str, inputs: StreamingPrompt): logger.info(f"error: {error_type}, {e}") logger.info(f"stack trace: {stack_trace_short}") + + # # Add custom logic here + # if 'prompt_id' in response: + # prompt_id = response['prompt_id'] + # if prompt_id in prompt_metadata: + # metadata = prompt_metadata[prompt_id] + + # # Add additional information to the response + # response['status_endpoint'] = metadata.status_endpoint + # response['file_upload_endpoint'] = metadata.file_upload_endpoint + + return response + + @server.PromptServer.instance.routes.post("/comfyui-deploy/run") async def comfy_deploy_run(request): # Extract the bearer token from the Authorization header data = await request.json() + client_id = data.get("client_id") + # We proxy the request to Comfy Deploy, this is a native run + if "is_native_run" in data: + async with aiohttp.ClientSession() as session: + pprint(data) + # headers = request.headers.copy() + # headers['Content-Type'] = 'application/json' + async with session.post(data.get("native_run_api_endpoint"), json=data, headers={ + 'Content-Type': 'application/json', + 'Authorization': request.headers.get('Authorization') + }) as response: + data = await response.json() + print(data) + if "cd_token" in data: token = data["cd_token"] else: @@ -394,7 +425,7 @@ async def comfy_deploy_run(request): prompt = { "prompt": workflow_api, - "client_id": "comfy_deploy_instance", #api.client_id + "client_id": "comfy_deploy_instance" if client_id is None else client_id, "prompt_id": prompt_id, } diff --git a/web-plugin/index.js b/web-plugin/index.js index 38fb9f7..47358e8 100644 --- a/web-plugin/index.js +++ b/web-plugin/index.js @@ -83,6 +83,21 @@ function dispatchAPIEventData(data) { } } +let selectedWorkflowInfo +// let selectedWorkflowInfo = { +// workflow_id: "05da8f2b-63af-4c0c-86dd-08d01ec512b7", +// machine_id: "45ac5f85-b7b6-436f-8d97-2383b25485f3", +// native_run_api_endpoint: "http://localhost:3011/api/run", +// }; + +function getSelectedWorkflowInfo() { + return selectedWorkflowInfo; +} + +function setSelectedWorkflowInfo(info) { + selectedWorkflowInfo = info; +} + /** @typedef {import('../../../web/types/comfy.js').ComfyExtension} ComfyExtension*/ /** @type {ComfyExtension} */ const ext = { @@ -213,7 +228,7 @@ const ext = { (v) => { this.properties.workflow_name = v; }, - { multiline: false } + { multiline: false }, ); this.addWidget( @@ -223,7 +238,7 @@ const ext = { (v) => { this.properties.workflow_id = v; }, - { multiline: false } + { multiline: false }, ); this.addWidget( @@ -233,7 +248,7 @@ const ext = { (v) => { this.properties.version = v; }, - { multiline: false } + { multiline: false }, ); this.widgets_start_y = 10; @@ -270,11 +285,14 @@ const ext = { } // Register the node type - LiteGraph.registerNodeType("ComfyDeploy", Object.assign(ComfyDeploy, { - title: "Comfy Deploy", - title_mode: LiteGraph.NORMAL_TITLE, - collapsable: true, - })); + LiteGraph.registerNodeType( + "ComfyDeploy", + Object.assign(ComfyDeploy, { + title: "Comfy Deploy", + title_mode: LiteGraph.NORMAL_TITLE, + collapsable: true, + }), + ); ComfyDeploy.category = "deploy"; }, @@ -380,6 +398,8 @@ const ext = { } animate(); + } else if (message.type === "workflow_info") { + setSelectedWorkflowInfo(message.data); } // else if (message.type === "refresh") { // sendEventToCD("cd_plugin_onRefresh"); @@ -443,10 +463,10 @@ function createDynamicUIHtml(data) {

Missing Nodes

These nodes are not found with any matching custom_nodes in the ComfyUI Manager Database

${data.missing_nodes - .map((node) => { - return `

${node}

`; - }) - .join("")} + .map((node) => { + return `

${node}

`; + }) + .join("")} `; } @@ -454,14 +474,17 @@ function createDynamicUIHtml(data) { Object.values(data.custom_nodes).forEach((node) => { html += `
- ${node.name - } + ${ + node.name + }

${node.hash}

- ${node.warning - ? `

${node.warning}

` - : "" - } + ${ + node.warning + ? `

${node.warning}

` + : "" + }
`; }); @@ -475,8 +498,9 @@ function createDynamicUIHtml(data) { Object.entries(data.models).forEach(([section, items]) => { html += `
-

${section.charAt(0).toUpperCase() + section.slice(1) - }

`; +

${ + section.charAt(0).toUpperCase() + section.slice(1) + }

`; items.forEach((item) => { html += `

${item.name}

`; }); @@ -492,8 +516,9 @@ function createDynamicUIHtml(data) { Object.entries(data.files).forEach(([section, items]) => { html += `
-

${section.charAt(0).toUpperCase() + section.slice(1) - }

`; +

${ + section.charAt(0).toUpperCase() + section.slice(1) + }

`; items.forEach((item) => { html += `

${item.name}

`; }); @@ -1013,12 +1038,14 @@ export class LoadingDialog extends ComfyDialog { showLoading(title, message) { this.show(`
-

${title} ${this.loadingIcon - }

- ${message - ? `` - : "" - } +

${title} ${ + this.loadingIcon + }

+ ${ + message + ? `` + : "" + }
`); } @@ -1284,17 +1311,21 @@ export class ConfigDialog extends ComfyDialog {
- API Key: User / Org - + API Key: User / Org +
@@ -1483,3 +1514,31 @@ async function loadWorkflowApi(versionId) { // Show an error message to the user } } + +const orginal_fetch_api = api.fetchApi; +api.fetchApi = async (route, options) => { + console.log("Fetch API called with args:", route, options); + + const info = getSelectedWorkflowInfo(); + if (info && route.startsWith("/prompt")) { + console.log("Prompt API called"); + + const body = JSON.parse(options.body); + + return await fetch("/comfyui-deploy/run", { + method: "POST", + headers: { + Authorization: `Bearer ${getData().apiKey}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + client_id: body.client_id, + workflow_api_json: body.prompt, + is_native_run: true, + ...info, + }), + }); + } + + return await orginal_fetch_api.call(api, route, options); +};