Skip to content

feat: add var to block custom component execution#11893

Merged
jordanrfrazier merged 85 commits into
release-1.9.0from
flow-json-edited-flag
Apr 5, 2026
Merged

feat: add var to block custom component execution#11893
jordanrfrazier merged 85 commits into
release-1.9.0from
flow-json-edited-flag

Conversation

@jordanrfrazier
Copy link
Copy Markdown
Collaborator

@jordanrfrazier jordanrfrazier commented Feb 25, 2026

Add an environment variable (LANGFLOW_ALLOW_CUSTOM_COMPONENTS) that allows users to run Langflow without allowing execution of custom code.

Blocks all FE-related custom component creation and editing of components.

Will still allow you to upload flows with custom components, but will either prompt users with a notification to update, or a notification that it cannot run.

LANGFLOW_ALLOW_CUSTOM_COMPONENTS

    """If set to False, blocks execution of components whose code does not match a known
    server template. The server validates node code against its component template cache;
    when the cache is not yet loaded (e.g., during startup), all flow execution is blocked
    as a safety measure. Set via LANGFLOW_ALLOW_CUSTOM_COMPONENTS environment variable."""

Allows users to specify a list of allowed components via the existing LANGFLOW_COMPONENTS_PATH.

Summary by CodeRabbit

  • New Features

    • Added admin-configurable setting to enable or disable custom component execution in flows.
    • Enhanced component update interface with improved messaging and conditional controls based on custom component permissions.
  • Bug Fixes

    • Improved error messages with detailed error information extraction across flow endpoints.
  • Chores

    • Enhanced logging for template validation and component processing debugging.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 25, 2026

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a3b04710-8406-48e6-88ed-47142919f940

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Walkthrough

Introduces a system-wide feature flag allow_custom_components that gates execution of custom (user-edited) components. Runtime validation is added at multiple flow execution endpoints, checking component flows against a cache when the flag is disabled. Configuration is wired through settings, frontend stores, and UI components with appropriate error handling.

Changes

Cohort / File(s) Summary
Backend API Validation
src/backend/base/langflow/api/v1/chat.py, src/backend/base/langflow/api/v1/endpoints.py
Added check_flow_and_raise validation checks and settings-based allow_custom_components flag gating across multiple execution paths (order retrieval, flow build, public flow build, run endpoints). Validation failures converted to HTTP 400 responses.
Backend Configuration & Settings
src/backend/base/langflow/api/v1/schemas.py, src/lfx/src/lfx/services/settings/base.py
Added allow_custom_components: bool field to PublicConfigResponse and ConfigResponse schemas, wired through from settings. New allow_custom_components: bool = True setting added to Settings class with environment variable support.
Backend Component Indexing
src/backend/base/langflow/api/v1/projects.py, src/backend/base/langflow/initial_setup/setup.py
Minor formatting adjustment in projects.py. Added secondary indexing in setup.py to create component aliases derived from metadata.module class names for renamed component resolution.
Starter Project Prompt Components
src/backend/base/langflow/initial_setup/starter_projects/Basic*.json, src/backend/base/langflow/initial_setup/starter_projects/Document*.json, src/backend/base/langflow/initial_setup/starter_projects/Image*.json, src/backend/base/langflow/initial_setup/starter_projects/*Copywriter.json, src/backend/base/langflow/initial_setup/starter_projects/Invoice*.json, src/backend/base/langflow/initial_setup/starter_projects/Meeting*.json, src/backend/base/langflow/initial_setup/starter_projects/Memory*.json, src/backend/base/langflow/initial_setup/starter_projects/Research*.json, src/backend/base/langflow/initial_setup/starter_projects/SEO*.json, src/backend/base/langflow/initial_setup/starter_projects/SaaS*.json, src/backend/base/langflow/initial_setup/starter_projects/Text*.json, src/backend/base/langflow/initial_setup/starter_projects/Twitter*.json, src/backend/base/langflow/initial_setup/starter_projects/Youtube*.json
Removed priority attribute from PromptComponent class definitions. Added logger imports and debug logging in exception paths for template validation failures. Reordered or relocated use_double_brackets input fields in component schemas.
Starter Project Advanced Components
src/backend/base/langflow/initial_setup/starter_projects/Custom Component Generator.json, src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents.json, src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json, src/backend/base/langflow/initial_setup/starter_projects/Nvidia Remix.json, src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json
Replaced or enhanced URLComponent and related implementations with new public methods (fetch_content_as_message), updated output naming and wiring. Enhanced error handling and logging throughout. Updated method signatures and component metadata.
Frontend Store & Type Definitions
src/frontend/src/stores/utilityStore.ts, src/frontend/src/types/zustand/utility/index.ts
Added new store fields allowCustomComponents: boolean (default true) and setter setAllowCustomComponents() to enable state management of the feature flag across the application.
Frontend Config Integration
src/frontend/src/controllers/API/queries/config/use-get-config.ts
Added allow_custom_components: boolean field to BaseConfig interface and wired it to populate from API responses and update utility store.
Frontend UI Gating
src/frontend/src/components/core/flowToolbarComponent/components/deploy-dropdown.tsx, src/frontend/src/components/core/parameterRenderComponent/components/codeAreaComponent/index.tsx, src/frontend/src/CustomNodes/GenericNode/components/NodeUpdateComponent/index.tsx, src/frontend/src/CustomNodes/GenericNode/index.tsx, src/frontend/src/modals/codeAreaModal/index.tsx, src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx, src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarFooterButtons.tsx, src/frontend/src/pages/FlowPage/components/UpdateAllComponents/index.tsx
Integrated allowCustomComponents flag to conditionally gate code editing, component updates, and sidebar buttons. When disabled, blocks interactive code areas, hides dismiss buttons, and requires component updates before execution. Enhanced error message extraction in multiple locations.
Frontend Build & Utilities
src/frontend/src/stores/flowStore.ts, src/frontend/src/utils/buildUtils.ts, src/frontend/src/utils/reactflowUtils.ts, src/frontend/src/hooks/flows/use-save-flow.ts
Added pre-build validation gate that blocks builds when custom components are not allowed and outdated components exist. Enhanced error handling to extract detailed error messages from API responses. Added component template aliasing based on module metadata.

Sequence Diagram

sequenceDiagram
    participant Client as Client/UI
    participant API as Backend API
    participant Settings as Settings Service
    participant Cache as Component Cache
    participant Build as Build Engine
    
    Client->>API: Request to execute flow
    API->>Settings: get_settings_service()
    Settings-->>API: allow_custom_components flag
    
    alt allow_custom_components == false
        API->>Cache: get all_types_dict
        Cache-->>API: component registry
        API->>API: check_flow_and_raise(flow, cache)
        
        alt Custom components detected
            API-->>Client: HTTP 400 (Validation Error)
        else Valid components only
            API->>Build: proceed with build
        end
    else allow_custom_components == true
        API->>Build: skip validation, proceed
    end
    
    Build-->>API: build result
    API-->>Client: response
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Suggested labels

enhancement

Suggested reviewers

  • Adam-Aghili

Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 2 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Test Coverage For New Implementations ❌ Error PR introduces new allow_custom_components setting and validation logic but no test files were added to verify the functionality. Add unit tests for the new setting, integration tests for validation endpoints, and tests for frontend feature flagging logic.
Docstring Coverage ⚠️ Warning Docstring coverage is 36.84% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Test File Naming And Structure ⚠️ Warning PR adds significant functionality for blocking custom component execution across multiple APIs without any test file coverage. Create comprehensive tests: extend test_endpoints.py and test_chat.py for validation logic, add test_schemas.py for new fields, create frontend tests for store and hooks.
Test Quality And Coverage ❓ Inconclusive No test files found in repository for new allow_custom_components feature, check_flow_and_raise validation, or modified API endpoints. Verify test files exist in tests/ directories; run test suite to confirm validation logic coverage across all three modified endpoints and frontend components.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title accurately describes the main change: adding a variable/feature flag to control custom component execution.
Excessive Mock Usage Warning ✅ Passed No test files present in diff; mock usage check not applicable.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch flow-json-edited-flag

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions github-actions Bot added the enhancement New feature or request label Feb 25, 2026
@codecov
Copy link
Copy Markdown

codecov Bot commented Feb 25, 2026

Codecov Report

❌ Patch coverage is 72.51984% with 277 lines in your changes missing coverage. Please review.
✅ Project coverage is 50.00%. Comparing base (7e74d33) to head (3dcb0e9).
⚠️ Report is 2 commits behind head on release-1.9.0.

Files with missing lines Patch % Lines
...nericNode/components/NodeUpdateComponent/index.tsx 23.94% 54 Missing ⚠️
src/lfx/src/lfx/utils/flow_validation.py 70.45% 24 Missing and 15 partials ⚠️
...llers/API/queries/nodes/use-post-template-value.ts 39.53% 26 Missing ⚠️
src/frontend/src/stores/flowStore.ts 79.67% 25 Missing ⚠️
...erComponent/components/codeAreaComponent/index.tsx 0.00% 19 Missing ⚠️
src/lfx/src/lfx/utils/component_aliases.py 45.45% 14 Missing and 4 partials ⚠️
src/backend/base/langflow/api/v1/endpoints.py 27.27% 16 Missing ⚠️
src/backend/base/langflow/api/v1/chat.py 47.82% 12 Missing ⚠️
src/frontend/src/CustomNodes/GenericNode/index.tsx 78.37% 8 Missing ⚠️
src/lfx/src/lfx/interface/components.py 36.36% 7 Missing ⚠️
... and 17 more

❌ Your project status has failed because the head coverage (49.06%) 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.9.0   #11893      +/-   ##
=================================================
+ Coverage          49.14%   50.00%   +0.85%     
=================================================
  Files               1928     1930       +2     
  Lines             171157   171890     +733     
  Branches           23730    24062     +332     
=================================================
+ Hits               84123    85948    +1825     
+ Misses             86007    84896    -1111     
- Partials            1027     1046      +19     
Flag Coverage Δ
backend 55.88% <50.00%> (+0.15%) ⬆️
frontend 48.85% <76.75%> (+1.16%) ⬆️
lfx 49.06% <66.66%> (+0.26%) ⬆️

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

Files with missing lines Coverage Δ
...e/langflow/agentic/services/helpers/flow_loader.py 93.51% <100.00%> (+0.18%) ⬆️
src/backend/base/langflow/initial_setup/setup.py 54.05% <100.00%> (+1.21%) ⬆️
...end/src/CustomNodes/helpers/check-code-validity.ts 66.49% <100.00%> (+9.09%) ⬆️
...src/controllers/API/queries/flows/use-get-types.ts 93.33% <100.00%> (+29.54%) ⬆️
src/frontend/src/hooks/use-refresh-model-inputs.ts 99.68% <100.00%> (+0.38%) ⬆️
...debarComponent/components/sidebarFooterButtons.tsx 96.63% <100.00%> (+0.37%) ⬆️
...rontend/src/shared/hooks/use-change-on-unfocus.tsx 40.81% <100.00%> (ø)
src/frontend/src/stores/utilityStore.ts 100.00% <100.00%> (ø)
src/frontend/src/utils/reactflowUtils.ts 49.86% <100.00%> (+1.86%) ⬆️
src/lfx/src/lfx/cli/script_loader.py 84.78% <100.00%> (+0.22%) ⬆️
... and 31 more

... and 48 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.

@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Feb 25, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
src/backend/base/langflow/initial_setup/starter_projects/Research Agent.json (1)

959-959: ⚠️ Potential issue | 🟡 Minor

Typo in README note: "coimponent" → "component".

Line 959 in the note-RH5AH node reads "the Tavily AI Search coimponent".

✏️ Proposed fix
-"Add your **Tavily API Key** to the Tavily AI Search coimponent.\n \n## Using the Flow
+"Add your **Tavily API Key** to the Tavily AI Search component.\n \n## Using the Flow
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/backend/base/langflow/initial_setup/starter_projects/Research` Agent.json
at line 959, Fix the typo in the README string within the note-RH5AH node:
change "Tavily AI Search coimponent" to "Tavily AI Search component" in the
description value so the README reads correctly; locate the JSON entry for the
note-RH5AH node and update the description field accordingly.
src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx (1)

596-610: ⚠️ Potential issue | 🟠 Major

Stale useMemo dependency: canEditCode/allowCustomComponents missing.

Line 499 conditionally renders the Code button based on canEditCode (which depends on allowCustomComponents), but the useMemo dependency array at line 598 still lists hasCode only. If allowCustomComponents changes at runtime, the memoized output won't update.

Proposed fix
     [
       hasCode,
+      allowCustomComponents,
       nodeLength,
       hasToolMode,
       toolMode,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx`
around lines 596 - 610, The memoized value for the toolbar is missing
dependencies—add canEditCode and allowCustomComponents to the useMemo dependency
array so the memo updates when code-editing permission changes; locate the
useMemo call in nodeToolbarComponent (the array currently contains hasCode,
nodeLength, ... frozen, handleSelectChange) and include canEditCode and/or
allowCustomComponents (whichever drives the conditional Code button rendering)
to ensure the Code button re-renders when permissions change.
src/backend/base/langflow/api/v1/chat.py (2)

99-113: ⚠️ Potential issue | 🟠 Major

Validate persisted flow data when data is omitted in retrieve_vertices_order

When data is not provided, this path builds from DB (Line 109) without running check_flow_and_raise on stored flow JSON. That leaves a bypass for the feature flag in this endpoint.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/backend/base/langflow/api/v1/chat.py` around lines 99 - 113, The DB-path
for retrieve_vertices_order bypasses validation: when data is falsy the code
calls build_graph_from_db without running check_flow_and_raise, so persisted
flow JSON can skip the allow_custom_components rule; after obtaining the graph
from build_graph_from_db you must extract the raw flow JSON (or model_dump of
the graph) and call check_flow_and_raise with the same args used for the other
branch
(allow_custom_components=settings_service.settings.allow_custom_components,
all_types_dict=component_cache.all_types_dict) before proceeding, mirroring the
validation done in the build_and_cache_graph_from_data branch.

654-687: ⚠️ Potential issue | 🟠 Major

Public build path still misses full validation coverage and status mapping

In build_public_tmp, only request data is validated. If data is absent, persisted public flow data is not checked. Also, ValueError from validation is currently wrapped as 500 by the broad handler instead of 400.

Suggested fix direction
 async def build_public_tmp(...):
     try:
         # Validate custom components if blocking is enabled
         settings_service = get_settings_service()
         allow_custom = settings_service.settings.allow_custom_components
         if data:
             check_flow_and_raise(
                 data.model_dump(),
                 allow_custom_components=allow_custom,
                 all_types_dict=component_cache.all_types_dict,
             )

         # Verify this is a public flow and get the associated user
         client_id = request.cookies.get("client_id")
         owner_user, new_flow_id = await verify_public_flow_and_get_user(flow_id=flow_id, client_id=client_id)
+
+        # Validate persisted flow data when request payload is not provided
+        if not data:
+            async with session_scope() as session:
+                flow = await session.get(Flow, flow_id)
+                if flow and flow.data:
+                    check_flow_and_raise(
+                        flow.data,
+                        allow_custom_components=allow_custom,
+                        all_types_dict=component_cache.all_types_dict,
+                    )

         # Start the flow build using the new flow ID
         job_id = await start_flow_build(...)
+    except ValueError as exc:
+        raise HTTPException(status_code=400, detail=str(exc)) from exc
     except Exception as exc:
         await logger.aexception("Error building public flow")
         if isinstance(exc, HTTPException):
             raise
         raise HTTPException(status_code=500, detail=str(exc)) from exc
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/backend/base/langflow/api/v1/chat.py` around lines 654 - 687, In
build_public_tmp, if the incoming request data is missing you must validate the
persisted public flow before building—after verify_public_flow_and_get_user
(which returns owner_user and new_flow_id) load the persisted flow model/dict
and call check_flow_and_raise with allow_custom_components and
component_cache.all_types_dict to ensure full validation; also update the
exception handler in build_public_tmp so a ValueError from validation is
converted to an HTTPException with status_code=400 (i.e., if isinstance(exc,
ValueError): raise HTTPException(status_code=400, detail=str(exc)) from exc)
while preserving existing behavior for HTTPException and other exceptions when
calling start_flow_build.
♻️ Duplicate comments (2)
src/backend/base/langflow/initial_setup/starter_projects/Youtube Analysis.json (1)

1306-1306: Same PromptComponent helper-signature verification applies here.

This embedded code mirrors the same process_prompt_template(...) call pattern already flagged in the other starter project update.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/backend/base/langflow/initial_setup/starter_projects/Youtube`
Analysis.json at line 1306, The three calls to process_prompt_template in
PromptComponent (inside update_build_config, _update_template, and
update_frontend_node) need the same helper-signature verification as in the
other starter project: update each call to include the
helper_signature/verification argument (or call the helper that validates the
prompt helper signature) so process_prompt_template receives and verifies the
helper signature before processing; adjust the calls in update_build_config (the
try block), _update_template, and update_frontend_node to pass the helper
signature parameter (or call the verified wrapper) and ensure
validate_mustache_template remains intact.
src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting.json (1)

429-429: Same missing module_name propagation appears in this embedded PromptComponent

Line 429 has the same process_prompt_template(...) call pattern without module_name; apply the same fix here to keep metadata/hash tracking consistent across starter projects.

Based on learnings: In langflow custom components, the module_name parameter is now propagated through template building functions to add module metadata and code hashes to frontend nodes for better component tracking and debugging.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/backend/base/langflow/initial_setup/starter_projects/Basic`
Prompting.json at line 429, The PromptComponent is calling
process_prompt_template without passing module_name, so add module_name
propagation to all process_prompt_template calls in this class (specifically in
update_build_config, _update_template, and update_frontend_node) by passing
module_name=self.module_name (or the correct component module identifier) so
frontend nodes receive module metadata/hash tracking; ensure you add the same
named kwarg in each call and keep existing try/except and validation logic
unchanged.
🧹 Nitpick comments (8)
src/backend/base/langflow/initial_setup/setup.py (1)

82-83: Consider logging alias collisions to make fallback behavior observable.

When short_name is already present, the alias is silently skipped. A debug log here would make failed rename reconciliation much easier to diagnose.

Suggested tweak
-                if short_name != key and short_name not in all_types_dict_flat:
-                    all_types_dict_flat[short_name] = component
+                if short_name != key:
+                    if short_name not in all_types_dict_flat:
+                        all_types_dict_flat[short_name] = component
+                    elif all_types_dict_flat[short_name] is not component:
+                        logger.debug(
+                            "Component alias collision for '%s' (module=%s); keeping existing mapping.",
+                            short_name,
+                            module,
+                        )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/backend/base/langflow/initial_setup/setup.py` around lines 82 - 83, When
building alias map in setup.py the code silently skips adding an alias if
short_name already exists (in the block checking short_name != key and
short_name not in all_types_dict_flat). Add a debug-level log for the collision
case so skip is observable: when short_name != key and short_name is already in
all_types_dict_flat, emit a debug message including short_name, the existing
entry (all_types_dict_flat[short_name]) and the new component so developers can
see why the alias fallback happened; use the module logger (e.g.,
logging.getLogger(__name__) or the file's existing logger) and avoid changing
control flow.
src/backend/base/langflow/initial_setup/starter_projects/Twitter Thread Generator.json (1)

1895-1895: Propagate module_name in process_prompt_template(...) calls.

Line 1895 updates template-processing logic, but the embedded PromptComponent still calls process_prompt_template(...) without module_name. Passing it will keep module/code-hash metadata propagation consistent for frontend node tracking.

♻️ Proposed fix inside the embedded PromptComponent code
- _ = process_prompt_template(
+ _ = process_prompt_template(
     template=template_value,
     name="template",
     custom_fields=build_config["custom_fields"],
     frontend_node_template=build_config,
     is_mustache=is_mustache,
+    module_name=getattr(self, "module_name", self.__module__),
 )
- _ = process_prompt_template(
+ _ = process_prompt_template(
     template=prompt_template,
     name="template",
     custom_fields=custom_fields,
     frontend_node_template=frontend_node_template,
     is_mustache=is_mustache,
+    module_name=getattr(self, "module_name", self.__module__),
 )
- _ = process_prompt_template(
+ _ = process_prompt_template(
     template=template,
     name="template",
     custom_fields=frontend_node["custom_fields"],
     frontend_node_template=frontend_node["template"],
     is_mustache=is_mustache,
+    module_name=getattr(self, "module_name", self.__module__),
 )

Based on learnings, In langflow custom components, the module_name parameter is now propagated through template building functions to add module metadata and code hashes to frontend nodes for better component tracking and debugging.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/backend/base/langflow/initial_setup/starter_projects/Twitter` Thread
Generator.json at line 1895, The process_prompt_template(...) calls inside
PromptComponent (in update_build_config, _update_template, and
update_frontend_node) must include the new module_name parameter so
module/code-hash metadata is propagated; update each call to pass a module_name
value (e.g., module_name=self.__class__.__module__ or appropriate module
identifier available in the method) alongside the existing args to ensure
frontend node tracking gets the component module metadata.
src/frontend/src/modals/codeAreaModal/index.tsx (1)

247-250: Redundant guard — AceEditor readOnly already prevents edits.

The readOnly={readonly || isBlocked} on line 235 prevents the editor from producing change events. This onChange guard is defense-in-depth, which is fine, but worth noting it's not strictly necessary.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/frontend/src/modals/codeAreaModal/index.tsx` around lines 247 - 250, The
onChange handler contains a redundant guard around isBlocked because the
AceEditor already sets readOnly={readonly || isBlocked} and will not emit
editable changes; simplify by removing the defensive branch inside the onChange
callback and directly call setCode(value) (or keep a single early return for
clarity) in the onChange handler for the AceEditor component to reduce dead
code; update references: the onChange prop, setCode function, isBlocked flag,
and the readOnly prop on the AceEditor.
src/frontend/src/stores/flowStore.ts (1)

913-917: Use a more stable custom-component-block detection signal.

At Line 913, detection depends on one literal phrase in list. If backend wording changes, or the signal is only in title, the UI can wrongly show the outdated-components warning.

Suggested fix
-        const isCustomComponentBlocked = list.some(
-          (msg) =>
-            msg.toLowerCase().includes("custom components are not allowed"),
-        );
+        const errorText = [title, ...list].join(" ").toLowerCase();
+        const isCustomComponentBlocked = errorText.includes(
+          "custom components are not allowed",
+        );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/frontend/src/stores/flowStore.ts` around lines 913 - 917, The current
detection in isCustomComponentBlocked relies on the exact phrase "custom
components are not allowed" in the list array and can miss signals in other
fields or different wording; update the check used before referencing
get().componentsToUpdate to inspect likely fields on each list item (e.g.,
title, message, detail) and match a more robust pattern (case-insensitive
substring or small regex) that looks for tokens like "custom component" plus
verbs like "not allowed|blocked|forbidden|unsupported", or better yet check for
a backend-provided flag/name if present; modify the logic around
isCustomComponentBlocked and the list traversal so it checks multiple properties
per item and uses the looser matching rule to avoid false negatives.
src/backend/base/langflow/initial_setup/starter_projects/Meeting Summary.json (2)

2498-2498: Consider excluding volatile score from committed starter flow JSON.

score values are typically runtime/editor-derived and can create unnecessary churn in PRs without functional impact.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/backend/base/langflow/initial_setup/starter_projects/Meeting`
Summary.json at line 2498, Remove the volatile "score" field from the committed
starter flow JSON (e.g., in Meeting Summary.json) to avoid churn; either delete
all "score" keys from the JSON file(s) or update the export/generation step that
produces starter_projects to strip "score" before committing so
runtime/editor-derived scores are not persisted.

537-537: Propagate module_name in template processing calls for metadata/code-hash traceability.

The embedded PromptComponent code calls process_prompt_template(...) without module_name in multiple paths, which can weaken frontend node metadata consistency for template-derived fields.

♻️ Proposed patch inside the embedded Prompt component code string
-                    _ = process_prompt_template(
+                    _ = process_prompt_template(
                         template=template_value,
                         name="template",
                         custom_fields=build_config["custom_fields"],
                         frontend_node_template=build_config,
+                        module_name=self.__class__.__module__,
                         is_mustache=is_mustache,
                     )
...
-            _ = process_prompt_template(
+            _ = process_prompt_template(
                 template=prompt_template,
                 name="template",
                 custom_fields=custom_fields,
                 frontend_node_template=frontend_node_template,
+                module_name=self.__class__.__module__,
                 is_mustache=is_mustache,
             )
...
-            _ = process_prompt_template(
+            _ = process_prompt_template(
                 template=template,
                 name="template",
                 custom_fields=frontend_node["custom_fields"],
                 frontend_node_template=frontend_node["template"],
+                module_name=self.__class__.__module__,
                 is_mustache=is_mustache,
             )

Based on learnings: In langflow custom components, the module_name parameter is now propagated through template building functions to add module metadata and code hashes to frontend nodes for better component tracking and debugging.

Also applies to: 1559-1559

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/backend/base/langflow/initial_setup/starter_projects/Meeting`
Summary.json at line 537, The three calls to process_prompt_template in
update_build_config, _update_template, and update_frontend_node omit
module_name, so add module_name when calling process_prompt_template to
propagate component metadata; pass module_name=getattr(self, "module_name",
self.__class__.__module__) (or self.__class__.__module__ directly) in each call
(the calls are inside the functions update_build_config, _update_template, and
update_frontend_node) so frontend_node/custom_fields get the module metadata and
code-hash traceability.
src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents.json (1)

1570-1570: Sanitize template-validation debug logs to avoid leaking user prompt content.

The new debug paths interpolate {e} from template validation failures. If exception messages include template fragments, logs may capture user-authored prompt text. Prefer logging a stable message (or exception type) without raw exception text.

Also applies to: 1738-1738, 1909-1909

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/backend/base/langflow/initial_setup/starter_projects/Sequential` Tasks
Agents.json at line 1570, The debug logs in update_build_config (logger.debug in
the try/except), _update_template (logger.debug in its except), and
update_frontend_node (logger.debug in its except) currently interpolate the
exception message (f"...: {e}") which can leak user prompt content; change these
to log a stable, non-sensitive message and include only the exception type/name
(e.g., type(e).__name__) or a fixed tag instead of the raw exception text so
logs do not contain user prompt fragments.
src/backend/base/langflow/initial_setup/starter_projects/Custom Component Generator.json (1)

765-765: Propagate module_name in process_prompt_template(...) calls

Line 765’s embedded PromptComponent processes template variables without module_name, so module/code-hash metadata propagation can be incomplete for generated frontend fields.

♻️ Suggested patch inside the embedded PromptComponent code
- _ = process_prompt_template(
+ _ = process_prompt_template(
     template=template_value,
     name="template",
     custom_fields=build_config["custom_fields"],
     frontend_node_template=build_config,
     is_mustache=is_mustache,
+    module_name=self.__class__.__module__,
 )
...
- _ = process_prompt_template(
+ _ = process_prompt_template(
     template=prompt_template,
     name="template",
     custom_fields=custom_fields,
     frontend_node_template=frontend_node_template,
     is_mustache=is_mustache,
+    module_name=self.__class__.__module__,
 )
...
- _ = process_prompt_template(
+ _ = process_prompt_template(
     template=template,
     name="template",
     custom_fields=frontend_node["custom_fields"],
     frontend_node_template=frontend_node["template"],
     is_mustache=is_mustache,
+    module_name=self.__class__.__module__,
 )

Based on learnings: In langflow custom components, the module_name parameter is now propagated through template building functions to add module metadata and code hashes to frontend nodes for better component tracking and debugging.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/backend/base/langflow/initial_setup/starter_projects/Custom` Component
Generator.json at line 765, The PromptComponent calls to process_prompt_template
(in update_build_config, _update_template, and update_frontend_node) need to
include the module_name parameter so module/code-hash metadata is propagated;
update each call to pass module_name (use self.module_name when present,
otherwise fall back to self.__module__) into process_prompt_template, ensuring
the same module_name value is supplied in all three locations.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/backend/base/langflow/api/v1/chat.py`:
- Around line 99-105: The retrieval endpoints call check_flow_and_raise(...)
(e.g., inside retrieve_vertices_order) which raises ValueError on invalid flows
but bubbles up and becomes a 500; wrap the call to check_flow_and_raise in a
try/except that catches ValueError and raises
fastapi.HTTPException(status_code=400, detail=str(err)) so validation failures
return HTTP 400; apply the same pattern for the other similar block (lines
133-147) that performs check_flow_and_raise, referencing the same symbols
(retrieve_vertices_order, check_flow_and_raise,
settings_service.settings.allow_custom_components,
component_cache.all_types_dict) when adding the try/except and converting
ValueError -> HTTP 400.
- Around line 31-33: The import of check_flow_and_raise is pointing to a
non-existent module path (langflow.api.utils.flow_validation) and the import
block ordering violates Ruff rules; update the import to the correct module
where check_flow_and_raise is actually defined (replace the incorrect path with
the real module that exports check_flow_and_raise), then reorder the import
block so standard-library imports come first, third-party next, and
local/project imports last (ensure component_cache and schemas imports remain
together), and run Ruff/isort to validate formatting; reference the symbol
check_flow_and_raise in src/backend/base/langflow/api/v1/chat.py and adjust its
import and the surrounding import ordering accordingly.

In `@src/backend/base/langflow/api/v1/endpoints.py`:
- Around line 1047-1060: The update handler that instantiates
Component(_code=...) is missing the allow_custom_components guard; add the same
check used in the creation path: get settings_service and if
settings_service.settings.allow_custom_components is False, verify the supplied
code against known templates using component_cache.all_types_dict and
code_matches_any_template(raw_code.code, component_cache.all_types_dict), and if
not a known template raise HTTPException(status_code=status.HTTP_403_FORBIDDEN,
detail="Custom component creation is disabled by administrator"); apply this
logic in the /custom_component/update endpoint (the handler that constructs
Component) to prevent executing user code when custom components are disabled.
- Around line 453-463: The endpoint code calls check_flow_and_raise with
component_cache.all_types_dict without null checks; update each affected
endpoint (the blocks using component_cache.all_types_dict around where
check_flow_and_raise is invoked) to follow flows.py's defensive pattern: if
component_cache.all_types_dict is None, call await
get_and_cache_all_types_dict() and use its result (or assign back) before
passing all_types_dict into check_flow_and_raise; keep existing
get_settings_service() usage and preserve the HTTPException handling for
ValueError. Ensure you apply this same fix in all three locations that reference
component_cache.all_types_dict so the endpoints never pass None into
check_flow_and_raise.

In `@src/backend/base/langflow/initial_setup/starter_projects/Text` Sentiment
Analysis.json:
- Line 310: The code currently swallows ValueError from
validate_mustache_template in PromptComponent methods (update_build_config,
_update_template, update_frontend_node) which lets unsafe templates persist;
change each except block to fail-closed by re-raising the error (or raising a
new ValueError) after logging so the operation aborts and the invalid template
cannot be saved or used by build_prompt; locate the validate_mustache_template
calls inside update_build_config, _update_template, and update_frontend_node and
replace the current logger.debug-only except handlers with logic that logs then
raises the caught exception.

In `@src/backend/base/langflow/initial_setup/starter_projects/Travel` Planning
Agents.json:
- Line 913: The template.tools_metadata still references the old action name
"as_message" while the component output method was renamed to
fetch_content_as_message; locate the template.tools_metadata entry that maps
outputs/actions (look for the string "as_message" or the metadata keys tied to
the URLComponent outputs) and update it to use "fetch_content_as_message" (or
otherwise sync the method name to the Output with name "raw_results"/method
"fetch_content_as_message") so the metadata matches the actual method.
- Line 913: In fetch_url_contents, the per-URL exception handler (except
requests.exceptions.RequestException as e) always continues, ignoring the
continue_on_failure flag; change that handler to respect
self.continue_on_failure by logging the error as done now and if
self.continue_on_failure is True continue to next URL, otherwise raise a
ValueError (or re-raise) with a clear message (include the exception) so the
failure stops; update the except block inside fetch_url_contents to check
self.continue_on_failure and either continue or raise (use the same
logging/exception style as the outer except to keep consistency).
- Line 913: The component uses BeautifulSoup(..., "lxml") in the _text_extractor
method but lxml is not declared as an explicit dependency; update the component
metadata dependencies array (the JSON "dependencies" list for this starter
project) to include {"name": "lxml", "version": "<latest>"} so lxml is installed
explicitly alongside the existing dependency entries.

In
`@src/frontend/src/components/core/flowToolbarComponent/components/deploy-dropdown.tsx`:
- Around line 84-90: The onError handler in deploy-dropdown.tsx assigns a
possibly non-string detail (from e.response?.data?.detail) into setErrorData;
normalize that value to a string before putting it into list so UI/rendering
won't break. Update the onError block (the onError callback in this file) to
convert detail to a string (e.g., use typeof check and JSON.stringify fallback
or String(detail)) and pass that string to setErrorData({ title: "Failed to save
flow", list: [detailString] }). Ensure you reference the existing onError and
setErrorData symbols when making the change.

In
`@src/frontend/src/components/core/parameterRenderComponent/components/codeAreaComponent/index.tsx`:
- Around line 58-60: The local variable effectiveDisabled is computed but never
used, causing blocked state styling to not apply: update the render path to use
effectiveDisabled instead of the raw disabled prop (or remove effectiveDisabled
if you prefer Option A). Specifically, change calls to renderCodeText and
renderExternalLinkIcon (and any other places reading disabled) to pass or read
effectiveDisabled, and ensure isBlocked remains derived from useGetConfig() so
the lock icon and disabled classes reflect the combined blocked/prop state.

In `@src/frontend/src/hooks/flows/use-save-flow.ts`:
- Around line 108-113: The onError handler in use-save-flow.ts currently assigns
detail directly to list ([detail]) which can render objects/arrays as "[object
Object]"; normalize detail before calling setErrorData: detect if detail is an
array (Array.isArray) and set list to detail.map(String), if it's an object
convert to a readable array (e.g., Object.values(detail).flat().map(String) or
JSON.stringify(detail) as fallback), otherwise coerce to string; update the
onError block around the detail variable and the setErrorData call so
setErrorData({ title: "Failed to save flow", list: normalizedList }) always
receives an array of strings.

In `@src/frontend/src/stores/flowStore.ts`:
- Around line 764-778: The gate currently blocks builds when
get().componentsToUpdate has any entries, but componentsToUpdate is derived from
codeValidity.outdated and includes non-custom nodes; change the logic so the
block only triggers for components that are custom/user-edited (e.g., filter
get().componentsToUpdate for a property that marks custom edits such as
isCustom, userEdited, or origin === 'custom'), use that filtered list to build
outdatedNames, call setErrorData with that filtered list, and then call
get().setIsBuilding(false) and throw the Error as before; update the condition
that references allowCustomComponents and get().componentsToUpdate.length to
instead check the filteredCustomOutdated.length.

---

Outside diff comments:
In `@src/backend/base/langflow/api/v1/chat.py`:
- Around line 99-113: The DB-path for retrieve_vertices_order bypasses
validation: when data is falsy the code calls build_graph_from_db without
running check_flow_and_raise, so persisted flow JSON can skip the
allow_custom_components rule; after obtaining the graph from build_graph_from_db
you must extract the raw flow JSON (or model_dump of the graph) and call
check_flow_and_raise with the same args used for the other branch
(allow_custom_components=settings_service.settings.allow_custom_components,
all_types_dict=component_cache.all_types_dict) before proceeding, mirroring the
validation done in the build_and_cache_graph_from_data branch.
- Around line 654-687: In build_public_tmp, if the incoming request data is
missing you must validate the persisted public flow before building—after
verify_public_flow_and_get_user (which returns owner_user and new_flow_id) load
the persisted flow model/dict and call check_flow_and_raise with
allow_custom_components and component_cache.all_types_dict to ensure full
validation; also update the exception handler in build_public_tmp so a
ValueError from validation is converted to an HTTPException with status_code=400
(i.e., if isinstance(exc, ValueError): raise HTTPException(status_code=400,
detail=str(exc)) from exc) while preserving existing behavior for HTTPException
and other exceptions when calling start_flow_build.

In `@src/backend/base/langflow/initial_setup/starter_projects/Research`
Agent.json:
- Line 959: Fix the typo in the README string within the note-RH5AH node: change
"Tavily AI Search coimponent" to "Tavily AI Search component" in the description
value so the README reads correctly; locate the JSON entry for the note-RH5AH
node and update the description field accordingly.

In `@src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx`:
- Around line 596-610: The memoized value for the toolbar is missing
dependencies—add canEditCode and allowCustomComponents to the useMemo dependency
array so the memo updates when code-editing permission changes; locate the
useMemo call in nodeToolbarComponent (the array currently contains hasCode,
nodeLength, ... frozen, handleSelectChange) and include canEditCode and/or
allowCustomComponents (whichever drives the conditional Code button rendering)
to ensure the Code button re-renders when permissions change.

---

Duplicate comments:
In `@src/backend/base/langflow/initial_setup/starter_projects/Basic`
Prompting.json:
- Line 429: The PromptComponent is calling process_prompt_template without
passing module_name, so add module_name propagation to all
process_prompt_template calls in this class (specifically in
update_build_config, _update_template, and update_frontend_node) by passing
module_name=self.module_name (or the correct component module identifier) so
frontend nodes receive module metadata/hash tracking; ensure you add the same
named kwarg in each call and keep existing try/except and validation logic
unchanged.

In `@src/backend/base/langflow/initial_setup/starter_projects/Youtube`
Analysis.json:
- Line 1306: The three calls to process_prompt_template in PromptComponent
(inside update_build_config, _update_template, and update_frontend_node) need
the same helper-signature verification as in the other starter project: update
each call to include the helper_signature/verification argument (or call the
helper that validates the prompt helper signature) so process_prompt_template
receives and verifies the helper signature before processing; adjust the calls
in update_build_config (the try block), _update_template, and
update_frontend_node to pass the helper signature parameter (or call the
verified wrapper) and ensure validate_mustache_template remains intact.

---

Nitpick comments:
In `@src/backend/base/langflow/initial_setup/setup.py`:
- Around line 82-83: When building alias map in setup.py the code silently skips
adding an alias if short_name already exists (in the block checking short_name
!= key and short_name not in all_types_dict_flat). Add a debug-level log for the
collision case so skip is observable: when short_name != key and short_name is
already in all_types_dict_flat, emit a debug message including short_name, the
existing entry (all_types_dict_flat[short_name]) and the new component so
developers can see why the alias fallback happened; use the module logger (e.g.,
logging.getLogger(__name__) or the file's existing logger) and avoid changing
control flow.

In `@src/backend/base/langflow/initial_setup/starter_projects/Custom` Component
Generator.json:
- Line 765: The PromptComponent calls to process_prompt_template (in
update_build_config, _update_template, and update_frontend_node) need to include
the module_name parameter so module/code-hash metadata is propagated; update
each call to pass module_name (use self.module_name when present, otherwise fall
back to self.__module__) into process_prompt_template, ensuring the same
module_name value is supplied in all three locations.

In `@src/backend/base/langflow/initial_setup/starter_projects/Meeting`
Summary.json:
- Line 2498: Remove the volatile "score" field from the committed starter flow
JSON (e.g., in Meeting Summary.json) to avoid churn; either delete all "score"
keys from the JSON file(s) or update the export/generation step that produces
starter_projects to strip "score" before committing so runtime/editor-derived
scores are not persisted.
- Line 537: The three calls to process_prompt_template in update_build_config,
_update_template, and update_frontend_node omit module_name, so add module_name
when calling process_prompt_template to propagate component metadata; pass
module_name=getattr(self, "module_name", self.__class__.__module__) (or
self.__class__.__module__ directly) in each call (the calls are inside the
functions update_build_config, _update_template, and update_frontend_node) so
frontend_node/custom_fields get the module metadata and code-hash traceability.

In `@src/backend/base/langflow/initial_setup/starter_projects/Sequential` Tasks
Agents.json:
- Line 1570: The debug logs in update_build_config (logger.debug in the
try/except), _update_template (logger.debug in its except), and
update_frontend_node (logger.debug in its except) currently interpolate the
exception message (f"...: {e}") which can leak user prompt content; change these
to log a stable, non-sensitive message and include only the exception type/name
(e.g., type(e).__name__) or a fixed tag instead of the raw exception text so
logs do not contain user prompt fragments.

In `@src/backend/base/langflow/initial_setup/starter_projects/Twitter` Thread
Generator.json:
- Line 1895: The process_prompt_template(...) calls inside PromptComponent (in
update_build_config, _update_template, and update_frontend_node) must include
the new module_name parameter so module/code-hash metadata is propagated; update
each call to pass a module_name value (e.g.,
module_name=self.__class__.__module__ or appropriate module identifier available
in the method) alongside the existing args to ensure frontend node tracking gets
the component module metadata.

In `@src/frontend/src/modals/codeAreaModal/index.tsx`:
- Around line 247-250: The onChange handler contains a redundant guard around
isBlocked because the AceEditor already sets readOnly={readonly || isBlocked}
and will not emit editable changes; simplify by removing the defensive branch
inside the onChange callback and directly call setCode(value) (or keep a single
early return for clarity) in the onChange handler for the AceEditor component to
reduce dead code; update references: the onChange prop, setCode function,
isBlocked flag, and the readOnly prop on the AceEditor.

In `@src/frontend/src/stores/flowStore.ts`:
- Around line 913-917: The current detection in isCustomComponentBlocked relies
on the exact phrase "custom components are not allowed" in the list array and
can miss signals in other fields or different wording; update the check used
before referencing get().componentsToUpdate to inspect likely fields on each
list item (e.g., title, message, detail) and match a more robust pattern
(case-insensitive substring or small regex) that looks for tokens like "custom
component" plus verbs like "not allowed|blocked|forbidden|unsupported", or
better yet check for a backend-provided flag/name if present; modify the logic
around isCustomComponentBlocked and the list traversal so it checks multiple
properties per item and uses the looser matching rule to avoid false negatives.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5369b63 and 00dc2a5.

⛔ Files ignored due to path filters (2)
  • src/frontend/package-lock.json is excluded by !**/package-lock.json
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (41)
  • src/backend/base/langflow/api/v1/chat.py
  • src/backend/base/langflow/api/v1/endpoints.py
  • src/backend/base/langflow/api/v1/projects.py
  • src/backend/base/langflow/api/v1/schemas.py
  • src/backend/base/langflow/initial_setup/setup.py
  • src/backend/base/langflow/initial_setup/starter_projects/Basic Prompt Chaining.json
  • src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting.json
  • src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json
  • src/backend/base/langflow/initial_setup/starter_projects/Custom Component Generator.json
  • src/backend/base/langflow/initial_setup/starter_projects/Document Q&A.json
  • src/backend/base/langflow/initial_setup/starter_projects/Image Sentiment Analysis.json
  • src/backend/base/langflow/initial_setup/starter_projects/Instagram Copywriter.json
  • src/backend/base/langflow/initial_setup/starter_projects/Invoice Summarizer.json
  • src/backend/base/langflow/initial_setup/starter_projects/Meeting Summary.json
  • src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json
  • src/backend/base/langflow/initial_setup/starter_projects/Nvidia Remix.json
  • src/backend/base/langflow/initial_setup/starter_projects/Research Agent.json
  • src/backend/base/langflow/initial_setup/starter_projects/SEO Keyword Generator.json
  • src/backend/base/langflow/initial_setup/starter_projects/SaaS Pricing.json
  • src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents.json
  • src/backend/base/langflow/initial_setup/starter_projects/Text Sentiment Analysis.json
  • src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json
  • src/backend/base/langflow/initial_setup/starter_projects/Twitter Thread Generator.json
  • src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json
  • src/backend/base/langflow/initial_setup/starter_projects/Youtube Analysis.json
  • src/frontend/src/CustomNodes/GenericNode/components/NodeUpdateComponent/index.tsx
  • src/frontend/src/CustomNodes/GenericNode/index.tsx
  • src/frontend/src/components/core/flowToolbarComponent/components/deploy-dropdown.tsx
  • src/frontend/src/components/core/parameterRenderComponent/components/codeAreaComponent/index.tsx
  • src/frontend/src/controllers/API/queries/config/use-get-config.ts
  • src/frontend/src/hooks/flows/use-save-flow.ts
  • src/frontend/src/modals/codeAreaModal/index.tsx
  • src/frontend/src/pages/FlowPage/components/UpdateAllComponents/index.tsx
  • src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarFooterButtons.tsx
  • src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx
  • src/frontend/src/stores/flowStore.ts
  • src/frontend/src/stores/utilityStore.ts
  • src/frontend/src/types/zustand/utility/index.ts
  • src/frontend/src/utils/buildUtils.ts
  • src/frontend/src/utils/reactflowUtils.ts
  • src/lfx/src/lfx/services/settings/base.py

Comment thread src/backend/base/langflow/api/v1/chat.py Outdated
Comment thread src/backend/base/langflow/api/v1/chat.py Outdated
Comment thread src/backend/base/langflow/api/v1/endpoints.py Outdated
Comment thread src/backend/base/langflow/api/v1/endpoints.py
Comment thread src/frontend/src/hooks/flows/use-save-flow.ts Outdated
Comment thread src/frontend/src/stores/flowStore.ts
@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Feb 25, 2026
@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Feb 25, 2026
@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Feb 25, 2026
@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Feb 25, 2026
@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Feb 25, 2026
@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Feb 25, 2026
@github-actions github-actions Bot removed the enhancement New feature or request label Feb 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request lgtm This PR has been approved by a maintainer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants