content: [tool.poetry]
  name = "app"
  version = "0.1.0"
  description = ""
  authors = ["Admin <admin@example.com>"]
  
  [tool.poetry.dependencies]
  python = ">=3.10,<3.13"
  uvicorn = {extras = ["standard"], version = "^0.24.0.post1"}
  fastapi = "^0.109.1"
  python-multipart = "^0.0.7"
  email-validator = "^2.1.0.post1"
  passlib = {extras = ["bcrypt"], version = "^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"
  jinja2 = "^3.1.4"
  alembic = "^1.12.1"
  httpx = "0.27.0"
  psycopg = {extras = ["binary"], version = "^3.1.13"}
  sqlmodel = "0.0.21"
  # Pin bcrypt until passlib supports the latest
  bcrypt = "4.0.1"
  pydantic-settings = "^2.2.1"
  sentry-sdk = {extras = ["fastapi"], version = "^2.8.0"}
  langgraph = "0.2.14"
  langchain-openai = "0.1.17"
  grandalf = "^0.8"
  langchain = "0.2.12"
  langchain-community = "0.2.9"
  duckduckgo-search = "6.1.0"
  wikipedia = "^1.4.0"
  langchain-anthropic = "0.1.20"
  langchain-cohere = "^0.1.4"
  langchain-google-genai = "^1.0.2"
  google-search-results = "^2.4.2"
  yfinance = "^0.2.38"
  langchain-core = "0.2.28"
  pyjwt = "^2.8.0"
  psycopg2 = "^2.9.9"
  asyncpg = "^0.29.0"
  types-psycopg2 = "^2.9.21.20240417"
  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"
  psycopg-pool = "^3.2.2"
  langchain-ollama = "0.1.1"
  langgraph-checkpoint-postgres = "^1.0.3"
  aiofiles = "^24.1.0"
  autoflake = "^2.3.1"
  black = "^24.10.0"
  isort = "^5.13.2"
  opencv-python = "^4.10.0.84"
  jupyterlab = "^4.2.5"
  pycocotools = "^2.0.8"
  tifffile = "^2024.9.20"
  
  [tool.poetry.group.dev.dependencies]
  pytest = "^7.4.3"
  mypy = "^1.8.0"
  ruff = "^0.2.2"
  pre-commit = "^3.6.2"
  types-python-jose = "^3.3.4.20240106"
  types-passlib = "^1.7.7.20240106"
  
  [tool.isort]
  multi_line_output = 3
  include_trailing_comma = true
  force_grid_wrap = 0
  line_length = 88
  [build-system]
  requires = ["poetry>=0.12"]
  build-backend = "poetry.masonry.api"
  
  [tool.mypy]
  strict = true
  exclude = ["venv", "alembic"]
  
  [tool.ruff]
  target-version = "py310"
  exclude = ["alembic"]
  
  [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.pyupgrade]
  # Preserve types, even if a file imports `from __future__ import annotations`.
  keep-runtime-typing = true
  
  [[tool.poetry.source]]
  name = "mirrors"
  url = "https://pypi.tuna.tsinghua.edu.cn/simple/"
  priority = "primary"