droidrun 0.1.0__tar.gz → 0.3.0__tar.gz
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.
- droidrun-0.3.0/.gitignore +22 -0
- droidrun-0.3.0/CHANGELOG.md +54 -0
- droidrun-0.3.0/CONTRIBUTING.md +118 -0
- droidrun-0.3.0/PKG-INFO +149 -0
- droidrun-0.3.0/README.md +97 -0
- droidrun-0.3.0/codeact.html +155 -0
- droidrun-0.3.0/docs/docs.json +107 -0
- droidrun-0.3.0/docs/introduction.mdx +97 -0
- droidrun-0.3.0/docs/quickstart.mdx +293 -0
- droidrun-0.3.0/docs/v1/concepts/portal-app.mdx +59 -0
- droidrun-0.1.0/docs/introduction.mdx → droidrun-0.3.0/docs/v1/overview.mdx +3 -6
- droidrun-0.3.0/docs/v1/quickstart.mdx +293 -0
- droidrun-0.3.0/docs/v2/concepts/agent.mdx +229 -0
- droidrun-0.3.0/docs/v2/concepts/android-control.mdx +235 -0
- droidrun-0.3.0/docs/v2/concepts/planning.mdx +140 -0
- droidrun-0.3.0/docs/v2/concepts/portal-app.mdx +59 -0
- droidrun-0.3.0/docs/v2/concepts/tracing.mdx +163 -0
- droidrun-0.3.0/docs/v2/overview.mdx +116 -0
- droidrun-0.3.0/docs/v2/quickstart.mdx +371 -0
- droidrun-0.3.0/docs/v3/concepts/agent.mdx +227 -0
- droidrun-0.3.0/docs/v3/concepts/android-control.mdx +233 -0
- droidrun-0.3.0/docs/v3/concepts/ios-control.mdx +192 -0
- droidrun-0.3.0/docs/v3/concepts/planning.mdx +140 -0
- droidrun-0.3.0/docs/v3/concepts/portal-app.mdx +59 -0
- droidrun-0.3.0/docs/v3/concepts/tracing.mdx +160 -0
- droidrun-0.3.0/docs/v3/overview.mdx +122 -0
- droidrun-0.3.0/docs/v3/quickstart.mdx +356 -0
- droidrun-0.3.0/draw_workflow.py +40 -0
- droidrun-0.3.0/droidagent.html +155 -0
- droidrun-0.3.0/droidrun/__init__.py +31 -0
- {droidrun-0.1.0 → droidrun-0.3.0}/droidrun/__main__.py +1 -2
- droidrun-0.3.0/droidrun/adb/__init__.py +13 -0
- {droidrun-0.1.0 → droidrun-0.3.0}/droidrun/adb/device.py +2 -2
- {droidrun-0.1.0 → droidrun-0.3.0}/droidrun/adb/manager.py +2 -2
- droidrun-0.3.0/droidrun/agent/__init__.py +6 -0
- droidrun-0.3.0/droidrun/agent/codeact/__init__.py +11 -0
- droidrun-0.3.0/droidrun/agent/codeact/codeact_agent.py +420 -0
- droidrun-0.3.0/droidrun/agent/codeact/events.py +28 -0
- droidrun-0.3.0/droidrun/agent/codeact/prompts.py +26 -0
- droidrun-0.3.0/droidrun/agent/common/default.py +5 -0
- droidrun-0.3.0/droidrun/agent/common/events.py +4 -0
- droidrun-0.3.0/droidrun/agent/context/__init__.py +23 -0
- droidrun-0.3.0/droidrun/agent/context/agent_persona.py +15 -0
- droidrun-0.3.0/droidrun/agent/context/context_injection_manager.py +66 -0
- droidrun-0.3.0/droidrun/agent/context/episodic_memory.py +15 -0
- droidrun-0.3.0/droidrun/agent/context/personas/__init__.py +11 -0
- droidrun-0.3.0/droidrun/agent/context/personas/app_starter.py +44 -0
- droidrun-0.3.0/droidrun/agent/context/personas/default.py +95 -0
- droidrun-0.3.0/droidrun/agent/context/personas/extractor.py +52 -0
- droidrun-0.3.0/droidrun/agent/context/personas/ui_expert.py +107 -0
- droidrun-0.3.0/droidrun/agent/context/reflection.py +20 -0
- droidrun-0.3.0/droidrun/agent/context/task_manager.py +124 -0
- droidrun-0.3.0/droidrun/agent/context/todo.txt +4 -0
- droidrun-0.3.0/droidrun/agent/droid/__init__.py +13 -0
- droidrun-0.3.0/droidrun/agent/droid/droid_agent.py +357 -0
- droidrun-0.3.0/droidrun/agent/droid/events.py +28 -0
- droidrun-0.3.0/droidrun/agent/oneflows/reflector.py +265 -0
- droidrun-0.3.0/droidrun/agent/planner/__init__.py +13 -0
- droidrun-0.3.0/droidrun/agent/planner/events.py +16 -0
- droidrun-0.3.0/droidrun/agent/planner/planner_agent.py +268 -0
- droidrun-0.3.0/droidrun/agent/planner/prompts.py +124 -0
- droidrun-0.3.0/droidrun/agent/utils/__init__.py +3 -0
- droidrun-0.3.0/droidrun/agent/utils/async_utils.py +17 -0
- droidrun-0.3.0/droidrun/agent/utils/chat_utils.py +312 -0
- droidrun-0.3.0/droidrun/agent/utils/executer.py +132 -0
- droidrun-0.3.0/droidrun/agent/utils/llm_picker.py +147 -0
- droidrun-0.3.0/droidrun/agent/utils/trajectory.py +184 -0
- {droidrun-0.1.0 → droidrun-0.3.0}/droidrun/cli/__init__.py +1 -1
- droidrun-0.3.0/droidrun/cli/logs.py +283 -0
- droidrun-0.3.0/droidrun/cli/main.py +474 -0
- droidrun-0.3.0/droidrun/run.py +105 -0
- droidrun-0.3.0/droidrun/tools/__init__.py +9 -0
- droidrun-0.3.0/droidrun/tools/adb.py +879 -0
- droidrun-0.3.0/droidrun/tools/ios.py +594 -0
- droidrun-0.3.0/droidrun/tools/tools.py +99 -0
- droidrun-0.3.0/lib/bindings/utils.js +189 -0
- droidrun-0.3.0/lib/tom-select/tom-select.complete.min.js +356 -0
- droidrun-0.3.0/lib/tom-select/tom-select.css +334 -0
- droidrun-0.3.0/lib/vis-9.1.2/vis-network.css +1 -0
- droidrun-0.3.0/lib/vis-9.1.2/vis-network.min.js +27 -0
- droidrun-0.3.0/planner.html +155 -0
- {droidrun-0.1.0 → droidrun-0.3.0}/pyproject.toml +14 -3
- droidrun-0.3.0/static/droidrun-dark.png +0 -0
- droidrun-0.3.0/static/droidrun.png +0 -0
- droidrun-0.1.0/.gitignore +0 -5
- droidrun-0.1.0/PKG-INFO +0 -276
- droidrun-0.1.0/README.md +0 -234
- droidrun-0.1.0/docs/installation.mdx +0 -167
- droidrun-0.1.0/docs/mint.json +0 -48
- droidrun-0.1.0/docs/quickstart.mdx +0 -155
- droidrun-0.1.0/droidrun/__init__.py +0 -19
- droidrun-0.1.0/droidrun/adb/__init__.py +0 -13
- droidrun-0.1.0/droidrun/agent/__init__.py +0 -16
- droidrun-0.1.0/droidrun/agent/llm_reasoning.py +0 -567
- droidrun-0.1.0/droidrun/agent/react_agent.py +0 -556
- droidrun-0.1.0/droidrun/cli/main.py +0 -265
- droidrun-0.1.0/droidrun/llm/__init__.py +0 -24
- droidrun-0.1.0/droidrun/tools/__init__.py +0 -35
- droidrun-0.1.0/droidrun/tools/actions.py +0 -854
- droidrun-0.1.0/droidrun/tools/device.py +0 -29
- {droidrun-0.1.0 → droidrun-0.3.0}/LICENSE +0 -0
- {droidrun-0.1.0 → droidrun-0.3.0}/MANIFEST.in +0 -0
- {droidrun-0.1.0 → droidrun-0.3.0}/docs/conf.py +0 -0
- {droidrun-0.1.0 → droidrun-0.3.0}/docs/favicon.png +0 -0
- {droidrun-0.1.0 → droidrun-0.3.0}/docs/logo/dark.svg +0 -0
- {droidrun-0.1.0 → droidrun-0.3.0}/docs/logo/light.svg +0 -0
- {droidrun-0.1.0/docs → droidrun-0.3.0/docs/v1}/concepts/agent.mdx +0 -0
- {droidrun-0.1.0/docs → droidrun-0.3.0/docs/v1}/concepts/android-control.mdx +0 -0
- {droidrun-0.1.0 → droidrun-0.3.0}/droidrun/adb/wrapper.py +0 -0
- {droidrun-0.1.0 → droidrun-0.3.0}/setup.py +0 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
dist/
|
2
|
+
# Python bytecode files
|
3
|
+
__pycache__/
|
4
|
+
*.py[cod]
|
5
|
+
*$py.class
|
6
|
+
trajectories/
|
7
|
+
*.class
|
8
|
+
|
9
|
+
test.py
|
10
|
+
test.ipynb
|
11
|
+
*.log
|
12
|
+
|
13
|
+
messages_log.json
|
14
|
+
|
15
|
+
.idea
|
16
|
+
.vscode
|
17
|
+
.vscode-test
|
18
|
+
.vscode-test-*
|
19
|
+
.idea/*
|
20
|
+
.vscode/*
|
21
|
+
patch_apis.py
|
22
|
+
.*
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to the DroidRun project will be documented in this file.
|
4
|
+
|
5
|
+
## [0.2.0] - 2025-05-21
|
6
|
+
|
7
|
+
### Added
|
8
|
+
- **New LLM Providers**
|
9
|
+
- Added support for Ollama (local LLM models)
|
10
|
+
- Added support for DeepSeek models
|
11
|
+
- Case-sensitive provider names: OpenAI, Anthropic, Gemini, Ollama, DeepSeek
|
12
|
+
|
13
|
+
- **Planning System**
|
14
|
+
- Added DroidAgent with planning capabilities for complex tasks
|
15
|
+
- Introduced task decomposition for multi-step operations
|
16
|
+
|
17
|
+
- **LlamaIndex Integration**
|
18
|
+
- Replaced custom LLM wrapper with LlamaIndex integration
|
19
|
+
- Added direct support for LlamaIndex LLM classes
|
20
|
+
|
21
|
+
- **Tracing and Debugging**
|
22
|
+
- Added integration with Arize Phoenix for execution tracing
|
23
|
+
- Added token usage analysis
|
24
|
+
- Added execution time metrics
|
25
|
+
|
26
|
+
- **CLI Enhancements**
|
27
|
+
- Added `--reasoning` flag to enable planning capabilities
|
28
|
+
- Added `--tracing` flag for execution tracing with Phoenix
|
29
|
+
|
30
|
+
- **Documentation**
|
31
|
+
- Added comprehensive documentation for new features
|
32
|
+
- Created dedicated pages for planning and tracing
|
33
|
+
- Updated all examples to reflect new API patterns
|
34
|
+
|
35
|
+
### Changed
|
36
|
+
- **Agent Architecture**
|
37
|
+
- Replaced ReActAgent with the new DroidAgent system
|
38
|
+
- Refactored agent initialization to use tools_instance and tool_list
|
39
|
+
- Changed API from `task` parameter to `goal` parameter
|
40
|
+
|
41
|
+
### Deprecated
|
42
|
+
- Old agent initialization pattern with `device_serial` parameter
|
43
|
+
- Direct LLM provider initialization (replaced by LlamaIndex)
|
44
|
+
- Non-case-sensitive provider names
|
45
|
+
|
46
|
+
### Removed
|
47
|
+
- ReActAgent class (replaced by DroidAgent)
|
48
|
+
- LLMReasoner class (replaced by LlamaIndex)
|
49
|
+
- Some previously documented tools that were not fully implemented
|
50
|
+
|
51
|
+
### Fixed
|
52
|
+
- Various UI interaction issues
|
53
|
+
- Improved error handling in device connections
|
54
|
+
- More reliable Android element detection
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# Contributing to DroidRun
|
2
|
+
|
3
|
+
Thank you for your interest in contributing to DroidRun! This document provides guidelines and instructions for contributing to the project.
|
4
|
+
|
5
|
+
## Getting Started
|
6
|
+
|
7
|
+
1. Fork the repository on GitHub
|
8
|
+
2. Clone your fork:
|
9
|
+
```bash
|
10
|
+
git clone https://github.com/YOUR_USERNAME/droidrun.git
|
11
|
+
cd droidrun
|
12
|
+
```
|
13
|
+
3. Set up your development environment as described below
|
14
|
+
|
15
|
+
## Development Setup
|
16
|
+
|
17
|
+
1. Create and activate a virtual environment:
|
18
|
+
```bash
|
19
|
+
python -m venv .venv
|
20
|
+
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
21
|
+
```
|
22
|
+
|
23
|
+
2. Install development dependencies:
|
24
|
+
```bash
|
25
|
+
pip install -e ".[dev]"
|
26
|
+
```
|
27
|
+
|
28
|
+
## Making Contributions
|
29
|
+
|
30
|
+
1. Create a new branch for your feature:
|
31
|
+
```bash
|
32
|
+
git checkout -b feature/your-feature-name
|
33
|
+
```
|
34
|
+
|
35
|
+
2. Make your changes following our coding standards:
|
36
|
+
- Use type hints for Python functions
|
37
|
+
- Follow PEP 8 style guidelines
|
38
|
+
- Write descriptive commit messages
|
39
|
+
- Update documentation as needed
|
40
|
+
|
41
|
+
3. Commit your changes:
|
42
|
+
```bash
|
43
|
+
git add .
|
44
|
+
git commit -m "feat: add your feature description"
|
45
|
+
```
|
46
|
+
|
47
|
+
4. Push to your fork:
|
48
|
+
```bash
|
49
|
+
git push origin feature/your-feature-name
|
50
|
+
```
|
51
|
+
|
52
|
+
5. Open a Pull Request
|
53
|
+
|
54
|
+
## Documentation
|
55
|
+
|
56
|
+
- Update the README.md if you change functionality
|
57
|
+
- Add docstrings to new functions and classes
|
58
|
+
- Update the documentation in the `docs/` directory
|
59
|
+
|
60
|
+
## Community
|
61
|
+
|
62
|
+
- Join our [Discord server](https://discord.gg/ZZbKEZZkwK) for discussions
|
63
|
+
- Follow us on [Twitter/X](https://x.com/droid_run)
|
64
|
+
- Check our [Documentation](https://docs.droidrun.ai)
|
65
|
+
- Report bugs and request features through [GitHub Issues](https://github.com/droidrun/droidrun/issues)
|
66
|
+
|
67
|
+
## Security Checks
|
68
|
+
|
69
|
+
To ensure the security of the codebase, we have integrated security checks using `bandit` and `safety`. These tools help identify potential security issues in the code and dependencies.
|
70
|
+
|
71
|
+
### Running Security Checks
|
72
|
+
|
73
|
+
Before submitting any code, please run the following security checks:
|
74
|
+
|
75
|
+
1. **Bandit**: A tool to find common security issues in Python code.
|
76
|
+
```bash
|
77
|
+
bandit -r droidrun
|
78
|
+
```
|
79
|
+
|
80
|
+
2. **Safety**: A tool to check your installed dependencies for known security vulnerabilities.
|
81
|
+
```bash
|
82
|
+
safety check
|
83
|
+
```
|
84
|
+
|
85
|
+
You can also run both checks using the provided script:
|
86
|
+
```bash
|
87
|
+
python -m droidrun.tools.security_check
|
88
|
+
```
|
89
|
+
|
90
|
+
## Pull Request Process
|
91
|
+
|
92
|
+
1. Update documentation for any modified functionality
|
93
|
+
2. Update the changelog if applicable
|
94
|
+
3. Get at least one code review from a maintainer
|
95
|
+
4. Once approved, a maintainer will merge your PR
|
96
|
+
|
97
|
+
## Release Process
|
98
|
+
|
99
|
+
Releases are handled by the maintainers. Version numbers follow [Semantic Versioning](https://semver.org/).
|
100
|
+
|
101
|
+
## Questions?
|
102
|
+
|
103
|
+
If you have questions about contributing:
|
104
|
+
1. Check existing GitHub issues
|
105
|
+
2. Ask in our Discord server
|
106
|
+
3. Open a new GitHub issue for complex questions
|
107
|
+
|
108
|
+
Thank you for contributing to DroidRun! 🚀
|
109
|
+
|
110
|
+
## Language
|
111
|
+
|
112
|
+
English is the preferred language for all contributions, including:
|
113
|
+
- Code comments
|
114
|
+
- Documentation
|
115
|
+
- Commit messages
|
116
|
+
- Pull requests
|
117
|
+
- Issue reports
|
118
|
+
- Community discussions
|
droidrun-0.3.0/PKG-INFO
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: droidrun
|
3
|
+
Version: 0.3.0
|
4
|
+
Summary: A framework for controlling Android devices through LLM agents
|
5
|
+
Project-URL: Homepage, https://github.com/droidrun/droidrun
|
6
|
+
Project-URL: Bug Tracker, https://github.com/droidrun/droidrun/issues
|
7
|
+
Project-URL: Documentation, https://docs.droidrun.ai/
|
8
|
+
Author-email: Niels Schmidt <niels.schmidt@droidrun.ai>
|
9
|
+
License: MIT
|
10
|
+
License-File: LICENSE
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
12
|
+
Classifier: Intended Audience :: Developers
|
13
|
+
Classifier: Intended Audience :: Information Technology
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
19
|
+
Classifier: Topic :: Communications :: Chat
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
21
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
22
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
23
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
24
|
+
Classifier: Topic :: Software Development :: Testing
|
25
|
+
Classifier: Topic :: Software Development :: Testing :: Acceptance
|
26
|
+
Classifier: Topic :: System :: Emulators
|
27
|
+
Classifier: Topic :: Utilities
|
28
|
+
Requires-Python: >=3.10
|
29
|
+
Requires-Dist: aiofiles>=23.0.0
|
30
|
+
Requires-Dist: anthropic>=0.7.0
|
31
|
+
Requires-Dist: arize-phoenix
|
32
|
+
Requires-Dist: click>=8.1.0
|
33
|
+
Requires-Dist: llama-index
|
34
|
+
Requires-Dist: llama-index-callbacks-arize-phoenix
|
35
|
+
Requires-Dist: llama-index-llms-anthropic
|
36
|
+
Requires-Dist: llama-index-llms-deepseek
|
37
|
+
Requires-Dist: llama-index-llms-gemini
|
38
|
+
Requires-Dist: llama-index-llms-ollama
|
39
|
+
Requires-Dist: llama-index-llms-openai
|
40
|
+
Requires-Dist: openai>=1.0.0
|
41
|
+
Requires-Dist: pillow>=10.0.0
|
42
|
+
Requires-Dist: pydantic>=2.0.0
|
43
|
+
Requires-Dist: python-dotenv>=1.0.0
|
44
|
+
Requires-Dist: rich>=13.0.0
|
45
|
+
Provides-Extra: dev
|
46
|
+
Requires-Dist: bandit>=1.7.0; extra == 'dev'
|
47
|
+
Requires-Dist: black>=23.0.0; extra == 'dev'
|
48
|
+
Requires-Dist: mypy>=1.0.0; extra == 'dev'
|
49
|
+
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
50
|
+
Requires-Dist: safety>=2.0.0; extra == 'dev'
|
51
|
+
Description-Content-Type: text/markdown
|
52
|
+
|
53
|
+
<picture>
|
54
|
+
<source media="(prefers-color-scheme: dark)" srcset="./static/droidrun-dark.png">
|
55
|
+
<source media="(prefers-color-scheme: light)" srcset="./static/droidrun.png">
|
56
|
+
<img src="./static/droidrun.png" width="full">
|
57
|
+
</picture>
|
58
|
+
|
59
|
+
[](https://github.com/droidrun/droidrun/stargazers)
|
60
|
+
[](https://discord.gg/ZZbKEZZkwK)
|
61
|
+
[](https://docs.droidrun.ai)
|
62
|
+
[](https://droidrun.ai/benchmark)
|
63
|
+
[](https://x.com/droid_run)
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
DroidRun is a powerful framework for controlling Android and iOS devices through LLM agents. It allows you to automate device interactions using natural language commands. [Checkout our benchmark results](https://droidrun.ai/benchmark)
|
68
|
+
|
69
|
+
- 🤖 Control Android and iOS devices with natural language commands
|
70
|
+
- 🔀 Supports multiple LLM providers (OpenAI, Anthropic, Gemini, Ollama, DeepSeek)
|
71
|
+
- 🧠 Planning capabilities for complex multi-step tasks
|
72
|
+
- 💻 Easy to use CLI with enhanced debugging features
|
73
|
+
- 🐍 Extendable Python API for custom automations
|
74
|
+
- 📸 Screenshot analysis for visual understanding of the device
|
75
|
+
- Execution tracing with Arize Phoenix
|
76
|
+
|
77
|
+
## 📦 Installation
|
78
|
+
|
79
|
+
```bash
|
80
|
+
pip install droidrun
|
81
|
+
```
|
82
|
+
|
83
|
+
## 🚀 Quickstart
|
84
|
+
Read on how to get droidrun up and running within seconds in [our docs](https://docs.droidrun.ai/v3/quickstart)!
|
85
|
+
|
86
|
+
|
87
|
+
## 🎬 Demo Videos
|
88
|
+
|
89
|
+
1. **Shopping Assistant**: Watch how DroidRun searches Amazon for headphones and sends the top 3 products to a colleague on WhatsApp.
|
90
|
+
|
91
|
+
Prompt: "Go to Amazon, search for headphones and write the top 3 products to my colleague on WhatsApp."
|
92
|
+
|
93
|
+
[](https://www.youtube.com/watch?v=VQK3JcifgwU)
|
94
|
+
|
95
|
+
2. **Social Media Automation**: See DroidRun open X (Twitter) and post "Hello World".
|
96
|
+
|
97
|
+
Prompt: "Open up X and post Hello World."
|
98
|
+
|
99
|
+
[](https://www.youtube.com/watch?v=i4-sDQhzt_M)
|
100
|
+
|
101
|
+
## 💡 Example Use Cases
|
102
|
+
|
103
|
+
- Automated UI testing of mobile applications
|
104
|
+
- Creating guided workflows for non-technical users
|
105
|
+
- Automating repetitive tasks on mobile devices
|
106
|
+
- Remote assistance for less technical users
|
107
|
+
- Exploring mobile UI with natural language commands
|
108
|
+
|
109
|
+
## 🗺️ Roadmap
|
110
|
+
|
111
|
+
### 🤖 Agent:
|
112
|
+
- **Improve memory**: Enhance context retention for complex multi-step tasks
|
113
|
+
- **Expand planning capabilities**: Add support for more complex reasoning strategies
|
114
|
+
- **Add Integrations**: Support more LLM providers and agent frameworks (LangChain, Agno etc.)
|
115
|
+
|
116
|
+
### ⚙️ Automations:
|
117
|
+
- **Create Automation Scripts**: Generate reusable scripts from agent actions that can be scheduled or shared
|
118
|
+
|
119
|
+
### ☁️ Cloud:
|
120
|
+
- **Hosted version**: Remote device control via web interface without local setup
|
121
|
+
- **Add-Ons**: Marketplace for extensions serving specific use cases
|
122
|
+
- **Proxy Hours**: Cloud compute time with tiered pricing for running automations
|
123
|
+
- **Droidrun AppStore**: Simple installation of Apps on your hosted devices
|
124
|
+
|
125
|
+
## 👥 Contributing
|
126
|
+
|
127
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
128
|
+
|
129
|
+
## 📄 License
|
130
|
+
|
131
|
+
This project is licensed under the MIT License - see the LICENSE file for details.
|
132
|
+
|
133
|
+
## Security Checks
|
134
|
+
|
135
|
+
To ensure the security of the codebase, we have integrated security checks using `bandit` and `safety`. These tools help identify potential security issues in the code and dependencies.
|
136
|
+
|
137
|
+
### Running Security Checks
|
138
|
+
|
139
|
+
Before submitting any code, please run the following security checks:
|
140
|
+
|
141
|
+
1. **Bandit**: A tool to find common security issues in Python code.
|
142
|
+
```bash
|
143
|
+
bandit -r droidrun
|
144
|
+
```
|
145
|
+
|
146
|
+
2. **Safety**: A tool to check your installed dependencies for known security vulnerabilities.
|
147
|
+
```bash
|
148
|
+
safety scan
|
149
|
+
```
|
droidrun-0.3.0/README.md
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
<picture>
|
2
|
+
<source media="(prefers-color-scheme: dark)" srcset="./static/droidrun-dark.png">
|
3
|
+
<source media="(prefers-color-scheme: light)" srcset="./static/droidrun.png">
|
4
|
+
<img src="./static/droidrun.png" width="full">
|
5
|
+
</picture>
|
6
|
+
|
7
|
+
[](https://github.com/droidrun/droidrun/stargazers)
|
8
|
+
[](https://discord.gg/ZZbKEZZkwK)
|
9
|
+
[](https://docs.droidrun.ai)
|
10
|
+
[](https://droidrun.ai/benchmark)
|
11
|
+
[](https://x.com/droid_run)
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
DroidRun is a powerful framework for controlling Android and iOS devices through LLM agents. It allows you to automate device interactions using natural language commands. [Checkout our benchmark results](https://droidrun.ai/benchmark)
|
16
|
+
|
17
|
+
- 🤖 Control Android and iOS devices with natural language commands
|
18
|
+
- 🔀 Supports multiple LLM providers (OpenAI, Anthropic, Gemini, Ollama, DeepSeek)
|
19
|
+
- 🧠 Planning capabilities for complex multi-step tasks
|
20
|
+
- 💻 Easy to use CLI with enhanced debugging features
|
21
|
+
- 🐍 Extendable Python API for custom automations
|
22
|
+
- 📸 Screenshot analysis for visual understanding of the device
|
23
|
+
- Execution tracing with Arize Phoenix
|
24
|
+
|
25
|
+
## 📦 Installation
|
26
|
+
|
27
|
+
```bash
|
28
|
+
pip install droidrun
|
29
|
+
```
|
30
|
+
|
31
|
+
## 🚀 Quickstart
|
32
|
+
Read on how to get droidrun up and running within seconds in [our docs](https://docs.droidrun.ai/v3/quickstart)!
|
33
|
+
|
34
|
+
|
35
|
+
## 🎬 Demo Videos
|
36
|
+
|
37
|
+
1. **Shopping Assistant**: Watch how DroidRun searches Amazon for headphones and sends the top 3 products to a colleague on WhatsApp.
|
38
|
+
|
39
|
+
Prompt: "Go to Amazon, search for headphones and write the top 3 products to my colleague on WhatsApp."
|
40
|
+
|
41
|
+
[](https://www.youtube.com/watch?v=VQK3JcifgwU)
|
42
|
+
|
43
|
+
2. **Social Media Automation**: See DroidRun open X (Twitter) and post "Hello World".
|
44
|
+
|
45
|
+
Prompt: "Open up X and post Hello World."
|
46
|
+
|
47
|
+
[](https://www.youtube.com/watch?v=i4-sDQhzt_M)
|
48
|
+
|
49
|
+
## 💡 Example Use Cases
|
50
|
+
|
51
|
+
- Automated UI testing of mobile applications
|
52
|
+
- Creating guided workflows for non-technical users
|
53
|
+
- Automating repetitive tasks on mobile devices
|
54
|
+
- Remote assistance for less technical users
|
55
|
+
- Exploring mobile UI with natural language commands
|
56
|
+
|
57
|
+
## 🗺️ Roadmap
|
58
|
+
|
59
|
+
### 🤖 Agent:
|
60
|
+
- **Improve memory**: Enhance context retention for complex multi-step tasks
|
61
|
+
- **Expand planning capabilities**: Add support for more complex reasoning strategies
|
62
|
+
- **Add Integrations**: Support more LLM providers and agent frameworks (LangChain, Agno etc.)
|
63
|
+
|
64
|
+
### ⚙️ Automations:
|
65
|
+
- **Create Automation Scripts**: Generate reusable scripts from agent actions that can be scheduled or shared
|
66
|
+
|
67
|
+
### ☁️ Cloud:
|
68
|
+
- **Hosted version**: Remote device control via web interface without local setup
|
69
|
+
- **Add-Ons**: Marketplace for extensions serving specific use cases
|
70
|
+
- **Proxy Hours**: Cloud compute time with tiered pricing for running automations
|
71
|
+
- **Droidrun AppStore**: Simple installation of Apps on your hosted devices
|
72
|
+
|
73
|
+
## 👥 Contributing
|
74
|
+
|
75
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
76
|
+
|
77
|
+
## 📄 License
|
78
|
+
|
79
|
+
This project is licensed under the MIT License - see the LICENSE file for details.
|
80
|
+
|
81
|
+
## Security Checks
|
82
|
+
|
83
|
+
To ensure the security of the codebase, we have integrated security checks using `bandit` and `safety`. These tools help identify potential security issues in the code and dependencies.
|
84
|
+
|
85
|
+
### Running Security Checks
|
86
|
+
|
87
|
+
Before submitting any code, please run the following security checks:
|
88
|
+
|
89
|
+
1. **Bandit**: A tool to find common security issues in Python code.
|
90
|
+
```bash
|
91
|
+
bandit -r droidrun
|
92
|
+
```
|
93
|
+
|
94
|
+
2. **Safety**: A tool to check your installed dependencies for known security vulnerabilities.
|
95
|
+
```bash
|
96
|
+
safety scan
|
97
|
+
```
|
@@ -0,0 +1,155 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<meta charset="utf-8">
|
4
|
+
|
5
|
+
<script src="lib/bindings/utils.js"></script>
|
6
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/vis-network/9.1.2/dist/dist/vis-network.min.css" integrity="sha512-WgxfT5LWjfszlPHXRmBWHkV2eceiWTOBvrKCNbdgDYTHrT2AeLCGbF4sZlZw3UMN3WtL0tGUoIAKsu8mllg/XA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
7
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/vis-network/9.1.2/dist/vis-network.min.js" integrity="sha512-LnvoEWDFrqGHlHmDD2101OrLcbsfkrzoSpvtSQtxK3RMnRV0eOkhhBN2dXHKRrUU8p2DGRTk35n4O8nWSVe1mQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
8
|
+
|
9
|
+
|
10
|
+
<center>
|
11
|
+
<h1></h1>
|
12
|
+
</center>
|
13
|
+
|
14
|
+
<!-- <link rel="stylesheet" href="../node_modules/vis/dist/vis.min.css" type="text/css" />
|
15
|
+
<script type="text/javascript" src="../node_modules/vis/dist/vis.js"> </script>-->
|
16
|
+
<link
|
17
|
+
href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css"
|
18
|
+
rel="stylesheet"
|
19
|
+
integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6"
|
20
|
+
crossorigin="anonymous"
|
21
|
+
/>
|
22
|
+
<script
|
23
|
+
src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js"
|
24
|
+
integrity="sha384-JEW9xMcG8R+pH31jmWH6WWP0WintQrMb4s7ZOdauHnUtxwoG2vI5DkLtS3qm9Ekf"
|
25
|
+
crossorigin="anonymous"
|
26
|
+
></script>
|
27
|
+
|
28
|
+
|
29
|
+
<center>
|
30
|
+
<h1></h1>
|
31
|
+
</center>
|
32
|
+
<style type="text/css">
|
33
|
+
|
34
|
+
#mynetwork {
|
35
|
+
width: 100%;
|
36
|
+
height: 750px;
|
37
|
+
background-color: #ffffff;
|
38
|
+
border: 1px solid lightgray;
|
39
|
+
position: relative;
|
40
|
+
float: left;
|
41
|
+
}
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
</style>
|
49
|
+
</head>
|
50
|
+
|
51
|
+
|
52
|
+
<body>
|
53
|
+
<div class="card" style="width: 100%">
|
54
|
+
|
55
|
+
|
56
|
+
<div id="mynetwork" class="card-body"></div>
|
57
|
+
</div>
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
<script type="text/javascript">
|
63
|
+
|
64
|
+
// initialize global variables.
|
65
|
+
var edges;
|
66
|
+
var nodes;
|
67
|
+
var allNodes;
|
68
|
+
var allEdges;
|
69
|
+
var nodeColors;
|
70
|
+
var originalNodes;
|
71
|
+
var network;
|
72
|
+
var container;
|
73
|
+
var options, data;
|
74
|
+
var filter = {
|
75
|
+
item : '',
|
76
|
+
property : '',
|
77
|
+
value : []
|
78
|
+
};
|
79
|
+
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
// This method is responsible for drawing the graph, returns the drawn network
|
85
|
+
function drawGraph() {
|
86
|
+
var container = document.getElementById('mynetwork');
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
// parsing and collecting nodes and edges from the python
|
91
|
+
nodes = new vis.DataSet([{"color": "#ADD8E6", "id": "_done", "label": "_done", "shape": "box"}, {"color": "#FFA07A", "id": "StopEvent", "label": "StopEvent", "shape": "ellipse"}, {"color": "#ADD8E6", "id": "execute_code", "label": "execute_code", "shape": "box"}, {"color": "#90EE90", "id": "TaskExecutionEvent", "label": "TaskExecutionEvent", "shape": "ellipse"}, {"color": "#90EE90", "id": "TaskExecutionResultEvent", "label": "TaskExecutionResultEvent", "shape": "ellipse"}, {"color": "#90EE90", "id": "TaskEndEvent", "label": "TaskEndEvent", "shape": "ellipse"}, {"color": "#ADD8E6", "id": "finalize", "label": "finalize", "shape": "box"}, {"color": "#ADD8E6", "id": "handle_execution_result", "label": "handle_execution_result", "shape": "box"}, {"color": "#90EE90", "id": "TaskInputEvent", "label": "TaskInputEvent", "shape": "ellipse"}, {"color": "#ADD8E6", "id": "handle_llm_input", "label": "handle_llm_input", "shape": "box"}, {"color": "#90EE90", "id": "TaskThinkingEvent", "label": "TaskThinkingEvent", "shape": "ellipse"}, {"color": "#ADD8E6", "id": "handle_llm_output", "label": "handle_llm_output", "shape": "box"}, {"color": "#ADD8E6", "id": "prepare_chat", "label": "prepare_chat", "shape": "box"}, {"color": "#E27AFF", "id": "StartEvent", "label": "StartEvent", "shape": "ellipse"}]);
|
92
|
+
edges = new vis.DataSet([{"arrows": "to", "from": "StopEvent", "to": "_done"}, {"arrows": "to", "from": "execute_code", "to": "TaskExecutionResultEvent"}, {"arrows": "to", "from": "execute_code", "to": "TaskEndEvent"}, {"arrows": "to", "from": "TaskExecutionEvent", "to": "execute_code"}, {"arrows": "to", "from": "finalize", "to": "StopEvent"}, {"arrows": "to", "from": "TaskEndEvent", "to": "finalize"}, {"arrows": "to", "from": "handle_execution_result", "to": "TaskInputEvent"}, {"arrows": "to", "from": "TaskExecutionResultEvent", "to": "handle_execution_result"}, {"arrows": "to", "from": "handle_llm_input", "to": "TaskThinkingEvent"}, {"arrows": "to", "from": "handle_llm_input", "to": "TaskEndEvent"}, {"arrows": "to", "from": "TaskInputEvent", "to": "handle_llm_input"}, {"arrows": "to", "from": "handle_llm_output", "to": "TaskExecutionEvent"}, {"arrows": "to", "from": "handle_llm_output", "to": "TaskInputEvent"}, {"arrows": "to", "from": "TaskThinkingEvent", "to": "handle_llm_output"}, {"arrows": "to", "from": "prepare_chat", "to": "TaskInputEvent"}, {"arrows": "to", "from": "StartEvent", "to": "prepare_chat"}]);
|
93
|
+
|
94
|
+
nodeColors = {};
|
95
|
+
allNodes = nodes.get({ returnType: "Object" });
|
96
|
+
for (nodeId in allNodes) {
|
97
|
+
nodeColors[nodeId] = allNodes[nodeId].color;
|
98
|
+
}
|
99
|
+
allEdges = edges.get({ returnType: "Object" });
|
100
|
+
// adding nodes and edges to the graph
|
101
|
+
data = {nodes: nodes, edges: edges};
|
102
|
+
|
103
|
+
var options = {
|
104
|
+
"configure": {
|
105
|
+
"enabled": false
|
106
|
+
},
|
107
|
+
"edges": {
|
108
|
+
"color": {
|
109
|
+
"inherit": true
|
110
|
+
},
|
111
|
+
"smooth": {
|
112
|
+
"enabled": true,
|
113
|
+
"type": "dynamic"
|
114
|
+
}
|
115
|
+
},
|
116
|
+
"interaction": {
|
117
|
+
"dragNodes": true,
|
118
|
+
"hideEdgesOnDrag": false,
|
119
|
+
"hideNodesOnDrag": false
|
120
|
+
},
|
121
|
+
"physics": {
|
122
|
+
"enabled": true,
|
123
|
+
"stabilization": {
|
124
|
+
"enabled": true,
|
125
|
+
"fit": true,
|
126
|
+
"iterations": 1000,
|
127
|
+
"onlyDynamicEdges": false,
|
128
|
+
"updateInterval": 50
|
129
|
+
}
|
130
|
+
}
|
131
|
+
};
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
network = new vis.Network(container, data, options);
|
139
|
+
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
return network;
|
150
|
+
|
151
|
+
}
|
152
|
+
drawGraph();
|
153
|
+
</script>
|
154
|
+
</body>
|
155
|
+
</html>
|