Repository navigation
Expand file tree
/
Copy pathpyproject.toml
More file actions
108 lines (96 loc) · 3.75 KB
/
Copy pathpyproject.toml
File metadata and controls
108 lines (96 loc) · 3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
[build-system]
requires = ["hatchling>=1.24"]
build-backend = "hatchling.build"
[project]
name = "videocontent"
version = "0.1.0"
description = "The open-source semantic layer for video — turn video into timestamped, searchable context for AI agents and applications."
readme = "README.md"
license = { text = "Apache-2.0" }
requires-python = ">=3.10"
authors = [{ name = "Aagam Shah", email = "aagamshaha101@gmail.com" }]
keywords = ["video", "ocr", "asr", "whisper", "rag", "llm", "multimodal", "retrieval", "mcp"]
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Multimedia :: Video",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
]
# Base install stays deliberately small: no torch, no cloud SDKs, no GPU.
dependencies = [
"pydantic>=2.7",
"typer>=0.12",
"rich>=13.7",
"numpy>=1.26",
"pillow>=10.3",
"pyyaml>=6.0",
]
[project.optional-dependencies]
asr = ["faster-whisper>=1.0"]
ocr = ["pytesseract>=0.3.10"] # optional convenience; the binary is called directly
vision = ["httpx>=0.27"]
vectors = ["faiss-cpu>=1.8; platform_machine != 'arm64' or sys_platform != 'darwin'"]
embeddings = ["sentence-transformers>=3.0"]
api = ["fastapi>=0.111", "uvicorn[standard]>=0.30", "python-multipart>=0.0.9"]
# The legacy apps/mcp server uses the mcp 1.x decorator API, which mcp 2.x removed. The
# packaged `videocontent mcp` server needs no extra at all (it speaks MCP over stdio itself).
mcp = ["mcp>=1.0,<2"]
# Everything a coding agent needs for a useful first run: local speech recognition.
agent = ["faster-whisper>=1.0"]
dev = [
"pytest>=8.2",
"pytest-cov>=5.0",
"ruff>=0.5",
"mypy>=1.10",
"types-pyyaml",
]
all = ["videocontent[asr,ocr,vision,api]"]
[project.scripts]
videocontent = "videocontent.cli:main"
videocontext = "videocontent.cli:main"
vctx = "videocontent.cli:main"
[project.urls]
Homepage = "https://github.com/AAGAM17/VIDEOContext"
Documentation = "https://github.com/AAGAM17/VIDEOContext/tree/main/docs"
Issues = "https://github.com/AAGAM17/VIDEOContext/issues"
[tool.hatch.build.targets.wheel]
packages = ["src/videocontent"]
[tool.hatch.build.targets.wheel.force-include]
# One source of truth for the agent skill: skills/videocontent/ in the repository (what the
# Claude Code and Codex plugins load) is shipped inside the wheel for `videocontent init-agent`.
"skills/videocontent" = "videocontent/agent/skill"
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["."]
addopts = "-q --strict-markers"
markers = [
"slow: requires model download or long processing",
"integration: end-to-end, requires ffmpeg",
]
[tool.ruff]
line-length = 100
target-version = "py310"
src = ["src", "tests"]
[tool.ruff.lint]
# S (flake8-bandit) is selected deliberately: ARCHITECTURE §31 requires safe subprocess
# invocation, path handling and temp-file discipline, and this project shells out to ffmpeg
# and tesseract on every run. Each suppression must therefore carry a reason, which is what
# makes the `# noqa: S603` markers at those call sites meaningful rather than decorative.
select = ["E", "F", "I", "UP", "B", "SIM", "C4", "RUF", "S"]
ignore = ["B008", "RUF012"]
[tool.ruff.lint.per-file-ignores]
# Tests assert on constructed values and use fixture paths; the security rules aimed at
# production input handling produce only noise there.
"tests/**" = ["S101", "S603", "S607"]
"scripts/**" = ["S101", "S603", "S607"]
[tool.mypy]
python_version = "3.10"
warn_unused_ignores = true
disallow_untyped_defs = false
ignore_missing_imports = true
files = ["src/videocontent"]