Files
WJLUOXIAO-XB_ToolBox/__init__.py
T
2026-11-13 21:41:11 +08:00

680 lines
36 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os
import traceback
from server import PromptServer
from aiohttp import web
HAS_TKINTER = False
try:
import tkinter as tk
from tkinter import filedialog
HAS_TKINTER = True
except ImportError:
pass # 静默放行,不要让整个节点加载失败
@PromptServer.instance.routes.post("/xb_toolbox/choose_folder")
async def choose_folder(request):
if not HAS_TKINTER:
return web.json_response({"path": "", "error": "当前整合包环境缺少弹窗依赖,请手动输入或粘贴文件夹路径。"})
try:
root = tk.Tk()
root.withdraw()
root.attributes('-topmost', True)
folder_path = filedialog.askdirectory()
root.destroy()
return web.json_response({"path": folder_path})
except Exception as e:
return web.json_response({"path": "", "error": f"弹窗调用失败: {str(e)}"})
from .nodes.audio.nodes_audio_slicer import handle_audio_waveform
from .nodes.llm.nodes_model_loader_v1 import _filter_by_keyword
@PromptServer.instance.routes.post("/xb_toolbox/audio_waveform")
async def get_audio_waveform(request):
return await handle_audio_waveform(request)
@PromptServer.instance.routes.get("/xb_toolbox/yue2_recipes")
async def yue2_recipes(request):
"""YuE2 风格配方表:前端「YuE2 风格提示」节点联动用,与 yue2_styles.RECIPES 同一数据源"""
from .libs.yue2_styles import GENRES, RECIPES
return web.json_response({"recipes": RECIPES, "genres": GENRES})
@PromptServer.instance.routes.post("/xb_toolbox/model_list")
async def get_model_list(request):
"""根据关键字返回过滤后的模型/CLIP/VAE/LoRA列表"""
try:
data = await request.json()
except Exception:
return web.json_response({"error": "Invalid JSON"})
keyword = data.get("keyword", "")
if not keyword:
return web.json_response({"models": [], "clips": [], "vaes": [], "loras": []})
return web.json_response({
"models": sorted(set(_filter_by_keyword("diffusion_models", keyword) + _filter_by_keyword("unet_gguf", keyword))),
"clips": sorted(set(_filter_by_keyword("text_encoders", keyword) + _filter_by_keyword("clip_gguf", keyword))),
"vaes": _filter_by_keyword("vae", keyword),
"loras": _filter_by_keyword("loras", keyword),
})
# ── 「机智罗的工作流」模板数据服务(清单 + 工作流 + 预览图 + 图标样式)──
try:
from .jzl_workflows import register_routes as _register_jzl_workflow_routes
_register_jzl_workflow_routes()
except Exception as _xb_tpl_err:
print(f"[XB_ToolBox] 工作流模板服务注册失败: {_xb_tpl_err}")
def print_success(msg):
print(f"\033[92m{msg}\033[0m")
def print_error(msg):
print(f"\033[91m{msg}\033[0m")
def print_warning(msg):
print(f"\033[93m{msg}\033[0m")
# 启动 banner 上的 JZL 像素字
XB_LOGO = "\n".join([
" ██╗███████╗██╗",
" ██║╚══███╔╝██║",
" ██║ ███╔╝ ██║",
"██ ██║ ███╔╝ ██║",
"╚█████╔╝███████╗███████╗",
" ╚════╝ ╚══════╝╚══════╝",
])
NODE_CLASS_MAPPINGS = {}
NODE_DISPLAY_NAME_MAPPINGS = {}
WEB_DIRECTORY = os.path.join(os.path.dirname(os.path.abspath(__file__)), "web")
try:
from .nodes.hardware.nodes_vis import XB_VRAM_Calculator, XB_ChunkVisualization
from .nodes.hardware.nodes_vram import XTX_Data_Radar
from .nodes.video.nodes_video import XB_VideoParamsMaster, XB_ImageParamsMaster, XB_ImageParamsMasterMini, XB_MasterParameter, XB_VideoLoader, XB_VideoCombine
from .nodes.core.nodes_blockswap import XB_UNetBlockSwap, XB_CheckpointBlockSwap
from .nodes.core.nodes_blockswap_sage import XB_Sage_BlockSwap
from .nodes.core.nodes_wiring import XB_UNetNameBroadcaster, XB_CLIPNameBroadcaster
from .nodes.hardware.nodes_memory_viz import XB_MemoryVisualization
from .nodes.video.nodes_wan_vae import (XB_WanImageToVideo, XB_WanFirstLastFrameToVideo, XB_WanSoundImageToVideo, XB_WanFunControlToVideo, XB_WanVaceToVideo, XB_Wan22FunControlToVideo, XB_WanInfiniteTalkToVideo, XB_WanInfiniteTalkToVideo_Single, XB_WanInfiniteTalkToVideo_Dual, XB_WanFunInpaintToVideo, XB_WanCameraImageToVideo, XB_WanPhantomSubjectToVideo, XB_WanHuMoImageToVideo, XB_Wan22ImageToVideoLatent, XB_WanSoundImageToVideoExtend, XB_WanSCAILToVideo, XB_WanSCAILToVideoPro, XB_WanDancerVideo, XB_WanDanceSwitcher, XB_WanDancerCombo, XB_BerniniConditioning)
from .nodes.core.nodes_batch import XB_BatchFolderLoader, XB_BatchFolderBatchLoader
from .nodes.video.nodes_pipeline import XB_Wan_ParamBus, XB_Wan_RelayNode, XB_Wan_InfiniteRelayNode, XB_Video_Merger, XB_StoryboardSlicer,XB_WanAnimate_ParamBus,XB_WanAnimate_RelayNode, XB_WanInfiniteTalk_ParamBus, XB_WanInfiniteTalk_RelayNode, XB_Wan_InfiniteRelayNode_New, XB_WanAnimate_RelayNode_New, XB_WanInfiniteTalk_RelayNode_New, XB_WanSCAIL_ParamBus_New, XB_WanSCAIL_RelayNode_New, XB_WanInfiniteTalk_RelayNode_MultiRef, XB_WanInfiniteTalk_RelayNode_AllInOne
from .nodes.video.nodes_ltx_streamer import XB_LTX23_InfiniteStreamer
from .nodes.core.nodes_sageatt import XB_SageAttentionAccelerator
from .nodes.video.nodes_wan import XB_WanCompileSettings, XB_WanAnimateToVideo
from .nodes.core.nodes_label import XB_CanvasLabel
from .nodes.audio.nodes_audio_slicer import XB_AudioSlicer, XB_AudioSlicerV1, XB_AudioSlicerV2, XB_AudioSlicerV3
from .nodes.video.nodes_digital_human import XB_DigitalHumanParams_Single, XB_DigitalHumanParams_Dual
from .nodes.llm.nodes_model_loader_gguf import XB_ModelLoaderV1_GGUF, XB_ModelLoaderV2_GGUF, XB_ModelLoaderV3_GGUF
from .nodes.core.nodes_status_switch import XB_NodeStatusSwitch
from .nodes.core.nodes_fast_toggle import XB_DisableGroups, XB_DisableNodes, XB_AnySwitch, XB_AnyIndexSwitch
from .nodes.image.nodes_flux_encode import XB_FluxMultiImageEncode
from .nodes.image.nodes_qwen_encode import XB_TextEncodeQwenImageEdit, XB_TextEncodeQwenImageEditPlus
from .nodes.image.nodes_image_scale import XB_ImageScale, XB_ImageScalePixels
from .nodes.image.nodes_shenbi import XB_ShenBi
from .nodes.video.nodes_hailuo_video import XB_HailuoH3VideoParams
from .nodes.core.nodes_list_dispatcher import XB_ListDispatcher
from .nodes.core.nodes_batch_images import XB_BatchImages
from .nodes.core.nodes_reference_any import XB_ReferenceAny
from .nodes.image.nodes_segmentation import XB_HumanSegModelLoader, XB_HumanSegmentation
# 注册视频转码端点(预览窗口实时缩放依赖)
from .libs import xb_video_server
from .nodes.core.nodes_vanilla_wrappers import (XB_KSampler, XB_KSamplerAdvanced,
XB_SamplerCustom, XB_SamplerCustomAdvanced,
XB_VAEDecode, XB_VAEDecodeTiled,
XB_VAEDecodeTiledImage,
XB_VAEEncode, XB_VAEEncodeTiled,
XB_VAEEncodeTiledImage,
XB_VAEEncodeForInpaint,
_AliasVAEDecodeTemporal)
from .nodes.core.nodes_string_merge import XB_StringMerge
from .nodes.core.nodes_prompt_line import XB_PromptLine
from .nodes.core.nodes_clip_text_edit import XB_CLIPTextEdit
from .nodes.core.nodes_lora_loader import XB_TripleLoraLoader, XB_TripleLoraLoaderModelOnly
from .nodes.core.nodes_msr import XB_MSR
from .nodes.image.nodes_comic import XB_ComicPromptParser, XB_ComicTextRenderer, XB_AutoBubbleTextRenderer
from .nodes.core.nodes_super import XB_BerniniPromptRouter, XB_K2StyleRouter
# ── Llama 节点 (LLM/VLM) ──
try:
from .nodes.llm.nodes_llama import (
XB_llamaModelLoader, XB_llamaModelLoaderPro, XB_llamaInstruct, XB_llamaParameters,
XB_llamaUnloadModel, XB_llamaCleanStates,
XB_llamaBBoxes2BBox, XB_llamaUnpackCodeBlock, XB_llamaPromptEnhancer,
XB_llamaMiniMaxPreset, XB_llamaMiniMaxRef2vaPreset,
XB_llamaStoryboardEnhancer, XB_llamaStoryboardInstruct,
XB_llamaStoryboardProcessor, XB_llamaStoryboardProcessorPro,
XB_RoleSceneDispatcher,
)
# ── 提示词增强反推(模型加载器 + 指令推理 + 提示词增强预设 + 推理参数 + LLM-API 设置 五合一)──
from .nodes.llm.nodes_llama_prompt_reverse import XB_llamaPromptReverse
_LLAMA_AVAILABLE = True
except ImportError as e:
print_warning(f"[XB-llama] llama-cpp-python 未安装, Llama/MiniMax 节点不可用: {e}")
_LLAMA_AVAILABLE = False
# ── 🖼️ 生图提示词预设Pro(生图提示词预设 + 提示词增强反推 融合)──
try:
from .nodes.image.nodes_image_prompt_preset_pro import XB_ImagePromptPresetPro
_PRO_AVAILABLE = True
except Exception as e:
print_warning(f"[XB-BOX] 生图提示词预设Pro 未加载:{e}")
_PRO_AVAILABLE = False
# ── 🖼️ Qwen2.1提示词预设(生图提示词预设 + 官方 Load CLIP + 官方 Generate Text)──
try:
from .nodes.image.nodes_qwen_prompt_preset import XB_QwenPromptPreset
_QWEN_AVAILABLE = True
except Exception as e:
print_warning(f"[XB-BOX] Qwen2.1提示词预设 未加载:{e}")
_QWEN_AVAILABLE = False
# ── 🎵 YuE2 音乐节点(风格提示 / 歌词 / 乐谱工作台 / 翻唱准备 / 转谱导入)──
try:
from .nodes.audio.nodes_yue2_style import XB_YuE2StylePrompt
from .nodes.audio.nodes_yue2_lyrics import XB_YuE2Lyrics
from .nodes.audio.nodes_yue2_score import XB_YuE2ScoreWorkbench, XB_YuE2CoverPrep
from .nodes.audio.nodes_yue2_transcription import XB_YuE2Transcription
_YUE2_AVAILABLE = True
except Exception as e:
print_warning(f"[XB-BOX] YuE2 音乐节点 未加载:{e}")
_YUE2_AVAILABLE = False
# ── CosyVoice3 音频节点 ──
from .nodes.cosyvoice3.nodes.model_loader import XB_CosyVoice3_ModelLoader
from .nodes.cosyvoice3.nodes.zero_shot import XB_CosyVoice3_ZeroShot
from .nodes.cosyvoice3.nodes.cross_lingual import XB_CosyVoice3_CrossLingual
from .nodes.cosyvoice3.nodes.voice_conversion import XB_CosyVoice3_VoiceConversion
from .nodes.cosyvoice3.nodes.audio_crop import XB_CosyVoice3_AudioCrop
from .nodes.cosyvoice3.nodes.dialog import XB_CosyVoice3_Dialog
from .nodes.cosyvoice3.nodes.instruct2 import XB_CosyVoice3_Instruct2
from .nodes.cosyvoice3.nodes.save_speaker import XB_CosyVoice3_SaveSpeaker
from .nodes.cosyvoice3.nodes.speaker_clone import XB_CosyVoice3_SpeakerClone
from .nodes.cosyvoice3.nodes.speaker_instruct2 import XB_CosyVoice3_SpeakerInstruct2
# ── 🎬 保存视频(Create Video + Save Video 二合一,依赖新版 V3 API)──
try:
from .nodes.video.nodes_save_video import XB_SaveVideo
_SAVE_VIDEO_AVAILABLE = True
except Exception as e:
print_warning(f"[XB-BOX] 保存视频节点 未加载:{e}")
_SAVE_VIDEO_AVAILABLE = False
# ── 🎬 加载视频(Load Video + Get Video Components 二合一,依赖新版 V3 API)──
try:
from .nodes.video.nodes_load_video import XB_LoadVideo
_LOAD_VIDEO_AVAILABLE = True
except Exception as e:
print_warning(f"[XB-BOX] 加载视频节点 未加载:{e}")
_LOAD_VIDEO_AVAILABLE = False
# ── 🎬 视频批量切片(Trim Video 的批量版,依赖新版 V3 API)──
try:
from .nodes.video.nodes_batch_video_slicer import XB_BatchVideoSlice
_BATCH_VIDEO_SLICE_AVAILABLE = True
except Exception as e:
print_warning(f"[XB-BOX] 视频批量切片节点 未加载:{e}")
_BATCH_VIDEO_SLICE_AVAILABLE = False
# ── 🎬 视频批量保存(逐段解码 + 编码 + 存盘,防 OOM,依赖新版 V3 API)──
try:
from .nodes.video.nodes_batch_save_video import XB_BatchSaveVideo
_BATCH_SAVE_VIDEO_AVAILABLE = True
except Exception as e:
print_warning(f"[XB-BOX] 视频批量保存节点 未加载:{e}")
_BATCH_SAVE_VIDEO_AVAILABLE = False
# ── 🎬 视频批量拼接(无损拼接分段视频,依赖新版 V3 API)──
try:
from .nodes.video.nodes_batch_video_merge import XB_BatchVideoMerge
_BATCH_VIDEO_MERGE_AVAILABLE = True
except Exception as e:
print_warning(f"[XB-BOX] 视频批量拼接节点 未加载:{e}")
_BATCH_VIDEO_MERGE_AVAILABLE = False
# ── 🎬 长视频逐段放大保存(单节点内循环,内存只占 1 段)──
try:
from .nodes.video.nodes_long_video_vsr import XB_LongVideoVSRUpscale
_LONG_VIDEO_VSR_AVAILABLE = True
except Exception as e:
print_warning(f"[XB-BOX] 长视频逐段放大保存节点 未加载:{e}")
_LONG_VIDEO_VSR_AVAILABLE = False
# ── 生图提示词预设(提示词 + 空latent 一体化)──
from .nodes.image.nodes_image_prompt_preset import XB_ImagePromptPreset
# ── 生图预设(生图提示词预设 + 姿态参考图 / 穿搭参考图)──
# 同时 import xb_gallery → 注册 /xb_toolbox/gallery/* 端点(图库绑定、素材清单、图片读取)
try:
from .libs import xb_gallery # noqa: F401
from .nodes.image.nodes_image_preset import XB_ImagePreset
_IMAGE_PRESET_AVAILABLE = True
except Exception as e:
print_warning(f"[XB-BOX] 生图预设节点 未加载:{e}")
_IMAGE_PRESET_AVAILABLE = False
# ── 播放声音(复刻 pysssss PlaySound,自带音频资源)──
from .nodes.audio.nodes_play_sound import XB_PlaySound
NODE_CLASS_MAPPINGS = {
"XB_VRAM_Calculator": XB_VRAM_Calculator,
"XB_ChunkVisualization": XB_ChunkVisualization,
"XTX_Data_Radar": XTX_Data_Radar,
"XB_VideoParamsMaster": XB_VideoParamsMaster,
"XB_ImageParamsMaster": XB_ImageParamsMaster,
"XB_ImageParamsMasterMini": XB_ImageParamsMasterMini,
"XB_ShenBi": XB_ShenBi,
"XB_ImagePromptPreset": XB_ImagePromptPreset,
"XB_PlaySound": XB_PlaySound,
"XB_MasterParameter": XB_MasterParameter,
"XB_VideoLoader": XB_VideoLoader,
"XB_VideoCombine": XB_VideoCombine,
"XB_UNetBlockSwap": XB_UNetBlockSwap,
"XB_CheckpointBlockSwap": XB_CheckpointBlockSwap,
"XB_Sage_BlockSwap": XB_Sage_BlockSwap,
"XB_UNetNameBroadcaster": XB_UNetNameBroadcaster,
"XB_CLIPNameBroadcaster": XB_CLIPNameBroadcaster,
"XB_MemoryVisualization": XB_MemoryVisualization,
"XB_WanImageToVideo": XB_WanImageToVideo,
"XB_WanFirstLastFrameToVideo": XB_WanFirstLastFrameToVideo,
"XB_WanFunControlToVideo": XB_WanFunControlToVideo,
"XB_WanVaceToVideo": XB_WanVaceToVideo,
"XB_Wan22FunControlToVideo": XB_Wan22FunControlToVideo,
"XB_WanSoundImageToVideo": XB_WanSoundImageToVideo,
"XB_WanInfiniteTalkToVideo": XB_WanInfiniteTalkToVideo,
"XB_WanInfiniteTalkToVideo_Single": XB_WanInfiniteTalkToVideo_Single,
"XB_WanInfiniteTalkToVideo_Dual": XB_WanInfiniteTalkToVideo_Dual,
"XB_WanFunInpaintToVideo": XB_WanFunInpaintToVideo,
"XB_WanCameraImageToVideo": XB_WanCameraImageToVideo,
"XB_WanPhantomSubjectToVideo": XB_WanPhantomSubjectToVideo,
"XB_WanHuMoImageToVideo": XB_WanHuMoImageToVideo,
"XB_Wan22ImageToVideoLatent": XB_Wan22ImageToVideoLatent,
"XB_WanSoundImageToVideoExtend": XB_WanSoundImageToVideoExtend,
"XB_WanSCAILToVideo": XB_WanSCAILToVideo,
"XB_WanSCAILToVideoPro": XB_WanSCAILToVideoPro,
"XB_WanDancerVideo": XB_WanDancerVideo,
"XB_WanDanceSwitcher": XB_WanDanceSwitcher,
"XB_WanDancerCombo": XB_WanDancerCombo,
"XB_BerniniConditioning": XB_BerniniConditioning,
"XB_BatchFolderLoader": XB_BatchFolderLoader,
"XB_BatchFolderBatchLoader": XB_BatchFolderBatchLoader,
"XB_Wan_ParamBus": XB_Wan_ParamBus,
"XB_Wan_RelayNode": XB_Wan_RelayNode,
"XB_Wan_InfiniteRelayNode": XB_Wan_InfiniteRelayNode,
"XB_Video_Merger": XB_Video_Merger,
"XB_StoryboardSlicer": XB_StoryboardSlicer,
"XB_SageAttentionAccelerator": XB_SageAttentionAccelerator,
# ── 借尸还魂:旧 ROCm 节点 ID → 别名类(兼容旧参数名) ──
# ── 新原版优化节点 ──
"XB_KSampler": XB_KSampler,
"XB_KSamplerAdvanced": XB_KSamplerAdvanced,
"XB_SamplerCustom": XB_SamplerCustom,
"XB_SamplerCustomAdvanced": XB_SamplerCustomAdvanced,
"XB_VAEDecode": XB_VAEDecode,
"XB_VAEDecodeTiled": XB_VAEDecodeTiled,
"XB_VAEDecodeTiledImage": XB_VAEDecodeTiledImage,
"XB_VAEEncode": XB_VAEEncode,
"XB_VAEEncodeTiled": XB_VAEEncodeTiled,
"XB_VAEEncodeTiledImage": XB_VAEEncodeTiledImage,
"XB_VAEEncodeForInpaint": XB_VAEEncodeForInpaint,
"XB_WanCompileSettings": XB_WanCompileSettings,
"XB_WanAnimateToVideo": XB_WanAnimateToVideo,
"XB_WanAnimate_ParamBus": XB_WanAnimate_ParamBus,
"XB_WanAnimate_RelayNode": XB_WanAnimate_RelayNode,
"XB_WanInfiniteTalk_ParamBus": XB_WanInfiniteTalk_ParamBus,
"XB_WanInfiniteTalk_RelayNode": XB_WanInfiniteTalk_RelayNode,
"XB_Wan_InfiniteRelayNode_New": XB_Wan_InfiniteRelayNode_New,
"XB_WanAnimate_RelayNode_New": XB_WanAnimate_RelayNode_New,
"XB_WanInfiniteTalk_RelayNode_New": XB_WanInfiniteTalk_RelayNode_New,
"XB_WanSCAIL_ParamBus_New": XB_WanSCAIL_ParamBus_New,
"XB_WanSCAIL_RelayNode_New": XB_WanSCAIL_RelayNode_New,
"XB_WanInfiniteTalk_RelayNode_MultiRef": XB_WanInfiniteTalk_RelayNode_MultiRef,
"XB_WanInfiniteTalk_RelayNode_AllInOne": XB_WanInfiniteTalk_RelayNode_AllInOne,
"XB_LTX23_InfiniteStreamer": XB_LTX23_InfiniteStreamer,
"XB_NodeStatusSwitch": XB_NodeStatusSwitch,
"XB_DisableGroups": XB_DisableGroups,
"XB_DisableNodes": XB_DisableNodes,
"XB_AnySwitch": XB_AnySwitch,
"XB_AnyIndexSwitch": XB_AnyIndexSwitch,
"XB_FluxMultiImageEncode": XB_FluxMultiImageEncode,
"XB_TextEncodeQwenImageEdit": XB_TextEncodeQwenImageEdit,
"XB_TextEncodeQwenImageEditPlus": XB_TextEncodeQwenImageEditPlus,
"XB_ImageScale": XB_ImageScale,
"XB_ImageScalePixels": XB_ImageScalePixels,
"XB_HailuoH3VideoParams": XB_HailuoH3VideoParams,
"XB_ListDispatcher": XB_ListDispatcher,
"XB_BatchImages": XB_BatchImages,
"XB_ReferenceAny": XB_ReferenceAny,
"XB_HumanSegmentation": XB_HumanSegmentation,
"XB_HumanSegModelLoader": XB_HumanSegModelLoader,
"XB_CanvasLabel": XB_CanvasLabel,
"XB_AudioSlicer": XB_AudioSlicer,
"XB_AudioSlicerV1": XB_AudioSlicerV1,
"XB_AudioSlicerV2": XB_AudioSlicerV2,
"XB_AudioSlicerV3": XB_AudioSlicerV3,
"XB_DigitalHumanParams_Single": XB_DigitalHumanParams_Single,
"XB_DigitalHumanParams_Dual": XB_DigitalHumanParams_Dual,
"XB_ModelLoaderV1_GGUF": XB_ModelLoaderV1_GGUF,
"XB_ModelLoaderV2_GGUF": XB_ModelLoaderV2_GGUF,
"XB_ModelLoaderV3_GGUF": XB_ModelLoaderV3_GGUF,
"XB_StringMerge": XB_StringMerge,
"XB_PromptLine": XB_PromptLine,
"XB_CLIPTextEdit": XB_CLIPTextEdit,
"XB_TripleLoraLoader": XB_TripleLoraLoader,
"XB_TripleLoraLoaderModelOnly": XB_TripleLoraLoaderModelOnly,
"XB_MSR": XB_MSR,
"XB_ComicPromptParser": XB_ComicPromptParser,
"XB_ComicTextRenderer": XB_ComicTextRenderer,
"XB_AutoBubbleTextRenderer": XB_AutoBubbleTextRenderer,
"XB_BerniniPromptRouter": XB_BerniniPromptRouter,
"XB_K2StyleRouter": XB_K2StyleRouter,
# ── CosyVoice3 音频节点 ──
"XB_CosyVoice3_ModelLoader": XB_CosyVoice3_ModelLoader,
"XB_CosyVoice3_ZeroShot": XB_CosyVoice3_ZeroShot,
"XB_CosyVoice3_CrossLingual": XB_CosyVoice3_CrossLingual,
"XB_CosyVoice3_VoiceConversion": XB_CosyVoice3_VoiceConversion,
"XB_CosyVoice3_AudioCrop": XB_CosyVoice3_AudioCrop,
"XB_CosyVoice3_Dialog": XB_CosyVoice3_Dialog,
"XB_CosyVoice3_Instruct2": XB_CosyVoice3_Instruct2,
"XB_CosyVoice3_SaveSpeaker": XB_CosyVoice3_SaveSpeaker,
"XB_CosyVoice3_SpeakerClone": XB_CosyVoice3_SpeakerClone,
"XB_CosyVoice3_SpeakerInstruct2": XB_CosyVoice3_SpeakerInstruct2,
}
# ── 🖼️ 生图预设(生图提示词预设 + 姿态/穿搭参考图)──
if _IMAGE_PRESET_AVAILABLE:
NODE_CLASS_MAPPINGS.update({
"XB_ImagePreset": XB_ImagePreset,
})
# ── 🎬 保存视频 ──
if _SAVE_VIDEO_AVAILABLE:
NODE_CLASS_MAPPINGS.update({
"XB_SaveVideo": XB_SaveVideo,
})
# ── 🎬 加载视频 ──
if _LOAD_VIDEO_AVAILABLE:
NODE_CLASS_MAPPINGS.update({
"XB_LoadVideo": XB_LoadVideo,
})
# ── 🎬 视频批量切片 ──
if _BATCH_VIDEO_SLICE_AVAILABLE:
NODE_CLASS_MAPPINGS.update({
"XB_BatchVideoSlice": XB_BatchVideoSlice,
})
# ── 🎬 视频批量保存 ──
if _BATCH_SAVE_VIDEO_AVAILABLE:
NODE_CLASS_MAPPINGS.update({
"XB_BatchSaveVideo": XB_BatchSaveVideo,
})
# ── 🎬 视频批量拼接 ──
if _BATCH_VIDEO_MERGE_AVAILABLE:
NODE_CLASS_MAPPINGS.update({
"XB_BatchVideoMerge": XB_BatchVideoMerge,
})
# ── 🎬 长视频逐段放大保存 ──
if _LONG_VIDEO_VSR_AVAILABLE:
NODE_CLASS_MAPPINGS.update({
"XB_LongVideoVSRUpscale": XB_LongVideoVSRUpscale,
})
# ── 条件注册 Llama 节点 ──
if _LLAMA_AVAILABLE:
NODE_CLASS_MAPPINGS.update({
"XB_llamaModelLoader": XB_llamaModelLoader,
"XB_llamaModelLoaderPro": XB_llamaModelLoaderPro,
"XB_llamaInstruct": XB_llamaInstruct,
"XB_llamaParameters": XB_llamaParameters,
"XB_llamaUnloadModel": XB_llamaUnloadModel,
"XB_llamaCleanStates": XB_llamaCleanStates,
"XB_llamaBBoxes2BBox": XB_llamaBBoxes2BBox,
"XB_llamaUnpackCodeBlock": XB_llamaUnpackCodeBlock,
"XB_llamaPromptEnhancer": XB_llamaPromptEnhancer,
"XB_llamaMiniMaxPreset": XB_llamaMiniMaxPreset,
"XB_llamaMiniMaxRef2va": XB_llamaMiniMaxRef2vaPreset,
"XB_llamaStoryboardEnhancer": XB_llamaStoryboardEnhancer,
"XB_llamaStoryboardInstruct": XB_llamaStoryboardInstruct,
"XB_llamaStoryboardProcessor": XB_llamaStoryboardProcessor,
"XB_llamaStoryboardProcessorPro": XB_llamaStoryboardProcessorPro,
"XB_RoleSceneDispatcher": XB_RoleSceneDispatcher,
"XB_llamaPromptReverse": XB_llamaPromptReverse,
})
# ── 生图提示词预设Pro ──
if _PRO_AVAILABLE:
NODE_CLASS_MAPPINGS.update({
"XB_ImagePromptPresetPro": XB_ImagePromptPresetPro,
})
# ── Qwen2.1提示词预设 ──
if _QWEN_AVAILABLE:
NODE_CLASS_MAPPINGS.update({
"XB_QwenPromptPreset": XB_QwenPromptPreset,
})
# ── 🎵 YuE2 音乐节点 ──
if _YUE2_AVAILABLE:
NODE_CLASS_MAPPINGS.update({
"XB_YuE2StylePrompt": XB_YuE2StylePrompt,
"XB_YuE2Lyrics": XB_YuE2Lyrics,
"XB_YuE2ScoreWorkbench": XB_YuE2ScoreWorkbench,
"XB_YuE2CoverPrep": XB_YuE2CoverPrep,
"XB_YuE2Transcription": XB_YuE2Transcription,
})
NODE_DISPLAY_NAME_MAPPINGS = {
"XB_VRAM_Calculator": "XB-BOX - VRAM Calculator",
"XB_ChunkVisualization": "XB-BOX - Chunk Visualization",
"XTX_Data_Radar": "XB-BOX - Data Radar",
"XB_VideoParamsMaster": "XB-BOX - Video Params Master",
"XB_ImageParamsMaster": "XB-BOX - Image Params Master",
"XB_ImageParamsMasterMini": "XB-BOX - Image Params Master Mini",
"XB_ShenBi": "XB-BOX - 🖌️ ShenBi Brush",
"XB_ImagePromptPreset": "XB-BOX - Image Prompt Preset",
"XB_ImagePreset": "XB-BOX - 🖼️ 生图提示词预设(图)",
"XB_PlaySound": "XB-BOX - 🔊 播放声音",
"XB_MasterParameter": "XB-BOX - Master Parameter",
"XB_VideoLoader": "XB-BOX - 🎬 视频加载器(修复预览BUG)",
"XB_VideoCombine": "XB-BOX - 🎬 视频拼接输出",
"XB_UNetBlockSwap": "XB-BOX - UNet Block Swap",
"XB_CheckpointBlockSwap": "XB-BOX - Checkpoint Block Swap",
"XB_Sage_BlockSwap": "XB-BOX - Acceleration + BlockSwap Duo",
"XB_UNetNameBroadcaster": "XB-BOX - UNet Name Broadcaster",
"XB_CLIPNameBroadcaster": "XB-BOX - CLIP Name Broadcaster",
"XB_MemoryVisualization": "XB 📊 硬件监控面板 (Memory Visualization)",
"XB_WanImageToVideo": "XB-BOX - Wan Image2Video",
"XB_WanFirstLastFrameToVideo": "XB-BOX - Wan First/Last Frame2Video",
"XB_BatchFolderLoader": "XB-BOX - 📂 图片序列加载",
"XB_BatchFolderBatchLoader": "XB-BOX - 📂 图片批量加载",
"XB_Wan_ParamBus": "XB-BOX - Wan Param Bus",
"XB_Wan_RelayNode": "XB-BOX - Wan Relay Node",
"XB_Wan_InfiniteRelayNode": "XB-BOX - Wan Infinite Relay Node",
"XB_Video_Merger": "XB-BOX - Video Merger",
"XB_StoryboardSlicer": "XB-BOX - Storyboard Slicer",
"XB_SageAttentionAccelerator": "XB-BOX - Acceleration Mode Selector",
# ── 借尸还魂:旧节点名 + 新的优化版显示名 ──
# ── 新优化版节点 ──
"XB_KSampler": "XB-BOX - 采样器(原版优化)",
"XB_KSamplerAdvanced": "XB-BOX - 高级采样器(原版优化)",
"XB_SamplerCustom": "XB-BOX - 自定义采样器(原版优化)",
"XB_SamplerCustomAdvanced": "XB-BOX - 自定义高级采样器(原版优化)",
"XB_VAEDecode": "XB-BOX - VAE解码(原版优化)",
"XB_VAEDecodeTiled": "XB-BOX - VAE分块解码(原版优化)",
"XB_VAEDecodeTiledImage": "XB-BOX - VAE分块解码·图片(原版优化)",
"XB_VAEEncode": "XB-BOX - VAE编码(原版优化)",
"XB_VAEEncodeTiled": "XB-BOX - VAE分块编码(原版优化)",
"XB_VAEEncodeTiledImage": "XB-BOX - VAE分块编码·图片(原版优化)",
"XB_VAEEncodeForInpaint": "XB-BOX - VAE修补编码(原版优化)",
"XB_WanCompileSettings": "XB-BOX - ⚡ Wan 编译设置",
"XB_WanAnimateToVideo": "XB-BOX - 🎬 Wan 动画转视频",
"XB_WanAnimate_ParamBus": "XB-BOX - 🎬 Animate 动作迁移总线",
"XB_WanAnimate_RelayNode": "XB-BOX - 🏃‍♀️ Animate 无限接力点",
"XB_WanInfiniteTalk_ParamBus": "XB-BOX - 🎵 InfiniteTalk 无限对口型总线",
"XB_WanInfiniteTalk_RelayNode": "XB-BOX - 🏃 InfiniteTalk 无限对口型接力点",
"XB_Wan_InfiniteRelayNode_New": "XB-BOX - 🆕 Wan 无限接力点 (New)",
"XB_WanAnimate_RelayNode_New": "XB-BOX - 🆕 Animate 无限接力点 (New)",
"XB_WanInfiniteTalk_RelayNode_New": "XB-BOX - 🆕 InfiniteTalk 无限接力点 (New)",
"XB_WanSCAIL_ParamBus_New": "XB-BOX - 🆕 SCAIL 总线 (New)",
"XB_WanSCAIL_RelayNode_New": "XB-BOX - 🆕 SCAIL 无限接力点 (New)",
"XB_WanInfiniteTalk_RelayNode_MultiRef": "XB-BOX - 🆕 InfiniteTalk 无限接力点 (多图)",
"XB_WanInfiniteTalk_RelayNode_AllInOne": "XB-BOX - 🆕 InfiniteTalk 无限接力点 (全能)",
"XB_LTX23_InfiniteStreamer": "XB-BOX - 🔄 LTX2.3 数字人无限时长对口型",
"XB_NodeStatusSwitch": "XB-BOX - ⚡ 节点状态开关",
"XB_DisableGroups": "XB-BOX - 🚫 禁用分组",
"XB_DisableNodes": "XB-BOX - 🚫 禁用节点",
"XB_AnySwitch": "XB-BOX - 🔀 切换任意",
"XB_AnyIndexSwitch": "XB-BOX - 🔢 切换编号",
"XB_FluxMultiImageEncode": "XB-BOX - 🖼️ FLUX多图编码",
"XB_TextEncodeQwenImageEdit": "XB-BOX - 📝 Qwen图像编辑编码",
"XB_TextEncodeQwenImageEditPlus": "XB-BOX - 📝 Qwen图像编辑编码Plus",
"XB_ImageScale": "XB-BOX - 📐 批量缩放图像",
"XB_ImageScalePixels": "XB-BOX - 📐 批量缩放图像(像素)",
"XB_HailuoH3VideoParams": "XB-BOX - 🌊 海螺H3视频参数",
"XB_ListDispatcher": "XB-BOX - 📋 列表分发",
"XB_BatchImages": "XB-BOX - 🖼️ 批量图像",
"XB_ReferenceAny": "XB-BOX - 🔗 引用任意",
"XB_HumanSegmentation": "XB-BOX - ✂️ 人物分割 (DirectML/ROCm)",
"XB_HumanSegModelLoader": "XB-BOX - 📥 人物分割模型加载",
"XB_CanvasLabel": "XB-BOX - 🏷️ Canvas Label (文字标签)",
"XB_AudioSlicer": "XB-BOX - 🎵 音频切片(基础)",
"XB_AudioSlicerV1": "XB-BOX - 🎵 音频切片V1(单人)",
"XB_AudioSlicerV2": "XB-BOX - 🎵 音频切片V2(双人)",
"XB_AudioSlicerV3": "XB-BOX - 🎵 音频切片V3(高级)",
"XB_DigitalHumanParams_Single": "XB-BOX - 🤖 数字人参数调节(单人)",
"XB_DigitalHumanParams_Dual": "XB-BOX - 🤖 数字人参数调节(双人)",
"XB_ModelLoaderV1_GGUF": "XB-BOX - 📦 模型加载大全V1 (GGUF)",
"XB_ModelLoaderV2_GGUF": "XB-BOX - 📦 模型加载大全V2 (GGUF)",
"XB_ModelLoaderV3_GGUF": "XB-BOX - 📦 模型加载大全V3 (GGUF)",
"XB_WanInfiniteTalkToVideo": "XB-BOX - 🎵 语音转视频分块",
"XB_WanInfiniteTalkToVideo_Single": "XB-BOX - 🎵 语音转视频分块(单人)",
"XB_WanInfiniteTalkToVideo_Dual": "XB-BOX - 🎵 语音转视频分块(双人)",
"XB_StringMerge": "XB-BOX - 📝 字符串合并",
"XB_PromptLine": "XB-BOX - 📝 提示词多行",
"XB_CLIPTextEdit": "XB-BOX - 📝 CLIP 文本编辑",
"XB_TripleLoraLoader": "XB-BOX - 🔗 三连 LoRA 加载",
"XB_TripleLoraLoaderModelOnly": "XB-BOX - 🔗 三连 LoRA 加载(仅模型)",
"XB_MSR": "XB-BOX - 🎞️ MSR 多图合成帧序列",
"XB_ComicPromptParser": "XB-BOX - 📝 漫画提示词智能解析",
"XB_ComicTextRenderer": "XB-BOX - 💬 漫画文字渲染 (精确坐标)",
"XB_AutoBubbleTextRenderer": "XB-BOX - 🤖 漫画文字渲染 (全自动带涂改液)",
"XB_BerniniConditioning": "XB-BOX - 🎨 Bernini 条件注入(VAE分块)",
"XB_BerniniPromptRouter": "XB-BOX - 🧠 Bernini 提示词路由(超级节点)",
"XB_K2StyleRouter": "XB-BOX - 🎨 K2 风格切换路由(超级节点)",
# ── CosyVoice3 音频节点 ──
"XB_CosyVoice3_ModelLoader": "XB-BOX - 🔊 CosyVoice3 模型加载",
"XB_CosyVoice3_ZeroShot": "XB-BOX - 🎤 CosyVoice3 零样本克隆",
"XB_CosyVoice3_CrossLingual": "XB-BOX - 🌐 CosyVoice3 跨语言合成",
"XB_CosyVoice3_VoiceConversion": "XB-BOX - 🔄 CosyVoice3 语音转换",
"XB_CosyVoice3_AudioCrop": "XB-BOX - ✂️ CosyVoice3 音频裁剪",
"XB_CosyVoice3_Dialog": "XB-BOX - 💬 CosyVoice3 多人对话",
"XB_CosyVoice3_Instruct2": "XB-BOX - 🎭 CosyVoice3 指令控制",
"XB_CosyVoice3_SaveSpeaker": "XB-BOX - 💾 CosyVoice3 保存说话人",
"XB_CosyVoice3_SpeakerClone": "XB-BOX - 🗣️ CosyVoice3 说话人克隆",
"XB_CosyVoice3_SpeakerInstruct2": "XB-BOX - 🎭 CosyVoice3 说话人指令",
}
# ── 🎬 保存视频 显示名 ──
if _SAVE_VIDEO_AVAILABLE:
NODE_DISPLAY_NAME_MAPPINGS.update({
"XB_SaveVideo": "XB-BOX - 🎬 保存视频",
})
# ── 🎬 加载视频 显示名 ──
if _LOAD_VIDEO_AVAILABLE:
NODE_DISPLAY_NAME_MAPPINGS.update({
"XB_LoadVideo": "XB-BOX - 🎬 加载视频",
})
# ── 🎬 视频批量切片 显示名 ──
if _BATCH_VIDEO_SLICE_AVAILABLE:
NODE_DISPLAY_NAME_MAPPINGS.update({
"XB_BatchVideoSlice": "XB-BOX - 🎬 视频批量切片",
})
# ── 🎬 视频批量保存 显示名 ──
if _BATCH_SAVE_VIDEO_AVAILABLE:
NODE_DISPLAY_NAME_MAPPINGS.update({
"XB_BatchSaveVideo": "XB-BOX - 🎬 视频批量保存",
})
# ── 🎬 视频批量拼接 显示名 ──
if _BATCH_VIDEO_MERGE_AVAILABLE:
NODE_DISPLAY_NAME_MAPPINGS.update({
"XB_BatchVideoMerge": "XB-BOX - 🎬 视频批量拼接",
})
# ── 🎬 长视频逐段放大保存 显示名 ──
if _LONG_VIDEO_VSR_AVAILABLE:
NODE_DISPLAY_NAME_MAPPINGS.update({
"XB_LongVideoVSRUpscale": "XB-BOX - 🎬 长视频逐段放大保存(RelayVSR)",
})
# ── 条件注册 Llama 显示名 ──
if _LLAMA_AVAILABLE:
NODE_DISPLAY_NAME_MAPPINGS.update({
"XB_llamaModelLoader": "XB-llama - 📦 模型加载器",
"XB_llamaModelLoaderPro": "XB-llama - 🚀 模型加载Pro",
"XB_llamaInstruct": "XB-llama - 💬 指令推理",
"XB_llamaParameters": "XB-llama - ⚙️ 推理参数",
"XB_llamaUnloadModel": "XB-llama - 🗑️ 卸载模型",
"XB_llamaCleanStates": "XB-llama - 🧹 清理状态",
"XB_llamaBBoxes2BBox": "XB-llama - 🔍 BBoxes取BBox",
"XB_llamaUnpackCodeBlock": "XB-llama - 📝 解包代码块",
"XB_llamaPromptEnhancer": "XB-llama - ✨ 提示词增强预设",
"XB_llamaMiniMaxPreset": "XB-llama - ✨ MiniMax-fl2va提示词预设",
"XB_llamaMiniMaxRef2va": "XB-llama - ✨ MiniMax-ref2va提示词预设",
"XB_llamaStoryboardEnhancer": "XB-llama - ✨ 分镜增强预设",
"XB_llamaStoryboardInstruct": "XB-llama - 💬 分镜推理",
"XB_llamaStoryboardProcessor": "XB-llama - 🎞️ 分镜词处理器",
"XB_llamaStoryboardProcessorPro": "XB-llama - 🎞️ 分镜词处理器Pro",
"XB_RoleSceneDispatcher": "XB-llama - 🎬 角色场景调度器",
"XB_llamaPromptReverse": "XB-llama - ✨ 提示词增强反推",
})
# ── 生图提示词预设Pro 显示名 ──
if _PRO_AVAILABLE:
NODE_DISPLAY_NAME_MAPPINGS.update({
"XB_ImagePromptPresetPro": "XB-BOX - 🖼️ 生图提示词预设Pro",
})
# ── Qwen2.1提示词预设 显示名 ──
if _QWEN_AVAILABLE:
NODE_DISPLAY_NAME_MAPPINGS.update({
"XB_QwenPromptPreset": "XB-BOX - 🖼️ Qwen2.1提示词预设",
})
# ── 🎵 YuE2 音乐节点 显示名 ──
if _YUE2_AVAILABLE:
NODE_DISPLAY_NAME_MAPPINGS.update({
"XB_YuE2StylePrompt": "XB-BOX - 🎵 YuE2 风格提示",
"XB_YuE2Lyrics": "XB-BOX - 🎵 YuE2 歌词",
"XB_YuE2ScoreWorkbench": "XB-BOX - 🎵 YuE2 乐谱工作台",
"XB_YuE2CoverPrep": "XB-BOX - 🎵 YuE2 翻唱准备",
"XB_YuE2Transcription": "XB-BOX - 🎵 YuE2 转谱导入",
})
print_success("\n" + XB_LOGO)
print_success("="*50)
print_success("🚀 [XB-BOX] XB_ToolBox Core Modules Loaded Successfully!")
print_success("="*50 + "\n")
except Exception as e:
print_error("\n" + "="*50)
print_error("🚨 [XB-BOX] FATAL ERROR: XB_ToolBox Loading Failed!")
print_error(f"❌ Error Detail: {str(e)}")
traceback.print_exc()
print_error("="*50 + "\n")
__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS', 'WEB_DIRECTORY']