Files
langflow/pyproject.toml
Gabriel Luiz Freitas Almeida 7d4ffbcbf5 feat: add support for Langchain 1.0 (#11114)
* feat: upgrade to LangChain 1.0

- langchain ~=1.2.0
- langchain-core ~=1.2.3
- langchain-community ~=0.4.1

Updated all langchain-* integration packages to versions compatible with langchain-core 1.0+.

* feat(lfx): add langchain-classic dependency for legacy agent classes

LangChain 1.0 removed AgentExecutor and related classes to langchain-classic.
This adds the dependency to maintain backward compatibility.

* refactor(lfx): update imports for LangChain 1.0 compatibility

- Move AgentExecutor, agent creators from langchain to langchain_classic
- Move AsyncCallbackHandler from langchain.callbacks to langchain_core.callbacks
- Move Chain, BaseChatMemory from langchain to langchain_classic
- Update LANGCHAIN_IMPORT_STRING for code generation

* fix(lfx): make sqlalchemy import lazy in session_scope

LangChain 1.0 no longer includes sqlalchemy as a transitive dependency.
Move the import inside the function where it's used to avoid import errors
when sqlalchemy is not installed.

* chore: update uv.lock for langchain-classic

* feat: enable nv-ingest optional dependencies for langchain 1.0

- Uncomment nv-ingest-api and nv-ingest-client, update to >=26.1.0
  (no longer has openai version conflict)
- Bump datasets from <4.0.0 to <5.0.0 to allow fsspec>=2025.5.1
  required by nv-ingest
- Update mlx-vlm TODO comment with accurate blocking reason

* chore: update nv-ingest to 26.1.1

nv-ingest 26.1.1 removes the openai dependency, resolving the
conflict with langchain-openai>=1.0.0 (which requires openai>=1.109.1).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: enable mlx and mlx-vlm dependencies for langchain 1.0

opencv-python 4.13+ now supports numpy>=2, resolving the conflict
with langchain-aws>=1.0.0 (which requires numpy>=2.2 on Python 3.12+).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* style: fix import order in callback.py

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: update imports to use langchain_classic for agent modules

* [autofix.ci] apply automated fixes

* fix: remove .item() calls in knowledge_bases.py

* fix(lfx): import BaseMemory from langchain_classic for langchain 1.0

* [autofix.ci] apply automated fixes

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

* refactor: update deprecated langchain imports for langchain 1.0

- langchain.callbacks.base -> langchain_core.callbacks.base
- langchain.tools -> langchain_core.tools
- langchain.schema -> langchain_core.messages/documents
- langchain.chains -> langchain_classic.chains
- langchain.retrievers -> langchain_classic.retrievers
- langchain.memory -> langchain_classic.memory
- langchain.globals -> langchain_core.globals
- langchain.docstore -> langchain_core.documents
- langchain.prompts -> langchain_core.prompts

Also simplified GoogleGenerativeAIEmbeddingsComponent to use native
langchain-google-genai 4.x which now supports output_dimensionality.

* [autofix.ci] apply automated fixes

* fix: add _to_int helper for pandas sum() compatibility across Python versions

* fix: update langfuse>=3.8.0 and fix cuga_agent.py (#11519)

* fix: update langfuse>=3.8.0 and fix cuga_agent.py

* [autofix.ci] apply automated fixes

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

---------

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

* feat: implement LangFuseTracer for langfuse v3 API compatibility and add unit tests

* fix: upgrade cuga to 0.2.9 for langchain 1.0 compatibility

* fix: improve error handling and return value in get_langchain_callback method

* fix: update package versions for compatibility and improvements

* [autofix.ci] apply automated fixes

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

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

* fix: update langwatch dependency to version 0.10.0 for compatibility

* fix: update environment variable for Langfuse host to LANGFUSE_BASE_URL

* Update dependency versions in Youtube Analysis project

- Downgraded googleapiclient from 2.188.0 to 2.154.0
- Updated langchain_core from 1.2.7 to 1.2.9
- Updated fastapi from 0.128.1 to 0.128.5
- Downgraded youtube_transcript_api from 1.2.4 to 1.2.3
- Changed langchain_core version from 1.2.7 to 0.3.81
- Cleared input_types in model selection

# Conflicts:
#	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/Financial Report Parser.json
#	src/backend/base/langflow/initial_setup/starter_projects/Hybrid Search RAG.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/Knowledge Retrieval.json
#	src/backend/base/langflow/initial_setup/starter_projects/Market Research.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/News Aggregator.json
#	src/backend/base/langflow/initial_setup/starter_projects/Nvidia Remix.json
#	src/backend/base/langflow/initial_setup/starter_projects/Pokédex Agent.json
#	src/backend/base/langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json
#	src/backend/base/langflow/initial_setup/starter_projects/Price Deal Finder.json
#	src/backend/base/langflow/initial_setup/starter_projects/Research Agent.json
#	src/backend/base/langflow/initial_setup/starter_projects/Research Translation Loop.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/Search agent.json
#	src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents.json
#	src/backend/base/langflow/initial_setup/starter_projects/Simple Agent.json
#	src/backend/base/langflow/initial_setup/starter_projects/Social Media Agent.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

* fix: handle InvalidRequestError during session rollback

* update projects

* ️ Speed up method `LangFuseTracer.end` by 141% in PR #11114 (`feat/langchain-1.0`) (#11682)

Optimize LangFuseTracer.end 


The optimized code achieves a **140% speedup** (8.23ms → 3.42ms) through two complementary optimizations:

## 1. Fast-path for Common Primitives in `serialize()`

**What changed:** Added an early-exit check that returns immutable primitives (`str`, `int`, `float`, `bool`) directly when no truncation or special handling is needed:

```python
if max_length is None and max_items is None and not to_str:
    if isinstance(obj, (str, int, float, bool)):
        return obj
```

**Why it's faster:** 
- The profiler shows `_serialize_dispatcher()` consumed **81.5% of runtime** in the original code (40.4ms out of 49.6ms)
- This optimization reduced dispatcher calls from **8,040 to 1,013** (~87% reduction), as primitives now bypass the expensive pattern-matching dispatcher entirely
- The fast-path check itself is extremely cheap: just two quick conditionals and an `isinstance()` check against a tuple of built-in types

**When it helps:** This optimization is particularly effective for workloads with many primitive values in dictionaries and lists—which is exactly what the tracing use case provides (metadata dicts with strings, numbers, booleans).

## 2. Eliminate Redundant Serialization in `LangFuseTracer.end()`

**What changed:** Serialize `inputs`, `outputs`, and `metadata` once each, then reuse the results:

```python
inputs_ser = serialize(inputs)
outputs_ser = serialize(outputs)
metadata_ser = serialize(metadata) if metadata else None
```

**Why it's faster:**
- The original code called `serialize()` **6 times total** (3 for `.update()` + 3 for `.update_trace()`)
- The optimized version calls it **3 times**, then passes the cached results
- Profiler shows the time spent in `serialize()` calls dropped from **72.2ms to 31.2ms** (~57% reduction)
- This is pure elimination of redundant work—the same dictionaries were being serialized twice with identical results

**Impact on workloads:** The `test_end_multiple_iterations_calls_end_each_time` test (500 iterations) demonstrates this matters in hot paths. If `LangFuseTracer.end()` is called frequently during flow execution, avoiding duplicate serialization provides compounding benefits.

## Combined Effect

Both optimizations target the serialization bottleneck from different angles:
- The fast-path reduces the cost of *each* serialize call by ~75% for primitive-heavy data
- The caching reduces the *number* of serialize calls by 50%

Together, they deliver the observed 140% speedup, with the optimization being especially effective for the common case of metadata dictionaries containing mostly primitive types.

Co-authored-by: codeflash-ai[bot] <148906541+codeflash-ai[bot]@users.noreply.github.com>

* refactor: reorder imports and simplify serialization logic for primitives

* [autofix.ci] apply automated fixes

* fix: update google dependency version to 0.4.0 in component_index.json

* [autofix.ci] apply automated fixes

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

* fix: pin z3-solver<4.15.7 to restore Linux wheels for Docker build

z3-solver 4.15.7 dropped manylinux wheels, causing the Docker build to
fail when trying to compile from source. Temporary pin until codeflash
is removed.

* [autofix.ci] apply automated fixes

* fix: update google dependency version to 0.4.0

* [autofix.ci] apply automated fixes

* fix: update langchain_core version to 1.2.17 in multiple starter project JSON files

* [autofix.ci] apply automated fixes

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

* fix: update deprecated langchain imports to langchain_classic for 1.0 compatibility

* fix: align langchain-chroma version in optional chroma dependency group

* fix: nightly now properly gets 1.9.0 branch (#12215)

before it was attempting to pull release-notes as letters are alphanumerically after numbers when we sort -V then grab tail
now we only look at branch names that follow the pattern '^release-[0-9]+\.[0-9]+\.[0-9]+$'

* docs: add search icon (#12216)

add-back-svg

* [autofix.ci] apply automated fixes

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

* feat: fall back to langchain_classic for pre-1.0 imports in user components

Old flows using removed langchain imports (e.g. langchain.memory,
langchain.schema, langchain.chains) now resolve via langchain_classic
at two levels: module-level for entirely removed modules, and
attribute-level for removed attributes in modules that still exist
in langchain 1.0. New langchain 1.0 imports are never affected since
fallbacks only trigger on import failure.

* urllib parse module import bug

* Update component_index.json

* [autofix.ci] apply automated fixes

* chore: rebuild component index

* [autofix.ci] apply automated fixes

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Harold Ship <harold.ship@gmail.com>
Co-authored-by: codeflash-ai[bot] <148906541+codeflash-ai[bot]@users.noreply.github.com>
Co-authored-by: Adam-Aghili <149833988+Adam-Aghili@users.noreply.github.com>
Co-authored-by: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
Co-authored-by: Eric Hare <ericrhare@gmail.com>
2026-03-19 18:56:10 +00:00

400 lines
13 KiB
TOML

[project]
name = "langflow"
version = "1.9.0"
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[complete]~=0.9.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.13.1",
"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",
"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",
"types-cachetools>=5.5.0.20240820",
"pyyaml>=6.0.2",
"pyleak>=0.1.14",
"mcp-server-fetch>=2025.1.17",
"onnxruntime>=1.20,<=1.23" # >=1.24 does not support Python 3.10
]
[[tool.uv.index]]
name = "pytorch-cpu"
url = "https://download.pytorch.org/whl/cpu"
explicit = true
[tool.uv.sources]
langflow-base = { workspace = true }
langflow = { workspace = true }
lfx = { workspace = true }
torch = { index = "pytorch-cpu" }
torchvision = { index = "pytorch-cpu" }
[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'",
# CPU-only PyTorch required for docling features
# Loose version ranges intentionally used to avoid conflicts with transitive dependencies (e.g., altk)
"torch>=2.0.0",
"torchvision>=0.15.0",
]
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 = [
"nv-ingest-api>=26.1.0,<27.0.0 ; python_version >= '3.12'",
"nv-ingest-client>=26.1.0,<27.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",
# z3-solver 4.15.7 dropped Linux wheels, pin until codeflash is removed
"z3-solver<4.15.7",
]
[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/services/auth/service.py" = [
"ARG002", # No-op impl: unused args required by interface
"EM101", # NotImplementedError messages as literals
"TC003", # Type-only imports used in signatures
]
"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"