droidrun 0.3.1__tar.gz → 0.3.3__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.3/.github/workflows/bounty.yml +134 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/.github/workflows/publish.yml +2 -1
- {droidrun-0.3.1 → droidrun-0.3.3}/.gitignore +4 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/PKG-INFO +31 -29
- {droidrun-0.3.1 → droidrun-0.3.3}/README.md +25 -27
- droidrun-0.3.3/docs/.generated-files.txt +5 -0
- droidrun-0.3.3/docs/docs.json +147 -0
- droidrun-0.3.3/docs/v3/concepts/agent.mdx +122 -0
- droidrun-0.3.3/docs/v3/concepts/android-tools.mdx +103 -0
- droidrun-0.3.3/docs/v3/concepts/models.mdx +31 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/v3/concepts/portal-app.mdx +12 -17
- droidrun-0.3.3/docs/v3/guides/cli.mdx +171 -0
- droidrun-0.3.3/docs/v3/guides/gemini.mdx +90 -0
- droidrun-0.3.3/docs/v3/guides/ollama.mdx +108 -0
- droidrun-0.3.3/docs/v3/guides/openailike.mdx +104 -0
- droidrun-0.3.3/docs/v3/guides/overview.mdx +58 -0
- droidrun-0.3.3/docs/v3/guides/telemetry.mdx +36 -0
- droidrun-0.3.3/docs/v3/images/portal_apk.png +0 -0
- droidrun-0.3.3/docs/v3/overview.mdx +35 -0
- droidrun-0.3.3/docs/v3/quickstart.mdx +94 -0
- droidrun-0.3.3/docs/v3/sdk/adb-tools.mdx +330 -0
- droidrun-0.3.3/docs/v3/sdk/adb-utils.mdx +399 -0
- droidrun-0.3.3/docs/v3/sdk/base-tools.mdx +160 -0
- droidrun-0.3.3/docs/v3/sdk/droid-agent.mdx +66 -0
- droidrun-0.3.3/docs/v3/sdk/ios-tools.mdx +276 -0
- droidrun-0.3.3/droidrun/__init__.py +26 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/codeact/codeact_agent.py +9 -7
- droidrun-0.3.3/droidrun/agent/common/events.py +47 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/context/personas/__init__.py +2 -2
- droidrun-0.3.3/droidrun/agent/context/personas/big_agent.py +96 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/context/personas/ui_expert.py +1 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/droid/droid_agent.py +63 -11
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/droid/events.py +4 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/planner/planner_agent.py +2 -2
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/utils/executer.py +10 -2
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/utils/llm_picker.py +1 -0
- droidrun-0.3.3/droidrun/agent/utils/trajectory.py +431 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/cli/main.py +179 -86
- droidrun-0.3.3/droidrun/macro/__init__.py +14 -0
- droidrun-0.3.3/droidrun/macro/__main__.py +10 -0
- droidrun-0.3.3/droidrun/macro/cli.py +228 -0
- droidrun-0.3.3/droidrun/macro/replay.py +309 -0
- droidrun-0.3.3/droidrun/portal.py +138 -0
- droidrun-0.3.3/droidrun/telemetry/__init__.py +4 -0
- droidrun-0.3.3/droidrun/telemetry/events.py +27 -0
- droidrun-0.3.3/droidrun/telemetry/tracker.py +84 -0
- droidrun-0.3.3/droidrun/tools/adb.py +1139 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/tools/ios.py +169 -166
- droidrun-0.3.3/droidrun/tools/tools.py +148 -0
- droidrun-0.3.3/gen-docs-sdk-ref.sh +19 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/pyproject.toml +82 -2
- droidrun-0.3.1/docs/conf.py +0 -25
- droidrun-0.3.1/docs/docs.json +0 -107
- droidrun-0.3.1/docs/introduction.mdx +0 -97
- droidrun-0.3.1/docs/v1/quickstart.mdx +0 -293
- droidrun-0.3.1/docs/v3/concepts/agent.mdx +0 -227
- droidrun-0.3.1/docs/v3/concepts/android-control.mdx +0 -233
- droidrun-0.3.1/docs/v3/concepts/ios-control.mdx +0 -192
- droidrun-0.3.1/docs/v3/concepts/planning.mdx +0 -140
- droidrun-0.3.1/docs/v3/concepts/tracing.mdx +0 -160
- droidrun-0.3.1/docs/v3/overview.mdx +0 -122
- droidrun-0.3.1/docs/v3/quickstart.mdx +0 -356
- droidrun-0.3.1/droidrun/__init__.py +0 -31
- droidrun-0.3.1/droidrun/adb/__init__.py +0 -13
- droidrun-0.3.1/droidrun/adb/device.py +0 -315
- droidrun-0.3.1/droidrun/adb/manager.py +0 -93
- droidrun-0.3.1/droidrun/adb/wrapper.py +0 -226
- droidrun-0.3.1/droidrun/agent/common/events.py +0 -4
- droidrun-0.3.1/droidrun/agent/context/personas/extractor.py +0 -52
- droidrun-0.3.1/droidrun/agent/utils/trajectory.py +0 -184
- droidrun-0.3.1/droidrun/tools/adb.py +0 -807
- droidrun-0.3.1/droidrun/tools/tools.py +0 -95
- {droidrun-0.3.1 → droidrun-0.3.3}/CHANGELOG.md +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/CONTRIBUTING.md +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/LICENSE +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/MANIFEST.in +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/favicon.png +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/logo/dark.svg +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/logo/light.svg +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/v1/concepts/agent.mdx +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/v1/concepts/android-control.mdx +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/v1/concepts/portal-app.mdx +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/v1/overview.mdx +0 -0
- {droidrun-0.3.1/docs → droidrun-0.3.3/docs/v1}/quickstart.mdx +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/v2/concepts/agent.mdx +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/v2/concepts/android-control.mdx +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/v2/concepts/planning.mdx +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/v2/concepts/portal-app.mdx +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/v2/concepts/tracing.mdx +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/v2/overview.mdx +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/docs/v2/quickstart.mdx +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/__main__.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/__init__.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/codeact/__init__.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/codeact/events.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/codeact/prompts.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/common/default.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/context/__init__.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/context/agent_persona.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/context/context_injection_manager.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/context/episodic_memory.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/context/personas/app_starter.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/context/personas/default.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/context/reflection.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/context/task_manager.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/droid/__init__.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/oneflows/reflector.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/planner/__init__.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/planner/events.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/planner/prompts.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/utils/__init__.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/utils/async_utils.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/agent/utils/chat_utils.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/cli/__init__.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/cli/logs.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/droidrun/tools/__init__.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/setup.py +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/static/droidrun-dark.png +0 -0
- {droidrun-0.3.1 → droidrun-0.3.3}/static/droidrun.png +0 -0
@@ -0,0 +1,134 @@
|
|
1
|
+
name: "Project V2: Status ← issue label"
|
2
|
+
|
3
|
+
on:
|
4
|
+
issues:
|
5
|
+
types: [labeled]
|
6
|
+
|
7
|
+
env:
|
8
|
+
ORG: droidrun
|
9
|
+
PROJECT_NUMBER: 2
|
10
|
+
PROJECT_TOKEN: ${{ secrets.BOUNTY_SECRET }}
|
11
|
+
|
12
|
+
jobs:
|
13
|
+
update_status:
|
14
|
+
runs-on: ubuntu-latest
|
15
|
+
steps:
|
16
|
+
|
17
|
+
- name: Fetch project & field metadata
|
18
|
+
id: metadata
|
19
|
+
env:
|
20
|
+
GH_TOKEN: ${{ env.PROJECT_TOKEN }}
|
21
|
+
run: |
|
22
|
+
# 1) Query projectV2 ID and the Status field + its options
|
23
|
+
gh api graphql -f query='
|
24
|
+
query($org:String!,$num:Int!){
|
25
|
+
organization(login:$org){
|
26
|
+
projectV2(number:$num){
|
27
|
+
id
|
28
|
+
fields(first:20){
|
29
|
+
nodes{
|
30
|
+
... on ProjectV2SingleSelectField{
|
31
|
+
id
|
32
|
+
name
|
33
|
+
options { id name }
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}' \
|
40
|
+
-f org="${ORG}" -F num=${PROJECT_NUMBER} \
|
41
|
+
--jq '
|
42
|
+
.data.organization.projectV2 as $p |
|
43
|
+
($p.id) as $projId |
|
44
|
+
($p.fields.nodes[] | select(.name=="Status")) as $f |
|
45
|
+
{
|
46
|
+
projectId: $projId,
|
47
|
+
statusFieldId: $f.id,
|
48
|
+
options: ($f.options | map({(.name): .id}) | add)
|
49
|
+
}
|
50
|
+
' > meta.json
|
51
|
+
|
52
|
+
# expose to GH env
|
53
|
+
echo "PROJECT_ID=$(jq -r .projectId meta.json)" >> $GITHUB_ENV
|
54
|
+
echo "STATUS_FIELD_ID=$(jq -r .statusFieldId meta.json)" >> $GITHUB_ENV
|
55
|
+
# options is an object like {"Eligible":"ID1","Bounty Posted":"ID2",...}
|
56
|
+
echo "STATUS_OPTIONS=$(jq -c .options meta.json)" >> $GITHUB_ENV
|
57
|
+
|
58
|
+
- name: Determine target option ID
|
59
|
+
id: pick
|
60
|
+
run: |
|
61
|
+
LABEL="${{ github.event.label.name }}"
|
62
|
+
# map label→ field option name
|
63
|
+
case "$LABEL" in
|
64
|
+
eligible) OPT_NAME="📝 Eligible" ;;
|
65
|
+
bounty-official) OPT_NAME="💰 Bounty" ;;
|
66
|
+
claimed) OPT_NAME="🛠️ In Progress" ;;
|
67
|
+
*) echo "No matching status for $LABEL"; exit 0 ;;
|
68
|
+
esac
|
69
|
+
|
70
|
+
# extract from JSON map
|
71
|
+
OPT_ID=$(echo "$STATUS_OPTIONS" | jq -r --arg name "$OPT_NAME" '.[$name]')
|
72
|
+
echo "OPTION_ID=$OPT_ID" >> $GITHUB_ENV
|
73
|
+
|
74
|
+
- name: Ensure issue is in the project
|
75
|
+
id: add_if_missing
|
76
|
+
env:
|
77
|
+
GH_TOKEN: ${{ env.PROJECT_TOKEN }}
|
78
|
+
run: |
|
79
|
+
ISSUE_NODE_ID=$(gh api graphql -f query='
|
80
|
+
query($owner:String!,$repo:String!,$number:Int!){
|
81
|
+
repository(owner:$owner, name:$repo){
|
82
|
+
issue(number:$number){
|
83
|
+
id
|
84
|
+
projectItems(first:1){
|
85
|
+
nodes{ id }
|
86
|
+
}
|
87
|
+
}
|
88
|
+
}
|
89
|
+
}' \
|
90
|
+
-f owner="droidrun" \
|
91
|
+
-f repo="droidrun" \
|
92
|
+
-F number=104 \
|
93
|
+
--jq '.data.repository.issue as $i |
|
94
|
+
{ issueId: $i.id,
|
95
|
+
itemId: ($i.projectItems.nodes[0]?.id // "") }' )
|
96
|
+
|
97
|
+
# Save to file
|
98
|
+
echo "$ISSUE_NODE_ID" > issue.json
|
99
|
+
ISSUE_ID=$(jq -r .issueId issue.json)
|
100
|
+
ITEM_ID=$(jq -r .itemId issue.json)
|
101
|
+
|
102
|
+
if [ -z "$ITEM_ID" ]; then
|
103
|
+
ITEM_ID=$(gh api graphql -f query='
|
104
|
+
mutation($proj:ID!,$content:ID!){
|
105
|
+
addProjectV2ItemById(input:{projectId:$proj, contentId:$content}){
|
106
|
+
item { id }
|
107
|
+
}
|
108
|
+
}' \
|
109
|
+
-f proj="${PROJECT_ID}" -f content="$ISSUE_ID" \
|
110
|
+
--jq '.data.addProjectV2ItemById.item.id')
|
111
|
+
fi
|
112
|
+
echo "ITEM_ID=$ITEM_ID" >> $GITHUB_ENV
|
113
|
+
|
114
|
+
- name: Update Status field
|
115
|
+
env:
|
116
|
+
GH_TOKEN: ${{ env.PROJECT_TOKEN }}
|
117
|
+
run: |
|
118
|
+
gh api graphql -f query='
|
119
|
+
mutation($proj:ID!,$item:ID!,$field:ID!,$opt:String!){
|
120
|
+
updateProjectV2ItemFieldValue(input:{
|
121
|
+
projectId: $proj,
|
122
|
+
itemId: $item,
|
123
|
+
fieldId: $field,
|
124
|
+
value: {
|
125
|
+
singleSelectOptionId: $opt
|
126
|
+
}
|
127
|
+
}) {
|
128
|
+
projectV2Item { id }
|
129
|
+
}
|
130
|
+
}' \
|
131
|
+
-f proj="${PROJECT_ID}" \
|
132
|
+
-f item="${ITEM_ID}" \
|
133
|
+
-f field="${STATUS_FIELD_ID}" \
|
134
|
+
-f opt="${OPTION_ID}"
|
@@ -53,6 +53,7 @@ jobs:
|
|
53
53
|
|
54
54
|
publish-to-testpypi:
|
55
55
|
name: Publish Python 🐍 distribution 📦 to TestPyPI
|
56
|
+
if: startsWith(github.ref, 'refs/tags/')
|
56
57
|
needs:
|
57
58
|
- build
|
58
59
|
runs-on: ubuntu-latest
|
@@ -73,4 +74,4 @@ jobs:
|
|
73
74
|
- name: Publish distribution 📦 to TestPyPI
|
74
75
|
uses: pypa/gh-action-pypi-publish@release/v1
|
75
76
|
with:
|
76
|
-
repository-url: https://test.pypi.org/legacy/
|
77
|
+
repository-url: https://test.pypi.org/legacy/
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: droidrun
|
3
|
-
Version: 0.3.
|
3
|
+
Version: 0.3.3
|
4
4
|
Summary: A framework for controlling Android devices through LLM agents
|
5
5
|
Project-URL: Homepage, https://github.com/droidrun/droidrun
|
6
6
|
Project-URL: Bug Tracker, https://github.com/droidrun/droidrun/issues
|
@@ -25,9 +25,11 @@ Classifier: Topic :: Software Development :: Testing
|
|
25
25
|
Classifier: Topic :: Software Development :: Testing :: Acceptance
|
26
26
|
Classifier: Topic :: System :: Emulators
|
27
27
|
Classifier: Topic :: Utilities
|
28
|
-
Requires-Python: >=3.
|
28
|
+
Requires-Python: >=3.11
|
29
|
+
Requires-Dist: adbutils==2.10.0
|
29
30
|
Requires-Dist: aiofiles>=23.0.0
|
30
31
|
Requires-Dist: anthropic>=0.7.0
|
32
|
+
Requires-Dist: apkutils==2.0.0
|
31
33
|
Requires-Dist: arize-phoenix
|
32
34
|
Requires-Dist: click>=8.1.0
|
33
35
|
Requires-Dist: llama-index
|
@@ -40,9 +42,11 @@ Requires-Dist: llama-index-llms-openai
|
|
40
42
|
Requires-Dist: llama-index-llms-openai-like
|
41
43
|
Requires-Dist: openai>=1.0.0
|
42
44
|
Requires-Dist: pillow>=10.0.0
|
45
|
+
Requires-Dist: posthog==6.0.2
|
43
46
|
Requires-Dist: pydantic>=2.0.0
|
44
47
|
Requires-Dist: python-dotenv>=1.0.0
|
45
48
|
Requires-Dist: rich>=13.0.0
|
49
|
+
Requires-Dist: typing-extensions
|
46
50
|
Provides-Extra: dev
|
47
51
|
Requires-Dist: bandit>=1.7.0; extra == 'dev'
|
48
52
|
Requires-Dist: black>=23.0.0; extra == 'dev'
|
@@ -63,10 +67,18 @@ Description-Content-Type: text/markdown
|
|
63
67
|
[](https://droidrun.ai/benchmark)
|
64
68
|
[](https://x.com/droid_run)
|
65
69
|
|
70
|
+
<picture>
|
71
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=983810&theme=dark&period=daily&t=1753948032207">
|
72
|
+
<source media="(prefers-color-scheme: light)" srcset="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=983810&theme=neutral&period=daily&t=1753948125523">
|
73
|
+
<a href="https://www.producthunt.com/products/droidrun-framework-for-mobile-agent?embed=true&utm_source=badge-top-post-badge&utm_medium=badge&utm_source=badge-droidrun" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=983810&theme=neutral&period=daily&t=1753948125523" alt="Droidrun - Give AI native control of physical & virtual phones. | Product Hunt" style="width: 200px; height: 54px;" width="200" height="54" /></a>
|
74
|
+
</picture>
|
75
|
+
|
66
76
|
|
67
77
|
|
68
78
|
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)
|
69
79
|
|
80
|
+
## Why Droidrun?
|
81
|
+
|
70
82
|
- 🤖 Control Android and iOS devices with natural language commands
|
71
83
|
- 🔀 Supports multiple LLM providers (OpenAI, Anthropic, Gemini, Ollama, DeepSeek)
|
72
84
|
- 🧠 Planning capabilities for complex multi-step tasks
|
@@ -82,22 +94,28 @@ pip install droidrun
|
|
82
94
|
```
|
83
95
|
|
84
96
|
## 🚀 Quickstart
|
85
|
-
Read on how to get droidrun up and running within seconds in [our docs](https://docs.droidrun.ai/v3/quickstart)!
|
97
|
+
Read on how to get droidrun up and running within seconds in [our docs](https://docs.droidrun.ai/v3/quickstart)!
|
86
98
|
|
99
|
+
[](https://www.youtube.com/watch?v=4WT7FXJah2I)
|
87
100
|
|
88
101
|
## 🎬 Demo Videos
|
89
102
|
|
90
|
-
1. **
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
103
|
+
1. **Accommodation booking**: Let Droidrun search for an apartment for you
|
104
|
+
|
105
|
+
[](https://youtu.be/VUpCyq1PSXw)
|
106
|
+
|
107
|
+
<br>
|
108
|
+
|
109
|
+
2. **Trend Hunter**: Let Droidrun hunt down trending posts
|
110
|
+
|
111
|
+
[](https://youtu.be/7V8S2f8PnkQ)
|
112
|
+
|
113
|
+
<br>
|
114
|
+
|
115
|
+
3. **Streak Saver**: Let Droidrun save your streak on your favorite language learning app
|
116
|
+
|
117
|
+
[](https://youtu.be/B5q2B467HKw)
|
95
118
|
|
96
|
-
2. **Social Media Automation**: See DroidRun open X (Twitter) and post "Hello World".
|
97
|
-
|
98
|
-
Prompt: "Open up X and post Hello World."
|
99
|
-
|
100
|
-
[](https://www.youtube.com/watch?v=i4-sDQhzt_M)
|
101
119
|
|
102
120
|
## 💡 Example Use Cases
|
103
121
|
|
@@ -107,22 +125,6 @@ Read on how to get droidrun up and running within seconds in [our docs](https://
|
|
107
125
|
- Remote assistance for less technical users
|
108
126
|
- Exploring mobile UI with natural language commands
|
109
127
|
|
110
|
-
## 🗺️ Roadmap
|
111
|
-
|
112
|
-
### 🤖 Agent:
|
113
|
-
- **Improve memory**: Enhance context retention for complex multi-step tasks
|
114
|
-
- **Expand planning capabilities**: Add support for more complex reasoning strategies
|
115
|
-
- **Add Integrations**: Support more LLM providers and agent frameworks (LangChain, Agno etc.)
|
116
|
-
|
117
|
-
### ⚙️ Automations:
|
118
|
-
- **Create Automation Scripts**: Generate reusable scripts from agent actions that can be scheduled or shared
|
119
|
-
|
120
|
-
### ☁️ Cloud:
|
121
|
-
- **Hosted version**: Remote device control via web interface without local setup
|
122
|
-
- **Add-Ons**: Marketplace for extensions serving specific use cases
|
123
|
-
- **Proxy Hours**: Cloud compute time with tiered pricing for running automations
|
124
|
-
- **Droidrun AppStore**: Simple installation of Apps on your hosted devices
|
125
|
-
|
126
128
|
## 👥 Contributing
|
127
129
|
|
128
130
|
Contributions are welcome! Please feel free to submit a Pull Request.
|
@@ -10,10 +10,18 @@
|
|
10
10
|
[](https://droidrun.ai/benchmark)
|
11
11
|
[](https://x.com/droid_run)
|
12
12
|
|
13
|
+
<picture>
|
14
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=983810&theme=dark&period=daily&t=1753948032207">
|
15
|
+
<source media="(prefers-color-scheme: light)" srcset="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=983810&theme=neutral&period=daily&t=1753948125523">
|
16
|
+
<a href="https://www.producthunt.com/products/droidrun-framework-for-mobile-agent?embed=true&utm_source=badge-top-post-badge&utm_medium=badge&utm_source=badge-droidrun" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=983810&theme=neutral&period=daily&t=1753948125523" alt="Droidrun - Give AI native control of physical & virtual phones. | Product Hunt" style="width: 200px; height: 54px;" width="200" height="54" /></a>
|
17
|
+
</picture>
|
18
|
+
|
13
19
|
|
14
20
|
|
15
21
|
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
22
|
|
23
|
+
## Why Droidrun?
|
24
|
+
|
17
25
|
- 🤖 Control Android and iOS devices with natural language commands
|
18
26
|
- 🔀 Supports multiple LLM providers (OpenAI, Anthropic, Gemini, Ollama, DeepSeek)
|
19
27
|
- 🧠 Planning capabilities for complex multi-step tasks
|
@@ -29,22 +37,28 @@ pip install droidrun
|
|
29
37
|
```
|
30
38
|
|
31
39
|
## 🚀 Quickstart
|
32
|
-
Read on how to get droidrun up and running within seconds in [our docs](https://docs.droidrun.ai/v3/quickstart)!
|
40
|
+
Read on how to get droidrun up and running within seconds in [our docs](https://docs.droidrun.ai/v3/quickstart)!
|
33
41
|
|
42
|
+
[](https://www.youtube.com/watch?v=4WT7FXJah2I)
|
34
43
|
|
35
44
|
## 🎬 Demo Videos
|
36
45
|
|
37
|
-
1. **
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
46
|
+
1. **Accommodation booking**: Let Droidrun search for an apartment for you
|
47
|
+
|
48
|
+
[](https://youtu.be/VUpCyq1PSXw)
|
49
|
+
|
50
|
+
<br>
|
51
|
+
|
52
|
+
2. **Trend Hunter**: Let Droidrun hunt down trending posts
|
53
|
+
|
54
|
+
[](https://youtu.be/7V8S2f8PnkQ)
|
55
|
+
|
56
|
+
<br>
|
57
|
+
|
58
|
+
3. **Streak Saver**: Let Droidrun save your streak on your favorite language learning app
|
59
|
+
|
60
|
+
[](https://youtu.be/B5q2B467HKw)
|
42
61
|
|
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
62
|
|
49
63
|
## 💡 Example Use Cases
|
50
64
|
|
@@ -54,22 +68,6 @@ Read on how to get droidrun up and running within seconds in [our docs](https://
|
|
54
68
|
- Remote assistance for less technical users
|
55
69
|
- Exploring mobile UI with natural language commands
|
56
70
|
|
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
71
|
## 👥 Contributing
|
74
72
|
|
75
73
|
Contributions are welcome! Please feel free to submit a Pull Request.
|
@@ -0,0 +1,5 @@
|
|
1
|
+
md5 1075080038db59977da1586c48d421fb v3/sdk/droid-agent.mdx
|
2
|
+
md5 cbccf5efa2fd001f990078cbb05a8d98 v3/sdk/base-tools.mdx
|
3
|
+
md5 58f64ddcf2c976b6804894c5c4798a6f v3/sdk/adb-tools.mdx
|
4
|
+
md5 3e8a7d303e264b8a8f22b16f45fbde1a v3/sdk/ios-tools.mdx
|
5
|
+
md5 fa5a80e8c823f705fce0ea914b85ea41 v3/sdk/adb-utils.mdx
|
@@ -0,0 +1,147 @@
|
|
1
|
+
{
|
2
|
+
"$schema": "https://mintlify.com/docs.json",
|
3
|
+
"theme": "mint",
|
4
|
+
"name": "DroidRun",
|
5
|
+
"colors": {
|
6
|
+
"primary": "#0D9373",
|
7
|
+
"light": "#07C983",
|
8
|
+
"dark": "#0D9373"
|
9
|
+
},
|
10
|
+
"favicon": "/favicon.png",
|
11
|
+
"navigation": {
|
12
|
+
"tabs": [
|
13
|
+
{
|
14
|
+
"tab": "Framework",
|
15
|
+
"versions": [
|
16
|
+
{
|
17
|
+
"version": "0.3.2",
|
18
|
+
"groups": [
|
19
|
+
{
|
20
|
+
"group": "Introduction",
|
21
|
+
"pages": [
|
22
|
+
"v3/overview",
|
23
|
+
"v3/quickstart"
|
24
|
+
]
|
25
|
+
},
|
26
|
+
{
|
27
|
+
"group": "Guides",
|
28
|
+
"pages": [
|
29
|
+
"v3/guides/overview",
|
30
|
+
"v3/guides/cli",
|
31
|
+
"v3/guides/gemini",
|
32
|
+
"v3/guides/openailike",
|
33
|
+
"v3/guides/ollama",
|
34
|
+
"v3/guides/telemetry"
|
35
|
+
]
|
36
|
+
},
|
37
|
+
{
|
38
|
+
"group": "Core Concepts",
|
39
|
+
"pages": [
|
40
|
+
"v3/concepts/agent",
|
41
|
+
"v3/concepts/models",
|
42
|
+
"v3/concepts/android-tools",
|
43
|
+
"v3/concepts/portal-app"
|
44
|
+
]
|
45
|
+
},
|
46
|
+
{
|
47
|
+
"group": "SDK Reference",
|
48
|
+
"pages": [
|
49
|
+
"v3/sdk/droid-agent",
|
50
|
+
"v3/sdk/adb-tools",
|
51
|
+
"v3/sdk/ios-tools",
|
52
|
+
"v3/sdk/base-tools",
|
53
|
+
"v3/sdk/adb-utils"
|
54
|
+
]
|
55
|
+
}
|
56
|
+
]
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"version": "0.2.0",
|
60
|
+
"groups": [
|
61
|
+
{
|
62
|
+
"group": "Getting Started",
|
63
|
+
"pages": [
|
64
|
+
"v2/overview",
|
65
|
+
"v2/quickstart"
|
66
|
+
]
|
67
|
+
},
|
68
|
+
{
|
69
|
+
"group": "Core Concepts",
|
70
|
+
"pages": [
|
71
|
+
"v2/concepts/agent",
|
72
|
+
"v2/concepts/planning",
|
73
|
+
"v2/concepts/android-control",
|
74
|
+
"v2/concepts/portal-app",
|
75
|
+
"v2/concepts/tracing"
|
76
|
+
]
|
77
|
+
}
|
78
|
+
]
|
79
|
+
},
|
80
|
+
{
|
81
|
+
"version": "0.1.0",
|
82
|
+
"groups": [
|
83
|
+
{
|
84
|
+
"group": "Getting Started",
|
85
|
+
"pages": [
|
86
|
+
"v1/overview",
|
87
|
+
"v1/quickstart"
|
88
|
+
]
|
89
|
+
},
|
90
|
+
{
|
91
|
+
"group": "Core Concepts",
|
92
|
+
"pages": [
|
93
|
+
"v1/concepts/agent",
|
94
|
+
"v1/concepts/android-control",
|
95
|
+
"v1/concepts/portal-app"
|
96
|
+
]
|
97
|
+
}
|
98
|
+
]
|
99
|
+
}
|
100
|
+
]
|
101
|
+
},
|
102
|
+
{
|
103
|
+
"tab": "Cloud API",
|
104
|
+
"versions": [
|
105
|
+
{
|
106
|
+
"version": "0.1.0",
|
107
|
+
"openapi": "https://api.droidrun.ai/v1/openapi.json"
|
108
|
+
}
|
109
|
+
]
|
110
|
+
}
|
111
|
+
]
|
112
|
+
},
|
113
|
+
"logo": {
|
114
|
+
"light": "/logo/light.svg",
|
115
|
+
"dark": "/logo/dark.svg"
|
116
|
+
},
|
117
|
+
"navbar": {
|
118
|
+
"links": [
|
119
|
+
{
|
120
|
+
"label": "GitHub",
|
121
|
+
"href": "https://github.com/droidrun/droidrun"
|
122
|
+
},
|
123
|
+
{
|
124
|
+
"label": "Benchmark",
|
125
|
+
"href": "https://droidrun.ai/benchmark"
|
126
|
+
}
|
127
|
+
],
|
128
|
+
"primary": {
|
129
|
+
"type": "button",
|
130
|
+
"label": "Join Discord",
|
131
|
+
"href": "https://discord.gg/gdekvkJFvn"
|
132
|
+
}
|
133
|
+
},
|
134
|
+
"footer": {
|
135
|
+
"socials": {
|
136
|
+
"github": "https://github.com/droidrun/droidrun",
|
137
|
+
"x": "https://x.com/droid_run",
|
138
|
+
"discord": "https://discord.gg/gdekvkJFvn",
|
139
|
+
"website": "https://droidrun.ai"
|
140
|
+
}
|
141
|
+
},
|
142
|
+
"errors": {
|
143
|
+
"404": {
|
144
|
+
"redirect": false
|
145
|
+
}
|
146
|
+
}
|
147
|
+
}
|
@@ -0,0 +1,122 @@
|
|
1
|
+
---
|
2
|
+
title: 'Agent & Execution Modes'
|
3
|
+
description: 'Understanding the DroidAgent system in DroidRun'
|
4
|
+
---
|
5
|
+
|
6
|
+
|
7
|
+
## Configuration
|
8
|
+
|
9
|
+
```python
|
10
|
+
# The parameters for the DroidAgent
|
11
|
+
def __init__(
|
12
|
+
self,
|
13
|
+
goal: str, # The goal for the agent to reach
|
14
|
+
llm: LLM, # Language model to use
|
15
|
+
tools: Tools, # Loaded tools
|
16
|
+
personas: List[AgentPersona] = [DEFAULT], # Experimental: custom system prompt for agent
|
17
|
+
max_steps: int = 15, # Maximum steps the agent takes
|
18
|
+
timeout: int = 1000, # Global Timeout
|
19
|
+
vision: bool = False, # Whether the agent shall also utilize screenshots
|
20
|
+
reasoning: bool = False, # Enable reasoning
|
21
|
+
reflection: bool = False, # Enable reflection
|
22
|
+
enable_tracing: bool = False, # Enable tracing (this requires arize phoenix)
|
23
|
+
debug: bool = False, # Enable additional debug logs
|
24
|
+
save_trajectories: bool = False, # Save the Trajectory data of the run (GIF + logs)
|
25
|
+
*args,
|
26
|
+
**kwargs
|
27
|
+
)
|
28
|
+
```
|
29
|
+
|
30
|
+
## Execution Modes
|
31
|
+
|
32
|
+
The agent operates in three distinct modes, each optimized for different complexity levels and use cases.
|
33
|
+
|
34
|
+
### Direct Execution
|
35
|
+
<div style={{display: 'flex', gap: '8px', marginBottom: '16px'}}>
|
36
|
+
<span style={{background: 'rgba(107, 114, 128, 0.2)', color: '#6b7280', padding: '4px 8px', borderRadius: '8px', fontSize: '12px', fontWeight: 'bold'}}>REASONING: LOW</span>
|
37
|
+
<span style={{background: 'rgba(13, 147, 115, 0.2)', color: '#0D9373', padding: '4px 8px', borderRadius: '8px', fontSize: '12px', fontWeight: 'bold'}}>SPEED: HIGH</span>
|
38
|
+
</div>
|
39
|
+
|
40
|
+
```python
|
41
|
+
# Simple tasks
|
42
|
+
agent = DroidAgent(
|
43
|
+
goal="Take a screenshot of the current screen",
|
44
|
+
llm=llm,
|
45
|
+
tools=tools,
|
46
|
+
reasoning=False
|
47
|
+
)
|
48
|
+
```
|
49
|
+
**Flow:** Goal → Direct Execution → Result
|
50
|
+
|
51
|
+
**Best Practices:**
|
52
|
+
- Use for single-action tasks (1-15 steps)
|
53
|
+
- Keep goals specific and atomic
|
54
|
+
- Faster execution with no planning overhead
|
55
|
+
|
56
|
+
### Planning Mode
|
57
|
+
<div style={{display: 'flex', gap: '8px', marginBottom: '16px'}}>
|
58
|
+
<span style={{background: 'rgba(217, 119, 6, 0.2)', color: '#d97706', padding: '4px 8px', borderRadius: '8px', fontSize: '12px', fontWeight: 'bold'}}>REASONING: MEDIUM</span>
|
59
|
+
<span style={{background: 'rgba(217, 119, 6, 0.2)', color: '#d97706', padding: '4px 8px', borderRadius: '8px', fontSize: '12px', fontWeight: 'bold'}}>SPEED: MEDIUM</span>
|
60
|
+
</div>
|
61
|
+
|
62
|
+
```python
|
63
|
+
# Multi-step tasks requiring navigation and decision-making
|
64
|
+
agent = DroidAgent(
|
65
|
+
goal="Set up a new alarm for 7 AM with custom ringtone and label 'Work'",
|
66
|
+
llm=llm,
|
67
|
+
tools=tools,
|
68
|
+
reasoning=True
|
69
|
+
)
|
70
|
+
```
|
71
|
+
**Flow:** Goal → Planning → Step-by-step Execution → Result
|
72
|
+
|
73
|
+
**Best Practices:**
|
74
|
+
- Use for multi-step tasks (15-50 steps)
|
75
|
+
- Ideal for navigation between apps/screens
|
76
|
+
- Good for tasks requiring step-by-step breakdown
|
77
|
+
|
78
|
+
|
79
|
+
### Reflection Mode
|
80
|
+
<div style={{display: 'flex', gap: '8px', marginBottom: '16px'}}>
|
81
|
+
<span style={{background: 'rgba(13, 147, 115, 0.2)', color: '#0D9373', padding: '4px 8px', borderRadius: '8px', fontSize: '12px', fontWeight: 'bold'}}>REASONING: HIGH</span>
|
82
|
+
<span style={{background: 'rgba(107, 114, 128, 0.2)', color: '#6b7280', padding: '4px 8px', borderRadius: '8px', fontSize: '12px', fontWeight: 'bold'}}>SPEED: LOW</span>
|
83
|
+
</div>
|
84
|
+
|
85
|
+
```python
|
86
|
+
# Complex, multi-app workflows requiring verification and adaptive planning
|
87
|
+
agent = DroidAgent(
|
88
|
+
goal="Find the cheapest hotel in Manhattan for next weekend, compare prices across multiple booking apps, and share the best option with my team on Slack",
|
89
|
+
llm=llm,
|
90
|
+
tools=tools,
|
91
|
+
reasoning=True,
|
92
|
+
reflection=True
|
93
|
+
)
|
94
|
+
```
|
95
|
+
**Flow:** Goal → Planning → Execution → Reflection → Re-planning (if needed) → Result
|
96
|
+
|
97
|
+
**Best Practice:**
|
98
|
+
- Use for complex workflows (50+ steps)
|
99
|
+
- Essential for quality control and verification
|
100
|
+
- Best when context preservation is critical
|
101
|
+
|
102
|
+
## Vision capabilities
|
103
|
+
<Warning>Vision capabilities are deactivated for the DeepSeek provider and require an LLM model with vision capabilities (e.g., GPT-4o, Gemini-2.5-Flash etc.).</Warning>
|
104
|
+
|
105
|
+
By default, DroidAgent operates entirely without vision by leveraging Android's Accessibility API to extract the UI hierarchy as XML. This approach is efficient and works well for most automation tasks.
|
106
|
+
|
107
|
+
However, enabling vision capabilities allows the agent to take screenshots and visually analyze the device screen, which can be beneficial in specific scenarios:
|
108
|
+
```python
|
109
|
+
# To enable vision capabilities, set `vision=True` in your agent configuration.
|
110
|
+
agent = DroidAgent(
|
111
|
+
goal="Open up TikTok and describe the content of the video you are seeing",
|
112
|
+
llm=llm,
|
113
|
+
tools=tools,
|
114
|
+
vision=True
|
115
|
+
)
|
116
|
+
```
|
117
|
+
|
118
|
+
|
119
|
+
- **Content-heavy applications**: When apps contain complex visual elements, images, or layouts that aren't fully captured by the XML hierarchy
|
120
|
+
- **Visual verification**: For tasks requiring confirmation of visual elements or layouts
|
121
|
+
- **Enhanced context understanding**: When UI structure alone doesn't provide sufficient information for decision-making
|
122
|
+
|