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.
Files changed (110) hide show
  1. droidrun-0.3.0/.gitignore +22 -0
  2. droidrun-0.3.0/CHANGELOG.md +54 -0
  3. droidrun-0.3.0/CONTRIBUTING.md +118 -0
  4. droidrun-0.3.0/PKG-INFO +149 -0
  5. droidrun-0.3.0/README.md +97 -0
  6. droidrun-0.3.0/codeact.html +155 -0
  7. droidrun-0.3.0/docs/docs.json +107 -0
  8. droidrun-0.3.0/docs/introduction.mdx +97 -0
  9. droidrun-0.3.0/docs/quickstart.mdx +293 -0
  10. droidrun-0.3.0/docs/v1/concepts/portal-app.mdx +59 -0
  11. droidrun-0.1.0/docs/introduction.mdx → droidrun-0.3.0/docs/v1/overview.mdx +3 -6
  12. droidrun-0.3.0/docs/v1/quickstart.mdx +293 -0
  13. droidrun-0.3.0/docs/v2/concepts/agent.mdx +229 -0
  14. droidrun-0.3.0/docs/v2/concepts/android-control.mdx +235 -0
  15. droidrun-0.3.0/docs/v2/concepts/planning.mdx +140 -0
  16. droidrun-0.3.0/docs/v2/concepts/portal-app.mdx +59 -0
  17. droidrun-0.3.0/docs/v2/concepts/tracing.mdx +163 -0
  18. droidrun-0.3.0/docs/v2/overview.mdx +116 -0
  19. droidrun-0.3.0/docs/v2/quickstart.mdx +371 -0
  20. droidrun-0.3.0/docs/v3/concepts/agent.mdx +227 -0
  21. droidrun-0.3.0/docs/v3/concepts/android-control.mdx +233 -0
  22. droidrun-0.3.0/docs/v3/concepts/ios-control.mdx +192 -0
  23. droidrun-0.3.0/docs/v3/concepts/planning.mdx +140 -0
  24. droidrun-0.3.0/docs/v3/concepts/portal-app.mdx +59 -0
  25. droidrun-0.3.0/docs/v3/concepts/tracing.mdx +160 -0
  26. droidrun-0.3.0/docs/v3/overview.mdx +122 -0
  27. droidrun-0.3.0/docs/v3/quickstart.mdx +356 -0
  28. droidrun-0.3.0/draw_workflow.py +40 -0
  29. droidrun-0.3.0/droidagent.html +155 -0
  30. droidrun-0.3.0/droidrun/__init__.py +31 -0
  31. {droidrun-0.1.0 → droidrun-0.3.0}/droidrun/__main__.py +1 -2
  32. droidrun-0.3.0/droidrun/adb/__init__.py +13 -0
  33. {droidrun-0.1.0 → droidrun-0.3.0}/droidrun/adb/device.py +2 -2
  34. {droidrun-0.1.0 → droidrun-0.3.0}/droidrun/adb/manager.py +2 -2
  35. droidrun-0.3.0/droidrun/agent/__init__.py +6 -0
  36. droidrun-0.3.0/droidrun/agent/codeact/__init__.py +11 -0
  37. droidrun-0.3.0/droidrun/agent/codeact/codeact_agent.py +420 -0
  38. droidrun-0.3.0/droidrun/agent/codeact/events.py +28 -0
  39. droidrun-0.3.0/droidrun/agent/codeact/prompts.py +26 -0
  40. droidrun-0.3.0/droidrun/agent/common/default.py +5 -0
  41. droidrun-0.3.0/droidrun/agent/common/events.py +4 -0
  42. droidrun-0.3.0/droidrun/agent/context/__init__.py +23 -0
  43. droidrun-0.3.0/droidrun/agent/context/agent_persona.py +15 -0
  44. droidrun-0.3.0/droidrun/agent/context/context_injection_manager.py +66 -0
  45. droidrun-0.3.0/droidrun/agent/context/episodic_memory.py +15 -0
  46. droidrun-0.3.0/droidrun/agent/context/personas/__init__.py +11 -0
  47. droidrun-0.3.0/droidrun/agent/context/personas/app_starter.py +44 -0
  48. droidrun-0.3.0/droidrun/agent/context/personas/default.py +95 -0
  49. droidrun-0.3.0/droidrun/agent/context/personas/extractor.py +52 -0
  50. droidrun-0.3.0/droidrun/agent/context/personas/ui_expert.py +107 -0
  51. droidrun-0.3.0/droidrun/agent/context/reflection.py +20 -0
  52. droidrun-0.3.0/droidrun/agent/context/task_manager.py +124 -0
  53. droidrun-0.3.0/droidrun/agent/context/todo.txt +4 -0
  54. droidrun-0.3.0/droidrun/agent/droid/__init__.py +13 -0
  55. droidrun-0.3.0/droidrun/agent/droid/droid_agent.py +357 -0
  56. droidrun-0.3.0/droidrun/agent/droid/events.py +28 -0
  57. droidrun-0.3.0/droidrun/agent/oneflows/reflector.py +265 -0
  58. droidrun-0.3.0/droidrun/agent/planner/__init__.py +13 -0
  59. droidrun-0.3.0/droidrun/agent/planner/events.py +16 -0
  60. droidrun-0.3.0/droidrun/agent/planner/planner_agent.py +268 -0
  61. droidrun-0.3.0/droidrun/agent/planner/prompts.py +124 -0
  62. droidrun-0.3.0/droidrun/agent/utils/__init__.py +3 -0
  63. droidrun-0.3.0/droidrun/agent/utils/async_utils.py +17 -0
  64. droidrun-0.3.0/droidrun/agent/utils/chat_utils.py +312 -0
  65. droidrun-0.3.0/droidrun/agent/utils/executer.py +132 -0
  66. droidrun-0.3.0/droidrun/agent/utils/llm_picker.py +147 -0
  67. droidrun-0.3.0/droidrun/agent/utils/trajectory.py +184 -0
  68. {droidrun-0.1.0 → droidrun-0.3.0}/droidrun/cli/__init__.py +1 -1
  69. droidrun-0.3.0/droidrun/cli/logs.py +283 -0
  70. droidrun-0.3.0/droidrun/cli/main.py +474 -0
  71. droidrun-0.3.0/droidrun/run.py +105 -0
  72. droidrun-0.3.0/droidrun/tools/__init__.py +9 -0
  73. droidrun-0.3.0/droidrun/tools/adb.py +879 -0
  74. droidrun-0.3.0/droidrun/tools/ios.py +594 -0
  75. droidrun-0.3.0/droidrun/tools/tools.py +99 -0
  76. droidrun-0.3.0/lib/bindings/utils.js +189 -0
  77. droidrun-0.3.0/lib/tom-select/tom-select.complete.min.js +356 -0
  78. droidrun-0.3.0/lib/tom-select/tom-select.css +334 -0
  79. droidrun-0.3.0/lib/vis-9.1.2/vis-network.css +1 -0
  80. droidrun-0.3.0/lib/vis-9.1.2/vis-network.min.js +27 -0
  81. droidrun-0.3.0/planner.html +155 -0
  82. {droidrun-0.1.0 → droidrun-0.3.0}/pyproject.toml +14 -3
  83. droidrun-0.3.0/static/droidrun-dark.png +0 -0
  84. droidrun-0.3.0/static/droidrun.png +0 -0
  85. droidrun-0.1.0/.gitignore +0 -5
  86. droidrun-0.1.0/PKG-INFO +0 -276
  87. droidrun-0.1.0/README.md +0 -234
  88. droidrun-0.1.0/docs/installation.mdx +0 -167
  89. droidrun-0.1.0/docs/mint.json +0 -48
  90. droidrun-0.1.0/docs/quickstart.mdx +0 -155
  91. droidrun-0.1.0/droidrun/__init__.py +0 -19
  92. droidrun-0.1.0/droidrun/adb/__init__.py +0 -13
  93. droidrun-0.1.0/droidrun/agent/__init__.py +0 -16
  94. droidrun-0.1.0/droidrun/agent/llm_reasoning.py +0 -567
  95. droidrun-0.1.0/droidrun/agent/react_agent.py +0 -556
  96. droidrun-0.1.0/droidrun/cli/main.py +0 -265
  97. droidrun-0.1.0/droidrun/llm/__init__.py +0 -24
  98. droidrun-0.1.0/droidrun/tools/__init__.py +0 -35
  99. droidrun-0.1.0/droidrun/tools/actions.py +0 -854
  100. droidrun-0.1.0/droidrun/tools/device.py +0 -29
  101. {droidrun-0.1.0 → droidrun-0.3.0}/LICENSE +0 -0
  102. {droidrun-0.1.0 → droidrun-0.3.0}/MANIFEST.in +0 -0
  103. {droidrun-0.1.0 → droidrun-0.3.0}/docs/conf.py +0 -0
  104. {droidrun-0.1.0 → droidrun-0.3.0}/docs/favicon.png +0 -0
  105. {droidrun-0.1.0 → droidrun-0.3.0}/docs/logo/dark.svg +0 -0
  106. {droidrun-0.1.0 → droidrun-0.3.0}/docs/logo/light.svg +0 -0
  107. {droidrun-0.1.0/docs → droidrun-0.3.0/docs/v1}/concepts/agent.mdx +0 -0
  108. {droidrun-0.1.0/docs → droidrun-0.3.0/docs/v1}/concepts/android-control.mdx +0 -0
  109. {droidrun-0.1.0 → droidrun-0.3.0}/droidrun/adb/wrapper.py +0 -0
  110. {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
@@ -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
+ [![GitHub stars](https://img.shields.io/github/stars/droidrun/droidrun?style=social)](https://github.com/droidrun/droidrun/stargazers)
60
+ [![Discord](https://img.shields.io/discord/1360219330318696488?color=7289DA&label=Discord&logo=discord&logoColor=white)](https://discord.gg/ZZbKEZZkwK)
61
+ [![Documentation](https://img.shields.io/badge/Documentation-📕-blue)](https://docs.droidrun.ai)
62
+ [![Benchmark](https://img.shields.io/badge/Benchmark-🏅-teal)](https://droidrun.ai/benchmark)
63
+ [![Twitter Follow](https://img.shields.io/twitter/follow/droid_run?style=social)](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
+ [![Shopping Assistant Demo](https://img.youtube.com/vi/VQK3JcifgwU/0.jpg)](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
+ [![Social Media Automation Demo](https://img.youtube.com/vi/i4-sDQhzt_M/0.jpg)](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
+ ```
@@ -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
+ [![GitHub stars](https://img.shields.io/github/stars/droidrun/droidrun?style=social)](https://github.com/droidrun/droidrun/stargazers)
8
+ [![Discord](https://img.shields.io/discord/1360219330318696488?color=7289DA&label=Discord&logo=discord&logoColor=white)](https://discord.gg/ZZbKEZZkwK)
9
+ [![Documentation](https://img.shields.io/badge/Documentation-📕-blue)](https://docs.droidrun.ai)
10
+ [![Benchmark](https://img.shields.io/badge/Benchmark-🏅-teal)](https://droidrun.ai/benchmark)
11
+ [![Twitter Follow](https://img.shields.io/twitter/follow/droid_run?style=social)](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
+ [![Shopping Assistant Demo](https://img.youtube.com/vi/VQK3JcifgwU/0.jpg)](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
+ [![Social Media Automation Demo](https://img.youtube.com/vi/i4-sDQhzt_M/0.jpg)](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>