[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "openjarvis" version = "0.1.0" description = "OpenJarvis — modular AI assistant backend with composable intelligence primitives" readme = "README.md" requires-python = ">=3.10" dependencies = [ "click>=8", "datasets>=4.5.0", "ddgs>=9.11.4", "httpx>=0.27", "openai>=1.30", "python-telegram-bot>=22.6", "rich>=13", "tomli>=2.0; python_version < '3.11'", "tomlkit>=0.12", ] [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.19; 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-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", ] channel-twitter = ["tweepy>=4.14"] browser = ["playwright>=1.40"] media = ["openai>=1.30"] 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"] docs = [ "mkdocs>=1.6", "mkdocs-material>=9.5", "mkdocstrings[python]>=0.25", "mkdocs-gen-files>=0.5", "mkdocs-literate-nav>=0.6", ] [project.scripts] jarvis = "openjarvis.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" [tool.pytest.ini_options] testpaths = ["tests"] markers = [ "live: requires running inference engine", "cloud: requires cloud API keys", "nvidia: requires NVIDIA GPU", "amd: requires AMD GPU", "apple: requires Apple Silicon", "macos15: requires macOS 15+ (Sequoia) for Apple FM", "slow: long-running test", "live_channel: requires real channel credentials (env vars)", ] [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"] [dependency-groups] dev = [ "maturin>=1.12.6", ]