content: [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
  
  [project]
  name = "flock"
  version = "0.1.0"
  description = "Flock project"
  requires-python = ">=3.12"
  dependencies = [
      "httpx>=0.28.1",
      "langchain-community>=0.3.19",
      "langchain-experimental>=0.3.4",
      "langchain-openai>=0.3.8",
      "langgraph>=0.3.5",
      "readabilipy>=0.3.0",
      "python-dotenv>=1.0.1",
      "socksio>=1.0.0",
      "markdownify>=1.1.0",
      "fastapi>=0.110.0",
      "uvicorn>=0.27.1",
      "sse-starlette>=1.6.5",
      "pandas>=2.2.3",
      "numpy>=2.2.3",
      "yfinance>=0.2.54",
      "litellm>=1.63.11",
      "json-repair>=0.7.0",
      "jinja2>=3.1.3",
      "duckduckgo-search>=8.0.0",
      "inquirerpy>=0.3.4",
      "arxiv>=2.2.0",
      "mcp>=1.6.0",
      "langchain-mcp-adapters>=0.0.9",
      "python-multipart>=0.0.7",
      "email-validator>=2.1.0.post1",
      "passlib[bcrypt]>=1.7.4",
      "tenacity>=8.2.3",
      "pydantic>=2.0",
      "emails>=0.6",
      "zhipuai>=2.1.5.20230904",
      "numexpr>=2.10.1",
      "gunicorn>=22.0.0",
      "alembic>=1.12.1",
      "psycopg[binary]>=3.1.13",
      "sqlmodel>=0.0.21",
      "bcrypt>=4.0.1",
      "pydantic-settings>=2.2.1",
      "sentry-sdk[fastapi]>=2.8.0",
      "langchain>=0.3.7",
      "langchain-core>=0.3.28",
      "langchain-text-splitters>=0.3.2",
      "langgraph-checkpoint>=2.0.9",
      "langgraph-sdk>=0.1.48",
      "langchain-sandbox>=0.0.6",
      "langsmith>=0.1.141",
      "grandalf>=0.8",
      "wikipedia>=1.4.0",
      "google-search-results>=2.4.2",
      "pyjwt>=2.8.0",
      "asyncpg>=0.29.0",
      "asyncpg-stubs>=0.29.1",
      "langchain-qdrant>=0.1.4",
      "fastembed>=0.3.1",
      "qdrant-client>=1.11.3",
      "coverage>=7.5.4",
      "celery>=5.4.0",
      "redis>=5.0.7",
      "celery-stubs>=0.1.3",
      "pymupdf>=1.24.7",
      "langgraph-checkpoint-postgres<=2.0.9",
      "aiofiles>=24.1.0",
      "autoflake>=2.3.1",
      "black>=24.10.0",
      "crewai",
      "langchain-google-genai>=2.0.7",
      "langchain-ollama>=0.2.2"
  ]
  
  [project.optional-dependencies]
  dev = [
      "black>=24.2.0",
      "pytest>=8.0.0",
      "mypy>=1.8.0",
      "ruff>=0.2.2",
      "pre-commit>=3.6.2",
      "types-python-jose>=3.3.4.20240106",
      "isort>=6.0.1",
      "types-passlib>=1.7.7.20240106"
  ]
  test = [
      "pytest>=7.4.0",
      "pytest-cov>=4.1.0",
  ]
  
  [tool.pytest.ini_options]
  testpaths = ["tests"]
  python_files = ["test_*.py"]
  addopts = "-v --cov=src --cov-report=term-missing"
  filterwarnings = [
      "ignore::DeprecationWarning",
      "ignore::UserWarning",
  ]
  
  [tool.coverage.report]
  fail_under = 25
  
  [tool.hatch.build.targets.wheel]
  packages = ["src"]
  
  [tool.black]
  line-length = 88
  target-version = ["py312"]
  include = '\.pyi?$'
  extend-exclude = '''
  # A regex preceded with ^/ will apply only to files and directories
  # in the root of the project.
  ^/build/
  '''
  
  [tool.mypy]
  strict = true
  exclude = ["venv", "alembic"]
  
  [tool.ruff]
  target-version = "py310"
  exclude = ["alembic"]
  line-length = 88
  
  [tool.ruff.lint]
  select = [
      "E",  # pycodestyle errors
      "W",  # pycodestyle warnings
      "F",  # pyflakes
      "I",  # isort
      "B",  # flake8-bugbear
      "C4",  # flake8-comprehensions
      "UP",  # pyupgrade
  ]
  ignore = [
      "E501",  # line too long, handled by black
      "B008",  # do not perform function calls in argument defaults
      "W191",  # indentation contains tabs
      "B904",  # Allow raising exceptions without from e, for HTTPException
  ]
  
  [tool.ruff.lint.isort]
  combine-as-imports = true
  force-wrap-aliases = true
  
  [tool.ruff.format]
  quote-style = "double"
  indent-style = "space"
  skip-magic-trailing-comma = false
  line-ending = "auto"
  
  [[tool.poetry.source]]
  name = "tsinghua"
  url = "https://pypi.tuna.tsinghua.edu.cn/simple/"
  priority = "primary"