[project] name = "honcho" version = "3.0.6" description = "Honcho Server" authors = [ {name = "Plastic Labs", email = "hello@plasticlabs.ai"}, ] readme = "README.md" requires-python = ">=3.10" dependencies = [ "fastapi[standard]>=0.131.0", "python-dotenv>=1.0.0", "sqlalchemy>=2.0.30", "fastapi-pagination>=0.14.2", "pgvector>=0.2.5", "sentry-sdk[anthropic,fastapi,sqlalchemy]>=2.3.1", "greenlet>=3.0.3", "psycopg[binary]>=3.1.19", "httpx>=0.27.0", "rich>=13.7.1", "nanoid>=2.0.0", "alembic>=1.14.0", "pyjwt>=2.10.0", "tenacity>=9.1.2", "tiktoken>=0.9.0", "langfuse>=3.3.2", "openai>=1.99.7", "pydantic>=2.11.7", "pydantic-settings>=2.10.1", "google-genai>=1.32.0", "pdfplumber>=0.11.7", "typing-extensions>=4.11.0", "json-repair>=0.49.0", "turbopuffer>=1.8.1", "lancedb>=0.25.3", "pyarrow>=19.0.0", "redis>=7.0.0,<8.0.0", "cashews[redis]==7.4.4", "scikit-learn>=1.6.0", "prometheus_client>=0.21.0", "cloudevents>=1.12.0", ] [dependency-groups] dev = [ "pytest>=8.2.2", "sqlalchemy-utils>=0.41.2", "pytest-asyncio>=0.23.7", "coverage>=7.6.0", "interrogate>=1.7.0", "py-spy>=0.3.14", "ruff>=0.11.2", "basedpyright>=1.29.4", "pre-commit>=4.2.0", "pytest-cov>=6.2.1", "honcho-ai", "fakeredis>=2.32.0", "scipy>=1.15.3", "boto3>=1.42.5", "pytest-xdist>=3.8.0", ] [tool.uv.workspace] members = [ "sdks/python", "honcho-cli", ] [tool.uv.sources] honcho-ai = { workspace = true } honcho-cli = { workspace = true } [tool.ruff.lint] # from https://docs.astral.sh/ruff/linter/#rule-selection example select = [ # pycodestyle "E", # Pyflakes "F", # pyupgrade "UP", # flake8-bugbear "B", # flake8-simplify "SIM", # isort "I", ] ignore = ["E501", "B008", "COM812"] [tool.ruff.lint.flake8-bugbear] extend-immutable-calls = ["fastapi.Depends"] [tool.pytest.ini_options] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "session" addopts = "--strict-markers -n auto --ignore=tests/alembic" testpaths = ["tests"] pythonpath = ["src"] markers = [ "live_llm: calls live LLM provider APIs and requires --live-llm", "requires_anthropic: requires LLM_ANTHROPIC_API_KEY", "requires_openai: requires LLM_OPENAI_API_KEY", "requires_gemini: requires LLM_GEMINI_API_KEY", ] filterwarnings = [ "ignore:Call to deprecated close\\. \\(Use aclose\\(\\) instead\\).*:DeprecationWarning", "ignore:websockets\\.legacy is deprecated; see .* for upgrade instructions:DeprecationWarning", "ignore:websockets\\.server\\.WebSocketServerProtocol is deprecated:DeprecationWarning", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", ] [tool.basedpyright] # BasedPyright currently seems like the best type checker option, much faster # https://docs.basedpyright.com/latest/configuration/config-files/#sample-pyprojecttoml-file include = ["src", "tests", "sdks/python/src"] exclude = ["tests/**/disabled*.py"] reportIgnoreCommentWithoutRule = false reportMissingTypeStubs = false reportUnusedCallResult = false reportCallInDefaultInitializer = false reportAny = false reportExplicitAny = false allowedUntypedLibraries = ["langfuse", "lancedb", "pyarrow"] reportImplicitOverride = false reportImportCycles = false [[tool.uv.index]] name = "testpypi" url = "https://test.pypi.org/simple/" publish-url = "https://test.pypi.org/legacy/" explicit = true