Files
rui40000-RUI-Nodes/__init__.py
T
rui40000andClaude Opus 4.8 cc6a6e3400 feat: 新增越光 API 连接节点(OpenAI 兼容,25 个模型内置价格)
参照 ZenMux 节点的架构编写,参数、输出与容错行为保持一致,便于互换。
端点 https://llm.ai-nebula.com/v1/chat/completions

与 ZenMux 的三点差异:
- 模型清单内置在 yueguang/model_registry.py,不做在线快照:越光没有
  可枚举的模型接口,清单与价格来自官方规范文档。少一个联网环节,
  也不会因拉取失败导致下拉变空
- model id 不带厂商前缀(gpt-4o 而非 openai/gpt-4o),下拉靠排序聚类,
  搜索时输 gpt/claude/deepseek/kimi 过滤
- 默认 deepseek-v4-flash(全表最便宜 $0.1/$0.3,官方示例也用它),
  默认值便宜可避免误触发产生意外费用

25 个模型的价格已按文档录入并逐项校验(标签解析、价格、厂商三项一致性
全部通过)。usage_stats 比 ZenMux 多一行厂商,价格换算经手算对照无误。

沿用的实战经验:base_url 默认值不带 ://(前端会吞协议片段)、
自适应参数重试(弃用 temperature / 需 max_completion_tokens 的模型)、
VALIDATE_INPUTS 宽松放行避免价格变动使旧工作流失效。
所有 19 个参数均带中文 tooltip。

验证:链路已打通(认证被接受、响应能正确解析),但文档提供的 key
余额为 0,返回 403「用户额度不足」,故未取得实际回复内容。
换有额度的 key 即可使用。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-30 18:19:39 +08:00

172 lines
10 KiB
Python

# 顶部已有的导入
from .saturation_node import NODE_CLASS_MAPPINGS as SAT_NODE_CLASS_MAPPINGS
from .saturation_node import NODE_DISPLAY_NAME_MAPPINGS as SAT_NODE_DISPLAY_NAME_MAPPINGS
from .flip_node import NODE_CLASS_MAPPINGS as FLIP_NODE_CLASS_MAPPINGS
from .flip_node import NODE_DISPLAY_NAME_MAPPINGS as FLIP_NODE_DISPLAY_NAME_MAPPINGS
from .load_image_node import NODE_CLASS_MAPPINGS as LOAD_NODE_CLASS_MAPPINGS
from .load_image_node import NODE_DISPLAY_NAME_MAPPINGS as LOAD_NODE_DISPLAY_NAME_MAPPINGS
from .load_image_with_name_node import NODE_CLASS_MAPPINGS as LOAD_NAME_NODE_CLASS_MAPPINGS
from .load_image_with_name_node import NODE_DISPLAY_NAME_MAPPINGS as LOAD_NAME_NODE_DISPLAY_NAME_MAPPINGS
from .qwenedit_node import NODE_CLASS_MAPPINGS as QWEN_NODE_CLASS_MAPPINGS
from .qwenedit_node import NODE_DISPLAY_NAME_MAPPINGS as QWEN_NODE_DISPLAY_NAME_MAPPINGS
from .shot_splitter_node import NODE_CLASS_MAPPINGS as SHOT_NODE_CLASS_MAPPINGS
from .shot_splitter_node import NODE_DISPLAY_NAME_MAPPINGS as SHOT_NODE_DISPLAY_NAME_MAPPINGS
from .dialogue_extractor_node import NODE_CLASS_MAPPINGS as DIALOGUE_NODE_CLASS_MAPPINGS
from .dialogue_extractor_node import NODE_DISPLAY_NAME_MAPPINGS as DIALOGUE_NODE_DISPLAY_NAME_MAPPINGS
# 新增:遮罩筛选节点
from .mask_selector_node import NODE_CLASS_MAPPINGS as MASKSELECT_NODE_CLASS_MAPPINGS
from .mask_selector_node import NODE_DISPLAY_NAME_MAPPINGS as MASKSELECT_NODE_DISPLAY_NAME_MAPPINGS
from .page_narration_remover_node import NODE_CLASS_MAPPINGS as NARRATION_NODE_CLASS_MAPPINGS
from .page_narration_remover_node import NODE_DISPLAY_NAME_MAPPINGS as NARRATION_NODE_DISPLAY_NAME_MAPPINGS
from .text_list_node import NODE_CLASS_MAPPINGS as TEXTLIST_NODE_CLASS_MAPPINGS
from .text_list_node import NODE_DISPLAY_NAME_MAPPINGS as TEXTLIST_NODE_DISPLAY_NAME_MAPPINGS
from .mask_preview_node import NODE_CLASS_MAPPINGS as MASKPREVIEW_NODE_CLASS_MAPPINGS
from .mask_preview_node import NODE_DISPLAY_NAME_MAPPINGS as MASKPREVIEW_NODE_DISPLAY_NAME_MAPPINGS
from .utf8_converter_node import NODE_CLASS_MAPPINGS as UTF8_NODE_CLASS_MAPPINGS
from .utf8_converter_node import NODE_DISPLAY_NAME_MAPPINGS as UTF8_NODE_DISPLAY_NAME_MAPPINGS
from .openai_node import NODE_CLASS_MAPPINGS as OPENAI_NODE_CLASS_MAPPINGS
from .openai_node import NODE_DISPLAY_NAME_MAPPINGS as OPENAI_NODE_DISPLAY_NAME_MAPPINGS
# 新增:颜色匹配器节点
from .color_matcher_node import NODE_CLASS_MAPPINGS as COLORMATCHER_NODE_CLASS_MAPPINGS
from .color_matcher_node import NODE_DISPLAY_NAME_MAPPINGS as COLORMATCHER_NODE_DISPLAY_NAME_MAPPINGS
# 新增:素材拆分节点
from .image_splitter_node import NODE_CLASS_MAPPINGS as IMAGESPLITTER_NODE_CLASS_MAPPINGS
from .image_splitter_node import NODE_DISPLAY_NAME_MAPPINGS as IMAGESPLITTER_NODE_DISPLAY_NAME_MAPPINGS
# 新增:SDMatte 精细抠图节点(依赖 diffusers/transformers,缺失时不影响其余节点加载)
try:
from .sdmatte_node import NODE_CLASS_MAPPINGS as SDMATTE_NODE_CLASS_MAPPINGS
from .sdmatte_node import NODE_DISPLAY_NAME_MAPPINGS as SDMATTE_NODE_DISPLAY_NAME_MAPPINGS
except Exception as _e:
print(f"[Ruinode] SDMatte 节点未加载:{_e}")
print("[Ruinode] 如需使用,请安装:pip install diffusers transformers safetensors scipy opencv-python")
SDMATTE_NODE_CLASS_MAPPINGS = {}
SDMATTE_NODE_DISPLAY_NAME_MAPPINGS = {}
# 新增:ZenMux API 连接节点(聚合平台,厂商→模型二级选择,标签含价格)
# 同样用 try/except 保护:万一快照损坏或依赖缺失,不连累其余节点加载
try:
from .zenmux import NODE_CLASS_MAPPINGS as ZENMUX_NODE_CLASS_MAPPINGS
from .zenmux import NODE_DISPLAY_NAME_MAPPINGS as ZENMUX_NODE_DISPLAY_NAME_MAPPINGS
except Exception as _e:
print(f"[Ruinode] ZenMux 节点未加载:{_e}")
ZENMUX_NODE_CLASS_MAPPINGS = {}
ZENMUX_NODE_DISPLAY_NAME_MAPPINGS = {}
# 新增:越光 API 连接节点(OpenAI 兼容,模型清单与价格内置)
try:
from .yueguang import NODE_CLASS_MAPPINGS as YUEGUANG_NODE_CLASS_MAPPINGS
from .yueguang import NODE_DISPLAY_NAME_MAPPINGS as YUEGUANG_NODE_DISPLAY_NAME_MAPPINGS
except Exception as _e:
print(f"[Ruinode] 越光 API 节点未加载:{_e}")
YUEGUANG_NODE_CLASS_MAPPINGS = {}
YUEGUANG_NODE_DISPLAY_NAME_MAPPINGS = {}
# 新增:Markdown 转图片节点(阅读器级排版渲染)
try:
from .markdown_image_node import NODE_CLASS_MAPPINGS as MDIMG_NODE_CLASS_MAPPINGS
from .markdown_image_node import NODE_DISPLAY_NAME_MAPPINGS as MDIMG_NODE_DISPLAY_NAME_MAPPINGS
except Exception as _e:
print(f"[Ruinode] Markdown转图片 节点未加载:{_e}")
MDIMG_NODE_CLASS_MAPPINGS = {}
MDIMG_NODE_DISPLAY_NAME_MAPPINGS = {}
# 新增:多行文本框(原样输出,规避 WAS Text Multiline 吞 "#" 行的问题)
from .text_box_node import NODE_CLASS_MAPPINGS as TEXTBOX_NODE_CLASS_MAPPINGS
from .text_box_node import NODE_DISPLAY_NAME_MAPPINGS as TEXTBOX_NODE_DISPLAY_NAME_MAPPINGS
# 新增:FeyNobg 全自动抠图节点(BiRefNet 系,内嵌 nobg 推理子集)
try:
from .feynobg_node import NODE_CLASS_MAPPINGS as FEYNOBG_NODE_CLASS_MAPPINGS
from .feynobg_node import NODE_DISPLAY_NAME_MAPPINGS as FEYNOBG_NODE_DISPLAY_NAME_MAPPINGS
except Exception as _e:
print(f"[Ruinode] FeyNobg 抠图 节点未加载:{_e}")
FEYNOBG_NODE_CLASS_MAPPINGS = {}
FEYNOBG_NODE_DISPLAY_NAME_MAPPINGS = {}
# 新增:八方向序列拆分节点(8方向行走动画管线)
try:
from .eightdir_node import NODE_CLASS_MAPPINGS as EIGHTDIR_NODE_CLASS_MAPPINGS
from .eightdir_node import NODE_DISPLAY_NAME_MAPPINGS as EIGHTDIR_NODE_DISPLAY_NAME_MAPPINGS
except Exception as _e:
print(f"[Ruinode] 八方向序列拆分 节点未加载:{_e}")
EIGHTDIR_NODE_CLASS_MAPPINGS = {}
EIGHTDIR_NODE_DISPLAY_NAME_MAPPINGS = {}
# 新增:像素化节点(面向像素游戏资产:网格检测/主导色降采样/调色板量化/抖动)
try:
from .pixelate_node import NODE_CLASS_MAPPINGS as PIXELATE_NODE_CLASS_MAPPINGS
from .pixelate_node import NODE_DISPLAY_NAME_MAPPINGS as PIXELATE_NODE_DISPLAY_NAME_MAPPINGS
except Exception as _e:
print(f"[Ruinode] 像素化 节点未加载:{_e}")
PIXELATE_NODE_CLASS_MAPPINGS = {}
PIXELATE_NODE_DISPLAY_NAME_MAPPINGS = {}
# 新增:Lucida 全自动抠图节点(BiRefNet_HR 微调,擅长文字/Logo/插画/玻璃)
try:
from .lucida_node import NODE_CLASS_MAPPINGS as LUCIDA_NODE_CLASS_MAPPINGS
from .lucida_node import NODE_DISPLAY_NAME_MAPPINGS as LUCIDA_NODE_DISPLAY_NAME_MAPPINGS
except Exception as _e:
print(f"[Ruinode] Lucida 抠图 节点未加载:{_e}")
LUCIDA_NODE_CLASS_MAPPINGS = {}
LUCIDA_NODE_DISPLAY_NAME_MAPPINGS = {}
# 新增:满屏文字水印节点(平铺文字 + 旋转/密度/透明度/颜色可调)
try:
from .watermark_node import NODE_CLASS_MAPPINGS as WATERMARK_NODE_CLASS_MAPPINGS
from .watermark_node import NODE_DISPLAY_NAME_MAPPINGS as WATERMARK_NODE_DISPLAY_NAME_MAPPINGS
except Exception as _e:
print(f"[Ruinode] 满屏文字水印 节点未加载:{_e}")
WATERMARK_NODE_CLASS_MAPPINGS = {}
WATERMARK_NODE_DISPLAY_NAME_MAPPINGS = {}
# 合并节点映射字典
NODE_CLASS_MAPPINGS = {}
NODE_CLASS_MAPPINGS.update(SAT_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(FLIP_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(LOAD_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(LOAD_NAME_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(QWEN_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(SHOT_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(DIALOGUE_NODE_CLASS_MAPPINGS)
# 新增:合并遮罩筛选节点
NODE_CLASS_MAPPINGS.update(MASKSELECT_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(NARRATION_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(TEXTLIST_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(MASKPREVIEW_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(UTF8_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(OPENAI_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(COLORMATCHER_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(IMAGESPLITTER_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(SDMATTE_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(ZENMUX_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(YUEGUANG_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(MDIMG_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(TEXTBOX_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(WATERMARK_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(FEYNOBG_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(LUCIDA_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(PIXELATE_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(EIGHTDIR_NODE_CLASS_MAPPINGS)
# 合并节点显示名称映射
NODE_DISPLAY_NAME_MAPPINGS = {}
NODE_DISPLAY_NAME_MAPPINGS.update(SAT_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(FLIP_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(LOAD_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(LOAD_NAME_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(QWEN_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(SHOT_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(DIALOGUE_NODE_DISPLAY_NAME_MAPPINGS)
# 新增:合并遮罩筛选节点显示名
NODE_DISPLAY_NAME_MAPPINGS.update(MASKSELECT_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(NARRATION_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(TEXTLIST_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(MASKPREVIEW_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(UTF8_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(OPENAI_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(COLORMATCHER_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(IMAGESPLITTER_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(SDMATTE_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(ZENMUX_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(YUEGUANG_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(MDIMG_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(TEXTBOX_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(WATERMARK_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(FEYNOBG_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(LUCIDA_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(PIXELATE_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(EIGHTDIR_NODE_DISPLAY_NAME_MAPPINGS)
__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS']