forked from oxbshw/watch-skill
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpyproject.toml
More file actions
125 lines (110 loc) · 4.36 KB
/
Copy pathpyproject.toml
File metadata and controls
125 lines (110 loc) · 4.36 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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
[build-system]
requires = ["hatchling", "hatch-fancy-pypi-readme"]
build-backend = "hatchling.build"
[project]
name = "watch-skill"
version = "1.2.0"
description = "Give any agent a video input: watch, index, ask, and iterate on video via MCP, CLI, REST, and Python."
# readme is produced by hatch-fancy-pypi-readme below: the file's relative
# paths only resolve on GitHub, and PyPI renders the description standalone.
dynamic = ["readme"]
requires-python = ">=3.11"
license = { text = "MIT" }
authors = [{ name = "oxbshw" }]
keywords = ["video", "agents", "mcp", "vision", "transcription", "ffmpeg", "yt-dlp"]
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Multimedia :: Video",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
"Topic :: Scientific/Engineering :: Image Recognition",
]
dependencies = [
"pydantic>=2.13,<3",
"pydantic-settings>=2.14,<3",
"typer>=0.26,<1",
# >=13.7 (not 15): crewai pins rich<15, and the whole suite runs on 14.x
"rich>=13.7,<16",
"httpx>=0.28,<1",
]
[project.optional-dependencies]
perceive = [
"scenedetect>=0.7,<0.8",
"opencv-python-headless>=5.0,<6",
"imagehash>=4.3,<5",
"Pillow>=12.3,<13",
]
ocr = ["rapidocr>=3.9,<4", "onnxruntime>=1.27,<2", "python-bidi>=0.6,<1"]
whisper = ["faster-whisper>=1.2,<2"]
index = ["fastembed>=0.8,<0.9", "numpy>=2.4,<3"]
mcp = ["fastmcp>=3.4,<4"]
api = ["fastapi>=0.139,<1", "uvicorn>=0.50,<1"]
loop = ["playwright>=1.61,<2"]
diarize = ["pyannote.audio>=4.0,<5"]
# framework adapters (each thin; see src/watch_skill/integrations/)
langchain = ["langchain-core>=0.3,<2"]
openai-agents = ["openai-agents>=0.1,<1"]
crewai = ["crewai>=0.80"]
llamaindex = ["llama-index-core>=0.12,<0.16"]
autogen = ["autogen-core>=0.4,<0.8"]
# What you need to watch a video and ask about it: frames, retrieval, MCP.
# OCR and Whisper are left out on purpose — captions cover transcription for
# most sources, and both add ~170 MB. `doctor` reports what is missing and
# prints the one command that adds it.
standard = ["watch-skill[perceive,index,mcp]"]
all = ["watch-skill[perceive,ocr,whisper,index,mcp,api,loop]"]
[project.scripts]
watch-skill = "watch_skill.surfaces.cli.main:app"
[project.urls]
Homepage = "https://github.com/oxbshw/watch-skill"
Documentation = "https://github.com/oxbshw/watch-skill/tree/main/docs"
Changelog = "https://github.com/oxbshw/watch-skill/blob/main/CHANGELOG.md"
Issues = "https://github.com/oxbshw/watch-skill/issues"
Source = "https://github.com/oxbshw/watch-skill"
[dependency-groups]
dev = ["pytest>=9.1,<10", "pytest-timeout>=2.4,<3", "ruff>=0.15,<0.16"]
[tool.hatch.build.targets.wheel]
packages = ["src/watch_skill"]
# PyPI renders the long description on its own, so every relative path in
# README.md would be a broken image or a dead link there. Rewrite them to
# absolute GitHub URLs at build time and leave the file itself relative,
# which is what makes it work on a branch or a fork.
[tool.hatch.metadata.hooks.fancy-pypi-readme]
content-type = "text/markdown"
[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]]
path = "README.md"
# <img src="docs/..."> and  -> raw.githubusercontent.com
[[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]]
pattern = 'src="(?!https?://)([^"]+)"'
replacement = 'src="https://raw.githubusercontent.com/oxbshw/watch-skill/main/\1"'
# [text](docs/guide.md) -> the file on GitHub. Anchors and absolute URLs
# are left alone.
[[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]]
pattern = '\]\((?!https?://|#)([^)]+)\)'
replacement = '](https://github.com/oxbshw/watch-skill/blob/main/\1)'
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-q"
timeout = 300
markers = [
"network: hits the real network (excluded from CI's merge gate)",
]
[tool.ruff]
line-length = 100
target-version = "py311"
src = ["src", "tests", "examples"]
[tool.ruff.lint.isort]
known-first-party = ["watch_skill"]
[tool.ruff.lint]
select = ["E", "F", "W", "I", "UP", "B"]
ignore = [
"E501", # long lines in docstrings/prompts are deliberate
"B008", # typer.Option in defaults is the typer idiom
]
[tool.uv]
package = true