Files
Artemis-Eapil/artemis/utils/verification.py
T
somew1nd 206a9ce921 feat: initial release of ARTEMIS Android Agent & Automation Platform
ARTEMIS is an autonomous multimodal Android agent and mobile UI automation
platform engineered for physical devices and emulators. It combines state-of-the-art
multimodal Vision-Language Models (VLMs) with hierarchical closed-loop planning,
resilient self-healing, and deep Android subsystem integration.

Key Features & Architectural Highlights:
- Dual-Engine Orchestration:
  * Pro Engine: Multi-agent closed-loop (Planner -> Operator -> Validator/Failure Analyzer -> Summarizer) powered by LangGraph.
  * Flash Engine: Ultra-fast reactive loop for deterministic, low-latency UI execution (<35 steps).
- Multimodal Perception & Grounding:
  * Hybrid visual screenshot grounding, real-time OCR extraction, and XML accessibility hierarchy parsing.
  * Dynamic-First, Coordinate-Fallback locating strategy for maximum resilience against UI drift.
- Autonomous Self-Healing & Diagnostics:
  * Failure analyzer and safety net for popup dismissal, crash recovery, and auto-retry.
  * Diagnostic sub-agents for log analysis, video recording inspection, and object detection.
- Unified CLI & Python SDK:
  * Rich CLI with commands: init, doctor, run, trace, batch, bench, server, and mcp.
  * Fluent Python SDK with Pydantic structured output models and package locking.
- Multi-Provider LLM Architecture:
  * Support for Google Gemini, OpenAI, Anthropic Claude, Vertex AI, OpenRouter, xAI Grok, and local endpoints (Ollama/vLLM).
  * Centralized configuration in config/artemis.jsonc.
- Native MCP & Observability:
  * Model Context Protocol (MCP) server endpoints for AI IDEs.
  * Full trace recording with before/after screenshots, action overlays, and execution replays.

Change-Id: I430b93ee2b76b54cc5a3c6eeccd15d2cf29830a1
2026-08-13 11:46:47 -07:00

63 lines
2.3 KiB
Python

# 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.
import json
from pathlib import Path
from artemis.utils.logger import get_logger
from artemis.utils.notes import get_notes_dir
logger = get_logger(__name__)
def get_verification_chat_path(base_dir: str | Path, subgoal_hash: str) -> Path:
"""Gets the path to the verification chat file for a given subgoal."""
notes_dir = get_notes_dir(base_dir)
return notes_dir / f"verification_chat_{subgoal_hash}.json"
def read_verification_chat(chat_path: Path) -> list[dict]:
"""Reads the verification chat history from the given path."""
if not chat_path.exists():
return []
try:
return json.loads(chat_path.read_text(encoding="utf-8"))
except Exception as e:
logger.error(f"Failed to load verification chat from {chat_path}: {e}")
return []
def get_verification_chat_rounds(turns: list[dict]) -> tuple[int, int]:
"""Calculates the maximum rounds for operator and checker from the turns."""
max_op = max(
[t.get("round", 0) for t in turns if t.get("role") == "operator"],
default=0,
)
max_chk = max(
[t.get("round", 0) for t in turns if t.get("role") == "checker"],
default=0,
)
return max_op, max_chk
def append_verification_chat(chat_path: Path, role: str, content: str, round_num: int) -> bool:
"""Appends a new turn to the verification chat file."""
turns = read_verification_chat(chat_path)
turns.append({"role": role, "round": round_num, "content": content})
try:
chat_path.write_text(json.dumps(turns, indent=2, ensure_ascii=False), encoding="utf-8")
return True
except Exception as e:
logger.error(f"Failed to save verification chat to {chat_path}: {e}")
return False