Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
2f6f6cd
refactor: Use customization to get api base urls (#10871)
mfortman11 Dec 4, 2025
e948d5d
fix: Clean up the default startup logging (#10842)
erichare Dec 4, 2025
b4a54d8
refactor: add code sample customizations (#10884)
mfortman11 Dec 4, 2025
8aec1f3
Fix: lfx serve asyncio event loop error (#10887)
HzaRashid Dec 4, 2025
6cedc28
fix: Update LangflowCounts component to format star and Discord count…
viktoravelino Dec 4, 2025
d5a3124
Add test
jordanrfrazier Dec 5, 2025
e77d924
Revert "Add test"
jordanrfrazier Dec 5, 2025
7a053bd
Fix: update lfx serve tests to mock the .serve() to prevent hanging (…
HzaRashid Dec 5, 2025
7fc4208
fix: correctly raise file not found errors in File GET endpoints (#10…
jordanrfrazier Dec 8, 2025
c0d33c3
fix: image pathing to operate with s3 storage (#10919)
jordanrfrazier Dec 8, 2025
9a7ce34
fix: Add empty input check in ALTKAgent for Anthropic (#10913)
jsntsay Dec 8, 2025
9ed8321
fix: Composio's Freshdesk description error (#10760)
Uday-sidagana Dec 8, 2025
101cbd0
feat: updated Composio Github icon (#10764)
Uday-sidagana Dec 8, 2025
b0bae86
Feat: migrate MCP transport from SSE to streamable http (#10727)
HzaRashid Dec 8, 2025
a209acd
feat: Add a Unified Model Providers configuration (#10565)
HimavarshaVS Dec 9, 2025
12d17dc
fix(ci): Allow prerelease packages and fix runtime type imports (#10945)
Cristhianzl Dec 10, 2025
34216b2
fix: update sidebar icon styles to maintain backward compatibility (#…
viktoravelino Dec 10, 2025
840ec0f
feat: add tenacity retry in openserach (#10917)
edwinjosechittilappilly Dec 10, 2025
f3c08db
fix: Properly set a default Ollama base url (#10940)
erichare Dec 10, 2025
63141c1
feat: Ability to add custom colors for sticky notes. (#10961)
deon-sanchez Dec 10, 2025
2f9136c
fix: Support tool mode in components without inputs (#10959)
erichare Dec 11, 2025
397deff
fix: Proper MCP / Oauth support (#10965)
erichare Dec 11, 2025
70432fe
fix: prevent UI from getting stuck when switching to cURL mode after …
andifilhohub Dec 11, 2025
9463c4a
fix: Ensure dict return for MCP component (#10960)
erichare Dec 11, 2025
bce16ca
feat: Add Correlation ID for CHAIN & LLM Traces in ArizePhoenixTracer…
ialisaleh Dec 11, 2025
9d57aa8
bug: Fix watsonX embedding model selection (#10980)
deon-sanchez Dec 11, 2025
3fed9fe
fix: Add authentication to various endpoints (#10977)
erichare Dec 12, 2025
e9a537b
Fix: cuga integration (#10976)
sami-marreed Dec 12, 2025
24dbc60
Fix: ensure streamable-http session manager is entered and exited fro…
HzaRashid Dec 12, 2025
7ebccb8
Fix: Flowing edge for Boilerplate nodes with default width and height…
olayinkaadelakun Dec 12, 2025
3a41259
feat: Handle error events in OpenAI response streaming (#10844)
edwinjosechittilappilly Dec 12, 2025
f5e68c2
fix: Add graceful subprocess cleanup during shutdown (#10909)
Cristhianzl Dec 12, 2025
a54e508
fix: ruff errors in test openai respons api tests (#11005)
edwinjosechittilappilly Dec 12, 2025
d4ada6b
fix: mcp-proxy process leak (#10988)
phact Dec 12, 2025
757ef6c
feat: Add Hook for Auto Refresh of Model Provider Input (#10996)
deon-sanchez Dec 12, 2025
07a01ad
fix: Disable Local storage option in Write File component for cloud e…
HimavarshaVS Dec 12, 2025
7627660
Fix: disable mcp sse endpoints astra (#11006)
HzaRashid Dec 13, 2025
909bdb1
refactor: Improve image path extraction and validation (#11001)
Cristhianzl Dec 14, 2025
2a5ed55
Fix: Remove hidden from LCAgentComponent (#10984)
olayinkaadelakun Dec 15, 2025
53015c1
fix: cuga update (#11019)
sami-marreed Dec 15, 2025
056a76a
Fix: improve exception handling and status code for disabled endpoint…
HzaRashid Dec 15, 2025
c1c930b
fix: langwatch traces all api endpoints (#11013)
HzaRashid Dec 15, 2025
c970f99
docs: OpenAPI spec content updated without version change (#11032)
github-actions[bot] Dec 16, 2025
ae70c61
fix: Make sure loop inputs are properly handled in research (#11029)
erichare Dec 16, 2025
5ba7fe9
feat: add sliding container infrastructure to playgroundComponent
Nov 30, 2025
2191047
style: add border-radius to flow canvas and update Share button styling
Nov 30, 2025
7766290
fix: add sessionStorage fallback and update types (any -> unknown)
Nov 30, 2025
d4a3b30
feat: add chat-header feature to sliding container
Nov 30, 2025
b192fee
refactor: simplify FlowPageSlidingContainerContent by extracting sess…
Nov 30, 2025
b0b1bed
fix: restore session rename persistence logic from slide-chat-header …
Nov 30, 2025
0c96bbf
chore: revert formatting-only files to main (moved to infrastructure …
Nov 30, 2025
e108cc5
chore: sync formatting files with infrastructure branch
Nov 30, 2025
f956db3
rebase conflicts
Nov 30, 2025
524c54a
removed unecessary comment
Dec 1, 2025
279645b
fix: update messages store when renaming session to prevent content s…
Dec 1, 2025
d6a576f
refactor(ui): remove Sessions icon and adjust padding when playground…
Dec 3, 2025
db147e2
test: add ChatSidebar component tests
Dec 3, 2025
1c56d42
Add animated sidebar transition in playground chat
Dec 9, 2025
7db3329
Revert "Add animated sidebar transition in playground chat"
Dec 9, 2025
72216b2
Restore animated-close and align chat header with mini
Dec 15, 2025
9dd56dd
changes to fix animation using AnimatedConditional
Dec 16, 2025
05fb733
replace hooks
Dec 16, 2025
0704419
remove redundant hook and use use-add-session etc intead
Dec 16, 2025
6989beb
fix(auth): Disallow refresh token access to API endpoints (#10840)
mpawlow Dec 3, 2025
1a66d8a
changes to fix animation using AnimatedConditional
Dec 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 5 additions & 5 deletions .github/workflows/cross-platform-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ jobs:
find ./base-dist -name "*.whl" -type f
WHEEL_FILE=$(find ./base-dist -name "*.whl" -type f | head -1)
if [ -n "$WHEEL_FILE" ]; then
uv pip install --python ./test-env/Scripts/python.exe "$WHEEL_FILE"
uv pip install --prerelease=allow --python ./test-env/Scripts/python.exe "$WHEEL_FILE"
else
echo "No wheel file found in ./base-dist/"
exit 1
Expand Down Expand Up @@ -231,7 +231,7 @@ jobs:
find ./base-dist -name "*.whl" -type f
WHEEL_FILE=$(find ./base-dist -name "*.whl" -type f | head -1)
if [ -n "$WHEEL_FILE" ]; then
uv pip install --python ./test-env/bin/python "$WHEEL_FILE"
uv pip install --prerelease=allow --python ./test-env/bin/python "$WHEEL_FILE"
else
echo "No wheel file found in ./base-dist/"
exit 1
Expand Down Expand Up @@ -475,7 +475,7 @@ jobs:
find ./base-dist -name "*.whl" -type f
WHEEL_FILE=$(find ./base-dist -name "*.whl" -type f | head -1)
if [ -n "$WHEEL_FILE" ]; then
uv pip install --python ./test-env/Scripts/python.exe "$WHEEL_FILE"
uv pip install --prerelease=allow --python ./test-env/Scripts/python.exe "$WHEEL_FILE"
else
echo "No wheel file found in ./base-dist/"
exit 1
Expand All @@ -489,7 +489,7 @@ jobs:
find ./main-dist -name "*.whl" -type f
WHEEL_FILE=$(find ./main-dist -name "*.whl" -type f | head -1)
if [ -n "$WHEEL_FILE" ]; then
uv pip install --python ./test-env/Scripts/python.exe "$WHEEL_FILE"
uv pip install --prerelease=allow --python ./test-env/Scripts/python.exe "$WHEEL_FILE"
else
echo "No wheel file found in ./main-dist/"
exit 1
Expand Down Expand Up @@ -517,7 +517,7 @@ jobs:
find ./base-dist -name "*.whl" -type f
WHEEL_FILE=$(find ./base-dist -name "*.whl" -type f | head -1)
if [ -n "$WHEEL_FILE" ]; then
uv pip install --python ./test-env/bin/python "$WHEEL_FILE"
uv pip install --prerelease=allow --python ./test-env/bin/python "$WHEEL_FILE"
else
echo "No wheel file found in ./base-dist/"
exit 1
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/nightly_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,6 @@ jobs:

uv lock
cd src/backend/base && uv lock && cd ../../..
cd src/lfx && uv lock && cd ../..

git add pyproject.toml src/backend/base/pyproject.toml src/lfx/pyproject.toml uv.lock src/backend/base/uv.lock
git commit -m "Update version and project name"
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,8 @@ jobs:
- name: Check if pre-release
if: inputs.pre_release
run: |
version=$(uv tree | grep 'langflow' | grep -v 'langflow-base' | awk '{print $2}' | sed 's/^v//')
version="${{ inputs.release_tag }}"
echo "$version"
if [[ "${version}" =~ ^([0-9]+\.)?([0-9]+\.)?[0-9]+((a|b|rc|dev|post)([0-9]+))$ ]]; then
echo "Pre-release version detected. Continuing with the release."
else
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release_nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ jobs:
run: |
rm -rf src/backend/base/dist
rm -rf dist
make build base=true args="--wheel"
make build base=true args="--no-sources --wheel"

- name: Test Langflow Base CLI
run: |
Expand Down
20 changes: 15 additions & 5 deletions .secrets.baseline
Original file line number Diff line number Diff line change
Expand Up @@ -881,6 +881,16 @@
"is_secret": false
}
],
"src/backend/base/langflow/inputs/input_mixin.py": [
{
"type": "Secret Keyword",
"filename": "src/backend/base/langflow/inputs/input_mixin.py",
"hashed_secret": "3442496b96dd01591a8cd44b1eec1368ab728aba",
"is_verified": false,
"line_number": 22,
"is_secret": false
}
],
"src/backend/base/langflow/schema/table.py": [
{
"type": "Secret Keyword",
Expand Down Expand Up @@ -1403,23 +1413,23 @@
"filename": "src/frontend/src/constants/constants.ts",
"hashed_secret": "19a2fbd0dd38b4097f419c962342ef5e109eab07",
"is_verified": false,
"line_number": 737,
"line_number": 755,
"is_secret": false
},
{
"type": "Secret Keyword",
"filename": "src/frontend/src/constants/constants.ts",
"hashed_secret": "3806954324550e26ef5de85d007f1746825a073c",
"is_verified": false,
"line_number": 738,
"line_number": 756,
"is_secret": false
},
{
"type": "Secret Keyword",
"filename": "src/frontend/src/constants/constants.ts",
"hashed_secret": "c04f8fbf55c9096907a982750b1c6b0e4c1dd658",
"is_verified": false,
"line_number": 913,
"line_number": 931,
"is_secret": false
}
],
Expand All @@ -1429,7 +1439,7 @@
"filename": "src/frontend/src/controllers/API/helpers/constants.ts",
"hashed_secret": "665b1e3851eefefa3fb878654292f16597d25155",
"is_verified": false,
"line_number": 5,
"line_number": 6,
"is_secret": false
}
],
Expand Down Expand Up @@ -1528,5 +1538,5 @@
}
]
},
"generated_at": "2025-12-02T04:40:43Z"
"generated_at": "2025-12-16T12:44:21Z"
}
2 changes: 1 addition & 1 deletion docs/docs/Agents/mcp-server.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ For more information, see your OAuth provider's documentation.
| **Host** | OAuth server host | MCP Composer default. | `localhost` |
| **Port** | OAuth server port | MCP Composer default. | `9000` |
| **Server URL** | Full OAuth server URL | Combines the MCP Composer default OAuth host and port. | `http://localhost:9000` |
| **Callback Path** | OAuth callback URL on your server | You define this address during OAuth app registration. | `http://localhost:9000/auth/idaas/callback` |
| **Callback URL** | OAuth callback URL on your server | You define this full URL during OAuth app registration. This must match exactly what you register with your OAuth provider. | `http://localhost:9000/auth/idaas/callback` |
| **Client ID** | Your OAuth client identifier | From your OAuth provider. | `Ov23li9vx2grVL61qjb` |
| **Client Secret** | Your OAuth client secret | From your OAuth provider. | `1234567890abcdef1234567890abcdef12345678` |
| **Authorization URL** | OAuth authorization endpoint | From your OAuth provider. | `https://github.com/login/oauth/authorize` |
Expand Down
7 changes: 7 additions & 0 deletions docs/openapi/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4302,6 +4302,13 @@ components:
- type: string
- type: 'null'
title: Oauth Callback Path
deprecated: true
description: 'Deprecated: Use oauth_callback_url instead'
oauth_callback_url:
anyOf:
- type: string
- type: 'null'
title: Oauth Callback Url
oauth_client_id:
anyOf:
- type: string
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ dependencies = [
"fastparquet>=2024.11.0,<2025.0.0",
"traceloop-sdk>=0.43.1,<1.0.0",
"vlmrun[all]>=0.2.0",
"cuga~=0.1.11",
"cuga~=0.2.6",
"agent-lifecycle-toolkit~=0.4.4",
"astrapy>=2.1.0,<3.0.0",
"aioboto3>=15.2.0,<16.0.0"
Expand Down
1 change: 0 additions & 1 deletion src/backend/base/langflow/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,6 @@ def set_var_for_macos_issue() -> None:
os.environ["OBJC_DISABLE_INITIALIZE_FORK_SAFETY"] = "YES"
# https://stackoverflow.com/questions/75747888/uwsgi-segmentation-fault-with-flask-python-app-behind-nginx-after-running-for-2 # noqa: E501
os.environ["no_proxy"] = "*" # to avoid error with gunicorn
logger.debug("Set OBJC_DISABLE_INITIALIZE_FORK_SAFETY to YES to avoid error")


def wait_for_server_ready(host, port, protocol) -> None:
Expand Down
13 changes: 10 additions & 3 deletions src/backend/base/langflow/api/log_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
from http import HTTPStatus
from typing import Annotated, Any

from fastapi import APIRouter, HTTPException, Query, Request
from fastapi import APIRouter, Depends, HTTPException, Query, Request
from fastapi.responses import JSONResponse, StreamingResponse
from lfx.log.logger import log_buffer

from langflow.services.auth.utils import get_current_active_user

log_router = APIRouter(tags=["Log"])


Expand Down Expand Up @@ -50,12 +52,13 @@ async def event_generator(request: Request):
await asyncio.sleep(1)


@log_router.get("/logs-stream")
@log_router.get("/logs-stream", dependencies=[Depends(get_current_active_user)])
async def stream_logs(
request: Request,
):
"""HTTP/2 Server-Sent-Event (SSE) endpoint for streaming logs.

Requires authentication to prevent exposure of sensitive log data.
It establishes a long-lived connection to the server and receives log messages in real-time.
The client should use the header "Accept: text/event-stream".
"""
Expand All @@ -69,12 +72,16 @@ async def stream_logs(
return StreamingResponse(event_generator(request), media_type="text/event-stream")


@log_router.get("/logs")
@log_router.get("/logs", dependencies=[Depends(get_current_active_user)])
async def logs(
lines_before: Annotated[int, Query(description="The number of logs before the timestamp or the last log")] = 0,
lines_after: Annotated[int, Query(description="The number of logs after the timestamp")] = 0,
timestamp: Annotated[int, Query(description="The timestamp to start getting logs from")] = 0,
):
"""Retrieve application logs with authentication required.

SECURITY: Logs may contain sensitive information and require authentication.
"""
global log_buffer # noqa: PLW0602
if log_buffer.enabled() is False:
raise HTTPException(
Expand Down
4 changes: 4 additions & 0 deletions src/backend/base/langflow/api/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
login_router,
mcp_projects_router,
mcp_router,
model_options_router,
models_router,
monitor_router,
openai_responses_router,
projects_router,
Expand Down Expand Up @@ -53,6 +55,8 @@
router_v1.include_router(voice_mode_router)
router_v1.include_router(mcp_projects_router)
router_v1.include_router(openai_responses_router)
router_v1.include_router(models_router)
router_v1.include_router(model_options_router)

router_v2.include_router(files_router_v2)
router_v2.include_router(mcp_router_v2)
Expand Down
2 changes: 2 additions & 0 deletions src/backend/base/langflow/api/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
has_api_terms,
parse_exception,
parse_value,
raise_error_if_astra_cloud_env,
remove_api_keys,
validate_is_component,
verify_public_flow_and_get_user,
Expand Down Expand Up @@ -70,6 +71,7 @@
"has_api_terms",
"parse_exception",
"parse_value",
"raise_error_if_astra_cloud_env",
"remove_api_keys",
"validate_is_component",
"verify_public_flow_and_get_user",
Expand Down
12 changes: 12 additions & 0 deletions src/backend/base/langflow/api/utils/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from lfx.graph.graph.base import Graph
from lfx.log.logger import logger
from lfx.services.deps import injectable_session_scope, injectable_session_scope_readonly, session_scope
from lfx.utils.validate_cloud import raise_error_if_astra_cloud_disable_component
from sqlalchemy import delete
from sqlmodel.ext.asyncio.session import AsyncSession

Expand Down Expand Up @@ -40,6 +41,9 @@
# DbSessionReadOnly for read-only operations (no auto-commit, reduces lock contention)
DbSessionReadOnly = Annotated[AsyncSession, Depends(injectable_session_scope_readonly)]

# Message to raise if we're in an Astra cloud environment and a component or endpoint is not supported
disable_endpoint_in_astra_cloud_msg = "This endpoint is not supported in Astra cloud environment."


class EventDeliveryType(str, Enum):
STREAMING = "streaming"
Expand Down Expand Up @@ -412,3 +416,11 @@ def extract_global_variables_from_headers(headers) -> dict[str, str]:
logger.exception("Failed to extract global variables from headers: %s", exc)

return variables


def raise_error_if_astra_cloud_env():
"""Raise an error if we're in an Astra cloud environment."""
try:
raise_error_if_astra_cloud_disable_component(disable_endpoint_in_astra_cloud_msg)
except Exception as e:
raise HTTPException(status_code=403, detail=str(e)) from e
10 changes: 9 additions & 1 deletion src/backend/base/langflow/api/utils/mcp/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
"""MCP utilities for Langflow."""

from langflow.api.utils.mcp.config_utils import auto_configure_starter_projects_mcp, get_project_sse_url, get_url_by_os
from langflow.api.utils.mcp.config_utils import (
auto_configure_starter_projects_mcp,
get_composer_streamable_http_url,
get_project_sse_url,
get_project_streamable_http_url,
get_url_by_os,
)

__all__ = [
"auto_configure_starter_projects_mcp",
"get_composer_streamable_http_url",
"get_project_sse_url",
"get_project_streamable_http_url",
"get_url_by_os",
]
Loading