mirror of
https://github.com/open-jarvis/OpenJarvis.git
synced 2026-07-27 21:05:34 +00:00
docs/user-guide/evaluations.md documented a standalone "openjarvis-evals"
package, a "uv sync --extra eval" install, and an "openjarvis-eval" console
script — a layout from commit bd493832 that was never an ancestor of main.
Rewrite the page against the real surface (jarvis eval / python -m
openjarvis.evals), document all 40 registered benchmark keys and 4 backends,
fix the judge-model default, correct run-all semantics, and split the option
reference into the jarvis-eval subset and the module CLI's research-only
options.
Add the one-line [project.scripts] alias
openjarvis-eval = "openjarvis.evals.cli:main" (the click group the module
CLI already dispatches to) so the long-documented command name works again.
The page was a complete orphan: add it (and the equally orphaned
benchmarks.md) to the mkdocs nav and link it from docs/index.md.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
206 lines
6.6 KiB
TOML
206 lines
6.6 KiB
TOML
[build-system]
|
||
requires = ["hatchling"]
|
||
build-backend = "hatchling.build"
|
||
|
||
[project]
|
||
name = "OpenJarvis"
|
||
version = "1.0.2"
|
||
description = "OpenJarvis — modular AI assistant backend with composable intelligence primitives"
|
||
readme = "README.md"
|
||
# Upper bound: numpy 2.2.x (pinned transitively via datasets/pandas) ships no
|
||
# cp314 Windows wheel, so under Python 3.14 uv would compile numpy from source
|
||
# (Meson) and fail on Windows boxes without a C toolchain (#350). Cap to the
|
||
# range that has prebuilt wheels; matches the classifiers (3.10–3.13).
|
||
requires-python = ">=3.10,<3.14"
|
||
license = {text = "Apache-2.0"}
|
||
authors = [
|
||
{name = "Open Jarvis Contributors"},
|
||
]
|
||
classifiers = [
|
||
"Development Status :: 3 - Alpha",
|
||
"Intended Audience :: Developers",
|
||
"License :: OSI Approved :: Apache Software License",
|
||
"Programming Language :: Python :: 3",
|
||
"Programming Language :: Python :: 3.10",
|
||
"Programming Language :: Python :: 3.11",
|
||
"Programming Language :: Python :: 3.12",
|
||
"Programming Language :: Python :: 3.13",
|
||
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
||
]
|
||
dependencies = [
|
||
"click>=8",
|
||
"datasets>=4.5.0",
|
||
"ddgs>=9.11.4",
|
||
"httpx>=0.27",
|
||
"openai>=1.30",
|
||
"nvidia-ml-py>=12.560.30",
|
||
"posthog>=3.0",
|
||
"python-telegram-bot>=22.6",
|
||
"rich>=13",
|
||
"tomli>=2.0; python_version < '3.11'",
|
||
"tomlkit>=0.12",
|
||
"websockets>=15.0.1",
|
||
]
|
||
|
||
[project.optional-dependencies]
|
||
dev = [
|
||
"maturin>=1.12.6",
|
||
"pytest>=8",
|
||
"pytest-asyncio>=0.24",
|
||
"pytest-cov>=5",
|
||
"respx>=0.22",
|
||
"ruff>=0.4",
|
||
"pre-commit>=3.0",
|
||
]
|
||
inference-mlx = ["mlx-lm>=0.31.1; sys_platform == 'darwin'"]
|
||
inference-vllm = ["vllm>=0.16.0"]
|
||
inference-cloud = [
|
||
"openai>=1.30",
|
||
"anthropic>=0.30",
|
||
]
|
||
inference-google = [
|
||
"google-genai>=1.0",
|
||
]
|
||
inference-litellm = ["litellm>=1.40"]
|
||
inference-gemma = ["pygemma>=0.1.3"]
|
||
tools-search = [
|
||
"tavily-python>=0.3",
|
||
"ddgs>=9.11.4",
|
||
]
|
||
memory-faiss = [
|
||
"faiss-cpu>=1.7",
|
||
"sentence-transformers>=2.2",
|
||
"numpy>=1.24",
|
||
]
|
||
memory-colbert = [
|
||
"colbert-ai>=0.2",
|
||
"torch>=2.0",
|
||
]
|
||
memory-pdf = ["pdfplumber>=0.10"]
|
||
memory-bm25 = ["rank-bm25>=0.2.2"]
|
||
server = [
|
||
"fastapi>=0.110",
|
||
"uvicorn>=0.30",
|
||
"pydantic>=2.0",
|
||
"python-multipart>=0.0.9",
|
||
]
|
||
openhands = ["openhands-sdk>=1.0; python_version >= '3.12'"]
|
||
gpu-metrics = ["pynvml>=12.0"]
|
||
energy-amd = ["amdsmi>=6.1"]
|
||
energy-apple = ["zeus-ml[apple]"]
|
||
energy-all = ["pynvml>=12.0", "amdsmi>=6.1", "zeus-ml[apple]"]
|
||
orchestrator-training = ["torch>=2.0", "transformers>=4.40"]
|
||
learning-dspy = ["dspy>=2.6"]
|
||
learning-gepa = ["gepa>=0.1"]
|
||
channel-telegram = ["python-telegram-bot>=21.0"]
|
||
channel-discord = ["discord.py>=2.3"]
|
||
channel-slack = ["slack-sdk>=3.27"]
|
||
channel-line = ["line-bot-sdk>=3.0"]
|
||
channel-viber = ["viberbot>=1.0"]
|
||
channel-messenger = ["pymessenger>=0.0.7"]
|
||
channel-reddit = ["praw>=7.0"]
|
||
channel-mastodon = ["Mastodon.py>=1.8"]
|
||
channel-xmpp = ["slixmpp>=1.8"]
|
||
channel-rocketchat = ["rocketchat-API>=1.30"]
|
||
channel-zulip = ["zulip>=0.9"]
|
||
channel-twitter = ["httpx>=0.27"]
|
||
channel-twitch = ["twitchio>=2.6"]
|
||
channel-nostr = ["pynostr>=0.6"]
|
||
channel-twilio = ["twilio>=9.0"]
|
||
channel-gmail = [
|
||
"google-api-python-client>=2.0",
|
||
"google-auth-oauthlib>=1.0",
|
||
"google-auth-httplib2>=0.2",
|
||
]
|
||
browser = ["playwright>=1.40"]
|
||
media = ["openai>=1.30"]
|
||
mining-pearl-vllm = ["docker>=7.0", "httpx>=0.27"]
|
||
pdf = ["pdfplumber>=0.10"]
|
||
scheduler = ["croniter>=2.0"]
|
||
security-signing = ["cryptography>=43"]
|
||
sandbox-wasm = ["wasmtime>=25"]
|
||
sandbox-docker = ["docker>=7.0"]
|
||
dashboard = ["textual>=0.80"]
|
||
speech = ["faster-whisper>=1.0"]
|
||
speech-deepgram = ["deepgram-sdk>=3.0"]
|
||
eval-wandb = ["wandb>=0.17"]
|
||
eval-sheets = ["gspread>=6.0", "google-auth>=2.0"]
|
||
mining-pearl-cpu = [
|
||
# Pearl Python packages (py-pearl-mining, miner-base, pearl-gateway) are
|
||
# not on PyPI yet. They are installed at first `mine init` via the
|
||
# build-from-pin path in src/openjarvis/mining/_install.py:build_from_pin().
|
||
# When Pearl publishes wheels, replace the line below with version pins.
|
||
#
|
||
# The extra remains as a feature-flag namespace so users can run
|
||
# `uv sync --extra mining-pearl-cpu` to opt-in (it succeeds with no
|
||
# additional resolution today; the actual install happens on demand).
|
||
]
|
||
framework-comparison = ["polars>=1.0"]
|
||
docs = [
|
||
"mkdocs>=1.6",
|
||
"mkdocs-material>=9.5",
|
||
"mkdocstrings[python]>=0.25",
|
||
"mkdocs-gen-files>=0.5",
|
||
"mkdocs-literate-nav>=0.6",
|
||
]
|
||
|
||
[project.urls]
|
||
Homepage = "https://github.com/open-jarvis/OpenJarvis"
|
||
Documentation = "https://open-jarvis.github.io/OpenJarvis/"
|
||
Repository = "https://github.com/open-jarvis/OpenJarvis"
|
||
Issues = "https://github.com/open-jarvis/OpenJarvis/issues"
|
||
|
||
[project.scripts]
|
||
jarvis = "openjarvis.cli:main"
|
||
openjarvis-eval = "openjarvis.evals.cli:main"
|
||
|
||
[tool.hatch.build.targets.wheel]
|
||
packages = ["src/openjarvis"]
|
||
|
||
[tool.hatch.build.targets.wheel.force-include]
|
||
"src/openjarvis/agents/claude_code_runner" = "_node_modules/claude_code_runner"
|
||
"src/openjarvis/channels/whatsapp_baileys_bridge" = "_node_modules/whatsapp_baileys_bridge"
|
||
"scripts/install" = "_install_scripts"
|
||
"deploy/windows" = "_deploy/windows"
|
||
|
||
[tool.pytest.ini_options]
|
||
testpaths = ["tests"]
|
||
markers = [
|
||
"amd: requires AMD GPU",
|
||
"apple: requires Apple Silicon",
|
||
"cloud: requires cloud API keys",
|
||
"docker: requires a working Docker daemon (no GPU required)",
|
||
"live: requires running inference engine",
|
||
"macos15: requires macOS 15+ (Sequoia) for Apple FM",
|
||
"live_channel: requires real channel credentials (env vars)",
|
||
"nvidia: requires NVIDIA GPU",
|
||
"slow: long-running test",
|
||
"hub: downloads real datasets from the HuggingFace Hub at runtime; excluded from the default CI lane (run with -m hub)",
|
||
"live_external: requires HERMES_AGENT_PATH and OPENCLAW_PATH; spawns real foreign-framework subprocesses",
|
||
"modal: requires Modal token + network; runs real swebench harness on Modal",
|
||
]
|
||
|
||
[tool.ruff]
|
||
target-version = "py310"
|
||
src = ["src", "tests"]
|
||
|
||
[tool.ruff.lint]
|
||
select = ["E", "F", "I", "W"]
|
||
|
||
[tool.ruff.lint.per-file-ignores]
|
||
"src/openjarvis/evals/datasets/*.py" = ["E501"]
|
||
"src/openjarvis/evals/scorers/*.py" = ["E501"]
|
||
# hybrid/ is research code with long prompt strings and paradigm-specific
|
||
# config dicts — same relaxation as evals research code above. The ``**`` glob
|
||
# also covers subpackages (e.g. hybrid/skillorchestra/), which the prior
|
||
# ``hybrid/*.py`` glob missed.
|
||
"src/openjarvis/agents/hybrid/**/*.py" = ["E501"]
|
||
# research_loop.py carries long prompt strings too (documented in CLAUDE.md);
|
||
# the ignore was missing here.
|
||
"src/openjarvis/agents/research_loop.py" = ["E501"]
|
||
|
||
[dependency-groups]
|
||
dev = [
|
||
"maturin>=1.12.6",
|
||
]
|