Files
ComfyAssets-ComfyUI-KikoTools/__init__.py
T
Vito Sansevero 037ff39a3b chore(release): 1.3.1 with a one-line startup banner
- Collapse the console banner to a single line with the version and the
  tool count instead of one `Loaded:` line per node, matching
  ComfyUI-PromptManager
- Keep the banner ASCII so a legacy Windows console cannot abort the load
- Update the console encoding test to assert the summary line
- Ship the Krea 2 resolution family already on main
- Bump pyproject.toml to 1.3.1 and date the changelog section
2026-10-31 21:12:54 -07:00

126 lines
4.4 KiB
Python

"""
ComfyUI-KikoTools: Modular collection of custom ComfyUI nodes
All nodes are grouped under the "ComfyAssets" category
"""
import re
from pathlib import Path
try:
from .kikotools import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
except ImportError:
# Fallback for testing environment
from kikotools import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
# Tell ComfyUI where to find our JavaScript extensions
import os
WEB_DIRECTORY = os.path.join(os.path.dirname(os.path.abspath(__file__)), "web")
# Import server components at module level to ensure they're available
try:
from aiohttp import web
from server import PromptServer
import folder_paths
print("[KikoTools] Server imports successful")
# Register autocomplete endpoints directly
@PromptServer.instance.routes.get("/kikotools/autocomplete/embeddings")
async def get_embeddings(request):
"""API endpoint for getting list of embeddings with full paths."""
print("[KikoTools] Embeddings endpoint called")
try:
embedding_files = folder_paths.get_filename_list("embeddings")
print(f"[KikoTools] Found {len(embedding_files)} embedding files")
# Return embeddings with their subdirectory paths, without extensions
embeddings = []
for f in embedding_files:
# Remove extension but keep subdirectory path
clean_path = os.path.splitext(f)[0]
embeddings.append(
{
"file_name": clean_path,
"model_name": clean_path,
"name": os.path.basename(clean_path),
"path": clean_path,
}
)
if len(embeddings) > 0:
print(f"[KikoTools] Sample embedding: {embeddings[0]}")
print(f"[KikoTools] Returning {len(embeddings)} embeddings with paths")
return web.json_response(embeddings)
except Exception as e:
print(f"[KikoTools] Error getting embeddings: {e}")
import traceback
traceback.print_exc()
return web.json_response([])
@PromptServer.instance.routes.get("/kikotools/autocomplete/loras")
async def get_loras(request):
"""API endpoint for getting list of LoRAs."""
print("[KikoTools] LoRA endpoint called")
try:
lora_files = folder_paths.get_filename_list("loras")
print(f"[KikoTools] Found {len(lora_files)} LoRA files")
# Return LoRAs with paths
loras = []
for f in lora_files:
clean_path = os.path.splitext(f)[0]
loras.append(
{
"name": os.path.basename(clean_path),
"path": clean_path,
"file": f,
}
)
print(f"[KikoTools] Returning {len(loras)} LoRAs")
return web.json_response(loras)
except Exception as e:
print(f"[KikoTools] Error getting LoRAs: {e}")
import traceback
traceback.print_exc()
return web.json_response([])
print("[KikoTools] Autocomplete API endpoints registered successfully")
print(
"[KikoTools] Routes available: /kikotools/autocomplete/embeddings and /kikotools/autocomplete/loras"
)
except ImportError as e:
print(f"[KikoTools] Could not import server components: {e}")
except Exception as e:
print(f"[KikoTools] Unexpected error setting up API: {e}")
import traceback
traceback.print_exc()
# API endpoints are registered above at module import time
def get_version():
"""Parse version from pyproject.toml"""
try:
pyproject_path = Path(__file__).parent / "pyproject.toml"
if pyproject_path.exists():
content = pyproject_path.read_text(encoding="utf-8")
match = re.search(r'version\s*=\s*["\']([^"\']+)["\']', content)
if match:
return match.group(1)
except Exception:
pass
return "unknown"
# One-line startup banner. Keep it ASCII: a Windows console using a legacy
# code page raises UnicodeEncodeError on emoji, which would abort loading the
# whole node pack.
print(
f"\033[94m[ComfyUI-KikoTools] Version:\033[0m {get_version()} "
f"- {len(NODE_CLASS_MAPPINGS)} tools loaded"
)
__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"]