[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "synthadoc" dynamic = ["version"] description = "Domain-agnostic LLM knowledge compilation engine" readme = "README-pypi.md" license = "AGPL-3.0-or-later" requires-python = ">=3.11" keywords = ["knowledge management", "LLM", "wiki", "RAG", "obsidian", "knowledge base", "knowledge graph", "agentic AI"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Information Technology", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Scientific/Engineering :: Information Analysis", "Topic :: Text Processing", "Topic :: Text Processing :: Indexing", "Topic :: Office/Business", ] dependencies = [ "typer>=0.12", "rich>=13", "fastapi>=0.111", "uvicorn>=0.30", "aiosqlite>=0.20", "anthropic>=1.15,<2", # 1.x removed temperature from messages.create/stream (see providers/anthropic.py) "openai>=1.40", "httpx>=0.27", "certifi>=2024.0", "beautifulsoup4>=4.12", "pypdf>=4.0", "pdfminer.six>=20221105", "python-docx>=1.1", "python-pptx>=1.0", "openpyxl>=3.1", "rank_bm25>=0.2", "filelock>=3.15", "opentelemetry-sdk>=1.25", "pydantic>=2.7", "pyyaml>=6.0", "tavily-python>=0.5", "youtube-transcript-api>=0.6", "croniter>=2.0", "networkx>=3.0", "python-louvain>=0.16", "mcp>=1.0,<2.0", ] [project.urls] Homepage = "https://github.com/axoviq-ai/synthadoc" Repository = "https://github.com/axoviq-ai/synthadoc" "Bug Tracker" = "https://github.com/axoviq-ai/synthadoc/issues" Changelog = "https://github.com/axoviq-ai/synthadoc/releases" [project.optional-dependencies] vectors = [ "fastembed>=0.3", # local embedding model runtime (onnxruntime); prebuilt wheels "numpy>=1.24", # embedding matrix maths in storage/search.py "huggingface-hub>=0.23", # downloads the model as plain files (local_dir); fastembed depends on it too ] dev = [ "pytest>=8", "pytest-asyncio>=0.23", "pytest-cov>=5", "pytest-timeout>=2.3", "pytest-benchmark>=4.0", "respx>=0.21", "httpx2>=2.0", # Starlette >= 1.x TestClient transport; avoids its httpx deprecation warning "matplotlib>=3.8", "mcp>=1.0,<2.0", ] [project.scripts] synthadoc = "synthadoc.cli.main:app" # Built-in skills are discovered automatically via folder scan (_BUILTIN_SKILLS_DIR). # Community / pip-installed skills declare their skill folder path here: # [project.entry-points."synthadoc.skills"] # my_skill = "/absolute/path/to/my_skill_folder" [tool.pytest.ini_options] asyncio_mode = "auto" timeout = 60 testpaths = ["tests"] addopts = "-m 'not integration and not charts and not known_bug'" norecursedirs = ["tests/live", "tests/performance"] markers = [ "integration: marks tests that require real external tools (run explicitly with '-m integration')", "live: marks tests that require a running Synthadoc server (run explicitly with '-m live')", "windows: marks tests that run only on Windows", "linux: marks tests that run only on Linux", "macos: marks tests that run only on macOS", "posix: marks tests that run only on Linux or macOS", "charts: marks tests that generate performance charts (run explicitly with '-m charts')", "benchmark: marks pytest-benchmark tests (run with --benchmark-only)", "known_bug: marks tests for confirmed pre-existing bugs; excluded from default runs", ] [tool.hatch.version] # Reads __version__ from synthadoc/__init__.py, which in turn reads the repo-root VERSION file. # To release: update VERSION, then run scripts/bump_version.py to sync all derived files. source = "code" path = "synthadoc/__init__.py" [tool.hatch.build.targets.wheel] packages = ["synthadoc"] artifacts = ["VERSION", "synthadoc/data/obsidian-plugin/*", "synthadoc/data/web-ui/**/*"] [tool.coverage.run] omit = [ # HTTP and MCP server handlers require a live server — covered by tests/integration, not unit tests "synthadoc/integration/http_server.py", "synthadoc/integration/mcp_server.py", ] [tool.coverage.report] fail_under = 91 exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError", "if __name__ == .__main__.:", "@(abc\\.)?abstractmethod", "\\.\\.\\.\\s*$", ]