flow / pyproject.toml
victordibia's picture
Deploy 2026-02-09 15:08:25
f4dca43
[project]
name = "flow-agent"
version = "0.1.0"
description = "Autonomous coding agent with a polished CLI"
authors = [{ name = "Victor Dibia" }]
readme = "README.md"
requires-python = ">=3.10"
license = { text = "MIT" }
classifiers = [
"Development Status :: 4 - Beta",
"Environment :: Console",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Typing :: Typed",
]
dependencies = [
"pydantic>=2.0.0",
"pydantic-settings>=2.0.0",
"rich>=13.0.0",
"typer>=0.9.0",
"httpx>=0.25.0",
"python-dotenv>=1.0.0",
"agent-framework-core>=1.0.0b5",
"azure-identity>=1.15.0",
"pyyaml>=6.0.0",
# OpenTelemetry for experiments tracing
"opentelemetry-api>=1.20.0",
"opentelemetry-sdk>=1.20.0",
"opentelemetry-semantic-conventions>=0.41b0",
# Web UI dependencies
"fastapi>=0.109.0",
"uvicorn>=0.27.0",
"sqlmodel>=0.0.14",
"aiosqlite>=0.19.0",
"greenlet>=3.0.0", # Required for SQLAlchemy async support
# Logging dependencies
"loguru>=0.7.3",
"tiktoken>=0.12.0",
]
[project.optional-dependencies]
# Optional features
research = ["beautifulsoup4>=4.12.0", "html2text>=2024.2.26"]
langgraph = [
"langgraph>=0.2.0",
"langchain-core>=0.3.0",
"langchain-openai>=0.2.0",
]
smolagents = [
"smolagents[toolkit]>=1.24.0",
"pdfminer.six>=20240706",
"cffi>=1.16.0",
"cryptography>=42.0.0",
"Pillow>=11.0.0",
"puremagic>=1.28",
"pypdf>=5.1.0",
"youtube_transcript_api>=0.6.2",
"python_pptx>=1.0.2",
"serpapi>=0.1.5",
"mammoth>=1.8.0",
"markdownify>=0.13.1",
"pandas>=2.2.3",
"openpyxl>=3.1.0",
"wikipedia-api>=0.9.0",
]
# Bundles
optimizer = ["gepa>=0.0.27", "litellm>=1.0.0"]
hf-datasets = ["datasets>=2.0.0"]
# Bundles
all = ["flow-agent[research,langgraph,optimizer,smolagents,hf-datasets]"]
dev = [
"pytest>=8.0.0",
"pytest-asyncio>=0.23.0",
"pytest-cov>=4.1.0",
"mypy>=1.8.0",
"pyright>=1.1.350",
"ruff>=0.2.0",
"pre-commit>=3.6.0",
"poethepoet>=0.24.0",
]
[project.scripts]
flow = "flow.cli:main"
[project.urls]
Homepage = "https://github.com/victordibia/flow"
Repository = "https://github.com/victordibia/flow"
Issues = "https://github.com/victordibia/flow/issues"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["src/flow"]
# ============================================================================
# Type Checking - Strict
# ============================================================================
[tool.pyright]
include = ["src"]
exclude = ["**/tests/**", "**/.venv/**", "**/skills/**"]
typeCheckingMode = "strict"
pythonVersion = "3.10"
reportMissingTypeStubs = false
reportUnnecessaryIsInstance = false
# agent_framework is optional - ignore type issues in harness
reportUnknownMemberType = "warning"
reportUnknownVariableType = "warning"
reportUnknownArgumentType = "warning"
[tool.mypy]
plugins = ["pydantic.mypy"]
strict = true
python_version = "3.10"
ignore_missing_imports = true
disallow_untyped_defs = true
no_implicit_optional = true
check_untyped_defs = true
warn_return_any = true
show_error_codes = true
warn_unused_ignores = false
disallow_incomplete_defs = true
disallow_untyped_decorators = true
exclude = ["src/flow/skills/"]
# ============================================================================
# Linting - Ruff
# ============================================================================
[tool.ruff]
line-length = 120
target-version = "py310"
src = ["src"]
fix = true
include = ["*.py", "*.pyi", "**/pyproject.toml"]
exclude = ["docs/*", "src/flow/skills/*"]
[tool.ruff.lint]
select = [
"E", # pycodestyle errors
"F", # pyflakes
"I", # isort
"B", # bugbear
"UP", # pyupgrade
"ANN", # annotations
"S", # bandit (security)
"RUF", # ruff-specific
"ASYNC", # async checks
"D", # pydocstyle
]
ignore = [
"D100", # allow missing docstring in public module
"D104", # allow missing docstring in public package
"D107", # allow missing docstring in __init__
"ANN401", # allow Any type (needed for generic tool/event handling)
"S101", # allow assert statements (used in tests)
"B008", # allow Depends() in function defaults (FastAPI pattern)
]
[tool.ruff.lint.per-file-ignores]
"**/tests/**" = ["D", "ANN", "S"]
[tool.ruff.lint.pydocstyle]
convention = "google"
[tool.ruff.format]
docstring-code-format = true
# ============================================================================
# Testing - Pytest
# ============================================================================
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src"]
addopts = "-ra -q -r fEX"
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
filterwarnings = []
[tool.coverage.run]
source = ["src/flow"]
omit = ["**/__init__.py"]
[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"if TYPE_CHECKING:",
"raise NotImplementedError",
]
# ============================================================================
# Task Runner - Poe
# ============================================================================
[tool.poe.tasks]
fmt = "ruff format src tests"
lint = "ruff check src tests --fix"
pyright = "pyright src"
mypy = "mypy src"
test = "pytest tests -v --cov=flow --cov-report=term-missing"
check = ["fmt", "lint", "pyright", "mypy", "test"]