mnaddon.json 不必为此增加字段。
这与最小打包一文的名册语义一致:aiTasks 是一个名册,写进去的任务才存在,留空表示不接管。发起时机、材料的来源、返回结果的形状,都由模板逐条写明,宿主只做核对。
任务声明
aiTasks 是一个数组,其中每一项是一条任务的声明。仓库 sdk/output/tools/starter/template/3-full.json 中的任务如下:
template.json
title 与 prompt 的分工值得留意。界面上出现的是 title,模型读到的是 prompt。二者各自服务不同的读者,不存在互相替代的关系。
提示词由模板作者撰写。摘录工具上的 OCR 提示词本来也是作者撰写的自由文本,aiTasks 把同一件事接到插件一侧,并补上前三道门。提示词这一处享有与摘录工具相同的写作自由,宿主不介入。
仓库
sdk/output/tools/starter/template/ 下的模板按级递进,3-full.json 在底部工具条与插件接入的基础上加上 aiTasks。各级之间的差异见最小打包。scope 的取值
scope 决定宿主发出的内容。取值是一个封闭枚举:
attempt_ink 走的是识别手写的视觉模型路线。tier 大于 1 时宿主改用能力更强的模型,0 与 1 使用同一个轻量模型。判定解答过程这类工作,轻量模型不足以支撑,需要声明 tier 为 2。
范围之外的内容,提示词够不着。scope 是封闭枚举,宿主按该枚举实现取材料的动作,提示词只参与模型侧的推理,二者互不相交。因此一条 card_text 的任务不会因为提示词写得详细而拿到卡上的手写内容。
封闭枚举的写法带来一条排查上的便利:写错
scope 的表现与写错其他字段一致,都是整条声明不存在。核对取值时只需比对上表。output 的形状校验
output 的取值只能是 "string"、"number" 与 "bool"。这张类型清单是封闭的,清单之外没有其他取值。
把字段的含义写进 output,会让整条声明被当作不存在。表现是不报错、不半执行,页面只收到一个参数错误。
对照以下写法。下面的声明不合格,该任务不会出现在页面的任务列表中:
template.json
prompt,output 只保留类型名:
template.json
reply,output 中也声明了 reply,二者一致。字段名对不上时,模型写进的内容落在 output 未声明的位置,宿主按 output 校验形状时判定形状不对。
required 是 output 的子集。名单中的字段必须出现在 output 里,写在名单中而不在字段表中的名字同样使整条声明失效。required 中的任意一项缺失,返回结果即判定形状不对,不计成功。
四道门
宿主对每条任务把守下列四道门:
这四道门都与提示词无关。提示词决定的是回答的质量,宿主把守的是范围、额度、形状与知情。
tier 的档位与 AI OCR 共用同一套取值。1 是均衡档,介于快与强之间。0 最快,适合输出短的任务;2 最强,适合判定与长推理。缺省即 0,声明 tier 之前先确认默认档是否够用。
额度之外,宿主还把守票据与限流。这一道与 scope 一样不经过提示词,auto 的任务无法绕过。
宿主逐条核对一项声明是否合格:id 与 prompt 不可为空,scope 必须是宿主认识的那几个取值,trigger 只能取 user 或 auto,output 中每个值都必须落在类型清单内,required 中的每个字段都必须出现在 output 里。核对结果是否定的,整条声明按不存在处理,模板中其他任务的声明不受影响。
template.json
grade 的 required 只列出 verdict,score 属于可选字段,output 中仍然保留该字段的声明。
卡片类型标签的前缀
tagPrefix 是卡片类型标签的前缀,与 AI 任务无关,属于模板的标识性设置。
template.json
<前缀>/question,答案卡打 <前缀>/answer。插件按同一套约定识别卡片,两边使用同一个前缀。
标签的叶名固定,只有前缀可改。固定下来之后,用户才能在标签面板里看见这些标签,并能自行增删。摘题配不上的答案留作游离卡,游离卡在标签面板里成为一份待配清单,用户可自行处理。
留空表示不参与该约定。摘题是通用功能,模板不声明前缀时,摘题照常可用,宿主一个标签都不打。
前缀抄自别人的模板时会被整包继承。仓库里的起步模板曾经带着一份刷题用的前缀,而配套插件一个标签都不写,该前缀始终匹配不上。参见最小打包一文的名册语义。
调用侧
页面通过mn.ai 调用模板中已经声明过的任务。调用参数随 scope 而定,返回结果的形式与错误码的含义见使用 MN 内置 AI。
本文只讲声明。页面读取模板的任务清单、以及调用之后对返回结果的处理,都属于插件一侧,写法同样见使用 MN 内置 AI。模板的其余字段与包内文件的分工,见最小打包。