feat(M2): Web AI 控制台——工具页新增子分栏:模型/Key/设备前端可配置(app_meta 存储,key 打码回显),指令执行 + 步骤流轮询(含截图缩略)+ 回答展示;Agent 加 on_step 回调、后台线程单实例运行

This commit is contained in:
2026-09-04 12:54:17 +08:00
parent 02776b12b8
commit fea5a57fc3
6 changed files with 287 additions and 2 deletions
+32
View File
@@ -480,6 +480,7 @@ body{background:var(--bg);font-family:var(--body);color:var(--text);font-size:14
<button class="sub-tab" data-sub="devapps" onclick="showSubTab('tools','devapps')">设备已装应用</button>
<button class="sub-tab" data-sub="devpool" onclick="showSubTab('tools','devpool')">设备池管理</button>
<button class="sub-tab" data-sub="groups" onclick="showSubTab('tools','groups')">设备分组</button>
<button class="sub-tab" data-sub="agent" onclick="showSubTab('tools','agent')">AI 控制台</button>
</div>
<!-- 子分栏 1:剪贴板注入 -->
@@ -702,6 +703,37 @@ body{background:var(--bg);font-family:var(--body);color:var(--text);font-size:14
<div class="help">管理设备分组,用于任务按分组执行。分组内的设备需先在<b>设备池管理</b>中确认(不在池内的设备不参与调度)。</div>
</div>
<!-- 子分栏:AI 控制台(第三方模型经 Agent 控制手机) -->
<div class="sub-panel" id="tools-sub-agent">
<details style="margin-bottom:10px">
<summary style="cursor:pointer;color:var(--muted)">⚙ 模型配置(OpenAI 兼容 API)</summary>
<div style="padding:10px 0 4px;display:flex;flex-wrap:wrap;gap:8px;align-items:center">
<input type="text" id="agent-api-base" class="form-control" style="width:260px;font-family:monospace"
placeholder="API Base,如 https://api.deepseek.com">
<input type="text" id="agent-model" class="form-control" style="width:220px"
placeholder="模型名,如 deepseek-v4-flash-vision-exp">
<input type="password" id="agent-api-key" class="form-control" style="width:260px"
placeholder="API Key(留空不改)">
<input type="text" id="agent-default-serial" class="form-control" style="width:220px;font-family:monospace"
placeholder="默认设备 serial(可选)">
<button class="btn btn-primary" onclick="saveAgentConfig()">保存配置</button>
<span id="agent-key-hint" class="text-muted"></span>
</div>
</details>
<div class="toolbar" style="flex-wrap:wrap">
<textarea id="agent-prompt" class="form-control" rows="2" style="flex:1;min-width:300px"
placeholder="指令:如「打开抖音搜索奚学东,截个图描述结果」"></textarea>
<button class="btn btn-primary" id="btn-agent-run" onclick="runAgent()">▶ 执行</button>
<span id="agent-status" class="text-muted"></span>
</div>
<div id="agent-steps" style="margin-top:10px"></div>
<div id="agent-answer-wrap" style="display:none;margin-top:12px">
<div class="section-title">回答</div>
<div id="agent-answer" style="white-space:pre-wrap;line-height:1.7;background:#0d1117;border:1px solid var(--card-line);border-radius:10px;padding:12px"></div>
</div>
<div class="help">AI 通过截图观察屏幕并执行操作(元素定位优先,坐标兜底)。模型与 Key 配置保存在平台(管理员可见),请勿填他人密钥。</div>
</div>
</div>
</div><!-- /.content -->