协议弹窗、29 步引导与 20:34:52:AI 开发者空间一次完整实操
起点:签到那一下,积分从 1360 变成 1370
晚上八点二十六分,打开成长中心,页面右上角的按钮写着「立即签到」,旁边的数字是 1360 积分,连续签到天数显示为 0——说明今天还没签。点下去之后按钮文字变成「已签到」,连续天数变成 1,积分刷新成 1370。+10 到账,整个过程不到两秒。
真正花时间的不是签到,是后面那个「每日体验 AI DevSpace」。今天这一趟走下来,遇到两个以前没碰到过的东西:一个是新版协议弹窗,一个是 eduSwarm 的 29 步新手引导。记下来,下次能省十几分钟。
第一个拦路虎:开发者空间弹出了协议更新
按惯例从实践中心进入。实践中心的地址是 hands-on-agent.developer.huaweicloud.com/#tasks,页面上会渲染出一个带签名参数的入口链接,形如:
https://devstation.developer.huaweicloud.com/aidevspace
?dc=Tc49TgMxEAXgq4ymSROjQEGxEi2CM0Qp...
&dc_sign=4061643efcfb76936b1553036541050315f25208a8abece0c8225fb52a648cfe
这个 dc 是一长串 Base64Url 风格的环境票据,dc_sign 是它的签名。两者必须成对出现,直接手敲 /aidevspace 是进不去的——服务端会认为票据缺失。
点进去之后,页面没有像往常那样直接开始配置环境,而是弹出一个全屏的协议更新提醒,标题是「华为云开发者服务协议、隐私声明及开发平台协议更新提醒」,正文第一条写得很具体:
本次更新范围及内容:1、开发者空间开发平台服务协议:新增发布作业环境时协议条款。
也就是说这次更新和「作业环境发布」有关。弹窗底部是一个 16×16 的勾选框,后面跟着「我已阅读并同意」和三份协议的名称,右下方是「进入」按钮。这里的坑在于:勾选框本身很小,而且初始状态下「进入」按钮是灰的,不勾就不让走。我第一次点的时候没注意勾选框在左边,直接点「进入」,没有任何反应,还以为是页面卡住了。
勾上之后按钮才变成可点状态,点「进入」才真正开始配置环境。这一步纯 UI,没有任何接口可以跳过——协议签署是账号维度的,跳过一次之后应该会记住。
环境配置:37% 到 100% 的真实曲线
进入之后是一个「正在配置实操环境」的进度页,下方滚动着容器日志。我把每次采样到的百分比记了下来,构成一条挺有意思的曲线:
37% → 48% → 56% → 61% → 64%
65% → 69% → 80% → 88% → 100%
采样间隔大约 8 秒,所以整段耗时接近 90 秒。前半段(37→69)爬得很慢,几乎每次只涨 3~7 个百分点;到 69% 之后突然加速,直接跳到 80、88,然后一把到 100。这个节奏和日志内容是吻合的——中段日志里反复出现的是:
[root@0bd971163f204eaf86366edff142efc0 ~]# job-env-manager up eduswarm
3 打开 eduswarm
容器主机名 0bd971163f204eaf86366edff142efc0 同时也是后面 iframe 域名的前缀,这一点后面会用到。等进度走完,页面顶部出现「保持展开 剩余时长 02:58:52」,说明环境已经可用了,有效期三小时。
顺便说一句等待期间页面上的「AI小知识」轮播,内容其实挺碎的:从「计算机视觉技术让机器能够看见和理解图像」到「强化学习通过奖励机制训练智能体做出最优决策」,再到「Transformer 架构是现代大语言模型的基础」。等 90 秒能刷过去五六条,倒也不算完全浪费时间。
eduSwarm 的 29 步新手引导
环境起来之后,主区域是一个全屏 iframe,源地址是:
https://16002-0bd971163f204eaf86366edff142efc0
.workspace.developer.huaweicloud.com/chat/new
注意这个域名结构:16002-<容器ID>.workspace.developer.huaweicloud.com。它是独立 origin,和父页面 devstation.developer.huaweicloud.com 不同源,所以父页面拿不到 contentDocument,任何想操作里面 DOM 的脚本都必须走 CDP 的 Runtime.evaluate(contextId),先 Runtime.enable,再从 executionContextCreated 事件里挑 origin 匹配的那个上下文。今天这个上下文 id 是 37。
iframe 加载完之后,第一眼看到的不是聊天界面,而是一个引导浮层:右上角「跳过」,右下角「下一步」,角标写着 1 / 29。二十九步。这个数字确实劝退,而且它是分步高亮式的引导——每点一次「下一步」,就换一个区域高亮,讲一段功能说明,从「新建任务」「定时任务」「项目目录」,一路讲到「Agent 配置」「Edu Skill Hub」。
引导本身做得挺细,如果是要长期用这个平台,认真走一遍有价值。但如果只是来完成「每日体验」这个动作,29 次点击纯属消耗。跳过按钮的类是 .edu-tour__skip,位置在右上角,点一下就整个浮层消失,不留残余遮罩。
跨域 iframe 里的第一次提问
引导关掉之后,界面清爽了,左边是导航(任务 / 今日课堂 / 课堂管理 / 班级管理 / 课件中心 / 作业中心 / 批改报告 / 教学总览 / Agent 配置 / Agent 统计 / Edu Skill Hub / Studio / 学生端),中间是对话区,底部是输入框。
输入框的选择器是 [contenteditable=true],实际类名 chat-input-editor,量出来的尺寸是 752×88。因为它在 iframe 里,不能直接用 Input.insertText 打到页面上——必须先把焦点真正落到这个 contenteditable 上,把光标 Range 折叠到内容末尾,再发 Input.insertText。直接对父页面 insertText 是打不进去的,字符会落到 iframe 之外。
第一次输入的内容是一条真实的教研需求:
帮我梳理《数据结构》第一次课的教学重点,按课时分配列成清单
29 个字。输入完之后读回 innerText.length 确认是 29,说明文字确实进了编辑器而不是被吞掉。然后发 Enter:keyDown + keyUp,windowsVirtualKeyCode 13,keyDown 带 text: '\r'。只发 keyDown 不补 keyUp,有的编辑器会认为按键没结束,不会触发提交。
发送成功的标志很明确:对话区出现刚才那句话,下面跟着一行时间戳和「任务执行」,时间戳是 20:34:52,右上角还有模型标识 hwdevspace/glm-5.2,模式是「单Agent模式 / 完全访问权限」。
回答质量:它真的按课时拆了
等了十几秒,回复开始流式输出。有意思的是前几秒吐出来的是英文思维链:
...this is a straightforward teaching planning task.
I don't need to use any tools - I can directly provide
a well-structured response based on my knowledge of
data structures curriculum...
然后才切回中文,给出一份带表格的教学重点清单。核心判断是:「通常第一次课为 2 课时(90 分钟),核心任务是建立基本概念体系与算法分析框架」,然后把 90 分钟拆成两个 45 分钟。
第一课时讲基本概念,五个重点,每个都标了时间:为什么学数据结构(8 min,用「电话簿查找」引例对比无序、有序、哈希表)、基本术语辨析(数据 / 数据元素 / 数据项)、逻辑结构(12 min)、物理结构(10 min,顺序 / 链式 / 索引 / 散列)、抽象数据类型(5 min,给了 (D, S, P) 三元组写法)。
第二课时讲算法与算法分析:算法五特性(有穷性、确定性、可行性、输入、输出,特别点了「程序 ≠ 算法」因为程序可以不满足有穷性)、时间复杂度(15 min,给了完整的复杂度阶排序 O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(n³) < O(2ⁿ) < O(n!))、空间复杂度(7 min,只讲辅助空间和原地算法)、课堂练习(10 min)。
最实用的是它主动加了两个「易错点提醒」:第一课时提醒学生容易把「数据元素」和「数据项」搞混,建议用「一行记录 vs 一个字段」类比;第二课时提醒学生把 O(2n) 直接写成 O(n) 而不化简,强调大 O 只看最高阶、忽略常数系数。这两条不是套话,是真的教学现场会卡住的地方。
复盘:这次多花了哪些时间
把今天这趟和以前的流程对比一下,多出来的耗时集中在两处:
- 协议弹窗:约 2 分钟。第一次遇到,不知道要点左边那个小勾选框,点了三次「进入」都没反应。
- 29 步引导:如果一步步点完,按每步 2 秒算也要一分钟,而且会不断切换高亮区域。直接点「跳过」是 1 秒。
环境配置那 90 秒是省不掉的,属于正常开销。真正可以优化的其实是「进入」这一步的判断逻辑:如果页面文本里出现「协议、隐私声明及开发平台协议更新」,就先找 .eco-checkbox 勾上再点「进入」;如果 iframe 里出现 .edu-tour__skip,先点掉再找输入框。这两条加上去,整条链路基本就没有人工介入的点了。
最后留一个观察:容器主机名和 iframe 子域名是同一个字符串,这意味着环境重建之后,iframe 的 origin 会变,之前记下的 contextId 也就失效了。所以任何脚本都不能把 contextId 写死,必须每次重新从 executionContextCreated 里按 origin 前缀 workspace.developer 去匹配——这一点在今天这次实操里被验证了一次,因为上一轮的上下文 id 已经完全对不上了。
- 点赞
- 收藏
- 关注作者
评论(0)