[build-system]
requires = [
    "setuptools>=61.0",
    "setuptools-scm>=8.0",
    "pybind11>=2.13.0",
    "cmake>=3.15",
    "wheel",
]
build-backend = "setuptools.build_meta"

[project]
name = "openviking"
dynamic = ["version"]
description = "An Agent-native context database"
readme = "README.md"
authors = [
    {name = "ByteDance", email = "noreply@bytedance.com"}
]
license = { text = "Apache-2.0" }
requires-python = ">=3.10"
classifiers = [
    "Development Status :: 3 - Alpha",
    "Intended Audience :: Developers",
    "Topic :: Scientific/Engineering :: Artificial Intelligence",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: 3.13",
]
dependencies = [
    "pydantic>=2.0.0",
    "typing-extensions>=4.5.0",
    "pyyaml>=6.0",
    "httpx>=0.25.0",
    "pdfplumber>=0.10.0",
    "readabilipy>=0.2.0",
    "markdownify>=0.11.0",
    "openai>=1.0.0",
    "requests>=2.31.0",
    "python-docx>=1.0.0",
    "python-pptx>=1.0.0",
    "openpyxl>=3.0.0",
    "ebooklib>=0.18.0",
    "json-repair>=0.25.0",
    "apscheduler>=3.11.0",
    "volcengine>=1.0.216",
    "volcengine-python-sdk[ark]>=5.0.3",
    "pyagfs",
    "fastapi>=0.128.0",
    "uvicorn>=0.39.0",
    "xxhash>=3.0.0",
    "jinja2>=3.1.6",
    "tabulate>=0.9.0",
    "urllib3>=2.6.3",
    "protobuf>=6.33.5",
    "pdfminer-six>=20251230",
    "typer>=0.12.0",
    "litellm>=1.0.0",
    "python-multipart>=0.0.22",
    "tree-sitter>=0.23.0",
    "tree-sitter-python>=0.23.0",
    "tree-sitter-javascript>=0.23.0",
    "tree-sitter-typescript>=0.23.0",
    "tree-sitter-java>=0.23.0",
    "tree-sitter-cpp>=0.23.0",
    "tree-sitter-rust>=0.23.0",
    "tree-sitter-go>=0.23.0",
]

[tool.uv.sources]
pyagfs = { path = "third_party/agfs/agfs-sdk/python" }

[project.optional-dependencies]
test = [
    "pytest>=7.0.0",
    "pytest-asyncio>=0.21.0",
    "boto3>=1.42.44",
    "pytest-cov>=4.0.0",
    "ragas>=0.1.0",
    "datasets>=2.0.0",
    "pandas>=2.0.0",
]
dev = [
    "mypy>=1.0.0",
    "ruff>=0.1.0",
]
doc = [
    "sphinx>=7.0.0",
    "sphinx-rtd-theme>=1.3.0",
    "myst-parser>=2.0.0",
]
eval = [
    "ragas>=0.1.0",
    "datasets>=2.0.0",
    "pandas>=2.0.0",
]

[project.urls]
Homepage = "https://github.com/volcengine/openviking"
Documentation = "https://openviking.ai"
Repository = "https://github.com/volcengine/openviking"
Issues = "https://github.com/volcengine/openviking/issues"

[project.scripts]
ov = "openviking_cli.rust_cli:main"  # Rust CLI 入口（极简包装器）
openviking = "openviking_cli.rust_cli:main"  # Rust CLI 入口（放弃 python CLI）
openviking-server = "openviking.server.bootstrap:main"

[tool.setuptools_scm]
write_to = "openviking/_version.py"
local_scheme = "no-local-version"
tag_regex = "^(?:v)?(?:[a-zA-Z0-9_]+@)?(?P<version>[0-9]+(?:\\.[0-9]+)*)$"

[tool.setuptools.packages.find]
where = ["."]
include = ["openviking*"]
exclude = ["tests*", "docs*", "examples*"]

[tool.setuptools.package-data]
openviking = [
    "prompts/templates/**/*.yaml",
    "bin/agfs-server",
    "bin/agfs-server.exe",
    "bin/ov",        # 新增
    "bin/ov.exe"     # 新增
]

[tool.mypy]
python_version = "3.10"
warn_return_any = false
warn_unused_configs = true
disallow_untyped_defs = false
disallow_incomplete_defs = false
check_untyped_defs = true
no_implicit_optional = false
warn_redundant_casts = true
warn_unused_ignores = true
ignore_missing_imports = true

[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
asyncio_mode = "auto"
addopts = "-v --cov=openviking --cov-report=term-missing"

[tool.ruff]
line-length = 100
exclude = ["third_party"]
target-version = "py39"

[tool.ruff.lint]
select = [
    "E",  # pycodestyle errors
    "W",  # pycodestyle warnings
    "F",  # pyflakes
    "I",  # isort
    "C",  # flake8-comprehensions
    "B",  # flake8-bugbear
]
ignore = [
    "E501",  # line too long (handled by black)
    "B008",  # do not perform function calls in argument defaults
    "C901",  # too complex
    "B006",  # Do not use mutable data structures for argument defaults
    "B904",  # Within an `except` clause, raise exceptions with `raise ... from err`
    "E741",  # Ambiguous variable name
    "E722",  # Do not use bare `except`
    "B027",  # empty method in an abstract base class
]

[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["F401"]  # Allow unused imports in __init__.py

[tool.ruff.format]
quote-style = "double"
indent-style = "space"
skip-magic-trailing-comma = false
line-ending = "auto"
