Compare commits

..
Author SHA1 Message Date
EmmanuelMr18 fd150aa20f fix: ctrl+click/cmd+click to open a item of the menu 2024-02-16 23:16:07 -06:00
Syn 17653508c5 Self Host (#27)
* Update README.md

* Update README.md
2024-02-17 13:09:26 +08:00
Emmanuel Morales ace12efd1a fix(workflows): user can click multiple times on run even while loading (#26) 2024-02-15 14:39:20 +08:00
bennykok 01e8668d1a chore(plugin): update comfyui json 2024-02-14 14:56:11 +08:00
Emmanuel Morales 8e58d962a7 feat(example page): add inpaint, controlnet and sdxl turbo workflows (#24) 2024-02-14 12:49:32 +08:00
bennykok c59c308d32 chore(plugin): update comfyui-json version, fixed some custom nodes detection 2024-02-12 16:01:05 +08:00
bennykok 4560f2cca9 chore(plugin): update comfyui-json version 2024-02-11 21:53:48 +08:00
Nick Kao 872752b820 Merge pull request #22 from BennyKok/fix/createRun-overwritring-ComfyUIDeployExternalText-inputs
fix(create run): ComfyUIDeployExternalText default value was overwritten
2024-02-10 11:08:03 -08:00
EmmanuelMr18 97bb2b69c5 fix(create run): ComfyUIDeployExternalText default value overwriting 2024-02-10 10:57:54 -06:00
bennykok 08fe87c8af fix(plugin): cached execution progress update 2024-02-09 22:13:43 +08:00
bennykok d43e5fcefc fix: live status not sending, add progress 2024-02-09 21:52:48 +08:00
Emmanuel Morales 65492a108c feat(example page): create initial 4 cards (#21)
* feat(example page): add new examples section in the navbar

* feat(example page): initial layout of the new page

* feat(example page): create initial 4 workflows

* style(example page): center title

* style(example page): remove comment

* fix(example page): add hyperlink for txt2img card
2024-02-09 11:15:30 +08:00
10 changed files with 72 additions and 22 deletions
+4
View File
@@ -93,6 +93,10 @@ Major areas
# Self Hosting with Vercel # Self Hosting with Vercel
[![Video](https://img.mytsi.org/i/nFOG479.png)](https://www.youtube.com/watch?v=hWvsEY1cS2M)
Tutorial Created by [Ross](https://github.com/rossman22590) and [Syn](https://github.com/mortlsyn)
Build command Build command
``` ```
+25 -4
View File
@@ -361,13 +361,30 @@ async def send_json_override(self, event, data, sid=None):
if event == 'executing' and data.get('node') is not None: if event == 'executing' and data.get('node') is not None:
node = data.get('node') node = data.get('node')
if 'prompt_id' in prompt_metadata: if prompt_id in prompt_metadata:
if 'progress' not in prompt_metadata[prompt_id]:
prompt_metadata[prompt_id]["progress"] = set()
prompt_metadata[prompt_id]["progress"].add(node)
calculated_progress = len(prompt_metadata[prompt_id]["progress"]) / len(prompt_metadata[prompt_id]['workflow_api'])
# print("calculated_progress", calculated_progress)
if 'last_updated_node' in prompt_metadata[prompt_id] and prompt_metadata[prompt_id]['last_updated_node'] == node: if 'last_updated_node' in prompt_metadata[prompt_id] and prompt_metadata[prompt_id]['last_updated_node'] == node:
return return
prompt_metadata[prompt_id]['last_updated_node'] = node prompt_metadata[prompt_id]['last_updated_node'] = node
class_type = prompt_metadata[prompt_id]['workflow_api'][node]['class_type'] class_type = prompt_metadata[prompt_id]['workflow_api'][node]['class_type']
print("updating run live status", class_type) print("updating run live status", class_type)
await update_run_live_status(prompt_id, "Executing " + class_type) await update_run_live_status(prompt_id, "Executing " + class_type, calculated_progress)
if event == 'execution_cached' and data.get('nodes') is not None:
if prompt_id in prompt_metadata:
if 'progress' not in prompt_metadata[prompt_id]:
prompt_metadata[prompt_id]["progress"] = set()
if 'nodes' in data:
for node in data.get('nodes', []):
prompt_metadata[prompt_id]["progress"].add(node)
# prompt_metadata[prompt_id]["progress"].update(data.get('nodes'))
if event == 'execution_error': if event == 'execution_error':
# Careful this might not be fully awaited. # Careful this might not be fully awaited.
@@ -391,18 +408,22 @@ class Status(Enum):
# Global variable to keep track of the last read line number # Global variable to keep track of the last read line number
last_read_line_number = 0 last_read_line_number = 0
async def update_run_live_status(prompt_id, live_status): async def update_run_live_status(prompt_id, live_status, calculated_progress: float):
if prompt_id not in prompt_metadata: if prompt_id not in prompt_metadata:
return return
print("progress", calculated_progress)
status_endpoint = prompt_metadata[prompt_id]['status_endpoint'] status_endpoint = prompt_metadata[prompt_id]['status_endpoint']
body = { body = {
"run_id": prompt_id, "run_id": prompt_id,
"live_status": live_status, "live_status": live_status,
"progress": calculated_progress
} }
# requests.post(status_endpoint, json=body) # requests.post(status_endpoint, json=body)
async with aiohttp.ClientSession() as session: async with aiohttp.ClientSession() as session:
await session.post(status_endpoint, json=body) async with session.post(status_endpoint, json=body) as response:
pass
def update_run(prompt_id, status: Status): def update_run(prompt_id, status: Status):
+8 -4
View File
@@ -1,7 +1,7 @@
import { app } from "./app.js"; import { app } from "./app.js";
import { api } from "./api.js"; import { api } from "./api.js";
import { ComfyWidgets, LGraphNode } from "./widgets.js"; import { ComfyWidgets, LGraphNode } from "./widgets.js";
import { generateDependencyGraph } from "https://esm.sh/[email protected]4"; import { generateDependencyGraph } from "https://esm.sh/[email protected]9";
/** @typedef {import('../../../web/types/comfy.js').ComfyExtension} ComfyExtension*/ /** @typedef {import('../../../web/types/comfy.js').ComfyExtension} ComfyExtension*/
/** @type {ComfyExtension} */ /** @type {ComfyExtension} */
@@ -182,7 +182,7 @@ function showError(title, message) {
function createDynamicUIHtml(data) { function createDynamicUIHtml(data) {
console.log(data); console.log(data);
let html = let html =
'<div style="max-width: 1024px; margin: 14px auto; display: flex; flex-direction: column; gap: 24px;">'; '<div style="min-width: 600px; max-width: 1024px; margin: 14px auto; display: flex; flex-direction: column; gap: 24px;">';
const bgcolor = "var(--comfy-input-bg)"; const bgcolor = "var(--comfy-input-bg)";
const evenBg = "var(--border-color)"; const evenBg = "var(--border-color)";
const textColor = "var(--input-text)"; const textColor = "var(--input-text)";
@@ -284,8 +284,12 @@ function addButton() {
} }
const ok = await confirmDialog.confirm( const ok = await confirmDialog.confirm(
"Confirm deployment -> " + displayName, "Confirm deployment -> " +
`A new version will be deployed, are you conform? <br><br><input id="include-deps" type="checkbox" checked>Include dependence</input>`, displayName +
"<br><br><small><div style='font-weight: normal;'>" +
endpoint +
"<div><br>",
`A new version will be deployed, are you confirm? <br><br><input id="include-deps" type="checkbox" checked>Include dependence</input>`,
); );
if (!ok) return; if (!ok) return;
Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

+29 -2
View File
@@ -48,12 +48,39 @@ const exampleWorkflows: exampleWorkflow[] = [
}, },
{ {
title: "Upscale and Add Detail SDXL", title: "Upscale and Add Detail SDXL",
description: "Upscale and Add Details to your creations", description: "Upscale and Add Details to your creations.",
previewURL: 'https://www.comfydeploy.com/share/comfy-deploy-example-upscale-and-add-detail-sdxl', previewURL: 'https://www.comfydeploy.com/share/comfy-deploy-example-upscale-and-add-detail-sdxl',
image: { image: {
src: '/example-workflows/upscale.webp', src: '/example-workflows/upscale.webp',
alt: 'Upscale and Add Detail SDXL', alt: 'Upscale and Add Detail SDXL',
} }
},
{
title: "Txt2Img SDXL Turbo",
description: "Try SDXL turbo and generate images since 1 step in seconds.",
previewURL: 'https://www.comfydeploy.com/share/comfy-deploy-example-txt2img-sdxl-turbo',
image: {
src: '/example-workflows/txt2img-sdxl-turbo.webp',
alt: 'Txt2Img SDXL Turbo',
}
},
{
title: "Img2Img SDXL Controlnet",
description: "This workflow uses canny. Generate lines of you original image and create variations.",
previewURL: 'https://www.comfydeploy.com/share/comfy-deploy-example-img2-img-sdxl-controlnet',
image: {
src: '/example-workflows/txt2img-controlnet.webp',
alt: 'Img2Img SDXL Controlnet',
}
},
{
title: "Automatic Inpainting (SEG)",
description: "Type what do you want to select and change that area with your prompt.",
previewURL: 'https://www.comfydeploy.com/share/comfy-deploy-example-automatic-inpainting-clip-seg',
image: {
src: '/example-workflows/automatic-inpainting-seg.webp',
alt: 'Img2Img SDXL Controlnet',
}
} }
]; ];
@@ -67,7 +94,7 @@ async function Examples() {
</h1> </h1>
<p className="max-w-[560px] text-center text-lg text-muted-foreground">Text to Image, Image to Image, IPAdapter, and more. Here are some examples that you can use to deploy your workflow.</p> <p className="max-w-[560px] text-center text-lg text-muted-foreground">Text to Image, Image to Image, IPAdapter, and more. Here are some examples that you can use to deploy your workflow.</p>
</section> </section>
<section className="flex justify-center flex-wrap gap-4"> <section className="flex justify-center flex-wrap gap-5">
{exampleWorkflows.map(workflow => { {exampleWorkflows.map(workflow => {
return <Card className="w-[350px]"> return <Card className="w-[350px]">
<CardHeader> <CardHeader>
+1 -7
View File
@@ -5,7 +5,6 @@ import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import Link from "next/link"; import Link from "next/link";
import { usePathname } from "next/navigation"; import { usePathname } from "next/navigation";
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { useMediaQuery } from "usehooks-ts"; import { useMediaQuery } from "usehooks-ts";
@@ -25,8 +24,6 @@ export function NavbarMenu({
const pathnames = usePathname(); const pathnames = usePathname();
const pathname = `/${pathnames.split("/")[1]}`; const pathname = `/${pathnames.split("/")[1]}`;
const router = useRouter();
const pages = [ const pages = [
{ {
name: "Workflows", name: "Workflows",
@@ -59,11 +56,8 @@ export function NavbarMenu({
<TabsTrigger <TabsTrigger
key={page.name} key={page.name}
value={page.path} value={page.path}
onClick={() => {
router.push(page.path);
}}
> >
{page.name} <Link href={page.path}>{page.name}</Link>
</TabsTrigger> </TabsTrigger>
))} ))}
</TabsList> </TabsList>
+1 -1
View File
@@ -328,7 +328,7 @@ export function RunWorkflowButton({
className="px-1" className="px-1"
> >
<div className="flex justify-end"> <div className="flex justify-end">
<AutoFormSubmit> <AutoFormSubmit disabled={isLoading}>
Run Run
{isLoading ? <LoadingIcon /> : <Play size={14} />} {isLoading ? <LoadingIcon /> : <Play size={14} />}
</AutoFormSubmit> </AutoFormSubmit>
+4 -4
View File
@@ -90,12 +90,12 @@ export const createRun = withServerPromise(
Object.entries(workflow_api).forEach(([_, node]) => { Object.entries(workflow_api).forEach(([_, node]) => {
if (node.inputs["input_id"] === key) { if (node.inputs["input_id"] === key) {
node.inputs["input_id"] = inputs[key]; node.inputs["input_id"] = inputs[key];
// Fix for external text default value
if (node.class_type == "ComfyUIDeployExternalText") {
node.inputs["default_value"] = inputs[key];
}
} }
// Fix for external text default value
if (node.class_type == "ComfyUIDeployExternalText") {
node.inputs["default_value"] = inputs[key];
}
}); });
} }
} }