mirror of
https://github.com/langflow-ai/langflow.git
synced 2026-07-24 13:29:52 +08:00
* fix: resolve SLF001 private member access violations
This commit fixes SLF001 (private member access) violations by:
1. Creating and using public getters for internal code:
- CustomComponent: Use get_vertex(), get_results(), set_results(),
get_artifacts(), set_artifacts() instead of direct private access
- TracingService: Use component.get_vertex() instead of ._vertex
- ComposioBaseComponent: Add classmethods get_actions_cache(),
get_action_schema_cache(), get_all_auth_field_names()
- ChatComponent: Use get_vertex() and get_id() methods
2. Adding noqa comments for third-party library private access:
- chroma._collection and chroma._client (langchain-chroma)
- request._send (FastAPI/Starlette)
- langwatch and opik client private members
3. Fixing B008 errors (function calls in argument defaults):
- FastAPI: Use Annotated[Type, Depends()] pattern
- Typer: Add noqa comments for CLI argument defaults
4. Fixing PLR2004 (magic values in tests):
- Add per-file-ignores for src/lfx/tests/* in pyproject.toml
This reduces ruff errors from 298 to 107 (64% reduction).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: remove redundant ruff configuration from pyproject.toml files
This commit removes the ruff configuration sections from both the backend and lfx pyproject.toml files, streamlining the project setup. The removed configurations included linting rules, per-file ignores, and other related settings that are no longer necessary.
* config: add comprehensive per-file ruff ignores
Add per-file-ignores to handle legitimate cases that can't be fixed:
1. FastAPI endpoints (TCH rules):
- api/v1/* and api/v2/* need runtime type evaluation
2. Security warnings (S104, S105, S108, S301, S110):
- Intentional binding to all interfaces for servers
- False positives for PASSWORD constants and token variables
- Intentional pickle usage in caching
- Legitimate try-except-pass in optional metadata
3. Code execution (S102):
- Intentional exec/eval in dynamic code tools and validation
4. Third-party library private access (SLF001):
- Google API, MongoDB, Chroma, MCP, Grandalf libraries
- Component introspection and code analysis utilities
5. CLI tools (B008):
- Typer requires function calls in argument defaults
This configuration ensures ruff checks pass consistently with
or without the --config flag.
* refactor: replace private member access with public getters
Replace private member access with public API methods for better
encapsulation and maintainability:
1. Component base inputs:
- Use get_base_inputs() instead of _base_inputs
- Updated AgentComponent, CugaComponent, AmazonBedrockConverseModel
2. Component methods:
- Rename _run_actor() to run_actor() in ApifyActorsComponent
- Rename _reset_all_output_values() to reset_all_output_values()
- Use get_output_logs() instead of _output_logs
Files changed:
- src/lfx/src/lfx/components/agents/agent.py
- src/lfx/src/lfx/components/agents/cuga_agent.py
- src/lfx/src/lfx/components/amazon/amazon_bedrock_converse.py
- src/lfx/src/lfx/components/apify/apify_actor.py
- src/lfx/src/lfx/custom/custom_component/component.py
- src/lfx/src/lfx/graph/graph/base.py
- src/lfx/src/lfx/graph/vertex/vertex_types.py
This eliminates 6 SLF001 violations by using proper public APIs.
* fix: add noqa comments for unavoidable third-party private access
Add SLF001 noqa comments for cases where we must access private
members of third-party libraries:
1. Chroma vector store:
- Access _collection to get document metadata
- Access _client to retrieve embeddings
(langchain-chroma library)
2. FastAPI/Starlette Request:
- Access _send for SSE (Server-Sent Events) connections
- Required by MCP SSE implementation
(starlette library)
3. MongoDB Atlas:
- Access _collection to verify search index
- Add pragma comment for certificate format documentation
(langchain-mongodb library)
These are unavoidable as the libraries don't expose public APIs
for these use cases.
Files changed:
- src/backend/base/langflow/api/v1/knowledge_bases.py
- src/backend/base/langflow/api/v1/mcp.py
- src/backend/base/langflow/api/v1/mcp_projects.py
- src/lfx/src/lfx/components/vectorstores/mongodb_atlas.py
* style: auto-fix import sorting and add test secret pragmas
Auto-fixed import sorting violations (I001) in test files using
ruff's --fix option. Also added pragma comments for test API keys
flagged by detect-secrets hook.
Changes:
1. Import sorting (auto-fixed by ruff):
- Fixed I001 violations in 40 test files
- Fixed import sorting in langflow/custom/__init__.py
2. Secret pragmas (false positives in tests):
- Added 'pragma: allowlist secret' for test API keys
- These are test constants like 'test-key', not real secrets
- Fixed in test_serve.py, test_serve_app.py, test_common.py,
test_param_handler.py, test_graph_state_model.py
All changes are formatting-only with no functional impact.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* [autofix.ci] apply automated fixes
* [autofix.ci] apply automated fixes (attempt 2/3)
* fix: enhance error handling in AstraDBBaseComponent
Updated the exception handling in AstraDBBaseComponent to log detailed error messages when metadata retrieval fails. This improves debugging capabilities by providing context on the failure, including the database name and the exception message.
Files changed:
- src/lfx/src/lfx/base/datastax/astradb_base.py
* fix: restore critical import order and fix tracing test mock
Fix issues introduced by import sorting auto-fix:
1. Restore import order in langflow/custom/__init__.py:
- Move 'from lfx import custom' back to first position
- Import order affects initialization and component loading
- Added per-file-ignore (I001) to prevent future auto-sorting
2. Fix tracing service test mock:
- Update mock_component fixture to support get_vertex() method
- Create proper mock_vertex object so .id returns string value
- Fixes: AssertionError in test_trace_component
3. Update .secrets.baseline:
- Pre-commit hook updated baseline for new test files
Note: test_refresh_starter_projects and test_get_all failures are
pre-existing on main branch (only 'agents' category loads due to
upstream component loading issues), not caused by this PR.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* config: update ruff configuration for enhanced linting
- Set target Python version to 3.10.
- Added exclusions for specific directories and files to improve linting accuracy.
- Enhanced linting rules with new flake8 configurations for better type checking and immutability handling.
These changes aim to refine the linting process and ensure compatibility with the latest coding standards.
* style: format code for consistency and clarity
- Adjusted the formatting of the `env_file` option in `serve_command` for improved readability.
- Restored import order in `schema.py` by moving `EdgeData` and `NodeData` imports to the correct section, enhancing code organization.
These changes aim to maintain consistent code style and improve clarity in the command and schema files.
* [autofix.ci] apply automated fixes
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
495 lines
16 KiB
TOML
495 lines
16 KiB
TOML
[project]
|
|
name = "langflow"
|
|
version = "1.6.4"
|
|
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.6.4",
|
|
"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",
|
|
"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; 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==0.6.3",
|
|
"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.8.5",
|
|
"composio-langchain==0.8.5",
|
|
"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",
|
|
"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",
|
|
"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",
|
|
"langchain-elasticsearch==0.3.0",
|
|
"langchain-ollama==0.2.1",
|
|
"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",
|
|
"mcp>=1.10.1,<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.1.2",
|
|
"astrapy>=2.1.0,<3.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/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"
|