Files
HuangYuChuh-ComfyUI-LLMs-To…/test_api.py
T
科林_Cyril Pilgrim 1a15c8d129 refactor(nodes): optimize OpenAI compatible adapter and translator
Motivation:
LLM API calls frequently failed with HTTP 429 and 50x errors, crashing the workflow. Code redundancy existed between different LLM nodes. Non-standard payload fields caused 400 errors with some providers.

Implementation:
1. Extracted api_client.py for centralized HTTP handling with smart retries (Retry-After, backoff, jitter) and structured error logging.
2. Implemented graceful degradation to return error text instead of raising exceptions.
3. Cleaned up non-standard OpenAI payload fields.
4. Added input validation to fail fast on empty prompts or API keys.
5. Refactored both openai_compatible.py and llm_translator.py to reuse LLMClient.
6. Handled dual import registration in __init__.py for robust dynamic loading.
2026-02-28 16:31:06 +08:00

102 lines
3.0 KiB
Python

import json
import urllib.request
import urllib.parse
import sys
import time
# 测试用的一个简单 ComfyUI 工作流,只包含我们修改的加载器和处理器
# 我们需要向本地模型发起请求(因为可能没有 API Key),由于没有Key,它可能会返回 Error,
# 但为了验证 UI 格式,只要看 error 结构或正常响应是否包含 `ui` 参数。
# 注意我们手动传入一些测试参数
workflow = {
"1": {
"inputs": {
"provider": "Custom/自定义",
"model": "foo",
"api_key": "YOUR_API_KEY", # 替换为您想要测试的真实 KEY 或者随便乱填以产生报错
"custom_base_url": "http://example.com"
},
"class_type": "LLM_Loader"
},
"2": {
"inputs": {
"system_prompt": "你是一个AI大模型",
"prompt": "你好",
"prep_img": "",
"temperature": 0.7,
"seed": 0,
"llm_config": [
"1",
0
]
},
"class_type": "OpenAICompatibleLoader"
},
"3": {
"inputs": {
"filename_prefix": "ComfyUI",
"images": [
"4",
0
]
},
"class_type": "SaveImage"
},
"4": {
"inputs": {
"image": "example.png"
},
"class_type": "LoadImage"
}
}
def queue_prompt(prompt_workflow):
p = {"prompt": prompt_workflow}
data = json.dumps(p).encode('utf-8')
req = urllib.request.Request("http://127.0.0.1:8188/prompt", data=data)
return json.loads(urllib.request.urlopen(req).read())
def get_history(prompt_id):
with urllib.request.urlopen("http://127.0.0.1:8188/history/{}".format(prompt_id)) as response:
return json.loads(response.read())
def test():
try:
print("Submitting workflow to ComfyUI...")
response = queue_prompt(workflow)
prompt_id = response['prompt_id']
print(f"Submitted! Prompt ID: {prompt_id}")
while True:
history = get_history(prompt_id)
if prompt_id in history:
print("\nExecution finished!")
result = history[prompt_id]
# Check for UI data in node '2'
outputs = result.get('outputs', {})
if '2' in outputs:
node_2_output = outputs['2']
if 'ui' in node_2_output:
print("✅ Success! 'ui' attribute found in response:")
print(json.dumps(node_2_output['ui'], indent=2, ensure_ascii=False))
else:
print("❌ Failed! No 'ui' attribute found in response:")
print(json.dumps(node_2_output, indent=2, ensure_ascii=False))
break
time.sleep(1)
except urllib.error.HTTPError as e:
error_body = e.read().decode('utf-8', errors='replace')
print(f"HTTP Error {e.code}:\n{error_body}")
except Exception as e:
print(f"Test failed (is ComfyUI running?): {e}")
if __name__ == "__main__":
test()