From d97f86ef0de245e58980f8074ebe47e015683090 Mon Sep 17 00:00:00 2001 From: Richard Abrich Date: Fri, 16 Jan 2026 23:46:45 -0500 Subject: [PATCH 1/2] docs: Add evolved architecture diagram to README and architecture-evolution.md - Three-phase pipeline: DEMONSTRATE, LEARN, EXECUTE with modernized terminology - Demo-conditioned prompting as core innovation (show, don't tell) - Policy/Grounding separation in EXECUTE phase - Safety Gate as runtime layer with validation and risk assessment - Multi-source data ingestion (human demos, synthetic data, benchmarks) - Evaluation-driven feedback loops (success traces become training data) - Abstraction Ladder visualization (Literal -> Symbolic -> Template -> Semantic -> Goal) - Retrieval used in BOTH training AND evaluation for demo conditioning - Solid lines = implemented, dashed = future Co-Authored-By: Claude Sonnet 4.5 --- README.md | 264 +++++-- docs/architecture-evolution.md | 1275 ++++++++++++++++++++++++++++++++ 2 files changed, 1475 insertions(+), 64 deletions(-) create mode 100644 docs/architecture-evolution.md diff --git a/README.md b/README.md index 4c8e7b9b5..c1e34f762 100644 --- a/README.md +++ b/README.md @@ -102,104 +102,240 @@ openadapt doctor Check system requirements ## How It Works -See the full [Architecture Documentation](docs/architecture.md) for detailed diagrams. +See the full [Architecture Evolution](docs/architecture-evolution.md) for detailed documentation. + +### Three-Phase Pipeline ```mermaid flowchart TB - %% Main workflow phases - subgraph Record["1. RECORD"] + %% ═══════════════════════════════════════════════════════════════════════ + %% DATA SOURCES (Multi-Source Ingestion) + %% ═══════════════════════════════════════════════════════════════════════ + subgraph DataSources["Data Sources"] + direction LR + HUMAN["Human Demos"] + SYNTH["Synthetic Data"]:::future + BENCH_DATA["Benchmark Tasks"] + end + + %% ═══════════════════════════════════════════════════════════════════════ + %% PHASE 1: DEMONSTRATE (Observation Collection) + %% ═══════════════════════════════════════════════════════════════════════ + subgraph Demonstrate["1. DEMONSTRATE (Observation Collection)"] direction TB - DEMO[User Demo] --> CAPTURE[openadapt-capture] + CAP["Capture
openadapt-capture"] + PRIV["Privacy
openadapt-privacy"] + STORE[("Demo Library")] + + CAP --> PRIV + PRIV --> STORE end - subgraph Train["2. TRAIN"] + %% ═══════════════════════════════════════════════════════════════════════ + %% PHASE 2: LEARN (Policy Acquisition) + %% ═══════════════════════════════════════════════════════════════════════ + subgraph Learn["2. LEARN (Policy Acquisition)"] direction TB - DATA[Captured Data] --> ML[openadapt-ml] + + subgraph RetrievalPath["Retrieval Path"] + EMB["Embed"] + IDX["Index"] + SEARCH["Search"] + EMB --> IDX --> SEARCH + end + + subgraph TrainingPath["Training Path"] + LOADER["Load"] + TRAIN["Train"] + CKPT[("Checkpoint")] + LOADER --> TRAIN --> CKPT + end + + subgraph ProcessMining["Process Mining"]:::futureBlock + ABSTRACT["Abstract"]:::future + PATTERNS["Patterns"]:::future + ABSTRACT --> PATTERNS + end end - subgraph Deploy["3. DEPLOY"] + %% ═══════════════════════════════════════════════════════════════════════ + %% PHASE 3: EXECUTE (Agent Deployment) + %% ═══════════════════════════════════════════════════════════════════════ + subgraph Execute["3. EXECUTE (Agent Deployment)"] direction TB - MODEL[Trained Model] --> AGENT[Agent Policy] - AGENT --> REPLAY[Action Replay] + + subgraph AgentCore["Agent Core"] + OBS["Observe"] + POLICY["Policy
(Demo-Conditioned)"] + GROUND["Grounding
openadapt-grounding"] + ACT["Act"] + + OBS --> POLICY + POLICY --> GROUND + GROUND --> ACT + end + + subgraph SafetyGate["Safety Gate"]:::safetyBlock + VALIDATE["Validate"] + CONFIRM["Confirm"]:::future + VALIDATE --> CONFIRM + end + + subgraph Evaluation["Evaluation"] + EVALS["Evals
openadapt-evals"] + METRICS["Metrics"] + EVALS --> METRICS + end + + ACT --> VALIDATE + VALIDATE --> EVALS end - subgraph Evaluate["4. EVALUATE"] + %% ═══════════════════════════════════════════════════════════════════════ + %% THE ABSTRACTION LADDER (Side Panel) + %% ═══════════════════════════════════════════════════════════════════════ + subgraph AbstractionLadder["Abstraction Ladder"] direction TB - BENCH[Benchmarks] --> EVALS[openadapt-evals] - EVALS --> METRICS[Metrics] + L0["Literal
(Raw Events)"] + L1["Symbolic
(Semantic Actions)"] + L2["Template
(Parameterized)"] + L3["Semantic
(Intent)"]:::future + L4["Goal
(Task Spec)"]:::future + + L0 --> L1 + L1 --> L2 + L2 -.-> L3 + L3 -.-> L4 + end + + %% ═══════════════════════════════════════════════════════════════════════ + %% MODEL LAYER + %% ═══════════════════════════════════════════════════════════════════════ + subgraph Models["Model Layer (VLMs)"] + direction LR + CLAUDE["Claude"] + GPT["GPT-4o"] + GEMINI["Gemini"] + QWEN["Qwen-VL"] end - %% Main flow connections - CAPTURE --> DATA - ML --> MODEL - AGENT --> BENCH - - %% Viewer - independent component - VIEWER[openadapt-viewer] - VIEWER -.->|"view at any phase"| Record - VIEWER -.->|"view at any phase"| Train - VIEWER -.->|"view at any phase"| Deploy - VIEWER -.->|"view at any phase"| Evaluate - - %% Optional packages with integration points - PRIVACY[openadapt-privacy] - RETRIEVAL[openadapt-retrieval] - GROUNDING[openadapt-grounding] - - PRIVACY -.->|"PII/PHI scrubbing"| CAPTURE - RETRIEVAL -.->|"demo retrieval"| ML - GROUNDING -.->|"UI localization"| REPLAY - - %% Styling - classDef corePhase fill:#e1f5fe,stroke:#01579b - classDef optionalPkg fill:#fff3e0,stroke:#e65100,stroke-dasharray: 5 5 - classDef viewerPkg fill:#e8f5e9,stroke:#2e7d32,stroke-dasharray: 3 3 - - class Record,Train,Deploy,Evaluate corePhase - class PRIVACY,RETRIEVAL,GROUNDING optionalPkg - class VIEWER viewerPkg + %% ═══════════════════════════════════════════════════════════════════════ + %% MAIN DATA FLOW + %% ═══════════════════════════════════════════════════════════════════════ + + %% Data sources feed into phases + HUMAN --> CAP + SYNTH -.-> LOADER + BENCH_DATA --> EVALS + + %% Demo library feeds learning + STORE --> EMB + STORE --> LOADER + STORE -.-> ABSTRACT + + %% Learning outputs feed execution + SEARCH -->|"demo context"| POLICY + CKPT -->|"trained policy"| POLICY + PATTERNS -.->|"templates"| POLICY + + %% Model connections + POLICY --> Models + GROUND --> Models + + %% ═══════════════════════════════════════════════════════════════════════ + %% FEEDBACK LOOPS (Evaluation-Driven) + %% ═══════════════════════════════════════════════════════════════════════ + METRICS -->|"success traces"| STORE + METRICS -.->|"training signal"| TRAIN + + %% Retrieval in BOTH training AND evaluation + SEARCH -->|"eval conditioning"| EVALS + + %% ═══════════════════════════════════════════════════════════════════════ + %% STYLING + %% ═══════════════════════════════════════════════════════════════════════ + + %% Phase colors + classDef phase1 fill:#3498DB,stroke:#1A5276,color:#fff + classDef phase2 fill:#27AE60,stroke:#1E8449,color:#fff + classDef phase3 fill:#9B59B6,stroke:#6C3483,color:#fff + + %% Component states + classDef implemented fill:#2ECC71,stroke:#1E8449,color:#fff + classDef future fill:#95A5A6,stroke:#707B7C,color:#fff,stroke-dasharray: 5 5 + classDef futureBlock fill:#f5f5f5,stroke:#95A5A6,stroke-dasharray: 5 5 + classDef safetyBlock fill:#E74C3C,stroke:#A93226,color:#fff + + %% Model layer + classDef models fill:#F39C12,stroke:#B7950B,color:#fff + + %% Apply styles + class CAP,PRIV,STORE phase1 + class EMB,IDX,SEARCH,LOADER,TRAIN,CKPT phase2 + class OBS,POLICY,GROUND,ACT,VALIDATE,EVALS,METRICS phase3 + class CLAUDE,GPT,GEMINI,QWEN models + class L0,L1,L2 implemented ``` -OpenAdapt: -- Records screenshots and user input events -- Trains ML models on demonstrations -- Generates and replays synthetic input via model completions -- Evaluates agents on GUI automation benchmarks +### Core Innovation: Demo-Conditioned Prompting + +OpenAdapt's key differentiator is **demonstration-conditioned automation** - "show, don't tell": + +| Traditional Agent | OpenAdapt Agent | +|-------------------|-----------------| +| User writes prompts | User records demonstration | +| Ambiguous instructions | Grounded in actual UI | +| Requires prompt engineering | No technical expertise needed | +| Context-free | Context from similar demos | + +**Retrieval powers BOTH training AND evaluation**: Similar demonstrations are retrieved as context for the VLM, improving accuracy from 33% to 100% on first-action benchmarks. -**Key differentiators:** -1. Model agnostic - works with any LMM -2. Auto-prompted from human demonstration (not user-prompted) -3. Works with all desktop GUIs including virtualized and web -4. Open source (MIT license) +### Key Concepts + +- **Policy/Grounding Separation**: The Policy decides *what* to do; Grounding determines *where* to do it +- **Safety Gate**: Runtime validation layer before action execution (confirm mode for high-risk actions) +- **Abstraction Ladder**: Progressive generalization from literal replay to goal-level automation +- **Evaluation-Driven Feedback**: Success traces become new training data + +**Legend:** Solid = Implemented | Dashed = Future --- -## Key Concepts +## Terminology (Aligned with GUI Agent Literature) + +| Term | Description | +|------|-------------| +| **Observation** | What the agent perceives (screenshot, accessibility tree) | +| **Action** | What the agent does (click, type, scroll, etc.) | +| **Trajectory** | Sequence of observation-action pairs | +| **Demonstration** | Human-provided example trajectory | +| **Policy** | Decision-making component that maps observations to actions | +| **Grounding** | Mapping intent to specific UI elements (coordinates) | -### Meta-Package Structure +## Meta-Package Structure OpenAdapt v1.0+ uses a **modular architecture** where the main `openadapt` package acts as a meta-package that coordinates focused sub-packages: -- **Core Packages**: Essential for the main workflow - - `openadapt-capture` - Records screenshots and input events - - `openadapt-ml` - Trains models on demonstrations - - `openadapt-evals` - Evaluates agents on benchmarks +- **Core Packages**: Essential for the three-phase pipeline + - `openadapt-capture` - DEMONSTRATE phase: Collects observations and actions + - `openadapt-ml` - LEARN phase: Trains policies from demonstrations + - `openadapt-evals` - EXECUTE phase: Evaluates agents on benchmarks - **Optional Packages**: Enhance specific workflow phases - - `openadapt-privacy` - Integrates at **Record** phase for PII/PHI scrubbing - - `openadapt-retrieval` - Integrates at **Train** phase for multimodal demo retrieval - - `openadapt-grounding` - Integrates at **Deploy** phase for UI element localization + - `openadapt-privacy` - DEMONSTRATE: PII/PHI scrubbing before storage + - `openadapt-retrieval` - LEARN + EXECUTE: Demo conditioning for both training and evaluation + - `openadapt-grounding` - EXECUTE: UI element localization (SoM, OmniParser) -- **Independent Components**: - - `openadapt-viewer` - HTML visualization that works with any phase +- **Cross-Cutting**: + - `openadapt-viewer` - Trajectory visualization at any phase ### Two Paths to Automation -1. **Custom Training Path**: Record demonstrations -> Train your own model -> Deploy agent +1. **Custom Training Path**: Demonstrate -> Train policy -> Deploy agent - Best for: Repetitive tasks specific to your workflow - Requires: `openadapt[core]` -2. **API Agent Path**: Use pre-trained LMM APIs (Claude, GPT-4V, etc.) -> Evaluate on benchmarks +2. **API Agent Path**: Use pre-trained VLM APIs (Claude, GPT-4V, etc.) with demo conditioning - Best for: General-purpose automation, rapid prototyping - Requires: `openadapt[evals]` diff --git a/docs/architecture-evolution.md b/docs/architecture-evolution.md new file mode 100644 index 000000000..4426782a1 --- /dev/null +++ b/docs/architecture-evolution.md @@ -0,0 +1,1275 @@ +# OpenAdapt Architecture Evolution + +**Version**: 2.0 +**Date**: January 2026 +**Status**: Living Document + +--- + +## Executive Summary + +This document synthesizes OpenAdapt's original alpha vision with modern GUI agent state-of-the-art (SOTA) research. It defines the architectural principles, implementation status, and roadmap for OpenAdapt as the leading open-source demonstration-conditioned GUI automation framework. + +--- + +## Table of Contents + +1. [Core Insight: Demonstration-Conditioned Automation](#1-core-insight-demonstration-conditioned-automation) +2. [The Abstraction Ladder](#2-the-abstraction-ladder) +3. [Three-Phase Architecture](#3-three-phase-architecture) +4. [Package Responsibilities](#4-package-responsibilities) +5. [Feedback Loops](#5-feedback-loops) +6. [Model Layer](#6-model-layer) +7. [Implementation Status](#7-implementation-status) +8. [Architecture Diagrams](#8-architecture-diagrams) +9. [Key Design Principles](#9-key-design-principles) +10. [Research Alignment](#10-research-alignment) +11. [Future Directions](#11-future-directions) + +--- + +## 1. Core Insight: Demonstration-Conditioned Automation + +### The Fundamental Differentiator + +OpenAdapt's fundamental differentiator is **demonstration-conditioned automation**: "show, don't tell." + +| Approach | Description | Example | +|----------|-------------|---------| +| **Prompt-Driven** (Traditional) | User describes what to do in natural language | "Book a flight from NYC to LA for next Tuesday" | +| **Demo-Conditioned** (OpenAdapt) | Agent learns from watching user perform the task | Record user booking a flight, replay with new parameters | + +### Why This Matters + +1. **Reduced Ambiguity**: Demonstrations capture implicit knowledge that's hard to verbalize +2. **Grounded in Reality**: Agents learn from actual UI interactions, not abstract descriptions +3. **Lower Barrier to Entry**: Users don't need prompt engineering skills +4. **Validated Improvement**: 33% to 100% first-action accuracy with demo conditioning (internal benchmarks) + +### The "Show, Don't Tell" Principle + +``` +Traditional Agent: + User: "Click the submit button" + Agent: [Which submit button? What context? What state?] + +Demo-Conditioned Agent: + User: [Records clicking the blue "Submit Order" button after filling form] + Agent: [Learns the full context: form state, button appearance, preceding actions] +``` + +--- + +## 2. The Abstraction Ladder + +OpenAdapt processes demonstrations through progressive abstraction levels, enabling generalization, transfer learning, and explainability. + +### Abstraction Levels + +``` +Level 0 - LITERAL (Raw Events) + { press: "h", press: "i", press: " ", press: "b", press: "o", press: "b" } + + | Reduction (aggregate consecutive events) + v + +Level 1 - SYMBOLIC (Semantic Actions) + { type: "hi bob" } + + | Anonymization (extract parameters) + v + +Level 2 - TEMPLATE (Parameterized Actions) + { type: "hi " } + + | Process Mining (discover patterns) + v + +Level 3 - SEMANTIC (Intent Recognition) + { greet: user } + + | Goal Composition (high-level planning) + v + +Level 4 - GOAL (Task Specification) + "Say hello to the customer" +``` + +### Abstraction Benefits + +| Level | Enables | Example Use Case | +|-------|---------|------------------| +| Literal | Exact replay | Debugging, audit trails | +| Symbolic | Human-readable logs | Training data visualization | +| Template | Parameterized replay | Same task, different data | +| Semantic | Cross-application transfer | Greeting in any messaging app | +| Goal | Natural language control | "Greet the next customer" | + +### Current Implementation Status + +- **Literal to Symbolic**: Implemented in `openadapt-capture` (event aggregation) +- **Symbolic to Template**: Partially implemented (regex-based extraction) +- **Template to Semantic**: Research stage (LLM-based intent recognition) +- **Semantic to Goal**: Future work (requires process mining) + +--- + +## 3. Three-Phase Architecture + +OpenAdapt operates in three distinct phases, each with dedicated packages and responsibilities. + +### Phase Overview + +``` ++------------------+ +------------------+ +------------------+ +| | | | | | +| DEMONSTRATE | --> | LEARN | --> | EXECUTE | +| | | | | | +| (Observation | | (Policy | | (Agent | +| Collection) | | Acquisition) | | Deployment) | +| | | | | | ++------------------+ +------------------+ +------------------+ +``` + +--- + +### Phase 1: DEMONSTRATE (Observation Collection) + +**Purpose**: Capture rich trajectories from human demonstrations. + +**Inputs**: +- User performs task in target application +- Optional: Task description, success criteria, audio narration + +**Outputs**: +- Screenshot sequences (PNG/JPEG) +- Input events (mouse, keyboard, touch) +- Accessibility tree snapshots (a11y) +- Window metadata (title, bounds, process) +- Audio transcription (optional) + +**Privacy Integration**: +- Optional PII/PHI scrubbing before storage +- Configurable redaction levels + +**Storage Format**: +- JSON for metadata and events +- Parquet for efficient batch access +- PNG/JPEG for screenshots + +**Packages**: `openadapt-capture`, `openadapt-privacy` + +--- + +### Phase 2: LEARN (Policy Acquisition) + +**Purpose**: Transform demonstrations into executable agent policies. + +**Three Learning Paths**: + +#### Path A: Retrieval-Augmented Prompting +- Index demonstrations in vector database +- At inference, retrieve similar demos as context +- Condition API agent (Claude, GPT, Gemini) on retrieved examples +- **Advantage**: Works with any VLM, no training required +- **Package**: `openadapt-retrieval` + +#### Path B: Fine-Tuning +- Train/fine-tune VLM on demonstration dataset +- Use LoRA for parameter-efficient training +- Deploy locally or via inference API +- **Advantage**: Specialized performance, privacy, lower inference cost +- **Package**: `openadapt-ml` + +#### Path C: Process Mining +- Extract reusable action patterns across demonstrations +- Build abstraction hierarchy (template, semantic, goal) +- Enable cross-task transfer learning +- **Status**: Research/Future +- **Package**: `openadapt-ml` (future) + +**Outputs**: +- Vector embeddings for retrieval +- Model checkpoints for fine-tuned models +- Process graphs for abstraction (future) + +--- + +### Phase 3: EXECUTE (Agent Deployment) + +**Purpose**: Run trained/conditioned agents to perform tasks autonomously. + +**Execution Loop**: + +``` +while not task_complete: + 1. OBSERVE + - Capture current screenshot + - Extract accessibility tree + - Build observation state + + 2. GROUND + - Localize UI elements (bounding boxes) + - Apply Set-of-Mark (SoM) annotation + - Map elements to coordinates or IDs + + 3. PLAN + - Encode observation with VLM + - Condition on goal + history + retrieved demos + - Generate action prediction + + 4. ACT + - Parse action (click, type, scroll, etc.) + - Execute via input synthesis + - Record action for history + + 5. EVALUATE + - Check for success indicators + - Detect failure patterns + - Decide: continue, retry, or escalate +``` + +**Grounding Modes**: + +| Mode | Description | Accuracy | Use Case | +|------|-------------|----------|----------| +| **Direct** | VLM predicts raw (x, y) coordinates | Variable | Simple, fast | +| **Set-of-Mark (SoM)** | UI elements labeled with IDs, VLM selects ID | High | Complex UIs | +| **Hybrid** | SoM for elements, Direct for fine positioning | Highest | Production | + +**Packages**: `openadapt-grounding`, `openadapt-evals`, `openadapt-ml` + +--- + +## 4. Package Responsibilities + +### Core Packages + +| Package | Phase | Responsibility | Key Exports | +|---------|-------|----------------|-------------| +| `openadapt-capture` | DEMONSTRATE | GUI recording, event capture, storage | `Recorder`, `CaptureSession`, `Action`, `Screenshot` | +| `openadapt-ml` | LEARN | Model training, inference, adapters | `Trainer`, `AgentPolicy`, `VLMAdapter` | +| `openadapt-evals` | EXECUTE | Benchmark evaluation, metrics | `BenchmarkAdapter`, `ApiAgent`, `evaluate_agent` | +| `openadapt-viewer` | Cross-cutting | HTML visualization, replay | `PageBuilder`, `HTMLBuilder`, `TrajectoryViewer` | + +### Optional Packages + +| Package | Phase | Responsibility | Key Exports | +|---------|-------|----------------|-------------| +| `openadapt-grounding` | EXECUTE | UI element localization | `OmniParser`, `Florence2`, `GeminiGrounder` | +| `openadapt-retrieval` | LEARN | Multimodal demo search | `DemoRetriever`, `VectorIndex`, `Embedder` | +| `openadapt-privacy` | DEMONSTRATE | PII/PHI scrubbing | `Scrubber`, `Redactor`, `PrivacyFilter` | + +### Package Dependency Matrix + +``` + capture ml evals viewer grounding retrieval privacy +openadapt-capture - - - - - - O +openadapt-ml R - - - O O - +openadapt-evals - R - O O O - +openadapt-viewer O O O - - - O +openadapt-grounding - - - - - - - +openadapt-retrieval R - - - - - - +openadapt-privacy - - - - - - - + +Legend: R = Required, O = Optional, - = None +``` + +--- + +## 5. Feedback Loops + +OpenAdapt implements continuous improvement through three feedback loops. + +### System Diagram + +``` + DEMONSTRATE + | + | Human demonstrations + v ++--------------------------> LEARN <--------------------------+ +| | | +| | Trained policies | +| +--------------------------|---------------------+ | +| | v | | +| | +----------------> EXECUTE <--------------+ | | +| | | | | | | +| | | Retry on | Success/Failure | | | +| | | recoverable | outcomes | | | +| | | errors v | | | +| | | +-------+-------+ | | | +| | | | | | | | +| | +--------------+ EVALUATE +----------+ | | +| | | | | | +| | +-------+-------+ | | +| | | | | +| | | Execution traces | | +| | v | | +| | Demo library grows | | +| | | | | +| +--------------------------+ | | +| | | +| Failure analysis identifies gaps | | +| | | | +| v | | +| New demonstrations | | +| | | | ++--------------------+ | | + | | + Self-improvement loop | | + (execution traces -> training) | | + | | | + +----------------------+ | + | + Benchmark-driven development | + (eval results -> architecture improvements) | + | | + +--------------------------------+ +``` + +### Loop Details + +#### Loop 1: Demonstration Library Growth +- Successful executions are stored as new demonstrations +- Failed executions trigger gap analysis +- Human reviews and corrects failures +- Corrections become new training data + +#### Loop 2: Self-Improvement (Future) +- Agent traces its own execution +- Successful traces fine-tune the policy +- Automatic curriculum: easy to hard tasks +- Reduces need for human demonstrations over time + +#### Loop 3: Benchmark-Driven Development +- Regular evaluation on standard benchmarks +- Failure modes inform architecture changes +- New capabilities tested before merge +- Regression detection prevents quality drops + +--- + +## 6. Model Layer + +OpenAdapt is model-agnostic, supporting multiple foundation models through a unified adapter interface. + +### Supported Models + +#### API Providers (Cloud) + +| Provider | Model | Status | Best For | +|----------|-------|--------|----------| +| Anthropic | Claude 3.5 Sonnet | Implemented | General GUI tasks | +| OpenAI | GPT-4o | Implemented | Complex reasoning | +| Google | Gemini 2.0 Flash | Implemented | Cost-efficient | + +#### Local Models (Self-Hosted) + +| Model | Parameters | Status | Best For | +|-------|------------|--------|----------| +| Qwen2-VL | 2B-72B | Implemented | Fine-tuning, privacy | +| Qwen2.5-VL | 3B-72B | Planned | Next-gen local | +| Molmo | 7B | Research | Efficiency | + +### Adapter Interface + +```python +class VLMAdapter(Protocol): + """Protocol for VLM model adapters.""" + + def predict( + self, + screenshot: Image, + task: str, + history: list[Action], + context: Optional[list[Demo]] = None, + ) -> Action: + """Predict next action given observation.""" + ... + + def get_grounding( + self, + screenshot: Image, + element_description: str, + ) -> BoundingBox: + """Ground element description to coordinates.""" + ... +``` + +### Prompt Architecture + +OpenAdapt uses a structured prompting approach combining SOTA patterns: + +``` +SYSTEM: {role_definition} + +CONTEXT: +- Retrieved demonstrations (if available) +- Task description +- Success criteria + +OBSERVATION: +- Current screenshot (base64 or URL) +- Accessibility tree (structured) +- Element annotations (Set-of-Mark) + +HISTORY: +- Previous N actions and their outcomes +- Current step number + +INSTRUCTION: +- Action space definition +- Output format specification + +USER: What action should be taken next? +``` + +--- + +## 7. Implementation Status + +### Status Legend + +| Symbol | Meaning | +|--------|---------| +| Solid | Implemented and tested | +| Dashed | In progress or partial | +| Dotted | Planned/Future | + +### Component Status Matrix + +``` ++----------------------+------------------+------------------+ +| Component | Status | Package | ++----------------------+------------------+------------------+ +| DEMONSTRATE PHASE | ++----------------------+------------------+------------------+ +| Screen capture | Solid | capture | +| Event recording | Solid | capture | +| A11y tree capture | Solid | capture | +| Audio transcription | Dashed | capture | +| Privacy scrubbing | Solid | privacy | +| Demo library storage | Solid | capture | ++----------------------+------------------+------------------+ +| LEARN PHASE | ++----------------------+------------------+------------------+ +| Demo embedding | Solid | retrieval | +| Vector indexing | Solid | retrieval | +| Similarity search | Solid | retrieval | +| API model adapters | Solid | ml | +| Training pipeline | Dashed | ml | +| LoRA fine-tuning | Dashed | ml | +| Process mining | Dotted | ml (future) | ++----------------------+------------------+------------------+ +| EXECUTE PHASE | ++----------------------+------------------+------------------+ +| Action execution | Solid | capture | +| Direct grounding | Solid | grounding | +| SoM grounding | Solid | grounding | +| OmniParser provider | Solid | grounding | +| Florence2 provider | Solid | grounding | +| Gemini grounding | Solid | grounding | +| WAA benchmark | Solid | evals | +| WebArena benchmark | Dashed | evals | +| OSWorld benchmark | Dotted | evals | +| Mock benchmark | Solid | evals | ++----------------------+------------------+------------------+ +| CROSS-CUTTING | ++----------------------+------------------+------------------+ +| Viewer HTML output | Solid | viewer | +| Trajectory replay | Solid | viewer | +| Training dashboard | Dashed | viewer | +| Benchmark viewer | Dashed | viewer | +| Telemetry | Dotted | telemetry (new) | ++----------------------+------------------+------------------+ +``` + +### Priority Roadmap + +#### P0 - This Week +- [x] Capture package with Recorder +- [x] Retrieval with embedding and search +- [x] Evals with WAA benchmark + mock +- [x] Grounding providers (OmniParser, Florence, Gemini) +- [x] Viewer component library +- [x] API baselines (Claude, GPT, Gemini) +- [ ] PyPI releases for all packages +- [ ] WAA baseline metrics + +#### P1 - Next 2 Weeks +- [ ] Fine-tuning pipeline validation +- [ ] Demo conditioning integration in evals +- [ ] Multi-track evaluation (Direct, ReAct, SoM) +- [ ] docs.openadapt.ai launch + +#### P2 - This Month +- [ ] Training dashboard in viewer +- [ ] WebArena benchmark integration +- [ ] Cloud GPU training (Lambda Labs) +- [ ] v1.0.0 meta-package release + +#### P3 - Future +- [ ] Process mining / abstraction +- [ ] Self-improvement from execution traces +- [ ] Multi-agent collaboration +- [ ] Active learning with human feedback +- [ ] OSWorld benchmark integration + +--- + +## 8. Architecture Diagrams + +### Master Architecture Diagram (Evolved) + +This diagram synthesizes the three-phase pipeline with all key concepts: demo-conditioned prompting, policy/grounding separation, safety gate, multi-source data ingestion, the abstraction ladder, and evaluation-driven feedback loops. + +```mermaid +flowchart TB + %% ═══════════════════════════════════════════════════════════════════════ + %% USER LAYER + %% ═══════════════════════════════════════════════════════════════════════ + subgraph UserLayer["User Layer"] + CLI["openadapt CLI"] + UI["Desktop/Web GUI"] + end + + %% ═══════════════════════════════════════════════════════════════════════ + %% MULTI-SOURCE DATA INGESTION + %% ═══════════════════════════════════════════════════════════════════════ + subgraph DataSources["Multi-Source Data Ingestion"] + direction LR + HUMAN["Human
Demonstrations"] + SYNTH["Synthetic
Data"]:::future + BENCH_DATA["Benchmark
Tasks"] + EXTERNAL["External
Datasets"]:::future + end + + %% ═══════════════════════════════════════════════════════════════════════ + %% PHASE 1: DEMONSTRATE (Observation Collection) + %% ═══════════════════════════════════════════════════════════════════════ + subgraph Phase1["DEMONSTRATE (Observation Collection)"] + direction TB + + subgraph CaptureLayer["Capture"] + REC["Recorder
openadapt-capture"] + A11Y["A11y Tree"] + SCREENSHOT["Screenshots"] + EVENTS["Input Events"] + + REC --> A11Y + REC --> SCREENSHOT + REC --> EVENTS + end + + subgraph PrivacyLayer["Privacy"] + SCRUB["Scrubber
openadapt-privacy"] + REDACT["PII/PHI Redaction"] + SCRUB --> REDACT + end + + STORE[("Demo Library
(JSON/Parquet)")] + + A11Y --> SCRUB + SCREENSHOT --> SCRUB + EVENTS --> SCRUB + REDACT --> STORE + end + + %% ═══════════════════════════════════════════════════════════════════════ + %% PHASE 2: LEARN (Policy Acquisition) + %% ═══════════════════════════════════════════════════════════════════════ + subgraph Phase2["LEARN (Policy Acquisition)"] + direction TB + + subgraph RetrievalPath["Path A: Retrieval-Augmented Prompting"] + EMB["Embedder
openadapt-retrieval"] + IDX[("Vector Index")] + SEARCH["Similarity Search"] + + EMB --> IDX + IDX --> SEARCH + end + + subgraph TrainingPath["Path B: Fine-Tuning"] + LOADER["Data Loader"] + TRAINER["Model Trainer
openadapt-ml"] + LORA["LoRA Adapters"] + CKPT[("Model Checkpoints")] + + LOADER --> TRAINER + TRAINER --> LORA + LORA --> CKPT + end + + subgraph MiningPath["Path C: Process Mining"]:::futureBlock + ABSTRACT["Abstractor"]:::future + PATTERNS["Pattern Library"]:::future + + ABSTRACT --> PATTERNS + end + end + + %% ═══════════════════════════════════════════════════════════════════════ + %% PHASE 3: EXECUTE (Agent Deployment) + %% ═══════════════════════════════════════════════════════════════════════ + subgraph Phase3["EXECUTE (Agent Deployment)"] + direction TB + + subgraph AgentLoop["Agent Execution Loop"] + OBS["1. OBSERVE
(Screenshot + A11y)"] + GROUND["2. GROUND
openadapt-grounding"] + PLAN["3. PLAN
(Demo-Conditioned Policy)"] + ACT["4. ACT
(Input Synthesis)"] + + OBS --> GROUND + GROUND --> PLAN + PLAN --> ACT + end + + subgraph SafetyGate["Safety Gate (Runtime Layer)"] + VALIDATE["Action Validation"] + RISK["Risk Assessment"] + CONFIRM["Human Confirm"]:::future + + VALIDATE --> RISK + RISK --> CONFIRM + end + + subgraph Evaluation["Evaluation"] + EVALS["Benchmark Runner
openadapt-evals"] + METRICS["Metrics
(Success, Steps, Time)"] + COMPARE["Model Comparison"] + + EVALS --> METRICS + METRICS --> COMPARE + end + + ACT --> VALIDATE + CONFIRM --> EVALS + end + + %% ═══════════════════════════════════════════════════════════════════════ + %% THE ABSTRACTION LADDER + %% ═══════════════════════════════════════════════════════════════════════ + subgraph AbstractionLadder["The Abstraction Ladder"] + direction TB + L0["Level 0: LITERAL
(Raw Events)
{ press: 'h', press: 'i' }"] + L1["Level 1: SYMBOLIC
(Semantic Actions)
{ type: 'hi bob' }"] + L2["Level 2: TEMPLATE
(Parameterized)
{ type: 'hi <name>' }"] + L3["Level 3: SEMANTIC
(Intent Recognition)
{ greet: user }"]:::future + L4["Level 4: GOAL
(Task Specification)
'Greet customer'"]:::future + + L0 -->|"Reduction"| L1 + L1 -->|"Anonymization"| L2 + L2 -.->|"Process Mining"| L3 + L3 -.->|"Goal Composition"| L4 + end + + %% ═══════════════════════════════════════════════════════════════════════ + %% MODEL LAYER (VLM Adapters) + %% ═══════════════════════════════════════════════════════════════════════ + subgraph Models["Model Layer (VLM Adapters)"] + direction LR + + subgraph CloudModels["Cloud APIs"] + CLAUDE["Claude 3.5"] + GPT["GPT-4o"] + GEMINI["Gemini 2.0"] + end + + subgraph LocalModels["Local Models"] + QWEN["Qwen2-VL"] + CUSTOM["Custom Fine-tuned"] + end + end + + %% ═══════════════════════════════════════════════════════════════════════ + %% VIEWER (Cross-Cutting) + %% ═══════════════════════════════════════════════════════════════════════ + subgraph Viewer["Cross-Cutting: Viewer"] + VIZ["Trajectory
Visualization"] + REPLAY["Demo
Replay"] + DASH["Training
Dashboard"]:::partialImpl + end + + %% ═══════════════════════════════════════════════════════════════════════ + %% DATA FLOW CONNECTIONS + %% ═══════════════════════════════════════════════════════════════════════ + + %% User interactions + CLI --> REC + UI --> REC + CLI --> TRAINER + CLI --> EVALS + + %% Multi-source ingestion + HUMAN --> REC + SYNTH -.-> LOADER + BENCH_DATA --> EVALS + EXTERNAL -.-> LOADER + + %% Demo flow to learning + STORE --> EMB + STORE --> LOADER + STORE -.-> ABSTRACT + + %% ═══════════════════════════════════════════════════════════════════════ + %% DEMO-CONDITIONED PROMPTING (Core Innovation) + %% Retrieval used in BOTH training AND evaluation + %% ═══════════════════════════════════════════════════════════════════════ + SEARCH -->|"demo context
(training)"| PLAN + SEARCH -->|"demo context
(evaluation)"| EVALS + CKPT -->|"trained policy"| PLAN + PATTERNS -.->|"templates"| PLAN + + %% Model connections (Policy/Grounding Separation) + PLAN -->|"action prediction"| Models + GROUND -->|"element localization"| Models + + %% ═══════════════════════════════════════════════════════════════════════ + %% EVALUATION-DRIVEN FEEDBACK LOOPS + %% ═══════════════════════════════════════════════════════════════════════ + METRICS -->|"success traces
(new demos)"| STORE + METRICS -.->|"training signal
(self-improvement)"| TRAINER + COMPARE -->|"failure analysis"| UserLayer + + %% Viewer connections + STORE -.-> VIZ + STORE -.-> REPLAY + CKPT -.-> DASH + METRICS -.-> DASH + + %% ═══════════════════════════════════════════════════════════════════════ + %% STYLING + %% ═══════════════════════════════════════════════════════════════════════ + + %% Layer colors + classDef userLayer fill:#E74C3C,stroke:#A93226,color:#fff + classDef dataSource fill:#16A085,stroke:#0E6655,color:#fff + classDef phase1 fill:#3498DB,stroke:#1A5276,color:#fff + classDef phase2 fill:#27AE60,stroke:#1E8449,color:#fff + classDef phase3 fill:#9B59B6,stroke:#6C3483,color:#fff + classDef models fill:#F39C12,stroke:#B7950B,color:#fff + classDef viewer fill:#1ABC9C,stroke:#148F77,color:#fff + classDef safetyGate fill:#E74C3C,stroke:#922B21,color:#fff + + %% Implementation status + classDef implemented fill:#2ECC71,stroke:#1E8449,color:#fff + classDef partialImpl fill:#F4D03F,stroke:#B7950B,color:#000 + classDef future fill:#95A5A6,stroke:#707B7C,color:#fff,stroke-dasharray: 5 5 + classDef futureBlock fill:#EAECEE,stroke:#95A5A6,stroke-dasharray: 5 5 + + %% Apply layer styles + class CLI,UI userLayer + class HUMAN,BENCH_DATA dataSource + class REC,A11Y,SCREENSHOT,EVENTS,SCRUB,REDACT,STORE phase1 + class EMB,IDX,SEARCH,LOADER,TRAINER,LORA,CKPT phase2 + class OBS,GROUND,PLAN,ACT,VALIDATE,RISK,EVALS,METRICS,COMPARE phase3 + class CLAUDE,GPT,GEMINI,QWEN,CUSTOM models + class VIZ,REPLAY viewer + + %% Apply abstraction ladder styles (implemented vs future) + class L0,L1,L2 implemented +``` + +### Key Architectural Insights + +#### 1. Demo-Conditioned Prompting (Core Innovation) + +The diagram shows how **retrieval** feeds into BOTH: +- **Training path**: Similar demos condition the fine-tuning process +- **Evaluation path**: Retrieved demos provide in-context examples for API agents + +This "show, don't tell" approach improves first-action accuracy from 33% to 100%. + +#### 2. Policy/Grounding Separation + +The EXECUTE phase clearly separates: +- **Policy** (PLAN): Decides *what* action to take (uses VLM reasoning) +- **Grounding**: Determines *where* to execute (UI element localization via SoM, OmniParser, etc.) + +#### 3. Safety Gate as Runtime Layer + +Before action execution, the Safety Gate provides: +- Action validation (sanity checks) +- Risk assessment (destructive action detection) +- Human confirmation (future: for high-risk actions) + +#### 4. The Abstraction Ladder + +Progressive generalization from raw events to goals: +- **Implemented**: Literal -> Symbolic -> Template +- **Future**: Semantic -> Goal (requires process mining) + +#### 5. Evaluation-Driven Feedback Loops + +Three feedback mechanisms: +1. **Demo Library Growth**: Success traces become new training data +2. **Self-Improvement**: Training signal from execution metrics (future) +3. **Failure Analysis**: Human review of failed executions + +--- + +### Legacy Master Architecture Diagram + +For reference, the previous architecture diagram: + +```mermaid +flowchart TB + subgraph User["User Layer"] + CLI[openadapt CLI] + UI[Desktop/Web GUI] + end + + subgraph Phase1["DEMONSTRATE"] + direction TB + REC[Recorder] + SCRUB[Privacy Scrubber] + STORE[(Demo Library)] + + REC --> SCRUB + SCRUB --> STORE + end + + subgraph Phase2["LEARN"] + direction TB + + subgraph Retrieval["Retrieval Path"] + EMB[Embedder] + IDX[Vector Index] + SEARCH[Similarity Search] + end + + subgraph Training["Training Path"] + LOADER[Data Loader] + TRAINER[Model Trainer] + CKPT[(Checkpoints)] + end + + subgraph Mining["Process Mining"] + ABSTRACT[Abstractor] + PATTERNS[Pattern Library] + end + end + + subgraph Phase3["EXECUTE"] + direction TB + OBS[Observer] + GROUND[Grounder] + PLAN[Planner] + ACT[Actuator] + EVAL[Evaluator] + + OBS --> GROUND + GROUND --> PLAN + PLAN --> ACT + ACT --> EVAL + EVAL -->|retry| OBS + end + + subgraph Models["Model Layer"] + direction LR + CLAUDE[Claude] + GPT[GPT-4o] + GEMINI[Gemini] + QWEN[Qwen-VL] + CUSTOM[Custom] + end + + subgraph Viewer["Cross-Cutting: Viewer"] + VIZ[Visualization] + REPLAY[Replay] + DASH[Dashboard] + end + + %% User interactions + CLI --> REC + UI --> REC + CLI --> TRAINER + CLI --> EVAL + + %% Demo flow + STORE --> EMB + STORE --> LOADER + STORE --> ABSTRACT + + EMB --> IDX + IDX --> SEARCH + LOADER --> TRAINER + TRAINER --> CKPT + ABSTRACT --> PATTERNS + + %% Execution flow + SEARCH -.->|context| PLAN + CKPT -->|policy| PLAN + PATTERNS -.->|templates| PLAN + + %% Model connections + PLAN --> Models + GROUND --> Models + + %% Viewer connections + STORE -.-> VIZ + CKPT -.-> DASH + EVAL -.-> DASH + + %% Feedback loops + EVAL -->|success trace| STORE + EVAL -->|failure| User + + %% Styling + classDef userLayer fill:#E74C3C,stroke:#A93226,color:#fff + classDef phase1 fill:#3498DB,stroke:#1A5276,color:#fff + classDef phase2 fill:#27AE60,stroke:#1E8449,color:#fff + classDef phase3 fill:#9B59B6,stroke:#6C3483,color:#fff + classDef models fill:#F39C12,stroke:#B7950B,color:#fff + classDef viewer fill:#1ABC9C,stroke:#148F77,color:#fff + classDef future fill:#95A5A6,stroke:#707B7C,color:#fff,stroke-dasharray: 5 5 + + class CLI,UI userLayer + class REC,SCRUB,STORE phase1 + class EMB,IDX,SEARCH,LOADER,TRAINER,CKPT phase2 + class ABSTRACT,PATTERNS future + class OBS,GROUND,PLAN,ACT,EVAL phase3 + class CLAUDE,GPT,GEMINI,QWEN,CUSTOM models + class VIZ,REPLAY,DASH viewer +``` + +### Package Responsibility Diagram + +```mermaid +flowchart LR + subgraph demonstrate["DEMONSTRATE Phase"] + CAP[openadapt-capture] + PRV[openadapt-privacy] + end + + subgraph learn["LEARN Phase"] + RET[openadapt-retrieval] + ML[openadapt-ml] + end + + subgraph execute["EXECUTE Phase"] + GRD[openadapt-grounding] + EVL[openadapt-evals] + end + + subgraph crosscut["Cross-Cutting"] + VWR[openadapt-viewer] + end + + subgraph meta["Meta-Package"] + OA[openadapt CLI] + end + + %% CLI orchestrates all + OA --> CAP + OA --> ML + OA --> EVL + OA --> VWR + + %% Phase 1 flow + CAP -->|raw data| PRV + PRV -->|scrubbed data| ML + PRV -->|scrubbed data| RET + + %% Phase 2 flow + RET -->|embeddings| EVL + ML -->|checkpoints| EVL + + %% Phase 3 flow + GRD -->|coordinates| EVL + GRD -->|coordinates| ML + + %% Viewer integration + CAP -.->|demos| VWR + ML -.->|training| VWR + EVL -.->|results| VWR + + %% Styling + classDef phase1 fill:#3498DB,stroke:#1A5276,color:#fff + classDef phase2 fill:#27AE60,stroke:#1E8449,color:#fff + classDef phase3 fill:#9B59B6,stroke:#6C3483,color:#fff + classDef cross fill:#1ABC9C,stroke:#148F77,color:#fff + classDef meta fill:#2C3E50,stroke:#1A252F,color:#fff + + class CAP,PRV phase1 + class RET,ML phase2 + class GRD,EVL phase3 + class VWR cross + class OA meta +``` + +### Execution Loop Diagram + +```mermaid +stateDiagram-v2 + [*] --> Observe + + Observe --> Ground: screenshot + a11y + Ground --> Plan: elements + coordinates + Plan --> Act: action prediction + Act --> Evaluate: action result + + Evaluate --> Observe: continue + Evaluate --> Success: task complete + Evaluate --> Retry: recoverable error + Evaluate --> Escalate: unrecoverable + + Retry --> Observe + Escalate --> [*] + Success --> [*] + + note right of Observe + Capture screenshot + Extract a11y tree + Build observation + end note + + note right of Ground + Detect UI elements + Apply SoM labels + Get coordinates + end note + + note right of Plan + Encode with VLM + Retrieve similar demos + Generate action + end note + + note right of Act + Parse action type + Execute input + Record for history + end note + + note right of Evaluate + Check success + Detect failures + Decide next step + end note +``` + +### Feedback Loop Diagram + +```mermaid +flowchart TB + subgraph Loop1["Loop 1: Demo Library Growth"] + D1[Human Demo] --> L1[Learn] + L1 --> E1[Execute] + E1 --> |success| S1[Store as Demo] + E1 --> |failure| F1[Failure Analysis] + F1 --> |new demo| D1 + S1 --> L1 + end + + subgraph Loop2["Loop 2: Self-Improvement"] + E2[Execute] --> T2[Trace] + T2 --> |success trace| FT2[Fine-tune] + FT2 --> E2 + end + + subgraph Loop3["Loop 3: Benchmark-Driven"] + B3[Benchmark] --> M3[Metrics] + M3 --> A3[Architecture Improvement] + A3 --> B3 + end + + Loop1 -.->|traces| Loop2 + Loop2 -.->|models| Loop1 + Loop1 -.->|metrics| Loop3 + Loop3 -.->|improvements| Loop1 + + %% Styling + classDef loop1 fill:#3498DB,stroke:#1A5276,color:#fff + classDef loop2 fill:#27AE60,stroke:#1E8449,color:#fff,stroke-dasharray: 5 5 + classDef loop3 fill:#9B59B6,stroke:#6C3483,color:#fff + + class D1,L1,E1,S1,F1 loop1 + class E2,T2,FT2 loop2 + class B3,M3,A3 loop3 +``` + +--- + +## 9. Key Design Principles + +### Principle 1: Model Agnostic + +OpenAdapt works with any VLM that can process images and generate text. + +**Implementation**: +- Adapter pattern for model integration +- Unified prompt format across providers +- Switchable at runtime via configuration + +**Rationale**: +- Avoid vendor lock-in +- Enable cost optimization +- Future-proof against model evolution + +### Principle 2: Demo-Conditioned + +Agents learn from human examples, not just prompts. + +**Implementation**: +- Retrieval-augmented prompting +- Fine-tuning on demonstration datasets +- Context windows include similar past examples + +**Rationale**: +- Captures implicit knowledge +- Reduces ambiguity +- Enables transfer learning + +### Principle 3: Abstraction-Aware + +Progress from literal replay to semantic understanding. + +**Implementation**: +- Abstraction ladder (literal -> symbolic -> template -> semantic -> goal) +- Incremental abstraction during processing +- Human-readable intermediate representations + +**Rationale**: +- Enables generalization +- Supports explanation and debugging +- Allows cross-application transfer + +### Principle 4: Evaluation-Driven + +Rigorous benchmarking on standard tasks. + +**Implementation**: +- WAA, WebArena, OSWorld benchmark integrations +- Automated regression detection +- Public leaderboard metrics + +**Rationale**: +- Objective progress measurement +- Community comparability +- Quality assurance + +### Principle 5: Privacy-First + +Optional PII/PHI scrubbing at every stage. + +**Implementation**: +- `openadapt-privacy` package +- Configurable scrubbing levels +- Local-only deployment option + +**Rationale**: +- Enterprise compliance (HIPAA, GDPR) +- User trust +- Responsible AI + +### Principle 6: Open Source + +MIT license, community-driven development. + +**Implementation**: +- All packages on GitHub +- Public roadmap and issues +- Contribution guidelines + +**Rationale**: +- Transparency +- Community innovation +- No vendor lock-in + +--- + +## 10. Research Alignment + +OpenAdapt's architecture aligns with and builds upon recent GUI agent research. + +### Key Research Papers + +| Paper | Contribution | OpenAdapt Integration | +|-------|--------------|----------------------| +| Claude Computer Use (Anthropic, 2024) | Production VLM agent API | API adapter in `openadapt-ml` | +| UFO (Microsoft, 2024) | Windows agent architecture | Prompt patterns adopted | +| OSWorld (CMU, 2024) | Cross-platform benchmark | Benchmark adapter planned | +| Set-of-Mark (Microsoft, 2023) | Visual grounding via labels | Core grounding mode | +| OmniParser (Microsoft, 2024) | Pure-vision UI parsing | Provider in `openadapt-grounding` | +| WebArena (CMU, 2023) | Web automation benchmark | Benchmark adapter implemented | +| Mind2Web (OSU, 2023) | Web action prediction | Dataset format compatible | + +### Research Contributions + +OpenAdapt contributes to the research community through: + +1. **Open Benchmark Infrastructure**: Standardized evaluation setup +2. **Demonstration Dataset Format**: Interoperable trajectory format +3. **Retrieval-Augmented Agents**: Demo conditioning research +4. **Grounding Comparison**: Multi-provider benchmarks +5. **Abstraction Research**: Process mining for GUI agents + +--- + +## 11. Future Directions + +### Near-Term (Q1 2026) + +- Complete fine-tuning pipeline validation +- Achieve competitive WAA benchmark scores +- Launch docs.openadapt.ai +- Release v1.0.0 meta-package + +### Medium-Term (2026) + +- Process mining implementation +- Self-improvement loop activation +- Multi-benchmark evaluation suite +- Enterprise deployment guides + +### Long-Term (2026+) + +- Multi-agent collaboration +- Active learning with human feedback +- Mobile platform support +- Cross-platform transfer learning + +### Research Agenda + +1. **Abstraction Hierarchy**: Can we automatically extract semantic actions from demonstrations? +2. **Transfer Learning**: How do demos from one app help in another? +3. **Active Learning**: When should the agent ask for human help? +4. **Explanation**: How do we make agent decisions interpretable? + +--- + +## Appendix A: Glossary + +| Term | Definition | +|------|------------| +| **A11y Tree** | Accessibility tree - structured representation of UI elements | +| **Demo** | Recorded human demonstration (trajectory) | +| **Grounding** | Mapping text descriptions to UI coordinates | +| **LoRA** | Low-Rank Adaptation - efficient fine-tuning method | +| **SoM** | Set-of-Mark - visual grounding via element labels | +| **Trajectory** | Sequence of observations and actions | +| **VLM** | Vision-Language Model | +| **WAA** | Windows Agent Arena benchmark | + +## Appendix B: Related Documents + +- [Architecture Overview](./architecture.md) - Package structure and data flow +- [Roadmap Priorities](./roadmap-priorities.md) - Current development priorities +- [Telemetry Design](./design/telemetry-design.md) - Telemetry implementation +- [Landing Page Strategy](./design/landing-page-strategy.md) - Messaging and positioning + +## Appendix C: Version History + +| Version | Date | Changes | +|---------|------|---------| +| 2.0 | Jan 2026 | Comprehensive redesign, SOTA alignment | +| 1.0 | Dec 2025 | Initial modular architecture | +| 0.x | 2023-2024 | Legacy monolithic design | + +--- + +*This document is maintained as part of the OpenAdapt project. For updates, see the [GitHub repository](https://github.com/OpenAdaptAI/OpenAdapt).* From 281f2f70bf871a438df0915e134f4a5b545db44c Mon Sep 17 00:00:00 2001 From: Richard Abrich Date: Fri, 16 Jan 2026 23:50:39 -0500 Subject: [PATCH 2/2] docs: Add rendered architecture diagram PNG MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Generated 1568x2132 PNG from Mermaid diagram - Shows three-phase pipeline (DEMONSTRATE → LEARN → EXECUTE) - Includes model layer and data flow connections Co-Authored-By: Claude Sonnet 4.5 --- docs/assets/architecture-diagram.png | Bin 0 -> 108465 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/architecture-diagram.png diff --git a/docs/assets/architecture-diagram.png b/docs/assets/architecture-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..1232c988d5e4cc2ca846496cd46c0bc04614ffc8 GIT binary patch literal 108465 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 Ge*0fc!