mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-27 01:39:47 +00:00
[API Node] Better execution error handling (#3587)
Co-authored-by: github-actions <github-actions@github.com>
This commit is contained in:
@@ -12,7 +12,7 @@
|
|||||||
<ApiNodesList :node-names="apiNodeNames" />
|
<ApiNodesList :node-names="apiNodeNames" />
|
||||||
|
|
||||||
<div class="flex justify-between items-center">
|
<div class="flex justify-between items-center">
|
||||||
<Button :label="t('g.learnMore')" link />
|
<Button :label="t('g.learnMore')" link @click="handleLearnMoreClick" />
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
<Button
|
<Button
|
||||||
:label="t('g.cancel')"
|
:label="t('g.cancel')"
|
||||||
@@ -37,4 +37,8 @@ const { apiNodeNames, onLogin, onCancel } = defineProps<{
|
|||||||
onLogin?: () => void
|
onLogin?: () => void
|
||||||
onCancel?: () => void
|
onCancel?: () => void
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
|
const handleLearnMoreClick = () => {
|
||||||
|
window.open('https://www.comfy.org/faq', '_blank')
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="flex flex-col items-center gap-4 p-4">
|
|
||||||
<div class="flex flex-col items-center text-center">
|
|
||||||
<i class="pi pi-exclamation-circle mb-4" style="font-size: 2rem" />
|
|
||||||
<h2 class="text-2xl font-semibold mb-2">
|
|
||||||
{{ $t(`auth.required.${type}.title`) }}
|
|
||||||
</h2>
|
|
||||||
<p class="text-gray-600 mb-4 max-w-md">
|
|
||||||
{{ $t(`auth.required.${type}.message`) }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="flex gap-4">
|
|
||||||
<Button
|
|
||||||
class="w-60"
|
|
||||||
severity="primary"
|
|
||||||
:label="$t(`auth.required.${type}.action`)"
|
|
||||||
@click="openPanel"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import Button from 'primevue/button'
|
|
||||||
|
|
||||||
import { useDialogStore } from '@/stores/dialogStore'
|
|
||||||
import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore'
|
|
||||||
|
|
||||||
const props = defineProps<{
|
|
||||||
type: 'signIn' | 'credits'
|
|
||||||
}>()
|
|
||||||
|
|
||||||
const dialogStore = useDialogStore()
|
|
||||||
const authStore = useFirebaseAuthStore()
|
|
||||||
|
|
||||||
const openPanel = () => {
|
|
||||||
// Close the current dialog
|
|
||||||
dialogStore.closeDialog({ key: 'signin-required' })
|
|
||||||
|
|
||||||
// Open user settings and navigate to appropriate panel
|
|
||||||
if (props.type === 'credits') {
|
|
||||||
authStore.openCreditsPanel()
|
|
||||||
} else {
|
|
||||||
authStore.openSignInPanel()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -1122,20 +1122,6 @@
|
|||||||
"signOut": "Log Out",
|
"signOut": "Log Out",
|
||||||
"success": "Signed out successfully",
|
"success": "Signed out successfully",
|
||||||
"successDetail": "You have been signed out of your account."
|
"successDetail": "You have been signed out of your account."
|
||||||
},
|
|
||||||
"required": {
|
|
||||||
"signIn": {
|
|
||||||
"title": "Sign-In Required to Execute Workflow",
|
|
||||||
"message": "This workflow includes nodes that require an active account. Please log in or create one to continue.",
|
|
||||||
"hint": "To login go to: Settings > User > Login",
|
|
||||||
"action": "Open Settings to Login"
|
|
||||||
},
|
|
||||||
"credits": {
|
|
||||||
"title": "Credits Required to Execute Workflow",
|
|
||||||
"message": "This workflow includes nodes that require credits. Please add credits to your account to continue.",
|
|
||||||
"hint": "To add credits go to: Settings > User > Credits",
|
|
||||||
"action": "Open Settings to Add Credits"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|||||||
@@ -36,20 +36,6 @@
|
|||||||
"termsText": "Al hacer clic en \"Siguiente\" o \"Registrarse\", aceptas nuestros",
|
"termsText": "Al hacer clic en \"Siguiente\" o \"Registrarse\", aceptas nuestros",
|
||||||
"title": "Inicia sesión en tu cuenta"
|
"title": "Inicia sesión en tu cuenta"
|
||||||
},
|
},
|
||||||
"required": {
|
|
||||||
"credits": {
|
|
||||||
"action": "Abrir configuración para añadir créditos",
|
|
||||||
"hint": "Para añadir créditos ve a: Configuración > Usuario > Créditos",
|
|
||||||
"message": "Este flujo de trabajo incluye nodos que requieren créditos. Por favor, añade créditos a tu cuenta para continuar.",
|
|
||||||
"title": "Créditos requeridos para ejecutar el flujo de trabajo"
|
|
||||||
},
|
|
||||||
"signIn": {
|
|
||||||
"action": "Abrir configuración para iniciar sesión",
|
|
||||||
"hint": "Para iniciar sesión ve a: Configuración > Usuario > Iniciar sesión",
|
|
||||||
"message": "Este flujo de trabajo incluye nodos que requieren una cuenta activa. Por favor, inicia sesión o crea una para continuar.",
|
|
||||||
"title": "Inicio de sesión requerido para ejecutar el flujo de trabajo"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"signOut": {
|
"signOut": {
|
||||||
"signOut": "Cerrar sesión",
|
"signOut": "Cerrar sesión",
|
||||||
"success": "Sesión cerrada correctamente",
|
"success": "Sesión cerrada correctamente",
|
||||||
|
|||||||
@@ -36,20 +36,6 @@
|
|||||||
"termsText": "En cliquant sur \"Suivant\" ou \"S'inscrire\", vous acceptez nos",
|
"termsText": "En cliquant sur \"Suivant\" ou \"S'inscrire\", vous acceptez nos",
|
||||||
"title": "Connectez-vous à votre compte"
|
"title": "Connectez-vous à votre compte"
|
||||||
},
|
},
|
||||||
"required": {
|
|
||||||
"credits": {
|
|
||||||
"action": "Ouvrir les paramètres pour ajouter des crédits",
|
|
||||||
"hint": "Pour ajouter des crédits, allez dans : Paramètres > Utilisateur > Crédits",
|
|
||||||
"message": "Ce workflow inclut des nœuds nécessitant des crédits. Veuillez ajouter des crédits à votre compte pour continuer.",
|
|
||||||
"title": "Crédits requis pour exécuter le workflow"
|
|
||||||
},
|
|
||||||
"signIn": {
|
|
||||||
"action": "Ouvrir les paramètres pour se connecter",
|
|
||||||
"hint": "Pour vous connecter, allez dans : Paramètres > Utilisateur > Connexion",
|
|
||||||
"message": "Ce workflow inclut des nœuds nécessitant un compte actif. Veuillez vous connecter ou en créer un pour continuer.",
|
|
||||||
"title": "Connexion requise pour exécuter le workflow"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"signOut": {
|
"signOut": {
|
||||||
"signOut": "Se déconnecter",
|
"signOut": "Se déconnecter",
|
||||||
"success": "Déconnexion réussie",
|
"success": "Déconnexion réussie",
|
||||||
|
|||||||
@@ -36,20 +36,6 @@
|
|||||||
"termsText": "「次へ」または「サインアップ」をクリックすると、私たちの",
|
"termsText": "「次へ」または「サインアップ」をクリックすると、私たちの",
|
||||||
"title": "アカウントにログインする"
|
"title": "アカウントにログインする"
|
||||||
},
|
},
|
||||||
"required": {
|
|
||||||
"credits": {
|
|
||||||
"action": "設定を開いてクレジットを追加",
|
|
||||||
"hint": "クレジットを追加するには: 設定 > ユーザー > クレジット",
|
|
||||||
"message": "このワークフローにはクレジットが必要なノードが含まれています。続行するにはアカウントにクレジットを追加してください。",
|
|
||||||
"title": "ワークフロー実行にはクレジットが必要です"
|
|
||||||
},
|
|
||||||
"signIn": {
|
|
||||||
"action": "設定を開いてログイン",
|
|
||||||
"hint": "ログインするには: 設定 > ユーザー > ログイン",
|
|
||||||
"message": "このワークフローにはアクティブなアカウントが必要なノードが含まれています。続行するにはログインまたはアカウントを作成してください。",
|
|
||||||
"title": "ワークフロー実行にはサインインが必要です"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"signOut": {
|
"signOut": {
|
||||||
"signOut": "ログアウト",
|
"signOut": "ログアウト",
|
||||||
"success": "正常にサインアウトしました",
|
"success": "正常にサインアウトしました",
|
||||||
|
|||||||
@@ -36,20 +36,6 @@
|
|||||||
"termsText": "\"다음\" 또는 \"가입하기\"를 클릭하면 우리의",
|
"termsText": "\"다음\" 또는 \"가입하기\"를 클릭하면 우리의",
|
||||||
"title": "계정에 로그인"
|
"title": "계정에 로그인"
|
||||||
},
|
},
|
||||||
"required": {
|
|
||||||
"credits": {
|
|
||||||
"action": "설정에서 크레딧 추가 열기",
|
|
||||||
"hint": "크레딧을 추가하려면: 설정 > 사용자 > 크레딧 으로 이동하세요.",
|
|
||||||
"message": "이 워크플로에는 크레딧이 필요한 노드가 포함되어 있습니다. 계속하려면 계정에 크레딧을 추가하세요.",
|
|
||||||
"title": "워크플로 실행을 위한 크레딧 필요"
|
|
||||||
},
|
|
||||||
"signIn": {
|
|
||||||
"action": "설정에서 로그인 열기",
|
|
||||||
"hint": "로그인하려면: 설정 > 사용자 > 로그인 으로 이동하세요.",
|
|
||||||
"message": "이 워크플로에는 활성 계정이 필요한 노드가 포함되어 있습니다. 계속하려면 로그인하거나 계정을 생성하세요.",
|
|
||||||
"title": "워크플로 실행을 위한 로그인 필요"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"signOut": {
|
"signOut": {
|
||||||
"signOut": "로그아웃",
|
"signOut": "로그아웃",
|
||||||
"success": "성공적으로 로그아웃되었습니다",
|
"success": "성공적으로 로그아웃되었습니다",
|
||||||
|
|||||||
@@ -36,20 +36,6 @@
|
|||||||
"termsText": "Нажимая \"Далее\" или \"Зарегистрироваться\", вы соглашаетесь с нашими",
|
"termsText": "Нажимая \"Далее\" или \"Зарегистрироваться\", вы соглашаетесь с нашими",
|
||||||
"title": "Войдите в свой аккаунт"
|
"title": "Войдите в свой аккаунт"
|
||||||
},
|
},
|
||||||
"required": {
|
|
||||||
"credits": {
|
|
||||||
"action": "Открыть настройки для пополнения кредитов",
|
|
||||||
"hint": "Чтобы пополнить кредиты, перейдите в: Настройки > Пользователь > Кредиты",
|
|
||||||
"message": "Этот рабочий процесс содержит узлы, для которых необходимы кредиты. Пожалуйста, пополните баланс, чтобы продолжить.",
|
|
||||||
"title": "Требуются кредиты для выполнения рабочего процесса"
|
|
||||||
},
|
|
||||||
"signIn": {
|
|
||||||
"action": "Открыть настройки для входа",
|
|
||||||
"hint": "Чтобы войти, перейдите в: Настройки > Пользователь > Вход",
|
|
||||||
"message": "Этот рабочий процесс содержит узлы, для которых необходима активная учетная запись. Пожалуйста, войдите или создайте учетную запись, чтобы продолжить.",
|
|
||||||
"title": "Требуется вход для выполнения рабочего процесса"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"signOut": {
|
"signOut": {
|
||||||
"signOut": "Выйти",
|
"signOut": "Выйти",
|
||||||
"success": "Вы успешно вышли из системы",
|
"success": "Вы успешно вышли из системы",
|
||||||
|
|||||||
@@ -36,20 +36,6 @@
|
|||||||
"termsText": "点击“下一步”或“注册”即表示您同意我们的",
|
"termsText": "点击“下一步”或“注册”即表示您同意我们的",
|
||||||
"title": "登录您的账户"
|
"title": "登录您的账户"
|
||||||
},
|
},
|
||||||
"required": {
|
|
||||||
"credits": {
|
|
||||||
"action": "打开设置进行充值",
|
|
||||||
"hint": "要充值,请前往:设置 > 用户 > 积分",
|
|
||||||
"message": "此工作流包含需要积分的节点。请为您的账户充值以继续。",
|
|
||||||
"title": "需要积分以执行工作流"
|
|
||||||
},
|
|
||||||
"signIn": {
|
|
||||||
"action": "打开设置进行登录",
|
|
||||||
"hint": "要登录,请前往:设置 > 用户 > 登录",
|
|
||||||
"message": "此工作流包含需要活跃账户的节点。请登录或创建账户以继续。",
|
|
||||||
"title": "需要登录以执行工作流"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"signOut": {
|
"signOut": {
|
||||||
"signOut": "退出登录",
|
"signOut": "退出登录",
|
||||||
"success": "成功退出登录",
|
"success": "成功退出登录",
|
||||||
|
|||||||
@@ -674,13 +674,18 @@ export class ComfyApp {
|
|||||||
|
|
||||||
api.addEventListener('execution_error', ({ detail }) => {
|
api.addEventListener('execution_error', ({ detail }) => {
|
||||||
// Check if this is an auth-related error or credits-related error
|
// Check if this is an auth-related error or credits-related error
|
||||||
if (detail.exception_message === 'Please login first to use this node.') {
|
if (
|
||||||
useDialogService().showSignInRequiredDialog({ type: 'signIn' })
|
detail.exception_message ===
|
||||||
|
'Unauthorized: Please login first to use this node.'
|
||||||
|
) {
|
||||||
|
useDialogService().showApiNodesSignInDialog([detail.node_type])
|
||||||
} else if (
|
} else if (
|
||||||
detail.exception_message ===
|
detail.exception_message ===
|
||||||
'Payment Required: Please add credits to your account to use this node.'
|
'Payment Required: Please add credits to your account to use this node.'
|
||||||
) {
|
) {
|
||||||
useDialogService().showSignInRequiredDialog({ type: 'credits' })
|
useDialogService().showTopUpCreditsDialog({
|
||||||
|
isInsufficientCredits: true
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
useDialogService().showExecutionErrorDialog(detail)
|
useDialogService().showExecutionErrorDialog(detail)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import MissingModelsWarning from '@/components/dialog/content/MissingModelsWarni
|
|||||||
import PromptDialogContent from '@/components/dialog/content/PromptDialogContent.vue'
|
import PromptDialogContent from '@/components/dialog/content/PromptDialogContent.vue'
|
||||||
import SettingDialogContent from '@/components/dialog/content/SettingDialogContent.vue'
|
import SettingDialogContent from '@/components/dialog/content/SettingDialogContent.vue'
|
||||||
import SignInContent from '@/components/dialog/content/SignInContent.vue'
|
import SignInContent from '@/components/dialog/content/SignInContent.vue'
|
||||||
import SignInRequiredDialogContent from '@/components/dialog/content/SignInRequiredDialogContent.vue'
|
|
||||||
import TopUpCreditsDialogContent from '@/components/dialog/content/TopUpCreditsDialogContent.vue'
|
import TopUpCreditsDialogContent from '@/components/dialog/content/TopUpCreditsDialogContent.vue'
|
||||||
import ManagerDialogContent from '@/components/dialog/content/manager/ManagerDialogContent.vue'
|
import ManagerDialogContent from '@/components/dialog/content/manager/ManagerDialogContent.vue'
|
||||||
import ManagerHeader from '@/components/dialog/content/manager/ManagerHeader.vue'
|
import ManagerHeader from '@/components/dialog/content/manager/ManagerHeader.vue'
|
||||||
@@ -348,20 +347,13 @@ export const useDialogService = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function showSignInRequiredDialog(options: { type: 'signIn' | 'credits' }) {
|
|
||||||
dialogStore.showDialog({
|
|
||||||
key: 'signin-required',
|
|
||||||
component: SignInRequiredDialogContent,
|
|
||||||
props: options
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function showTopUpCreditsDialog(options?: {
|
function showTopUpCreditsDialog(options?: {
|
||||||
isInsufficientCredits?: boolean
|
isInsufficientCredits?: boolean
|
||||||
}) {
|
}) {
|
||||||
return dialogStore.showDialog({
|
return dialogStore.showDialog({
|
||||||
key: 'top-up-credits',
|
key: 'top-up-credits',
|
||||||
component: TopUpCreditsDialogContent,
|
component: TopUpCreditsDialogContent,
|
||||||
|
headerComponent: ComfyOrgHeader,
|
||||||
props: options,
|
props: options,
|
||||||
dialogComponentProps: {
|
dialogComponentProps: {
|
||||||
pt: {
|
pt: {
|
||||||
@@ -384,7 +376,6 @@ export const useDialogService = () => {
|
|||||||
showErrorDialog,
|
showErrorDialog,
|
||||||
showApiNodesSignInDialog,
|
showApiNodesSignInDialog,
|
||||||
showSignInDialog,
|
showSignInDialog,
|
||||||
showSignInRequiredDialog,
|
|
||||||
showTopUpCreditsDialog,
|
showTopUpCreditsDialog,
|
||||||
prompt,
|
prompt,
|
||||||
confirm
|
confirm
|
||||||
|
|||||||
Reference in New Issue
Block a user