Files
langflow/pyproject.toml
Cristhian Zanforlin Lousa 8550f11298 feat: Add customizable HTTP headers support to MCPToolsComponent (#11023)
* test(headers): add comprehensive tests for headers functionality in MCP component to ensure correct behavior and validation of header inputs

feat(mcp_component.py): add headers input to MCPToolsComponent for customizable HTTP headers in requests

This change allows users to specify HTTP headers, such as
Authorization, for requests to the MCP server, enhancing
authentication and flexibility in server interactions.

* [autofix.ci] apply automated fixes

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

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

* fix market research input found

* cherry-pick changes

* chore(release): Bump version to 1.7.2 (#11208)

* change langflow base version

* fix: publish amd fe/be images

* fix: build-lfx from test-cross-platform needs

remove build-lfx from test-cross-platform needs

* [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: Adam Aghili <Adam.Aghili@ibm.com>
2026-01-08 13:26:06 +00:00

506 lines
16 KiB
TOML

[project]
name = "langflow"
version = "1.7.2"
description = "A Python package with a built-in web application"
requires-python = ">=3.10,<3.14"
license = "MIT"
keywords = ["nlp", "langchain", "openai", "gpt", "gui"]
readme = "README.md"
maintainers = [
{ name = "Carlos Coelho", email = "carlos@langflow.org" },
{ name = "Cristhian Zanforlin", email = "cristhian.lousa@gmail.com" },
{ name = "Gabriel Almeida", email = "gabriel@langflow.org" },
{ name = "Lucas Eduoli", email = "lucaseduoli@gmail.com" },
{ name = "Otávio Anovazzi", email = "otavio2204@gmail.com" },
{ name = "Rodrigo Nader", email = "rodrigo@langflow.org" },
{ name = "Italo dos Anjos", email = "italojohnnydosanjos@gmail.com" },
]
# Define your main dependencies here
dependencies = [
"langflow-base~=0.7.2",
"beautifulsoup4==4.12.3",
"google-search-results>=2.4.1,<3.0.0",
"google-api-python-client==2.154.0",
"huggingface-hub[inference]>=0.23.2,<1.0.0",
"networkx==3.4.2",
"fake-useragent==1.5.1",
"pyarrow==19.0.0",
"wikipedia==1.4.0",
"qdrant-client==1.9.2",
"weaviate-client>=4.10.2,<5.0.0",
"faiss-cpu==1.9.0.post1",
"types-cachetools>=5.5.0.20240820,<6.0.0",
"pymongo==4.10.1",
"supabase>=2.6.0,<3.0.0",
"certifi>=2023.11.17,<2025.0.0",
'fastavro==1.9.7; python_version < "3.13"',
'fastavro>=1.9.8,<2.0.0; python_version >= "3.13"',
"redis>=5.2.1,<6.0.0",
"metaphor-python==0.1.23",
'pywin32>=307,<400; sys_platform == "win32"',
"langfuse==2.53.9",
"metal_sdk==2.5.1",
"MarkupSafe==3.0.2",
"boto3>=1.34.162,<2.0.0",
"numexpr==2.10.2",
"qianfan==0.3.5",
"pgvector==0.3.6",
"langchain==0.3.23",
"elasticsearch==8.16.0",
"pytube==15.0.0",
"dspy-ai==2.5.41",
"datasets>2.14.7,<4.0.0",
"assemblyai==0.35.1",
"litellm>=1.60.2,<2.0.0",
"chromadb>=1.0.0,<2.0.0",
"zep-python==2.0.2",
"youtube-transcript-api>=1.0.0,<2.0.0",
"Markdown==3.7",
"upstash-vector==0.6.0",
"GitPython==3.1.43",
"kubernetes==31.0.0",
"json_repair==0.30.3",
"langwatch>=0.2.11,<0.3.0",
"langsmith>=0.3.42,<1.0.0",
"yfinance==0.2.50",
"wolframalpha==5.1.3",
"astra-assistants[tools]>=2.2.13,<3.0.0",
"composio==0.9.2",
"composio-langchain==0.9.2",
"spider-client==0.1.24",
"nltk==3.9.1",
"lark==1.2.2",
"jq==1.8.0",
"pydantic-settings>=2.2.0,<3.0.0",
"duckduckgo_search==7.2.1",
"opensearch-py==2.8.0",
"langchain-google-genai==2.0.6",
"langchain-cohere>=0.3.3,<1.0.0",
"langchain-huggingface==0.3.1",
"langchain-anthropic==0.3.14",
"langchain-astradb>=0.6.1,<1.0.0",
"langchain-openai>=0.2.12,<1.0.0",
"langchain-google-vertexai>=2.0.7,<3.0.0",
"langchain-groq==0.2.1",
"langchain-pinecone>=0.2.8,<1.0.0",
"langchain-mistralai==0.2.3",
"langchain-chroma>=0.2.6,<1.0.0",
"langchain-aws>=0.2.33,<1.0.0",
"langchain-unstructured==0.1.5",
"langchain-milvus==0.1.7",
"langchain-mongodb==0.7.0",
"langchain-nvidia-ai-endpoints==0.3.8",
"langchain-google-calendar-tools==0.0.1",
"langchain-google-community>=2.0.3,<3.0.0",
"langchain-elasticsearch>=0.3.0,<1.0.0",
"langchain-ollama==0.3.10",
"langchain-sambanova==0.1.0",
"langchain-community>=0.3.21,<1.0.0",
"sqlalchemy[aiosqlite]>=2.0.38,<3.0.0",
"atlassian-python-api==3.41.16",
"mem0ai==0.1.34",
"needle-python>=0.4.0,<1.0.0",
"aiofile>=3.9.0,<4.0.0",
"sseclient-py==1.8.0",
"arize-phoenix-otel>=0.6.1,<1.0.0",
"openinference-instrumentation-langchain>=0.1.29,<0.1.52",
# "crewai>=0.126.0",
"fastmcp==2.13.0",
"mcp>=1.17.0,<2.0.0",
"uv==0.7.20",
"scipy>=1.14.1,<1.16.2",
"scrapegraph-py>=1.12.0,<2.0.0",
"pydantic-ai>=0.0.19,<1.0.0",
"smolagents>=1.8.0,<2.0.0",
"apify-client>=1.8.1,<2.0.0",
"langchain-graph-retriever==0.8.0",
"graph-retriever==0.8.0",
"ibm-watsonx-ai>=1.3.1,<2.0.0",
"langchain-ibm>=0.3.8",
"opik>=1.6.3,<2.0.0",
"openai>=1.68.2,<2.0.0",
"cleanlab-tlm>=1.1.2,<2.0.0",
"gassist>=0.0.1; sys_platform == 'win32'",
"twelvelabs>=0.4.7,<1.0.0",
"docling-core>=2.36.1,<3.0.0",
"docling>=2.36.1,<3.0.0; sys_platform != 'darwin' or platform_machine != 'x86_64'",
"mlx>=0.29.0; sys_platform == 'darwin' and platform_machine == 'arm64' and python_version >= '3.12'",
"mlx-vlm==0.3.3; sys_platform == 'darwin' and platform_machine == 'arm64' and python_version >= '3.12'",
"easyocr>=1.7.2,<2.0.0; sys_platform != 'darwin' or platform_machine != 'x86_64'",
"filelock>=3.18.0,<4.0.0",
"jigsawstack==0.2.7",
"structlog>=25.4.0,<26.0.0",
"cryptography>=43.0.1,<44.0.0",
"aiosqlite==0.21.0",
"fastparquet>=2024.11.0,<2025.0.0",
"traceloop-sdk>=0.43.1,<1.0.0",
"vlmrun[all]>=0.2.0",
"cuga~=0.2.6",
"langchain-mcp-adapters>=0.1.14,<0.2.0", # Pin to avoid incompatibility with langchain-core<1.0.0
"agent-lifecycle-toolkit~=0.4.4",
"astrapy>=2.1.0,<3.0.0",
"aioboto3>=15.2.0,<16.0.0"
]
[dependency-groups]
dev = [
"pytest-instafail>=0.5.0",
"types-redis>=4.6.0.5",
"ipykernel>=6.29.0",
"mypy>=1.11.0",
"ruff>=0.12.7",
"httpx>=0.28.1",
"pytest>=8.2.0",
"types-requests>=2.32.0",
"requests>=2.32.0",
"pytest-cov>=5.0.0",
"pandas-stubs>=2.1.4.231227",
"types-pillow>=10.2.0.20240213",
"types-pyyaml>=6.0.12.8",
"types-python-jose>=3.3.4.8",
"types-passlib>=1.7.7.13",
"pytest-mock>=3.14.0",
"pytest-xdist>=3.6.0",
"types-pywin32>=306.0.0.4",
"types-google-cloud-ndb>=2.2.0.0",
"pytest-sugar>=1.0.0",
"respx>=0.21.1",
"pytest-asyncio>=0.23.0",
"pytest-profiling>=1.7.0",
"pre-commit>=3.7.0",
"vulture>=2.11",
"dictdiffer>=0.9.0",
"pytest-split>=0.9.0",
"pytest-flakefinder>=1.1.0",
"types-markdown>=3.7.0.20240822",
"packaging>=24.1,<25.0",
"asgi-lifespan>=2.1.0",
"pytest-github-actions-annotate-failures>=0.2.0",
"blockbuster>=1.5.20,<1.6",
"types-aiofiles>=24.1.0.20240626",
"codeflash>=0.8.4",
"hypothesis>=6.123.17",
"locust~=2.40.5",
"pytest-rerunfailures>=15.0",
"scrapegraph-py>=1.10.2",
"pydantic-ai>=0.0.19",
'elevenlabs==1.58.1; python_version == "3.12"',
'elevenlabs>=1.52.0; python_version != "3.12"',
"faker>=37.0.0",
"pytest-timeout>=2.3.1",
"pyyaml>=6.0.2",
"pyleak>=0.1.14",
]
[tool.uv.sources]
langflow-base = { workspace = true }
langflow = { workspace = true }
lfx = { workspace = true }
[tool.uv.workspace]
members = [
"src/backend/base",
".",
"src/lfx",
]
[tool.hatch.build.targets.wheel]
packages = ["src/backend/langflow"]
[project.urls]
Repository = "https://github.com/langflow-ai/langflow"
Documentation = "https://docs.langflow.org"
[project.optional-dependencies]
docling = [
"langchain-docling>=1.1.0",
"tesserocr>=2.8.0",
"rapidocr-onnxruntime>=1.4.4",
"ocrmac>=1.0.0; sys_platform == 'darwin'",
]
audio = [
"webrtcvad>=2.0.10",
]
couchbase = [
"couchbase>=4.2.1"
]
cassio = [
"cassio>=0.1.7"
]
local = [
"llama-cpp-python~=0.2.0",
"sentence-transformers>=2.3.1",
"ctransformers>=0.2.10"
]
clickhouse-connect = [
"clickhouse-connect==0.7.19"
]
nv-ingest = [
# NOTE: These must be removed in order to run `uv lock --upgrade` or `uv sync --upgrade`
# due to incompatibility with <3.12 and how uv handles lockfile creation.
# If upgrading, ensure `uv lock` and `uv sync` are run after upgrade with these,
# and that afterward, the lockfile contains nv-ingest.
"nv-ingest-api==25.6.2,<26.0.0 ; python_version >= '3.12'",
"nv-ingest-client==25.6.3,<26.0.0 ; python_version >= '3.12'",
]
postgresql = [
"sqlalchemy[postgresql_psycopg2binary]>=2.0.38,<3.0.0",
"sqlalchemy[postgresql_psycopg]>=2.0.38,<3.0.0",
]
[tool.uv]
override-dependencies = [
# temporary force a newer python-pptx
"python-pptx>=1.0.2",
]
[project.scripts]
langflow = "langflow.langflow_launcher:main"
[tool.codespell]
skip = '.git,*.pdf,*.svg,*.pdf,*.yaml,*.ipynb,poetry.lock,*.min.js,*.css,package-lock.json,*.trig.,**/node_modules/**,./stuff/*,*.csv'
# Ignore latin etc
ignore-regex = '.*(Stati Uniti|Tense=Pres).*'
[tool.pytest.ini_options]
timeout = 150
timeout_method = "signal"
minversion = "6.0"
testpaths = ["src/backend/tests", "src/lfx/tests"]
console_output_style = "progress"
filterwarnings = ["ignore::DeprecationWarning", "ignore::ResourceWarning"]
log_cli = true
log_cli_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)"
log_cli_date_format = "%Y-%m-%d %H:%M:%S"
markers = [
"async_test",
"api_key_required",
"no_blockbuster",
"benchmark",
"unit: Unit tests",
"integration: Integration tests",
"slow: Slow-running tests"
]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
addopts = "-p no:benchmark"
[tool.coverage.run]
command_line = """
-m pytest --ignore=tests/integration
--cov --cov-report=term --cov-report=html
--instafail -ra -n auto -m "not api_key_required"
"""
source = ["src/backend/base/langflow/"]
omit = ["*/alembic/*", "tests/*", "*/__init__.py"]
[tool.coverage.report]
sort = "Stmts"
skip_empty = true
show_missing = false
ignore_errors = true
[tool.coverage.html]
directory = "coverage"
[tool.ruff]
target-version = "py310"
exclude = ["src/backend/base/langflow/alembic/*", "src/frontend/tests/assets/*", "src/lfx/src/lfx/_assets/component_index.json"]
line-length = 120
[tool.ruff.lint]
flake8-annotations.mypy-init-return = true
flake8-bugbear.extend-immutable-calls = [
"fastapi.Depends",
"fastapi.File",
"fastapi.Query",
"typer.Option",
]
flake8-type-checking.runtime-evaluated-base-classes = [
"pydantic.BaseModel",
"typing.TypedDict", # Needed by fastapi
"typing_extensions.TypedDict", # Needed by fastapi
]
pydocstyle.convention = "google"
select = ["ALL"]
ignore = [
"C90", # McCabe complexity
"CPY", # Missing copyright
"COM812", # Messes with the formatter
"ERA", # Eradicate commented-out code
"FIX002", # Line contains TODO
"ISC001", # Messes with the formatter
"PERF203", # Rarely useful
"PLR09", # Too many something (arg, statements, etc)
"RUF012", # Pydantic models are currently not well detected. See https://github.com/astral-sh/ruff/issues/13630
"TD002", # Missing author in TODO
"TD003", # Missing issue link in TODO
"TRY301", # A bit too harsh (Abstract `raise` to an inner function)
"PLC0415", # Inline imports
"D10", # Missing docstrings
"PLW1641", # Object does not implement `__hash__` method (mutable objects shouldn't be hashable)
# Rules that are TODOs
"ANN"
]
# Preview rules that are not yet activated
external = ["RUF027"]
[tool.ruff.lint.per-file-ignores]
"scripts/*" = ["D1", "INP", "T201"]
"src/backend/base/langflow/alembic/versions/*" = ["INP001", "D415", "PGH003"]
"src/backend/base/langflow/custom/__init__.py" = [
"I001", # Import order affects initialization - must import custom module first
]
"src/backend/base/langflow/api/v1/*" = [
"TCH", # FastAPI needs to evaluate types at runtime
]
"src/backend/base/langflow/api/v2/*" = [
"TCH", # FastAPI needs to evaluate types at runtime
]
"src/backend/base/langflow/__main__.py" = [
"B008", # Typer CLI requires function calls in defaults
]
"src/backend/base/langflow/services/cache/*" = [
"S301", # Pickle usage is intentional for caching
]
"src/backend/base/langflow/services/tracing/*" = [
"SLF001", # Third-party library private member access (langwatch, opik)
]
"src/lfx/src/lfx/base/curl/parse.py" = [
"S105", # False positive: 'token' variable name, not a password
]
"src/lfx/src/lfx/base/mcp/util.py" = [
"SLF001", # MCP library private member access
]
"src/lfx/src/lfx/cli/common.py" = [
"S104", # Intentional binding to all interfaces for server
"S105", # False positive: GITHUB_TOKEN_ENV is an env var name
]
"src/lfx/src/lfx/components/__init__.py" = [
"SLF001", # Accessing _dynamic_imports from modules
]
"src/lfx/src/lfx/components/data/save_file.py" = [
"SLF001", # Google API client private member access
]
"src/lfx/src/lfx/components/datastax/astradb_vectorstore.py" = [
"S110", # Try-except-pass for optional metadata
]
"src/lfx/src/lfx/components/google/google_generative_ai_embeddings.py" = [
"SLF001", # Google AI library private member access
]
"src/lfx/src/lfx/components/knowledge_bases/retrieval.py" = [
"SLF001", # Chroma client private member access
]
"src/lfx/src/lfx/components/mongodb/mongodb_atlas.py" = [
"SLF001", # MongoDB collection private member access
]
"src/lfx/src/lfx/components/tools/{python_code_structured_tool.py,searxng.py}" = [
"S102", # Use of exec/eval for dynamic code execution
"SLF001", # Component internal member access
]
"src/lfx/src/lfx/components/vectorstores/astradb.py" = [
"S110", # Try-except-pass for optional metadata
]
"src/lfx/src/lfx/custom/{code_parser/code_parser.py,validate.py}" = [
"S102", # Use of exec for code validation
]
"src/lfx/src/lfx/custom/custom_component/component.py" = [
"SLF001", # Component internal state management
]
"src/lfx/src/lfx/custom/directory_reader/directory_reader.py" = [
"SLF001", # Component introspection
]
"src/lfx/src/lfx/custom/utils.py" = [
"SLF001", # Component code analysis
]
"src/lfx/src/lfx/graph/graph/ascii.py" = [
"SLF001", # Grandalf library private member access
]
"src/lfx/src/lfx/inputs/input_mixin.py" = [
"S105", # False positive: PASSWORD is a type constant
]
"src/lfx/src/lfx/schema/table.py" = [
"S105", # False positive: PASSWORD is a formatter type
]
"src/lfx/src/lfx/services/mcp_composer/service.py" = [
"S104", # Intentional binding to all interfaces for server
"S110", # Try-except-pass for optional error logging
]
"src/backend/tests/*" = [
"D1",
"PLR2004",
"S101",
"SLF001",
"BLE001", # allow broad-exception catching in tests
]
"src/backend/base/langflow/tests/*" = [
"D1",
"PLR2004",
"S101",
"SLF001",
"BLE001", # allow broad-exception catching in tests
]
"src/lfx/tests/*" = [
"D1",
"PLR2004",
"S101",
"SLF001",
"BLE001", # allow broad-exception catching in tests
"S104", # Binding to all interfaces (test servers)
"S108", # Insecure temp file usage (safe in tests)
]
"src/backend/tests/locust/*" = [
"D1", # Missing docstrings (CLI tools don't need full docstrings)
"T201", # Print statements (needed for CLI output)
"S603", # Subprocess calls (needed for running commands)
"S607", # Starting process with partial executable path
"S104", # Binding to all interfaces (needed for Langflow server)
"S105", # Hardcoded passwords (test credentials)
"FBT001", # Boolean-typed positional arguments (common in CLI)
"FBT002", # Boolean default arguments (common in CLI tools)
"TRY002", # Custom exceptions (generic exceptions OK for CLI)
"TRY003", # Long exception messages (descriptive errors for users)
"TRY300", # Consider moving to else block (return patterns)
"EM101", # String literals in exceptions (user-facing messages)
"EM102", # F-string literals in exceptions (user-facing messages)
"EXE001", # Shebang without executable (may be run via python)
"D415", # First line punctuation (CLI docstrings)
"F401", # Unused imports (imports for availability checking)
"PTH123", # Use Path.open (open() is fine for simple cases)
"PTH107", # Use Path.unlink (os.remove is fine for simple cases)
"PTH207", # Use Path.glob (glob.glob is fine for simple cases)
"B007", # Unused loop variables (tuple unpacking)
"PLW0602", # Global variable usage (needed for locust state)
"PLW0603", # Global variable updates (needed for locust state)
"DTZ005", # Datetime without timezone (local time is fine for logs)
"G004", # Logging f-strings (detailed error logging)
"SIM102", # Nested if statements (readability over optimization)
"E501", # Line too long (some CLI commands are naturally long)
]
[tool.ruff.lint.flake8-builtins]
builtins-allowed-modules = [ "io", "logging", "socket"]
[tool.mypy]
plugins = ["pydantic.mypy"]
follow_imports = "skip"
disable_error_code = ["type-var"]
namespace_packages = true
mypy_path = "langflow"
ignore_missing_imports = true
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"