first commit
This commit is contained in:
commit
0f8cf934f9
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/__pycache__
|
23
__init__.py
Normal file
23
__init__.py
Normal file
@ -0,0 +1,23 @@
|
||||
WEB_DIRECTORY = "js"
|
||||
NODE_CLASS_MAPPINGS = {}
|
||||
__all__ = ['NODE_CLASS_MAPPINGS']
|
||||
|
||||
from aiohttp import ClientSession, web
|
||||
from server import PromptServer
|
||||
|
||||
@PromptServer.instance.routes.post("/easyai/upload_workflow")
|
||||
async def upload_workflow(request):
|
||||
try:
|
||||
data = await request.json()
|
||||
url = data["domain"] + "/api/v1/openapi/upload/workflow"
|
||||
headers = {
|
||||
'Content-Type': 'application/json',
|
||||
'x-comfy-api-key': data["apiKey"]
|
||||
}
|
||||
async with ClientSession() as session:
|
||||
async with session.post(url, json={"workflow": data["workflow"], "name": data["name"]}, headers=headers) as resp:
|
||||
response_data = await resp.json()
|
||||
return web.json_response(response_data)
|
||||
|
||||
except Exception as e:
|
||||
return web.json_response({'error': str(e)}, status=500)
|
218
js/extension.js
Normal file
218
js/extension.js
Normal file
@ -0,0 +1,218 @@
|
||||
import { api } from "../../scripts/api.js";
|
||||
import { app } from "../../scripts/app.js";
|
||||
|
||||
|
||||
app.registerExtension({
|
||||
name: "ComfyUI-Easyai",
|
||||
async setup() {
|
||||
const menu = document.querySelector(".comfy-menu");
|
||||
const separator = document.createElement("hr");
|
||||
|
||||
separator.style.margin = "20px 0";
|
||||
separator.style.width = "100%";
|
||||
menu.append(separator);
|
||||
|
||||
const uploadEasyaiButton = document.createElement("button");
|
||||
uploadEasyaiButton.id = "uploadEasyaiButton";
|
||||
uploadEasyaiButton.textContent = "上传Easyai";
|
||||
// 点击按钮时弹出对话框
|
||||
uploadEasyaiButton.onclick = () => {
|
||||
// 创建遮罩层
|
||||
const overlay = document.createElement('div');
|
||||
overlay.style.position = 'fixed';
|
||||
overlay.style.top = 0;
|
||||
overlay.style.left = 0;
|
||||
overlay.style.width = '100%';
|
||||
overlay.style.height = '100%';
|
||||
overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
|
||||
overlay.style.zIndex = 999;
|
||||
document.body.appendChild(overlay);
|
||||
|
||||
// 创建对话框
|
||||
const dialog = document.createElement('div');
|
||||
dialog.style.position = 'fixed';
|
||||
dialog.style.top = '50%';
|
||||
dialog.style.left = '50%';
|
||||
dialog.style.transform = 'translate(-50%, -50%)';
|
||||
dialog.style.backgroundColor = 'black'; // 设置背景为黑色
|
||||
dialog.style.color = 'white'; // 设置文字为白色
|
||||
dialog.style.padding = '20px';
|
||||
dialog.style.width = '300px';
|
||||
dialog.style.zIndex = 1000;
|
||||
document.body.appendChild(dialog);
|
||||
|
||||
// 添加标题
|
||||
const title = document.createElement('h3');
|
||||
title.innerText = '确认上传?';
|
||||
title.style.color = 'white'; // 白色标题
|
||||
dialog.appendChild(title);
|
||||
|
||||
// 添加域名输入框标签
|
||||
const domainLabel = document.createElement('label');
|
||||
domainLabel.setAttribute('for', 'domainInput');
|
||||
domainLabel.innerText = 'Domain (域名):';
|
||||
domainLabel.style.color = 'white'; // 白色标签文字
|
||||
dialog.appendChild(domainLabel);
|
||||
|
||||
// 添加域名输入框
|
||||
const domainInput = document.createElement('input');
|
||||
domainInput.type = 'text';
|
||||
domainInput.id = 'domainInput';
|
||||
domainInput.style.width = '100%';
|
||||
domainInput.style.padding = '8px';
|
||||
domainInput.style.margin = '10px 0';
|
||||
domainInput.style.borderRadius = '4px';
|
||||
domainInput.style.border = '1px solid #ccc';
|
||||
domainInput.style.backgroundColor = '#333'; // 设置输入框背景为深灰色
|
||||
domainInput.style.color = 'white'; // 输入框文字为白色
|
||||
dialog.appendChild(domainInput);
|
||||
|
||||
// 检查 localStorage 是否已有 Domain,如果有则填充输入框
|
||||
const savedDomain = localStorage.getItem('easyai-domain');
|
||||
if (savedDomain) {
|
||||
domainInput.value = savedDomain;
|
||||
}
|
||||
|
||||
// 添加 API Key 输入框标签
|
||||
const label = document.createElement('label');
|
||||
label.setAttribute('for', 'apiKeyInput');
|
||||
label.innerText = 'Key:';
|
||||
label.style.color = 'white'; // 白色标签文字
|
||||
dialog.appendChild(label);
|
||||
|
||||
// 添加 API Key 输入框
|
||||
const input = document.createElement('input');
|
||||
input.type = 'text';
|
||||
input.id = 'apiKeyInput';
|
||||
input.style.width = '100%';
|
||||
input.style.padding = '8px';
|
||||
input.style.margin = '10px 0';
|
||||
input.style.borderRadius = '4px';
|
||||
input.style.border = '1px solid #ccc';
|
||||
input.style.backgroundColor = '#333'; // 设置输入框背景为深灰色
|
||||
input.style.color = 'white'; // 输入框文字为白色
|
||||
dialog.appendChild(input);
|
||||
|
||||
// 检查 localStorage 是否已有 API key,如果有则填充输入框
|
||||
const savedApiKey = localStorage.getItem('easyai-x-comfy-api-key');
|
||||
if (savedApiKey) {
|
||||
input.value = savedApiKey;
|
||||
}
|
||||
|
||||
// 添加作品名称输入框标签
|
||||
const projectNameLabel = document.createElement('label');
|
||||
projectNameLabel.setAttribute('for', 'projectNameInput');
|
||||
projectNameLabel.innerText = 'Easyai 作品名称:';
|
||||
projectNameLabel.style.color = 'white'; // 白色标签文字
|
||||
dialog.appendChild(projectNameLabel);
|
||||
|
||||
// 添加作品名称输入框
|
||||
const projectNameInput = document.createElement('input');
|
||||
projectNameInput.type = 'text';
|
||||
projectNameInput.id = 'projectNameInput';
|
||||
projectNameInput.style.width = '100%';
|
||||
projectNameInput.style.padding = '8px';
|
||||
projectNameInput.style.margin = '10px 0';
|
||||
projectNameInput.style.borderRadius = '4px';
|
||||
projectNameInput.style.border = '1px solid #ccc';
|
||||
projectNameInput.style.backgroundColor = '#333'; // 设置输入框背景为深灰色
|
||||
projectNameInput.style.color = 'white'; // 输入框文字为白色
|
||||
dialog.appendChild(projectNameInput);
|
||||
|
||||
// 检查 localStorage 是否已有 作品名称,如果有则填充输入框
|
||||
const savedProjectName = localStorage.getItem('easyai-project-name');
|
||||
if (savedProjectName) {
|
||||
projectNameInput.value = savedProjectName;
|
||||
}
|
||||
|
||||
// 添加确认按钮
|
||||
const saveButton = document.createElement('button');
|
||||
saveButton.innerText = '确认';
|
||||
saveButton.style.padding = '8px 12px';
|
||||
saveButton.style.backgroundColor = '#4CAF50';
|
||||
saveButton.style.color = 'white'; // 按钮文字为白色
|
||||
saveButton.style.border = 'none';
|
||||
saveButton.style.borderRadius = '4px';
|
||||
saveButton.style.cursor = 'pointer';
|
||||
dialog.appendChild(saveButton);
|
||||
|
||||
// 添加取消按钮
|
||||
const cancelButton = document.createElement('button');
|
||||
cancelButton.innerText = '取消';
|
||||
cancelButton.style.padding = '8px 12px';
|
||||
cancelButton.style.backgroundColor = '#f44336';
|
||||
cancelButton.style.color = 'white'; // 按钮文字为白色
|
||||
cancelButton.style.border = 'none';
|
||||
cancelButton.style.borderRadius = '4px';
|
||||
cancelButton.style.cursor = 'pointer';
|
||||
cancelButton.style.marginLeft = '10px';
|
||||
dialog.appendChild(cancelButton);
|
||||
|
||||
saveButton.onclick = () => {
|
||||
const apiKey = input.value;
|
||||
const domain = domainInput.value;
|
||||
const projectName = projectNameInput.value;
|
||||
|
||||
if (apiKey && domain && projectName) {
|
||||
// 保存 API key, domain, 作品名称到 localStorage
|
||||
localStorage.setItem('easyai-x-comfy-api-key', apiKey);
|
||||
localStorage.setItem('easyai-domain', domain);
|
||||
localStorage.setItem('easyai-project-name', projectName);
|
||||
|
||||
closeDialog();
|
||||
|
||||
app.graphToPrompt().then((p2) => {
|
||||
localStorage.setItem('easyai-x-comfy-api-key', apiKey);
|
||||
localStorage.setItem('easyai-domain', domain);
|
||||
app.graphToPrompt().then((p2) => {
|
||||
const workflow = JSON.stringify(p2.output);
|
||||
api.fetchApi('/easyai/upload_workflow', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
domain,
|
||||
apiKey,
|
||||
workflow,
|
||||
name: projectName
|
||||
})
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.error) {
|
||||
console.error('Error uploading workflow:', data.error);
|
||||
alert('Failed to upload workflow.');
|
||||
} else {
|
||||
console.log('Workflow upload successful:', data);
|
||||
alert('Workflow uploaded successfully!');
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error uploading workflow:', error);
|
||||
alert('Failed to upload workflow.');
|
||||
});
|
||||
});
|
||||
});
|
||||
} else {
|
||||
alert("请输入有效的 API Key, 域名, 和作品名称.");
|
||||
}
|
||||
};
|
||||
|
||||
cancelButton.onclick = () => {
|
||||
closeDialog();
|
||||
};
|
||||
|
||||
function closeDialog() {
|
||||
document.body.removeChild(dialog);
|
||||
document.body.removeChild(overlay);
|
||||
}
|
||||
};
|
||||
|
||||
uploadEasyaiButton.style.background = "linear-gradient(135deg, #8A00FF 0%, #00FFC6 100%)";
|
||||
uploadEasyaiButton.style.color = "black";
|
||||
uploadEasyaiButton.style.display = "inline-block";
|
||||
|
||||
menu.append(uploadEasyaiButton);
|
||||
}
|
||||
});
|
15
pyproject.toml
Normal file
15
pyproject.toml
Normal file
@ -0,0 +1,15 @@
|
||||
[project]
|
||||
name = "comfyui-easyai"
|
||||
description = "ComfyUI-Easyai is a powerful extension for ComfyUI that enables users to share workflows and models to easyai."
|
||||
version = "1.0.0"
|
||||
license = "LICENSE"
|
||||
dependencies = []
|
||||
|
||||
[project.urls]
|
||||
Repository = "https://github.com/jianzhichun/ComfyUI-Easyai"
|
||||
# Used by Comfy Registry https://comfyregistry.org
|
||||
|
||||
[tool.comfy]
|
||||
PublisherId = "d9fd0ca0-fa6b-4972-b125-0e14d9283d6j"
|
||||
DisplayName = "ComfyUI-Easyai"
|
||||
Icon = "https://imgur.com/aQMebk4"
|
0
requirements.txt
Normal file
0
requirements.txt
Normal file
Loading…
Reference in New Issue
Block a user