diff --git a/locales/de.json b/locales/de.json index 42591ed4..a70aed90 100644 --- a/locales/de.json +++ b/locales/de.json @@ -113,6 +113,7 @@ "replacePreview": "Vorschau ersetzen", "copyCheckpointName": "Checkpoint-Name kopieren", "copyEmbeddingName": "Embedding-Name kopieren", + "embeddingNameCopied": "Embedding-Syntax kopiert", "sendCheckpointToWorkflow": "An ComfyUI senden", "sendEmbeddingToWorkflow": "An ComfyUI senden" }, @@ -1500,11 +1501,14 @@ "noMatchingNodes": "Keine kompatiblen Knoten im aktuellen Workflow verfügbar", "noTargetNodeSelected": "Kein Zielknoten ausgewählt", "modelUpdated": "Modell im Workflow aktualisiert", - "modelFailed": "Fehler beim Aktualisieren des Modellknotens" + "modelFailed": "Fehler beim Aktualisieren des Modellknotens", + "embeddingAdded": "Embedding zum Workflow hinzugefügt", + "embeddingFailed": "Fehler beim Hinzufügen des Embeddings" }, "nodeSelector": { "recipe": "Rezept", "lora": "LoRA", + "embedding": "Embedding", "replace": "Ersetzen", "append": "Anhängen", "selectTargetNode": "Zielknoten auswählen", diff --git a/locales/en.json b/locales/en.json index e91dc45a..f9fa8dc7 100644 --- a/locales/en.json +++ b/locales/en.json @@ -113,6 +113,7 @@ "replacePreview": "Replace Preview", "copyCheckpointName": "Copy checkpoint name", "copyEmbeddingName": "Copy embedding name", + "embeddingNameCopied": "Embedding syntax copied", "sendCheckpointToWorkflow": "Send to ComfyUI", "sendEmbeddingToWorkflow": "Send to ComfyUI" }, @@ -1500,11 +1501,14 @@ "noMatchingNodes": "No compatible nodes available in the current workflow", "noTargetNodeSelected": "No target node selected", "modelUpdated": "Model updated in workflow", - "modelFailed": "Failed to update model node" + "modelFailed": "Failed to update model node", + "embeddingAdded": "Embedding added to workflow", + "embeddingFailed": "Failed to add embedding" }, "nodeSelector": { "recipe": "Recipe", "lora": "LoRA", + "embedding": "Embedding", "replace": "Replace", "append": "Append", "selectTargetNode": "Select target node", diff --git a/locales/es.json b/locales/es.json index 14725a09..eb029748 100644 --- a/locales/es.json +++ b/locales/es.json @@ -113,6 +113,7 @@ "replacePreview": "Reemplazar vista previa", "copyCheckpointName": "Copiar nombre del checkpoint", "copyEmbeddingName": "Copiar nombre del embedding", + "embeddingNameCopied": "Sintaxis de embedding copiada", "sendCheckpointToWorkflow": "Enviar a ComfyUI", "sendEmbeddingToWorkflow": "Enviar a ComfyUI" }, @@ -1500,11 +1501,14 @@ "noMatchingNodes": "No hay nodos compatibles disponibles en el flujo de trabajo actual", "noTargetNodeSelected": "No se ha seleccionado ningún nodo de destino", "modelUpdated": "Modelo actualizado en el flujo de trabajo", - "modelFailed": "Error al actualizar nodo de modelo" + "modelFailed": "Error al actualizar nodo de modelo", + "embeddingAdded": "Embedding añadido al flujo de trabajo", + "embeddingFailed": "Error al añadir el embedding" }, "nodeSelector": { "recipe": "Receta", "lora": "LoRA", + "embedding": "Embedding", "replace": "Reemplazar", "append": "Añadir", "selectTargetNode": "Seleccionar nodo de destino", diff --git a/locales/fr.json b/locales/fr.json index 6a20acf8..ce3671ec 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -113,6 +113,7 @@ "replacePreview": "Remplacer l'aperçu", "copyCheckpointName": "Copier le nom du checkpoint", "copyEmbeddingName": "Copier le nom de l'embedding", + "embeddingNameCopied": "Syntaxe dembedding copiée", "sendCheckpointToWorkflow": "Envoyer vers ComfyUI", "sendEmbeddingToWorkflow": "Envoyer vers ComfyUI" }, @@ -1500,11 +1501,14 @@ "noMatchingNodes": "Aucun nœud compatible disponible dans le workflow actuel", "noTargetNodeSelected": "Aucun nœud cible sélectionné", "modelUpdated": "Modèle mis à jour dans le workflow", - "modelFailed": "Échec de la mise à jour du nœud modèle" + "modelFailed": "Échec de la mise à jour du nœud modèle", + "embeddingAdded": "Embedding ajouté au workflow", + "embeddingFailed": "Échec de l'ajout de l'embedding" }, "nodeSelector": { "recipe": "Recipe", "lora": "LoRA", + "embedding": "Embedding", "replace": "Remplacer", "append": "Ajouter", "selectTargetNode": "Sélectionner le nœud cible", diff --git a/locales/he.json b/locales/he.json index 7564815e..bf1710d6 100644 --- a/locales/he.json +++ b/locales/he.json @@ -113,6 +113,7 @@ "replacePreview": "החלף תצוגה מקדימה", "copyCheckpointName": "העתק שם Checkpoint", "copyEmbeddingName": "העתק שם Embedding", + "embeddingNameCopied": "תחביר Embedding הועתק", "sendCheckpointToWorkflow": "שלח ל-ComfyUI", "sendEmbeddingToWorkflow": "שלח ל-ComfyUI" }, @@ -1500,11 +1501,14 @@ "noMatchingNodes": "אין צמתים תואמים זמינים ב-workflow הנוכחי", "noTargetNodeSelected": "לא נבחר צומת יעד", "modelUpdated": "מודל עודכן ב-workflow", - "modelFailed": "עדכון צומת המודל נכשל" + "modelFailed": "עדכון צומת המודל נכשל", + "embeddingAdded": "Embedding נוסף ל-workflow", + "embeddingFailed": "הוספת Embedding נכשלה" }, "nodeSelector": { "recipe": "מתכון", "lora": "LoRA", + "embedding": "Embedding", "replace": "החלף", "append": "הוסף", "selectTargetNode": "בחר צומת יעד", diff --git a/locales/ja.json b/locales/ja.json index e3a91115..c2759380 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -113,6 +113,7 @@ "replacePreview": "プレビューを置換", "copyCheckpointName": "checkpoint名をコピー", "copyEmbeddingName": "embedding名をコピー", + "embeddingNameCopied": "Embedding構文をコピーしました", "sendCheckpointToWorkflow": "ComfyUIに送信", "sendEmbeddingToWorkflow": "ComfyUIに送信" }, @@ -1500,11 +1501,14 @@ "noMatchingNodes": "現在のワークフローには互換性のあるノードがありません", "noTargetNodeSelected": "ターゲットノードが選択されていません", "modelUpdated": "モデルがワークフローで更新されました", - "modelFailed": "モデルノードの更新に失敗しました" + "modelFailed": "モデルノードの更新に失敗しました", + "embeddingAdded": "Embeddingをワークフローに追加しました", + "embeddingFailed": "Embeddingの追加に失敗しました" }, "nodeSelector": { "recipe": "レシピ", "lora": "LoRA", + "embedding": "Embedding", "replace": "置換", "append": "追加", "selectTargetNode": "ターゲットノードを選択", diff --git a/locales/ko.json b/locales/ko.json index 735f8ef0..ec7b7937 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -113,6 +113,7 @@ "replacePreview": "미리보기 교체", "copyCheckpointName": "Checkpoint 이름 복사", "copyEmbeddingName": "Embedding 이름 복사", + "embeddingNameCopied": "Embedding 구문 복사됨", "sendCheckpointToWorkflow": "ComfyUI로 전송", "sendEmbeddingToWorkflow": "ComfyUI로 전송" }, @@ -1500,11 +1501,14 @@ "noMatchingNodes": "현재 워크플로에서 호환되는 노드가 없습니다", "noTargetNodeSelected": "대상 노드가 선택되지 않았습니다", "modelUpdated": "모델이 워크플로에서 업데이트되었습니다", - "modelFailed": "모델 노드 업데이트 실패" + "modelFailed": "모델 노드 업데이트 실패", + "embeddingAdded": "Embedding을 워크플로에 추가했습니다", + "embeddingFailed": "Embedding 추가 실패" }, "nodeSelector": { "recipe": "레시피", "lora": "LoRA", + "embedding": "임베딩", "replace": "교체", "append": "추가", "selectTargetNode": "대상 노드 선택", diff --git a/locales/ru.json b/locales/ru.json index 3ad5cac1..0c7da4d6 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -113,6 +113,7 @@ "replacePreview": "Заменить превью", "copyCheckpointName": "Копировать имя checkpoint", "copyEmbeddingName": "Копировать имя embedding", + "embeddingNameCopied": "Синтаксис embedding скопирован", "sendCheckpointToWorkflow": "Отправить в ComfyUI", "sendEmbeddingToWorkflow": "Отправить в ComfyUI" }, @@ -1500,11 +1501,14 @@ "noMatchingNodes": "В текущем workflow нет совместимых узлов", "noTargetNodeSelected": "Целевой узел не выбран", "modelUpdated": "Модель обновлена в workflow", - "modelFailed": "Не удалось обновить узел модели" + "modelFailed": "Не удалось обновить узел модели", + "embeddingAdded": "Embedding добавлен в workflow", + "embeddingFailed": "Не удалось добавить embedding" }, "nodeSelector": { "recipe": "Рецепт", "lora": "LoRA", + "embedding": "Эмбеддинг", "replace": "Заменить", "append": "Добавить", "selectTargetNode": "Выберите целевой узел", diff --git a/locales/zh-CN.json b/locales/zh-CN.json index 897c7607..628ebc03 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -113,6 +113,7 @@ "replacePreview": "替换预览", "copyCheckpointName": "复制 Checkpoint 名称", "copyEmbeddingName": "复制 Embedding 名称", + "embeddingNameCopied": "已复制 Embedding 语法", "sendCheckpointToWorkflow": "发送到 ComfyUI", "sendEmbeddingToWorkflow": "发送到 ComfyUI" }, @@ -1500,11 +1501,14 @@ "noMatchingNodes": "当前工作流中没有兼容的节点", "noTargetNodeSelected": "未选择目标节点", "modelUpdated": "模型已更新到工作流", - "modelFailed": "更新模型节点失败" + "modelFailed": "更新模型节点失败", + "embeddingAdded": "Embedding 已追加到工作流", + "embeddingFailed": "添加 Embedding 失败" }, "nodeSelector": { "recipe": "配方", "lora": "LoRA", + "embedding": "Embedding", "replace": "替换", "append": "追加", "selectTargetNode": "选择目标节点", diff --git a/locales/zh-TW.json b/locales/zh-TW.json index b4a155e3..732546f2 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -113,6 +113,7 @@ "replacePreview": "更換預覽圖", "copyCheckpointName": "複製檢查點名稱", "copyEmbeddingName": "複製嵌入名稱", + "embeddingNameCopied": "已複製 Embedding 語法", "sendCheckpointToWorkflow": "傳送到 ComfyUI", "sendEmbeddingToWorkflow": "傳送到 ComfyUI" }, @@ -1500,11 +1501,14 @@ "noMatchingNodes": "目前工作流程中沒有相容的節點", "noTargetNodeSelected": "未選擇目標節點", "modelUpdated": "模型已更新到工作流", - "modelFailed": "更新模型節點失敗" + "modelFailed": "更新模型節點失敗", + "embeddingAdded": "Embedding 已附加到工作流", + "embeddingFailed": "傳送 Embedding 到工作流失敗" }, "nodeSelector": { "recipe": "配方", "lora": "LoRA", + "embedding": "Embedding", "replace": "取代", "append": "附加", "selectTargetNode": "選擇目標節點", diff --git a/static/js/components/ContextMenu/EmbeddingContextMenu.js b/static/js/components/ContextMenu/EmbeddingContextMenu.js index 8e0e2097..ea53bb35 100644 --- a/static/js/components/ContextMenu/EmbeddingContextMenu.js +++ b/static/js/components/ContextMenu/EmbeddingContextMenu.js @@ -56,7 +56,7 @@ export class EmbeddingContextMenu extends BaseContextMenu { const folder = this.currentCard.dataset.folder || ''; const name = this.currentCard.dataset.file_name || ''; const embeddingCode = folder ? `embedding:${folder}/${name}` : `embedding:${name}`; - sendEmbeddingToWorkflow(embeddingCode, false); + sendEmbeddingToWorkflow(embeddingCode); break; } case 'refresh-metadata': diff --git a/static/js/components/shared/ModelCard.js b/static/js/components/shared/ModelCard.js index 985d17d5..c8b1b9ee 100644 --- a/static/js/components/shared/ModelCard.js +++ b/static/js/components/shared/ModelCard.js @@ -220,7 +220,7 @@ function handleSendToWorkflow(card, replaceMode, modelType) { const folder = card.dataset.folder || ''; const name = card.dataset.file_name || ''; const embeddingCode = folder ? `embedding:${folder}/${name}` : `embedding:${name}`; - sendEmbeddingToWorkflow(embeddingCode, false); + sendEmbeddingToWorkflow(embeddingCode); } else { showToast('modelCard.sendToWorkflow.checkpointNotImplemented', {}, 'info'); } diff --git a/static/js/components/shared/ModelModal.js b/static/js/components/shared/ModelModal.js index 0ead097e..41de7b75 100644 --- a/static/js/components/shared/ModelModal.js +++ b/static/js/components/shared/ModelModal.js @@ -1195,7 +1195,7 @@ async function handleSendToWorkflow(target, modelType) { const folder = modalElement?.dataset?.folder || ''; const name = currentFileName.replace(/\.[^.]+$/, ''); const embeddingCode = folder ? `embedding:${folder}/${name}` : `embedding:${name}`; - await sendEmbeddingToWorkflow(embeddingCode, false); + await sendEmbeddingToWorkflow(embeddingCode); } } diff --git a/static/js/managers/BulkManager.js b/static/js/managers/BulkManager.js index ce3a9c60..8fa018f0 100644 --- a/static/js/managers/BulkManager.js +++ b/static/js/managers/BulkManager.js @@ -565,7 +565,7 @@ export class BulkManager { } const joinedCode = embeddingCodes.join(', '); - await sendEmbeddingToWorkflow(joinedCode, false); + await sendEmbeddingToWorkflow(joinedCode); } showBulkDeleteModal() { diff --git a/static/js/utils/uiHelpers.js b/static/js/utils/uiHelpers.js index deab5f08..321a1650 100644 --- a/static/js/utils/uiHelpers.js +++ b/static/js/utils/uiHelpers.js @@ -918,7 +918,7 @@ async function sendTextToNodes(nodeIds, nodesMap, text, mode, messages = {}) { } } -export async function sendEmbeddingToWorkflow(embeddingCode, replaceMode = false) { +export async function sendEmbeddingToWorkflow(embeddingCode) { const registry = await fetchWorkflowRegistry(); if (!registry) { return false; @@ -937,32 +937,24 @@ export async function sendEmbeddingToWorkflow(embeddingCode, replaceMode = false return false; } - const mode = replaceMode ? 'replace' : 'append'; const messages = { - successMessage: translate( - replaceMode ? 'uiHelpers.workflow.embeddingReplaced' : 'uiHelpers.workflow.embeddingAdded', - {}, - replaceMode ? 'Embedding replaced in workflow' : 'Embedding added to workflow' - ), + successMessage: translate('uiHelpers.workflow.embeddingAdded', {}, 'Embedding added to workflow'), failureMessage: translate('uiHelpers.workflow.embeddingFailed', {}, 'Failed to add embedding'), missingTargetMessage: translate('uiHelpers.workflow.noTargetNodeSelected', {}, 'No target node selected'), }; const handleSend = (selectedNodeIds) => - sendTextToNodes(selectedNodeIds, textNodes, embeddingCode, mode, messages); + sendTextToNodes(selectedNodeIds, textNodes, embeddingCode, 'append', messages); if (nodeKeys.length === 1) { return await handleSend([nodeKeys[0]]); } const actionType = translate('uiHelpers.nodeSelector.embedding', {}, 'Embedding'); - const actionMode = replaceMode - ? translate('uiHelpers.nodeSelector.replace', {}, 'Replace') - : translate('uiHelpers.nodeSelector.append', {}, 'Append'); showNodeSelector(textNodes, { actionType, - actionMode, + actionMode: '', onSend: handleSend, }); return true; diff --git a/tests/routes/test_misc_routes.py b/tests/routes/test_misc_routes.py index 5f7154b1..407ef40d 100644 --- a/tests/routes/test_misc_routes.py +++ b/tests/routes/test_misc_routes.py @@ -754,6 +754,7 @@ async def test_update_node_widget_sends_payload(): "widget_name": "ckpt_name", "value": "models/checkpoints/model.ckpt", "graph_id": "root", + "mode": "replace", }, ) ]