From 830e829108b95878d06fb4bb033d57ae7ae36cf9 Mon Sep 17 00:00:00 2001 From: rui40000 Date: Wed, 1 Apr 2026 14:06:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=BD=BB=E5=BA=95=E8=A7=A3=E5=86=B3Open?= =?UTF-8?q?AI=E8=8A=82=E7=82=B9URL=E8=A2=ABComfyUI=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E5=90=9E=E6=8E=89=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:ComfyUI的动态提示系统或第三方扩展(如cg-use-everywhere) 会将STRING控件中的'//'视为注释语法,导致'://'及其后的 主机名+路径被彻底丢弃,仅靠补回'//'无法恢复已丢失的内容。 解决方案: - 将原来的单个api_url输入拆分为protocol下拉框 + 地址字符串 - protocol下拉框提供 https:// 和 http:// 选项(下拉框不受文本处理影响) - api_url默认值不再包含'://',从根源避免被吞 - 新增_build_url()函数智能拼接URL,兼容多种用户输入格式 - 即使地址被完全清空也会回退到OpenAI默认地址 - 添加控制台日志输出实际请求地址,便于调试 Co-Authored-By: Claude Opus 4.6 --- openai_node.py | 53 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/openai_node.py b/openai_node.py index a4d03d3..89b1387 100644 --- a/openai_node.py +++ b/openai_node.py @@ -19,18 +19,33 @@ os.environ['http_proxy'] = '' os.environ['https_proxy'] = '' -def _fix_url(url: str) -> str: +def _build_url(protocol: str, api_url: str) -> str: """ - 修复 ComfyUI 前端吞掉 URL 中 '//' 的问题。 - 例如: - 'https:api.openai.com/v1/...' -> 'https://api.openai.com/v1/...' - 'https:' -> 原样返回(后续会报更清晰的错误) - 'https://api.openai.com/v1/...' -> 不变 + 将协议和地址拼接为完整 URL。 + 兼容多种用户输入格式: + - 'api.openai.com/v1/chat/completions' (标准,无协议前缀) + - 'https://api.openai.com/v1/chat/completions' (用户手动写了完整 URL) + - 'https:api.openai.com/...' (被 ComfyUI 吞掉了 //) + - 'http://127.0.0.1:5000/v1/chat/completions' (本地服务) """ - url = url.strip() - # 匹配 http: 或 https: 后面紧跟的不是 // 的情况 - fixed = re.sub(r'^(https?:)(?!//)', r'\1//', url) - return fixed + url = api_url.strip() + + # 如果用户手动输入了完整 URL(含协议),直接修复并使用 + if re.match(r'^https?://.+', url): + return url + + # 去掉可能残留的被截断的协议前缀,如 "https:" "http:" "https://" "http://" + url = re.sub(r'^https?:/*', '', url) + + # 去掉首尾多余的斜杠 + url = url.strip('/') + + if not url: + # 全部被吞了,回退到 OpenAI 默认地址 + url = 'api.openai.com/v1/chat/completions' + + return f"{protocol}{url}" + class OpenAINode: """ @@ -38,14 +53,18 @@ class OpenAINode: 支持连接 OpenAI 及其兼容 API(如 DeepSeek, Moonshot 等), 支持文本生成和多模态图像理解。 """ - + @classmethod def INPUT_TYPES(cls): return { "required": { + "protocol": (["https://", "http://"], { + "default": "https://" + }), "api_url": ("STRING", { - "default": "https://api.openai.com/v1/chat/completions", - "multiline": False + "default": "api.openai.com/v1/chat/completions", + "multiline": False, + "placeholder": "api.openai.com/v1/chat/completions" }), "api_key": ("STRING", { "default": "", @@ -126,6 +145,7 @@ class OpenAINode: def generate_content( self, + protocol, api_url, api_key, model, @@ -150,8 +170,9 @@ class OpenAINode: - 无图像时:使用纯文本格式发送请求,实现普通对话 """ - # ---- 修复 URL:ComfyUI 前端可能吞掉 '//' ---- - api_url = _fix_url(api_url) + # ---- 拼接完整 URL ---- + full_url = _build_url(protocol, api_url) + print(f"[Rui-Node🐶 OpenAI] 请求地址: {full_url}") all_images = [ img for img in [ @@ -232,7 +253,7 @@ class OpenAINode: } try: - response = requests.post(api_url, headers=headers, json=payload, proxies=proxies, timeout=60) + response = requests.post(full_url, headers=headers, json=payload, proxies=proxies, timeout=60) response.raise_for_status() result = response.json()