# Copyright 2026 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. [project] name = "artemis" version = "3.6.3" description = "Artemis Android Agent" authors = [ { name = "somew1nd", email = "wfq559@outlook.com" }, ] requires-python = ">=3.12" dependencies = [ # Orchestration & Framework "langgraph>=1.0.2,<2.0.0", "langchain>=1.0.0", "langchain-core>=1.0.0", "langchain-community>=0.4.1", "langchain-mcp-adapters>=0.2.0", "mcp>=1.26.0", # LLM Providers & GenAI SDKs "google-genai>=0.1.1", "langchain-google-genai>=4.0.0", "langchain-google-vertexai>=3.0.0", "langchain-openai>=1.0.0", # Configuration, Models & Validation "pydantic>=2.7.0", "pydantic-settings>=2.10.1", "python-dotenv>=1.0.1", "jinja2>=3.1.5", "typing-extensions>=4.12.0", # Android Automation & Device Subsystem "adbutils>=2.12.0", "uiautomator2>=3.5.0", # CLI & Rich Terminal UI "typer>=0.12.0", "rich>=13.7.0", "inquirer>=3.4.0", "colorama>=0.4.6", # Web, API & Networking "fastapi>=0.111.0", "uvicorn[standard]>=0.30.1", "httpx>=0.28.1", "requests>=2.31.0", "websockets>=12.0", "sseclient-py>=1.8.0", # Image, Video & Multimodal Perception "pillow>=10.0.0", "opencv-python>=4.9.0.80", "imageio-ffmpeg>=0.5.1", "matplotlib>=3.8.0", "numpy>=1.26.0", "scipy>=1.13.0", # System, Utilities & Telemetry "psutil>=5.9.0", "retry>=0.9.2", "posthog>=3.5.0", "uuid-utils>=0.9.0", "jupyter-client>=8.6.0", "ipykernel>=6.29.0", "langchain-anthropic>=1.5.4", ] [project.optional-dependencies] dev = [ "ruff>=0.15.2", "pytest>=8.4.1", "pytest-asyncio>=0.23.0", "pytest-cov>=5.0.0", "syrupy>=4.0.0", "pyright>=1.1.389", "pre-commit>=3.5.0", ] [project.scripts] artemis = "artemis.interfaces.cli.main:cli" artemis-admin = "apps.admin_console.server:main" [build-system] requires = ["setuptools>=61.0", "Cython"] build-backend = "setuptools.build_meta" [tool.ruff] # Exclude a variety of commonly ignored directories. exclude = [ ".bzr", ".direnv", ".eggs", ".git", ".git-rewrite", ".hg", ".ipynb_checkpoints", ".mypy_cache", ".nox", ".pants.d", ".pyenv", ".pytest_cache", ".pytype", ".ruff_cache", ".svn", ".tox", ".venv", ".vscode", "__pypackages__", "_build", "buck-out", "build", "dist", "node_modules", "site-packages", "venv", ] # Same as Black. line-length = 100 indent-width = 4 target-version = "py312" [tool.ruff.lint] # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. # Also enable TID (flake8-tidy-imports) to enforce absolute imports select = ["E", "F", "TID", "UP"] ignore = ["E501"] # Allow fix for all enabled rules (when `--fix`) is provided. fixable = ["ALL"] unfixable = [] # Allow unused variables when underscore-prefixed. dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" [tool.ruff.lint.flake8-tidy-imports] # Ban relative imports ban-relative-imports = "all" [tool.ruff.format] # Like Black, use double quotes for strings. quote-style = "double" # Like Black, indent with spaces, rather than tabs. indent-style = "space" # Like Black, respect magic trailing commas. skip-magic-trailing-comma = false # Like Black, automatically detect the appropriate line ending. line-ending = "auto" [tool.pytest.ini_options] # Add project root and apps to Python path for clean absolute imports pythonpath = [ ".", "apps", "apps/admin_console", ] # Specify test discovery patterns testpaths = [ "tests" ] python_files = [ "*.test.py", "test_*.py", "*_test.py" ] python_functions = [ "test_*" ] python_classes = [ "Test*" ] # Add useful options addopts = [ "-v", # verbose output "--tb=short", # shorter traceback format "--strict-markers", # strict marker checking "--disable-warnings", # disable warnings for cleaner output ] markers = [ "android: tests requiring Android device or emulator", ] [tool.pylint.master] ignore = [".venv", "build", "dist"] recursive = "yes" [tool.pylint.messages_control] disable = [ "C0114", # missing-module-docstring "R0801", # duplicate-code ] [dependency-groups] dev = [ "ruff>=0.15.2", "pytest>=8.4.1", "pytest-asyncio>=1.2.0", "pytest-cov>=5.0.0", "pyright>=1.1.389", "pre-commit>=3.5.0", ]