[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"]