Skip to content

⚡️ Speed up function apply_tweaks by 14% in PR #10880 (fix/image-upload-gemini-anthropic-chat-output)#10889

Closed
codeflash-ai[bot] wants to merge 74 commits into
release-1.7.0from
codeflash/optimize-pr10880-2025-12-04T19.03.38
Closed

⚡️ Speed up function apply_tweaks by 14% in PR #10880 (fix/image-upload-gemini-anthropic-chat-output)#10889
codeflash-ai[bot] wants to merge 74 commits into
release-1.7.0from
codeflash/optimize-pr10880-2025-12-04T19.03.38

Conversation

@codeflash-ai
Copy link
Copy Markdown
Contributor

@codeflash-ai codeflash-ai Bot commented Dec 4, 2025

⚡️ This pull request contains optimizations for PR #10880

If you approve this dependent PR, these changes will be merged into the original PR branch fix/image-upload-gemini-anthropic-chat-output.

This PR will be automatically closed if the original PR is merged.


📄 14% (0.14x) speedup for apply_tweaks in src/backend/base/langflow/processing/process.py

⏱️ Runtime : 2.22 milliseconds 1.96 milliseconds (best of 149 runs)

📝 Explanation and details

The optimized code achieves a 13% speedup through several targeted micro-optimizations that reduce Python method call overhead and dictionary lookup costs in the hot loop:

Key Performance Improvements:

  1. Early returns for missing data: The original code used chained .get() calls (node.get("data", {}).get("node", {}).get("template")) which creates temporary empty dictionaries. The optimized version splits this into separate checks with early returns, avoiding unnecessary object creation when data is missing.

  2. Cached method references: Pre-fetches template_data.get and entry.__setitem__ to avoid repeated attribute lookups in the tight loop. This is particularly beneficial since the loop processes 5,000+ iterations in the profiler data.

  3. String constant hoisting: Moves frequently-used string literals ("code", "NestedDict", "file_path", etc.) outside the loop to eliminate repeated string object creation and interning overhead.

  4. Reduced dictionary operations: Instead of checking tweak_name not in template_data followed by tweak_name in template_data, it directly calls template_data.get(tweak_name) and checks for None, eliminating one dictionary lookup per iteration.

  5. Optimized inner loops: For the isinstance(tweak_value, dict) branch, caches entry.__setitem__ to avoid repeated method lookups when updating multiple key-value pairs.

Impact on Performance:
The profiler shows the main bottlenecks are in the dictionary operations and the validate_and_repair_json call (which remains unchanged). The optimizations primarily target the ~70% of execution time spent on dictionary lookups and method calls, explaining the meaningful 13% improvement.

Test Case Analysis:
The optimizations are most effective for large-scale scenarios like test_large_scale_many_fields (1000 fields) and test_large_scale_partial_tweaks, where the reduced per-iteration overhead compounds significantly. Basic functionality remains identical across all test cases.

Correctness verification report:

Test Status
⚙️ Existing Unit Tests 11 Passed
🌀 Generated Regression Tests 36 Passed
⏪ Replay Tests 🔘 None Found
🔎 Concolic Coverage Tests 🔘 None Found
📊 Tests Coverage 100.0%
⚙️ Existing Unit Tests and Runtime
🌀 Generated Regression Tests and Runtime
from typing import Any

# imports
import pytest
from langflow.processing.process import apply_tweaks


# Dummy logger and validate_and_repair_json for testing (since we can't import real ones)
class DummyLogger:
    def __init__(self):
        self.warnings = []
    def warning(self, msg):
        self.warnings.append(msg)

test_logger = DummyLogger()

def validate_and_repair_json(value):
    # For testing, just return the value unchanged unless it's a string
    if isinstance(value, str):
        # Simulate "repair": try to parse as dict if possible
        import json
        try:
            return json.loads(value)
        except Exception:
            return value
    return value
from langflow.processing.process import apply_tweaks

# --- Unit tests ---

# ------------------- BASIC TEST CASES -------------------

def test_basic_value_override():
    # Test overriding a simple value field
    node = {
        "data": {
            "node": {
                "template": {
                    "param1": {"type": "str", "value": "old"}
                }
            }
        }
    }
    tweaks = {"param1": "new"}
    apply_tweaks(node, tweaks)

def test_basic_ignore_missing_tweak():
    # Tweak not present in template should be ignored
    node = {
        "data": {
            "node": {
                "template": {
                    "param1": {"type": "str", "value": "old"}
                }
            }
        }
    }
    tweaks = {"nonexistent": "value"}
    apply_tweaks(node, tweaks)

def test_basic_file_type_override():
    # For "file" type, should set "file_path" instead of "value"
    node = {
        "data": {
            "node": {
                "template": {
                    "upload": {"type": "file", "file_path": "old/path.txt"}
                }
            }
        }
    }
    tweaks = {"upload": "new/path.txt"}
    apply_tweaks(node, tweaks)

def test_basic_dict_tweak():
    # If tweak_value is a dict, should update keys in the field dict
    node = {
        "data": {
            "node": {
                "template": {
                    "settings": {"type": "dict", "value": {"a": 1}}
                }
            }
        }
    }
    tweaks = {"settings": {"a": 2, "b": 3}}
    apply_tweaks(node, tweaks)

def test_basic_mcp_type():
    # For mcp type, value should be set directly
    node = {
        "data": {
            "node": {
                "template": {
                    "mcp_field": {"type": "mcp", "value": {"x": 1}}
                }
            }
        }
    }
    tweaks = {"mcp_field": {"x": 2, "y": 3}}
    apply_tweaks(node, tweaks)

# ------------------- EDGE TEST CASES -------------------

def test_edge_template_data_not_dict():
    # Should warn and not fail if template is not a dict
    node = {
        "id": "test1",
        "data": {
            "node": {
                "template": None
            }
        }
    }
    tweaks = {"param": "value"}
    test_logger.warnings.clear()
    apply_tweaks(node, tweaks)

def test_edge_code_field_not_overridden():
    # Should warn and NOT override code fields
    node = {
        "data": {
            "node": {
                "template": {
                    "code": {"type": "str", "value": "safe"}
                }
            }
        }
    }
    tweaks = {"code": "malicious"}
    test_logger.warnings.clear()
    apply_tweaks(node, tweaks)

def test_edge_nested_dict_type():
    # For NestedDict, should use validate_and_repair_json
    node = {
        "data": {
            "node": {
                "template": {
                    "config": {"type": "NestedDict", "value": {"x": 1}}
                }
            }
        }
    }
    tweaks = {"config": '{"x":2,"y":3}'}
    apply_tweaks(node, tweaks)

def test_edge_file_type_with_dict():
    # For file type, if tweak_value is a dict, should set file_path for each key
    node = {
        "data": {
            "node": {
                "template": {
                    "upload": {"type": "file", "file_path": "old/path.txt"}
                }
            }
        }
    }
    tweaks = {"upload": {"main": "main.txt", "backup": "backup.txt"}}
    apply_tweaks(node, tweaks)
    # The dict keys are replaced by "file_path" for each, so only one key, overwritten

def test_edge_tweak_value_is_none():
    # If tweak value is None, should set field to None
    node = {
        "data": {
            "node": {
                "template": {
                    "param1": {"type": "str", "value": "old"}
                }
            }
        }
    }
    tweaks = {"param1": None}
    apply_tweaks(node, tweaks)

def test_edge_template_missing():
    # If template is missing, should not throw
    node = {
        "data": {
            "node": {
                # no template key
            }
        }
    }
    tweaks = {"param": "value"}
    test_logger.warnings.clear()
    apply_tweaks(node, tweaks)

def test_edge_empty_tweaks():
    # If tweaks is empty, nothing should change
    node = {
        "data": {
            "node": {
                "template": {
                    "param1": {"type": "str", "value": "old"}
                }
            }
        }
    }
    tweaks = {}
    apply_tweaks(node, tweaks)

# ------------------- LARGE SCALE TEST CASES -------------------

def test_large_scale_many_fields():
    # Test with a template with 1000 fields and 1000 tweaks
    N = 1000
    node = {
        "data": {
            "node": {
                "template": {f"field{i}": {"type": "str", "value": f"old{i}"} for i in range(N)}
            }
        }
    }
    tweaks = {f"field{i}": f"new{i}" for i in range(N)}
    apply_tweaks(node, tweaks)
    for i in range(N):
        pass

def test_large_scale_partial_tweaks():
    # Only half of the fields are tweaked
    N = 1000
    node = {
        "data": {
            "node": {
                "template": {f"field{i}": {"type": "str", "value": f"old{i}"} for i in range(N)}
            }
        }
    }
    tweaks = {f"field{i}": f"new{i}" for i in range(0, N, 2)}
    apply_tweaks(node, tweaks)
    for i in range(N):
        expected = f"new{i}" if i % 2 == 0 else f"old{i}"

def test_large_scale_nested_dict():
    # 100 NestedDict fields with JSON string tweaks
    N = 100
    node = {
        "data": {
            "node": {
                "template": {
                    f"nd{i}": {"type": "NestedDict", "value": {"x": i}} for i in range(N)
                }
            }
        }
    }
    tweaks = {f"nd{i}": f'{{"x":{i+1}}}' for i in range(N)}
    apply_tweaks(node, tweaks)
    for i in range(N):
        pass

def test_large_scale_mcp_fields():
    # 100 mcp fields, each with a dict
    N = 100
    node = {
        "data": {
            "node": {
                "template": {
                    f"mcp{i}": {"type": "mcp", "value": {"y": i}} for i in range(N)
                }
            }
        }
    }
    tweaks = {f"mcp{i}": {"y": i+1, "z": i+2} for i in range(N)}
    apply_tweaks(node, tweaks)
    for i in range(N):
        pass

def test_large_scale_file_type_dicts():
    # 100 file fields, each with a dict tweak
    N = 100
    node = {
        "data": {
            "node": {
                "template": {
                    f"file{i}": {"type": "file", "file_path": f"old{i}.txt"} for i in range(N)
                }
            }
        }
    }
    tweaks = {f"file{i}": {"main": f"main{i}.txt", "backup": f"backup{i}.txt"} for i in range(N)}
    apply_tweaks(node, tweaks)
    for i in range(N):
        pass
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.
#------------------------------------------------
from typing import Any

# imports
import pytest
from langflow.processing.process import apply_tweaks


# Dummy logger and validate_and_repair_json for test isolation
class DummyLogger:
    def __init__(self):
        self.warnings = []
    def warning(self, msg):
        self.warnings.append(msg)
logger = DummyLogger()

def validate_and_repair_json(value):
    # For testing: return value unchanged if dict, else raise error
    if isinstance(value, dict):
        return value
    raise ValueError("Invalid JSON")
from langflow.processing.process import apply_tweaks

# --- Unit tests ---

# ----------- BASIC TEST CASES -----------
def test_basic_value_update():
    # Test updating a simple value field
    node = {
        "data": {
            "node": {
                "template": {
                    "param": {"type": "str", "value": "old"}
                }
            }
        }
    }
    tweaks = {"param": "new"}
    apply_tweaks(node, tweaks)

def test_basic_file_type_update():
    # Test updating a file type field
    node = {
        "data": {
            "node": {
                "template": {
                    "file_param": {"type": "file", "file_path": "/old/path"}
                }
            }
        }
    }
    tweaks = {"file_param": "/new/path"}
    apply_tweaks(node, tweaks)

def test_basic_dict_update():
    # Test updating a dict field (not NestedDict)
    node = {
        "data": {
            "node": {
                "template": {
                    "dict_param": {"type": "dict", "value": {"a": 1}}
                }
            }
        }
    }
    tweaks = {"dict_param": {"b": 2}}
    apply_tweaks(node, tweaks)

def test_basic_mcp_update():
    # Test updating an mcp type field
    node = {
        "data": {
            "node": {
                "template": {
                    "mcp_param": {"type": "mcp", "value": {"x": 1}}
                }
            }
        }
    }
    tweaks = {"mcp_param": {"y": 2}}
    apply_tweaks(node, tweaks)

def test_basic_nested_dict_update():
    # Test updating a NestedDict type field
    node = {
        "data": {
            "node": {
                "template": {
                    "nested_param": {"type": "NestedDict", "value": {"foo": "bar"}}
                }
            }
        }
    }
    tweaks = {"nested_param": {"baz": "qux"}}
    apply_tweaks(node, tweaks)

# ----------- EDGE TEST CASES -----------
def test_template_data_not_dict():
    # If template_data is not a dict, should log warning and not change node
    node = {
        "id": "node1",
        "data": {
            "node": {
                "template": "not_a_dict"
            }
        }
    }
    tweaks = {"param": "new"}
    logger.warnings.clear()
    apply_tweaks(node, tweaks)

def test_tweak_name_not_in_template():
    # If tweak_name not in template, should skip
    node = {
        "data": {
            "node": {
                "template": {
                    "param": {"type": "str", "value": "old"}
                }
            }
        }
    }
    tweaks = {"not_in_template": "new"}
    apply_tweaks(node, tweaks)

def test_code_field_cannot_be_overridden():
    # If tweak_name is 'code', should log warning and skip
    node = {
        "data": {
            "node": {
                "template": {
                    "code": {"type": "str", "value": "print('hello')"}
                }
            }
        }
    }
    tweaks = {"code": "print('malicious code')"}
    logger.warnings.clear()
    apply_tweaks(node, tweaks)

def test_file_type_dict_update():
    # If tweak_value is dict and type is file, should update file_path
    node = {
        "data": {
            "node": {
                "template": {
                    "file_param": {"type": "file", "file_path": "/old/path"}
                }
            }
        }
    }
    tweaks = {"file_param": {"file_path": "/new/path", "other": "ignored"}}
    apply_tweaks(node, tweaks)


def test_empty_tweaks():
    # If tweaks is empty, nothing should change
    node = {
        "data": {
            "node": {
                "template": {
                    "param": {"type": "str", "value": "old"}
                }
            }
        }
    }
    tweaks = {}
    apply_tweaks(node, tweaks)

def test_missing_template_key():
    # If node['data']['node']['template'] is missing, should not fail
    node = {
        "data": {
            "node": {
                # No 'template' key
            }
        }
    }
    tweaks = {"param": "new"}
    apply_tweaks(node, tweaks)  # Should not raise

def test_missing_data_key():
    # If node['data'] is missing, should not fail
    node = {}
    tweaks = {"param": "new"}
    apply_tweaks(node, tweaks)  # Should not raise

def test_missing_node_key():
    # If node['data']['node'] is missing, should not fail
    node = {"data": {}}
    tweaks = {"param": "new"}
    apply_tweaks(node, tweaks)  # Should not raise

def test_tweak_value_dict_non_file_type():
    # If tweak_value is dict and type is not file, should update keys directly
    node = {
        "data": {
            "node": {
                "template": {
                    "dict_param": {"type": "dict", "value": {"a": 1}}
                }
            }
        }
    }
    tweaks = {"dict_param": {"b": 2, "c": 3}}
    apply_tweaks(node, tweaks)

# ----------- LARGE SCALE TEST CASES -----------
def test_large_number_of_tweaks():
    # Test with 1000 tweaks
    template = {f"param{i}": {"type": "str", "value": f"old{i}"} for i in range(1000)}
    node = {
        "data": {
            "node": {
                "template": template
            }
        }
    }
    tweaks = {f"param{i}": f"new{i}" for i in range(1000)}
    apply_tweaks(node, tweaks)
    for i in range(1000):
        pass

def test_large_nested_dicts():
    # Test with 500 NestedDict fields
    template = {f"nested{i}": {"type": "NestedDict", "value": {"old": i}} for i in range(500)}
    node = {
        "data": {
            "node": {
                "template": template
            }
        }
    }
    tweaks = {f"nested{i}": {"new": i} for i in range(500)}
    apply_tweaks(node, tweaks)
    for i in range(500):
        pass

def test_large_mcp_fields():
    # Test with 500 mcp fields
    template = {f"mcp{i}": {"type": "mcp", "value": {"old": i}} for i in range(500)}
    node = {
        "data": {
            "node": {
                "template": template
            }
        }
    }
    tweaks = {f"mcp{i}": {"new": i} for i in range(500)}
    apply_tweaks(node, tweaks)
    for i in range(500):
        pass

def test_large_file_fields():
    # Test with 500 file fields, updating file_path
    template = {f"file{i}": {"type": "file", "file_path": f"/old/{i}"} for i in range(500)}
    node = {
        "data": {
            "node": {
                "template": template
            }
        }
    }
    tweaks = {f"file{i}": f"/new/{i}" for i in range(500)}
    apply_tweaks(node, tweaks)
    for i in range(500):
        pass

def test_large_mixed_types():
    # Test with a mix of types and tweaks
    template = {
        f"param{i}": {"type": "str", "value": f"old{i}"} for i in range(250)
    }
    template.update({
        f"nested{i}": {"type": "NestedDict", "value": {"old": i}} for i in range(250)
    })
    template.update({
        f"file{i}": {"type": "file", "file_path": f"/old/{i}"} for i in range(250)
    })
    node = {
        "data": {
            "node": {
                "template": template
            }
        }
    }
    tweaks = {f"param{i}": f"new{i}" for i in range(250)}
    tweaks.update({f"nested{i}": {"new": i} for i in range(250)})
    tweaks.update({f"file{i}": f"/new/{i}" for i in range(250)})
    apply_tweaks(node, tweaks)
    for i in range(250):
        pass
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.

To edit these changes git checkout codeflash/optimize-pr10880-2025-12-04T19.03.38 and push.

Codeflash

mendonk and others added 30 commits November 25, 2025 14:53
* Revert "Revert "docs: update component documentation links to individual pages""

This reverts commit 0bc27d6.

* [autofix.ci] apply automated fixes

* llm-selector-renamed

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* Apply suggestions from code review

* [autofix.ci] apply automated fixes

* Apply suggestions from code review

* [autofix.ci] apply automated fixes

* rebuild-component-index

* update-component-index

* [autofix.ci] apply automated fixes

* build-index

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
…10586)

* fix: resolved merge conflict

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* fix: create a new message to avoid mutating shared instances

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* fix: resolved merge conflict

* [autofix.ci] apply automated fixes

* fix: resolved merge conflict

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* fix: added a check for using exisiting message object

* fix: remove unwanted import

* fix: resolve merge conflict

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* fix: add None checks to prevent errors

* fix: resolve merge conflict

* [autofix.ci] apply automated fixes

* fix: backend unit test

* fix: resolve merge conflict

* [autofix.ci] apply automated fixes

* fix: ruff styling errors

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* feat: optimize dropdown filtering and output resolution

misc: remove commented out code

feat: add refresh button and sort flows by updated_at date from most to least recent

ruff (flow.py imports)

improve fn contracts in runflow and improve flow id retrieval logic based on graph exec context

add dynamic outputs and optimize db lookups

add flow cache and db query for getting a single flow by id or name

cache run outputs and add refresh context to build config

misc

misc

use ids for flow retrieval

misc

fix missing flow_id bug

add unit and integration tests

add input field flag to persist hidden fields at runtime

move unit tests and change input and output display names

chore: update component index

fix: fix tool mode when flow has multiple inputs by dynamically creating resolvers

chore: update component index

ruff (run_flow and tests)

add resolvers to outputs map for non tool mode runtime

fix tests (current flow excluded in db fetch)

mypy (helpers/flow.py)

chore: update component index

remove unused code and clean up comments

fix: persist user messages in chat-based flows via session injection

chore: update component index

empty string fallback for sessionid in chat.py

chore: update component index

chore: update component index

cache invalidation with timestamps

misc

add cache invalidation

chore: update component index

chore: update comp idx

ruff (run_flow.py)

change session_id input type to MessageTextInput

chore: update component index

chore: update component index

chore: update component index

chore: update component index

sync starter projects with main

chore: update component index

chore: update component index

chore: update component index

remove dead code + impl coderabbit suggestions

chore: update component index

chore: update component index

clear options metadata before updating

chore: update component index

sync starter projects with main

sync starter projects with main

default param val (list flows)

* chore: update component index

* add integration tests

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

---------

Co-authored-by: Cristhian Zanforlin <criszl@192.168.15.88>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Add OpenSearch multimodal multi-embedding component

Introduces OpenSearchVectorStoreComponentMultimodalMultiEmbedding, supporting multi-model hybrid semantic and keyword search with dynamic vector fields, parallel embedding generation, advanced filtering, and flexible authentication. Enables ingestion and search across multiple embedding models in OpenSearch, with robust index management and UI configuration handling.

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes

* Add EmbeddingsWithModels and sync model fetching

Introduces EmbeddingsWithModels class for wrapping embeddings and available models. Updates EmbeddingModelComponent to provide available model lists for OpenAI, Ollama, and IBM watsonx.ai providers, including synchronous Ollama model fetching using httpx. Updates starter project and component index metadata to reflect new dependencies and code changes.

* Refactor embedding model component to use async Ollama model fetch

Updated the EmbeddingModelComponent to fetch Ollama models asynchronously using await get_ollama_models instead of a synchronous httpx call. Removed httpx from dependencies in Nvidia Remix starter project and updated related metadata. This change improves consistency and reliability when fetching available models for the Ollama provider.

* update to embeddings to support multiple models

* Add Notion integration components

Added several Notion-related components to the component index, including AddContentToPage, NotionDatabaseProperties, NotionListPages, NotionPageContent, NotionPageCreator, NotionPageUpdate, and NotionSearch. These components enable interaction with Notion databases and pages, such as querying, updating, creating, and retrieving content.

* Add tests for multi-model embeddings and OpenSearch

Added unit tests for EmbeddingsWithModels class and OpenSearchVectorStoreComponentMultimodalMultiEmbedding, including model normalization, authentication modes, and integration scenarios. Updated embedding model component tests to support async build_embeddings and verify multi-model support. Created necessary test package __init__.py files.

* Update component_index.json

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* Fix session_id handling in ChatInput and ChatOutput

Updated ChatInput and ChatOutput components in starter project JSONs to use the session_id from the graph if not provided, ensuring consistent session management. This change improves message storage and retrieval logic for chat flows.

* Update test_opensearch_multimodal.py

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* feat(storybook): add Storybook setup and Button component stories

- Add Storybook configuration files (.storybook/main.ts, preview.ts, css.d.ts)
- Add Button component stories with interaction testing
- Add Storybook dependencies and scripts to package.json
- Support dark mode in stories via decorator
- Include play functions for automated interaction testing

* ci(storybook): add GitHub Pages deployment workflow

- Add automated deployment workflow for Storybook
- Deploy on push to main when Storybook files change
- Support manual trigger via workflow_dispatch
- Use official GitHub Actions for Pages deployment

* fix(storybook): align Storybook versions and fix TypeScript issues

- Update all @storybook/* packages from ^8.4.7 to ^8.6.14 to match main storybook version
- Fix CSS type declarations in css.d.ts (Record<string, string> instead of Record<string, never>)
- Remove @ts-ignore comments from preview.ts (CSS imports now properly typed)
- Fix darkMode type issue in button.stories.tsx with proper ArgTypes type assertion

* feat(storybook): replace Button stories with Dropdown component stories

- Remove Button stories (shadcn already has documentation)
- Add comprehensive Dropdown component stories showcasing:
  - Default, with value, combobox mode
  - With metadata, disabled, loading states
  - Many options, searchable filtering
  - Dark mode support
- Add store initialization decorator for Storybook
- Include interaction testing with play functions

* feat(storybook): add SettingsPage stories and remove dropdown stories

- Remove dropdown component stories
- Add SettingsPage stories with router, store, and dark mode decorators
- Include variants: default, with general settings, and dark mode

* feat(storybook): fix SettingsPage stories to show full page and add play functions

- Fix router setup to properly render SettingsPage with nested routes
- Add Routes configuration for all settings sub-pages (General, MCP Servers, Global Variables, Shortcuts, Messages)
- Add play functions to test page visibility and navigation
- Add stories for different routes: Default, WithGeneralSettings, NavigateToShortcuts, NavigateToGlobalVariables, DarkMode

* revert(storybook): restore SettingsPage stories to original working version

- Revert to simpler router setup without Routes configuration
- Remove play functions and complex routing
- Restore original three stories: Default, WithGeneralSettings, DarkMode

* feat(storybook): add stories for ShortcutsPage and GlobalVariablesPage with tables

- Add ShortcutsPage stories showing the shortcuts table
- Add GlobalVariablesPage stories showing the global variables table
- Include store setup for shortcuts data
- Add play functions to verify table visibility
- Support dark mode for both pages

* fix(storybook): add QueryClientProvider to GlobalVariablesPage stories

- Add QueryClientProvider decorator to support React Query hooks
- Configure QueryClient with retry disabled for Storybook

* fix(storybook): remove WithGeneralSettings story to fix nested router error

- Remove WithGeneralSettings story that was causing nested Router error
- Keep Default and DarkMode stories only

* feat(storybook): enhance SettingsPage stories with multiple states and logic variations

- Add stories showcasing different store configurations (autoLogin, hasStore)
- Demonstrate conditional General settings visibility logic
- Add interactive sidebar navigation story
- Show full configuration with all features
- Include play functions to verify state-based behavior
- Showcase how page adapts to different user/auth states

* fix(storybook): initialize Zustand stores synchronously in SettingsPage stories

- Set store state before component render instead of in useEffect
- Ensures stores are accessible when SettingsPage component mounts
- Fixes state access errors in Storybook

* feat(storybook): add story to verify store state accessibility

- Add VerifyStoreState story that demonstrates accessing Zustand store state
- Verify store values match expected configuration
- Show that state is accessible from play functions

* fix(storybook): remove router from SettingsPage stories to fix errors

- Remove MemoryRouter decorator that was causing errors
- Keep store setup and dark mode decorators
- Stories now work without router dependency

* fix(storybook): add router back to SettingsPage stories for useNavigate support

- Add MemoryRouter back to support useCustomNavigate hook in PageLayout
- Router is needed for navigation hooks to work properly
- Keep router at decorator level to avoid nested router errors

* fix(storybook): fix router decorator order in SettingsPage stories

- Move router decorator to be outermost (last in array)
- Decorators run bottom-to-top, so router should wrap everything
- Ensures useNavigate context is available to all components

* feat(storybook): add PlaygroundPage story as example for complex page stories

- Add PlaygroundPage story demonstrating how to create stories for complex pages
- Include darkMode toggle control as example for interactive story controls
- Set up decorators for query client, router, and theme switching
- Hide publish elements (Theme buttons, Built with Langflow) in story view
- Center chat title header in story view
- Configure Storybook preview and CSS types

This story serves as a reference for creating stories for full page components
rather than simple UI components, which are already documented in shadcn docs.

* chore(storybook): remove SettingsPage stories

Keep only PlaygroundPage story as the example for complex page stories.

* chore: restore pyproject.toml to match main branch

* chore: restore pyproject.toml to match main branch

* Revert "chore: restore pyproject.toml to match main branch"

This reverts commit a2b75a4.

* chore: remove src/frontend/pyproject.toml as it doesn't exist in main

* fix gitignore and add make commands

* update package-json

* chore(storybook): migrate from v8.6.14 to v10.1.0

- Update all Storybook packages to v10.1.0
- Replace @storybook/addon-essentials with @storybook/addon-docs
- Remove @storybook/addon-interactions (moved to core)
- Remove @storybook/blocks and @storybook/test (consolidated)
- Fix import in PlaygroundPage.stories.tsx to use @storybook/react
- Update tsconfig.json moduleResolution to 'bundler' for better compatibility
- Add explicit types configuration for @storybook/react

* fix: update package-lock.json to sync with package.json

* fix: regenerate package-lock.json with all optional dependencies

---------

Co-authored-by: Olfa Maslah <olfamaslah@Olfas-MacBook-Pro.local>
Co-authored-by: Cristhian Zanforlin <criszl@MacBook-Pro-di-Cristhian.local>
Co-authored-by: Olfa Maslah <olfamaslah@macbookpro.war.can.ibm.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* fix file as tool when the prompt is generic

* [autofix.ci] apply automated fixes

* ruff fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* add validations to check if loop component is freezed to prevent flow loop

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* fix ruff style

* [autofix.ci] apply automated fixes

* adjust tests

* [autofix.ci] apply automated fixes

---------

Co-authored-by: Cristhian Zanforlin <criszl@MacBook-Pro-di-Cristhian.local>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Catching Anthropic and other exceptions.

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* add profile picture call on main routine

* add tests to profile pic

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* add validation to images read file compnent

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* ruff fixes

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* add timeout error

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* removed unnecessary buttons on the flows page

* added the asChild prop and hid button so they are not accessible by tabbing

* added tab index to ensure that buttons as not selectable using the tab

* made sure that accessibility is possible one bulk selection is enabled

* made sure that accessibility is possible one bulk selection is enabled

* Fix: added testcases and refactor

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* [autofix.ci] apply automated fixes

---------

Co-authored-by: Olayinka Adelakun <olayinkaadelakun@Olayinkas-MacBook-Pro.local>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* add profile picture nullable validation

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* add tests profile pic

* [autofix.ci] apply automated fixes

* ruff fixes

* add validation to images read file compnent

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* fix ruff

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* remove console warnings

* [autofix.ci] apply automated fixes

---------

Co-authored-by: Olayinka Adelakun <olayinkaadelakun@mac.war.can.ibm.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* fix: restore cuga version to correct one

* chore: update component index

---------

Co-authored-by: Jordan Frazier <jordan.frazier@datastax.com>
* fix: mask value to hide null field being returned

* [autofix.ci] apply automated fixes

* fix: added testcase and updated functionality

---------

Co-authored-by: Olayinka Adelakun <olayinkaadelakun@mac.war.can.ibm.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Carlos Coelho <80289056+carlosrcoelho@users.noreply.github.com>
Co-authored-by: Olayinka Adelakun <olayinkaadelakun@Olayinkas-MacBook-Pro.local>
…10777)

* remove sticky as it was causing the refresh list to float on safari

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes

---------

Co-authored-by: Olayinka Adelakun <olayinkaadelakun@mac.war.can.ibm.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* fix: made sure the tab is visible

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* Fix: added typing

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* fix: added testcases

* fix: added handleOnValue change function and created a helper file

---------

Co-authored-by: Olayinka Adelakun <olayinkaadelakun@mac.war.can.ibm.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Olayinka Adelakun <olayinkaadelakun@Olayinkas-MacBook-Pro.local>
Co-authored-by: Carlos Coelho <80289056+carlosrcoelho@users.noreply.github.com>
* fix: freeze-icon image

* [autofix.ci] apply automated fixes

* fix: update icon

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes

* fix: adjust height and width

* fix: adjust height and width

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* add validation to images read file compnent

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* add image mismatch type validation

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* ruff fixes

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* feat: Add support for vLLMs and custom URL support. (#10335)

* feat: add vLLM Embeddings

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
Co-authored-by: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
* Update embedding_model.py

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* Add fail-safe mode to EmbeddingModel component

Introduces a 'fail_safe_mode' option to the EmbeddingModel component, allowing errors to be logged and None returned instead of raising exceptions. Updates the build_embeddings and update_build_config logic to support this mode for OpenAI, Ollama, and IBM watsonx.ai providers.

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* ruff

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: phact <estevezsebastian@gmail.com>
* Allow REST tweaks to MCP server

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* Test update to mcp component for cache

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* Update priority unit tests

* Trigger build pipeline

* [autofix.ci] apply automated fixes

* feat: implement code review recommendations for MCP component tests

- Extract resolve_mcp_config pure function for better testability
- Add direct unit tests for config resolution logic
- Refactor existing tests to use fixtures instead of heavy mocking
- Add fixture-based integration test with real data structures
- Add parametrized test for field types in test_process.py
- Fix linting issues (unused variables, line length)

All tests passing (11 tests total)

* Update component_index.json

* [autofix.ci] apply automated fixes

* chore: trigger build

* Regenerate component_index.json to match main structure

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

---------

Co-authored-by: Steve Haertel <shaertel@ca.ibm.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Edwin Jose <edwin.jose@datastax.com>
…ls (#10807)

* fix mcp tool event loop usage

* [autofix.ci] apply automated fixes

* ruff

* [autofix.ci] apply automated fixes

* update corresponding test

* upgrade altk to 0.4.4

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
)

* Update embedding_model.py

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* Add fail-safe mode to EmbeddingModel component

Introduces a 'fail_safe_mode' option to the EmbeddingModel component, allowing errors to be logged and None returned instead of raising exceptions. Updates the build_embeddings and update_build_config logic to support this mode for OpenAI, Ollama, and IBM watsonx.ai providers.

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* ruff

* [autofix.ci] apply automated fixes

* Update opensearch_multimodal.py

* Update component_index.json

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* Refactor available_models variable usage

Renamed the local variable 'available_models' to 'available_models_attr' for clarity and consistency. Updated all references to use the new variable name within logging and conditional checks.

* Update component_index.json

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: phact <estevezsebastian@gmail.com>
When documenting larger flows with sticky notes and grouping larger
sections of the flow, the size constraints are very limiting. No more
than three elements can effectively fit on a sticky note.

By removing the size constraint, we enable users to more effectively
create visual groups in a flow.

Co-authored-by: Deon Sanchez <69873175+deon-sanchez@users.noreply.github.com>
erichare and others added 18 commits December 3, 2025 23:54
* fix: Support Batch Run with watsonX

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* Update batch_run.py

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Fix image upload for Gemini/Anthropic and ChatOutput session_id preservation

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* fix ruff erros

* [autofix.ci] apply automated fixes

* resolve conflicts

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* [autofix.ci] apply automated fixes

* build component index

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* Fix image upload for Gemini/Anthropic and ChatOutput session_id preservation

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* fix ruff erros

* [autofix.ci] apply automated fixes

* resolve conflicts

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* [autofix.ci] apply automated fixes

* build component index

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

---------

Co-Authored-By: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* fixed counts

* use customization to get api base urls

---------

Co-authored-by: Deon Sanchez <69873175+deon-sanchez@users.noreply.github.com>
The optimized code achieves a **13% speedup** through several targeted micro-optimizations that reduce Python method call overhead and dictionary lookup costs in the hot loop:

**Key Performance Improvements:**

1. **Early returns for missing data**: The original code used chained `.get()` calls (`node.get("data", {}).get("node", {}).get("template")`) which creates temporary empty dictionaries. The optimized version splits this into separate checks with early returns, avoiding unnecessary object creation when data is missing.

2. **Cached method references**: Pre-fetches `template_data.get` and `entry.__setitem__` to avoid repeated attribute lookups in the tight loop. This is particularly beneficial since the loop processes 5,000+ iterations in the profiler data.

3. **String constant hoisting**: Moves frequently-used string literals ("code", "NestedDict", "file_path", etc.) outside the loop to eliminate repeated string object creation and interning overhead.

4. **Reduced dictionary operations**: Instead of checking `tweak_name not in template_data` followed by `tweak_name in template_data`, it directly calls `template_data.get(tweak_name)` and checks for `None`, eliminating one dictionary lookup per iteration.

5. **Optimized inner loops**: For the `isinstance(tweak_value, dict)` branch, caches `entry.__setitem__` to avoid repeated method lookups when updating multiple key-value pairs.

**Impact on Performance:**
The profiler shows the main bottlenecks are in the dictionary operations and the `validate_and_repair_json` call (which remains unchanged). The optimizations primarily target the ~70% of execution time spent on dictionary lookups and method calls, explaining the meaningful 13% improvement.

**Test Case Analysis:**
The optimizations are most effective for large-scale scenarios like `test_large_scale_many_fields` (1000 fields) and `test_large_scale_partial_tweaks`, where the reduced per-iteration overhead compounds significantly. Basic functionality remains identical across all test cases.
@codeflash-ai codeflash-ai Bot added the ⚡️ codeflash Optimization PR opened by Codeflash AI label Dec 4, 2025
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Dec 4, 2025

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions Bot added the community Pull Request from an external contributor label Dec 4, 2025
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Dec 4, 2025

Frontend Unit Test Coverage Report

Coverage Summary

Lines Statements Branches Functions
Coverage: 15%
15.45% (4251/27504) 8.62% (1812/21011) 9.7% (588/6059)

Unit Test Results

Tests Skipped Failures Errors Time
1671 0 💤 0 ❌ 0 🔥 21.986s ⏱️

@codecov
Copy link
Copy Markdown

codecov Bot commented Dec 4, 2025

Codecov Report

❌ Patch coverage is 19.44444% with 174 lines in your changes missing coverage. Please review.
✅ Project coverage is 32.54%. Comparing base (a1ce944) to head (2c10967).
⚠️ Report is 57 commits behind head on release-1.7.0.

Files with missing lines Patch % Lines
...nd/src/pages/Playground/PlaygroundPage.stories.tsx 0.00% 97 Missing ⚠️
...rc/lfx/src/lfx/base/embeddings/embeddings_class.py 0.00% 21 Missing ⚠️
src/backend/base/langflow/processing/process.py 70.27% 11 Missing ⚠️
src/backend/base/langflow/api/v1/files.py 41.66% 7 Missing ⚠️
src/frontend/src/controllers/API/index.ts 14.28% 6 Missing ⚠️
src/lfx/src/lfx/base/agents/agent.py 0.00% 5 Missing ⚠️
src/frontend/src/icons/vLLM/index.tsx 0.00% 4 Missing ⚠️
...ntend/src/customization/utils/custom-buildUtils.ts 25.00% 3 Missing ⚠️
...l/components/IOFieldView/components/file-input.tsx 0.00% 3 Missing ⚠️
...c/controllers/API/queries/health/use-get-health.ts 0.00% 2 Missing ⚠️
... and 11 more

❌ Your patch status has failed because the patch coverage (19.44%) is below the target coverage (40.00%). You can increase the patch coverage or adjust the target coverage.
❌ Your project status has failed because the head coverage (39.95%) is below the target coverage (60.00%). You can increase the head coverage or adjust the target coverage.

Additional details and impacted files

Impacted file tree graph

@@                Coverage Diff                @@
##           release-1.7.0   #10889      +/-   ##
=================================================
+ Coverage          32.45%   32.54%   +0.09%     
=================================================
  Files               1367     1370       +3     
  Lines              63315    63565     +250     
  Branches            9357     9393      +36     
=================================================
+ Hits               20547    20690     +143     
- Misses             41736    41835      +99     
- Partials            1032     1040       +8     
Flag Coverage Δ
backend 51.53% <63.26%> (+0.24%) ⬆️
frontend 14.30% <5.30%> (+0.17%) ⬆️
lfx 39.95% <11.42%> (-0.09%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/frontend/src/CustomNodes/NoteNode/index.tsx 0.00% <ø> (ø)
...d/src/components/core/appHeaderComponent/index.tsx 0.00% <ø> (ø)
src/frontend/src/constants/constants.ts 95.26% <ø> (-0.05%) ⬇️
src/frontend/src/utils/styleUtils.ts 49.12% <ø> (ø)
src/lfx/src/lfx/base/tools/component_tool.py 40.62% <100.00%> (ø)
src/lfx/src/lfx/utils/image.py 84.00% <100.00%> (+6.22%) ⬆️
.../appHeaderComponent/components/langflow-counts.tsx 0.00% <0.00%> (ø)
.../frontend/src/controllers/API/helpers/constants.ts 60.00% <66.66%> (+4.44%) ⬆️
src/frontend/src/icons/eagerIconImports.ts 0.00% <0.00%> (ø)
src/frontend/src/icons/lazyIconImports.ts 0.52% <0.00%> (-0.01%) ⬇️
... and 17 more

... and 27 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@HimavarshaVS HimavarshaVS force-pushed the fix/image-upload-gemini-anthropic-chat-output branch from 1337430 to 3e4faae Compare December 4, 2025 19:16
Base automatically changed from fix/image-upload-gemini-anthropic-chat-output to release-1.7.0 December 4, 2025 20:29
@ogabrielluiz
Copy link
Copy Markdown
Contributor

Closing automated codeflash PR.

@codeflash-ai codeflash-ai Bot deleted the codeflash/optimize-pr10880-2025-12-04T19.03.38 branch March 3, 2026 18:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

⚡️ codeflash Optimization PR opened by Codeflash AI community Pull Request from an external contributor

Projects

None yet

Development

Successfully merging this pull request may close these issues.