├── ADBKeyboard ├── ADBKeyboard.apk └── readme.md ├── LICENSE ├── README.md ├── README_en.md └── Old-Version ├── deploy_drop.sh ├── deploybeta.sh └── deploy_4.5.0.sh /ADBKeyboard/ADBKeyboard.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eraycc/AutoGLM-TERMUX/HEAD/ADBKeyboard/ADBKeyboard.apk -------------------------------------------------------------------------------- /ADBKeyboard/readme.md: -------------------------------------------------------------------------------- 1 | ## ADBKeyboard For Android 7 2 | 安卓7请安装这个文件夹内的 ADB Keyboard 3 | 4 | Android 7 please install ADB Keyboard in this folder 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 eraycc.github.io 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | AutoGLM-Termux 部署工具 2 | 3 | [![版本](https://img.shields.io/badge/版本-5.0.1-brightgreen)](https://github.com/eraycc/AutoGLM-TERMUX) 4 | [![Open-AutoGLM](https://img.shields.io/badge/Open--AutoGLM-最新版-blue)](https://github.com/zai-org/Open-AutoGLM) 5 | [![Termux](https://img.shields.io/badge/Termux-支持-black)](https://termux.dev/) 6 | [![License](https://img.shields.io/badge/License-MIT-orange)](https://opensource.org/licenses/MIT) 7 | 8 | [🌐 切换到英文文档 / Switch to English Documentation](https://github.com/eraycc/AutoGLM-TERMUX/blob/main/README_en.md) 9 | 10 | 在安卓手机上通过 Termux 快速部署 Open-AutoGLM 智能体,无需ROOT或电脑等其他设备,即可实现手机自动化操作! 11 | 12 | --- 13 | 14 | 📖 项目简介 15 | 16 | AutoGLM-Termux 是一个专为 Termux 环境优化的 Open-AutoGLM 一键部署解决方案。它通过纯 ADB 方案,让你的安卓手机化身 AI 智能体,能够: 17 | - 理解自然语言指令 18 | - 自动执行手机操作(点击、滑动、输入等) 19 | - 支持 50+ 款主流中文 App 20 | - 增强 ADB 设备管理:支持多设备切换、快速连接、设备状态监控 21 | - 一键卸载功能:完整卸载项目及运行环境 22 | - 完全无线控制,无需 Root 或PC等其他设备 23 | - 全面国际化支持,支持中英文切换 24 | - 新增:**支持语音识别输入**,可通过语音控制手机 25 | 26 | > ⚠️ 合规声明:本项目仅供学习和研究使用,严禁用于任何违法活动。请遵守 [Open-AutoGLM 使用条款](https://github.com/zai-org/Open-AutoGLM/blob/main/resources/privacy_policy.txt)。 27 | 28 | --- 29 | 30 | ✨ 功能特性 31 | 32 | - 一键部署:自动化安装所有依赖和环境配置 33 | - 智能镜像:自动配置国内 pip 和 Cargo 镜像源,加速下载(支持输入 `default` 使用推荐源) 34 | - 无线 ADB:内置 ADB 无线调试配置向导,告别数据线 35 | - 语音识别:支持语音输入指令,解放双手(需要安装 Termux:API) 36 | - ADB 设备管理:可视化设备列表、切换活动设备、断开连接、快速重连 37 | - 交互式菜单:可视化启动面板,管理配置更轻松 38 | - 自动重连:支持 ADB 设备自动检测和连接 39 | - 配置持久化:环境变量自动保存,重启 Termux 无需重新配置 40 | - 多设备支持:同一局域网内,关闭VPN的情况下,可用安卓设备使用无线调试连接其他手机adb实现自动控制其他安卓手机设备,支持管理多个 ADB 设备 41 | - 一键卸载:提供基本卸载和完全卸载两种模式,干净清理不残留 42 | - 新增:多语言支持,可在中文和英文之间自由切换 43 | 44 | --- 45 | 46 | 🍭 部署演示 47 | 48 | ![1000114284](https://github.com/user-attachments/assets/d4e89a3c-8d39-41a8-a44e-bed00c74fdb0) 49 | 50 | ![1000114273](https://github.com/user-attachments/assets/3ca780ce-631c-4ae3-996a-8f3bf4eb4037) 51 | 52 | ![1000114283](https://github.com/user-attachments/assets/dd618ffc-4138-4bcf-bf0a-03562b364875) 53 | 54 | --- 55 | 56 | 📱 前置要求 57 | 58 | 1. 安卓手机(Android 11+)需支持无线调试 59 | 2. Termux 已安装([下载地址](https://github.com/termux/termux-app/releases/)) 60 | 3. 网络连接:手机和 Termux 设备需在同一 WiFi 网络下 61 | 4. API Key:需要智谱 AI 或 ModelScope 的 API Key 或 其他支持图片识别的AI模型 62 | 63 | 5. 语音识别(可选):如需语音控制功能,需安装 Termux:API 应用 64 | - 下载地址:https://github.com/termux/termux-api/releases/ 65 | - 安装后,在 设置-应用管理 内或桌面长按 Termux:API 图标,进入应用权限管理界面,授予麦克风权限 66 | 67 | > 若无法安装上述Termux:API APK,可阅读官方文档:[Termux-microphone-record](https://wiki.termux.com/wiki/Termux-microphone-record) , [Termux:API](https://wiki.termux.com/wiki/Termux:API),在[f-droid](https://f-droid.org/packages/com.termux.api/)上尝试下载可用版本 68 | 69 | 6. ADB Keyboard(必须): 70 | - 下载地址:https://github.com/senzhk/ADBKeyBoard/blob/master/ADBKeyboard.apk 71 | - 安装后,进入 设置 → 系统 → 语言和输入法 → 虚拟键盘 → 管理键盘,启用 "ADB Keyboard" 72 | - 这是必须步骤,否则无法输入中文 73 | 74 | > 若果无法安装上述ADB Keyboard,可以尝试安装此版本ADB Keyboard:https://github.com/eraycc/AutoGLM-TERMUX/blob/main/ADBKeyboard/ADBKeyboard.apk 75 | 76 | --- 77 | 78 | 🚀 快速开始(推荐) 79 | 80 | 在 Termux 中执行以下命令,一键完成部署或更新: 81 | 82 | ```bash 83 | # 1. 更新 Termux 包列表 84 | pkg upgrade -y 85 | 86 | # 2. 下载部署脚本 87 | curl -O https://raw.githubusercontent.com/eraycc/AutoGLM-TERMUX/refs/heads/main/deploy.sh 88 | 89 | # 3. 授予执行权限 90 | chmod +x deploy.sh 91 | 92 | # 4. 运行部署脚本 93 | ./deploy.sh 94 | ``` 95 | 96 | 部署完成后,输入 `autoglm` 即可启动智能控制面板。 97 | 98 | --- 99 | 100 | 📋 详细部署步骤 101 | 102 | 如果需要更详细的安装指导,请按照以下步骤操作: 103 | 104 | 步骤 1:安装 Termux 105 | 106 | 从 [GitHub Releases](https://github.com/termux/termux-app/releases/) 下载最新版 Termux APK 并安装。 107 | 108 | 步骤 2:更新 Termux 109 | 110 | 首次启动 Termux 后,执行: 111 | 112 | ```bash 113 | pkg upgrade -y 114 | ``` 115 | 116 | 步骤 3:设置 termux pkg 下载加速源 117 | 118 | 执行下面的命令打开 termux 的 pkg 加速源设置 GUI: 119 | - 选择 `Mirror group - Rotate between several mirrors (recommended)` 120 | - 点击 OK 进入,通过上下箭头切换到 `Mirrors in Chinese Mainland - All in Chinese Mainland` 121 | - 再次点击 OK,等待自动配置完成即可 122 | 123 | ```bash 124 | termux-change-repo 125 | ``` 126 | 127 | 步骤 4:运行部署脚本 128 | 129 | ```bash 130 | curl -O https://raw.githubusercontent.com/eraycc/AutoGLM-TERMUX/refs/heads/main/deploy.sh 131 | chmod +x deploy.sh 132 | ./deploy.sh 133 | ``` 134 | 135 | 步骤 5:脚本执行流程 136 | 137 | 脚本将自动完成以下操作: 138 | 139 | 1. 语言选择:首次运行时会提示选择中文或英文界面 140 | 2. 安装依赖:Python、pip、Git、Rust、ADB(支持自动检测多种包管理器) 141 | 3. 配置镜像源:可选配置国内 pip/Cargo 镜像加速(输入 `default` 使用推荐源) 142 | 4. 安装 Python 包:maturin、openai、requests、Pillow(Termux 环境通过 pkg 安装 Pillow) 143 | 5. 克隆项目:从 GitHub 拉取 Open-AutoGLM 最新代码 144 | 6. 语音识别配置:可选择是否启用语音控制功能 145 | 7. 交互式配置:设置 API Key、模型参数等(新增设备 ID 配置) 146 | 8. ADB Keyboard 提醒:提示安装必需的输入法工具(必须步骤) 147 | 9. ADB 无线配置:引导完成手机无线调试连接(支持自动检测已连接设备) 148 | 10. 创建启动器:生成 `autoglm` 快捷命令并自动加入 PATH 149 | 150 | --- 151 | 152 | 🎮 使用方法 153 | 154 | 启动控制面板 155 | 156 | ```bash 157 | autoglm 158 | ``` 159 | 160 | 主菜单功能 161 | 162 | ``` 163 | 1. 🚀 使用当前配置启动 # 直接运行 AutoGLM(自动检测设备) 164 | 2. 🎤 使用语音识别启动 # 语音输入指令控制手机(需启用语音功能) 165 | 3. 📱 ADB 设备管理 # 进入增强的设备管理子菜单 166 | 4. ⚙️ 修改 AI 配置 # 修改 API Key、模型等 167 | 5. 🎙️ 修改语音识别配置 # 修改语音识别参数 168 | 6. 📋 查看支持的应用列表 # 显示支持的 50+ 款 App 169 | 7. 🔍 查看详细配置 # 显示当前所有配置信息 170 | 8. 🌐 切换语言 / Switch Language # 中英文界面切换 171 | 9. 🗑️ 一键卸载 # 进入卸载菜单 172 | 0. ❌ 退出 # 退出程序 173 | ``` 174 | 175 | ADB 设备管理子菜单 176 | 177 | ``` 178 | 1. 📱 配对新设备(配对+连接) 179 | 2. ⚡ 快速连接(已配对过) 180 | 3. 📋 查看设备详细列表 181 | 4. 🔄 切换活动设备 182 | 5. 🔌 断开设备连接 183 | 6. ❓ ADB Keyboard 安装说明 184 | 0. ↩️ 返回主菜单 185 | ``` 186 | 187 | 命令行参数 188 | 189 | ```bash 190 | # 直接启动交互模式(绕过菜单) 191 | autoglm --start 或 autoglm -s 192 | 193 | # 单次任务模式 194 | autoglm --start "任务描述" 或 autoglm -s "任务描述" 195 | 196 | # ADB 设备管理(进入子菜单) 197 | autoglm --setup-adb 198 | 199 | # 快速查看设备列表 200 | autoglm --devices 201 | 202 | # 切换活动设备 203 | autoglm --switch-device 204 | 205 | # 断开设备连接 206 | autoglm --disconnect 207 | 208 | # 修改配置 209 | autoglm --reconfig 210 | 211 | # 查看支持的应用 212 | autoglm --list-apps 213 | 214 | # 一键卸载(进入卸载菜单) 215 | autoglm --uninstall 216 | 217 | # 切换语言 218 | autoglm --lang cn # 切换到中文 219 | autoglm --lang en # 切换到英文 220 | 221 | # 语音识别模式(需启用语音功能) 222 | autoglm --voice 223 | 224 | # 手动指定参数启动 225 | autoglm --base-url URL --model MODEL --apikey KEY --device-id ID "你的指令" 226 | 227 | # 显示帮助 228 | autoglm --help 229 | ``` 230 | 231 | 使用示例 232 | 233 | ```bash 234 | # 示例 1:打开美团搜索火锅 235 | autoglm 236 | # 然后在交互界面输入:打开美团搜索附近的火锅店 237 | 238 | # 示例 2:语音控制(需启用语音功能) 239 | autoglm --voice 240 | # 按提示说出指令:"打开微信发送消息给张三" 241 | 242 | # 示例 3:直接执行指令 243 | autoglm --base-url https://open.bigmodel.cn/api/paas/v4 \ 244 | --model autoglm-phone \ 245 | --apikey sk-xxxxx \ 246 | "打开微信发送消息给文件传输助手:Hello World" 247 | 248 | # 示例 4:多设备环境下切换到指定设备 249 | autoglm --switch-device 250 | # 或命令行直接指定 251 | autoglm --device-id 192.168.1.100:5555 "打开B站" 252 | 253 | # 示例 5:快速查看所有设备状态 254 | autoglm --devices 255 | 256 | # 示例 6:切换语言到英文 257 | autoglm --lang en 258 | ``` 259 | 260 | --- 261 | 262 | 🎯 进阶玩法:自定义扩展应用支持 263 | 264 | 除了内置的50+款主流应用外,你还可以通过修改配置文件,让AutoGLM支持一键打开更多应用。 265 | 266 | 准备工作 267 | 268 | 1. 下载并安装MT管理器 269 | 下载链接:https://mt2.cn/download/ 270 | 271 | 配置步骤 272 | 273 | 步骤1:授予MT管理器Termux文件访问权限 274 | 1. 打开MT管理器,展开侧边栏 275 | 2. 点击顶部"三个点"更多按钮,选择"添加本地存储" 276 | 3. 在新界面中再次点击左上角"三个点",打开侧边栏 277 | 4. 找到并选择"Termux"(显示可用空间:xx GB) 278 | 5. 点击"使用此文件夹"授权 279 | 280 | 步骤2:修改应用配置文件 281 | 1. 返回MT管理器首页,在侧边栏中找到"Termux Home" 282 | 2. 进入目录:`Open-AutoGLM/phone_agent/config/` 283 | 3. 打开`apps.py`文件 284 | 4. 定位到`APP_PACKAGES`配置字典 285 | 5. 在字典末尾添加你的自定义应用,格式:`"应用名称": "应用包名"` 286 | 287 | 示例配置 288 | 在`APP_PACKAGES`字典末尾添加: 289 | 290 | ```python 291 | # 自定义应用 292 | "via": "mark.via", 293 | "浏览器": "mark.via", 294 | "via浏览器": "mark.via", 295 | "米游社": "com.mihoyo.hyperion", 296 | "fclash": "com.follow.clash", 297 | "clash": "com.github.metacubex.clash.meta", 298 | "云原神": "com.miHoYo.cloudgames.ys", 299 | "firefox": "org.mozilla.firefox", 300 | "telegram": "org.telegram.messenger.web", 301 | "kimi": "com.moonshot.kimichat", 302 | "酷狗概念版": "com.kugou.android.lite", 303 | "mt管理器": "bin.mt.plus", 304 | "youtube": "com.google.android.youtube", 305 | # 继续添加更多... 306 | ``` 307 | 308 | 注意事项 309 | - 应用包名可通过应用商店链接或第三方工具查询(MT管理器-侧边栏-工具-安装包提取,亦可查看) 310 | - 确保包名准确无误,否则无法打开应用 311 | - 修改前建议备份原始文件 312 | - 部分应用可能需要额外配置才能完全自动化 313 | 314 | --- 315 | 316 | ⚙️ 配置说明 317 | 318 | 环境变量 319 | 部署完成后,配置保存在 `~/.autoglm/config.sh`,包含: 320 | 321 | 变量名 说明 默认值 322 | `PHONE_AGENT_BASE_URL` API 基础地址 `https://open.bigmodel.cn/api/paas/v4` 323 | `PHONE_AGENT_MODEL` 模型名称 `autoglm-phone` 324 | `PHONE_AGENT_API_KEY` 你的 API Key `sk-your-apikey` 325 | `PHONE_AGENT_MAX_STEPS` 最大执行步数 `100` 326 | `PHONE_AGENT_DEVICE_ID` ADB 设备 ID(新增) 自动检测(留空) 327 | `PHONE_AGENT_LANG` 语言 `cn` 328 | `VOICE_ENABLED` 语音识别开关 `false` 329 | `VOICE_API_BASE_URL` 语音识别 API 地址 https://api.siliconflow.cn/v1 330 | `VOICE_API_MODEL` 语音识别模型 FunAudioLLM/SenseVoiceSmall 331 | `VOICE_API_KEY` 语音识别 API Key sk-your-key 332 | `VOICE_MAX_DURATION` 最长录音时间 60 333 | 334 | 新增说明: 335 | - `PHONE_AGENT_DEVICE_ID`: 在多设备环境下指定要控制的设备,格式为 IP:端口 或设备序列号。留空时自动检测唯一在线设备。 336 | - `VOICE_ENABLED`: 是否启用语音识别功能 337 | - `VOICE_API_BASE_URL`: 语音识别服务的基础地址 338 | - `VOICE_API_MODEL`: 使用的语音识别模型 339 | - `VOICE_MAX_DURATION`: 单次录音的最长时间(秒) 340 | 341 | 支持的模型服务(AI模型需要图像识别能力) 342 | 343 | 1. 智谱 BigModel(推荐,目前官方autoglm-phone模型[暂时免费](https://docs.bigmodel.cn/cn/guide/models/vlm/autoglm-phone)) 344 | - Base URL: `https://open.bigmodel.cn/api/paas/v4` 345 | - 模型: `autoglm-phone` 346 | - 注册地址: [BigModel AFF 邀请](https://www.bigmodel.cn/claude-code?ic=COJZ8EMHXZ) 347 | - 密钥申请:[智谱 apikeys](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) 348 | 349 | 2. ModelScope 魔搭社区 350 | - Base URL: `https://api-inference.modelscope.cn/v1` 351 | - 模型: `ZhipuAI/AutoGLM-Phone-9B` 352 | - 申请地址: [ModelScope 平台](https://modelscope.cn/) 353 | 354 | 3. 其他自定义 AI API 接入 AutoGLM 355 | - 支持 OpenAI 兼容格式的 API 接口 356 | - 需确保模型具备图像理解能力 357 | 358 | 4. 语音识别服务(可选) 359 | - 需要提供:openai 兼容格式的 AI 语音识别 API 360 | - 推荐平台:[硅基流动 AFF 邀请](https://cloud.siliconflow.cn/i/eQGNraUT),注册即送 2000 万 Tokens 361 | - Base URL: `https://api.siliconflow.cn/v1` 362 | - 推荐模型:`FunAudioLLM/SenseVoiceSmall`(当前该模型免费)[siliconflow模型价格表](https://siliconflow.cn/pricing) 363 | - 密钥申请:[SiliconFlow apikey](https://cloud.siliconflow.cn/me/account/ak) 364 | 365 | > 语音识别也可以使用智谱 BigModel 提供的glm-asr-2512模型,详情可查看[官方文档](https://docs.bigmodel.cn/cn/guide/models/sound-and-video/glm-asr-2512) 366 | 367 | --- 368 | 369 | 📦 项目结构 370 | 371 | ``` 372 | ~/ 373 | ├── Open-AutoGLM/ # 项目代码 374 | ├── .autoglm/ 375 | │ └── config.sh # 配置文件 376 | ├── bin/ 377 | │ └── autoglm # 启动脚本(自动加入 PATH) 378 | └── .cargo/ 379 | └── config.toml # Cargo 镜像配置 380 | ``` 381 | 382 | --- 383 | 384 | 🔍 支持的应用列表 385 | 386 | 运行 `autoglm --list-apps` 查看完整列表,主要包括: 387 | 388 | - 社交通讯:微信、QQ、微博 389 | - 电商购物:淘宝、京东、拼多多 390 | - 美食外卖:美团、饿了么、肯德基 391 | - 出行旅游:携程、12306、滴滴出行 392 | - 视频娱乐:B站、抖音、爱奇艺 393 | - 音乐音频:网易云音乐、QQ音乐、喜马拉雅 394 | - 生活服务:大众点评、高德地图、百度地图 395 | - 内容社区:小红书、知乎、豆瓣 396 | 397 | --- 398 | 399 | 🗑️ 卸载指南 400 | 401 | 新增功能:项目提供两种卸载方式,可安全清理安装内容 402 | 403 | 基本卸载(推荐) 404 | 卸载 Open-AutoGLM + autoglm 控制面板 405 | - 可选择性删除:pip依赖、项目目录、命令和配置 406 | - 保留运行环境,不影响其他程序 407 | 408 | 完全卸载(谨慎使用) 409 | 除基本卸载内容外,还可选择卸载: 410 | - 核心 pip 包(maturin、openai、requests、Pillow) 411 | - pip/Cargo 镜像配置 412 | - Termux 系统包(python-pillow、rust、android-tools) 413 | - ⚠️ 警告:可能影响依赖这些包的其他程序 414 | 415 | 执行方式: 416 | 417 | ```bash 418 | autoglm --uninstall 419 | ``` 420 | 421 | 进入交互式卸载菜单,按需选择即可。 422 | 423 | --- 424 | 425 | ⚠️ 常见问题与故障排除 426 | 427 | 1. `adb devices` 不显示设备或显示未授权 428 | - 检查 USB 调试:开发者选项中必须开启 USB 调试 和 无线调试 429 | - 检查网络:确保手机和 Termux 在同一 WiFi 网络 430 | - 授权弹窗:手机上点击 "允许 USB 调试" 431 | - 重新配对:删除旧配对,重新执行 `adb pair` 432 | - 重启 ADB:执行 `adb kill-server && adb start-server` 433 | 434 | 2. 能打开应用但无法点击或输入 435 | - 开启安全调试:部分手机需要开启 "USB 调试(安全设置)" 436 | - 必须安装 ADB Keyboard:设置 → 语言和输入法 → 启用 ADB Keyboard 437 | - 切换输入法:运行时需切换到 ADB Keyboard(Agent 会自动切换) 438 | 439 | 3. 截图黑屏 440 | - 敏感页面:支付、银行等应用会黑屏,正常现象 441 | - 权限限制:部分应用禁止截图,Agent 会请求人工接管 442 | 443 | 4. 模型连接失败 444 | - 检查 API Key:确认 Key 有效且未过期 445 | - 网络问题:确保 Termux 能访问外部网络 446 | - Base URL:确认 URL 格式正确,结尾有 `/v1` 447 | 448 | 5. 多设备环境下无法选择设备 449 | - 使用 `autoglm --devices` 查看所有设备 450 | - 使用 `autoglm --switch-device` 切换活动设备 451 | - 或在配置中指定 `PHONE_AGENT_DEVICE_ID="IP:端口"` 452 | 453 | 6. 环境变量未生效 454 | 455 | ```bash 456 | # 手动加载配置 457 | source ~/.bashrc 458 | # 或 459 | source ~/.autoglm/config.sh 460 | ``` 461 | 462 | 7. 卸载后 autoglm 命令仍可用 463 | - 重新打开终端窗口 464 | - 或手动执行 `source ~/.bashrc` 重载配置 465 | - 或手动执行 `hash -r` 刷新命令缓存 466 | 467 | 8. 更新失败 468 | 469 | ```bash 470 | # 手动删除旧目录后重试 471 | rm -rf ~/Open-AutoGLM 472 | ./deploy.sh 473 | ``` 474 | 475 | 9. 语言切换问题 476 | - 使用 `autoglm --lang cn` 或 `autoglm --lang en` 切换语言 477 | - 或在主菜单中选择"切换语言"选项 478 | 479 | 10. 语音识别功能无法使用 480 | - 确保在部署时启用了语音识别功能 481 | - 检查是否已安装 Termux:API 应用并授予麦克风权限 482 | - 确认语音识别 API 配置正确 483 | - 检查网络连接是否正常 484 | 485 | 11. 已经安装了ADB Keyboard,但启动时ADB Keyboard报错 486 | - 确保ADB Keyboard已经安装并启用 487 | - 如果ADB无线调试配对了多台设备,在切换到其他设备启动时ADB Keyboard报错,可以尝试重启termux并重新连接,或进入ADB管理菜单内断开全部连接,并重启ADB,重新连接后再次启动AutoGLM 488 | 489 | --- 490 | 491 | 🔄 更新日志 492 | 493 | v5.0.1 (当前版本) 494 | - 新增:全面支持语音识别功能,可通过语音控制手机 495 | - 新增:语音识别配置向导,支持多种语音识别服务 496 | - 修复:语音识别和快速启动问题 497 | - 优化:交互式菜单,支持动态显示语音功能选项 498 | 499 | v4.6.0 500 | - 新增:全面国际化支持,支持中英文界面切换 501 | - 新增:语言选择向导,部署时即可选择语言 502 | 503 | v4.5.0 504 | - 增强 ADB 设备管理:支持设备列表查看、切换、断开、快速连接 505 | - 新增一键卸载功能:提供基本卸载和完全卸载两种模式 506 | - 改进多设备支持:可指定设备 ID,自动检测在线设备 507 | - 优化交互体验:设备状态显示更清晰(在线/离线/未授权) 508 | - 修复算术错误:修正设备计数问题 509 | - 扩展命令行参数:新增 `--devices`, `--switch-device`, `--disconnect`, `--uninstall` 510 | - 增强兼容性:支持多种包管理器(apt、yum、pacman、brew) 511 | 512 | v4.3.0 513 | - 新增交互式启动面板 `autoglm` 命令 514 | - 支持无线 ADB 配对和连接向导 515 | - 自动配置 pip 和 Cargo 国内镜像 516 | - 支持多设备管理 517 | 518 | v4.2.0 519 | - 优化 Termux 兼容性 520 | - 增加 ADB Keyboard 安装提醒 521 | - 支持配置持久化 522 | 523 | --- 524 | 525 | 🤝 贡献指南 526 | 527 | 欢迎提交 Issue 和 Pull Request! 528 | 529 | 1. Fork 本仓库 530 | 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 531 | 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 532 | 4. 推送到分支 (`git push origin feature/AmazingFeature`) 533 | 5. 开启 Pull Request 534 | 535 | --- 536 | 537 | 📄 许可证 538 | 539 | 本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。 540 | 541 | --- 542 | 543 | 🔗 相关链接 544 | 545 | - Open-AutoGLM 官方项目: https://github.com/zai-org/Open-AutoGLM 546 | - Termux 官网: https://termux.dev/ 547 | - AutoGLM 论文: https://arxiv.org/abs/2411.00820 548 | - 智谱 AI: https://www.zhipuai.cn/ 549 | - ModelScope: https://modelscope.cn/ 550 | - SiliconFlow(语音识别): https://siliconflow.cn/ 551 | 552 | --- 553 | 554 | 🙏 致谢 555 | 556 | - [Open-AutoGLM](https://github.com/zai-org/Open-AutoGLM) - 核心框架 557 | - [ADBKeyBoard](https://github.com/senzhk/ADBKeyBoard) - 输入解决方案 558 | - [Termux](https://termux.dev/) - 强大的终端模拟器 559 | - [Termux:API](https://github.com/termux/termux-api) - 语音识别支持 560 | 561 | --- 562 | 563 | 💬 社区支持 564 | 565 | 遇到问题?需要帮助? 566 | 567 | - 提交 [Issue](https://github.com/eraycc/AutoGLM-TERMUX/issues) 568 | - 查看 [Open-AutoGLM 文档](https://github.com/zai-org/Open-AutoGLM/blob/main/README.md) 569 | - 加入 Open-AutoGLM 微信社区(见官方项目 README) 570 | 571 | --- 572 | 573 | ⭐ 如果这个项目对你有帮助,请点个 Star 支持一下! 574 | 575 | --- 576 | 577 | 📢 免责声明 578 | 579 | 本项目仅为 Open-AutoGLM 的自动化部署工具,所有核心功能由 Open-AutoGLM 提供。请确保遵守当地法律法规,合法使用本工具。开发者不对任何滥用行为承担责任。 580 | -------------------------------------------------------------------------------- /README_en.md: -------------------------------------------------------------------------------- 1 | AutoGLM-Termux Deployment Tool 2 | 3 | [![Version](https://img.shields.io/badge/Version-5.0.1-brightgreen)](https://github.com/eraycc/AutoGLM-TERMUX) 4 | [![Open-AutoGLM](https://img.shields.io/badge/Open--AutoGLM-Latest_Release-blue)](https://github.com/zai-org/Open-AutoGLM) 5 | [![Termux](https://img.shields.io/badge/Termux-Supported-black)](https://termux.dev/) 6 | [![License](https://img.shields.io/badge/License-MIT-orange)](https://opensource.org/licenses/MIT) 7 | 8 | [🌐 Switch to Chinese document / 切换到中文文档](https://github.com/eraycc/AutoGLM-TERMUX/blob/main/README.md) 9 | 10 | Quickly deploy the Open-AutoGLM agent on your Android phone via Termux. Achieve mobile automation without needing ROOT, a PC, or any other device! 11 | 12 | --- 13 | 14 | 📖 Project Introduction 15 | 16 | AutoGLM-Termux is a one-click deployment solution for Open-AutoGLM optimized for the Termux environment. Using a pure ADB approach, it transforms your Android phone into an AI agent capable of: 17 | - Understanding natural language instructions 18 | - Automatically performing phone operations (tap, swipe, input, etc.) 19 | - Supporting 50+ popular Chinese apps 20 | - Enhanced ADB device management: Supports multi-device switching, quick connection, device status monitoring 21 | - One-click uninstall: Completely removes the project and its runtime environment 22 | - Fully wireless control, no Root, PC, or other devices required 23 | - Comprehensive internationalization support, switching between Chinese and English 24 | - **New:** **Supports voice recognition input**, allowing phone control via voice 25 | 26 | > ⚠️ Compliance Statement: This project is for learning and research purposes only. Any illegal use is strictly prohibited. Please comply with the [Open-AutoGLM Terms of Use](https://github.com/zai-org/Open-AutoGLM/blob/main/resources/privacy_policy.txt). 27 | 28 | --- 29 | 30 | ✨ Features 31 | 32 | - **One-click Deployment:** Automatically installs all dependencies and environment configurations. 33 | - **Smart Mirrors:** Automatically configures pip and Cargo mirrors for faster downloads in China (supports entering `default` to use recommended sources). **Note:** For users outside China, it's recommended to use default or region-specific mirror sources for optimal speed. 34 | - **Wireless ADB:** Built-in ADB wireless debugging setup wizard, say goodbye to cables. 35 | - **Voice Recognition:** Supports voice input commands, freeing your hands (requires Termux:API installation). 36 | - **ADB Device Management:** Visual device list, switch active device, disconnect, quick reconnect. 37 | - **Interactive Menu:** Visual launch panel for easier configuration management. 38 | - **Auto-reconnect:** Supports automatic ADB device detection and connection. 39 | - **Persistent Configuration:** Environment variables are automatically saved; no need to reconfigure after restarting Termux. 40 | - **Multi-device Support:** In the same LAN (with VPN off), an Android device can use wireless debugging to connect to and automatically control other Android phone devices via ADB. Supports managing multiple ADB devices. 41 | - **One-click Uninstall:** Offers both basic and complete uninstall modes for clean removal without leftovers. 42 | - **New:** Multi-language support, freely switch between Chinese and English. 43 | 44 | --- 45 | 46 | 🍭 Deployment Demo 47 | 48 | ![1000114284](https://github.com/user-attachments/assets/d4e89a3c-8d39-41a8-a44e-bed00c74fdb0) 49 | 50 | ![1000114273](https://github.com/user-attachments/assets/3ca780ce-631c-4ae3-996a-8f3bf4eb4037) 51 | 52 | ![1000114283](https://github.com/user-attachments/assets/dd618ffc-4138-4bcf-bf0a-03562b364875) 53 | 54 | --- 55 | 56 | 📱 Prerequisites 57 | 58 | 1. An Android phone (Android 7.0+) 59 | 2. Termux installed ([Download Link](https://github.com/termux/termux-app/releases/)) 60 | 3. Network Connection: Phone and Termux device must be on the same WiFi network. 61 | 4. API Key: Requires an API key from Zhipu AI, ModelScope, or another AI model that supports image recognition. 62 | 63 | 5. **Voice Recognition (Optional):** For voice control, install the Termux:API app. 64 | - Download: https://github.com/termux/termux-api/releases/ 65 | - After installation, go to **Settings > Apps (App Management)** or long-press the Termux:API icon on the desktop, enter the app permission management interface, and grant **Microphone** permission. 66 | > For older Android versions or if the above Termux:API APK cannot be installed, refer to official docs: [Termux-microphone-record](https://wiki.termux.com/wiki/Termux-microphone-record), [Termux:API](https://wiki.termux.com/wiki/Termux:API), or try downloading a compatible version from [f-droid](https://f-droid.org/packages/com.termux.api/). 67 | 68 | 6. **ADB Keyboard (Mandatory):** 69 | - Download: https://github.com/senzhk/ADBKeyBoard/blob/master/ADBKeyboard.apk 70 | - After installation, go to **Settings → System → Languages & input → Virtual keyboard → Manage keyboards**, and enable **"ADB Keyboard"**. 71 | - **This step is mandatory, otherwise Chinese input will not work.** 72 | > For older Android systems like Android 7 and below, if the above ADB Keyboard cannot be installed, try this version: https://github.com/eraycc/AutoGLM-TERMUX/blob/main/ADBKeyboard/ADBKeyboard.apk 73 | 74 | --- 75 | 76 | 🚀 Quick Start (Recommended) 77 | 78 | Execute the following commands in Termux to complete deployment or update with one click: 79 | 80 | ```bash 81 | # 1. Update Termux package lists 82 | pkg upgrade -y 83 | 84 | # 2. Download the deployment script 85 | curl -O https://raw.githubusercontent.com/eraycc/AutoGLM-TERMUX/refs/heads/main/deploy.sh 86 | 87 | # 3. Grant execution permission 88 | chmod +x deploy.sh 89 | 90 | # 4. Run the deployment script 91 | ./deploy.sh 92 | ``` 93 | 94 | After deployment is complete, enter `autoglm` to launch the intelligent control panel. 95 | 96 | --- 97 | 98 | 📋 Detailed Deployment Steps 99 | 100 | If you need more detailed installation guidance, follow these steps: 101 | 102 | **Step 1: Install Termux** 103 | 104 | Download the latest Termux APK from [GitHub Releases](https://github.com/termux/termux-app/releases/) and install it. 105 | 106 | **Step 2: Update Termux** 107 | 108 | After launching Termux for the first time, execute: 109 | 110 | ```bash 111 | pkg upgrade -y 112 | ``` 113 | 114 | **Step 3: Set up Termux pkg download mirror source** 115 | 116 | Execute the command below to open the Termux pkg mirror source configuration GUI: 117 | - Select `Mirror group - Rotate between several mirrors (recommended)` 118 | - Click OK to enter, use the up/down arrow keys to select `Mirrors in Chinese Mainland - All in Chinese Mainland` 119 | - Click OK again, and wait for the automatic configuration to complete. 120 | 121 | ```bash 122 | termux-change-repo 123 | ``` 124 | > **Note for international users:** If you are not in China, you may skip this step or choose a mirror group closer to your region for better download speeds. Using Chinese mainland mirrors might be slower outside China. 125 | 126 | **Step 4: Run the deployment script** 127 | 128 | ```bash 129 | curl -O https://raw.githubusercontent.com/eraycc/AutoGLM-TERMUX/refs/heads/main/deploy.sh 130 | chmod +x deploy.sh 131 | ./deploy.sh 132 | ``` 133 | 134 | **Step 5: Script Execution Flow** 135 | 136 | The script will automatically perform the following: 137 | 138 | 1. **Language Selection:** Prompts to choose between Chinese or English interface on first run. 139 | 2. **Install Dependencies:** Python, pip, Git, Rust, ADB (automatically detects multiple package managers). 140 | 3. **Configure Mirror Sources:** Optionally configures pip/Cargo mirrors for faster downloads in China (enter `default` to use recommended sources). **Users elsewhere should use default or their regional sources.** 141 | 4. **Install Python Packages:** maturin, openai, requests, Pillow (Pillow is installed via pkg in Termux environment). 142 | 5. **Clone Project:** Pulls the latest Open-AutoGLM code from GitHub. 143 | 6. **Voice Recognition Setup:** Option to enable voice control functionality. 144 | 7. **Interactive Configuration:** Set API Key, model parameters, etc. (new device ID configuration). 145 | 8. **ADB Keyboard Reminder:** Prompts to install the required input method tool (mandatory step). 146 | 9. **ADB Wireless Configuration:** Guides you through setting up phone wireless debugging connection (supports auto-detection of connected devices). 147 | 10. **Create Launcher:** Generates the `autoglm` shortcut command and automatically adds it to PATH. 148 | 149 | --- 150 | 151 | 🎮 Usage 152 | 153 | **Launch Control Panel** 154 | 155 | ```bash 156 | autoglm 157 | ``` 158 | 159 | **Main Menu Functions** 160 | 161 | ``` 162 | 1. 🚀 Start with current config # Directly run AutoGLM (auto-detects device) 163 | 2. 🎤 Start with voice recognition # Control phone via voice input (requires voice feature enabled) 164 | 3. 📱 ADB Device Management # Enter enhanced device management submenu 165 | 4. ⚙️ Modify AI config # Modify API Key, model, etc. 166 | 5. 🎙️ Modify voice recognition config # Modify voice recognition parameters 167 | 6. 📋 View supported apps list # Display list of 50+ supported apps 168 | 7. 🔍 View detailed config # Display all current configuration info 169 | 8. 🌐 Switch Language / 切换语言 # Switch between Chinese and English interface 170 | 9. 🗑️ One-click uninstall # Enter uninstall menu 171 | 0. ❌ Exit # Exit the program 172 | ``` 173 | 174 | **ADB Device Management Submenu** 175 | 176 | ``` 177 | 1. 📱 Pair new device (Pair + Connect) 178 | 2. ⚡ Quick Connect (Already paired) 179 | 3. 📋 View detailed device list 180 | 4. 🔄 Switch active device 181 | 5. 🔌 Disconnect device 182 | 6. ❓ ADB Keyboard installation guide 183 | 0. ↩️ Return to main menu 184 | ``` 185 | 186 | **Command-line Arguments** 187 | 188 | ```bash 189 | # Directly start interactive mode (bypass menu) 190 | autoglm --start or autoglm -s 191 | 192 | # Single task mode 193 | autoglm --start "Task description" or autoglm -s "Task description" 194 | 195 | # ADB Device Management (enter submenu) 196 | autoglm --setup-adb 197 | 198 | # Quickly view device list 199 | autoglm --devices 200 | 201 | # Switch active device 202 | autoglm --switch-device 203 | 204 | # Disconnect device 205 | autoglm --disconnect 206 | 207 | # Modify configuration 208 | autoglm --reconfig 209 | 210 | # View supported apps 211 | autoglm --list-apps 212 | 213 | # One-click uninstall (enter uninstall menu) 214 | autoglm --uninstall 215 | 216 | # Switch language 217 | autoglm --lang cn # Switch to Chinese 218 | autoglm --lang en # Switch to English 219 | 220 | # Voice recognition mode (requires voice feature enabled) 221 | autoglm --voice 222 | 223 | # Manually specify parameters to start 224 | autoglm --base-url URL --model MODEL --apikey KEY --device-id ID "Your instruction" 225 | 226 | # Show help 227 | autoglm --help 228 | ``` 229 | 230 | **Usage Examples** 231 | 232 | ```bash 233 | # Example 1: Open Meituan and search for hotpot 234 | autoglm 235 | # Then enter in the interactive interface: "Open Meituan and search for nearby hotpot restaurants" 236 | 237 | # Example 2: Voice control (requires voice feature enabled) 238 | autoglm --voice 239 | # Follow prompts and say command: "Open WeChat and send a message to Zhang San" 240 | 241 | # Example 3: Directly execute instruction 242 | autoglm --base-url https://open.bigmodel.cn/api/paas/v4 \ 243 | --model autoglm-phone \ 244 | --apikey sk-xxxxx \ 245 | "Open WeChat and send message to File Transfer Assistant: Hello World" 246 | 247 | # Example 4: Switch to a specific device in multi-device environment 248 | autoglm --switch-device 249 | # Or specify directly via command line 250 | autoglm --device-id 192.168.1.100:5555 "Open Bilibili" 251 | 252 | # Example 5: Quickly view status of all devices 253 | autoglm --devices 254 | 255 | # Example 6: Switch language to English 256 | autoglm --lang en 257 | ``` 258 | 259 | --- 260 | 261 | 🎯 Advanced: Customizing & Extending App Support 262 | 263 | Besides the built-in 50+ popular apps, you can modify the configuration file to make AutoGLM support one-click launching of more apps. 264 | 265 | **Preparation** 266 | 267 | 1. Download and install MT Manager (a file manager for Android) 268 | Download link: https://mt2.cn/download/ 269 | 270 | **Configuration Steps** 271 | 272 | **Step 1: Grant MT Manager access to Termux files** 273 | 1. Open MT Manager, expand the sidebar. 274 | 2. Click the "three dots" menu button at the top, select "Add local storage". 275 | 3. In the new interface, click the top-left "three dots" again to open the sidebar. 276 | 4. Find and select "Termux" (shows available space: xx GB). 277 | 5. Click "Use this folder" to authorize. 278 | 279 | **Step 2: Modify the app configuration file** 280 | 1. Return to MT Manager homepage, find "Termux Home" in the sidebar. 281 | 2. Navigate to directory: `Open-AutoGLM/phone_agent/config/` 282 | 3. Open the `apps.py` file. 283 | 4. Locate the `APP_PACKAGES` configuration dictionary. 284 | 5. Add your custom apps at the end of the dictionary, format: `"App Name": "App Package Name"` 285 | 286 | **Example Configuration** 287 | Add at the end of the `APP_PACKAGES` dictionary: 288 | 289 | ```python 290 | # Custom Apps 291 | "via": "mark.via", 292 | "浏览器": "mark.via", # "Browser" 293 | "via浏览器": "mark.via", # "via Browser" 294 | "米游社": "com.mihoyo.hyperion", 295 | "fclash": "com.follow.clash", 296 | "clash": "com.github.metacubex.clash.meta", 297 | "云原神": "com.miHoYo.cloudgames.ys", 298 | "firefox": "org.mozilla.firefox", 299 | "telegram": "org.telegram.messenger.web", 300 | "kimi": "com.moonshot.kimichat", 301 | "酷狗概念版": "com.kugou.android.lite", 302 | "mt管理器": "bin.mt.plus", 303 | "youtube": "com.google.android.youtube", 304 | # Add more... 305 | ``` 306 | 307 | **Notes** 308 | - App package names can be queried via app store links or third-party tools (MT Manager sidebar -> Tools -> Extract APK can also show it). 309 | - Ensure the package name is accurate, otherwise the app cannot be opened. 310 | - It's recommended to back up the original file before modifying. 311 | - Some apps may require additional configuration for full automation. 312 | 313 | --- 314 | 315 | ⚙️ Configuration 316 | 317 | **Environment Variables** 318 | After deployment, configurations are saved in `~/.autoglm/config.sh`, including: 319 | 320 | Variable Name | Description | Default Value 321 | :--- | :--- | :--- 322 | `PHONE_AGENT_BASE_URL` | API Base URL | `https://open.bigmodel.cn/api/paas/v4` 323 | `PHONE_AGENT_MODEL` | Model Name | `autoglm-phone` 324 | `PHONE_AGENT_API_KEY` | Your API Key | `sk-your-apikey` 325 | `PHONE_AGENT_MAX_STEPS` | Max Execution Steps | `100` 326 | `PHONE_AGENT_DEVICE_ID` | ADB Device ID (New) | Auto-detected (leave empty) 327 | `PHONE_AGENT_LANG` | Language | `cn` 328 | `VOICE_ENABLED` | Voice Recognition Switch | `false` 329 | `VOICE_API_BASE_URL` | Voice Recognition API Base URL | https://api.siliconflow.cn/v1 330 | `VOICE_API_MODEL` | Voice Recognition Model | FunAudioLLM/SenseVoiceSmall 331 | `VOICE_API_KEY` | Voice Recognition API Key | sk-your-key 332 | `VOICE_MAX_DURATION` | Maximum Recording Duration (seconds) | 60 333 | 334 | **New Variables Explained:** 335 | - `PHONE_AGENT_DEVICE_ID`: Specifies the device to control in multi-device environments. Format: IP:Port or device serial number. If left empty, the only online device is auto-detected. 336 | - `VOICE_ENABLED`: Whether voice recognition is enabled. 337 | - `VOICE_API_BASE_URL`: Base URL for the voice recognition service. 338 | - `VOICE_API_MODEL`: Voice recognition model to use. 339 | - `VOICE_MAX_DURATION`: Maximum recording time per session (seconds). 340 | 341 | **Supported Model Services (AI model needs image recognition capability)** 342 | 343 | 1. **Zhipu BigModel** (Recommended, currently the official autoglm-phone model is [temporarily free](https://docs.bigmodel.cn/cn/guide/models/vlm/autoglm-phone)) 344 | - Base URL: `https://open.bigmodel.cn/api/paas/v4` 345 | - Model: `autoglm-phone` 346 | - Registration: [BigModel AFF Invite](https://www.bigmodel.cn/claude-code?ic=COJZ8EMHXZ) 347 | - API Key Application: [Zhipu apikeys](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) 348 | 349 | 2. **ModelScope Community** 350 | - Base URL: `https://api-inference.modelscope.cn/v1` 351 | - Model: `ZhipuAI/AutoGLM-Phone-9B` 352 | - Application: [ModelScope Platform](https://modelscope.cn/) 353 | 354 | 3. **Other Custom AI API integration with AutoGLM** 355 | - Supports OpenAI-compatible format API interfaces. 356 | - Must ensure the model has image understanding capability. 357 | 358 | 4. **Voice Recognition Service (Optional)** 359 | - Requires: An OpenAI-compatible format AI speech recognition API. 360 | - Recommended Platform: [SiliconFlow AFF Invite](https://cloud.siliconflow.cn/i/eQGNraUT), free 20M Tokens upon registration. 361 | - Base URL: `https://api.siliconflow.cn/v1` 362 | - Recommended Model: `FunAudioLLM/SenseVoiceSmall` (currently free) [SiliconFlow Model Pricing](https://siliconflow.cn/pricing) 363 | - API Key Application: [SiliconFlow apikey](https://cloud.siliconflow.cn/me/account/ak) 364 | > Voice recognition can also use Zhipu BigModel's `glm-asr-2512` model. See [Official Documentation](https://docs.bigmodel.cn/cn/guide/models/sound-and-video/glm-asr-2512). 365 | 366 | --- 367 | 368 | 📦 Project Structure 369 | 370 | ``` 371 | ~/ 372 | ├── Open-AutoGLM/ # Project code 373 | ├── .autoglm/ 374 | │ └── config.sh # Configuration file 375 | ├── bin/ 376 | │ └── autoglm # Launch script (automatically added to PATH) 377 | └── .cargo/ 378 | └── config.toml # Cargo mirror configuration 379 | ``` 380 | 381 | --- 382 | 383 | 🔍 Supported Apps List 384 | 385 | Run `autoglm --list-apps` to view the complete list, mainly including: 386 | 387 | - Social & Communication: WeChat, QQ, Weibo 388 | - E-commerce & Shopping: Taobao, JD.com, Pinduoduo 389 | - Food Delivery: Meituan, Ele.me, KFC 390 | - Travel & Transportation: Ctrip, 12306, Didi Chuxing 391 | - Video & Entertainment: Bilibili, Douyin (TikTok), iQiyi 392 | - Music & Audio: NetEase Cloud Music, QQ Music, Himalaya 393 | - Lifestyle Services: Dianping (Meituan), Gaode Maps, Baidu Maps 394 | - Content Communities: Xiaohongshu (RED), Zhihu, Douban 395 | 396 | --- 397 | 398 | 🗑️ Uninstall Guide 399 | 400 | **New Feature:** The project provides two uninstall modes for safe cleanup. 401 | 402 | **Basic Uninstall (Recommended)** 403 | Uninstalls Open-AutoGLM + the autoglm control panel. 404 | - Selective deletion: pip dependencies, project directory, command, and configuration. 405 | - Keeps the runtime environment, doesn't affect other programs. 406 | 407 | **Complete Uninstall (Use with Caution)** 408 | In addition to Basic Uninstall contents, you can also choose to uninstall: 409 | - Core pip packages (maturin, openai, requests, Pillow) 410 | - pip/Cargo mirror configuration 411 | - Termux system packages (python-pillow, rust, android-tools) 412 | - ⚠️ Warning: May affect other programs relying on these packages. 413 | 414 | **Execution:** 415 | 416 | ```bash 417 | autoglm --uninstall 418 | ``` 419 | 420 | Enter the interactive uninstall menu and select as needed. 421 | 422 | --- 423 | 424 | ⚠️ Common Issues & Troubleshooting 425 | 426 | 1. **`adb devices` shows no device or device unauthorized** 427 | - Check USB Debugging: Must enable **USB debugging** and **Wireless debugging** in Developer Options. 428 | - Check Network: Ensure phone and Termux are on the same WiFi network. 429 | - Authorization Popup: Tap **"Allow USB debugging"** on the phone. 430 | - Re-pair: Delete old pairing and execute `adb pair` again. 431 | - Restart ADB: Execute `adb kill-server && adb start-server`. 432 | 433 | 2. **Apps open but can't click or input** 434 | - Enable Secure Debugging: Some phones need **"USB debugging (Security settings)"** enabled. 435 | - Must Install ADB Keyboard: Settings → Languages & input → Enable **ADB Keyboard**. 436 | - Switch Input Method: Need to switch to ADB Keyboard when running (Agent will do this automatically). 437 | 438 | 3. **Screenshot is black** 439 | - Sensitive Pages: Payment, banking apps will show black screens, this is normal. 440 | - Permission Restrictions: Some apps prohibit screenshots; Agent will request manual takeover. 441 | 442 | 4. **Model Connection Failure** 443 | - Check API Key: Confirm Key is valid and not expired. 444 | - Network Issue: Ensure Termux can access external networks. 445 | - Base URL: Confirm URL format is correct, ending with `/v1` if applicable. 446 | 447 | 5. **Cannot select device in multi-device environment** 448 | - Use `autoglm --devices` to view all devices. 449 | - Use `autoglm --switch-device` to switch the active device. 450 | - Or specify `PHONE_AGENT_DEVICE_ID="IP:Port"` in the configuration. 451 | 452 | 6. **Environment variables not taking effect** 453 | 454 | ```bash 455 | # Manually load configuration 456 | source ~/.bashrc 457 | # or 458 | source ~/.autoglm/config.sh 459 | ``` 460 | 461 | 7. **`autoglm` command still works after uninstall** 462 | - Reopen the terminal window. 463 | - Or manually execute `source ~/.bashrc` to reload configuration. 464 | - Or manually execute `hash -r` to refresh command cache. 465 | 466 | 8. **Update failed** 467 | 468 | ```bash 469 | # Manually delete old directory and retry 470 | rm -rf ~/Open-AutoGLM 471 | ./deploy.sh 472 | ``` 473 | 474 | 9. **Language switching issue** 475 | - Use `autoglm --lang cn` or `autoglm --lang en` to switch language. 476 | - Or select the "Switch Language" option in the main menu. 477 | 478 | 10. **Voice recognition function not working** 479 | - Ensure voice recognition was enabled during deployment. 480 | - Check if Termux:API app is installed and microphone permission is granted. 481 | - Confirm voice recognition API configuration is correct. 482 | - Check network connection is normal. 483 | 484 | 11. **ADB Keyboard installed but shows error on startup** 485 | - Ensure ADB Keyboard is installed and enabled. 486 | - If multiple devices are paired via ADB wireless debugging and switching to another device causes ADB Keyboard error, try restarting Termux and reconnecting, or enter the ADB management menu to disconnect all connections, restart ADB, reconnect, and then start AutoGLM again. 487 | 488 | --- 489 | 490 | 🔄 Changelog 491 | 492 | **v5.0.1 (Current Version)** 493 | - New: Comprehensive voice recognition support, control phone via voice. 494 | - New: Voice recognition configuration wizard, supports multiple services. 495 | - Fix: Voice recognition and quick start issues. 496 | - Optimize: Interactive menu, dynamically displays voice function options. 497 | 498 | **v4.6.0** 499 | - New: Full internationalization support, switch between Chinese/English interfaces. 500 | - New: Language selection wizard, choose language during deployment. 501 | 502 | **v4.5.0** 503 | - Enhanced ADB device management: Supports viewing device list, switching, disconnecting, quick connect. 504 | - New one-click uninstall function: Provides basic and complete uninstall modes. 505 | - Improved multi-device support: Can specify device ID, auto-detects online devices. 506 | - Optimized interactive experience: Clearer device status display (online/offline/unauthorized). 507 | - Fixed arithmetic error: Corrected device count issue. 508 | - Extended command-line arguments: Added `--devices`, `--switch-device`, `--disconnect`, `--uninstall`. 509 | - Enhanced compatibility: Supports multiple package managers (apt, yum, pacman, brew). 510 | 511 | **v4.3.0** 512 | - New interactive launch panel `autoglm` command. 513 | - Supports wireless ADB pairing and connection wizard. 514 | - Automatic configuration of pip and Cargo mirrors for China. 515 | - Supports multi-device management. 516 | 517 | **v4.2.0** 518 | - Optimized Termux compatibility. 519 | - Added ADB Keyboard installation reminder. 520 | - Supports configuration persistence. 521 | 522 | --- 523 | 524 | 🤝 Contributing 525 | 526 | Issues and Pull Requests are welcome! 527 | 528 | 1. Fork this repository. 529 | 2. Create your feature branch (`git checkout -b feature/AmazingFeature`). 530 | 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`). 531 | 4. Push to the branch (`git push origin feature/AmazingFeature`). 532 | 5. Open a Pull Request. 533 | 534 | --- 535 | 536 | 📄 License 537 | 538 | This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. 539 | 540 | --- 541 | 542 | 🔗 Related Links 543 | 544 | - Open-AutoGLM Official Project: https://github.com/zai-org/Open-AutoGLM 545 | - Termux Official Website: https://termux.dev/ 546 | - AutoGLM Paper: https://arxiv.org/abs/2411.00820 547 | - Zhipu AI: https://www.zhipuai.cn/ 548 | - ModelScope: https://modelscope.cn/ 549 | - SiliconFlow (Voice Recognition): https://siliconflow.cn/ 550 | 551 | --- 552 | 553 | 🙏 Acknowledgments 554 | 555 | - [Open-AutoGLM](https://github.com/zai-org/Open-AutoGLM) - Core framework. 556 | - [ADBKeyBoard](https://github.com/senzhk/ADBKeyBoard) - Input solution. 557 | - [Termux](https://termux.dev/) - Powerful terminal emulator. 558 | - [Termux:API](https://github.com/termux/termux-api) - Voice recognition support. 559 | 560 | --- 561 | 562 | 💬 Community & Support 563 | 564 | Encountered a problem? Need help? 565 | 566 | - Submit an [Issue](https://github.com/eraycc/AutoGLM-TERMUX/issues). 567 | - Check the [Open-AutoGLM Documentation](https://github.com/zai-org/Open-AutoGLM/blob/main/README.md). 568 | - Join the Open-AutoGLM WeChat community (see the official project README). 569 | 570 | --- 571 | 572 | ⭐ If this project helped you, please give it a Star! 573 | 574 | --- 575 | 576 | 📢 Disclaimer 577 | 578 | This project is only an automated deployment tool for Open-AutoGLM. All core functionalities are provided by Open-AutoGLM. Please ensure compliance with local laws and regulations and use this tool legally. The developers are not responsible for any misuse. 579 | -------------------------------------------------------------------------------- /Old-Version/deploy_drop.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Open-AutoGLM Termux 纯 ADB 方案 - 一键部署脚本 3 | # 版本: 4.3.1 (修复版) 4 | set -euo pipefail 5 | 6 | ########## 基础工具 ########## 7 | RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; PURPLE='\033[0;35m'; CYAN='\033[0;36m'; BOLD='\033[1m'; NC='\033[0m' 8 | log_info() { echo -e "${BLUE}[INFO]${NC} $*" >&2; } 9 | log_succ() { echo -e "${GREEN}[SUCC]${NC} $*" >&2; } 10 | log_warn() { echo -e "${YELLOW}[WARN]${NC} $*" >&2; } 11 | log_err() { echo -e "${RED}[ERROR]${NC} $*" >&2; } 12 | 13 | in_termux() { [[ -n "${TERMUX_VERSION:-}" ]]; } 14 | 15 | pkg_install() { 16 | if in_termux; then 17 | pkg install -y "$@" 18 | else 19 | if command -v apt-get &>/dev/null; then 20 | sudo apt-get update -y && sudo apt-get install -y "$@" 21 | elif command -v yum &>/dev/null; then 22 | sudo yum install -y "$@" 23 | elif command -v pacman &>/dev/null; then 24 | sudo pacman -Sy --noconfirm "$@" 25 | elif command -v brew &>/dev/null; then 26 | brew install "$@" || true 27 | else 28 | log_err "未找到适配的包管理器,请手动安装:$*" 29 | exit 1 30 | fi 31 | fi 32 | } 33 | 34 | ########## 镜像源配置 ########## 35 | ask_mirror() { 36 | local tip="$1" default="$2" var="$3" 37 | read -rp "${tip}(直接回车跳过,输入 default 使用推荐源): " input 38 | input="${input:-}" 39 | if [[ "$input" == "default" ]]; then 40 | input="$default" 41 | fi 42 | printf -v "$var" '%s' "$input" 43 | } 44 | 45 | setup_pip_mirror() { 46 | local url="$1" 47 | # 如果为空则跳过,不做任何操作 48 | if [[ -z "$url" ]]; then 49 | log_info "跳过 pip 镜像配置" 50 | return 0 51 | fi 52 | log_info "设置 pip 镜像:$url" 53 | # 提取 host 54 | local host 55 | host=$(echo "$url" | sed -E 's|https?://([^/]+).*|\1|') 56 | pip config set global.index-url "$url" 2>/dev/null || true 57 | pip config set install.trusted-host "$host" 2>/dev/null || true 58 | } 59 | 60 | setup_cargo_mirror() { 61 | local url="$1" 62 | # 如果为空则跳过,不做任何操作 63 | if [[ -z "$url" ]]; then 64 | log_info "跳过 Cargo 镜像配置" 65 | return 0 66 | fi 67 | log_info "设置 Cargo 镜像:$url" 68 | mkdir -p ~/.cargo 69 | rm -f ~/.cargo/config ~/.cargo/config.toml 70 | cat > ~/.cargo/config.toml </dev/null; then 85 | log_succ "Python 已存在:$(python --version)" 86 | else 87 | log_info "安装 Python..." 88 | pkg_install python 89 | fi 90 | } 91 | 92 | ensure_pip() { 93 | if python -m pip --version &>/dev/null; then 94 | log_succ "pip 已存在" 95 | else 96 | log_info "安装 python-pip..." 97 | pkg_install python-pip 98 | fi 99 | } 100 | 101 | ensure_git() { 102 | if command -v git &>/dev/null; then 103 | log_succ "Git 已存在:$(git --version)" 104 | else 105 | log_info "安装 Git..." 106 | pkg_install git 107 | fi 108 | } 109 | 110 | ensure_rust() { 111 | if command -v rustc &>/dev/null; then 112 | log_succ "Rust 已存在:$(rustc --version)" 113 | else 114 | log_info "安装 Rust 编译工具链..." 115 | pkg_install rust binutils 116 | fi 117 | } 118 | 119 | ensure_adb() { 120 | if command -v adb &>/dev/null; then 121 | log_succ "ADB 已存在:$(adb version | head -1)" 122 | return 0 123 | fi 124 | 125 | log_info "安装 ADB..." 126 | if in_termux; then 127 | pkg_install android-tools 128 | elif command -v apt-get &>/dev/null; then 129 | sudo apt-get update -y && sudo apt-get install -y adb 130 | elif command -v yum &>/dev/null; then 131 | sudo yum install -y android-tools 132 | elif command -v pacman &>/dev/null; then 133 | sudo pacman -Sy --noconfirm android-tools 134 | elif command -v brew &>/dev/null; then 135 | brew install android-platform-tools 136 | else 137 | log_warn "请手动安装 ADB 工具" 138 | return 1 139 | fi 140 | } 141 | 142 | ensure_setuptools() { 143 | log_info "确保 setuptools 已安装..." 144 | python -m pip install --upgrade setuptools wheel 2>/dev/null || true 145 | } 146 | 147 | ########## ADB Keyboard 提醒 ########## 148 | remind_adb_keyboard() { 149 | echo 150 | echo -e "${YELLOW}╔══════════════════════════════════════════════════════════════╗${NC}" 151 | echo -e "${YELLOW}║${NC} ${BOLD}${RED}重要提醒:安装 ADB Keyboard${NC} ${YELLOW}║${NC}" 152 | echo -e "${YELLOW}╚══════════════════════════════════════════════════════════════╝${NC}" 153 | echo 154 | echo -e "${CYAN}此工具用于文本输入,必须安装!${NC}" 155 | echo 156 | echo -e "${BLUE}下载地址:${NC}" 157 | echo -e " ${GREEN}https://github.com/senzhk/ADBKeyBoard/blob/master/ADBKeyboard.apk${NC}" 158 | echo 159 | echo -e "${BLUE}安装步骤:${NC}" 160 | echo -e " ${GREEN}1.${NC} 下载并安装 ADBKeyboard.apk 到安卓设备" 161 | echo -e " ${GREEN}2.${NC} 进入 设置 → 系统 → 语言和输入法 → 虚拟键盘 → 管理键盘" 162 | echo -e " ${GREEN}3.${NC} 启用 'ADB Keyboard' 即可(可暂不切换)" 163 | echo -e " ${GREEN}4.${NC} 使用原输入法继续下面的配置" 164 | echo 165 | read -rp "已了解,按回车继续... " 166 | } 167 | 168 | ########## ADB 无线调试配置向导 ########## 169 | configure_adb_wireless() { 170 | echo 171 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 172 | echo -e "${CYAN}║${NC} ${BOLD}ADB 无线调试配置向导${NC} ${CYAN}║${NC}" 173 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 174 | echo 175 | echo -e "${BLUE}请按以下步骤操作:${NC}" 176 | echo -e " ${GREEN}1.${NC} 确保手机和 Termux 设备在同一 WiFi 网络下" 177 | echo -e " ${GREEN}2.${NC} 进入 设置 → 关于手机 → 连续点击版本号 7 次(开启开发者模式)" 178 | echo -e " ${GREEN}3.${NC} 返回 设置 → 系统 → 开发者选项" 179 | echo -e " ${GREEN}4.${NC} 开启 '无线调试'" 180 | echo -e " ${GREEN}5.${NC} ${YELLOW}建议:${NC} 将无线调试界面和 Termux 分屏显示" 181 | echo 182 | 183 | echo -e "${YELLOW}━━━ 第一步:配对设备 ━━━${NC}" 184 | echo -e "${CYAN}点击无线调试界面中的「使用配对码配对」${NC}" 185 | echo 186 | read -rp " 输入配对码弹窗显示的 IP:端口: " pair_host 187 | if [[ -z "$pair_host" ]]; then 188 | log_err "IP:端口不能为空!" 189 | return 1 190 | fi 191 | 192 | read -rp " 输入配对码(6 位数字): " pair_code 193 | if [[ -z "$pair_code" ]]; then 194 | log_err "配对码不能为空!" 195 | return 1 196 | fi 197 | 198 | log_info "正在配对 $pair_host ..." 199 | if adb pair "$pair_host" "$pair_code" 2>&1; then 200 | log_succ "配对成功!" 201 | else 202 | log_err "配对失败,请检查输入是否正确!" 203 | return 1 204 | fi 205 | 206 | echo 207 | echo -e "${YELLOW}━━━ 第二步:连接设备 ━━━${NC}" 208 | echo -e "${CYAN}查看无线调试主界面(不是配对码弹窗)显示的 IP 地址和端口${NC}" 209 | echo 210 | read -rp " 输入无线调试界面的 IP:端口: " connect_host 211 | if [[ -z "$connect_host" ]]; then 212 | log_err "IP:端口不能为空!" 213 | return 1 214 | fi 215 | 216 | log_info "正在连接 $connect_host ..." 217 | if adb connect "$connect_host" 2>&1; then 218 | sleep 1 219 | if adb devices 2>/dev/null | grep -q "device$"; then 220 | log_succ "连接成功!设备已就绪!" 221 | echo 222 | adb devices 223 | return 0 224 | else 225 | log_err "设备未正确连接,请重试!" 226 | return 1 227 | fi 228 | else 229 | log_err "连接失败,请检查 IP:端口 和网络连接!" 230 | return 1 231 | fi 232 | } 233 | 234 | check_adb_configured() { 235 | local device_count 236 | device_count=$(adb devices 2>/dev/null | grep -c "device$" || echo "0") 237 | if [[ "$device_count" -eq 0 ]]; then 238 | return 1 239 | else 240 | return 0 241 | fi 242 | } 243 | 244 | show_adb_devices() { 245 | echo 246 | log_info "当前 ADB 设备列表:" 247 | adb devices -l 2>/dev/null || echo " (无法获取设备列表)" 248 | echo 249 | } 250 | 251 | ########## Python 依赖 ########## 252 | install_py_deps() { 253 | log_info "安装/升级核心 Python 包..." 254 | 255 | # 先确保 setuptools 存在 256 | ensure_setuptools 257 | 258 | if in_termux; then 259 | pkg_install python-pillow 260 | else 261 | python -m pip install --upgrade pillow 262 | fi 263 | 264 | python -m pip install --upgrade maturin openai requests 265 | } 266 | 267 | ########## 项目拉取/更新 ########## 268 | clone_or_update() { 269 | local dir="$HOME/Open-AutoGLM" 270 | if [[ -d $dir/.git ]]; then 271 | log_warn "检测到本地已存在 Open-AutoGLM 目录" 272 | read -rp "是否更新代码?(y/N): " ans 273 | case "${ans:-n}" in 274 | [Yy]*) 275 | log_info "正在更新代码..." 276 | git -C "$dir" pull --ff-only || log_warn "更新失败,使用本地代码" 277 | ;; 278 | *) 279 | log_info "跳过更新,使用本地代码" 280 | ;; 281 | esac 282 | else 283 | log_info "克隆仓库..." 284 | rm -rf "$dir" 285 | git clone https://github.com/zai-org/Open-AutoGLM.git "$dir" 286 | fi 287 | 288 | # 防止 pip 再次编译 Pillow 289 | in_termux && sed -i '/[Pp]illow/d' "$dir/requirements.txt" 2>/dev/null || true 290 | 291 | log_info "安装项目依赖..." 292 | python -m pip install -r "$dir/requirements.txt" 293 | 294 | log_info "安装项目本体..." 295 | python -m pip install -e "$dir" 296 | } 297 | 298 | ########## 交互式配置 ########## 299 | configure_env() { 300 | mkdir -p ~/.autoglm 301 | 302 | local DEFAULT_BASE_URL="https://open.bigmodel.cn/api/paas/v4" 303 | local DEFAULT_MODEL="autoglm-phone" 304 | local DEFAULT_API_KEY="sk-your-apikey" 305 | local DEFAULT_MAX_STEPS="100" 306 | local DEFAULT_DEVICE_ID="" 307 | local DEFAULT_LANG="cn" 308 | 309 | echo 310 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 311 | echo -e "${CYAN}║${NC} ${BOLD}配置 Open-AutoGLM 参数${NC} ${CYAN}║${NC}" 312 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 313 | echo 314 | echo -e "${YELLOW}直接回车使用 [默认值]${NC}" 315 | echo 316 | 317 | read -rp " AI 接口 Base URL [${DEFAULT_BASE_URL}]: " base_url 318 | base_url=${base_url:-$DEFAULT_BASE_URL} 319 | 320 | read -rp " AI 模型名称 [${DEFAULT_MODEL}]: " model 321 | model=${model:-$DEFAULT_MODEL} 322 | 323 | read -rp " AI API Key [${DEFAULT_API_KEY}]: " api_key 324 | api_key=${api_key:-$DEFAULT_API_KEY} 325 | 326 | read -rp " 每任务最大步数 [${DEFAULT_MAX_STEPS}]: " max_steps 327 | max_steps=${max_steps:-$DEFAULT_MAX_STEPS} 328 | 329 | read -rp " ADB 设备 ID(单设备留空自动检测)[]: " device_id 330 | device_id=${device_id:-$DEFAULT_DEVICE_ID} 331 | 332 | read -rp " 语言 cn/en [${DEFAULT_LANG}]: " lang 333 | lang=${lang:-$DEFAULT_LANG} 334 | 335 | # 写入配置文件 336 | cat > ~/.autoglm/config.sh </dev/null || echo 'source ~/.autoglm/config.sh' >> ~/.bashrc 349 | 350 | log_succ "配置已保存到 ~/.autoglm/config.sh" 351 | } 352 | 353 | ########## 创建启动器脚本 ########## 354 | make_launcher() { 355 | mkdir -p ~/bin 356 | 357 | cat > ~/bin/autoglm <<'LAUNCHER_EOF' 358 | #!/bin/bash 359 | # AutoGLM 智能启动面板 360 | # 版本: 4.3.1 361 | 362 | ########## 颜色定义 ########## 363 | RED='\033[0;31m' 364 | GREEN='\033[0;32m' 365 | YELLOW='\033[1;33m' 366 | BLUE='\033[0;34m' 367 | PURPLE='\033[0;35m' 368 | CYAN='\033[0;36m' 369 | BOLD='\033[1m' 370 | NC='\033[0m' 371 | 372 | ########## 配置文件 ########## 373 | CONFIG_FILE="$HOME/.autoglm/config.sh" 374 | AUTOGLM_DIR="$HOME/Open-AutoGLM" 375 | 376 | ########## 加载配置 ########## 377 | load_config() { 378 | if [[ -f "$CONFIG_FILE" ]]; then 379 | source "$CONFIG_FILE" 380 | else 381 | # 默认配置 382 | export PHONE_AGENT_BASE_URL="https://open.bigmodel.cn/api/paas/v4" 383 | export PHONE_AGENT_MODEL="autoglm-phone" 384 | export PHONE_AGENT_API_KEY="sk-your-apikey" 385 | export PHONE_AGENT_MAX_STEPS="100" 386 | export PHONE_AGENT_DEVICE_ID="" 387 | export PHONE_AGENT_LANG="cn" 388 | fi 389 | } 390 | 391 | ########## 保存配置 ########## 392 | save_config() { 393 | mkdir -p ~/.autoglm 394 | cat > "$CONFIG_FILE" </dev/null | grep -c "device$" || echo "0") 433 | echo "$count" 434 | } 435 | 436 | show_adb_status() { 437 | local count 438 | count=$(check_adb_devices) 439 | if [[ "$count" -gt 0 ]]; then 440 | echo -e "${GREEN}━━━ ADB 状态: ✓ 已连接 $count 台设备 ━━━${NC}" 441 | else 442 | echo -e "${RED}━━━ ADB 状态: ✗ 未检测到设备 ━━━${NC}" 443 | fi 444 | echo 445 | } 446 | 447 | ########## 显示主菜单 ########## 448 | show_main_menu() { 449 | show_header 450 | show_adb_status 451 | show_current_config 452 | 453 | echo -e "${YELLOW}━━━ 主菜单 ━━━${NC}" 454 | echo 455 | echo -e " ${GREEN}1.${NC} 🚀 使用当前配置启动" 456 | echo -e " ${GREEN}2.${NC} 📱 配置 ADB 无线调试" 457 | echo -e " ${GREEN}3.${NC} ⚙️ 修改 AI 配置" 458 | echo -e " ${GREEN}4.${NC} 📋 查看支持的应用列表" 459 | echo -e " ${GREEN}5.${NC} 🔍 查看详细配置" 460 | echo -e " ${GREEN}6.${NC} 🔌 查看 ADB 设备列表" 461 | echo -e " ${GREEN}0.${NC} ❌ 退出" 462 | echo 463 | } 464 | 465 | ########## ADB Keyboard 提醒 ########## 466 | remind_adb_keyboard() { 467 | show_header 468 | echo -e "${YELLOW}╔══════════════════════════════════════════════════════════════╗${NC}" 469 | echo -e "${YELLOW}║${NC} ${BOLD}${RED}⚠️ 重要提醒:安装 ADB Keyboard${NC} ${YELLOW}║${NC}" 470 | echo -e "${YELLOW}╚══════════════════════════════════════════════════════════════╝${NC}" 471 | echo 472 | echo -e "${CYAN}此工具用于文本输入,必须安装!${NC}" 473 | echo 474 | echo -e "${BLUE}下载地址:${NC}" 475 | echo -e " ${GREEN}https://github.com/senzhk/ADBKeyBoard/blob/master/ADBKeyboard.apk${NC}" 476 | echo 477 | echo -e "${BLUE}安装步骤:${NC}" 478 | echo -e " ${GREEN}1.${NC} 下载并安装 ADBKeyboard.apk 到安卓设备" 479 | echo -e " ${GREEN}2.${NC} 进入 ${YELLOW}设置 → 系统 → 语言和输入法 → 虚拟键盘 → 管理键盘${NC}" 480 | echo -e " ${GREEN}3.${NC} 开启 ${YELLOW}'ADB Keyboard'${NC}" 481 | echo -e " ${GREEN}4.${NC} 运行时需切换到 ADB Keyboard 输入法" 482 | echo 483 | read -rp "已了解,按回车继续... " 484 | } 485 | 486 | ########## 配置 ADB 无线调试 ########## 487 | configure_adb_wireless() { 488 | show_header 489 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 490 | echo -e "${CYAN}║${NC} ${BOLD}📱 ADB 无线调试配置向导${NC} ${CYAN}║${NC}" 491 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 492 | echo 493 | echo -e "${BLUE}请按以下步骤操作:${NC}" 494 | echo -e " ${GREEN}1.${NC} 确保手机和 Termux 设备在同一 WiFi 网络下" 495 | echo -e " ${GREEN}2.${NC} 进入 ${YELLOW}设置 → 关于手机 → 连续点击版本号 7 次${NC}(开启开发者模式)" 496 | echo -e " ${GREEN}3.${NC} 返回 ${YELLOW}设置 → 系统 → 开发者选项${NC}" 497 | echo -e " ${GREEN}4.${NC} 开启 ${YELLOW}'无线调试'${NC}" 498 | echo -e " ${GREEN}5.${NC} ${CYAN}建议:${NC} 将无线调试界面和 Termux 分屏显示" 499 | echo 500 | 501 | echo -e "${YELLOW}━━━ 第一步:配对设备 ━━━${NC}" 502 | echo -e "${CYAN}点击无线调试界面中的「使用配对码配对」${NC}" 503 | echo 504 | read -rp " 输入配对码弹窗显示的 IP:端口(如 192.168.1.13:42379): " pair_host 505 | if [[ -z "$pair_host" ]]; then 506 | echo -e "${RED}[ERROR] IP:端口不能为空!${NC}" 507 | read -rp "按回车返回... " 508 | return 1 509 | fi 510 | 511 | read -rp " 输入配对码(6 位数字): " pair_code 512 | if [[ -z "$pair_code" ]]; then 513 | echo -e "${RED}[ERROR] 配对码不能为空!${NC}" 514 | read -rp "按回车返回... " 515 | return 1 516 | fi 517 | 518 | echo -e "${BLUE}[INFO]${NC} 正在配对 $pair_host ..." 519 | if adb pair "$pair_host" "$pair_code" 2>&1; then 520 | echo -e "${GREEN}[SUCC]${NC} 配对成功!" 521 | else 522 | echo -e "${RED}[ERROR]${NC} 配对失败,请检查输入!" 523 | read -rp "按回车返回... " 524 | return 1 525 | fi 526 | 527 | echo 528 | echo -e "${YELLOW}━━━ 第二步:连接设备 ━━━${NC}" 529 | echo -e "${CYAN}查看无线调试主界面(不是配对码弹窗)显示的 IP 地址和端口${NC}" 530 | echo 531 | read -rp " 输入无线调试界面的 IP:端口(如 192.168.1.13:5555): " connect_host 532 | if [[ -z "$connect_host" ]]; then 533 | echo -e "${RED}[ERROR] IP:端口不能为空!${NC}" 534 | read -rp "按回车返回... " 535 | return 1 536 | fi 537 | 538 | echo -e "${BLUE}[INFO]${NC} 正在连接 $connect_host ..." 539 | if adb connect "$connect_host" 2>&1; then 540 | sleep 1 541 | if adb devices 2>/dev/null | grep -q "device$"; then 542 | echo 543 | echo -e "${GREEN}[SUCC]${NC} 连接成功!设备已就绪!" 544 | echo 545 | adb devices -l 546 | echo 547 | read -rp "按回车返回主菜单... " 548 | return 0 549 | fi 550 | fi 551 | 552 | echo -e "${RED}[ERROR]${NC} 连接失败,请检查 IP:端口 和网络!" 553 | read -rp "按回车返回... " 554 | return 1 555 | } 556 | 557 | ########## ADB 配置子菜单 ########## 558 | adb_menu() { 559 | while true; do 560 | show_header 561 | show_adb_status 562 | 563 | echo -e "${YELLOW}━━━ ADB 配置菜单 ━━━${NC}" 564 | echo 565 | echo -e " ${GREEN}1.${NC} 📱 配置无线调试(配对+连接)" 566 | echo -e " ${GREEN}2.${NC} 🔌 仅连接(已配对过)" 567 | echo -e " ${GREEN}3.${NC} 📋 查看设备列表" 568 | echo -e " ${GREEN}4.${NC} ❓ 查看 ADB Keyboard 安装说明" 569 | echo -e " ${GREEN}5.${NC} 🔄 断开所有设备" 570 | echo -e " ${GREEN}0.${NC} ↩️ 返回主菜单" 571 | echo 572 | read -rp "请选择 [0-5]: " choice 573 | 574 | case "$choice" in 575 | 1) 576 | configure_adb_wireless 577 | ;; 578 | 2) 579 | show_header 580 | echo -e "${CYAN}快速连接(适用于已配对过的设备)${NC}" 581 | echo 582 | read -rp "输入设备 IP:端口: " connect_host 583 | if [[ -n "$connect_host" ]]; then 584 | adb connect "$connect_host" 2>&1 585 | sleep 1 586 | adb devices 587 | fi 588 | read -rp "按回车继续... " 589 | ;; 590 | 3) 591 | show_header 592 | echo -e "${CYAN}ADB 设备列表:${NC}" 593 | echo 594 | adb devices -l 2>/dev/null || echo "无法获取设备列表" 595 | echo 596 | read -rp "按回车继续... " 597 | ;; 598 | 4) 599 | remind_adb_keyboard 600 | ;; 601 | 5) 602 | adb disconnect 2>/dev/null || true 603 | echo -e "${GREEN}[SUCC]${NC} 已断开所有设备" 604 | read -rp "按回车继续... " 605 | ;; 606 | 0) 607 | return 608 | ;; 609 | *) 610 | echo -e "${RED}无效选择${NC}" 611 | sleep 1 612 | ;; 613 | esac 614 | done 615 | } 616 | 617 | ########## 修改 AI 配置 ########## 618 | modify_config() { 619 | show_header 620 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 621 | echo -e "${CYAN}║${NC} ${BOLD}⚙️ 修改 AI 配置${NC} ${CYAN}║${NC}" 622 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 623 | echo 624 | echo -e "${YELLOW}直接回车保持当前值不变${NC}" 625 | echo 626 | 627 | local new_val 628 | 629 | read -rp " API 地址 [$PHONE_AGENT_BASE_URL]: " new_val 630 | [[ -n "$new_val" ]] && PHONE_AGENT_BASE_URL="$new_val" 631 | 632 | read -rp " 模型名称 [$PHONE_AGENT_MODEL]: " new_val 633 | [[ -n "$new_val" ]] && PHONE_AGENT_MODEL="$new_val" 634 | 635 | read -rp " API Key [$PHONE_AGENT_API_KEY]: " new_val 636 | [[ -n "$new_val" ]] && PHONE_AGENT_API_KEY="$new_val" 637 | 638 | read -rp " 最大步数 [$PHONE_AGENT_MAX_STEPS]: " new_val 639 | [[ -n "$new_val" ]] && PHONE_AGENT_MAX_STEPS="$new_val" 640 | 641 | read -rp " 设备 ID [${PHONE_AGENT_DEVICE_ID:-留空自动检测}]: " new_val 642 | PHONE_AGENT_DEVICE_ID="$new_val" 643 | 644 | read -rp " 语言 cn/en [$PHONE_AGENT_LANG]: " new_val 645 | [[ -n "$new_val" ]] && PHONE_AGENT_LANG="$new_val" 646 | 647 | save_config 648 | 649 | echo 650 | echo -e "${GREEN}[SUCC]${NC} 配置已保存并生效!" 651 | read -rp "按回车返回主菜单... " 652 | } 653 | 654 | ########## 查看详细配置 ########## 655 | view_config() { 656 | show_header 657 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 658 | echo -e "${CYAN}║${NC} ${BOLD}🔍 详细配置信息${NC} ${CYAN}║${NC}" 659 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 660 | echo 661 | echo -e "${BLUE}环境变量配置:${NC}" 662 | echo -e "┌────────────────────────┬────────────────────────────────────┐" 663 | printf "│ %-22s │ %-34s │\n" "变量名" "值" 664 | echo -e "├────────────────────────┼────────────────────────────────────┤" 665 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_BASE_URL" "$PHONE_AGENT_BASE_URL" 666 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_MODEL" "$PHONE_AGENT_MODEL" 667 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_API_KEY" "${PHONE_AGENT_API_KEY:0:20}..." 668 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_MAX_STEPS" "$PHONE_AGENT_MAX_STEPS" 669 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_DEVICE_ID" "${PHONE_AGENT_DEVICE_ID:-自动检测}" 670 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_LANG" "$PHONE_AGENT_LANG" 671 | echo -e "└────────────────────────┴────────────────────────────────────┘" 672 | echo 673 | echo -e "${BLUE}配置文件路径:${NC} $CONFIG_FILE" 674 | echo -e "${BLUE}项目目录:${NC} $AUTOGLM_DIR" 675 | echo 676 | read -rp "按回车返回主菜单... " 677 | } 678 | 679 | ########## 查看支持的应用 ########## 680 | list_apps() { 681 | show_header 682 | echo -e "${CYAN}正在获取支持的应用列表...${NC}" 683 | echo 684 | if [[ -d "$AUTOGLM_DIR" ]]; then 685 | cd "$AUTOGLM_DIR" 686 | python main.py --list-apps 2>/dev/null || echo -e "${RED}获取失败,请检查项目是否正确安装${NC}" 687 | else 688 | echo -e "${RED}项目目录不存在: $AUTOGLM_DIR${NC}" 689 | fi 690 | echo 691 | read -rp "按回车返回主菜单... " 692 | } 693 | 694 | ########## 查看 ADB 设备 ########## 695 | view_adb_devices() { 696 | show_header 697 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 698 | echo -e "${CYAN}║${NC} ${BOLD}🔌 ADB 设备列表${NC} ${CYAN}║${NC}" 699 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 700 | echo 701 | adb devices -l 2>/dev/null || echo "无法获取设备列表" 702 | echo 703 | read -rp "按回车返回主菜单... " 704 | } 705 | 706 | ########## 启动 AutoGLM ########## 707 | start_autoglm() { 708 | # 检查 ADB 设备 709 | local device_count 710 | device_count=$(check_adb_devices) 711 | 712 | if [[ "$device_count" -eq 0 ]]; then 713 | echo 714 | echo -e "${RED}[ERROR]${NC} 未检测到 ADB 设备!" 715 | echo -e "${YELLOW}请先配置 ADB 无线调试(菜单选项 2)${NC}" 716 | echo 717 | read -rp "是否现在配置 ADB?(Y/n): " ans 718 | case "${ans:-y}" in 719 | [Nn]*) 720 | return 1 721 | ;; 722 | *) 723 | adb_menu 724 | # 再次检查 725 | device_count=$(check_adb_devices) 726 | if [[ "$device_count" -eq 0 ]]; then 727 | return 1 728 | fi 729 | ;; 730 | esac 731 | fi 732 | 733 | # 检查项目目录 734 | if [[ ! -d "$AUTOGLM_DIR" ]]; then 735 | echo -e "${RED}[ERROR]${NC} 项目目录不存在: $AUTOGLM_DIR" 736 | echo -e "${YELLOW}请重新运行 deploy.sh 安装${NC}" 737 | read -rp "按回车返回... " 738 | return 1 739 | fi 740 | 741 | # 构造启动参数 742 | local CMD_ARGS=() 743 | CMD_ARGS+=(--base-url "$PHONE_AGENT_BASE_URL") 744 | CMD_ARGS+=(--model "$PHONE_AGENT_MODEL") 745 | CMD_ARGS+=(--apikey "$PHONE_AGENT_API_KEY") 746 | 747 | [[ -n "${PHONE_AGENT_DEVICE_ID:-}" ]] && CMD_ARGS+=(--device-id "$PHONE_AGENT_DEVICE_ID") 748 | 749 | echo 750 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 751 | echo -e "${CYAN}║${NC} ${BOLD}🚀 启动 AutoGLM${NC} ${CYAN}║${NC}" 752 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 753 | echo 754 | echo -e "${BLUE}配置信息:${NC}" 755 | echo -e " API : ${GREEN}$PHONE_AGENT_BASE_URL${NC}" 756 | echo -e " Model : ${GREEN}$PHONE_AGENT_MODEL${NC}" 757 | echo -e " Steps : ${GREEN}$PHONE_AGENT_MAX_STEPS${NC}" 758 | echo -e " Lang : ${GREEN}$PHONE_AGENT_LANG${NC}" 759 | [[ -n "${PHONE_AGENT_DEVICE_ID:-}" ]] && echo -e " Device : ${GREEN}$PHONE_AGENT_DEVICE_ID${NC}" 760 | echo 761 | echo -e "${YELLOW}正在启动...${NC}" 762 | echo 763 | 764 | cd "$AUTOGLM_DIR" 765 | exec python main.py "${CMD_ARGS[@]}" 766 | } 767 | 768 | ########## 解析命令行参数 ########## 769 | parse_args() { 770 | while [[ $# -gt 0 ]]; do 771 | case $1 in 772 | --base-url) 773 | PHONE_AGENT_BASE_URL="$2" 774 | shift 2 775 | ;; 776 | --model) 777 | PHONE_AGENT_MODEL="$2" 778 | shift 2 779 | ;; 780 | --apikey) 781 | PHONE_AGENT_API_KEY="$2" 782 | shift 2 783 | ;; 784 | --max-steps) 785 | PHONE_AGENT_MAX_STEPS="$2" 786 | shift 2 787 | ;; 788 | --device-id) 789 | PHONE_AGENT_DEVICE_ID="$2" 790 | shift 2 791 | ;; 792 | --lang) 793 | PHONE_AGENT_LANG="$2" 794 | shift 2 795 | ;; 796 | --list-apps) 797 | cd "$AUTOGLM_DIR" 2>/dev/null && python main.py --list-apps 798 | exit $? 799 | ;; 800 | --setup-adb) 801 | load_config 802 | adb_menu 803 | exit 0 804 | ;; 805 | --reconfig) 806 | load_config 807 | modify_config 808 | exit 0 809 | ;; 810 | --help|-h) 811 | echo -e "${BOLD}${CYAN}AutoGLM - 智能手机控制代理${NC}" 812 | echo 813 | echo -e "${YELLOW}用法:${NC}" 814 | echo " autoglm # 打开交互式菜单" 815 | echo " autoglm --setup-adb # 配置 ADB" 816 | echo " autoglm --reconfig # 修改配置" 817 | echo " autoglm --list-apps # 查看支持的应用" 818 | echo 819 | echo -e "${YELLOW}参数:${NC}" 820 | echo " --base-url URL 设置 API 地址" 821 | echo " --model NAME 设置模型名称" 822 | echo " --apikey KEY 设置 API Key" 823 | echo " --max-steps N 设置最大步数" 824 | echo " --device-id ID 设置 ADB 设备 ID" 825 | echo " --lang cn|en 设置语言" 826 | exit 0 827 | ;; 828 | --start|-s) 829 | # 直接启动模式 830 | DIRECT_START=true 831 | shift 832 | ;; 833 | *) 834 | echo -e "${RED}未知参数: $1${NC}" 835 | echo "使用 --help 查看帮助" 836 | exit 1 837 | ;; 838 | esac 839 | done 840 | } 841 | 842 | ########## 主菜单循环 ########## 843 | main_menu_loop() { 844 | while true; do 845 | show_main_menu 846 | read -rp "请选择 [0-6]: " choice 847 | 848 | case "$choice" in 849 | 1) 850 | start_autoglm 851 | ;; 852 | 2) 853 | adb_menu 854 | ;; 855 | 3) 856 | modify_config 857 | ;; 858 | 4) 859 | list_apps 860 | ;; 861 | 5) 862 | view_config 863 | ;; 864 | 6) 865 | view_adb_devices 866 | ;; 867 | 0) 868 | echo 869 | echo -e "${GREEN}再见!${NC}" 870 | exit 0 871 | ;; 872 | *) 873 | echo -e "${RED}无效选择,请输入 0-6${NC}" 874 | sleep 1 875 | ;; 876 | esac 877 | done 878 | } 879 | 880 | ########## 主入口 ########## 881 | main() { 882 | load_config 883 | parse_args "$@" 884 | 885 | # 如果指定了直接启动 886 | if [[ "${DIRECT_START:-false}" == true ]]; then 887 | start_autoglm 888 | exit $? 889 | fi 890 | 891 | # 否则进入菜单 892 | main_menu_loop 893 | } 894 | 895 | main "$@" 896 | LAUNCHER_EOF 897 | 898 | chmod +x ~/bin/autoglm 899 | 900 | # 确保 PATH 包含 ~/bin 901 | if ! grep -q 'export PATH=.*~/bin' ~/.bashrc 2>/dev/null; then 902 | echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc 903 | fi 904 | 905 | log_succ "启动器已创建: ~/bin/autoglm" 906 | } 907 | 908 | ########## 主流程 ########## 909 | main() { 910 | echo -e "${BLUE}╔══════════════════════════════════════════════════════════════╗${NC}" 911 | echo -e "${BLUE}║${NC} ${BOLD}Open-AutoGLM 一键部署脚本 (ADB 纯方案)${NC} ${BLUE}║${NC}" 912 | echo -e "${BLUE}║${NC} ${CYAN}版本: 4.3.1${NC} ${BLUE}║${NC}" 913 | echo -e "${BLUE}╚══════════════════════════════════════════════════════════════╝${NC}" 914 | echo 915 | 916 | # 1. 安装基础依赖 917 | log_info "检查并安装基础依赖..." 918 | ensure_python 919 | ensure_pip 920 | ensure_git 921 | ensure_rust 922 | ensure_adb 923 | 924 | # 确保 setuptools 存在(解决 build dependencies 问题) 925 | ensure_setuptools 926 | 927 | echo 928 | 929 | # 2. 配置镜像源(空值时跳过) 930 | local pip_mirror="" cargo_mirror="" 931 | ask_mirror "请输入 pip 镜像地址(阿里 https://mirrors.aliyun.com/pypi/simple)" \ 932 | "https://mirrors.aliyun.com/pypi/simple" pip_mirror 933 | ask_mirror "请输入 Cargo 镜像地址(清华 sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/)" \ 934 | "sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/" cargo_mirror 935 | setup_pip_mirror "$pip_mirror" 936 | setup_cargo_mirror "$cargo_mirror" 937 | 938 | # 3. 安装 Python 依赖 939 | install_py_deps 940 | 941 | # 4. 拉取/更新项目 942 | clone_or_update 943 | 944 | # 5. 配置环境参数 945 | configure_env 946 | 947 | # 6. 提醒 ADB Keyboard 948 | remind_adb_keyboard 949 | 950 | # 7. 配置 ADB(可选) 951 | echo 952 | if check_adb_configured; then 953 | log_succ "检测到已连接的 ADB 设备:" 954 | adb devices 955 | read -rp "是否需要重新配置 ADB?(y/N): " reconf 956 | if [[ "$reconf" == "y" || "$reconf" == "Y" ]]; then 957 | configure_adb_wireless 958 | fi 959 | else 960 | log_warn "未检测到 ADB 设备" 961 | read -rp "是否现在配置 ADB 无线调试?(Y/n): " conf 962 | case "${conf:-y}" in 963 | [Nn]*) 964 | log_info "跳过 ADB 配置,稍后可运行 autoglm 进行配置" 965 | ;; 966 | *) 967 | configure_adb_wireless || log_warn "ADB 配置失败,稍后可运行 autoglm 重试" 968 | ;; 969 | esac 970 | fi 971 | 972 | # 8. 创建启动器 973 | make_launcher 974 | 975 | # 9. 生效配置 976 | source ~/.autoglm/config.sh 2>/dev/null || true 977 | export PATH="$HOME/bin:$PATH" 978 | 979 | echo 980 | echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}" 981 | echo -e "${GREEN}║${NC} ${BOLD}✅ 部署完成!${NC} ${GREEN}║${NC}" 982 | echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}" 983 | echo 984 | echo -e "运行 ${CYAN}autoglm${NC} 打开智能启动面板" 985 | echo -e "运行 ${CYAN}autoglm --help${NC} 查看更多选项" 986 | echo 987 | echo -e "${YELLOW}提示: 新终端窗口自动加载配置,当前窗口请执行:${NC}" 988 | echo -e " ${GREEN}source ~/.bashrc${NC}" 989 | echo 990 | } 991 | 992 | main "$@" 993 | -------------------------------------------------------------------------------- /Old-Version/deploybeta.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Open-AutoGLM Termux 纯 ADB 方案 - 一键部署脚本 3 | # 版本: 4.3.2 (改进卸载功能) 4 | set -euo pipefail 5 | 6 | ########## 基础工具 ########## 7 | RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; PURPLE='\033[0;35m'; CYAN='\033[0;36m'; BOLD='\033[1m'; NC='\033[0m' 8 | log_info() { echo -e "${BLUE}[INFO]${NC} $*" >&2; } 9 | log_succ() { echo -e "${GREEN}[SUCC]${NC} $*" >&2; } 10 | log_warn() { echo -e "${YELLOW}[WARN]${NC} $*" >&2; } 11 | log_err() { echo -e "${RED}[ERROR]${NC} $*" >&2; } 12 | 13 | in_termux() { [[ -n "${TERMUX_VERSION:-}" ]]; } 14 | 15 | pkg_install() { 16 | if in_termux; then 17 | pkg install -y "$@" 18 | else 19 | if command -v apt-get &>/dev/null; then 20 | sudo apt-get update -y && sudo apt-get install -y "$@" 21 | elif command -v yum &>/dev/null; then 22 | sudo yum install -y "$@" 23 | elif command -v pacman &>/dev/null; then 24 | sudo pacman -Sy --noconfirm "$@" 25 | elif command -v brew &>/dev/null; then 26 | brew install "$@" || true 27 | else 28 | log_err "未找到适配的包管理器,请手动安装:$*" 29 | exit 1 30 | fi 31 | fi 32 | } 33 | 34 | ########## 镜像源配置 ########## 35 | ask_mirror() { 36 | local tip="$1" default="$2" var="$3" 37 | read -rp "${tip}(直接回车跳过,输入 default 使用推荐源): " input 38 | input="${input:-}" 39 | if [[ "$input" == "default" ]]; then 40 | input="$default" 41 | fi 42 | printf -v "$var" '%s' "$input" 43 | } 44 | 45 | setup_pip_mirror() { 46 | local url="$1" 47 | if [[ -z "$url" ]]; then 48 | log_info "跳过 pip 镜像配置" 49 | return 0 50 | fi 51 | log_info "设置 pip 镜像:$url" 52 | local host 53 | host=$(echo "$url" | sed -E 's|https?://([^/]+).*|\1|') 54 | pip config set global.index-url "$url" 2>/dev/null || true 55 | pip config set install.trusted-host "$host" 2>/dev/null || true 56 | } 57 | 58 | setup_cargo_mirror() { 59 | local url="$1" 60 | if [[ -z "$url" ]]; then 61 | log_info "跳过 Cargo 镜像配置" 62 | return 0 63 | fi 64 | log_info "设置 Cargo 镜像:$url" 65 | mkdir -p ~/.cargo 66 | rm -f ~/.cargo/config ~/.cargo/config.toml 67 | cat > ~/.cargo/config.toml </dev/null; then 82 | log_succ "Python 已存在:$(python --version)" 83 | else 84 | log_info "安装 Python..." 85 | pkg_install python 86 | fi 87 | } 88 | 89 | ensure_pip() { 90 | if python -m pip --version &>/dev/null; then 91 | log_succ "pip 已存在" 92 | else 93 | log_info "安装 python-pip..." 94 | pkg_install python-pip 95 | fi 96 | } 97 | 98 | ensure_git() { 99 | if command -v git &>/dev/null; then 100 | log_succ "Git 已存在:$(git --version)" 101 | else 102 | log_info "安装 Git..." 103 | pkg_install git 104 | fi 105 | } 106 | 107 | ensure_rust() { 108 | if command -v rustc &>/dev/null; then 109 | log_succ "Rust 已存在:$(rustc --version)" 110 | else 111 | log_info "安装 Rust 编译工具链..." 112 | pkg_install rust binutils 113 | fi 114 | } 115 | 116 | ensure_adb() { 117 | if command -v adb &>/dev/null; then 118 | log_succ "ADB 已存在:$(adb version | head -1)" 119 | return 0 120 | fi 121 | 122 | log_info "安装 ADB..." 123 | if in_termux; then 124 | pkg_install android-tools 125 | elif command -v apt-get &>/dev/null; then 126 | sudo apt-get update -y && sudo apt-get install -y adb 127 | elif command -v yum &>/dev/null; then 128 | sudo yum install -y android-tools 129 | elif command -v pacman &>/dev/null; then 130 | sudo pacman -Sy --noconfirm android-tools 131 | elif command -v brew &>/dev/null; then 132 | brew install android-platform-tools 133 | else 134 | log_warn "请手动安装 ADB 工具" 135 | return 1 136 | fi 137 | } 138 | 139 | ensure_setuptools() { 140 | log_info "确保 setuptools 已安装..." 141 | python -m pip install --upgrade setuptools wheel 2>/dev/null || true 142 | } 143 | 144 | ########## ADB Keyboard 提醒 ########## 145 | remind_adb_keyboard() { 146 | echo 147 | echo -e "${YELLOW}╔══════════════════════════════════════════════════════════════╗${NC}" 148 | echo -e "${YELLOW}║${NC} ${BOLD}${RED}重要提醒:安装 ADB Keyboard${NC} ${YELLOW}║${NC}" 149 | echo -e "${YELLOW}╚══════════════════════════════════════════════════════════════╝${NC}" 150 | echo 151 | echo -e "${CYAN}此工具用于文本输入,必须安装!${NC}" 152 | echo 153 | echo -e "${BLUE}下载地址:${NC}" 154 | echo -e " ${GREEN}https://github.com/senzhk/ADBKeyBoard/blob/master/ADBKeyboard.apk${NC}" 155 | echo 156 | echo -e "${BLUE}安装步骤:${NC}" 157 | echo -e " ${GREEN}1.${NC} 下载并安装 ADBKeyboard.apk 到安卓设备" 158 | echo -e " ${GREEN}2.${NC} 进入 设置 → 系统 → 语言和输入法 → 虚拟键盘 → 管理键盘" 159 | echo -e " ${GREEN}3.${NC} 启用 'ADB Keyboard' 即可(可暂不切换)" 160 | echo -e " ${GREEN}4.${NC} 使用原输入法继续下面的配置" 161 | echo 162 | read -rp "已了解,按回车继续... " 163 | } 164 | 165 | ########## ADB 无线调试配置向导 ########## 166 | configure_adb_wireless() { 167 | echo 168 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 169 | echo -e "${CYAN}║${NC} ${BOLD}ADB 无线调试配置向导${NC} ${CYAN}║${NC}" 170 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 171 | echo 172 | echo -e "${BLUE}请按以下步骤操作:${NC}" 173 | echo -e " ${GREEN}1.${NC} 确保手机和 Termux 设备在同一 WiFi 网络下" 174 | echo -e " ${GREEN}2.${NC} 进入 设置 → 关于手机 → 连续点击版本号 7 次(开启开发者模式)" 175 | echo -e " ${GREEN}3.${NC} 返回 设置 → 系统 → 开发者选项" 176 | echo -e " ${GREEN}4.${NC} 开启 '无线调试'" 177 | echo -e " ${GREEN}5.${NC} ${YELLOW}建议:${NC} 将无线调试界面和 Termux 分屏显示" 178 | echo 179 | 180 | echo -e "${YELLOW}━━━ 第一步:配对设备 ━━━${NC}" 181 | echo -e "${CYAN}点击无线调试界面中的「使用配对码配对」${NC}" 182 | echo 183 | read -rp " 输入配对码弹窗显示的 IP:端口: " pair_host 184 | if [[ -z "$pair_host" ]]; then 185 | log_err "IP:端口不能为空!" 186 | return 1 187 | fi 188 | 189 | read -rp " 输入配对码(6 位数字): " pair_code 190 | if [[ -z "$pair_code" ]]; then 191 | log_err "配对码不能为空!" 192 | return 1 193 | fi 194 | 195 | log_info "正在配对 $pair_host ..." 196 | if adb pair "$pair_host" "$pair_code" 2>&1; then 197 | log_succ "配对成功!" 198 | else 199 | log_err "配对失败,请检查输入是否正确!" 200 | return 1 201 | fi 202 | 203 | echo 204 | echo -e "${YELLOW}━━━ 第二步:连接设备 ━━━${NC}" 205 | echo -e "${CYAN}查看无线调试主界面(不是配对码弹窗)显示的 IP 地址和端口${NC}" 206 | echo 207 | read -rp " 输入无线调试界面的 IP:端口: " connect_host 208 | if [[ -z "$connect_host" ]]; then 209 | log_err "IP:端口不能为空!" 210 | return 1 211 | fi 212 | 213 | log_info "正在连接 $connect_host ..." 214 | if adb connect "$connect_host" 2>&1; then 215 | sleep 1 216 | if adb devices 2>/dev/null | grep -q "device$"; then 217 | log_succ "连接成功!设备已就绪!" 218 | echo 219 | adb devices 220 | return 0 221 | else 222 | log_err "设备未正确连接,请重试!" 223 | return 1 224 | fi 225 | else 226 | log_err "连接失败,请检查 IP:端口 和网络连接!" 227 | return 1 228 | fi 229 | } 230 | 231 | check_adb_configured() { 232 | local device_count 233 | device_count=$(adb devices 2>/dev/null | grep -c "device$" || echo "0") 234 | if [[ "$device_count" -eq 0 ]]; then 235 | return 1 236 | else 237 | return 0 238 | fi 239 | } 240 | 241 | show_adb_devices() { 242 | echo 243 | log_info "当前 ADB 设备列表:" 244 | adb devices -l 2>/dev/null || echo " (无法获取设备列表)" 245 | echo 246 | } 247 | 248 | ########## Python 依赖 ########## 249 | install_py_deps() { 250 | log_info "安装/升级核心 Python 包..." 251 | ensure_setuptools 252 | 253 | if in_termux; then 254 | pkg_install python-pillow 255 | else 256 | python -m pip install --upgrade pillow 257 | fi 258 | 259 | python -m pip install --upgrade maturin openai requests 260 | } 261 | 262 | ########## 项目拉取/更新 ########## 263 | clone_or_update() { 264 | local dir="$HOME/Open-AutoGLM" 265 | if [[ -d $dir/.git ]]; then 266 | log_warn "检测到本地已存在 Open-AutoGLM 目录" 267 | read -rp "是否更新代码?(y/N): " ans 268 | case "${ans:-n}" in 269 | [Yy]*) 270 | log_info "正在更新代码..." 271 | git -C "$dir" pull --ff-only || log_warn "更新失败,使用本地代码" 272 | ;; 273 | *) 274 | log_info "跳过更新,使用本地代码" 275 | ;; 276 | esac 277 | else 278 | log_info "克隆仓库..." 279 | rm -rf "$dir" 280 | git clone https://github.com/zai-org/Open-AutoGLM.git "$dir" 281 | fi 282 | 283 | in_termux && sed -i '/[Pp]illow/d' "$dir/requirements.txt" 2>/dev/null || true 284 | 285 | log_info "安装项目依赖..." 286 | python -m pip install -r "$dir/requirements.txt" 287 | 288 | log_info "安装项目本体..." 289 | python -m pip install -e "$dir" 290 | } 291 | 292 | ########## 交互式配置 ########## 293 | configure_env() { 294 | mkdir -p ~/.autoglm 295 | 296 | local DEFAULT_BASE_URL="https://open.bigmodel.cn/api/paas/v4" 297 | local DEFAULT_MODEL="autoglm-phone" 298 | local DEFAULT_API_KEY="sk-your-apikey" 299 | local DEFAULT_MAX_STEPS="100" 300 | local DEFAULT_DEVICE_ID="" 301 | local DEFAULT_LANG="cn" 302 | 303 | echo 304 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 305 | echo -e "${CYAN}║${NC} ${BOLD}配置 Open-AutoGLM 参数${NC} ${CYAN}║${NC}" 306 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 307 | echo 308 | echo -e "${YELLOW}直接回车使用 [默认值]${NC}" 309 | echo 310 | 311 | read -rp " AI 接口 Base URL [${DEFAULT_BASE_URL}]: " base_url 312 | base_url=${base_url:-$DEFAULT_BASE_URL} 313 | 314 | read -rp " AI 模型名称 [${DEFAULT_MODEL}]: " model 315 | model=${model:-$DEFAULT_MODEL} 316 | 317 | read -rp " AI API Key [${DEFAULT_API_KEY}]: " api_key 318 | api_key=${api_key:-$DEFAULT_API_KEY} 319 | 320 | read -rp " 每任务最大步数 [${DEFAULT_MAX_STEPS}]: " max_steps 321 | max_steps=${max_steps:-$DEFAULT_MAX_STEPS} 322 | 323 | read -rp " ADB 设备 ID(单设备留空自动检测)[]: " device_id 324 | device_id=${device_id:-$DEFAULT_DEVICE_ID} 325 | 326 | read -rp " 语言 cn/en [${DEFAULT_LANG}]: " lang 327 | lang=${lang:-$DEFAULT_LANG} 328 | 329 | cat > ~/.autoglm/config.sh </dev/null || echo 'source ~/.autoglm/config.sh' >> ~/.bashrc 342 | 343 | log_succ "配置已保存到 ~/.autoglm/config.sh" 344 | } 345 | 346 | ########## 创建启动器脚本 ########## 347 | make_launcher() { 348 | mkdir -p ~/bin 349 | 350 | cat > ~/bin/autoglm <<'LAUNCHER_EOF' 351 | #!/bin/bash 352 | # AutoGLM 智能启动面板 353 | # 版本: 4.3.2 354 | 355 | ########## 颜色定义 ########## 356 | RED='\033[0;31m' 357 | GREEN='\033[0;32m' 358 | YELLOW='\033[1;33m' 359 | BLUE='\033[0;34m' 360 | PURPLE='\033[0;35m' 361 | CYAN='\033[0;36m' 362 | BOLD='\033[1m' 363 | NC='\033[0m' 364 | 365 | ########## 配置文件 ########## 366 | CONFIG_FILE="$HOME/.autoglm/config.sh" 367 | AUTOGLM_DIR="$HOME/Open-AutoGLM" 368 | 369 | ########## 加载配置 ########## 370 | load_config() { 371 | if [[ -f "$CONFIG_FILE" ]]; then 372 | source "$CONFIG_FILE" 373 | else 374 | export PHONE_AGENT_BASE_URL="https://open.bigmodel.cn/api/paas/v4" 375 | export PHONE_AGENT_MODEL="autoglm-phone" 376 | export PHONE_AGENT_API_KEY="sk-your-apikey" 377 | export PHONE_AGENT_MAX_STEPS="100" 378 | export PHONE_AGENT_DEVICE_ID="" 379 | export PHONE_AGENT_LANG="cn" 380 | fi 381 | } 382 | 383 | ########## 保存配置 ########## 384 | save_config() { 385 | mkdir -p ~/.autoglm 386 | cat > "$CONFIG_FILE" </dev/null | grep -c "device$" || echo "0") 425 | echo "$count" 426 | } 427 | 428 | show_adb_status() { 429 | local count 430 | count=$(check_adb_devices) 431 | if [[ "$count" -gt 0 ]]; then 432 | echo -e "${GREEN}━━━ ADB 状态: ✓ 已连接 $count 台设备 ━━━${NC}" 433 | else 434 | echo -e "${RED}━━━ ADB 状态: ✗ 未检测到设备 ━━━${NC}" 435 | fi 436 | echo 437 | } 438 | 439 | ########## 显示主菜单 ########## 440 | show_main_menu() { 441 | show_header 442 | show_adb_status 443 | show_current_config 444 | 445 | echo -e "${YELLOW}━━━ 主菜单 ━━━${NC}" 446 | echo 447 | echo -e " ${GREEN}1.${NC} 🚀 使用当前配置启动" 448 | echo -e " ${GREEN}2.${NC} 📱 配置 ADB 无线调试" 449 | echo -e " ${GREEN}3.${NC} ⚙️ 修改 AI 配置" 450 | echo -e " ${GREEN}4.${NC} 📋 查看支持的应用列表" 451 | echo -e " ${GREEN}5.${NC} 🔍 查看详细配置" 452 | echo -e " ${GREEN}6.${NC} 🔌 查看 ADB 设备列表" 453 | echo -e " ${GREEN}7.${NC} 🗑️ 一键卸载" 454 | echo -e " ${GREEN}0.${NC} ❌ 退出" 455 | echo 456 | } 457 | 458 | ########## ADB Keyboard 提醒 ########## 459 | remind_adb_keyboard() { 460 | show_header 461 | echo -e "${YELLOW}╔══════════════════════════════════════════════════════════════╗${NC}" 462 | echo -e "${YELLOW}║${NC} ${BOLD}${RED}⚠️ 重要提醒:安装 ADB Keyboard${NC} ${YELLOW}║${NC}" 463 | echo -e "${YELLOW}╚══════════════════════════════════════════════════════════════╝${NC}" 464 | echo 465 | echo -e "${CYAN}此工具用于文本输入,必须安装!${NC}" 466 | echo 467 | echo -e "${BLUE}下载地址:${NC}" 468 | echo -e " ${GREEN}https://github.com/senzhk/ADBKeyBoard/blob/master/ADBKeyboard.apk${NC}" 469 | echo 470 | echo -e "${BLUE}安装步骤:${NC}" 471 | echo -e " ${GREEN}1.${NC} 下载并安装 ADBKeyboard.apk 到安卓设备" 472 | echo -e " ${GREEN}2.${NC} 进入 ${YELLOW}设置 → 系统 → 语言和输入法 → 虚拟键盘 → 管理键盘${NC}" 473 | echo -e " ${GREEN}3.${NC} 开启 ${YELLOW}'ADB Keyboard'${NC}" 474 | echo -e " ${GREEN}4.${NC} 运行时需切换到 ADB Keyboard 输入法" 475 | echo 476 | read -rp "已了解,按回车继续... " 477 | } 478 | 479 | ########## 配置 ADB 无线调试 ########## 480 | configure_adb_wireless() { 481 | show_header 482 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 483 | echo -e "${CYAN}║${NC} ${BOLD}📱 ADB 无线调试配置向导${NC} ${CYAN}║${NC}" 484 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 485 | echo 486 | echo -e "${BLUE}请按以下步骤操作:${NC}" 487 | echo -e " ${GREEN}1.${NC} 确保手机和 Termux 设备在同一 WiFi 网络下" 488 | echo -e " ${GREEN}2.${NC} 进入 ${YELLOW}设置 → 关于手机 → 连续点击版本号 7 次${NC}(开启开发者模式)" 489 | echo -e " ${GREEN}3.${NC} 返回 ${YELLOW}设置 → 系统 → 开发者选项${NC}" 490 | echo -e " ${GREEN}4.${NC} 开启 ${YELLOW}'无线调试'${NC}" 491 | echo -e " ${GREEN}5.${NC} ${CYAN}建议:${NC} 将无线调试界面和 Termux 分屏显示" 492 | echo 493 | 494 | echo -e "${YELLOW}━━━ 第一步:配对设备 ━━━${NC}" 495 | echo -e "${CYAN}点击无线调试界面中的「使用配对码配对」${NC}" 496 | echo 497 | read -rp " 输入配对码弹窗显示的 IP:端口(如 192.168.1.13:42379): " pair_host 498 | if [[ -z "$pair_host" ]]; then 499 | echo -e "${RED}[ERROR] IP:端口不能为空!${NC}" 500 | read -rp "按回车返回... " 501 | return 1 502 | fi 503 | 504 | read -rp " 输入配对码(6 位数字): " pair_code 505 | if [[ -z "$pair_code" ]]; then 506 | echo -e "${RED}[ERROR] 配对码不能为空!${NC}" 507 | read -rp "按回车返回... " 508 | return 1 509 | fi 510 | 511 | echo -e "${BLUE}[INFO]${NC} 正在配对 $pair_host ..." 512 | if adb pair "$pair_host" "$pair_code" 2>&1; then 513 | echo -e "${GREEN}[SUCC]${NC} 配对成功!" 514 | else 515 | echo -e "${RED}[ERROR]${NC} 配对失败,请检查输入!" 516 | read -rp "按回车返回... " 517 | return 1 518 | fi 519 | 520 | echo 521 | echo -e "${YELLOW}━━━ 第二步:连接设备 ━━━${NC}" 522 | echo -e "${CYAN}查看无线调试主界面(不是配对码弹窗)显示的 IP 地址和端口${NC}" 523 | echo 524 | read -rp " 输入无线调试界面的 IP:端口(如 192.168.1.13:5555): " connect_host 525 | if [[ -z "$connect_host" ]]; then 526 | echo -e "${RED}[ERROR] IP:端口不能为空!${NC}" 527 | read -rp "按回车返回... " 528 | return 1 529 | fi 530 | 531 | echo -e "${BLUE}[INFO]${NC} 正在连接 $connect_host ..." 532 | if adb connect "$connect_host" 2>&1; then 533 | sleep 1 534 | if adb devices 2>/dev/null | grep -q "device$"; then 535 | echo 536 | echo -e "${GREEN}[SUCC]${NC} 连接成功!设备已就绪!" 537 | echo 538 | adb devices -l 539 | echo 540 | read -rp "按回车返回主菜单... " 541 | return 0 542 | fi 543 | fi 544 | 545 | echo -e "${RED}[ERROR]${NC} 连接失败,请检查 IP:端口 和网络!" 546 | read -rp "按回车返回... " 547 | return 1 548 | } 549 | 550 | ########## ADB 配置子菜单 ########## 551 | adb_menu() { 552 | while true; do 553 | show_header 554 | show_adb_status 555 | 556 | echo -e "${YELLOW}━━━ ADB 配置菜单 ━━━${NC}" 557 | echo 558 | echo -e " ${GREEN}1.${NC} 📱 配置无线调试(配对+连接)" 559 | echo -e " ${GREEN}2.${NC} 🔌 仅连接(已配对过)" 560 | echo -e " ${GREEN}3.${NC} 📋 查看设备列表" 561 | echo -e " ${GREEN}4.${NC} ❓ 查看 ADB Keyboard 安装说明" 562 | echo -e " ${GREEN}5.${NC} 🔄 断开所有设备" 563 | echo -e " ${GREEN}0.${NC} ↩️ 返回主菜单" 564 | echo 565 | read -rp "请选择 [0-5]: " choice 566 | 567 | case "$choice" in 568 | 1) 569 | configure_adb_wireless 570 | ;; 571 | 2) 572 | show_header 573 | echo -e "${CYAN}快速连接(适用于已配对过的设备)${NC}" 574 | echo 575 | read -rp "输入设备 IP:端口: " connect_host 576 | if [[ -n "$connect_host" ]]; then 577 | adb connect "$connect_host" 2>&1 578 | sleep 1 579 | adb devices 580 | fi 581 | read -rp "按回车继续... " 582 | ;; 583 | 3) 584 | show_header 585 | echo -e "${CYAN}ADB 设备列表:${NC}" 586 | echo 587 | adb devices -l 2>/dev/null || echo "无法获取设备列表" 588 | echo 589 | read -rp "按回车继续... " 590 | ;; 591 | 4) 592 | remind_adb_keyboard 593 | ;; 594 | 5) 595 | adb disconnect 2>/dev/null || true 596 | echo -e "${GREEN}[SUCC]${NC} 已断开所有设备" 597 | read -rp "按回车继续... " 598 | ;; 599 | 0) 600 | return 601 | ;; 602 | *) 603 | echo -e "${RED}无效选择${NC}" 604 | sleep 1 605 | ;; 606 | esac 607 | done 608 | } 609 | 610 | ########## 修改 AI 配置 ########## 611 | modify_config() { 612 | show_header 613 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 614 | echo -e "${CYAN}║${NC} ${BOLD}⚙️ 修改 AI 配置${NC} ${CYAN}║${NC}" 615 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 616 | echo 617 | echo -e "${YELLOW}直接回车保持当前值不变${NC}" 618 | echo 619 | 620 | local new_val 621 | 622 | read -rp " API 地址 [$PHONE_AGENT_BASE_URL]: " new_val 623 | [[ -n "$new_val" ]] && PHONE_AGENT_BASE_URL="$new_val" 624 | 625 | read -rp " 模型名称 [$PHONE_AGENT_MODEL]: " new_val 626 | [[ -n "$new_val" ]] && PHONE_AGENT_MODEL="$new_val" 627 | 628 | read -rp " API Key [$PHONE_AGENT_API_KEY]: " new_val 629 | [[ -n "$new_val" ]] && PHONE_AGENT_API_KEY="$new_val" 630 | 631 | read -rp " 最大步数 [$PHONE_AGENT_MAX_STEPS]: " new_val 632 | [[ -n "$new_val" ]] && PHONE_AGENT_MAX_STEPS="$new_val" 633 | 634 | read -rp " 设备 ID [${PHONE_AGENT_DEVICE_ID:-留空自动检测}]: " new_val 635 | PHONE_AGENT_DEVICE_ID="$new_val" 636 | 637 | read -rp " 语言 cn/en [$PHONE_AGENT_LANG]: " new_val 638 | [[ -n "$new_val" ]] && PHONE_AGENT_LANG="$new_val" 639 | 640 | save_config 641 | 642 | echo 643 | echo -e "${GREEN}[SUCC]${NC} 配置已保存并生效!" 644 | read -rp "按回车返回主菜单... " 645 | } 646 | 647 | ########## 查看详细配置 ########## 648 | view_config() { 649 | show_header 650 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 651 | echo -e "${CYAN}║${NC} ${BOLD}🔍 详细配置信息${NC} ${CYAN}║${NC}" 652 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 653 | echo 654 | echo -e "${BLUE}环境变量配置:${NC}" 655 | echo -e "┌────────────────────────┬────────────────────────────────────┐" 656 | printf "│ %-22s │ %-34s │\n" "变量名" "值" 657 | echo -e "├────────────────────────┼────────────────────────────────────┤" 658 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_BASE_URL" "$PHONE_AGENT_BASE_URL" 659 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_MODEL" "$PHONE_AGENT_MODEL" 660 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_API_KEY" "${PHONE_AGENT_API_KEY:0:20}..." 661 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_MAX_STEPS" "$PHONE_AGENT_MAX_STEPS" 662 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_DEVICE_ID" "${PHONE_AGENT_DEVICE_ID:-自动检测}" 663 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_LANG" "$PHONE_AGENT_LANG" 664 | echo -e "└────────────────────────┴────────────────────────────────────┘" 665 | echo 666 | echo -e "${BLUE}配置文件路径:${NC} $CONFIG_FILE" 667 | echo -e "${BLUE}项目目录:${NC} $AUTOGLM_DIR" 668 | echo 669 | read -rp "按回车返回主菜单... " 670 | } 671 | 672 | ########## 查看支持的应用 ########## 673 | list_apps() { 674 | show_header 675 | echo -e "${CYAN}正在获取支持的应用列表...${NC}" 676 | echo 677 | if [[ -d "$AUTOGLM_DIR" ]]; then 678 | cd "$AUTOGLM_DIR" 679 | python main.py --list-apps 2>/dev/null || echo -e "${RED}获取失败,请检查项目是否正确安装${NC}" 680 | else 681 | echo -e "${RED}项目目录不存在: $AUTOGLM_DIR${NC}" 682 | fi 683 | echo 684 | read -rp "按回车返回主菜单... " 685 | } 686 | 687 | ########## 查看 ADB 设备 ########## 688 | view_adb_devices() { 689 | show_header 690 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 691 | echo -e "${CYAN}║${NC} ${BOLD}🔌 ADB 设备列表${NC} ${CYAN}║${NC}" 692 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 693 | echo 694 | adb devices -l 2>/dev/null || echo "无法获取设备列表" 695 | echo 696 | read -rp "按回车返回主菜单... " 697 | } 698 | 699 | ########## 检测是否在 Termux 环境 ########## 700 | in_termux() { 701 | [[ -n "${TERMUX_VERSION:-}" ]] 702 | } 703 | 704 | ########## 询问是否执行操作 ########## 705 | ask_yes_no() { 706 | local prompt="$1" 707 | local default="${2:-n}" 708 | local answer 709 | 710 | if [[ "$default" == "y" ]]; then 711 | read -rp "$prompt (Y/n): " answer 712 | case "${answer:-y}" in 713 | [Nn]*) return 1 ;; 714 | *) return 0 ;; 715 | esac 716 | else 717 | read -rp "$prompt (y/N): " answer 718 | case "${answer:-n}" in 719 | [Yy]*) return 0 ;; 720 | *) return 1 ;; 721 | esac 722 | fi 723 | } 724 | 725 | ########## 卸载项目 pip 依赖 ########## 726 | uninstall_pip_deps() { 727 | local req_file="$AUTOGLM_DIR/requirements.txt" 728 | 729 | if [[ ! -f "$req_file" ]]; then 730 | echo -e "${YELLOW}[WARN]${NC} 未找到 requirements.txt,跳过 pip 依赖卸载" 731 | return 0 732 | fi 733 | 734 | echo -e "${BLUE}[INFO]${NC} 将卸载以下 pip 依赖包:" 735 | echo -e "${CYAN}────────────────────────────────────────${NC}" 736 | 737 | # 显示将要卸载的包 738 | local pkg_list=() 739 | while IFS= read -r pkg || [[ -n "$pkg" ]]; do 740 | # 跳过空行和注释 741 | [[ -z "$pkg" || "$pkg" =~ ^# ]] && continue 742 | # 提取包名(去掉版本号和extras) 743 | local pkg_name 744 | pkg_name=$(echo "$pkg" | sed -E 's/[<>=!].*//' | sed 's/\[.*\]//' | tr -d ' ') 745 | if [[ -n "$pkg_name" ]]; then 746 | pkg_list+=("$pkg_name") 747 | echo -e " • $pkg_name" 748 | fi 749 | done < "$req_file" 750 | 751 | # 添加项目本体 752 | echo -e " • open-autoglm (项目本体)" 753 | echo -e "${CYAN}────────────────────────────────────────${NC}" 754 | echo 755 | 756 | # 卸载项目本体 757 | echo -e "${BLUE}[INFO]${NC} 卸载项目本体..." 758 | python -m pip uninstall -y open-autoglm 2>/dev/null || true 759 | python -m pip uninstall -y autoglm 2>/dev/null || true 760 | python -m pip uninstall -y Open-AutoGLM 2>/dev/null || true 761 | 762 | # 卸载依赖包 763 | for pkg_name in "${pkg_list[@]}"; do 764 | echo -e "${BLUE}[INFO]${NC} 卸载 $pkg_name ..." 765 | python -m pip uninstall -y "$pkg_name" 2>/dev/null || true 766 | done 767 | 768 | echo -e "${GREEN}[SUCC]${NC} pip 依赖卸载完成" 769 | } 770 | 771 | ########## 卸载 Open-AutoGLM + 控制面板 ########## 772 | uninstall_basic() { 773 | show_header 774 | echo -e "${RED}╔══════════════════════════════════════════════════════════════╗${NC}" 775 | echo -e "${RED}║${NC} ${BOLD}🗑️ 卸载 Open-AutoGLM + 控制面板${NC} ${RED}║${NC}" 776 | echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}" 777 | echo 778 | echo -e "${YELLOW}此选项将引导您逐项选择要卸载的内容${NC}" 779 | echo 780 | 781 | local did_something=false 782 | 783 | # 1. 询问是否卸载 pip 依赖 784 | echo -e "${CYAN}━━━ 第 1 步:pip 依赖包 ━━━${NC}" 785 | if [[ -f "$AUTOGLM_DIR/requirements.txt" ]]; then 786 | echo -e "${YELLOW}检测到项目依赖文件:$AUTOGLM_DIR/requirements.txt${NC}" 787 | echo 788 | if ask_yes_no "是否卸载项目安装的 pip 依赖包?"; then 789 | uninstall_pip_deps 790 | did_something=true 791 | else 792 | echo -e "${BLUE}[INFO]${NC} 跳过 pip 依赖卸载" 793 | fi 794 | else 795 | echo -e "${YELLOW}[WARN]${NC} 未找到 requirements.txt,跳过此步骤" 796 | # 仍然尝试卸载项目本体 797 | if ask_yes_no "是否卸载项目本体包(open-autoglm)?"; then 798 | python -m pip uninstall -y open-autoglm 2>/dev/null || true 799 | python -m pip uninstall -y autoglm 2>/dev/null || true 800 | python -m pip uninstall -y Open-AutoGLM 2>/dev/null || true 801 | echo -e "${GREEN}[SUCC]${NC} 项目本体已卸载" 802 | did_something=true 803 | fi 804 | fi 805 | echo 806 | 807 | # 2. 询问是否删除项目目录 808 | echo -e "${CYAN}━━━ 第 2 步:项目目录 ━━━${NC}" 809 | if [[ -d "$AUTOGLM_DIR" ]]; then 810 | echo -e "${YELLOW}项目目录:$AUTOGLM_DIR${NC}" 811 | echo 812 | if ask_yes_no "是否删除 Open-AutoGLM 项目目录?"; then 813 | rm -rf "$AUTOGLM_DIR" 814 | echo -e "${GREEN}[SUCC]${NC} 已删除: $AUTOGLM_DIR" 815 | did_something=true 816 | else 817 | echo -e "${BLUE}[INFO]${NC} 保留项目目录" 818 | fi 819 | else 820 | echo -e "${YELLOW}[WARN]${NC} 项目目录不存在,跳过此步骤" 821 | fi 822 | echo 823 | 824 | # 3. 询问是否删除 autoglm 命令和配置文件 825 | echo -e "${CYAN}━━━ 第 3 步:autoglm 命令与配置文件 ━━━${NC}" 826 | echo -e "${YELLOW}包含以下内容:${NC}" 827 | echo -e " • autoglm 命令: ${CYAN}$HOME/bin/autoglm${NC}" 828 | echo -e " • 配置文件目录: ${CYAN}$HOME/.autoglm${NC}" 829 | echo -e " • .bashrc 中的环境变量配置" 830 | echo 831 | if ask_yes_no "是否删除 autoglm 命令、配置文件和环境变量?"; then 832 | # 删除 autoglm 命令 833 | if [[ -f "$HOME/bin/autoglm" ]]; then 834 | rm -f "$HOME/bin/autoglm" 835 | echo -e "${GREEN}[SUCC]${NC} 已删除: $HOME/bin/autoglm" 836 | fi 837 | 838 | # 删除配置文件目录 839 | if [[ -d "$HOME/.autoglm" ]]; then 840 | rm -rf "$HOME/.autoglm" 841 | echo -e "${GREEN}[SUCC]${NC} 已删除: $HOME/.autoglm" 842 | fi 843 | 844 | # 清理 .bashrc 中的配置 845 | if [[ -f "$HOME/.bashrc" ]]; then 846 | sed -i '/source ~\/.autoglm\/config.sh/d' "$HOME/.bashrc" 2>/dev/null || true 847 | sed -i '/source \$HOME\/.autoglm\/config.sh/d' "$HOME/.bashrc" 2>/dev/null || true 848 | echo -e "${GREEN}[SUCC]${NC} 已清理 .bashrc 中的环境变量" 849 | fi 850 | did_something=true 851 | else 852 | echo -e "${BLUE}[INFO]${NC} 保留 autoglm 命令和配置文件" 853 | fi 854 | echo 855 | 856 | # 显示结果 857 | if [[ "$did_something" == true ]]; then 858 | echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}" 859 | echo -e "${GREEN}║${NC} ${BOLD}✅ 卸载操作完成!${NC} ${GREEN}║${NC}" 860 | echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}" 861 | echo 862 | echo -e "${YELLOW}提示: 请重新打开终端以使更改生效${NC}" 863 | else 864 | echo -e "${BLUE}[INFO]${NC} 未执行任何卸载操作" 865 | fi 866 | echo 867 | read -rp "按回车继续... " 868 | 869 | # 如果删除了 autoglm 命令本身,需要退出 870 | if [[ ! -f "$HOME/bin/autoglm" ]]; then 871 | echo -e "${YELLOW}autoglm 命令已删除,即将退出...${NC}" 872 | exit 0 873 | fi 874 | } 875 | 876 | ########## 完全卸载 ########## 877 | uninstall_full() { 878 | show_header 879 | echo -e "${RED}╔══════════════════════════════════════════════════════════════╗${NC}" 880 | echo -e "${RED}║${NC} ${BOLD}🗑️ 完全卸载(包括运行环境)${NC} ${RED}║${NC}" 881 | echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}" 882 | echo 883 | echo -e "${YELLOW}此选项将引导您逐项选择要卸载的内容${NC}" 884 | echo -e "${RED}${BOLD}⚠️ 注意:卸载运行环境可能影响其他程序!${NC}" 885 | echo 886 | 887 | local did_something=false 888 | 889 | # 1. 询问是否卸载项目 pip 依赖 890 | echo -e "${CYAN}━━━ 第 1 步:项目 pip 依赖包 ━━━${NC}" 891 | if [[ -f "$AUTOGLM_DIR/requirements.txt" ]]; then 892 | echo -e "${YELLOW}检测到项目依赖文件:$AUTOGLM_DIR/requirements.txt${NC}" 893 | echo 894 | if ask_yes_no "是否卸载项目安装的 pip 依赖包?"; then 895 | uninstall_pip_deps 896 | did_something=true 897 | else 898 | echo -e "${BLUE}[INFO]${NC} 跳过项目 pip 依赖卸载" 899 | fi 900 | else 901 | echo -e "${YELLOW}[WARN]${NC} 未找到 requirements.txt" 902 | if ask_yes_no "是否卸载项目本体包(open-autoglm)?"; then 903 | python -m pip uninstall -y open-autoglm 2>/dev/null || true 904 | python -m pip uninstall -y autoglm 2>/dev/null || true 905 | python -m pip uninstall -y Open-AutoGLM 2>/dev/null || true 906 | echo -e "${GREEN}[SUCC]${NC} 项目本体已卸载" 907 | did_something=true 908 | fi 909 | fi 910 | echo 911 | 912 | # 2. 询问是否卸载部署时安装的核心 pip 包 913 | echo -e "${CYAN}━━━ 第 2 步:部署时安装的核心 pip 包 ━━━${NC}" 914 | echo -e "${YELLOW}包含以下包:${NC}" 915 | echo -e " • maturin" 916 | echo -e " • openai" 917 | echo -e " • requests" 918 | if ! in_termux; then 919 | echo -e " • pillow" 920 | fi 921 | echo 922 | if ask_yes_no "是否卸载这些核心 pip 包?"; then 923 | echo -e "${BLUE}[INFO]${NC} 卸载核心 pip 包..." 924 | python -m pip uninstall -y maturin 2>/dev/null || true 925 | python -m pip uninstall -y openai 2>/dev/null || true 926 | python -m pip uninstall -y requests 2>/dev/null || true 927 | if ! in_termux; then 928 | python -m pip uninstall -y pillow 2>/dev/null || true 929 | fi 930 | echo -e "${GREEN}[SUCC]${NC} 核心 pip 包已卸载" 931 | did_something=true 932 | else 933 | echo -e "${BLUE}[INFO]${NC} 保留核心 pip 包" 934 | fi 935 | echo 936 | 937 | # 3. 询问是否删除项目目录 938 | echo -e "${CYAN}━━━ 第 3 步:项目目录 ━━━${NC}" 939 | if [[ -d "$AUTOGLM_DIR" ]]; then 940 | echo -e "${YELLOW}项目目录:$AUTOGLM_DIR${NC}" 941 | echo 942 | if ask_yes_no "是否删除 Open-AutoGLM 项目目录?"; then 943 | rm -rf "$AUTOGLM_DIR" 944 | echo -e "${GREEN}[SUCC]${NC} 已删除: $AUTOGLM_DIR" 945 | did_something=true 946 | else 947 | echo -e "${BLUE}[INFO]${NC} 保留项目目录" 948 | fi 949 | else 950 | echo -e "${YELLOW}[WARN]${NC} 项目目录不存在,跳过此步骤" 951 | fi 952 | echo 953 | 954 | # 4. 询问是否删除 autoglm 命令和配置文件 955 | echo -e "${CYAN}━━━ 第 4 步:autoglm 命令与配置文件 ━━━${NC}" 956 | echo -e "${YELLOW}包含以下内容:${NC}" 957 | echo -e " • autoglm 命令: ${CYAN}$HOME/bin/autoglm${NC}" 958 | echo -e " • 配置文件目录: ${CYAN}$HOME/.autoglm${NC}" 959 | echo -e " • .bashrc 中的环境变量配置" 960 | echo 961 | if ask_yes_no "是否删除 autoglm 命令、配置文件和环境变量?"; then 962 | if [[ -f "$HOME/bin/autoglm" ]]; then 963 | rm -f "$HOME/bin/autoglm" 964 | echo -e "${GREEN}[SUCC]${NC} 已删除: $HOME/bin/autoglm" 965 | fi 966 | 967 | if [[ -d "$HOME/.autoglm" ]]; then 968 | rm -rf "$HOME/.autoglm" 969 | echo -e "${GREEN}[SUCC]${NC} 已删除: $HOME/.autoglm" 970 | fi 971 | 972 | if [[ -f "$HOME/.bashrc" ]]; then 973 | sed -i '/source ~\/.autoglm\/config.sh/d' "$HOME/.bashrc" 2>/dev/null || true 974 | sed -i '/source \$HOME\/.autoglm\/config.sh/d' "$HOME/.bashrc" 2>/dev/null || true 975 | echo -e "${GREEN}[SUCC]${NC} 已清理 .bashrc 中的环境变量" 976 | fi 977 | did_something=true 978 | else 979 | echo -e "${BLUE}[INFO]${NC} 保留 autoglm 命令和配置文件" 980 | fi 981 | echo 982 | 983 | # 5. 询问是否删除 pip 镜像配置 984 | echo -e "${CYAN}━━━ 第 5 步:pip 镜像配置 ━━━${NC}" 985 | local pip_mirror 986 | pip_mirror=$(pip config get global.index-url 2>/dev/null || echo "") 987 | if [[ -n "$pip_mirror" ]]; then 988 | echo -e "${YELLOW}当前 pip 镜像:$pip_mirror${NC}" 989 | echo 990 | if ask_yes_no "是否删除 pip 镜像配置?"; then 991 | pip config unset global.index-url 2>/dev/null || true 992 | pip config unset install.trusted-host 2>/dev/null || true 993 | echo -e "${GREEN}[SUCC]${NC} pip 镜像配置已删除" 994 | did_something=true 995 | else 996 | echo -e "${BLUE}[INFO]${NC} 保留 pip 镜像配置" 997 | fi 998 | else 999 | echo -e "${YELLOW}[INFO]${NC} 未检测到 pip 镜像配置,跳过此步骤" 1000 | fi 1001 | echo 1002 | 1003 | # 6. 询问是否删除 Cargo 镜像配置 1004 | echo -e "${CYAN}━━━ 第 6 步:Cargo 镜像配置 ━━━${NC}" 1005 | if [[ -f "$HOME/.cargo/config.toml" ]]; then 1006 | echo -e "${YELLOW}检测到 Cargo 配置:$HOME/.cargo/config.toml${NC}" 1007 | echo 1008 | if ask_yes_no "是否删除 Cargo 镜像配置?"; then 1009 | rm -f "$HOME/.cargo/config.toml" 1010 | rm -f "$HOME/.cargo/config" 1011 | echo -e "${GREEN}[SUCC]${NC} Cargo 镜像配置已删除" 1012 | did_something=true 1013 | else 1014 | echo -e "${BLUE}[INFO]${NC} 保留 Cargo 镜像配置" 1015 | fi 1016 | else 1017 | echo -e "${YELLOW}[INFO]${NC} 未检测到 Cargo 镜像配置,跳过此步骤" 1018 | fi 1019 | echo 1020 | 1021 | # 7. 在 Termux 中询问是否卸载系统包 1022 | if in_termux; then 1023 | echo -e "${CYAN}━━━ 第 7 步:Termux 系统包 ━━━${NC}" 1024 | echo -e "${RED}${BOLD}⚠️ 警告:卸载系统包可能影响其他程序!${NC}" 1025 | echo 1026 | 1027 | # python-pillow 1028 | if pkg list-installed 2>/dev/null | grep -q "python-pillow"; then 1029 | if ask_yes_no "是否卸载 python-pillow?"; then 1030 | pkg uninstall -y python-pillow 2>/dev/null || true 1031 | echo -e "${GREEN}[SUCC]${NC} python-pillow 已卸载" 1032 | did_something=true 1033 | fi 1034 | fi 1035 | 1036 | # rust 1037 | if command -v rustc &>/dev/null; then 1038 | if ask_yes_no "是否卸载 Rust 编译工具链(rust, binutils)?"; then 1039 | pkg uninstall -y rust binutils 2>/dev/null || true 1040 | echo -e "${GREEN}[SUCC]${NC} Rust 工具链已卸载" 1041 | did_something=true 1042 | fi 1043 | fi 1044 | 1045 | # android-tools (ADB) 1046 | if command -v adb &>/dev/null; then 1047 | if ask_yes_no "是否卸载 ADB 工具(android-tools)?"; then 1048 | pkg uninstall -y android-tools 2>/dev/null || true 1049 | echo -e "${GREEN}[SUCC]${NC} ADB 工具已卸载" 1050 | did_something=true 1051 | fi 1052 | fi 1053 | echo 1054 | fi 1055 | 1056 | # 显示结果 1057 | if [[ "$did_something" == true ]]; then 1058 | echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}" 1059 | echo -e "${GREEN}║${NC} ${BOLD}✅ 卸载操作完成!${NC} ${GREEN}║${NC}" 1060 | echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}" 1061 | echo 1062 | echo -e "${YELLOW}提示: 请重新打开终端以使更改生效${NC}" 1063 | else 1064 | echo -e "${BLUE}[INFO]${NC} 未执行任何卸载操作" 1065 | fi 1066 | echo 1067 | read -rp "按回车继续... " 1068 | 1069 | # 如果删除了 autoglm 命令本身,需要退出 1070 | if [[ ! -f "$HOME/bin/autoglm" ]]; then 1071 | echo -e "${YELLOW}autoglm 命令已删除,即将退出...${NC}" 1072 | exit 0 1073 | fi 1074 | } 1075 | 1076 | ########## 卸载子菜单 ########## 1077 | uninstall_menu() { 1078 | while true; do 1079 | show_header 1080 | echo -e "${RED}╔══════════════════════════════════════════════════════════════╗${NC}" 1081 | echo -e "${RED}║${NC} ${BOLD}🗑️ 一键卸载${NC} ${RED}║${NC}" 1082 | echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}" 1083 | echo 1084 | echo -e "${YELLOW}请选择卸载方式:${NC}" 1085 | echo 1086 | echo -e " ${GREEN}1.${NC} 🧹 卸载 Open-AutoGLM + autoglm 控制面板" 1087 | echo -e " ${CYAN}可选择性删除:pip依赖、项目目录、命令和配置${NC}" 1088 | echo 1089 | echo -e " ${GREEN}2.${NC} 💣 完全卸载(包括运行环境)" 1090 | echo -e " ${CYAN}除上述内容外,还可选择卸载:${NC}" 1091 | echo -e " ${CYAN}核心pip包、镜像配置、系统包等${NC}" 1092 | echo 1093 | echo -e " ${GREEN}0.${NC} ↩️ 返回主菜单" 1094 | echo 1095 | read -rp "请选择 [0-2]: " choice 1096 | 1097 | case "$choice" in 1098 | 1) 1099 | uninstall_basic 1100 | ;; 1101 | 2) 1102 | uninstall_full 1103 | ;; 1104 | 0) 1105 | return 1106 | ;; 1107 | *) 1108 | echo -e "${RED}无效选择${NC}" 1109 | sleep 1 1110 | ;; 1111 | esac 1112 | done 1113 | } 1114 | 1115 | ########## 启动 AutoGLM ########## 1116 | start_autoglm() { 1117 | local device_count 1118 | device_count=$(check_adb_devices) 1119 | 1120 | if [[ "$device_count" -eq 0 ]]; then 1121 | echo 1122 | echo -e "${RED}[ERROR]${NC} 未检测到 ADB 设备!" 1123 | echo -e "${YELLOW}请先配置 ADB 无线调试(菜单选项 2)${NC}" 1124 | echo 1125 | read -rp "是否现在配置 ADB?(Y/n): " ans 1126 | case "${ans:-y}" in 1127 | [Nn]*) 1128 | return 1 1129 | ;; 1130 | *) 1131 | adb_menu 1132 | device_count=$(check_adb_devices) 1133 | if [[ "$device_count" -eq 0 ]]; then 1134 | return 1 1135 | fi 1136 | ;; 1137 | esac 1138 | fi 1139 | 1140 | if [[ ! -d "$AUTOGLM_DIR" ]]; then 1141 | echo -e "${RED}[ERROR]${NC} 项目目录不存在: $AUTOGLM_DIR" 1142 | echo -e "${YELLOW}请重新运行 deploy.sh 安装${NC}" 1143 | read -rp "按回车返回... " 1144 | return 1 1145 | fi 1146 | 1147 | local CMD_ARGS=() 1148 | CMD_ARGS+=(--base-url "$PHONE_AGENT_BASE_URL") 1149 | CMD_ARGS+=(--model "$PHONE_AGENT_MODEL") 1150 | CMD_ARGS+=(--apikey "$PHONE_AGENT_API_KEY") 1151 | 1152 | [[ -n "${PHONE_AGENT_DEVICE_ID:-}" ]] && CMD_ARGS+=(--device-id "$PHONE_AGENT_DEVICE_ID") 1153 | 1154 | echo 1155 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 1156 | echo -e "${CYAN}║${NC} ${BOLD}🚀 启动 AutoGLM${NC} ${CYAN}║${NC}" 1157 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 1158 | echo 1159 | echo -e "${BLUE}配置信息:${NC}" 1160 | echo -e " API : ${GREEN}$PHONE_AGENT_BASE_URL${NC}" 1161 | echo -e " Model : ${GREEN}$PHONE_AGENT_MODEL${NC}" 1162 | echo -e " Steps : ${GREEN}$PHONE_AGENT_MAX_STEPS${NC}" 1163 | echo -e " Lang : ${GREEN}$PHONE_AGENT_LANG${NC}" 1164 | [[ -n "${PHONE_AGENT_DEVICE_ID:-}" ]] && echo -e " Device : ${GREEN}$PHONE_AGENT_DEVICE_ID${NC}" 1165 | echo 1166 | echo -e "${YELLOW}正在启动...${NC}" 1167 | echo 1168 | 1169 | cd "$AUTOGLM_DIR" 1170 | exec python main.py "${CMD_ARGS[@]}" 1171 | } 1172 | 1173 | ########## 解析命令行参数 ########## 1174 | parse_args() { 1175 | while [[ $# -gt 0 ]]; do 1176 | case $1 in 1177 | --base-url) 1178 | PHONE_AGENT_BASE_URL="$2" 1179 | shift 2 1180 | ;; 1181 | --model) 1182 | PHONE_AGENT_MODEL="$2" 1183 | shift 2 1184 | ;; 1185 | --apikey) 1186 | PHONE_AGENT_API_KEY="$2" 1187 | shift 2 1188 | ;; 1189 | --max-steps) 1190 | PHONE_AGENT_MAX_STEPS="$2" 1191 | shift 2 1192 | ;; 1193 | --device-id) 1194 | PHONE_AGENT_DEVICE_ID="$2" 1195 | shift 2 1196 | ;; 1197 | --lang) 1198 | PHONE_AGENT_LANG="$2" 1199 | shift 2 1200 | ;; 1201 | --list-apps) 1202 | cd "$AUTOGLM_DIR" 2>/dev/null && python main.py --list-apps 1203 | exit $? 1204 | ;; 1205 | --setup-adb) 1206 | load_config 1207 | adb_menu 1208 | exit 0 1209 | ;; 1210 | --reconfig) 1211 | load_config 1212 | modify_config 1213 | exit 0 1214 | ;; 1215 | --uninstall) 1216 | load_config 1217 | uninstall_menu 1218 | exit 0 1219 | ;; 1220 | --help|-h) 1221 | echo -e "${BOLD}${CYAN}AutoGLM - 智能手机控制代理${NC}" 1222 | echo 1223 | echo -e "${YELLOW}用法:${NC}" 1224 | echo " autoglm # 打开交互式菜单" 1225 | echo " autoglm --setup-adb # 配置 ADB" 1226 | echo " autoglm --reconfig # 修改配置" 1227 | echo " autoglm --list-apps # 查看支持的应用" 1228 | echo " autoglm --uninstall # 卸载" 1229 | echo 1230 | echo -e "${YELLOW}参数:${NC}" 1231 | echo " --base-url URL 设置 API 地址" 1232 | echo " --model NAME 设置模型名称" 1233 | echo " --apikey KEY 设置 API Key" 1234 | echo " --max-steps N 设置最大步数" 1235 | echo " --device-id ID 设置 ADB 设备 ID" 1236 | echo " --lang cn|en 设置语言" 1237 | exit 0 1238 | ;; 1239 | --start|-s) 1240 | DIRECT_START=true 1241 | shift 1242 | ;; 1243 | *) 1244 | echo -e "${RED}未知参数: $1${NC}" 1245 | echo "使用 --help 查看帮助" 1246 | exit 1 1247 | ;; 1248 | esac 1249 | done 1250 | } 1251 | 1252 | ########## 主菜单循环 ########## 1253 | main_menu_loop() { 1254 | while true; do 1255 | show_main_menu 1256 | read -rp "请选择 [0-7]: " choice 1257 | 1258 | case "$choice" in 1259 | 1) 1260 | start_autoglm 1261 | ;; 1262 | 2) 1263 | adb_menu 1264 | ;; 1265 | 3) 1266 | modify_config 1267 | ;; 1268 | 4) 1269 | list_apps 1270 | ;; 1271 | 5) 1272 | view_config 1273 | ;; 1274 | 6) 1275 | view_adb_devices 1276 | ;; 1277 | 7) 1278 | uninstall_menu 1279 | ;; 1280 | 0) 1281 | echo 1282 | echo -e "${GREEN}再见!${NC}" 1283 | exit 0 1284 | ;; 1285 | *) 1286 | echo -e "${RED}无效选择,请输入 0-7${NC}" 1287 | sleep 1 1288 | ;; 1289 | esac 1290 | done 1291 | } 1292 | 1293 | ########## 主入口 ########## 1294 | main() { 1295 | load_config 1296 | parse_args "$@" 1297 | 1298 | if [[ "${DIRECT_START:-false}" == true ]]; then 1299 | start_autoglm 1300 | exit $? 1301 | fi 1302 | 1303 | main_menu_loop 1304 | } 1305 | 1306 | main "$@" 1307 | LAUNCHER_EOF 1308 | 1309 | chmod +x ~/bin/autoglm 1310 | 1311 | if ! grep -q 'export PATH=.*~/bin' ~/.bashrc 2>/dev/null; then 1312 | echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc 1313 | fi 1314 | 1315 | log_succ "启动器已创建: ~/bin/autoglm" 1316 | } 1317 | 1318 | ########## 主流程 ########## 1319 | main() { 1320 | echo -e "${BLUE}╔══════════════════════════════════════════════════════════════╗${NC}" 1321 | echo -e "${BLUE}║${NC} ${BOLD}Open-AutoGLM 一键部署脚本 (ADB 纯方案)${NC} ${BLUE}║${NC}" 1322 | echo -e "${BLUE}║${NC} ${CYAN}版本: 4.3.2${NC} ${BLUE}║${NC}" 1323 | echo -e "${BLUE}╚══════════════════════════════════════════════════════════════╝${NC}" 1324 | echo 1325 | 1326 | log_info "检查并安装基础依赖..." 1327 | ensure_python 1328 | ensure_pip 1329 | ensure_git 1330 | ensure_rust 1331 | ensure_adb 1332 | 1333 | ensure_setuptools 1334 | 1335 | echo 1336 | 1337 | local pip_mirror="" cargo_mirror="" 1338 | ask_mirror "请输入 pip 镜像地址(阿里 https://mirrors.aliyun.com/pypi/simple)" \ 1339 | "https://mirrors.aliyun.com/pypi/simple" pip_mirror 1340 | ask_mirror "请输入 Cargo 镜像地址(清华 sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/)" \ 1341 | "sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/" cargo_mirror 1342 | setup_pip_mirror "$pip_mirror" 1343 | setup_cargo_mirror "$cargo_mirror" 1344 | 1345 | install_py_deps 1346 | 1347 | clone_or_update 1348 | 1349 | configure_env 1350 | 1351 | remind_adb_keyboard 1352 | 1353 | echo 1354 | if check_adb_configured; then 1355 | log_succ "检测到已连接的 ADB 设备:" 1356 | adb devices 1357 | read -rp "是否需要重新配置 ADB?(y/N): " reconf 1358 | if [[ "$reconf" == "y" || "$reconf" == "Y" ]]; then 1359 | configure_adb_wireless 1360 | fi 1361 | else 1362 | log_warn "未检测到 ADB 设备" 1363 | read -rp "是否现在配置 ADB 无线调试?(Y/n): " conf 1364 | case "${conf:-y}" in 1365 | [Nn]*) 1366 | log_info "跳过 ADB 配置,稍后可运行 autoglm 进行配置" 1367 | ;; 1368 | *) 1369 | configure_adb_wireless || log_warn "ADB 配置失败,稍后可运行 autoglm 重试" 1370 | ;; 1371 | esac 1372 | fi 1373 | 1374 | make_launcher 1375 | 1376 | source ~/.autoglm/config.sh 2>/dev/null || true 1377 | export PATH="$HOME/bin:$PATH" 1378 | 1379 | echo 1380 | echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}" 1381 | echo -e "${GREEN}║${NC} ${BOLD}✅ 部署完成!${NC} ${GREEN}║${NC}" 1382 | echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}" 1383 | echo 1384 | echo -e "运行 ${CYAN}autoglm${NC} 打开智能启动面板" 1385 | echo -e "运行 ${CYAN}autoglm --help${NC} 查看更多选项" 1386 | echo 1387 | echo -e "${YELLOW}提示: 新终端窗口自动加载配置,当前窗口请执行:${NC}" 1388 | echo -e " ${GREEN}source ~/.bashrc${NC}" 1389 | echo 1390 | } 1391 | 1392 | main "$@" 1393 | -------------------------------------------------------------------------------- /Old-Version/deploy_4.5.0.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Open-AutoGLM Termux 纯 ADB 方案 - 一键部署脚本 3 | # 版本: 4.5.0 (增强 ADB 设备管理) 4 | set -euo pipefail 5 | 6 | ########## 基础工具 ########## 7 | RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; PURPLE='\033[0;35m'; CYAN='\033[0;36m'; BOLD='\033[1m'; NC='\033[0m' 8 | log_info() { echo -e "${BLUE}[INFO]${NC} $*" >&2; } 9 | log_succ() { echo -e "${GREEN}[SUCC]${NC} $*" >&2; } 10 | log_warn() { echo -e "${YELLOW}[WARN]${NC} $*" >&2; } 11 | log_err() { echo -e "${RED}[ERROR]${NC} $*" >&2; } 12 | 13 | in_termux() { [[ -n "${TERMUX_VERSION:-}" ]]; } 14 | 15 | pkg_install() { 16 | if in_termux; then 17 | pkg install -y "$@" 18 | else 19 | if command -v apt-get &>/dev/null; then 20 | sudo apt-get update -y && sudo apt-get install -y "$@" 21 | elif command -v yum &>/dev/null; then 22 | sudo yum install -y "$@" 23 | elif command -v pacman &>/dev/null; then 24 | sudo pacman -Sy --noconfirm "$@" 25 | elif command -v brew &>/dev/null; then 26 | brew install "$@" || true 27 | else 28 | log_err "未找到适配的包管理器,请手动安装:$*" 29 | exit 1 30 | fi 31 | fi 32 | } 33 | 34 | ########## 镜像源配置 ########## 35 | ask_mirror() { 36 | local tip="$1" default="$2" var="$3" 37 | read -rp "${tip}(直接回车跳过,输入 default 使用推荐源): " input 38 | input="${input:-}" 39 | if [[ "$input" == "default" ]]; then 40 | input="$default" 41 | fi 42 | printf -v "$var" '%s' "$input" 43 | } 44 | 45 | setup_pip_mirror() { 46 | local url="$1" 47 | if [[ -z "$url" ]]; then 48 | log_info "跳过 pip 镜像配置" 49 | return 0 50 | fi 51 | log_info "设置 pip 镜像:$url" 52 | local host 53 | host=$(echo "$url" | sed -E 's|https?://([^/]+).*|\1|') 54 | pip config set global.index-url "$url" 2>/dev/null || true 55 | pip config set install.trusted-host "$host" 2>/dev/null || true 56 | } 57 | 58 | setup_cargo_mirror() { 59 | local url="$1" 60 | if [[ -z "$url" ]]; then 61 | log_info "跳过 Cargo 镜像配置" 62 | return 0 63 | fi 64 | log_info "设置 Cargo 镜像:$url" 65 | mkdir -p ~/.cargo 66 | rm -f ~/.cargo/config ~/.cargo/config.toml 67 | cat > ~/.cargo/config.toml </dev/null; then 82 | log_succ "Python 已存在:$(python --version)" 83 | else 84 | log_info "安装 Python..." 85 | pkg_install python 86 | fi 87 | } 88 | 89 | ensure_pip() { 90 | if python -m pip --version &>/dev/null; then 91 | log_succ "pip 已存在" 92 | else 93 | log_info "安装 python-pip..." 94 | pkg_install python-pip 95 | fi 96 | } 97 | 98 | ensure_git() { 99 | if command -v git &>/dev/null; then 100 | log_succ "Git 已存在:$(git --version)" 101 | else 102 | log_info "安装 Git..." 103 | pkg_install git 104 | fi 105 | } 106 | 107 | ensure_rust() { 108 | if command -v rustc &>/dev/null; then 109 | log_succ "Rust 已存在:$(rustc --version)" 110 | else 111 | log_info "安装 Rust 编译工具链..." 112 | pkg_install rust binutils 113 | fi 114 | } 115 | 116 | ensure_adb() { 117 | if command -v adb &>/dev/null; then 118 | log_succ "ADB 已存在:$(adb version | head -1)" 119 | return 0 120 | fi 121 | 122 | log_info "安装 ADB..." 123 | if in_termux; then 124 | pkg_install android-tools 125 | elif command -v apt-get &>/dev/null; then 126 | sudo apt-get update -y && sudo apt-get install -y adb 127 | elif command -v yum &>/dev/null; then 128 | sudo yum install -y android-tools 129 | elif command -v pacman &>/dev/null; then 130 | sudo pacman -Sy --noconfirm android-tools 131 | elif command -v brew &>/dev/null; then 132 | brew install android-platform-tools 133 | else 134 | log_warn "请手动安装 ADB 工具" 135 | return 1 136 | fi 137 | } 138 | 139 | ensure_setuptools() { 140 | log_info "确保 setuptools 已安装..." 141 | python -m pip install --upgrade setuptools wheel 2>/dev/null || true 142 | } 143 | 144 | ########## ADB 设备计数(修复算术错误) ########## 145 | get_adb_device_count() { 146 | local count 147 | # 匹配 device 状态(不是 offline/unauthorized 等) 148 | count=$(adb devices 2>/dev/null | awk 'NR>1 && $2=="device" {count++} END {print count+0}') 149 | echo "${count:-0}" | tr -d '[:space:]' 150 | } 151 | 152 | ########## ADB Keyboard 提醒 ########## 153 | remind_adb_keyboard() { 154 | echo 155 | echo -e "${YELLOW}╔══════════════════════════════════════════════════════════════╗${NC}" 156 | echo -e "${YELLOW}║${NC} ${BOLD}${RED}重要提醒:安装 ADB Keyboard${NC} ${YELLOW}║${NC}" 157 | echo -e "${YELLOW}╚══════════════════════════════════════════════════════════════╝${NC}" 158 | echo 159 | echo -e "${CYAN}此工具用于文本输入,必须安装!${NC}" 160 | echo 161 | echo -e "${BLUE}下载地址:${NC}" 162 | echo -e " ${GREEN}https://github.com/senzhk/ADBKeyBoard/blob/master/ADBKeyboard.apk${NC}" 163 | echo 164 | echo -e "${BLUE}安装步骤:${NC}" 165 | echo -e " ${GREEN}1.${NC} 下载并安装 ADBKeyboard.apk 到安卓设备" 166 | echo -e " ${GREEN}2.${NC} 进入 设置 → 系统 → 语言和输入法 → 虚拟键盘 → 管理键盘" 167 | echo -e " ${GREEN}3.${NC} 启用 'ADB Keyboard' 即可(可暂不切换)" 168 | echo -e " ${GREEN}4.${NC} 使用原输入法继续下面的配置" 169 | echo 170 | read -rp "已了解,按回车继续... " 171 | } 172 | 173 | ########## ADB 无线调试配置向导 ########## 174 | configure_adb_wireless() { 175 | echo 176 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 177 | echo -e "${CYAN}║${NC} ${BOLD}ADB 无线调试配置向导${NC} ${CYAN}║${NC}" 178 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 179 | echo 180 | echo -e "${BLUE}请按以下步骤操作:${NC}" 181 | echo -e " ${GREEN}1.${NC} 确保手机和 Termux 设备在同一 WiFi 网络下" 182 | echo -e " ${GREEN}2.${NC} 进入 设置 → 关于手机 → 连续点击版本号 7 次(开启开发者模式)" 183 | echo -e " ${GREEN}3.${NC} 返回 设置 → 系统 → 开发者选项" 184 | echo -e " ${GREEN}4.${NC} 开启 '无线调试'" 185 | echo -e " ${GREEN}5.${NC} ${YELLOW}建议:${NC} 将无线调试界面和 Termux 分屏显示" 186 | echo 187 | 188 | echo -e "${YELLOW}━━━ 第一步:配对设备 ━━━${NC}" 189 | echo -e "${CYAN}点击无线调试界面中的「使用配对码配对」${NC}" 190 | echo 191 | read -rp " 输入配对码弹窗显示的 IP:端口: " pair_host 192 | if [[ -z "$pair_host" ]]; then 193 | log_err "IP:端口不能为空!" 194 | return 1 195 | fi 196 | 197 | read -rp " 输入配对码(6 位数字): " pair_code 198 | if [[ -z "$pair_code" ]]; then 199 | log_err "配对码不能为空!" 200 | return 1 201 | fi 202 | 203 | log_info "正在配对 $pair_host ..." 204 | if adb pair "$pair_host" "$pair_code" 2>&1; then 205 | log_succ "配对成功!" 206 | else 207 | log_err "配对失败,请检查输入是否正确!" 208 | return 1 209 | fi 210 | 211 | echo 212 | echo -e "${YELLOW}━━━ 第二步:连接设备 ━━━${NC}" 213 | echo -e "${CYAN}查看无线调试主界面(不是配对码弹窗)显示的 IP 地址和端口${NC}" 214 | echo 215 | read -rp " 输入无线调试界面的 IP:端口: " connect_host 216 | if [[ -z "$connect_host" ]]; then 217 | log_err "IP:端口不能为空!" 218 | return 1 219 | fi 220 | 221 | log_info "正在连接 $connect_host ..." 222 | if adb connect "$connect_host" 2>&1; then 223 | sleep 1 224 | local count 225 | count=$(get_adb_device_count) 226 | if [[ "$count" -gt 0 ]]; then 227 | log_succ "连接成功!设备已就绪!" 228 | echo 229 | adb devices 230 | return 0 231 | else 232 | log_err "设备未正确连接,请重试!" 233 | return 1 234 | fi 235 | else 236 | log_err "连接失败,请检查 IP:端口 和网络连接!" 237 | return 1 238 | fi 239 | } 240 | 241 | check_adb_configured() { 242 | local count 243 | count=$(get_adb_device_count) 244 | [[ "$count" -gt 0 ]] 245 | } 246 | 247 | show_adb_devices() { 248 | echo 249 | log_info "当前 ADB 设备列表:" 250 | adb devices -l 2>/dev/null || echo " (无法获取设备列表)" 251 | echo 252 | } 253 | 254 | ########## Python 依赖 ########## 255 | install_py_deps() { 256 | log_info "安装/升级核心 Python 包..." 257 | ensure_setuptools 258 | 259 | if in_termux; then 260 | pkg_install python-pillow 261 | else 262 | python -m pip install --upgrade pillow 263 | fi 264 | 265 | echo 266 | echo -e "${YELLOW}╔══════════════════════════════════════════════════════════════╗${NC}" 267 | echo -e "${YELLOW}║${NC} ${BOLD}正在安装 openai 模块,请耐心等待...${NC} ${YELLOW}║${NC}" 268 | echo -e "${YELLOW}║${NC} ${CYAN}openai 的部分依赖需要 Rust 编译,可能耗时较长(5-15分钟)${NC} ${YELLOW}║${NC}" 269 | echo -e "${YELLOW}╚══════════════════════════════════════════════════════════════╝${NC}" 270 | echo 271 | 272 | python -m pip install --upgrade maturin openai requests 273 | } 274 | 275 | ########## 项目拉取/更新 ########## 276 | clone_or_update() { 277 | local dir="$HOME/Open-AutoGLM" 278 | if [[ -d $dir/.git ]]; then 279 | log_warn "检测到本地已存在 Open-AutoGLM 目录" 280 | read -rp "是否更新代码?(y/N): " ans 281 | case "${ans:-n}" in 282 | [Yy]*) 283 | log_info "正在更新代码..." 284 | git -C "$dir" pull --ff-only || log_warn "更新失败,使用本地代码" 285 | ;; 286 | *) 287 | log_info "跳过更新,使用本地代码" 288 | ;; 289 | esac 290 | else 291 | log_info "克隆仓库..." 292 | rm -rf "$dir" 293 | git clone https://github.com/zai-org/Open-AutoGLM.git "$dir" 294 | fi 295 | 296 | in_termux && sed -i '/[Pp]illow/d' "$dir/requirements.txt" 2>/dev/null || true 297 | 298 | log_info "安装项目依赖..." 299 | python -m pip install -r "$dir/requirements.txt" 300 | 301 | log_info "安装项目本体..." 302 | python -m pip install -e "$dir" 303 | } 304 | 305 | ########## 交互式配置 ########## 306 | configure_env() { 307 | mkdir -p ~/.autoglm 308 | 309 | local DEFAULT_BASE_URL="https://open.bigmodel.cn/api/paas/v4" 310 | local DEFAULT_MODEL="autoglm-phone" 311 | local DEFAULT_API_KEY="sk-your-apikey" 312 | local DEFAULT_MAX_STEPS="100" 313 | local DEFAULT_DEVICE_ID="" 314 | local DEFAULT_LANG="cn" 315 | 316 | echo 317 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 318 | echo -e "${CYAN}║${NC} ${BOLD}配置 Open-AutoGLM 参数${NC} ${CYAN}║${NC}" 319 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 320 | echo 321 | echo -e "${YELLOW}直接回车使用 [默认值]${NC}" 322 | echo 323 | 324 | read -rp " AI 接口 Base URL [${DEFAULT_BASE_URL}]: " base_url 325 | base_url=${base_url:-$DEFAULT_BASE_URL} 326 | 327 | read -rp " AI 模型名称 [${DEFAULT_MODEL}]: " model 328 | model=${model:-$DEFAULT_MODEL} 329 | 330 | read -rp " AI API Key [${DEFAULT_API_KEY}]: " api_key 331 | api_key=${api_key:-$DEFAULT_API_KEY} 332 | 333 | read -rp " 每任务最大步数 [${DEFAULT_MAX_STEPS}]: " max_steps 334 | max_steps=${max_steps:-$DEFAULT_MAX_STEPS} 335 | 336 | read -rp " ADB 设备 ID(单设备留空自动检测)[]: " device_id 337 | device_id=${device_id:-$DEFAULT_DEVICE_ID} 338 | 339 | read -rp " 语言 cn/en [${DEFAULT_LANG}]: " lang 340 | lang=${lang:-$DEFAULT_LANG} 341 | 342 | cat > ~/.autoglm/config.sh </dev/null || echo 'source ~/.autoglm/config.sh' >> ~/.bashrc 355 | 356 | log_succ "配置已保存到 ~/.autoglm/config.sh" 357 | } 358 | 359 | ########## 创建启动器脚本 ########## 360 | make_launcher() { 361 | mkdir -p ~/bin 362 | 363 | cat > ~/bin/autoglm <<'LAUNCHER_EOF' 364 | #!/bin/bash 365 | # AutoGLM 智能启动面板 366 | # 版本: 4.5.0 367 | 368 | ########## 颜色定义 ########## 369 | RED='\033[0;31m' 370 | GREEN='\033[0;32m' 371 | YELLOW='\033[1;33m' 372 | BLUE='\033[0;34m' 373 | PURPLE='\033[0;35m' 374 | CYAN='\033[0;36m' 375 | BOLD='\033[1m' 376 | NC='\033[0m' 377 | 378 | ########## 配置文件 ########## 379 | CONFIG_FILE="$HOME/.autoglm/config.sh" 380 | AUTOGLM_DIR="$HOME/Open-AutoGLM" 381 | 382 | ########## 加载配置 ########## 383 | load_config() { 384 | if [[ -f "$CONFIG_FILE" ]]; then 385 | source "$CONFIG_FILE" 386 | else 387 | export PHONE_AGENT_BASE_URL="https://open.bigmodel.cn/api/paas/v4" 388 | export PHONE_AGENT_MODEL="autoglm-phone" 389 | export PHONE_AGENT_API_KEY="sk-your-apikey" 390 | export PHONE_AGENT_MAX_STEPS="100" 391 | export PHONE_AGENT_DEVICE_ID="" 392 | export PHONE_AGENT_LANG="cn" 393 | fi 394 | } 395 | 396 | ########## 保存配置 ########## 397 | save_config() { 398 | mkdir -p ~/.autoglm 399 | cat > "$CONFIG_FILE" </dev/null | awk 'NR>1 && $2=="device" {count++} END {print count+0}') 438 | echo "${count:-0}" | tr -d '[:space:]' 439 | } 440 | 441 | ########## 获取所有设备数量(包括 offline) ########## 442 | get_adb_all_device_count() { 443 | local count 444 | count=$(adb devices 2>/dev/null | awk 'NR>1 && NF>=2 && $1!="" {count++} END {print count+0}') 445 | echo "${count:-0}" | tr -d '[:space:]' 446 | } 447 | 448 | ########## 解析设备信息 ########## 449 | # 返回格式: serial|status|model|type 450 | parse_device_info() { 451 | local line="$1" 452 | local serial status model device_type 453 | 454 | serial=$(echo "$line" | awk '{print $1}') 455 | status=$(echo "$line" | awk '{print $2}') 456 | 457 | # 提取 model 458 | model=$(echo "$line" | grep -oP 'model:\K[^ ]+' || echo "未知型号") 459 | 460 | # 判断连接类型 461 | if [[ "$serial" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+$ ]]; then 462 | device_type="无线" 463 | else 464 | device_type="USB" 465 | fi 466 | 467 | echo "${serial}|${status}|${model}|${device_type}" 468 | } 469 | 470 | ########## 获取状态显示文字 ########## 471 | get_status_display() { 472 | local status="$1" 473 | case "$status" in 474 | device) 475 | echo -e "${GREEN}在线${NC}" 476 | ;; 477 | offline) 478 | echo -e "${RED}离线${NC}" 479 | ;; 480 | unauthorized) 481 | echo -e "${YELLOW}未授权${NC}" 482 | ;; 483 | *) 484 | echo -e "${YELLOW}${status}${NC}" 485 | ;; 486 | esac 487 | } 488 | 489 | show_adb_status() { 490 | local online_count all_count 491 | online_count=$(get_adb_device_count) 492 | all_count=$(get_adb_all_device_count) 493 | 494 | if [[ "$online_count" -gt 0 ]]; then 495 | if [[ "$all_count" -gt "$online_count" ]]; then 496 | echo -e "${GREEN}━━━ ADB 状态: ✓ ${online_count} 台在线${NC} ${YELLOW}/ ${all_count} 台总计 ━━━${NC}" 497 | else 498 | echo -e "${GREEN}━━━ ADB 状态: ✓ 已连接 ${online_count} 台设备 ━━━${NC}" 499 | fi 500 | elif [[ "$all_count" -gt 0 ]]; then 501 | echo -e "${YELLOW}━━━ ADB 状态: ⚠ ${all_count} 台设备(均离线/未授权)━━━${NC}" 502 | else 503 | echo -e "${RED}━━━ ADB 状态: ✗ 未检测到设备 ━━━${NC}" 504 | fi 505 | echo 506 | } 507 | 508 | ########## 显示主菜单 ########## 509 | show_main_menu() { 510 | show_header 511 | show_adb_status 512 | show_current_config 513 | 514 | echo -e "${YELLOW}━━━ 主菜单 ━━━${NC}" 515 | echo 516 | echo -e " ${GREEN}1.${NC} 🚀 使用当前配置启动" 517 | echo -e " ${GREEN}2.${NC} 📱 ADB 设备管理" 518 | echo -e " ${GREEN}3.${NC} ⚙️ 修改 AI 配置" 519 | echo -e " ${GREEN}4.${NC} 📋 查看支持的应用列表" 520 | echo -e " ${GREEN}5.${NC} 🔍 查看详细配置" 521 | echo -e " ${GREEN}6.${NC} 🗑️ 一键卸载" 522 | echo -e " ${GREEN}0.${NC} ❌ 退出" 523 | echo 524 | } 525 | 526 | ########## ADB Keyboard 提醒 ########## 527 | remind_adb_keyboard() { 528 | show_header 529 | echo -e "${YELLOW}╔══════════════════════════════════════════════════════════════╗${NC}" 530 | echo -e "${YELLOW}║${NC} ${BOLD}${RED}⚠️ 重要提醒:安装 ADB Keyboard${NC} ${YELLOW}║${NC}" 531 | echo -e "${YELLOW}╚══════════════════════════════════════════════════════════════╝${NC}" 532 | echo 533 | echo -e "${CYAN}此工具用于文本输入,必须安装!${NC}" 534 | echo 535 | echo -e "${BLUE}下载地址:${NC}" 536 | echo -e " ${GREEN}https://github.com/senzhk/ADBKeyBoard/blob/master/ADBKeyboard.apk${NC}" 537 | echo 538 | echo -e "${BLUE}安装步骤:${NC}" 539 | echo -e " ${GREEN}1.${NC} 下载并安装 ADBKeyboard.apk 到安卓设备" 540 | echo -e " ${GREEN}2.${NC} 进入 ${YELLOW}设置 → 系统 → 语言和输入法 → 虚拟键盘 → 管理键盘${NC}" 541 | echo -e " ${GREEN}3.${NC} 开启 ${YELLOW}'ADB Keyboard'${NC}" 542 | echo -e " ${GREEN}4.${NC} 运行时需切换到 ADB Keyboard 输入法" 543 | echo 544 | read -rp "已了解,按回车继续... " 545 | } 546 | 547 | ########## 配置 ADB 无线调试 ########## 548 | configure_adb_wireless() { 549 | show_header 550 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 551 | echo -e "${CYAN}║${NC} ${BOLD}📱 ADB 无线调试配置向导${NC} ${CYAN}║${NC}" 552 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 553 | echo 554 | echo -e "${BLUE}请按以下步骤操作:${NC}" 555 | echo -e " ${GREEN}1.${NC} 确保手机和 Termux 设备在同一 WiFi 网络下" 556 | echo -e " ${GREEN}2.${NC} 进入 ${YELLOW}设置 → 关于手机 → 连续点击版本号 7 次${NC}(开启开发者模式)" 557 | echo -e " ${GREEN}3.${NC} 返回 ${YELLOW}设置 → 系统 → 开发者选项${NC}" 558 | echo -e " ${GREEN}4.${NC} 开启 ${YELLOW}'无线调试'${NC}" 559 | echo -e " ${GREEN}5.${NC} ${CYAN}建议:${NC} 将无线调试界面和 Termux 分屏显示" 560 | echo 561 | 562 | echo -e "${YELLOW}━━━ 第一步:配对设备 ━━━${NC}" 563 | echo -e "${CYAN}点击无线调试界面中的「使用配对码配对」${NC}" 564 | echo 565 | read -rp " 输入配对码弹窗显示的 IP:端口(如 192.168.1.13:42379): " pair_host 566 | if [[ -z "$pair_host" ]]; then 567 | echo -e "${RED}[ERROR] IP:端口不能为空!${NC}" 568 | read -rp "按回车返回... " 569 | return 1 570 | fi 571 | 572 | read -rp " 输入配对码(6 位数字): " pair_code 573 | if [[ -z "$pair_code" ]]; then 574 | echo -e "${RED}[ERROR] 配对码不能为空!${NC}" 575 | read -rp "按回车返回... " 576 | return 1 577 | fi 578 | 579 | echo -e "${BLUE}[INFO]${NC} 正在配对 $pair_host ..." 580 | if adb pair "$pair_host" "$pair_code" 2>&1; then 581 | echo -e "${GREEN}[SUCC]${NC} 配对成功!" 582 | else 583 | echo -e "${RED}[ERROR]${NC} 配对失败,请检查输入!" 584 | read -rp "按回车返回... " 585 | return 1 586 | fi 587 | 588 | echo 589 | echo -e "${YELLOW}━━━ 第二步:连接设备 ━━━${NC}" 590 | echo -e "${CYAN}查看无线调试主界面(不是配对码弹窗)显示的 IP 地址和端口${NC}" 591 | echo 592 | read -rp " 输入无线调试界面的 IP:端口(如 192.168.1.13:5555): " connect_host 593 | if [[ -z "$connect_host" ]]; then 594 | echo -e "${RED}[ERROR] IP:端口不能为空!${NC}" 595 | read -rp "按回车返回... " 596 | return 1 597 | fi 598 | 599 | echo -e "${BLUE}[INFO]${NC} 正在连接 $connect_host ..." 600 | if adb connect "$connect_host" 2>&1; then 601 | sleep 1 602 | local count 603 | count=$(get_adb_device_count) 604 | if [[ "$count" -gt 0 ]]; then 605 | echo 606 | echo -e "${GREEN}[SUCC]${NC} 连接成功!设备已就绪!" 607 | echo 608 | adb devices -l 609 | echo 610 | read -rp "按回车返回... " 611 | return 0 612 | fi 613 | fi 614 | 615 | echo -e "${RED}[ERROR]${NC} 连接失败,请检查 IP:端口 和网络!" 616 | read -rp "按回车返回... " 617 | return 1 618 | } 619 | 620 | ########## 显示设备详细列表 ########## 621 | show_device_list() { 622 | show_header 623 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 624 | echo -e "${CYAN}║${NC} ${BOLD}📋 ADB 设备详细列表${NC} ${CYAN}║${NC}" 625 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 626 | echo 627 | 628 | local all_count 629 | all_count=$(get_adb_all_device_count) 630 | 631 | if [[ "$all_count" -eq 0 ]]; then 632 | echo -e "${YELLOW}未检测到任何设备${NC}" 633 | echo 634 | read -rp "按回车返回... " 635 | return 636 | fi 637 | 638 | echo -e "${BLUE}设备列表:${NC}" 639 | echo -e "┌────┬────────────────────────┬──────────┬────────────────┬────────┐" 640 | printf "│ %-2s │ %-22s │ %-8s │ %-14s │ %-6s │\n" "序" "设备地址" "状态" "型号" "类型" 641 | echo -e "├────┼────────────────────────┼──────────┼────────────────┼────────┤" 642 | 643 | local i=1 644 | while IFS= read -r line; do 645 | [[ -z "$line" ]] && continue 646 | local info serial status model dtype status_display 647 | info=$(parse_device_info "$line") 648 | IFS='|' read -r serial status model dtype <<< "$info" 649 | status_display=$(get_status_display "$status") 650 | 651 | # 截断过长的字段 652 | [[ ${#serial} -gt 22 ]] && serial="${serial:0:19}..." 653 | [[ ${#model} -gt 14 ]] && model="${model:0:11}..." 654 | 655 | # 标记当前选中的设备 656 | local marker="" 657 | if [[ "$serial" == "${PHONE_AGENT_DEVICE_ID:-}" ]]; then 658 | marker="${GREEN}*${NC}" 659 | fi 660 | 661 | printf "│ ${GREEN}%-2s${NC} │ %-22s │ %b │ %-14s │ %-6s │%b\n" "$i" "$serial" "$status_display" "$model" "$dtype" "$marker" 662 | ((i++)) 663 | done < <(adb devices -l 2>/dev/null | awk 'NR>1 && NF>=2 && $1!=""') 664 | 665 | echo -e "└────┴────────────────────────┴──────────┴────────────────┴────────┘" 666 | 667 | if [[ -n "${PHONE_AGENT_DEVICE_ID:-}" ]]; then 668 | echo -e "\n${GREEN}*${NC} 表示当前选中的设备" 669 | fi 670 | echo 671 | read -rp "按回车返回... " 672 | } 673 | 674 | ########## 切换 ADB 设备 ########## 675 | switch_adb_device() { 676 | show_header 677 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 678 | echo -e "${CYAN}║${NC} ${BOLD}🔄 切换 ADB 设备${NC} ${CYAN}║${NC}" 679 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 680 | echo 681 | 682 | local all_count 683 | all_count=$(get_adb_all_device_count) 684 | 685 | if [[ "$all_count" -eq 0 ]]; then 686 | echo -e "${RED}[ERROR]${NC} 未检测到任何 ADB 设备!" 687 | echo -e "${YELLOW}请先配置 ADB 无线调试连接设备${NC}" 688 | echo 689 | read -rp "按回车返回... " 690 | return 1 691 | fi 692 | 693 | echo -e "${BLUE}可选设备:${NC}" 694 | echo -e "${CYAN}────────────────────────────────────────────────────────────────${NC}" 695 | 696 | # 收集设备信息 697 | local devices=() 698 | local statuses=() 699 | local models=() 700 | local dtypes=() 701 | local i=1 702 | 703 | while IFS= read -r line; do 704 | [[ -z "$line" ]] && continue 705 | local info serial status model dtype status_display 706 | info=$(parse_device_info "$line") 707 | IFS='|' read -r serial status model dtype <<< "$info" 708 | status_display=$(get_status_display "$status") 709 | 710 | devices+=("$serial") 711 | statuses+=("$status") 712 | models+=("$model") 713 | dtypes+=("$dtype") 714 | 715 | local marker="" 716 | if [[ "$serial" == "${PHONE_AGENT_DEVICE_ID:-}" ]]; then 717 | marker=" ${GREEN}[当前]${NC}" 718 | fi 719 | 720 | echo -e " ${GREEN}$i.${NC} $serial - ${CYAN}$model${NC} ($dtype) [${status_display}]${marker}" 721 | ((i++)) 722 | done < <(adb devices -l 2>/dev/null | awk 'NR>1 && NF>=2 && $1!=""') 723 | 724 | echo -e "${CYAN}────────────────────────────────────────────────────────────────${NC}" 725 | echo 726 | echo -e " ${GREEN}0.${NC} 留空(自动检测,适用于单设备)" 727 | echo -e " ${GREEN}c.${NC} 取消返回" 728 | echo 729 | 730 | read -rp "请选择要使用的设备 [1-$((i-1))/0/c]: " choice 731 | 732 | case "$choice" in 733 | c|C) 734 | return 0 735 | ;; 736 | 0) 737 | PHONE_AGENT_DEVICE_ID="" 738 | save_config 739 | echo -e "${GREEN}[SUCC]${NC} 已设置为自动检测模式" 740 | read -rp "按回车继续... " 741 | ;; 742 | *) 743 | if [[ "$choice" =~ ^[0-9]+$ ]] && [[ "$choice" -ge 1 ]] && [[ "$choice" -le "${#devices[@]}" ]]; then 744 | local idx=$((choice-1)) 745 | local selected_device="${devices[$idx]}" 746 | local selected_status="${statuses[$idx]}" 747 | 748 | if [[ "$selected_status" != "device" ]]; then 749 | echo -e "${YELLOW}[WARN]${NC} 该设备当前状态为 ${selected_status},可能无法正常使用" 750 | read -rp "是否仍要选择?(y/N): " confirm 751 | if [[ ! "$confirm" =~ ^[Yy]$ ]]; then 752 | return 0 753 | fi 754 | fi 755 | 756 | PHONE_AGENT_DEVICE_ID="$selected_device" 757 | save_config 758 | echo -e "${GREEN}[SUCC]${NC} 已切换到设备: ${CYAN}$PHONE_AGENT_DEVICE_ID${NC}" 759 | read -rp "按回车继续... " 760 | else 761 | echo -e "${RED}无效选择${NC}" 762 | read -rp "按回车继续... " 763 | fi 764 | ;; 765 | esac 766 | } 767 | 768 | ########## 断开指定设备 ########## 769 | disconnect_device() { 770 | show_header 771 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 772 | echo -e "${CYAN}║${NC} ${BOLD}🔌 断开 ADB 设备${NC} ${CYAN}║${NC}" 773 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 774 | echo 775 | 776 | local all_count 777 | all_count=$(get_adb_all_device_count) 778 | 779 | if [[ "$all_count" -eq 0 ]]; then 780 | echo -e "${YELLOW}当前没有已连接的设备${NC}" 781 | echo 782 | read -rp "按回车返回... " 783 | return 784 | fi 785 | 786 | echo -e "${BLUE}已连接的设备:${NC}" 787 | echo -e "${CYAN}────────────────────────────────────────────────────────────────${NC}" 788 | 789 | local devices=() 790 | local dtypes=() 791 | local i=1 792 | 793 | while IFS= read -r line; do 794 | [[ -z "$line" ]] && continue 795 | local info serial status model dtype status_display 796 | info=$(parse_device_info "$line") 797 | IFS='|' read -r serial status model dtype <<< "$info" 798 | status_display=$(get_status_display "$status") 799 | 800 | devices+=("$serial") 801 | dtypes+=("$dtype") 802 | 803 | echo -e " ${GREEN}$i.${NC} $serial - ${CYAN}$model${NC} ($dtype) [${status_display}]" 804 | ((i++)) 805 | done < <(adb devices -l 2>/dev/null | awk 'NR>1 && NF>=2 && $1!=""') 806 | 807 | echo -e "${CYAN}────────────────────────────────────────────────────────────────${NC}" 808 | echo 809 | echo -e " ${GREEN}a.${NC} 断开所有无线设备" 810 | echo -e " ${GREEN}r.${NC} 重启 ADB 服务(断开所有设备)" 811 | echo -e " ${GREEN}c.${NC} 取消返回" 812 | echo 813 | 814 | read -rp "请选择要断开的设备 [1-$((i-1))/a/r/c]: " choice 815 | 816 | case "$choice" in 817 | c|C) 818 | return 0 819 | ;; 820 | a|A) 821 | echo -e "${BLUE}[INFO]${NC} 断开所有无线设备..." 822 | adb disconnect 2>/dev/null || true 823 | echo -e "${GREEN}[SUCC]${NC} 已断开所有无线设备" 824 | sleep 1 825 | adb devices 826 | read -rp "按回车继续... " 827 | ;; 828 | r|R) 829 | echo -e "${YELLOW}[WARN]${NC} 重启 ADB 服务将断开所有设备(包括 USB)" 830 | read -rp "确认重启?(y/N): " confirm 831 | if [[ "$confirm" =~ ^[Yy]$ ]]; then 832 | echo -e "${BLUE}[INFO]${NC} 正在重启 ADB 服务..." 833 | adb kill-server 2>/dev/null || true 834 | sleep 1 835 | adb start-server 2>/dev/null || true 836 | echo -e "${GREEN}[SUCC]${NC} ADB 服务已重启" 837 | sleep 1 838 | adb devices 839 | fi 840 | read -rp "按回车继续... " 841 | ;; 842 | *) 843 | if [[ "$choice" =~ ^[0-9]+$ ]] && [[ "$choice" -ge 1 ]] && [[ "$choice" -le "${#devices[@]}" ]]; then 844 | local idx=$((choice-1)) 845 | local selected_device="${devices[$idx]}" 846 | local selected_type="${dtypes[$idx]}" 847 | 848 | if [[ "$selected_type" == "无线" ]]; then 849 | echo -e "${BLUE}[INFO]${NC} 断开无线设备: $selected_device" 850 | adb disconnect "$selected_device" 2>&1 851 | echo -e "${GREEN}[SUCC]${NC} 已断开: $selected_device" 852 | 853 | # 如果断开的是当前选中的设备,清空配置 854 | if [[ "$selected_device" == "${PHONE_AGENT_DEVICE_ID:-}" ]]; then 855 | PHONE_AGENT_DEVICE_ID="" 856 | save_config 857 | echo -e "${YELLOW}[INFO]${NC} 已清除当前设备选择" 858 | fi 859 | else 860 | echo -e "${YELLOW}[WARN]${NC} USB 设备无法通过软件断开" 861 | echo -e "${CYAN}请物理拔除 USB 线缆,或选择 'r' 重启 ADB 服务${NC}" 862 | fi 863 | read -rp "按回车继续... " 864 | else 865 | echo -e "${RED}无效选择${NC}" 866 | read -rp "按回车继续... " 867 | fi 868 | ;; 869 | esac 870 | } 871 | 872 | ########## 快速连接设备 ########## 873 | quick_connect() { 874 | show_header 875 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 876 | echo -e "${CYAN}║${NC} ${BOLD}⚡ 快速连接${NC} ${CYAN}║${NC}" 877 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 878 | echo 879 | echo -e "${YELLOW}适用于已配对过的设备${NC}" 880 | echo 881 | read -rp "输入设备 IP:端口(如 192.168.1.13:5555): " connect_host 882 | 883 | if [[ -z "$connect_host" ]]; then 884 | echo -e "${RED}[ERROR]${NC} IP:端口不能为空" 885 | read -rp "按回车返回... " 886 | return 1 887 | fi 888 | 889 | echo -e "${BLUE}[INFO]${NC} 正在连接 $connect_host ..." 890 | if adb connect "$connect_host" 2>&1; then 891 | sleep 1 892 | local count 893 | count=$(get_adb_device_count) 894 | if [[ "$count" -gt 0 ]]; then 895 | echo -e "${GREEN}[SUCC]${NC} 连接成功!" 896 | echo 897 | adb devices -l 898 | else 899 | echo -e "${YELLOW}[WARN]${NC} 连接可能未完全成功,请检查设备状态" 900 | adb devices -l 901 | fi 902 | else 903 | echo -e "${RED}[ERROR]${NC} 连接失败" 904 | fi 905 | echo 906 | read -rp "按回车继续... " 907 | } 908 | 909 | ########## ADB 设备管理菜单 ########## 910 | adb_menu() { 911 | while true; do 912 | show_header 913 | show_adb_status 914 | 915 | # 显示当前选中的设备 916 | if [[ -n "${PHONE_AGENT_DEVICE_ID:-}" ]]; then 917 | echo -e "${BLUE}当前选中设备:${NC} ${GREEN}$PHONE_AGENT_DEVICE_ID${NC}" 918 | echo 919 | fi 920 | 921 | echo -e "${YELLOW}━━━ ADB 设备管理 ━━━${NC}" 922 | echo 923 | echo -e " ${GREEN}1.${NC} 📱 配对新设备(配对+连接)" 924 | echo -e " ${GREEN}2.${NC} ⚡ 快速连接(已配对过)" 925 | echo -e " ${GREEN}3.${NC} 📋 查看设备详细列表" 926 | echo -e " ${GREEN}4.${NC} 🔄 切换活动设备" 927 | echo -e " ${GREEN}5.${NC} 🔌 断开设备连接" 928 | echo -e " ${GREEN}6.${NC} ❓ ADB Keyboard 安装说明" 929 | echo -e " ${GREEN}0.${NC} ↩️ 返回主菜单" 930 | echo 931 | read -rp "请选择 [0-6]: " choice 932 | 933 | case "$choice" in 934 | 1) 935 | configure_adb_wireless 936 | ;; 937 | 2) 938 | quick_connect 939 | ;; 940 | 3) 941 | show_device_list 942 | ;; 943 | 4) 944 | switch_adb_device 945 | ;; 946 | 5) 947 | disconnect_device 948 | ;; 949 | 6) 950 | remind_adb_keyboard 951 | ;; 952 | 0) 953 | return 954 | ;; 955 | *) 956 | echo -e "${RED}无效选择${NC}" 957 | sleep 1 958 | ;; 959 | esac 960 | done 961 | } 962 | 963 | ########## 修改 AI 配置 ########## 964 | modify_config() { 965 | show_header 966 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 967 | echo -e "${CYAN}║${NC} ${BOLD}⚙️ 修改 AI 配置${NC} ${CYAN}║${NC}" 968 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 969 | echo 970 | echo -e "${YELLOW}直接回车保持当前值不变${NC}" 971 | echo 972 | 973 | local new_val 974 | 975 | read -rp " API 地址 [$PHONE_AGENT_BASE_URL]: " new_val 976 | [[ -n "$new_val" ]] && PHONE_AGENT_BASE_URL="$new_val" 977 | 978 | read -rp " 模型名称 [$PHONE_AGENT_MODEL]: " new_val 979 | [[ -n "$new_val" ]] && PHONE_AGENT_MODEL="$new_val" 980 | 981 | read -rp " API Key [$PHONE_AGENT_API_KEY]: " new_val 982 | [[ -n "$new_val" ]] && PHONE_AGENT_API_KEY="$new_val" 983 | 984 | read -rp " 最大步数 [$PHONE_AGENT_MAX_STEPS]: " new_val 985 | [[ -n "$new_val" ]] && PHONE_AGENT_MAX_STEPS="$new_val" 986 | 987 | read -rp " 设备 ID [${PHONE_AGENT_DEVICE_ID:-留空自动检测}]: " new_val 988 | PHONE_AGENT_DEVICE_ID="$new_val" 989 | 990 | read -rp " 语言 cn/en [$PHONE_AGENT_LANG]: " new_val 991 | [[ -n "$new_val" ]] && PHONE_AGENT_LANG="$new_val" 992 | 993 | save_config 994 | 995 | echo 996 | echo -e "${GREEN}[SUCC]${NC} 配置已保存并生效!" 997 | read -rp "按回车返回主菜单... " 998 | } 999 | 1000 | ########## 查看详细配置 ########## 1001 | view_config() { 1002 | show_header 1003 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 1004 | echo -e "${CYAN}║${NC} ${BOLD}🔍 详细配置信息${NC} ${CYAN}║${NC}" 1005 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 1006 | echo 1007 | echo -e "${BLUE}环境变量配置:${NC}" 1008 | echo -e "┌────────────────────────┬────────────────────────────────────┐" 1009 | printf "│ %-22s │ %-34s │\n" "变量名" "值" 1010 | echo -e "├────────────────────────┼────────────────────────────────────┤" 1011 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_BASE_URL" "$PHONE_AGENT_BASE_URL" 1012 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_MODEL" "$PHONE_AGENT_MODEL" 1013 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_API_KEY" "${PHONE_AGENT_API_KEY:0:20}..." 1014 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_MAX_STEPS" "$PHONE_AGENT_MAX_STEPS" 1015 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_DEVICE_ID" "${PHONE_AGENT_DEVICE_ID:-自动检测}" 1016 | printf "│ %-22s │ %-34s │\n" "PHONE_AGENT_LANG" "$PHONE_AGENT_LANG" 1017 | echo -e "└────────────────────────┴────────────────────────────────────┘" 1018 | echo 1019 | echo -e "${BLUE}配置文件路径:${NC} $CONFIG_FILE" 1020 | echo -e "${BLUE}项目目录:${NC} $AUTOGLM_DIR" 1021 | echo 1022 | read -rp "按回车返回主菜单... " 1023 | } 1024 | 1025 | ########## 查看支持的应用 ########## 1026 | list_apps() { 1027 | show_header 1028 | echo -e "${CYAN}正在获取支持的应用列表...${NC}" 1029 | echo 1030 | if [[ -d "$AUTOGLM_DIR" ]]; then 1031 | cd "$AUTOGLM_DIR" 1032 | python main.py --list-apps 2>/dev/null || echo -e "${RED}获取失败,请检查项目是否正确安装${NC}" 1033 | else 1034 | echo -e "${RED}项目目录不存在: $AUTOGLM_DIR${NC}" 1035 | fi 1036 | echo 1037 | read -rp "按回车返回主菜单... " 1038 | } 1039 | 1040 | ########## 检测是否在 Termux 环境 ########## 1041 | in_termux() { 1042 | [[ -n "${TERMUX_VERSION:-}" ]] 1043 | } 1044 | 1045 | ########## 询问是否执行操作 ########## 1046 | ask_yes_no() { 1047 | local prompt="$1" 1048 | local default="${2:-n}" 1049 | local answer 1050 | 1051 | if [[ "$default" == "y" ]]; then 1052 | read -rp "$prompt (Y/n): " answer 1053 | case "${answer:-y}" in 1054 | [Nn]*) return 1 ;; 1055 | *) return 0 ;; 1056 | esac 1057 | else 1058 | read -rp "$prompt (y/N): " answer 1059 | case "${answer:-n}" in 1060 | [Yy]*) return 0 ;; 1061 | *) return 1 ;; 1062 | esac 1063 | fi 1064 | } 1065 | 1066 | ########## 卸载项目 pip 依赖 ########## 1067 | uninstall_pip_deps() { 1068 | local req_file="$AUTOGLM_DIR/requirements.txt" 1069 | 1070 | if [[ ! -f "$req_file" ]]; then 1071 | echo -e "${YELLOW}[WARN]${NC} 未找到 requirements.txt,跳过 pip 依赖卸载" 1072 | return 0 1073 | fi 1074 | 1075 | echo -e "${BLUE}[INFO]${NC} 将卸载以下 pip 依赖包:" 1076 | echo -e "${CYAN}────────────────────────────────────────${NC}" 1077 | 1078 | local pkg_list=() 1079 | while IFS= read -r pkg || [[ -n "$pkg" ]]; do 1080 | [[ -z "$pkg" || "$pkg" =~ ^# ]] && continue 1081 | local pkg_name 1082 | pkg_name=$(echo "$pkg" | sed -E 's/[<>=!].*//' | sed 's/\[.*\]//' | tr -d ' ') 1083 | if [[ -n "$pkg_name" ]]; then 1084 | pkg_list+=("$pkg_name") 1085 | echo -e " • $pkg_name" 1086 | fi 1087 | done < "$req_file" 1088 | 1089 | echo -e " • open-autoglm (项目本体)" 1090 | echo -e "${CYAN}────────────────────────────────────────${NC}" 1091 | echo 1092 | 1093 | echo -e "${BLUE}[INFO]${NC} 卸载项目本体..." 1094 | python -m pip uninstall -y open-autoglm 2>/dev/null || true 1095 | python -m pip uninstall -y autoglm 2>/dev/null || true 1096 | python -m pip uninstall -y Open-AutoGLM 2>/dev/null || true 1097 | 1098 | for pkg_name in "${pkg_list[@]}"; do 1099 | echo -e "${BLUE}[INFO]${NC} 卸载 $pkg_name ..." 1100 | python -m pip uninstall -y "$pkg_name" 2>/dev/null || true 1101 | done 1102 | 1103 | echo -e "${GREEN}[SUCC]${NC} pip 依赖卸载完成" 1104 | } 1105 | 1106 | ########## 卸载 Open-AutoGLM + 控制面板 ########## 1107 | uninstall_basic() { 1108 | show_header 1109 | echo -e "${RED}╔══════════════════════════════════════════════════════════════╗${NC}" 1110 | echo -e "${RED}║${NC} ${BOLD}🗑️ 卸载 Open-AutoGLM + 控制面板${NC} ${RED}║${NC}" 1111 | echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}" 1112 | echo 1113 | echo -e "${YELLOW}此选项将引导您逐项选择要卸载的内容${NC}" 1114 | echo 1115 | 1116 | local did_something=false 1117 | 1118 | echo -e "${CYAN}━━━ 第 1 步:pip 依赖包 ━━━${NC}" 1119 | if [[ -f "$AUTOGLM_DIR/requirements.txt" ]]; then 1120 | echo -e "${YELLOW}检测到项目依赖文件:$AUTOGLM_DIR/requirements.txt${NC}" 1121 | echo 1122 | if ask_yes_no "是否卸载项目安装的 pip 依赖包?"; then 1123 | uninstall_pip_deps 1124 | did_something=true 1125 | else 1126 | echo -e "${BLUE}[INFO]${NC} 跳过 pip 依赖卸载" 1127 | fi 1128 | else 1129 | echo -e "${YELLOW}[WARN]${NC} 未找到 requirements.txt,跳过此步骤" 1130 | if ask_yes_no "是否卸载项目本体包(open-autoglm)?"; then 1131 | python -m pip uninstall -y open-autoglm 2>/dev/null || true 1132 | python -m pip uninstall -y autoglm 2>/dev/null || true 1133 | python -m pip uninstall -y Open-AutoGLM 2>/dev/null || true 1134 | echo -e "${GREEN}[SUCC]${NC} 项目本体已卸载" 1135 | did_something=true 1136 | fi 1137 | fi 1138 | echo 1139 | 1140 | echo -e "${CYAN}━━━ 第 2 步:项目目录 ━━━${NC}" 1141 | if [[ -d "$AUTOGLM_DIR" ]]; then 1142 | echo -e "${YELLOW}项目目录:$AUTOGLM_DIR${NC}" 1143 | echo 1144 | if ask_yes_no "是否删除 Open-AutoGLM 项目目录?"; then 1145 | rm -rf "$AUTOGLM_DIR" 1146 | echo -e "${GREEN}[SUCC]${NC} 已删除: $AUTOGLM_DIR" 1147 | did_something=true 1148 | else 1149 | echo -e "${BLUE}[INFO]${NC} 保留项目目录" 1150 | fi 1151 | else 1152 | echo -e "${YELLOW}[WARN]${NC} 项目目录不存在,跳过此步骤" 1153 | fi 1154 | echo 1155 | 1156 | echo -e "${CYAN}━━━ 第 3 步:autoglm 命令与配置文件 ━━━${NC}" 1157 | echo -e "${YELLOW}包含以下内容:${NC}" 1158 | echo -e " • autoglm 命令: ${CYAN}$HOME/bin/autoglm${NC}" 1159 | echo -e " • 配置文件目录: ${CYAN}$HOME/.autoglm${NC}" 1160 | echo -e " • .bashrc 中的环境变量配置" 1161 | echo 1162 | if ask_yes_no "是否删除 autoglm 命令、配置文件和环境变量?"; then 1163 | if [[ -f "$HOME/bin/autoglm" ]]; then 1164 | rm -f "$HOME/bin/autoglm" 1165 | echo -e "${GREEN}[SUCC]${NC} 已删除: $HOME/bin/autoglm" 1166 | fi 1167 | 1168 | if [[ -d "$HOME/.autoglm" ]]; then 1169 | rm -rf "$HOME/.autoglm" 1170 | echo -e "${GREEN}[SUCC]${NC} 已删除: $HOME/.autoglm" 1171 | fi 1172 | 1173 | if [[ -f "$HOME/.bashrc" ]]; then 1174 | sed -i '/source ~\/.autoglm\/config.sh/d' "$HOME/.bashrc" 2>/dev/null || true 1175 | sed -i '/source \$HOME\/.autoglm\/config.sh/d' "$HOME/.bashrc" 2>/dev/null || true 1176 | echo -e "${GREEN}[SUCC]${NC} 已清理 .bashrc 中的环境变量" 1177 | fi 1178 | did_something=true 1179 | else 1180 | echo -e "${BLUE}[INFO]${NC} 保留 autoglm 命令和配置文件" 1181 | fi 1182 | echo 1183 | 1184 | if [[ "$did_something" == true ]]; then 1185 | echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}" 1186 | echo -e "${GREEN}║${NC} ${BOLD}✅ 卸载操作完成!${NC} ${GREEN}║${NC}" 1187 | echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}" 1188 | echo 1189 | echo -e "${YELLOW}提示: 请重新打开终端以使更改生效${NC}" 1190 | else 1191 | echo -e "${BLUE}[INFO]${NC} 未执行任何卸载操作" 1192 | fi 1193 | echo 1194 | read -rp "按回车继续... " 1195 | 1196 | if [[ ! -f "$HOME/bin/autoglm" ]]; then 1197 | echo -e "${YELLOW}autoglm 命令已删除,即将退出...${NC}" 1198 | exit 0 1199 | fi 1200 | } 1201 | 1202 | ########## 完全卸载 ########## 1203 | uninstall_full() { 1204 | show_header 1205 | echo -e "${RED}╔══════════════════════════════════════════════════════════════╗${NC}" 1206 | echo -e "${RED}║${NC} ${BOLD}🗑️ 完全卸载(包括运行环境)${NC} ${RED}║${NC}" 1207 | echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}" 1208 | echo 1209 | echo -e "${YELLOW}此选项将引导您逐项选择要卸载的内容${NC}" 1210 | echo -e "${RED}${BOLD}⚠️ 注意:卸载运行环境可能影响其他程序!${NC}" 1211 | echo 1212 | 1213 | local did_something=false 1214 | 1215 | echo -e "${CYAN}━━━ 第 1 步:项目 pip 依赖包 ━━━${NC}" 1216 | if [[ -f "$AUTOGLM_DIR/requirements.txt" ]]; then 1217 | echo -e "${YELLOW}检测到项目依赖文件:$AUTOGLM_DIR/requirements.txt${NC}" 1218 | echo 1219 | if ask_yes_no "是否卸载项目安装的 pip 依赖包?"; then 1220 | uninstall_pip_deps 1221 | did_something=true 1222 | else 1223 | echo -e "${BLUE}[INFO]${NC} 跳过项目 pip 依赖卸载" 1224 | fi 1225 | else 1226 | echo -e "${YELLOW}[WARN]${NC} 未找到 requirements.txt" 1227 | if ask_yes_no "是否卸载项目本体包(open-autoglm)?"; then 1228 | python -m pip uninstall -y open-autoglm 2>/dev/null || true 1229 | python -m pip uninstall -y autoglm 2>/dev/null || true 1230 | python -m pip uninstall -y Open-AutoGLM 2>/dev/null || true 1231 | echo -e "${GREEN}[SUCC]${NC} 项目本体已卸载" 1232 | did_something=true 1233 | fi 1234 | fi 1235 | echo 1236 | 1237 | echo -e "${CYAN}━━━ 第 2 步:部署时安装的核心 pip 包 ━━━${NC}" 1238 | echo -e "${YELLOW}包含以下包:${NC}" 1239 | echo -e " • maturin" 1240 | echo -e " • openai" 1241 | echo -e " • requests" 1242 | if ! in_termux; then 1243 | echo -e " • pillow" 1244 | fi 1245 | echo 1246 | if ask_yes_no "是否卸载这些核心 pip 包?"; then 1247 | echo -e "${BLUE}[INFO]${NC} 卸载核心 pip 包..." 1248 | python -m pip uninstall -y maturin 2>/dev/null || true 1249 | python -m pip uninstall -y openai 2>/dev/null || true 1250 | python -m pip uninstall -y requests 2>/dev/null || true 1251 | if ! in_termux; then 1252 | python -m pip uninstall -y pillow 2>/dev/null || true 1253 | fi 1254 | echo -e "${GREEN}[SUCC]${NC} 核心 pip 包已卸载" 1255 | did_something=true 1256 | else 1257 | echo -e "${BLUE}[INFO]${NC} 保留核心 pip 包" 1258 | fi 1259 | echo 1260 | 1261 | echo -e "${CYAN}━━━ 第 3 步:项目目录 ━━━${NC}" 1262 | if [[ -d "$AUTOGLM_DIR" ]]; then 1263 | echo -e "${YELLOW}项目目录:$AUTOGLM_DIR${NC}" 1264 | echo 1265 | if ask_yes_no "是否删除 Open-AutoGLM 项目目录?"; then 1266 | rm -rf "$AUTOGLM_DIR" 1267 | echo -e "${GREEN}[SUCC]${NC} 已删除: $AUTOGLM_DIR" 1268 | did_something=true 1269 | else 1270 | echo -e "${BLUE}[INFO]${NC} 保留项目目录" 1271 | fi 1272 | else 1273 | echo -e "${YELLOW}[WARN]${NC} 项目目录不存在,跳过此步骤" 1274 | fi 1275 | echo 1276 | 1277 | echo -e "${CYAN}━━━ 第 4 步:autoglm 命令与配置文件 ━━━${NC}" 1278 | echo -e "${YELLOW}包含以下内容:${NC}" 1279 | echo -e " • autoglm 命令: ${CYAN}$HOME/bin/autoglm${NC}" 1280 | echo -e " • 配置文件目录: ${CYAN}$HOME/.autoglm${NC}" 1281 | echo -e " • .bashrc 中的环境变量配置" 1282 | echo 1283 | if ask_yes_no "是否删除 autoglm 命令、配置文件和环境变量?"; then 1284 | if [[ -f "$HOME/bin/autoglm" ]]; then 1285 | rm -f "$HOME/bin/autoglm" 1286 | echo -e "${GREEN}[SUCC]${NC} 已删除: $HOME/bin/autoglm" 1287 | fi 1288 | 1289 | if [[ -d "$HOME/.autoglm" ]]; then 1290 | rm -rf "$HOME/.autoglm" 1291 | echo -e "${GREEN}[SUCC]${NC} 已删除: $HOME/.autoglm" 1292 | fi 1293 | 1294 | if [[ -f "$HOME/.bashrc" ]]; then 1295 | sed -i '/source ~\/.autoglm\/config.sh/d' "$HOME/.bashrc" 2>/dev/null || true 1296 | sed -i '/source \$HOME\/.autoglm\/config.sh/d' "$HOME/.bashrc" 2>/dev/null || true 1297 | echo -e "${GREEN}[SUCC]${NC} 已清理 .bashrc 中的环境变量" 1298 | fi 1299 | did_something=true 1300 | else 1301 | echo -e "${BLUE}[INFO]${NC} 保留 autoglm 命令和配置文件" 1302 | fi 1303 | echo 1304 | 1305 | echo -e "${CYAN}━━━ 第 5 步:pip 镜像配置 ━━━${NC}" 1306 | local pip_mirror 1307 | pip_mirror=$(pip config get global.index-url 2>/dev/null || echo "") 1308 | if [[ -n "$pip_mirror" ]]; then 1309 | echo -e "${YELLOW}当前 pip 镜像:$pip_mirror${NC}" 1310 | echo 1311 | if ask_yes_no "是否删除 pip 镜像配置?"; then 1312 | pip config unset global.index-url 2>/dev/null || true 1313 | pip config unset install.trusted-host 2>/dev/null || true 1314 | echo -e "${GREEN}[SUCC]${NC} pip 镜像配置已删除" 1315 | did_something=true 1316 | else 1317 | echo -e "${BLUE}[INFO]${NC} 保留 pip 镜像配置" 1318 | fi 1319 | else 1320 | echo -e "${YELLOW}[INFO]${NC} 未检测到 pip 镜像配置,跳过此步骤" 1321 | fi 1322 | echo 1323 | 1324 | echo -e "${CYAN}━━━ 第 6 步:Cargo 镜像配置 ━━━${NC}" 1325 | if [[ -f "$HOME/.cargo/config.toml" ]]; then 1326 | echo -e "${YELLOW}检测到 Cargo 配置:$HOME/.cargo/config.toml${NC}" 1327 | echo 1328 | if ask_yes_no "是否删除 Cargo 镜像配置?"; then 1329 | rm -f "$HOME/.cargo/config.toml" 1330 | rm -f "$HOME/.cargo/config" 1331 | echo -e "${GREEN}[SUCC]${NC} Cargo 镜像配置已删除" 1332 | did_something=true 1333 | else 1334 | echo -e "${BLUE}[INFO]${NC} 保留 Cargo 镜像配置" 1335 | fi 1336 | else 1337 | echo -e "${YELLOW}[INFO]${NC} 未检测到 Cargo 镜像配置,跳过此步骤" 1338 | fi 1339 | echo 1340 | 1341 | if in_termux; then 1342 | echo -e "${CYAN}━━━ 第 7 步:Termux 系统包 ━━━${NC}" 1343 | echo -e "${RED}${BOLD}⚠️ 警告:卸载系统包可能影响其他程序!${NC}" 1344 | echo 1345 | 1346 | if pkg list-installed 2>/dev/null | grep -q "python-pillow"; then 1347 | if ask_yes_no "是否卸载 python-pillow?"; then 1348 | pkg uninstall -y python-pillow 2>/dev/null || true 1349 | echo -e "${GREEN}[SUCC]${NC} python-pillow 已卸载" 1350 | did_something=true 1351 | fi 1352 | fi 1353 | 1354 | if command -v rustc &>/dev/null; then 1355 | if ask_yes_no "是否卸载 Rust 编译工具链(rust, binutils)?"; then 1356 | pkg uninstall -y rust binutils 2>/dev/null || true 1357 | echo -e "${GREEN}[SUCC]${NC} Rust 工具链已卸载" 1358 | did_something=true 1359 | fi 1360 | fi 1361 | 1362 | if command -v adb &>/dev/null; then 1363 | if ask_yes_no "是否卸载 ADB 工具(android-tools)?"; then 1364 | pkg uninstall -y android-tools 2>/dev/null || true 1365 | echo -e "${GREEN}[SUCC]${NC} ADB 工具已卸载" 1366 | did_something=true 1367 | fi 1368 | fi 1369 | echo 1370 | fi 1371 | 1372 | if [[ "$did_something" == true ]]; then 1373 | echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}" 1374 | echo -e "${GREEN}║${NC} ${BOLD}✅ 卸载操作完成!${NC} ${GREEN}║${NC}" 1375 | echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}" 1376 | echo 1377 | echo -e "${YELLOW}提示: 请重新打开终端以使更改生效${NC}" 1378 | else 1379 | echo -e "${BLUE}[INFO]${NC} 未执行任何卸载操作" 1380 | fi 1381 | echo 1382 | read -rp "按回车继续... " 1383 | 1384 | if [[ ! -f "$HOME/bin/autoglm" ]]; then 1385 | echo -e "${YELLOW}autoglm 命令已删除,即将退出...${NC}" 1386 | exit 0 1387 | fi 1388 | } 1389 | 1390 | ########## 卸载子菜单 ########## 1391 | uninstall_menu() { 1392 | while true; do 1393 | show_header 1394 | echo -e "${RED}╔══════════════════════════════════════════════════════════════╗${NC}" 1395 | echo -e "${RED}║${NC} ${BOLD}🗑️ 一键卸载${NC} ${RED}║${NC}" 1396 | echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}" 1397 | echo 1398 | echo -e "${YELLOW}请选择卸载方式:${NC}" 1399 | echo 1400 | echo -e " ${GREEN}1.${NC} 🧹 卸载 Open-AutoGLM + autoglm 控制面板" 1401 | echo -e " ${CYAN}可选择性删除:pip依赖、项目目录、命令和配置${NC}" 1402 | echo 1403 | echo -e " ${GREEN}2.${NC} 💣 完全卸载(包括运行环境)" 1404 | echo -e " ${CYAN}除上述内容外,还可选择卸载:${NC}" 1405 | echo -e " ${CYAN}核心pip包、镜像配置、系统包等${NC}" 1406 | echo 1407 | echo -e " ${GREEN}0.${NC} ↩️ 返回主菜单" 1408 | echo 1409 | read -rp "请选择 [0-2]: " choice 1410 | 1411 | case "$choice" in 1412 | 1) 1413 | uninstall_basic 1414 | ;; 1415 | 2) 1416 | uninstall_full 1417 | ;; 1418 | 0) 1419 | return 1420 | ;; 1421 | *) 1422 | echo -e "${RED}无效选择${NC}" 1423 | sleep 1 1424 | ;; 1425 | esac 1426 | done 1427 | } 1428 | 1429 | ########## 启动 AutoGLM ########## 1430 | start_autoglm() { 1431 | local device_count 1432 | device_count=$(get_adb_device_count) 1433 | 1434 | if [[ "$device_count" -eq 0 ]]; then 1435 | echo 1436 | echo -e "${RED}[ERROR]${NC} 未检测到在线的 ADB 设备!" 1437 | echo -e "${YELLOW}请先配置 ADB 无线调试(菜单选项 2)${NC}" 1438 | echo 1439 | read -rp "是否现在配置 ADB?(Y/n): " ans 1440 | case "${ans:-y}" in 1441 | [Nn]*) 1442 | return 1 1443 | ;; 1444 | *) 1445 | adb_menu 1446 | device_count=$(get_adb_device_count) 1447 | if [[ "$device_count" -eq 0 ]]; then 1448 | return 1 1449 | fi 1450 | ;; 1451 | esac 1452 | fi 1453 | 1454 | if [[ ! -d "$AUTOGLM_DIR" ]]; then 1455 | echo -e "${RED}[ERROR]${NC} 项目目录不存在: $AUTOGLM_DIR" 1456 | echo -e "${YELLOW}请重新运行 deploy.sh 安装${NC}" 1457 | read -rp "按回车返回... " 1458 | return 1 1459 | fi 1460 | 1461 | local CMD_ARGS=() 1462 | CMD_ARGS+=(--base-url "$PHONE_AGENT_BASE_URL") 1463 | CMD_ARGS+=(--model "$PHONE_AGENT_MODEL") 1464 | CMD_ARGS+=(--apikey "$PHONE_AGENT_API_KEY") 1465 | 1466 | [[ -n "${PHONE_AGENT_DEVICE_ID:-}" ]] && CMD_ARGS+=(--device-id "$PHONE_AGENT_DEVICE_ID") 1467 | 1468 | echo 1469 | echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" 1470 | echo -e "${CYAN}║${NC} ${BOLD}🚀 启动 AutoGLM${NC} ${CYAN}║${NC}" 1471 | echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" 1472 | echo 1473 | echo -e "${BLUE}配置信息:${NC}" 1474 | echo -e " API : ${GREEN}$PHONE_AGENT_BASE_URL${NC}" 1475 | echo -e " Model : ${GREEN}$PHONE_AGENT_MODEL${NC}" 1476 | echo -e " Steps : ${GREEN}$PHONE_AGENT_MAX_STEPS${NC}" 1477 | echo -e " Lang : ${GREEN}$PHONE_AGENT_LANG${NC}" 1478 | [[ -n "${PHONE_AGENT_DEVICE_ID:-}" ]] && echo -e " Device : ${GREEN}$PHONE_AGENT_DEVICE_ID${NC}" 1479 | echo 1480 | echo -e "${YELLOW}正在启动...${NC}" 1481 | echo 1482 | 1483 | cd "$AUTOGLM_DIR" 1484 | exec python main.py "${CMD_ARGS[@]}" 1485 | } 1486 | 1487 | ########## 解析命令行参数 ########## 1488 | parse_args() { 1489 | while [[ $# -gt 0 ]]; do 1490 | case $1 in 1491 | --base-url) 1492 | PHONE_AGENT_BASE_URL="$2" 1493 | shift 2 1494 | ;; 1495 | --model) 1496 | PHONE_AGENT_MODEL="$2" 1497 | shift 2 1498 | ;; 1499 | --apikey) 1500 | PHONE_AGENT_API_KEY="$2" 1501 | shift 2 1502 | ;; 1503 | --max-steps) 1504 | PHONE_AGENT_MAX_STEPS="$2" 1505 | shift 2 1506 | ;; 1507 | --device-id) 1508 | PHONE_AGENT_DEVICE_ID="$2" 1509 | shift 2 1510 | ;; 1511 | --lang) 1512 | PHONE_AGENT_LANG="$2" 1513 | shift 2 1514 | ;; 1515 | --list-apps) 1516 | cd "$AUTOGLM_DIR" 2>/dev/null && python main.py --list-apps 1517 | exit $? 1518 | ;; 1519 | --setup-adb) 1520 | load_config 1521 | adb_menu 1522 | exit 0 1523 | ;; 1524 | --switch-device) 1525 | load_config 1526 | switch_adb_device 1527 | exit 0 1528 | ;; 1529 | --disconnect) 1530 | load_config 1531 | disconnect_device 1532 | exit 0 1533 | ;; 1534 | --devices) 1535 | load_config 1536 | show_device_list 1537 | exit 0 1538 | ;; 1539 | --reconfig) 1540 | load_config 1541 | modify_config 1542 | exit 0 1543 | ;; 1544 | --uninstall) 1545 | load_config 1546 | uninstall_menu 1547 | exit 0 1548 | ;; 1549 | --help|-h) 1550 | echo -e "${BOLD}${CYAN}AutoGLM - 智能手机控制代理${NC}" 1551 | echo 1552 | echo -e "${YELLOW}用法:${NC}" 1553 | echo " autoglm # 打开交互式菜单" 1554 | echo " autoglm --setup-adb # ADB 设备管理" 1555 | echo " autoglm --devices # 查看设备列表" 1556 | echo " autoglm --switch-device # 切换 ADB 设备" 1557 | echo " autoglm --disconnect # 断开设备连接" 1558 | echo " autoglm --reconfig # 修改配置" 1559 | echo " autoglm --list-apps # 查看支持的应用" 1560 | echo " autoglm --uninstall # 卸载" 1561 | echo 1562 | echo -e "${YELLOW}参数:${NC}" 1563 | echo " --base-url URL 设置 API 地址" 1564 | echo " --model NAME 设置模型名称" 1565 | echo " --apikey KEY 设置 API Key" 1566 | echo " --max-steps N 设置最大步数" 1567 | echo " --device-id ID 设置 ADB 设备 ID" 1568 | echo " --lang cn|en 设置语言" 1569 | exit 0 1570 | ;; 1571 | --start|-s) 1572 | DIRECT_START=true 1573 | shift 1574 | ;; 1575 | *) 1576 | echo -e "${RED}未知参数: $1${NC}" 1577 | echo "使用 --help 查看帮助" 1578 | exit 1 1579 | ;; 1580 | esac 1581 | done 1582 | } 1583 | 1584 | ########## 主菜单循环 ########## 1585 | main_menu_loop() { 1586 | while true; do 1587 | show_main_menu 1588 | read -rp "请选择 [0-6]: " choice 1589 | 1590 | case "$choice" in 1591 | 1) 1592 | start_autoglm 1593 | ;; 1594 | 2) 1595 | adb_menu 1596 | ;; 1597 | 3) 1598 | modify_config 1599 | ;; 1600 | 4) 1601 | list_apps 1602 | ;; 1603 | 5) 1604 | view_config 1605 | ;; 1606 | 6) 1607 | uninstall_menu 1608 | ;; 1609 | 0) 1610 | echo 1611 | echo -e "${GREEN}再见!${NC}" 1612 | exit 0 1613 | ;; 1614 | *) 1615 | echo -e "${RED}无效选择,请输入 0-6${NC}" 1616 | sleep 1 1617 | ;; 1618 | esac 1619 | done 1620 | } 1621 | 1622 | ########## 主入口 ########## 1623 | main() { 1624 | load_config 1625 | parse_args "$@" 1626 | 1627 | if [[ "${DIRECT_START:-false}" == true ]]; then 1628 | start_autoglm 1629 | exit $? 1630 | fi 1631 | 1632 | main_menu_loop 1633 | } 1634 | 1635 | main "$@" 1636 | LAUNCHER_EOF 1637 | 1638 | chmod +x ~/bin/autoglm 1639 | 1640 | if ! grep -q 'export PATH=.*~/bin' ~/.bashrc 2>/dev/null; then 1641 | echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc 1642 | fi 1643 | 1644 | log_succ "启动器已创建: ~/bin/autoglm" 1645 | } 1646 | 1647 | ########## 主流程 ########## 1648 | main() { 1649 | echo -e "${BLUE}╔══════════════════════════════════════════════════════════════╗${NC}" 1650 | echo -e "${BLUE}║${NC} ${BOLD}Open-AutoGLM 一键部署脚本 (ADB 纯方案)${NC} ${BLUE}║${NC}" 1651 | echo -e "${BLUE}║${NC} ${CYAN}版本: 4.5.0${NC} ${BLUE}║${NC}" 1652 | echo -e "${BLUE}╚══════════════════════════════════════════════════════════════╝${NC}" 1653 | echo 1654 | 1655 | log_info "检查并安装基础依赖..." 1656 | ensure_python 1657 | ensure_pip 1658 | ensure_git 1659 | ensure_rust 1660 | ensure_adb 1661 | 1662 | ensure_setuptools 1663 | 1664 | echo 1665 | 1666 | local pip_mirror="" cargo_mirror="" 1667 | ask_mirror "请输入 pip 镜像地址(阿里 https://mirrors.aliyun.com/pypi/simple)" \ 1668 | "https://mirrors.aliyun.com/pypi/simple" pip_mirror 1669 | ask_mirror "请输入 Cargo 镜像地址(清华 sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/)" \ 1670 | "sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/" cargo_mirror 1671 | setup_pip_mirror "$pip_mirror" 1672 | setup_cargo_mirror "$cargo_mirror" 1673 | 1674 | install_py_deps 1675 | 1676 | clone_or_update 1677 | 1678 | configure_env 1679 | 1680 | remind_adb_keyboard 1681 | 1682 | echo 1683 | if check_adb_configured; then 1684 | log_succ "检测到已连接的 ADB 设备:" 1685 | adb devices 1686 | read -rp "是否需要重新配置 ADB?(y/N): " reconf 1687 | if [[ "$reconf" == "y" || "$reconf" == "Y" ]]; then 1688 | configure_adb_wireless 1689 | fi 1690 | else 1691 | log_warn "未检测到 ADB 设备" 1692 | read -rp "是否现在配置 ADB 无线调试?(Y/n): " conf 1693 | case "${conf:-y}" in 1694 | [Nn]*) 1695 | log_info "跳过 ADB 配置,稍后可运行 autoglm 进行配置" 1696 | ;; 1697 | *) 1698 | configure_adb_wireless || log_warn "ADB 配置失败,稍后可运行 autoglm 重试" 1699 | ;; 1700 | esac 1701 | fi 1702 | 1703 | make_launcher 1704 | 1705 | # 立即重载 bashrc 使配置生效 1706 | source ~/.bashrc 2>/dev/null || true 1707 | source ~/.autoglm/config.sh 2>/dev/null || true 1708 | export PATH="$HOME/bin:$PATH" 1709 | 1710 | echo 1711 | echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}" 1712 | echo -e "${GREEN}║${NC} ${BOLD}✅ 部署完成!${NC} ${GREEN}║${NC}" 1713 | echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}" 1714 | echo 1715 | echo -e "运行 ${CYAN}autoglm${NC} 打开智能启动面板" 1716 | echo -e "运行 ${CYAN}autoglm --help${NC} 查看更多选项" 1717 | echo 1718 | echo -e "${GREEN}提示: autoglm 命令已设置并生效!${NC}" 1719 | echo -e "${YELLOW}提示: 新终端窗口自动加载配置,当前窗口若运行autoglm失败,请手动执行下面代码后重新运行:${NC}" 1720 | echo -e " ${GREEN}source ~/.bashrc${NC}" 1721 | echo 1722 | } 1723 | 1724 | main "$@" 1725 | --------------------------------------------------------------------------------