openadapt-ml 0.2.0__py3-none-any.whl → 0.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. openadapt_ml/baselines/__init__.py +121 -0
  2. openadapt_ml/baselines/adapter.py +185 -0
  3. openadapt_ml/baselines/cli.py +314 -0
  4. openadapt_ml/baselines/config.py +448 -0
  5. openadapt_ml/baselines/parser.py +922 -0
  6. openadapt_ml/baselines/prompts.py +787 -0
  7. openadapt_ml/benchmarks/__init__.py +13 -115
  8. openadapt_ml/benchmarks/agent.py +265 -421
  9. openadapt_ml/benchmarks/azure.py +28 -19
  10. openadapt_ml/benchmarks/azure_ops_tracker.py +521 -0
  11. openadapt_ml/benchmarks/cli.py +1722 -4847
  12. openadapt_ml/benchmarks/trace_export.py +631 -0
  13. openadapt_ml/benchmarks/viewer.py +22 -5
  14. openadapt_ml/benchmarks/vm_monitor.py +530 -29
  15. openadapt_ml/benchmarks/waa_deploy/Dockerfile +47 -53
  16. openadapt_ml/benchmarks/waa_deploy/api_agent.py +21 -20
  17. openadapt_ml/cloud/azure_inference.py +3 -5
  18. openadapt_ml/cloud/lambda_labs.py +722 -307
  19. openadapt_ml/cloud/local.py +2038 -487
  20. openadapt_ml/cloud/ssh_tunnel.py +68 -26
  21. openadapt_ml/datasets/next_action.py +40 -30
  22. openadapt_ml/evals/grounding.py +8 -3
  23. openadapt_ml/evals/plot_eval_metrics.py +15 -13
  24. openadapt_ml/evals/trajectory_matching.py +41 -26
  25. openadapt_ml/experiments/demo_prompt/format_demo.py +16 -6
  26. openadapt_ml/experiments/demo_prompt/run_experiment.py +26 -16
  27. openadapt_ml/experiments/representation_shootout/__init__.py +70 -0
  28. openadapt_ml/experiments/representation_shootout/conditions.py +708 -0
  29. openadapt_ml/experiments/representation_shootout/config.py +390 -0
  30. openadapt_ml/experiments/representation_shootout/evaluator.py +659 -0
  31. openadapt_ml/experiments/representation_shootout/runner.py +687 -0
  32. openadapt_ml/experiments/waa_demo/runner.py +29 -14
  33. openadapt_ml/export/parquet.py +36 -24
  34. openadapt_ml/grounding/detector.py +18 -14
  35. openadapt_ml/ingest/__init__.py +8 -6
  36. openadapt_ml/ingest/capture.py +25 -22
  37. openadapt_ml/ingest/loader.py +7 -4
  38. openadapt_ml/ingest/synthetic.py +189 -100
  39. openadapt_ml/models/api_adapter.py +14 -4
  40. openadapt_ml/models/base_adapter.py +10 -2
  41. openadapt_ml/models/providers/__init__.py +288 -0
  42. openadapt_ml/models/providers/anthropic.py +266 -0
  43. openadapt_ml/models/providers/base.py +299 -0
  44. openadapt_ml/models/providers/google.py +376 -0
  45. openadapt_ml/models/providers/openai.py +342 -0
  46. openadapt_ml/models/qwen_vl.py +46 -19
  47. openadapt_ml/perception/__init__.py +35 -0
  48. openadapt_ml/perception/integration.py +399 -0
  49. openadapt_ml/retrieval/demo_retriever.py +50 -24
  50. openadapt_ml/retrieval/embeddings.py +9 -8
  51. openadapt_ml/retrieval/retriever.py +3 -1
  52. openadapt_ml/runtime/__init__.py +50 -0
  53. openadapt_ml/runtime/policy.py +18 -5
  54. openadapt_ml/runtime/safety_gate.py +471 -0
  55. openadapt_ml/schema/__init__.py +9 -0
  56. openadapt_ml/schema/converters.py +74 -27
  57. openadapt_ml/schema/episode.py +31 -18
  58. openadapt_ml/scripts/capture_screenshots.py +530 -0
  59. openadapt_ml/scripts/compare.py +85 -54
  60. openadapt_ml/scripts/demo_policy.py +4 -1
  61. openadapt_ml/scripts/eval_policy.py +15 -9
  62. openadapt_ml/scripts/make_gif.py +1 -1
  63. openadapt_ml/scripts/prepare_synthetic.py +3 -1
  64. openadapt_ml/scripts/train.py +21 -9
  65. openadapt_ml/segmentation/README.md +920 -0
  66. openadapt_ml/segmentation/__init__.py +97 -0
  67. openadapt_ml/segmentation/adapters/__init__.py +5 -0
  68. openadapt_ml/segmentation/adapters/capture_adapter.py +420 -0
  69. openadapt_ml/segmentation/annotator.py +610 -0
  70. openadapt_ml/segmentation/cache.py +290 -0
  71. openadapt_ml/segmentation/cli.py +674 -0
  72. openadapt_ml/segmentation/deduplicator.py +656 -0
  73. openadapt_ml/segmentation/frame_describer.py +788 -0
  74. openadapt_ml/segmentation/pipeline.py +340 -0
  75. openadapt_ml/segmentation/schemas.py +622 -0
  76. openadapt_ml/segmentation/segment_extractor.py +634 -0
  77. openadapt_ml/training/azure_ops_viewer.py +1097 -0
  78. openadapt_ml/training/benchmark_viewer.py +52 -41
  79. openadapt_ml/training/shared_ui.py +7 -7
  80. openadapt_ml/training/stub_provider.py +57 -35
  81. openadapt_ml/training/trainer.py +143 -86
  82. openadapt_ml/training/trl_trainer.py +70 -21
  83. openadapt_ml/training/viewer.py +323 -108
  84. openadapt_ml/training/viewer_components.py +180 -0
  85. {openadapt_ml-0.2.0.dist-info → openadapt_ml-0.2.1.dist-info}/METADATA +215 -14
  86. openadapt_ml-0.2.1.dist-info/RECORD +116 -0
  87. openadapt_ml/benchmarks/base.py +0 -366
  88. openadapt_ml/benchmarks/data_collection.py +0 -432
  89. openadapt_ml/benchmarks/live_tracker.py +0 -180
  90. openadapt_ml/benchmarks/runner.py +0 -418
  91. openadapt_ml/benchmarks/waa.py +0 -761
  92. openadapt_ml/benchmarks/waa_live.py +0 -619
  93. openadapt_ml-0.2.0.dist-info/RECORD +0 -86
  94. {openadapt_ml-0.2.0.dist-info → openadapt_ml-0.2.1.dist-info}/WHEEL +0 -0
  95. {openadapt_ml-0.2.0.dist-info → openadapt_ml-0.2.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,180 @@
1
+ """Adapter module for openadapt-viewer components.
2
+
3
+ This module provides wrapper functions that adapt openadapt-viewer components
4
+ for openadapt-ml specific use cases, particularly for training visualization.
5
+
6
+ Migration Approach:
7
+ ------------------
8
+ Phase 1 (Foundation): Create this adapter module to establish patterns
9
+ Phase 2 (Integration): Gradually migrate viewer.py to use these adapters
10
+ Phase 3 (Consolidation): Remove duplicate code from viewer.py
11
+ Phase 4 (Completion): Full dependency on openadapt-viewer
12
+
13
+ Design Principles:
14
+ -----------------
15
+ 1. Each function wraps openadapt-viewer components with ML-specific context
16
+ 2. Functions accept openadapt-ml data structures (TrainingState, predictions, etc.)
17
+ 3. No breaking changes to existing viewer.py code
18
+ 4. Can be incrementally adopted in future phases
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ from pathlib import Path
24
+ from typing import Any
25
+
26
+ # Import openadapt-viewer components
27
+ from openadapt_viewer.components import (
28
+ screenshot_display as _screenshot_display,
29
+ playback_controls as _playback_controls,
30
+ metrics_grid as _metrics_grid,
31
+ badge as _badge,
32
+ )
33
+
34
+
35
+ def screenshot_with_predictions(
36
+ screenshot_path: str | Path,
37
+ human_action: dict[str, Any] | None = None,
38
+ predicted_action: dict[str, Any] | None = None,
39
+ step_number: int | None = None,
40
+ show_difference: bool = True,
41
+ ) -> str:
42
+ """Generate screenshot display with human and AI action overlays."""
43
+ overlays = []
44
+
45
+ if human_action:
46
+ overlays.append(
47
+ {
48
+ "type": human_action.get("type", "click"),
49
+ "x": human_action.get("x", 0),
50
+ "y": human_action.get("y", 0),
51
+ "label": "H",
52
+ "variant": "human",
53
+ "color": "#34d399",
54
+ }
55
+ )
56
+
57
+ if predicted_action:
58
+ overlays.append(
59
+ {
60
+ "type": predicted_action.get("type", "click"),
61
+ "x": predicted_action.get("x", 0),
62
+ "y": predicted_action.get("y", 0),
63
+ "label": "AI",
64
+ "variant": "predicted",
65
+ "color": "#00d4aa",
66
+ }
67
+ )
68
+
69
+ caption = f"Step {step_number}" if step_number is not None else None
70
+
71
+ return _screenshot_display(
72
+ image_path=str(screenshot_path),
73
+ overlays=overlays,
74
+ caption=caption,
75
+ )
76
+
77
+
78
+ def training_metrics(
79
+ epoch: int | None = None,
80
+ loss: float | None = None,
81
+ accuracy: float | None = None,
82
+ elapsed_time: float | None = None,
83
+ learning_rate: float | None = None,
84
+ **additional_metrics: Any,
85
+ ) -> str:
86
+ """Generate metrics grid for training statistics."""
87
+ metrics = []
88
+
89
+ if epoch is not None:
90
+ metrics.append({"label": "Epoch", "value": epoch})
91
+
92
+ if loss is not None:
93
+ color = "success" if loss < 0.1 else "warning" if loss < 0.5 else "error"
94
+ metrics.append({"label": "Loss", "value": f"{loss:.4f}", "color": color})
95
+
96
+ if accuracy is not None:
97
+ color = (
98
+ "success" if accuracy > 0.9 else "warning" if accuracy > 0.7 else "error"
99
+ )
100
+ metrics.append(
101
+ {"label": "Accuracy", "value": f"{accuracy:.2%}", "color": color}
102
+ )
103
+
104
+ if elapsed_time is not None:
105
+ hours = int(elapsed_time // 3600)
106
+ minutes = int((elapsed_time % 3600) // 60)
107
+ seconds = int(elapsed_time % 60)
108
+ time_str = f"{hours}h {minutes}m {seconds}s"
109
+ metrics.append({"label": "Elapsed", "value": time_str})
110
+
111
+ if learning_rate is not None:
112
+ metrics.append({"label": "LR", "value": f"{learning_rate:.2e}"})
113
+
114
+ for key, value in additional_metrics.items():
115
+ label = key.replace("_", " ").title()
116
+ metrics.append({"label": label, "value": str(value)})
117
+
118
+ return _metrics_grid(metrics)
119
+
120
+
121
+ def playback_controls(
122
+ step_count: int,
123
+ initial_step: int = 0,
124
+ ) -> str:
125
+ """Generate playback controls for step-by-step viewer."""
126
+ return _playback_controls(
127
+ step_count=step_count,
128
+ initial_step=initial_step,
129
+ )
130
+
131
+
132
+ def correctness_badge(is_correct: bool, show_label: bool = True) -> str:
133
+ """Generate a badge indicating prediction correctness."""
134
+ if is_correct:
135
+ text = "Correct" if show_label else "✓"
136
+ color = "success"
137
+ else:
138
+ text = "Incorrect" if show_label else "✗"
139
+ color = "error"
140
+
141
+ return _badge(text=text, color=color)
142
+
143
+
144
+ def generate_comparison_summary(
145
+ total_steps: int,
146
+ correct_steps: int,
147
+ model_name: str | None = None,
148
+ ) -> str:
149
+ """Generate a summary card for model comparison results."""
150
+ accuracy = correct_steps / total_steps if total_steps > 0 else 0
151
+ incorrect_steps = total_steps - correct_steps
152
+
153
+ metrics = [
154
+ {"label": "Total Steps", "value": total_steps},
155
+ {"label": "Correct", "value": correct_steps, "color": "success"},
156
+ {
157
+ "label": "Incorrect",
158
+ "value": incorrect_steps,
159
+ "color": "error" if incorrect_steps > 0 else "muted",
160
+ },
161
+ {
162
+ "label": "Accuracy",
163
+ "value": f"{accuracy:.1%}",
164
+ "color": "success" if accuracy > 0.9 else "warning",
165
+ },
166
+ ]
167
+
168
+ if model_name:
169
+ metrics.insert(0, {"label": "Model", "value": model_name})
170
+
171
+ return _metrics_grid(metrics)
172
+
173
+
174
+ __all__ = [
175
+ "screenshot_with_predictions",
176
+ "training_metrics",
177
+ "playback_controls",
178
+ "correctness_badge",
179
+ "generate_comparison_summary",
180
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openadapt-ml
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Model-agnostic, domain-agnostic ML engine for GUI automation agents
5
5
  Project-URL: Homepage, https://github.com/OpenAdaptAI/openadapt-ml
6
6
  Project-URL: Repository, https://github.com/OpenAdaptAI/openadapt-ml
@@ -13,18 +13,22 @@ Classifier: Development Status :: 3 - Alpha
13
13
  Classifier: Intended Audience :: Developers
14
14
  Classifier: License :: OSI Approved :: MIT License
15
15
  Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
16
18
  Classifier: Programming Language :: Python :: 3.12
17
19
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
18
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
- Requires-Python: >=3.12
21
+ Requires-Python: >=3.10
20
22
  Requires-Dist: azure-ai-ml>=1.30.0
21
23
  Requires-Dist: azure-identity>=1.25.1
22
24
  Requires-Dist: bitsandbytes>=0.41.0
25
+ Requires-Dist: click>=8.1.0
23
26
  Requires-Dist: google-generativeai>=0.8.5
24
27
  Requires-Dist: matplotlib>=3.10.7
25
28
  Requires-Dist: openadapt-capture>=0.1.0
26
29
  Requires-Dist: peft>=0.18.0
27
30
  Requires-Dist: pillow>=12.0.0
31
+ Requires-Dist: pyautogui>=0.9.54
28
32
  Requires-Dist: pydantic-settings>=2.0.0
29
33
  Requires-Dist: pytest>=9.0.2
30
34
  Requires-Dist: pyyaml>=6.0.3
@@ -38,6 +42,8 @@ Requires-Dist: pydantic-settings>=2.0.0; extra == 'api'
38
42
  Provides-Extra: azure
39
43
  Requires-Dist: azure-ai-ml>=1.0.0; extra == 'azure'
40
44
  Requires-Dist: azure-identity>=1.0.0; extra == 'azure'
45
+ Provides-Extra: benchmarks
46
+ Requires-Dist: openadapt-evals>=0.1.1; extra == 'benchmarks'
41
47
  Provides-Extra: dev
42
48
  Requires-Dist: pytest>=9.0.0; extra == 'dev'
43
49
  Requires-Dist: ruff>=0.1.0; extra == 'dev'
@@ -52,17 +58,19 @@ Description-Content-Type: text/markdown
52
58
 
53
59
  # OpenAdapt-ML
54
60
 
55
- [![PyPI version](https://badge.fury.io/py/openadapt-ml.svg)](https://badge.fury.io/py/openadapt-ml)
61
+ [![Build Status](https://github.com/OpenAdaptAI/openadapt-ml/actions/workflows/publish.yml/badge.svg)](https://github.com/OpenAdaptAI/openadapt-ml/actions/workflows/publish.yml)
62
+ [![PyPI version](https://img.shields.io/pypi/v/openadapt-ml.svg)](https://pypi.org/project/openadapt-ml/)
63
+ [![Downloads](https://img.shields.io/pypi/dm/openadapt-ml.svg)](https://pypi.org/project/openadapt-ml/)
56
64
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
57
- [![Python Version](https://img.shields.io/badge/python-3.12-blue)](https://www.python.org/)
65
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue)](https://www.python.org/downloads/)
58
66
 
59
67
  OpenAdapt-ML is a **model-agnostic, domain-agnostic ML engine** for GUI
60
68
  automation agents. It sits above **TRL + Unsloth** (which we use directly for training performance) and provides the GUI-specific layer:
61
69
 
62
70
  - **Episode semantics**: Step/action/observation alignment, screenshot-action coupling, termination handling
63
- - **Demo-conditioned inference**: Retrieval-augmented prompting (validated: 33% 100% first-action accuracy)
71
+ - **Demo-conditioned inference**: Retrieval-augmented prompting (in early experiments: 46.7% -> 100% first-action accuracy on a controlled macOS benchmark where all 45 tasks share the same navigation entry point - see [publication roadmap](https://github.com/OpenAdaptAI/OpenAdapt/blob/main/docs/publication-roadmap.md) for methodology and limitations)
64
72
  - **Benchmark adapters**: WAA today, OSWorld/WebArena planned
65
- - **VLM adapters**: Updated with leading GUI-agent SOTA open-source models
73
+ - **VLM adapters**: Supports open-source GUI-agent models (Qwen3-VL, Qwen2.5-VL)
66
74
  - **Training pipeline**: TRL + Unsloth integration for 2x faster training with 50% less VRAM
67
75
 
68
76
  OpenAdapt-ML is **not** a training framework, optimizer, hardware orchestrator, or experiment manager. We use TRL/Unsloth, Lambda Labs/Azure, and W&B/MLflow for those.
@@ -254,7 +262,9 @@ simple login flow.
254
262
  ### 5.1 Synthetic scenarios
255
263
 
256
264
  OpenAdapt-ML includes synthetic UI generators for structured GUI automation benchmarks.
257
- Currently two scenarios are supported:
265
+ Currently two scenarios are supported.
266
+
267
+ > **Note:** These are **synthetic, controlled benchmarks** designed for rapid iteration and debugging, not real-world evaluation. The 100% accuracy results below demonstrate that fine-tuning works on simple scenarios with known ground truth - they do not represent performance on production UIs or standard benchmarks like WAA. See section 14 (Limitations) for details.
258
268
 
259
269
  #### Login Scenario (6 steps, 3 elements)
260
270
 
@@ -437,15 +447,18 @@ It exposes step-level performance metrics, which let us visually answer the ques
437
447
  | Claude Sonnet 4.5 | API | 0.121 | 0.757 | 0.000 |
438
448
  | GPT-5.1 | API | 0.183 | 0.057 | 0.600 |
439
449
 
440
- **Key findings:**
441
- 1. **Fine-tuning delivers massive gains**: Both 2B and 8B models show 2-3x improvement in action accuracy after fine-tuning
442
- 2. **Small fine-tuned models beat large APIs**: Qwen3-VL-2B FT (469% base) outperforms both Claude Sonnet 4.5 (121%) and GPT-5.1 (183%)
443
- 3. **Precision matters**: Fine-tuned models have excellent click precision (85-100% hit rate, <0.05 coord error) while API models struggle with the action format
444
- 4. **Size vs specialization**: The fine-tuned 2B model outperforms the general-purpose Claude Sonnet 4.5, showing that domain-specific fine-tuning trumps raw model size
450
+ **Observations on synthetic login benchmark:**
451
+
452
+ > **Important:** These findings are from a synthetic benchmark with ~3 UI elements and a fixed action sequence. They demonstrate the training pipeline works, but should not be extrapolated to real-world GUI automation performance. Evaluation on standard benchmarks (WAA, WebArena) is ongoing.
453
+
454
+ 1. **Fine-tuning improves synthetic task performance**: Both 2B and 8B models show 2-3x improvement in action accuracy after fine-tuning on this specific task
455
+ 2. **On this synthetic benchmark, fine-tuned models outperform zero-shot API calls**: This is expected since the task is simple and the models are trained on it directly
456
+ 3. **Coordinate precision is learnable**: Fine-tuned models achieve low coordinate error on training distribution
457
+ 4. **API models struggle with custom action format**: Without fine-tuning on the specific DSL (CLICK/TYPE/DONE), API models have high format-error rates
445
458
 
446
- ### 6.4 Set-of-Marks (SoM) Mode: 100% Accuracy
459
+ ### 6.4 Set-of-Marks (SoM) Mode: 100% Accuracy on Synthetic Benchmarks
447
460
 
448
- With **Set-of-Marks** visual prompting, fine-tuned Qwen3-VL-2B achieves **100% accuracy** on both login (6-step) and registration (12-step) scenarios:
461
+ With **Set-of-Marks** visual prompting, fine-tuned Qwen3-VL-2B achieves **100% accuracy** on both login (6-step) and registration (12-step) synthetic scenarios. Note that these are controlled, toy benchmarks with a small number of UI elements:
449
462
 
450
463
  | Scenario | Steps | Elements | Action Acc | Element Acc | Episode Success |
451
464
  |----------|-------|----------|------------|-------------|-----------------|
@@ -826,6 +839,194 @@ uv run python -m openadapt_ml.cloud.local serve --port 8080 --open
826
839
 
827
840
  *View benchmark evaluation results with task-level filtering, success/failure status, and run comparison. Shows Claude achieving 30% on mock evaluation tasks (simulated environment for testing the pipeline - real WAA evaluation requires Windows VMs).*
828
841
 
842
+ ### 13.4 VM Monitoring Dashboard
843
+
844
+ For managing Azure VMs used in benchmark evaluations, the `vm monitor` command provides a comprehensive dashboard:
845
+
846
+ ```bash
847
+ # Start VM monitoring dashboard (auto-opens browser)
848
+ uv run python -m openadapt_ml.benchmarks.cli vm monitor
849
+
850
+ # Show detailed information (evaluation history, daily/weekly costs)
851
+ uv run python -m openadapt_ml.benchmarks.cli vm monitor --details
852
+ ```
853
+
854
+ **VM Monitor Dashboard (Full View):**
855
+
856
+ ![VM Monitor Dashboard](docs/screenshots/vm_monitor_dashboard_full.png)
857
+
858
+ *The VM monitor dashboard shows: (1) VM status (name, IP, size, state), (2) Current activity (idle/benchmark running), (3) Cost tracking (uptime, hourly rate, total cost), (4) Recent Azure ML jobs from last 7 days, and (6) Dashboard & access URLs.*
859
+
860
+ **VM Monitor Dashboard (With --details Flag):**
861
+
862
+ ![VM Monitor Dashboard Details](docs/screenshots/vm_monitor_details.png)
863
+
864
+ *The --details flag adds: (5) Evaluation history with success rates and agent types, plus extended cost information (daily/weekly projections).*
865
+
866
+ **Features:**
867
+ - **Real-time VM status** - Shows VM size, power state, and IP address
868
+ - **Activity detection** - Identifies if VM is idle, running benchmarks, or in setup
869
+ - **Cost tracking** - Displays uptime hours, hourly rate, and total cost for current session
870
+ - **Azure ML jobs** - Lists recent jobs from last 7 days with status indicators
871
+ - **Evaluation history** - Shows past benchmark runs with success rates (with --details flag)
872
+ - **Dashboard & tunnels** - Auto-starts web dashboard and SSH/VNC tunnels for accessing Windows VM
873
+
874
+ **Mock mode for testing:**
875
+ ```bash
876
+ # Generate screenshots or test dashboard without a VM running
877
+ uv run python -m openadapt_ml.benchmarks.cli vm monitor --mock
878
+ ```
879
+
880
+ **Auto-shutdown option:**
881
+ ```bash
882
+ # Automatically deallocate VM after 2 hours to prevent runaway costs
883
+ uv run python -m openadapt_ml.benchmarks.cli vm monitor --auto-shutdown-hours 2
884
+ ```
885
+
886
+ ### 13.5 Benchmark Execution Logs
887
+
888
+ View benchmark execution progress and logs:
889
+
890
+ ```bash
891
+ # View WAA container status and Docker logs
892
+ uv run python -m openadapt_ml.benchmarks.cli logs
893
+
894
+ # View WAA benchmark execution logs (task progress, agent actions)
895
+ uv run python -m openadapt_ml.benchmarks.cli logs --run
896
+
897
+ # Stream execution logs live
898
+ uv run python -m openadapt_ml.benchmarks.cli logs --run -f
899
+
900
+ # Show last N lines of execution logs
901
+ uv run python -m openadapt_ml.benchmarks.cli logs --run --tail 100
902
+
903
+ # Show benchmark progress and ETA
904
+ uv run python -m openadapt_ml.benchmarks.cli logs --progress
905
+ ```
906
+
907
+ **Example: Container status (`logs`)**
908
+ ```
909
+ WAA Status (20.12.180.208)
910
+ ============================================================
911
+
912
+ [Docker Images]
913
+ REPOSITORY TAG SIZE
914
+ waa-auto latest 25.4GB
915
+ windowsarena/winarena latest 25.8GB
916
+
917
+ [Container]
918
+ Status: Up 49 minutes
919
+
920
+ [Storage]
921
+ Total: 21G
922
+ Disk image: 64G
923
+
924
+ [QEMU VM]
925
+ Status: Running (PID 1471)
926
+ CPU: 176%, MEM: 51.6%, Uptime: 47:28
927
+
928
+ [WAA Server]
929
+ "status": "Probe successful"
930
+ (READY)
931
+ ```
932
+
933
+ **Example: Benchmark execution logs (`logs --run -f`)**
934
+ ```
935
+ Run log: /home/azureuser/cli_logs/run_20260128_175507.log
936
+ ------------------------------------------------------------
937
+ Streaming log (Ctrl+C to stop)...
938
+
939
+ [2026-01-28 23:05:10,303 INFO agent/401-MainProcess] Thinking...
940
+ [2026-01-28 23:05:17,318 INFO python/62-MainProcess] Updated computer successfully
941
+ [2026-01-28 23:05:17,318 INFO lib_run_single/56-MainProcess] Step 9: computer.window_manager.switch_to_application("Summer Trip - File Explorer")
942
+ ```
943
+
944
+ **Example: Benchmark progress (`logs --progress`)**
945
+ ```
946
+ === WAA Benchmark Progress ===
947
+
948
+ Log: /home/azureuser/cli_logs/run_20260128_175507.log
949
+ Started: 2026-01-28 22:55:14
950
+ Latest: 2026-01-28 23:28:37
951
+
952
+ Tasks completed: 1 / 154
953
+ Elapsed: 33 minutes
954
+
955
+ Avg time per task: ~33 min
956
+ Remaining tasks: 153
957
+ Estimated remaining: ~84h 9m
958
+
959
+ Progress: 0% [1/154]
960
+ ```
961
+
962
+ **Other useful commands:**
963
+ ```bash
964
+ # Check WAA server status (probe endpoint)
965
+ uv run python -m openadapt_ml.benchmarks.cli probe
966
+
967
+ # Check VM/Azure status
968
+ uv run python -m openadapt_ml.benchmarks.cli status
969
+
970
+ # Download benchmark results from VM
971
+ uv run python -m openadapt_ml.benchmarks.cli download
972
+
973
+ # Analyze downloaded results
974
+ uv run python -m openadapt_ml.benchmarks.cli analyze
975
+ ```
976
+
977
+ **Running benchmarks:**
978
+ ```bash
979
+ # Run full benchmark (154 tasks)
980
+ uv run python -m openadapt_ml.benchmarks.cli run --num-tasks 154
981
+
982
+ # Run specific domain
983
+ uv run python -m openadapt_ml.benchmarks.cli run --domain notepad --num-tasks 5
984
+
985
+ # Run single task
986
+ uv run python -m openadapt_ml.benchmarks.cli run --task notepad_1
987
+ ```
988
+
989
+ For complete VM management commands and Azure setup instructions, see [`CLAUDE.md`](CLAUDE.md) and [`docs/azure_waa_setup.md`](docs/azure_waa_setup.md).
990
+
991
+ ### 13.6 Screenshot Capture Tool
992
+
993
+ Capture screenshots of dashboards and VMs for documentation and PR purposes:
994
+
995
+ ```bash
996
+ # Capture all available targets
997
+ uv run python -m openadapt_ml.benchmarks.cli screenshot
998
+
999
+ # List available targets
1000
+ uv run python -m openadapt_ml.benchmarks.cli screenshot --list
1001
+
1002
+ # Capture specific targets
1003
+ uv run python -m openadapt_ml.benchmarks.cli screenshot --target terminal
1004
+ uv run python -m openadapt_ml.benchmarks.cli screenshot --target azure-ops --target vnc
1005
+
1006
+ # Custom output directory
1007
+ uv run python -m openadapt_ml.benchmarks.cli screenshot --output /path/to/screenshots
1008
+
1009
+ # Without timestamp in filename
1010
+ uv run python -m openadapt_ml.benchmarks.cli screenshot --target terminal --no-timestamp
1011
+ ```
1012
+
1013
+ **Available targets:**
1014
+
1015
+ | Target | Description |
1016
+ |--------|-------------|
1017
+ | `azure-ops` | Azure ops dashboard (localhost:8765) |
1018
+ | `vnc` | VNC viewer (localhost:8006) - Windows VM |
1019
+ | `terminal` | VM monitor terminal output (mock mode) |
1020
+ | `terminal-live` | VM monitor terminal output (live, requires running VM) |
1021
+ | `training` | Training dashboard (localhost:8080) |
1022
+ | `vm-screen` | Windows VM screen capture via QEMU |
1023
+
1024
+ **Notes:**
1025
+ - Terminal screenshots use PIL to render terminal output as PNG images
1026
+ - Web page screenshots work best with playwright installed (`uv add playwright && playwright install chromium`)
1027
+ - On macOS, interactive capture using `screencapture` is available as a fallback
1028
+ - Screenshots are saved to `docs/screenshots/` by default with timestamps
1029
+
829
1030
  ---
830
1031
 
831
1032
  ## 14. Limitations & Notes
@@ -0,0 +1,116 @@
1
+ openadapt_ml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ openadapt_ml/config.py,sha256=eH5WTKRPkkidjkNb25Wn_dUAizUQTsVPMYLDq_ekPJQ,1865
3
+ openadapt_ml/baselines/__init__.py,sha256=psXRe8N-TTum0Io09miXQdPx4wxEFnmqjbamK6M-KaE,3137
4
+ openadapt_ml/baselines/adapter.py,sha256=sfJuHfrr-o2jWwFEBKyujXvhzbZ9jHeO92CcqcQIysM,5975
5
+ openadapt_ml/baselines/cli.py,sha256=T0LN2XcJcL-YingNxLoU3LCjDsjIoGyjFPX3xdPmfY4,7868
6
+ openadapt_ml/baselines/config.py,sha256=R2mf-H687l6njQK4Ugyr7QMwjlk5vfUhgvsFDtW4ljY,14085
7
+ openadapt_ml/baselines/parser.py,sha256=xMRFoqXdOYvO0bV92vGoUJ1Jewv_HzTcIjBg97SALb4,31191
8
+ openadapt_ml/baselines/prompts.py,sha256=w7N2jrfmf-FYHfuv1vGT7QtXMF1Ahuy3uAsfjPoo6Ho,24453
9
+ openadapt_ml/benchmarks/__init__.py,sha256=FaEGc7pRM-eLUXEEpJXcIckwkIWKhfaDkaxGM9VC4Os,877
10
+ openadapt_ml/benchmarks/agent.py,sha256=8UcS9skCy6l18fGYaYt0JzJmYSGNB_WxDWhApbM7QH0,26940
11
+ openadapt_ml/benchmarks/azure.py,sha256=dCrxi90X5NmFNMTT-2WG4AF3-IOO4zQs7yPpnqR-jLc,28238
12
+ openadapt_ml/benchmarks/azure_ops_tracker.py,sha256=NOW21LPagOWIThSCIotI5cBvve92dtIktRIDLuyJ2CI,19309
13
+ openadapt_ml/benchmarks/cli.py,sha256=t4cIGN68GdphCX0AGkWJa_M6D4oUO_M0rfJDzD_POGA,62730
14
+ openadapt_ml/benchmarks/trace_export.py,sha256=Zx-pryEuLe734YHY8MgJsNdj3I3TcTY61OQ9iurgGB0,21746
15
+ openadapt_ml/benchmarks/viewer.py,sha256=Jztt_IoDW1u0WjPqlikfR8dunYzj66xCx0bMDDzJHQ8,41586
16
+ openadapt_ml/benchmarks/vm_monitor.py,sha256=FzmRrzqm0sZTcydfqMtRefBLfTr4fjoyWCxdHLovUj0,35733
17
+ openadapt_ml/benchmarks/waa_deploy/Dockerfile,sha256=F4GzVUoAUHvGlTFj-gGIPSlncG-JIz1_JyeaHvTnLpA,10853
18
+ openadapt_ml/benchmarks/waa_deploy/__init__.py,sha256=KV71HrrgETytfY0i4vFSi-yM0KjoQP2hd9Bl03cZ9yc,320
19
+ openadapt_ml/benchmarks/waa_deploy/api_agent.py,sha256=A5ZFhtBTKz0Q1GarNV51JhkEJwAgJfm9tK4CTJ1UEnE,20040
20
+ openadapt_ml/benchmarks/waa_deploy/start_waa_server.bat,sha256=YxgrSWh76zLijlpxEpulWf9To2JtJ-yR42lr2WyTXiY,1496
21
+ openadapt_ml/cloud/__init__.py,sha256=XYrvxivJeZ8qYnuGod5kodMlm3iT2OK2GAApO3CNB0c,133
22
+ openadapt_ml/cloud/azure_inference.py,sha256=2EQ9fCGJA2hzH7mEcSXVK1U2mO4PwBrQHxUCsGCDJVM,15696
23
+ openadapt_ml/cloud/lambda_labs.py,sha256=NGjVHjpY2nO8F9dHHFi_CVjY1nAwk5kOiguOSSYZkCw,107872
24
+ openadapt_ml/cloud/local.py,sha256=s3grqrpTkcT73tIoDt-HJonoCRwx0zBL7M8vSNYL3nU,166047
25
+ openadapt_ml/cloud/ssh_tunnel.py,sha256=PTcyl9cDmbszTJbOD2MAj21AWXqoJt-2Iz26HAPdxRE,21740
26
+ openadapt_ml/datasets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
+ openadapt_ml/datasets/next_action.py,sha256=2u1fRtOQzYdWZ6N_ebmOtPqWL9LnDun5STGuLmkcxrE,21252
28
+ openadapt_ml/evals/__init__.py,sha256=Kx7bSvPHwmoGVI3q1wS_lC17W2S32YHj0459JRqu6Ow,573
29
+ openadapt_ml/evals/grounding.py,sha256=tqjNWdinbj190vt_mPdc_w452z0AwgR81FDhkmKjDvs,8542
30
+ openadapt_ml/evals/plot_eval_metrics.py,sha256=GO-zhYpUJijb4Hp6fI-8lBR3TgjIDpCaOC4iQ-v9VO0,5259
31
+ openadapt_ml/evals/trajectory_matching.py,sha256=eiWPjMZAAWFmdDwQHVM689I98Kw5ensnAJrfEo_QZZ4,20764
32
+ openadapt_ml/experiments/demo_prompt/__init__.py,sha256=dwS0bI53jXMzHE-DPhb_mhmPdoqSZRIcNbV79wt8KPM,454
33
+ openadapt_ml/experiments/demo_prompt/format_demo.py,sha256=baXgqR-oJG9_hanlDPcPYKdMFLw2KSxJ5ERvl3FAwZ8,6691
34
+ openadapt_ml/experiments/demo_prompt/run_experiment.py,sha256=q_8k6WJeR50vrhS_jPmx_TkbPsk1OrTkwUrRkT_PqLM,16574
35
+ openadapt_ml/experiments/demo_prompt/results/experiment_20251231_002125.json,sha256=08oryOF126toTQDN9xciodavvfsaWNnXuBs0aULwpfI,5326
36
+ openadapt_ml/experiments/demo_prompt/results/experiment_n30_20251231_165958.json,sha256=u03VgYTQia_HzilzNjxdGLpUSdbo4SzmHqI-GXlvurg,26915
37
+ openadapt_ml/experiments/demo_prompt/results/multistep_20251231_025051.json,sha256=FA1JgXXLor6on3lHlfJdNSuKzBca30ggH8IWSJEmmfA,11517
38
+ openadapt_ml/experiments/representation_shootout/__init__.py,sha256=flQ8VdNGZ-Nc5sDofSPpGh65O9Iytwk-9DsOVmTMcHE,1874
39
+ openadapt_ml/experiments/representation_shootout/conditions.py,sha256=77AUh2U1t1ZGTHNLoLUO0WDp_17hLp3uZMUkTb2JYow,22866
40
+ openadapt_ml/experiments/representation_shootout/config.py,sha256=df29SNCSPYXsUK2aYQhvRpb9DtmKtoGmCDlp1rWafZU,13043
41
+ openadapt_ml/experiments/representation_shootout/evaluator.py,sha256=ijza5ky-r0CVBfw-amyztX_122N5ZRZsy_rCzMWLELw,22947
42
+ openadapt_ml/experiments/representation_shootout/runner.py,sha256=gvZkq3Opl_6i5pjc-danV-Q7PLLBdwMmnrwVxQ5fNlI,23413
43
+ openadapt_ml/experiments/waa_demo/__init__.py,sha256=9M8iLxO9GWAw-FIB-0tzsqaweLcO5EVP1Sc5BoK16iU,363
44
+ openadapt_ml/experiments/waa_demo/demos.py,sha256=UwO0EYy8wUEggaBaI_cXuYe_jwSB1hx3ZtPf-z9bhjc,13796
45
+ openadapt_ml/experiments/waa_demo/runner.py,sha256=qe0iP6bvI65-FPpw6--yGZ83ASKKtTGlEL7EoO24MiM,24399
46
+ openadapt_ml/experiments/waa_demo/tasks.py,sha256=jw1QwbOt8xmWBW2lmBWcJzKBXssjv_e0j49MlC2rVJY,5425
47
+ openadapt_ml/export/__init__.py,sha256=mKehKHOio4jGcK-3r0-pb446GdKMPs0O9hAu4S0_R7s,266
48
+ openadapt_ml/export/__main__.py,sha256=0ObtWcdzf6p7gPwhNlCKpNm2FIhmusdYNkuk8tyt77U,149
49
+ openadapt_ml/export/cli.py,sha256=goTKNq9cOO9wsdNluLMH_-f9kdWShH3FPP8sCZ6KaPI,2331
50
+ openadapt_ml/export/parquet.py,sha256=oQfyRAhUUS-EpiOWa7S7s8HaHibhfTSoNPYfKb2HDrA,9897
51
+ openadapt_ml/grounding/__init__.py,sha256=uMvcALFRXmKD6PHhqLZ24Y6zhRUs46_PnWYqiqJP5cM,1412
52
+ openadapt_ml/grounding/base.py,sha256=mnjT25nxltZCD0VBzgIgj2kuCcB4sgXBN97MBaW5P6c,7688
53
+ openadapt_ml/grounding/detector.py,sha256=gu-clpHfHNsbeeVwuM54yxF23lAUPThOZStnOdq8-Es,19890
54
+ openadapt_ml/ingest/__init__.py,sha256=P1Z9-rEBZC8wviMlmu6Fgc-R_83Ku7scVDs5YRejMVE,1481
55
+ openadapt_ml/ingest/capture.py,sha256=hiUTbvGGF90KMUNof-z58azywNcHi-xJxQwHYIRb_4Q,10342
56
+ openadapt_ml/ingest/loader.py,sha256=T3gE4EP-SYXmpeOFCK-VCku1lvzfa6AbPJ5hMBDdAVc,9866
57
+ openadapt_ml/ingest/synthetic.py,sha256=ZX3eoMS08fpCFas07kYKUIMb7Bkp1zsaI9Bnuhis-I8,40482
58
+ openadapt_ml/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
+ openadapt_ml/models/api_adapter.py,sha256=G7S847hmYl6AQ8_4oTP5aMV4YhYBN_k-Sj3RVo1w9Bs,6679
60
+ openadapt_ml/models/base_adapter.py,sha256=vvasd-WhFxQNc2utqnXC_YMHABouXXNF4SwK9CUxpOc,2113
61
+ openadapt_ml/models/dummy_adapter.py,sha256=h4Zu-rjWgtG1r8jRtcsrX-FZm8iImrhrTQ7TsLfjE8A,1581
62
+ openadapt_ml/models/qwen_vl.py,sha256=0QcYqTraUMzT6W6No5aomeat9aUxpRqHai9aCX9-6dM,17652
63
+ openadapt_ml/models/providers/__init__.py,sha256=SBd4ZDSi3tYf7DBxTUOFw66Qr15idjuk45TM0bGAKOQ,8216
64
+ openadapt_ml/models/providers/anthropic.py,sha256=iUZceqn4yrD0s0FlMhgcENze4_AgJJ5u8du_1Ke7qy8,8348
65
+ openadapt_ml/models/providers/base.py,sha256=iGVEYSdzP9w3WRE7LM_vbG9ESXWKoJ5qSLx-ZB2ZcOw,8178
66
+ openadapt_ml/models/providers/google.py,sha256=OGXTaQwWonPy-3kLrBC8wLgIQytPtPDQiDkVqsUf70Y,12081
67
+ openadapt_ml/models/providers/openai.py,sha256=1LJJoWxkVNouowebs_N7iI4i8iSCHAjKvPOSAovC3p0,10487
68
+ openadapt_ml/perception/__init__.py,sha256=goR5qA_O7jvO8-gK5XPwib9TsqYfWIbljcmXao8mzRw,847
69
+ openadapt_ml/perception/integration.py,sha256=F9X4ysYn2RdFN6Wh3rXt5kl-cq0tf_6KdFViz2lAAnA,13296
70
+ openadapt_ml/retrieval/README.md,sha256=j4gXhTo6yH-5cuw4ER4174V-U6TQakOVT6Hj4kj7B0I,5696
71
+ openadapt_ml/retrieval/USAGE.md,sha256=XDIrX-94Z5nC-wvnBY5yF5gTqUYixxCC3wwUFvQx5YM,9278
72
+ openadapt_ml/retrieval/__init__.py,sha256=xocb84riKLUCezUioKssFRhAQsnvexh4W932o368_qg,2726
73
+ openadapt_ml/retrieval/demo_retriever.py,sha256=C4pLZ0HaJGkZ9H3_pQdeQcaQOOAU_YzGukx79WaFyZI,29493
74
+ openadapt_ml/retrieval/embeddings.py,sha256=B2tQq4VwN166H-P3s1kvOrhVlLvi4SAfXsMoxhXV8HE,19239
75
+ openadapt_ml/retrieval/index.py,sha256=UBFnSxp5T5eKt2txFcd0FytKCw1qxONZfxnFJVrduRQ,5710
76
+ openadapt_ml/retrieval/retriever.py,sha256=nDWeVLpfsHWWp2TE9dI_w56FebKI5bNXZPsh79BiQos,4609
77
+ openadapt_ml/runtime/__init__.py,sha256=Lpu29HgUvAVPW_dkRHRkk18BeMHlwZD-gQ3dZYNGzGo,1294
78
+ openadapt_ml/runtime/policy.py,sha256=RUB4AqObz-1FPpEZNQ-XUsmxro2RkgTJDAztzM2B_oE,6839
79
+ openadapt_ml/runtime/safety_gate.py,sha256=qODkdgx4HB2t-NL_iGPQbDZ_9hR2SZso_nTQ6KuMSfo,16729
80
+ openadapt_ml/schema/__init__.py,sha256=bL6Mi0z-qBV3cw-rfEaVP-sfzzZOvywO0H9IPWtSdN8,3097
81
+ openadapt_ml/schema/converters.py,sha256=ftXPNngd27PkALQyqukMsGpHdpB2sWBOlVz69rGyNkM,19157
82
+ openadapt_ml/schema/episode.py,sha256=2WFCdnIkcCRodvJiR6irmBaGhKzMB5XEQzS6iQJk2gY,15501
83
+ openadapt_ml/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
+ openadapt_ml/scripts/capture_screenshots.py,sha256=qVxMuIBuH8jT035tQqjfqLRm6OkLhwRvoGBooPGm09E,15283
85
+ openadapt_ml/scripts/compare.py,sha256=rPe_fQrHyINCbqkO9FXtjRsbQGwzlppEnmCK5YfGjgg,57316
86
+ openadapt_ml/scripts/demo_policy.py,sha256=luALfaJhPIh5aFHXdubSMCzPJk04dNzwfdwcCJeNhUk,2120
87
+ openadapt_ml/scripts/eval_policy.py,sha256=DHfQOIyO-mvrsA_zzlVEVwfsX1mLedFVsYvEpgITB5k,10397
88
+ openadapt_ml/scripts/make_gif.py,sha256=fg6jX2BwW4CIVLfWvq3WHjDE5H7tbRYnhZOHSIxhGWo,4433
89
+ openadapt_ml/scripts/prepare_synthetic.py,sha256=2luW436IejDDR2re73yUhtF5Zjf9McAqi2I0z4zs_CE,1123
90
+ openadapt_ml/scripts/run_qwen_login_benchmark.py,sha256=NWIhCAFSX5pYKFRCec7RkrYtzvz2LNMqhDfXcKxlagM,5655
91
+ openadapt_ml/scripts/train.py,sha256=1clpSt07fiMl1sMW57DO5Gco6LV8Oz2_SNGyiwRqcrQ,6759
92
+ openadapt_ml/segmentation/README.md,sha256=lBb3bkOh5Je2Ba_3MMuhB0QUeY44zLROA_S5JTbf7So,26055
93
+ openadapt_ml/segmentation/__init__.py,sha256=iodD7_Is5oLZm4oZttQd_CnLDofzRGbIhkCV1sgBjEU,2567
94
+ openadapt_ml/segmentation/annotator.py,sha256=d50yyxk3HTY1vP_-WXl5aLdmFk3EkdmoMiTqlkIsL78,21648
95
+ openadapt_ml/segmentation/cache.py,sha256=--1M4aoDdWOUYPBIfEnPdNkn9kfoECESs9JwNq5B_NQ,8696
96
+ openadapt_ml/segmentation/cli.py,sha256=L3YbxqTKAE797RYoZj5mxB9s50F7onAnGjbp4GbN-1M,24187
97
+ openadapt_ml/segmentation/deduplicator.py,sha256=aniwrp9IpcrMKfZh6Rx0Ihj_pu_4LepU_RT_eYiRGHI,22826
98
+ openadapt_ml/segmentation/frame_describer.py,sha256=LhgrdEsQ_tMQE7GiwECXWVY0WozEC6Z1Pr8CRTqtINI,26963
99
+ openadapt_ml/segmentation/pipeline.py,sha256=3ztfKt8xZ011xGL5rIIW6dmOyfJp7Af32XdgXuN-QYc,11890
100
+ openadapt_ml/segmentation/schemas.py,sha256=HKf5ImcXRpjM1hB6vJ825OJjUF5QDA5ITSJwcZklscM,19989
101
+ openadapt_ml/segmentation/segment_extractor.py,sha256=R2fI-sD5JsDE9Y3o4o9rpmldrq-TkRsmGrUJEg413vY,22213
102
+ openadapt_ml/segmentation/adapters/__init__.py,sha256=QOLlVvzjmZJP0fhtEZ4yXCvnJSNbWHZP8pV56Zs_5e4,171
103
+ openadapt_ml/segmentation/adapters/capture_adapter.py,sha256=8QDe9pyiRr3e2xuvvYowlNgBsz-NI3xepFL1ZFIAeAU,14353
104
+ openadapt_ml/training/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
+ openadapt_ml/training/azure_ops_viewer.py,sha256=B_Tlye1Z86xdTwc99nGtPqQzcJoDYOU4n7bQI0L-D0E,37679
106
+ openadapt_ml/training/benchmark_viewer.py,sha256=CVQa7c3rts_-a-xarwZ9EneR2i0G0n66f4RiK6wKcjg,174367
107
+ openadapt_ml/training/shared_ui.py,sha256=Ghjpx02k_HuZsyyOnZo6LD08ZIHD5ze7fU4centDMNY,4823
108
+ openadapt_ml/training/stub_provider.py,sha256=wyK4ApK88CCzgjZGl0jkNUrUfuSY-axA_XZMYzeeUpg,10932
109
+ openadapt_ml/training/trainer.py,sha256=yGK79alY9Z0xGRQ2r9EaiWbzGlmE5WZJQL_2TWgc8jU,91358
110
+ openadapt_ml/training/trl_trainer.py,sha256=AL1KFWXMub4vWE2w8eoAoQbSgm2fXO82CIqXULLYwVo,13223
111
+ openadapt_ml/training/viewer.py,sha256=rXpREFbDK_tsu719VUej6iXrgnB8eNP0SEuvB9NUUhA,128104
112
+ openadapt_ml/training/viewer_components.py,sha256=XilaX7r4YXFMT1QkooNnPWqR14SpsiTf7YbrN_g-Lq0,5478
113
+ openadapt_ml-0.2.1.dist-info/METADATA,sha256=4mdYMpWiRht3LWtCTXU7I1qTdjl70bKiLdnzpTKJaFI,36696
114
+ openadapt_ml-0.2.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
115
+ openadapt_ml-0.2.1.dist-info/licenses/LICENSE,sha256=2E5UY67RVLedJuNnwGudkAMtfM3LZNUcHgmaL89TAfw,1068
116
+ openadapt_ml-0.2.1.dist-info/RECORD,,