[project] name = "langflow" version = "1.5.0.post1" 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.5.0", "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", "pymongo==4.10.1", "supabase==2.6.0", "certifi>=2023.11.17,<2025.0.0", "certifi==2024.8.30", 'fastavro==1.9.7; python_version < "3.13"', 'fastavro>=1.9.8; python_version >= "3.13"', "redis>=5.2.1", "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", "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", "assemblyai==0.35.1", "litellm==1.60.2", "chromadb==0.5.23", "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.1.16", "langsmith>=0.3.42,<1.0.0", "yfinance==0.2.50", "wolframalpha==5.1.3", "astra-assistants[tools]~=2.2.12", "composio-langchain==0.7.15", "composio-core==0.7.15", "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-anthropic==0.3.14", "langchain-astradb~=0.6.0", "langchain-openai>=0.2.12", "langchain-google-vertexai==2.0.7", "langchain-groq==0.2.1", "langchain-pinecone>=0.2.8", "langchain-mistralai==0.2.3", "langchain-chroma==0.1.4", "langchain-aws==0.2.7", "langchain-unstructured==0.1.5", "langchain-milvus==0.1.7", "langchain-mongodb==0.2.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", "sqlalchemy[aiosqlite]>=2.0.38,<3.0.0", "atlassian-python-api==3.41.16", "mem0ai==0.1.34", "needle-python>=0.4.0", "aiofile>=3.9.0,<4.0.0", "sseclient-py==1.8.0", "arize-phoenix-otel>=0.6.1", "openinference-instrumentation-langchain>=0.1.29", # "crewai>=0.126.0", "mcp>=1.10.1", "uv==0.7.20", "scipy>=1.14.1", "scrapegraph-py>=1.12.0", "pydantic-ai>=0.0.19", "smolagents>=1.8.0", "apify-client>=1.8.1", "pylint>=3.3.4", "ruff>=0.9.7", "langchain-graph-retriever==0.6.1", "graph-retriever==0.6.1", "ibm-watsonx-ai>=1.3.1", "langchain-ibm>=0.3.8", "opik>=1.6.3", "openai>=1.68.2", "cleanlab-tlm>=1.1.2", 'gassist>=0.0.1; sys_platform == "win32"', "twelvelabs>=0.4.7", "docling_core>=2.36.1", "filelock>=3.18.0", "jigsawstack==0.2.7", ] [dependency-groups] dev = [ "pytest-instafail>=0.5.0", "types-redis>=4.6.0.5", "ipykernel>=6.29.0", "mypy>=1.11.0", "ruff>=0.9.7,<0.10", "httpx>=0.27.0", "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.32.9", "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 } [tool.uv.workspace] members = ["src/backend/base", "."] [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 = [ "docling>=2.36.1", ] 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==2025.4.22.dev20250422", "nv-ingest-client==2025.4.22.dev20250422", ] 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"] 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"] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" [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] exclude = ["src/backend/base/langflow/alembic/*", "src/frontend/tests/assets/*"] line-length = 120 [tool.ruff.lint] 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) # 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/tests/*" = [ "D1", "PLR2004", "S101", "SLF001", "BLE001", # allow broad-exception catching in tests ] [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"