Motivation:
Users found it cumbersome to delete and re-type a model name if they made a typo.
Implementation:
Added ondblclick listener and pointer cursor to model tags. Reuses the new custom showPrompt dialog for editing.
Motivation:
Users clicking 'Check API' were being charged for a minimal chat completion request, which feels punitive for just verifying connection status.
Implementation:
1. Added list_models() method to LLMClient that hits the standard /models endpoint.
2. Updated check_provider route to attempt /models first.
3. Fallbacks to /chat/completions with max_tokens=1 if /models is unsupported by the provider.
Motivation:
With 12 system providers, the provider dropdown menu in ComfyUI was too cluttered. Users only configure 1-2 providers on average.
Implementation:
1. Updated default_providers.json to disable most system providers out of the box (except Qwen and DeepSeek).
2. Filtered out disabled providers from INPUT_TYPES in openai_compatible.py.
3. Added equivalent filter to dynamic model dropdown logic in provider_manager.js.
Motivation:
1. Native browser alerts/confirms block the main thread and break aesthetic immersion.
2. The UI had mixed Chinese and English text, confusing international users.
Implementation:
1. Created unified showDialog, showPrompt, showAlert, and showConfirm components.
2. Migrated delete confirmation and connection checks to the new asynchronous UI dialogs.
3. Updated 'providers.json' templates to use purely English names for consistency.
Motivation:
Users faced data loss when navigating without saving, lacked visual feedback after saving, and the model dropdown logic was broken for the new LLM_CONFIG mode.
Implementation:
1. Replaced 'Custom/手动输入' with 'LLM_CONFIG (from input)' in nodeCreated event.
2. Added visual toast and temporary color change to 'Save' button.
3. Implemented hasUnsavedChanges() and canNavigateAway() pattern to warn users before discarding modified provider data.
Motivation:
Users need a way to verify they have entered their API keys correctly without the keys being permanently visible.
Implementation:
Added a toggle button with an eye icon next to the API key input in the Provider Manager UI. It switches the input type between 'password' and 'text'.
Motivation:
The .github directory was accidentally committed and should not be tracked.
Implementation:
1. Added .github/ to .gitignore.
2. Removed .github/ from git cache using 'git rm -r --cached'.
Motivation:
Users were confused by implicit configuration fallback and inconsistent category naming. The adapter also had a bug where unparsed dropdown values were sent to the API.
Implementation:
1. Re-categorized node under 'LLM'.
2. Added 'LLM_CONFIG (from input)' to provider/model dropdowns for explicit passthrough.
3. Updated default prompts to English/hello.
4. Ensured all API requests use resolved 'actual_model' instead of raw dropdown values.
Motivation:
1. Clarify node classification by moving from 'OpenAI' to 'LLM' category.
2. Improve default prompt/system_prompt for better UX.
3. Resolve ambiguity in configuration passthrough from LLMs Loader node.
Implementation:
1. Updated CATEGORY to 🚦ComfyUI_LLMs_Toolkit/LLM.
2. Changed default system_prompt to English and set default prompt to 'hello'.
3. Added 'LLM_CONFIG (from input)' option to provider and model dropdowns to explicitly handle external configuration.
4. Fixed a bug where unresolved 'model' parameter was sent to the API instead of 'actual_model'.
Motivation:
The button text 'Save Provider' was slightly too long and generic 'Save' is cleaner and more professional for the UI.
Implementation:
1. Updated the button innerHTML in provider_manager.js from 'Save Provider' to 'Save'.
2. Updated the corresponding references in both README.md and README_CN.md.
Motivation:
Labels in the provider dropdown were showing redundant internal IDs like '(iflow)', which looked cluttered and unprofessional to end users.
Implementation:
1. Modified openai_compatible.py to generate clean name-only labels.
2. Updated both backend lookup logic and frontend nodeCreated hook in provider_manager.js to align with the name-only matching scheme.
Added image_2, image_3, image_4 pins to ImagePreprocessor to allow multiple parallel connections without needing a batch node. Also removed the vision feature update from the changelog per user request, as it is considered a minor utility addition.
Kept the user-preferred ImagePreprocessor naming convention while adding logic to safely ignore quality parameters on incompatible image formats (like PNG). Ensured JSON arrays outputted by the node map flawlessly into the shared LLM client payload.
Motivation: Input/output token metrics are now dynamically rendered over the node canvas via JS. The raw integer pins are redundant and eat up valuable canvas space.
Implementation: Removed input_tokens and output_tokens from RETURN_TYPES. Updated _success and _error_result tuple lengths to 2.
Moved the version history to the main README to centralize documentation. Created an AI_CHANGELOG_GUIDELINES.md (ignored in .gitignore) as a prompt instruction for future AI agents to maintain the changelog uniformly.
Motivation: Expose the parsed reasoning_content to downstream ComfyUI nodes so users can route or display the internal thoughts of models like DeepSeek.
Implementation: Appended 'reasoning' to RETURN_TYPES and RETURN_NAMES in openai_compatible.py. Updated _success and _error_result standard return tuple length from 3 to 4.
Motivation: Absorbing robust API handling strategies from comfyui_LLM_party to enhance compatibility with newer models (o1/o3) and models that return internal thought processes (DeepSeek/R1).
Implementation: 1. o1/o3 Compatibility: Intercept payload building to convert unsupported 'system' roles to 'user' roles and spoof an 'assistant' acknowledgment. 2. DeepSeek Readiness: Parse official 'reasoning_content' or fallback to regex extraction of 'think' blocks, stripping them from the main ComfyUI text output to keep prompts clean.
Motivation:
The enable_memory feature was incomplete because it only stored the user's prompts in the history array without appending the assistant's previous replies. This resulted in context-blind multi-turn interactions.
Implementation:
Added logic to append the assistant's response to self._conversation_history right before returning the success result, completing the conversational loop.
Motivation:
Internal planning files and temporary test scripts should not be part of the public repository.
Implementation:
1. Deleted task_plan.md and removed from git tracking.
2. Untracked test_api.py (keeping local copy) and added both to .gitignore.
Motivation:
JSONCombine was failing with 'dict' has no attribute 'strip' when receiving dictionary inputs, and strict APIs (like Qwen) returned 400 Errors when receiving the non-standard 'seed' field in the payload.
Implementation:
Updated JSONCombine in json_builder.py to handle both string and dict types safely. Removed the seed field from the API payload in openai_compatible.py to strictly follow CONTRIBUTING.md Rule 3.1 and ensure standard OpenAI compatibility.
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.