Repository navigation
Expand file tree
/
Copy pathpyproject.toml
More file actions
165 lines (159 loc) · 7.6 KB
/
Copy pathpyproject.toml
File metadata and controls
165 lines (159 loc) · 7.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# `pip install AutoCua` — one wheel per OS/arch holding the AutoCua package
# and both Rust extensions prebuilt, so no Rust is needed on the user's
# machine: the web agent's (AutoCua/web), which maturin builds, and the
# Android agent's (AutoCua/android), which the release machine builds into
# place first and `include` below carries. Built with maturin:
#
# pip install maturin
# python -c "import AutoCua.android.agent" # builds AutoCua/android/agent_native.*
# maturin build --release -o dist # -> dist/autocua-*.whl
#
# note/pypi-release.md has the per-machine commands. A checkout keeps working
# exactly as before (python main.py, the setup scripts, cargo building both
# agents on first import).
[build-system]
requires = ["maturin>=1.15,<2"]
build-backend = "maturin"
[project]
name = "AutoCua"
version = "0.1.7"
description = "AutoCua: an AI agent that operates your computer, shell, browser and iPhone"
readme = "README.md"
requires-python = ">=3.10"
license = "MIT"
license-files = ["LICENSE", "THIRD_PARTY_NOTICES.md", "THIRD_PARTY_LICENSES.txt"]
authors = [{ name = "Ashish Yadav" }]
keywords = ["agent", "automation", "computer-use", "browser-agent", "llm", "ios"]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Operating System :: MacOS",
"Operating System :: Microsoft :: Windows",
"Operating System :: POSIX :: Linux",
"Programming Language :: Python :: 3",
"Programming Language :: Rust",
]
# Everything main.py needs on either platform, terminal and UI alike. The
# markers pick the OS; the floors are the versions the Windows list pinned.
dependencies = [
"requests>=2.34.2",
"python-dotenv>=1.2.4",
"Pillow>=12.3.0",
"openai>=2.17.0",
"anthropic>=0.83.0",
"groq>=1.0.0",
"google-genai>=1.64.0",
"flask>=3.1.3",
"werkzeug>=3.1.9",
"pywebview>=6.1",
"python-telegram-bot>=21.6",
"pyautogui>=0.9.54; sys_platform == 'darwin' or sys_platform == 'win32'",
# macOS computer use
"pyobjc-core>=11; sys_platform == 'darwin'",
"pyobjc-framework-Cocoa>=11; sys_platform == 'darwin'",
"pyobjc-framework-Quartz>=11; sys_platform == 'darwin'",
"pyobjc-framework-ApplicationServices>=11; sys_platform == 'darwin'",
"pyobjc-framework-Vision>=11; sys_platform == 'darwin'",
"pyobjc-framework-WebKit>=11; sys_platform == 'darwin'",
"pynput>=1.7; sys_platform == 'darwin'",
# Each run's recording is encoded with OpenCV on macOS and with
# imageio-ffmpeg on Linux and Windows: OpenCV's Linux wheels cannot write
# H.264, and its Windows wheels only at a fixed ~900 MB a minute
# (utils/run_recorder.py). imageio-ffmpeg's ffmpeg then compresses it on
# every OS (utils/video_compress.py).
"opencv-python>=4.9; sys_platform == 'darwin'",
"imageio-ffmpeg>=0.5",
# Linux computer use — OCR fusion (PP-OCRv6 via onnxruntime, see
# AutoCua/linux/tree/ocr.py); AT-SPI itself comes from the distro's
# python3-gi, which pip cannot supply (requirements_linux.txt explains).
"onnxruntime>=1.20; sys_platform == 'linux'",
# Windows computer use
"pywinauto>=0.6.9; sys_platform == 'win32'",
"pywin32>=311; sys_platform == 'win32'",
"comtypes>=1.4; sys_platform == 'win32'",
"interception-python>=1.13; sys_platform == 'win32'",
"keyboard>=0.13.5; sys_platform == 'win32'",
"psutil>=5.9; sys_platform == 'win32'",
"pyperclip>=1.8; sys_platform == 'win32'",
"numpy>=1.26; sys_platform == 'win32' or sys_platform == 'linux'",
"PySide6>=6.6; sys_platform == 'win32'",
"winrt-runtime>=3.2; sys_platform == 'win32'",
"winrt-Windows.Foundation>=3.2; sys_platform == 'win32'",
"winrt-Windows.Foundation.Collections>=3.2; sys_platform == 'win32'",
"winrt-Windows.Media.Ocr>=3.2; sys_platform == 'win32'",
"winrt-Windows.Globalization>=3.2; sys_platform == 'win32'",
"winrt-Windows.Graphics.Imaging>=3.2; sys_platform == 'win32'",
"winrt-Windows.Storage.Streams>=3.2; sys_platform == 'win32'",
]
[project.optional-dependencies]
# Paired iPhone/iPad (the simulator path needs only Xcode).
ios = ["pymobiledevice3>=10; sys_platform == 'darwin'"]
[project.urls]
Homepage = "https://github.com/AutoCua/AutoCua"
Source = "https://github.com/AutoCua/AutoCua"
[tool.maturin]
# The crate lives inside the package (AutoCua/web) and is imported as
# AutoCua.web.agent_native; python-source = "." makes ./AutoCua the package.
manifest-path = "AutoCua/web/Cargo.toml"
module-name = "AutoCua.web.agent_native"
python-source = "."
# The Android agent's extension, AutoCua/android/agent_native, the second
# crate: maturin builds one crate per wheel (manifest-path above), so each
# release machine builds this one into place before `maturin build`
# (`python -c "import AutoCua.android.agent"` — AutoCua/utils/rust.py; on Linux
# `cargo zigbuild` against the wheel's glibc floor; note/pypi-release.md), and
# it is named here because maturin's package walk honours .gitignore, where
# *.py[cod] and *.so cover it: unlisted, it never reaches the wheel. The
# crate's sources ship too (unlike the web crate's, below): a wheel that pip
# builds from the sdist on a platform without one of ours has no module in
# it, and rust.py builds it from them on the first Android run. One line per
# platform's suffix; the one that matches nothing is skipped.
include = [
{ path = "AutoCua/android/agent_native.pyd", format = "wheel" }, # Windows
{ path = "AutoCua/android/agent_native.so", format = "wheel" }, # macOS, Linux
]
exclude = [
# wheel-only: the crate sources stay in the sdist so it can build, but a
# wheel ships the compiled extension — no Cargo.toml beside it means the
# loader never tries cargo.
{ path = "AutoCua/web/**/*.rs", format = "wheel" },
{ path = "AutoCua/web/*.rs", format = "wheel" },
{ path = "AutoCua/web/Cargo.toml", format = "wheel" },
{ path = "AutoCua/web/Cargo.lock", format = "wheel" },
{ path = "AutoCua/web/build.rs", format = "wheel" },
# never shipped
"AutoCua/web/target/**",
"AutoCua/web/scratchpad/**",
"AutoCua/android/target/**",
"AutoCua/android/scratchpad/**",
# the licence-file generator (AutoCua/utils/third_party_licenses.py): a
# maintainer's tool that reads the cargo registry, not part of the app
{ path = "AutoCua/utils/third_party_licenses.py", format = "wheel" },
# rust.py's staging copy of either extension (agent_native.pyd.new),
# which only a crash leaves behind — and which .gitignore does not cover
"AutoCua/*/agent_native.*.new",
"AutoCua/mac/scratchpad/**",
"AutoCua/windows/scratchpad/**",
"AutoCua/ios/scratchpad/**",
"AutoCua/linux/scratchpad/**",
# the PP-OCRv6 models ocr_models.py downloads on the first Linux scan
"AutoCua/linux/tree/models/**",
# legacy in-package secret locations (keys now live in AutoCua_data/)
"AutoCua/api_key/**",
"AutoCua/agent_conversation/*.json",
"AutoCua/agent_conversation/chat_*/**",
"AutoCua/web/HANDOFF.md",
"AutoCua/Structure.md",
"AutoCua/**/test.py",
"AutoCua/**/old_element.py",
"AutoCua/**/__pycache__/**",
"AutoCua/ios_connector/WebDriverAgent/**",
"AutoCua/ios_connector/paired_devices.json",
# the Chromium desktop shell's npm install: Electron itself, ~300 MB and
# built per OS (a checkout runs `npm install` in AutoCua/desktop; a pip
# install fetches it into a per-user cache, AutoCua/utils/electron.py)
"AutoCua/desktop/node_modules/**",
# the UI's npm install (React, Vite, TypeScript: `npm ci` in AutoCua/ui builds
# ui/index.js, which is committed and ships; pip users need none of this)
"AutoCua/ui/node_modules/**",
]