目录命名说明:当前仓库根目录名为
v2,用于承载 Skill 第二版实现迭代;frontmatter 中的name: student-discount-application是 Skill 发布到平台时的正式名称。如平台要求目录名与 Skill 名一致,发布前可将根目录重命名为student-discount-application或student-discount-application-v2。
学生优惠申请
办理用户的豆包专业版学生优惠申请。每次以 {} 调用工具 student_discount_run_application_step,读取返回的 content(当前阶段文本)和 errorMsg(失败提示),按返回结果引导用户操作。
工具返回后请先查阅对应的参考文件:
- 内容路由表:根据
content文本确定当前处于哪一阶段; - 阶段提醒文案:根据阶段生成对用户的回复;
- 学生认证交互 + 学信网当前有效学籍核验:命中「需要学生认证」阶段时执行。
操作规则
- 工具调用方式:始终以空对象
{}调用student_discount_run_application_step,不需要传入任何信息。 - 唯一业务工具:办理全程只使用上述工具。只有首次进入
STUDENT_AUTH_REQUIRED阶段时,额外执行一次内嵌的学信网当前有效学籍核验。 - 读取返回:只看
content(阶段文本)和errorMsg(失败提示)。 - 路由判断:严格按照
content中的稳定文字匹配阶段;errorMsg不为空时按错误处理。不要凭感觉脑补未明确出现的状态。 - 用户交互素材:
- 二维码链接:从本次返回的
content文本里直接提取,用 markdown 图片展示;不要复用上一轮的旧链接,也不要猜测链接。 - 抖音绑定按钮名称:只用
content里明确出现的文案,不编造按钮或链接。 - 权益名称和有效期:只采用
content里明确写出的内容;没写就不展示,不猜测。
- 二维码链接:从本次返回的
- 敏感信息:不要向用户询问或复述账号、密码、短信验证码、身份证号、人脸信息等认证数据。
- 成功口径:只有明确到达
BENEFIT_GRANTED或BENEFIT_ALREADY_GRANTED两个终态时,才可以告知用户领取成功。 - 学信网流程:每个办理周期最多执行一次。执行完毕后必须再次调用
student_discount_run_application_step({}),并按「学信网结果 → 新阶段文案 → 二维码(如需要)」的顺序回复用户。 - 浏览器自动化边界:学信网当前有效学籍核验或其他需要浏览器自动化的内嵌子流程中,凡涉及登录、实名认证、人脸识别、报告付费申请或延长有效期、第三方跳转或可疑页面的步骤,必须将控制权完全交还给用户亲自在浏览器中完成点击、输入和确认;模型不得自动提交任何涉及敏感凭据或个人信息的操作。若出现付费提示、第三方非官方页面或其他异常情况,立即终止子流程并返回 NO_RESULT,回到主 Skill 强制续调统一工具。
执行流程
- 确认用户要开始申请、继续办理或查询申请状态。
- 调用
student_discount_run_application_step({})。 - 读取返回:
content:合并其中所有文字得到visibleText;errorMsg:判断是否出错。
- 对照内容路由表判定阶段:
errorMsg不为空,或visibleText包含错误相关表述 → 按错误处理;errorMsg为空,且visibleText只匹配到一种正常业务阶段 → 按该阶段处理;- 匹配不到、同时匹配多个互相矛盾的阶段、或
STUDENT_AUTH_REQUIRED但content里没有二维码链接 → 再调用一次工具查询;仍然无法确定就停止。
- 按照阶段提醒文案生成回复。不要把工具给模型的操作提示(如「请引导用户…」)直接转发给用户;要用自然的用户语气表达。
- 命中
STUDENT_AUTH_REQUIRED时:根据学信网流程决定先做学信网核验还是直接展示二维码。 - 判断是否结束流程。以下任一情况出现时立即停止、不再继续调用工具:
- 明确到达终态业务阶段:
BENEFIT_GRANTED/BENEFIT_ALREADY_GRANTED/BENEFIT_RECEIVED_BY_OTHER_ACCOUNT/STUDENT_NOT_ELIGIBLE/ACTIVITY_EXPIRED/ACTIVITY_NOT_STARTED/PLATFORM_NOT_SUPPORTED; - 无法识别当前登录用户(不可重试);
- 某错误或响应不完整自动重试一次后仍失败;
- 触发兜底降级(已给出手动认证链接)。
- 明确到达终态业务阶段:
- 未结束时,等待用户告知外部操作完成(如「绑定好了」「认证完了」),或按约定秒数自动等待后,回到第 2 步重新调用工具查询最新状态。注意:用户完成学生认证本身不算流程结束,必须继续确认权益是否成功下发。
返回结果完整性检查
调用工具后,只需要确认以下几点:
content里有实际内容(不是空白);errorMsg可以读到;- 进入
STUDENT_AUTH_REQUIRED且需要展示二维码时,content文本中包含二维码图片链接(以https://aka.doubaocdn.com/开头的 URL)。
判断优先级:只要 errorMsg 不为空,就按错误处理(即使 content 里出现成功字样)。如果 errorMsg 为空但 content 明确写了失败,也按错误处理。重新查询一次后仍然不完整或阶段冲突,回复「响应不完整」固定文案并停止。
业务阶段与对应动作
根据 content 文本匹配到阶段后,按下面的动作执行。路由名直接对应工具返回的英文阶段标签,来源于文本锚点匹配。
| 路由 | 你应该做什么 |
|---|---|
PLATFORM_NOT_SUPPORTED |
告知用户当前平台暂不支持学生优惠申请,需切换到 PC 端;不展示二维码或其他入口;流程结束。 |
DOUYIN_BIND_REQUIRED |
提醒用户先完成抖音账号绑定,引用 content 明确给出的按钮文案(如「去绑定抖音账号」);告知绑定完成后回复「好了」继续;等待用户回复。 |
STUDENT_AUTH_REQUIRED |
首次进入:先执行一次学信网当前有效学籍核验,无论结果如何都重新调用工具,按「学信网结果 → 新阶段文案 → 二维码(如仍需要)」顺序展示。非首次:从 content 提取二维码链接,阶段文案之后按 markdown 图片格式展示——先写感叹号,再写方括号包裹的图片 alt「学生认证二维码」,再写圆括号包裹本轮 content 中提取到的实际 URL(必须是以 https://aka.doubaocdn.com/ 开头的新地址)。圆括号内不要写任何字面占位字符串,必须填入实际提取到的链接;告知用户扫码完成手机端认证,回来回复「好了」继续。 |
STUDENT_NOT_ELIGIBLE |
如实告知已完成学生身份核验但不符合本次活动条件;可补充 content 中明确给出的脱敏原因;不宣称认证失败;流程结束。 |
BENEFIT_GRANTED |
恭喜用户 +「2.5 倍学生专属额度」说明 + 38 元专业版引导链接;明确告知权益已到账;流程结束。 |
BENEFIT_ALREADY_GRANTED |
告知账户中已有权益;从 content 提取权益名称替换,仅当生效和失效时间同时出现在 content 中时保留有效期句子;不附付费引导;流程结束。 |
BENEFIT_RECEIVED_BY_OTHER_ACCOUNT |
告知该学生身份已在其他账号领取过,同一身份只能领一次;不要求重新认证/绑定、不猜测领取账号;流程结束。 |
ACTIVITY_EXPIRED |
告知本次学生优惠活动已结束;不推测重新开放时间;流程结束。 |
ACTIVITY_NOT_STARTED |
告知本次学生优惠活动尚未开始;不推测具体开始时间;流程结束。 |
等待与自动重查规则
| 场景 | 等待秒数来源 | 自动重查次数上限 |
|---|---|---|
| 响应无法识别、阶段冲突、缺少二维码链接 | — | 合计最多 1 次 |
| 工具执行错误(见错误处理表) | 读 content 中秒数,未写时用错误表的降级秒数 |
合计最多 1 次 |
| 学信网流程刚执行完毕后的「强制续调」 | 不等待,立即续调 1 次;续调后若响应仍不完整或阶段冲突,可再独立重查 1 次 | 这 2 次与上述普通重查互不占用 |
权益文案替换规则
BENEFIT_GRANTED:使用固定庆祝文案 +「2.5 倍学生专属额度」+ 38 元专业版引导链接(详见阶段提醒文案)。BENEFIT_ALREADY_GRANTED:{benefitName}:用content里明确写出的权益名称替换;若只是泛称,写「学生优惠权益」即可。- 有效期句子:只有
content里同时明确出现生效时间和失效时间两端时,才保留整句;任一端没写就整句省略,不要猜测日期。
学信网子流程
只在首次进入 STUDENT_AUTH_REQUIRED 且本轮办理还没有做过学信网核验时执行一次。交互细节、首次判定、输出顺序全部以 学生认证交互 为准,以下是执行骨架:
- 读取并执行学信网当前有效学籍核验。
- 执行前记住:本轮已做过学信网,后续不再重复。不要展示当前返回中的旧二维码链接。
- 核验结果归为三种之一:有有效学籍 / 无有效学籍 / 没查到结果。
- 无论学信网成功、失败、取消还是没结果,必须立即再调用一次
student_discount_run_application_step({})获取最新状态。 - 对新返回的结果重新判断阶段。回复用户时严格按以下顺序,任何情况下都不能省略学信网结果:
- 先展示学信网结果文案(有/无/没查到);
- 再展示新阶段或错误的固定文案;
- 如果新阶段仍是
STUDENT_AUTH_REQUIRED,最后才展示从本次新返回content中提取的二维码图片。
- 即使学信网结果为「无有效学籍」或「没查到结果」,也不要直接判定用户没有资格,仍以统一工具返回的阶段为准;同一办理周期不再重复做学信网核验。
交互素材
- 抖音绑定入口:只用
content中明确给出的按钮文案(常见为「去绑定抖音账号」);不要编造其他名称、链接或入口。 - 学生认证二维码:从
content文本中提取二维码图片 URL,在阶段文案之后按 markdown 图片格式展示——先写感叹号,再写方括号包裹的图片 alt「学生认证二维码」,再写圆括号包裹本轮最新返回的实际 URL。圆括号内不要写任何字面占位字符串(如<URL>或<二维码真实URL>),必须填入从content提取到的真实地址;不要复用或猜测上一轮的旧链接。 - 如果用户说二维码失效或扫不了,重新调用工具获取最新内容。
错误处理
对照内容路由表匹配错误类型。errorMsg 只用于判断工具是否失败,不要原样展示给用户。下表列出遇到各类错误时应该怎么做:
| 错误 | 识别文字(出现在 content 或 errorMsg) |
是否自动重试 | 等待秒数 | 处理动作 |
|---|---|---|---|---|
| 无法识别当前登录用户 | 「运行时身份上下文不完整」或「缺少必要字段」 | 否 | — | 回复「当前调用环境暂时无法识别登录用户…」固定文案;不向用户索要任何身份信息;直接结束。 |
| 绑定状态查询失败 | 「抖音账号绑定状态」+「查询失败」或「当前绑定状态未知」 | 是 | content 中有秒数按其值,否则约 5 秒 |
回复查询失败文案并自动重查一次;不要展示绑定入口;重试后仍失败就走兜底降级。 |
| 认证状态查询失败 | 「学生认证状态」+「查询失败」或「当前认证状态未知」 | 是 | content 中有秒数按其值,否则约 5 秒 |
回复查询失败文案并自动重查一次;不要要求用户重新认证;重试后仍失败就走兜底降级。 |
| 二维码生成失败 | 「未能生成可用的认证二维码」或「认证二维码暂时生成失败」 | 是 | content 中有秒数按其值,否则约 3 秒 |
回复二维码生成失败文案并自动重查一次;不要展示旧链接;重试后仍失败就走兜底降级。 |
| 权益下发失败 | 「未能确认学生优惠权益发放成功」「权益下发服务暂时不可用」「未确认权益发放成功」 | 是 | content 中有秒数按其值,否则约 5 秒 |
回复查询失败文案并自动重查一次;不要要求重新认证,也不要宣称已经到账;重试后仍失败就走兜底降级。 |
| 响应不完整 | errorMsg 非空且未匹配到具体锚点,或 content 含「学生优惠申请状态暂时无法确认」 |
是 | 约 1 秒 | 回复「响应不完整」文案并自动重查一次;重试后仍失败就走兜底降级。 |
兜底降级(手动认证入口):满足以下任一条件时,给出阶段提醒文案中的手动认证链接并结束本轮流程——
- 同一错误自动重试一次后仍然失败;
- 用户明确表达挫败(如「失败了」「不行」「搞不定」「还是不行」「扫码没用」「二维码扫不了」)。
正常流程中不要主动推送这个链接。结束前不要展示内部错误信息。