一句话数据收集器(QuickForm 数据大屏工坊)
> 老师说一句「帮我做个课堂作品投票」,你交付:一个数据收集网页 + 一个实时数据大屏 + 后台自动建好的任务。
> 学生打开收集页填写,数据秒级进库;老师投屏打开大屏,看着数字实时跳动。
> 还能一句话让 AI 出一份专业的数据分析报告。
🔑 重要(v1.2 起):每个任务先起一个「名字」,记在本地台账里。
以后老师说「维护下那个单词练习」,就按名字找回同一个任务(数据不丢)重新生成页面,
绝不重复新建。详见下方《本地任务台账 —— 先起名、按名字维护》。
先看效果(在线演示大屏,模拟数据实时变化):
https://modeai-quickform.ms.show/demo
什么时候用我
| 老师说的话 | 你要交付什么 |
|---|---|
| "帮我做个课堂投票/报名/问卷收集" | 收集页 HTML + 数据大屏 HTML(先亮家底 + 起名) |
| "再给我新建一个 XX / 另一个网页+数据大屏" | 换新名字 create(会顺带告诉老师现在共有几个任务、都叫什么) |
| "改一下那个网页 / 换个字段 / 大屏再调调 / 这个不合适重做" | 按名字 resolve → 用原 apiid 原地覆盖原网页(不新建任务、数据不丢) |
| "看看现在收集了多少" | 调 API 报数字 + 打开大屏看 |
| "分析一下学生提交的数据" | 调 AI 分析接口,返回报告 |
| "我都有哪些任务 / 现在有几个" | python references/qf_registry.py brief(或 list)——只读本地台账,不联网 |
> 🔑 一句话区分:说"改"→ 复用同一个任务原地改;说"再建/新建一个"→ 换名字建新任务。
> 拿不准就先 brief 亮出清单,问一句"你是要改已有的,还是新建一个?"
默认环境(开箱即用,零配置)
- BASE(唯一正确域名):
https://modeai-quickform.ms.show - API Token(体验站共享,开箱即用):不需要记、也不写死在任何文件里——Token 是公开共享的且会轮换,
运行时自动从公开 docs 端点获取(qf_token.py已内置:环境变量 > 本地缓存 24h > 实时拉取)。
手动查看当前 Token:python references/qf_check.py token;401 时脚本会自动换新 Token 重试。
⚠️ 三个实测必踩的坑(2026-09-17 全流程验证)
坑 1:必须伪装浏览器 User-Agent,否则一律 403。
这是最高频失败原因。体验站网关有 WAF,curl/8.x、Python-urllib/3.x 等默认 UA 会被判为爬虫直接 403,
而同一个请求带上浏览器 UA 立刻 200。实测矩阵:
| 请求 | 结果 |
|---|---|
X-API-Token + 浏览器 UA |
200 ✅ |
X-API-Token + 默认 UA(不加 -A) |
403 ❌ |
Authorization: Bearer <token> |
403 ❌ |
浏览器 UA 固定用这一串:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
坑 2:绝不能改用 studio-xxx.api-inference.modelscope.net 域名。
网关被拦时,本能反应是换成魔搭的 API 专用地址 + 魔搭 SDK Key——这条路是死路,不要走:
该网关对浏览器 OPTIONS 预检返回 401 且不附带任何 CORS 头,前端 fetch 必然报
No 'Access-Control-Allow-Origin' header is present on the requested resource。
而且它会污染需求:一旦用了它,网页就必须内嵌魔搭 Key,用户再也做不到"零配置"。
结论:网页只用 ms.show 公开接口,不带任何 Token,谁双击都能用。
坑 3:Windows 下中文数据会乱码。
cmd/PowerShell/Git Bash 默认 GBK,含中文的 -d '{...}' 会被服务端解析失败(报"缺少 title")。
解决:title 用 ASCII,或改用 Python urllib 显式 .encode("utf-8") 提交(见 references/qf_check.py)。
坑 4:体验站是共享空间,卫生铁律(违者垃圾任务满天飞)。
所有使用者共用同一个 Token 和任务空间,自检/测试留下的任何东西所有人可见:
- 自检只允许用「自检-链路测试」这一个固定任务(
qf_check.py已固化:存在就复用,不存在才建一次)——绝不每次自检都新建任务 - 自检/验证产生的测试数据绝不插进真实任务,只进自检任务或刚创建的目标任务
qf_render.py的端到端验证会自动提交带「【连通性验证-可删】」标记的测试数据,验证通过后自动调用 DELETE 清掉- 留下了垃圾就用清理端点收尾:
python references/qf_check.py delete <apiid>删任务、python references/qf_check.py purge <apiid> "标记"清数据
另外:不要用 Authorization 请求头——魔搭平台网关会拦截带 Authorization 头的请求返回 403,必须用 X-API-Token。
体验站为共享演示环境(所有使用者共享数据空间),正式使用请自部署 QuickForm 教师版并用自己的 Token(部署方法见文末)
⭐ 本地任务台账 —— 先起名、按名字维护(v1.2 核心)
为什么要有它:QuickForm 开放接口只能「新建任务」,没有「改任务」。如果每次都 create,
用户第二次想改就会又建出一个新任务、还找不到对应关系(因为创建完就忘了)。
台账在用户本机记下「名字 → apiid」,让同一个名字永远指向同一个任务:
第一次:create 建任务 + 登记名字
之后 :按名字查到旧 apiid → 复用同一个任务重新生成页面(数据不丢)
想另起:换个名字;确实要同名重建才加 --force
台账文件:~/.workbuddy/quickform/registry.json
(Windows:C:\Users\<用户名>\.workbuddy\quickform\registry.json)
可用环境变量 QF_REGISTRY 或参数 --file 覆盖。它是本机的,每个同事各自一份,互不影响。
🔒 铁律:任何"新建数据收集任务"的动作,都要先起名、先查台账,再决定新建还是维护。
# 0) 亮家底:目前共有几个任务、都叫什么(新建前先亮给老师看)
python references/qf_registry.py brief
# 1) 这个名字建过没有?(退出码 0=已存在,1=没有)
python references/qf_registry.py has "<名字>"
# 2) 没建过 → 新建并登记(一条命令内部就调云端建好任务,别再用裸 curl)
python references/qf_registry.py create --name "<名字>" --title "<任务标题>" --desc "<说明>"
# 3) 建过 → 看它的 apiid,直接用这个 apiid 重渲染页面(数据保留,见第 2 步)
python references/qf_registry.py get "<名字>"
# 4) 看全部 / 只想看名字
python references/qf_registry.py list
python references/qf_registry.py names
> 数据来源(务必分清):
> path / list / names / has / get / resolve / brief / add / update / set-files / remove 只读本地台账、不联网——
> 所以"我有哪些任务"永远只显示你自己登记过的,不会列出别人的。
> 只有 create(新建任务)和 sync(与云端对齐)会连云端;其中 sync 的云端接口返回共享空间里所有人的任务,
> 故其默认行为是"只刷新、不新增"(详见下方 sync 说明)。
"维护"到底能改什么(务必跟用户讲清楚,别让 TA 误以为能改云端任务本体):
| 能否 | 说明 | |
|---|---|---|
| 收集页字段 / 大屏样式文案 | ✅ 能 | 复用同一 apiid 重渲染页面,学生数据不丢 |
| 云端任务标题本身 | ❌ 不能 | 接口没有 update;台账里的名字是本地别名,改了只影响本地与页面标题 |
| 换一套收集字段且不想混新旧数据 | 💡 建议新建 | 换个名字建新任务更干净 |
同事第一次用、或以前建过任务没记名字 → 与云端对齐:
python references/qf_registry.py sync # 默认【只刷新】:只更新台账里已有任务的提交数,不新增
python references/qf_registry.py sync --add-all # 才把云端任务补录进台账
> ⚠️ 体验站是共享空间(所有人共用同一个 Token),GET /api/cli/tasks 返回的是所有人的任务。
> 所以 sync 默认不新增任何条目,只会刷新你自己台账内任务的提交数;
> 它会把"云端有、你台账没有"的任务列出来提示你,由你确认后再决定是否 add 单独登记或 --add-all 全量补录。
> 绝不要为了让列表"全一点"就无脑 --add-all——那会把别人的任务灌进你的台账。
🔁 改网页 —— 复用同一个任务,绝不新建(最易翻车,务必照做)
触发语:老师说「这个网页不合适,改一下」「换个字段」「大屏再调调」「重做收集页」「加一列」……
只要是对已经做过的任务动刀,就必须走这条"改网页"路径,不能新建任务。
- 先按名字取回它的 apiid 和原来的网页路径:
bash python references/qf_registry.py resolve "<名字>"
返回apiid=xxx、collect=<原收集页路径>、dashboard=<原大屏路径>。
- 若返回"未找到" → 这是新需求,回到《第 0 步》起名新建;绝不能默默新建一个来糊弄。 - 用同一个 apiid 重新渲染(带
--name "<名字>"):
bash python references/qf_render.py <上一步的 apiid> "<标题>" "<说明>" \ --fields fields.html --name "<名字>"
qf_render.py发现台账里已登记过该任务的网页,会原地覆盖原来那两个文件,
并打印♻ 复用同一个任务 apiid=xxx,原地覆盖上次的网页(未新建任务)。
→ 老师的数据一条都不会丢,只是页面换了。 - 交付时明确说:「已改好,还是在原来那个任务上(数据没丢)」。
⚠️ 三条红线
- 查不到名字 → 先问老师改的是哪一个任务,或给个名字;不要擅自 create 新任务。
- 改网页绝不再调 POST /api/cli/tasks(那是新建);复用旧 apiid 就好。
- 非模板页面(如自制的小游戏收集页)也要登记路径,否则下次"改网页"不知道改哪个文件:
bash
python references/qf_registry.py set-files --name "<名字>" \
--collect <收集页路径> --dashboard <大屏路径>
先跑自检,再干活(强烈建议)
本技能自带 references/qf_check.py(零依赖,Python 3 标准库),它已把上面三个坑全部规避掉:
python references/qf_check.py # 全链路自检:鉴权/读取/提交/入库/中文建任务,逐项打印 HTTP 码
python references/qf_check.py create "课堂作品投票" "收集作品名与评分"
python references/qf_check.py data <apiid>
python references/qf_check.py analyze <apiid>
跑出第一个 HTTP 200 之前,不要生成任何网页。 这样一次做对,不用回头排查。
标准工作流(严格按此执行)
第 0 步:先亮家底 + 起名 + 查台账(必做,防止重复建任务)
- 先亮一下"家底":
python references/qf_registry.py brief
会打印「目前共有 N 个数据任务:A、B、C」。
- 老师提的是新建需求("再给我做一个 XX")→ 把清单转述给他再动手:
> 「你目前已有 N 个数据任务:A、B、C。要【改】哪个就说它的名字;要【新建】我就按新名字建一个。」
- 老师其实是改("那个不行 / 改一下 / 换个字段")→ 走《🔁 改网页》,不要 create(见下)。 - 再确定这次的任务名(短名,便于口头引用,如「三年二班单词练习」)。
用户话里带了名字就用;没带就问一句**:「这个数据表起个什么名字?以后我按名字帮你维护。」 - 查台账:
python references/qf_registry.py has "<名字>" - 按结果分支:
- 没有(退出码 1)→ 走新建:
python references/qf_registry.py create --name "<名字>" --title "<标题>" --desc "<说明>"
拿到 apiid 后进第 2 步。优先用这条,不要用裸 curl 建任务(裸 curl 不登记名字,下次又找不到)。
命令建完会自动打印"你目前共有 N 个数据任务:…"——把这句转述给老师。
- 已有(退出码 0)→ 先停下问用户:
> 「这个名字已经有一个任务了(apiid=xxx,现有 N 条提交)。你是想【继续用它】(只改页面、保留已有数据),还是【另建一个】?」- 选「继续用」→ 记下它的 apiid,直接进第 2 步重渲染(数据保留)。
- 选「另建」→ 让用户换个名字,或
create ... --force。
第 1 步:创建数据任务(备用:裸 curl,不登记名字,非必要不用)
TOKEN=$(python references/qf_check.py token)
curl -X POST "https://modeai-quickform.ms.show/api/cli/tasks" \
-A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36" \
-H "X-API-Token: $TOKEN" \
-H "Content-Type: application/json; charset=utf-8" \
-d '{"title": "课堂作品投票", "description": "提交作品名称并给喜欢的设计打分(1-5)"}'
> 注意 -A 那个浏览器 UA 不能省(坑 1),中文在 Windows 终端下可能乱码(坑 2/坑 3),
> 遇到乱码直接改用 python references/qf_check.py create "标题" "描述"。
返回 task.apiid 和 task.submit_url(如 https://modeai-quickform.ms.show/api/AbC123XYz)。
第 2 步:用模板生成两个网页(核心交付物)
本技能自带两个单文件 HTML 模板(零依赖、双击即用),放在 references/ 目录:
> ✅ 推荐用渲染脚本,别手工替换:references/qf_render.py
> 手工替换很容易翻车——全量 replace 会把注释/提示文字里的占位符一起改掉(出错信息会变成一串 URL),
> 也常漏替某个占位符导致页面"点了没反应"。脚本会渲染 + 五项自动校验:
>
> bash
> python references/qf_render.py <apiid> "<任务标题>" "<一句话说明>" \
> --fields fields.html --name "<任务短名>" # 新建时可再跟 --out ./交付目录
>
> 带上 --name 时,一旦校验通过,脚本会自动把 apiid/标题/页面路径写回本地台账:
> · 新建:用 --out <目录> 决定落盘位置;
> · 改网页:同一个 --name 再跑一次,脚本会原地覆盖上次那两个网页
> (复用同一 apiid,打印 ♻ 复用同一个任务…未新建任务),老师的数据不会丢。
> 校验项:①占位符是否替换干净 ②实际请求地址 ③地址是否合规(必须 ms.show)
> ④页面是否混入 Token ⑤真实请求一次确认 apiid 有效(写错 apiid 会直接报 HTTP 404)。
> fields.html 里写你要的表单控件(见下方格式),不含 importToken 之类的东西。
若确实要手工替换,务必逐个替换且只替换这五个占位符,并在生成后跑一遍上述校验。
collect_template.html—— 数据收集页(发给学生填)
替换占位符:
-__TASK_TITLE__→ 任务标题
-__TASK_DESC__→ 一句话填写说明
-__FIELDS_HTML__→ 按老师需求生成表单控件,每个控件必须有name和data-label(提交时作为字段名),例:
<div class="fg"><label>你的姓名</label><input name="name" data-label="姓名" required></div>
<div class="fg"><label>作品名称</label><input name="work" data-label="作品名称" required></div>
<div class="fg"><label>评分(1-5 分)</label>
<select name="score" data-label="评分"><option>5</option><option>4</option><option>3</option><option>2</option><option>1</option></select></div>
<div class="fg"><label>一句建议</label><textarea name="advice" data-label="建议"></textarea></div>
__SUBMIT_URL__→ 第 1 步返回的task.submit_url
dashboard_template.html—— 实时数据大屏(老师投屏看)
替换占位符:
-__TASK_TITLE__/__TASK_DESC__→ 同上
-__DATA_URL__→task.data_url(即{BASE}/api/<apiid>/all)
大屏自动:6 秒轮询新数据、统计卡数字跳动、60 分钟趋势图、自动识别选择类字段画分布条、最新提交列表(最新在前、可滚动)。不需要任何配置。
> 📌 交付的是非模板页面时(比如自制的小游戏收集页、定制大屏):交付后务必把它的路径登记进台账,
> 否则下次老师说"改网页"时,智能体不知道改哪个文件:
> bash
> python references/qf_registry.py set-files --name "<名字>" --collect <收集页路径> --dashboard <大屏路径>
>
把两个文件保存到老师指定的目录(没指定就存到当前工作目录,文件名用任务标题命名)。
第 2.5 步:交付前自检(防止翻车,别跳过)
验证一律走 HTTP 请求(默认已固化在渲染器里),不要用无头浏览器——沙箱环境里 Chrome/Edge headless 经常跑不起来(要求 --user-data-dir、禁 GUI 进程),白白卡几分钟还验不出东西。
qf_render.py 渲染时会自动执行以下校验,全程约 3~10 秒:
- 占位符是否替换干净
- 实际请求地址是否为
https://modeai-quickform.ms.show/api/...(否则会被 CORS 拦) - 页面是否零凭证(Token/Key 绝不能出现在学生可见的页面里)
- 数据地址连通性实测(浏览器 UA 直 GET)
- 端到端提交回读:自动构造一条标记为「【连通性验证-可删】」的测试数据 POST 到收集接口,再 GET 回来确认入库——这一步同时验证了收集页提交链路和大屏数据链路,等价于"替学生点一次提交、替老师看一次大屏"
判据:渲染器最后输出 校验结果:全部通过,可直接交付 即通过。若第 5 项失败但第 4 项 OK,先怀疑容器冷启动(等 1 分钟重跑一次再下结论)。
> 跳过端到端验证(不想留测试数据时):qf_render.py ... --no-verify
> 跳过在线托管(只要本地文件时):qf_render.py ... --no-host
第 6 步 · 在线托管(默认自动执行):渲染校验通过后,渲染器自动把两个页面上传到体验站
(POST /api/cli/tasks/<apiid>/pages),拿到永久在线链接:
- 收集页 https://modeai-quickform.ms.show/p/<apiid> —— 发给学生填
- 大屏 https://modeai-quickform.ms.show/p/<apiid>/screen —— 老师投屏
- 重复上传自动覆盖 = 改版;本地 HTML 文件仍会生成,作为备份交付
- 托管失败不阻断交付(本地文件照常给),并把失败原因打印出来
无头浏览器仅作可选深度排查——只有当老师本人反馈"页面打不开/点了没反应"、且 HTTP 验证又全过时,才考虑本地真开浏览器(或让老师按 F12 看控制台)定位前端渲染问题。不要把它写进常规交付流程。
第 3 步:告知使用方式(固定话术)
> ✅ 已创建完成!任务名:「<名字>」(以后说这个名字我就能帮你维护,不会重复新建)
> 📋 你目前共有 N 个数据任务:<逐个列出名字> —— 要改哪个直接说它的名字
> 📝 收集页(在线链接,发这个给学生):<page_url>
> 📊 数据大屏(在线链接,投屏看):<screen_url>
> 💾 本地备份已存:<文件路径>(链接丢了或想改版,说「改一下「<名字>」」即可,还是同一个任务,数据不丢)
> 🤖 想看 AI 分析随时说「分析一下数据」;想再做一个就说「再新建一个 XX」
第 4 步:查数据 / AI 分析(老师追问时)
# ⚠️ 下面每条命令都必须带浏览器 UA,否则 403(见坑 1)
UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
TOKEN=$(python references/qf_check.py token) # 运行时获取,不写死(Token 会轮换)
# 查看全部提交
curl -A "$UA" -H "X-API-Token: $TOKEN" \
"https://modeai-quickform.ms.show/api/cli/tasks/<apiid>/data"
# AI 智能分析(10-30 秒,返回 Markdown 报告)
curl -A "$UA" -X POST -H "X-API-Token: $TOKEN" \
"https://modeai-quickform.ms.show/api/cli/tasks/<apiid>/analyze"
# 云端任务列表(⚠️ 共享空间:这里是**所有人的**任务,不是你自己的)
# 想看你**自己的**任务,用本地台账:python references/qf_registry.py brief
curl -A "$UA" -H "X-API-Token: $TOKEN" \
"https://modeai-quickform.ms.show/api/cli/tasks"
API 速查
| 端点 | 方法 | 说明 | 鉴权 |
|---|---|---|---|
/api/cli/tasks |
GET | 任务列表(含提交数)⚠️ 共享空间:所有人的任务 | X-API-Token 头 |
/api/cli/tasks |
POST | 创建任务 {title, description?} |
X-API-Token 头 |
/api/cli/tasks/<apiid>/data |
GET | 全部提交数据 | X-API-Token 头 |
/api/cli/tasks/<apiid>/analyze |
POST | AI 分析报告 | X-API-Token 头 |
/api/cli/tasks/<apiid> |
DELETE | 删除整个任务(自检/测试遗留清理用) | X-API-Token 头 |
/api/cli/tasks/<apiid>/data |
DELETE | 按标记清提交:body {"marker": "<子串>"} |
X-API-Token 头 |
/api/<apiid> |
POST | 公开提交(收集页用,任意 JSON) | 无(apiid 即凭据) |
/api/<apiid>/all |
GET | 公开查全部数据(大屏用,带 CORS) | 无 |
/api/<apiid>/count |
GET | 公开查提交数 | 无 |
附:本技能自带的文件
| 文件 | 用途 |
|---|---|
references/collect_template.html |
收集页模板(双击即预览,含地址异常提示) |
references/dashboard_template.html |
大屏模板(双击即预览,含失败横幅) |
references/qf_registry.py |
本地任务台账:亮家底(brief)、先起名、按名字维护/新建、补录云端任务 |
references/qf_check.py |
服务端自检:鉴权 / 读取 / 提交 / 入库 / 中文建任务 |
references/qf_render.py |
客户端渲染:替换占位符 + 五项合规校验 + 自动登记台账 |
两个模板都自带「预览模式」(直接双击就能看效果)
模板里占位符尚未替换时,页面会自动进入预览模式:收集页填入一组示例字段、可点提交体验交互;
大屏页用内置示例数据渲染出完整图表,并显示黄色「模板预览模式」横幅。
渲染成真实任务地址后,预览模式自动关闭、横幅消失、改为拉云端真实数据——所以同一个文件既是能试的预览页,也是最终交付页,不需要额外维护两套。
模板实测状态(2026-09-17,无头浏览器真实点击/提交验证):
收集页提交成功并入库(姓名/作品名/评分/建议),大屏四张卡与实时流正常渲染
(累计 5 · 今日 5 · 平均分 4.2 · 参与 5)。
本轮修复的两处缺陷:
1. 大屏原来用 .catch(function(){}) 静默吞错——地址填错时页面一片空白且无任何提示,老师只能说"用不了"。
现改为红色横幅 + LIVE 灯转灰,并直接打印失败原因、当前请求地址和对应的修正办法。
2. 收集页提交失败时也会提示"提交地址不正确,应为 https://modeai-quickform.ms.show/api/<任务ID>"。
两点高危坑(2026-09-17 第二次实测补充,详见更新日志 1.1.2):
1. 接口 submitted_at 是 UTC,直接显示会差 8 小时(如北京 22:23 显示成 14:23),
且趋势图会按本地时区解析 UTC 串 → 新提交被误判为 8 小时前、挤出 60 分钟窗口而"看不到点"。
模板现统一按北京时间(+8)换算(常量 TZ_OFFSET,换时区只改这一处)。
2. 大屏"最新提交"列表原来取接口返回的前 7 条 + overflow:hidden,而接口是按时间正序返回(最旧在前),
导致最新一条排在最底部且被裁掉、还不能滚动。现改为按提交时间倒序(最新在前)+ 列表可滚动。
完整文档(把此链接发给任何智能体即可自动接入):
https://modeai-quickform.ms.show/api/cli/docs
注意事项
- 收集页/大屏页是纯静态单文件 HTML:本地双击、微信发送、托管到任何静态空间都行
- 公开接口响应带 CORS
*,网页直接 fetch,无跨域问题 - 体验站免费容器长时间无访问会休眠,首次调用如超时等 1 分钟重试一次即可
- 体验站为共享环境:不要收集敏感个人信息;正式使用建议自部署(开源教师版,Docker 一键部署,项目地址见 https://github.com/wstlab/quickform )
- AI 分析基于魔搭 ModelScope 免费推理,体验站已默认接好,无需配置 APIKEY
大屏长什么样
深色科技风:顶部 LIVE 呼吸灯 + 四个统计卡(累计/今日/平均分/参与人数)+ 提交趋势面积图 + 字段分布条 + 最新提交实时滚动。在线体验:https://modeai-quickform.ms.show/demo
更新日志
-
1.4.0(2026-09-26)
1. 交付从"本地文件"升级为"在线链接":体验站新增页面托管能力(POST /api/cli/tasks/<apiid>/pages),
渲染器校验通过后自动上传收集页+大屏,回传永久在线链接https://modeai-quickform.ms.show/p/<apiid>
与/p/<apiid>/screen——学生/老师点链接即用,不用再传文件。
2. 重复上传自动覆盖 = 原地改版;本地 HTML 仍生成作备份;托管失败不阻断交付。
3.qf_render.py新增host_pages()与--no-host;台账新增 page_url/screen_url 字段;
固定话术改为链接优先。
(配套:体验站空间同日上线托管路由,/p/<apiid>公开访问带 CSP sandbox 防护) -
1.3.1(2026-09-26)
1. 根治"敏感授权卡死"问题:SKILL.md 与全部脚本中的硬编码 Token 全部移除(共 6 处)。
Token 本就是公开共享且会轮换的,写死在技能文件里毫无收益,却会让平台安全扫描把整个技能
判成"敏感",每次加载都弹授权——弹窗超时技能就加载失败,这是"用户调不动"的第一大原因。
2. 新增references/qf_token.py统一取 Token:环境变量 QF_TOKEN > 本地缓存 24h > 公开 docs 端点实时拉取。
qf_check.py自检遇 401 自动换新 Token 重试一次(Token 轮换不再需要人工干预)。
3. 新增python references/qf_check.py token子命令(可--refresh强制刷新)。 -
1.3.0(2026-09-18)
1. 修复共享空间垃圾任务问题:自检check不再每次新建"自检-中文编码"任务,改为复用固定的"自检-链路测试"任务(apiid 固定),也绝不向你的真实任务插测试数据。
2. 服务端新增 DELETE 接口(CLI 文档同步更新):DELETE /api/cli/tasks/<apiid>删除任务、DELETE /api/cli/tasks/<apiid>/data(body{"marker":...})按标记清理测试数据;qf_check.py新增delete/purge子命令。
3.qf_render.py端到端验证后自动删除测试数据;新增--no-verify跳过验证;修复/all读回字段层级判断 bug。 - 1.2.3(2026-09-18)
1. 验证流程提速:去掉沙箱内易挂起的 Headless 浏览器验证,改为一次 HTTP 请求端到端验证(POST 测试数据 → GET 读回确认 → 自动清理),约 1~2 秒完成。
2. 修复qf_render.py读回结果取值 bug(顶层字段误取data子对象)。 - 1.2.2(2026-09-18)
1.sync默认改为"只刷新、不新增":体验站是共享空间,GET /api/cli/tasks返回所有人的任务,
原实现会把别人的任务全量灌进你的台账。现默认只刷新台账内已知任务的提交数,
并把"云端有、你台账没有"的任务列出来提示,由你确认后再add单独登记或sync --add-all全量补录。
2. 明确"数据来源"边界并写进文档:path/list/names/has/get/resolve/brief/add/update/set-files/remove
只读本地台账、不联网("我有哪些任务"只显示你自己的);只有create/sync连云端。
3. 第 4 步与 API 速查里的云端任务列表补注:那是共享空间里所有人的任务,要看自己的请用本地brief。 - 1.2.1(2026-09-18)
1. 新增"亮家底":qf_registry.py brief一句话汇报「目前共有 N 个数据任务:A、B、C」,
并提示"要改哪个直接说名字 / 要新建就说换个新名字"。
2.create建完任务后自动打印这份清单,智能体可直接转述给老师——
老师随时知道已经建了几个、都叫什么,不会稀里糊涂又建重复。
3. SKILL.md 第 0 步新增「先亮家底」;"什么时候用我"表明确区分 说"改"→原地改 与 说"再建/新建一个"→换名新建;
交付话术固定带上"你目前共有 N 个数据任务:…"。 - 1.2.0(2026-09-18)
1. 新增本地任务台账references/qf_registry.py,解决"第二次调用又新建一个任务、找不到对应关系"的痛点:
流程改为 先起名 → 查台账 → 同名维护(复用 apiid,数据不丢)/ 异名新建。
2.qf_render.py新增--name/--registry:渲染校验通过后自动把 apiid/标题/页面路径写回台账。
3. 新增sync子命令:把云端已有任务一键补录进台账(只读云端)。
4. 改网页 = 复用同一任务、原地覆盖原文件:qf_render.py带同一个--name再跑时,若台账已登记过网页,
就原地覆盖原文件、复用同一 apiid(不新建任务、学生数据一条不丢);新增qf_registry.py resolve
一次取回 apiid + 原网页路径。改网页绝不再调POST /api/cli/tasks。
5. SKILL.md 新增《本地任务台账》《🔁 改网页 —— 复用同一个任务,绝不新建》《第 0 步:先起名 + 查台账》,
并明确边界(能改页面,改不了云端任务标题)。
6. 明确:非模板交付页面(小游戏等)须用set-files登记路径,否则下次"改网页"不知道改哪个文件。 - 1.1.2(2026-09-17)
1. 大屏"最新提交"顺序修复:接口按时间正序返回,原来取前 7 条导致最新一条排在最底部且被overflow:hidden裁掉、无法滚动。现改为按submitted_at倒序(最新在前)+ 列表可滚动(最多 12 条)。
2. 大屏时间统一按北京时间(+8)显示:服务端submitted_at为 UTC,原来直接显示差 8 小时;趋势图也因时区错位把新提交挤出 60 分钟窗口。现统一换算(常量TZ_OFFSET=8,可改)。
3. 「今日提交」改为按北京日期统计,避免跨零点错位。
4. 预览模式示例时间同步适配(demo 数据按 UTC 生成,展示仍为北京时间)。 - 1.1.1(2026-09-17) 承接 1.1.0 修复,通过市场审核并上线。
- 1.1.0(2026-09-17)
1. 两个模板新增预览模式:未渲染时双击即可试(收集页出示例表单、大屏页用示例数据渲染),渲染后自动关闭、接真实数据。
2. 大屏失败不再静默:改为红色横幅 + LIVE 灯转灰,并打印失败原因与当前请求地址。
3. 明确「坑 1:必须带浏览器 UA」,并新增references/qf_render.py(渲染 + 五项校验)与references/qf_check.py(全链路自检)。 - 1.0.0 首版。