api-config.json 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. {
  2. "name": "voc-token-preflight",
  3. "displayName": "VOC Token 预飞",
  4. "description": "VOC 工作坊 Token 预飞检测:在 Session 1 调用付费 skill 之前,结构化地检查 vocToken 是否有效、余额是否充足,并返回可直接展示给用户的支付引导文案+专属充值链接,避免'暂无权限'的断崖式体验。",
  5. "category": "workshop",
  6. "version": "1.0.0",
  7. "type": "local-script",
  8. "execution": {
  9. "kind": "command",
  10. "command": "node",
  11. "args": [
  12. "scripts/tools/voc-token-preflight.js",
  13. "{{apigId}}"
  14. ],
  15. "cwd": "{{workspaceRoot}}",
  16. "outputParser": {
  17. "type": "stdout-prefix-json",
  18. "prefix": "PREFLIGHT_RESULT=",
  19. "description": "解析 stdout 中以 'PREFLIGHT_RESULT=' 开头的行,去掉前缀后即为 JSON"
  20. },
  21. "exitCodes": {
  22. "0": "valid",
  23. "1": "missing | expired | insufficient_balance",
  24. "2": "error"
  25. }
  26. },
  27. "parameters": {
  28. "type": "object",
  29. "required": [],
  30. "properties": {
  31. "apigId": {
  32. "type": "string",
  33. "description": "要检测的 APIG objectId。默认 7HwdQZk55B(voc-ecom),覆盖 Session 1 的 category-landscape 等付费 skill。若要检测 voc-social 相关 skill,可传 Vo3ROWEvDy。",
  34. "default": "7HwdQZk55B",
  35. "enum": [
  36. "7HwdQZk55B",
  37. "Vo3ROWEvDy"
  38. ]
  39. }
  40. }
  41. },
  42. "output": {
  43. "type": "object",
  44. "description": "预飞检测结果,Agent 按 status 字段分支处理",
  45. "properties": {
  46. "status": {
  47. "type": "string",
  48. "enum": [
  49. "valid",
  50. "missing",
  51. "expired",
  52. "insufficient_balance",
  53. "error"
  54. ],
  55. "description": "预飞状态。valid=通过;missing=无token;expired=token失效;insufficient_balance=余额不足;error=系统错误"
  56. },
  57. "userId": {
  58. "type": "string",
  59. "nullable": true,
  60. "description": "Parse _User.objectId(token 有效时返回)"
  61. },
  62. "username": {
  63. "type": "string",
  64. "nullable": true,
  65. "description": "Parse _User.username"
  66. },
  67. "authId": {
  68. "type": "string",
  69. "nullable": true,
  70. "description": "APIGAuth.objectId(账号已开通该 APIG 时返回)"
  71. },
  72. "balance": {
  73. "type": "integer",
  74. "description": "APIGAuth.count 剩余调用次数"
  75. },
  76. "paymentUrl": {
  77. "type": "string",
  78. "description": "充值/开通链接。valid/insufficient_balance 时带 ?user={userId} 参数(专属),missing/expired 时为通用链接"
  79. },
  80. "displayMessage": {
  81. "type": "string",
  82. "description": "已格式化好的 Markdown 文案,Agent 应一字不差展示给用户(status=missing/expired/insufficient_balance 时特别重要)"
  83. },
  84. "nextAction": {
  85. "type": "string",
  86. "enum": [
  87. "proceed",
  88. "showPaymentAndWait",
  89. "retry"
  90. ],
  91. "description": "建议的下一步动作"
  92. },
  93. "apigId": {
  94. "type": "string",
  95. "description": "检测的 APIG id(回显)"
  96. },
  97. "timestamp": {
  98. "type": "string",
  99. "description": "ISO 时间戳,用于更新 workshop-progress.preflight.lastValidatedAt"
  100. }
  101. }
  102. },
  103. "memoryFiles": {
  104. "read": [
  105. "~/.openclaw/voc-credentials.json"
  106. ],
  107. "write": [
  108. "memory/workshop-progress.json"
  109. ]
  110. },
  111. "usageExamples": [
  112. {
  113. "name": "Session 0 Step 0.4 默认预飞",
  114. "input": {
  115. "apigId": "7HwdQZk55B"
  116. },
  117. "description": "品牌档案建档完成后的预飞检查,验证用户可进入 Session 1 的付费分析阶段"
  118. },
  119. {
  120. "name": "Session 1 Step 1.0 入口快检",
  121. "input": {
  122. "apigId": "7HwdQZk55B"
  123. },
  124. "description": "跨天恢复工作坊时,在调用 category-landscape 前快速检验 token 仍有效"
  125. },
  126. {
  127. "name": "付费 skill 失败后重新预飞",
  128. "input": {
  129. "apigId": "7HwdQZk55B"
  130. },
  131. "description": "当某个付费 skill 返回 unauthorized/balanceInsufficient 时,重新预飞以确定是 token 问题还是余额问题"
  132. }
  133. ],
  134. "agentProtocol": {
  135. "description": "OpenClaw Agent 必须严格按以下顺序执行,否则视为违反 Token 预飞协议",
  136. "steps": [
  137. "1. 运行 `node scripts/tools/voc-token-preflight.js <apigId>`",
  138. "2. 在 stdout 中找到以 'PREFLIGHT_RESULT=' 开头的最后一行,去掉前缀得到 JSON",
  139. "3. 解析 JSON,读取 result.status",
  140. "4. 若 status = 'valid':简短确认 + 更新 memory/workshop-progress.json.preflight 字段",
  141. "5. 若 status = 'missing' 或 'expired':一字不差输出 result.displayMessage → HARD STOP 等用户粘 token → 收到后运行 set-voc-token.js + 再跑本 skill",
  142. "6. 若 status = 'insufficient_balance':一字不差输出 result.displayMessage → 等用户支付后回复'已支付' → 再跑本 skill 确认 valid",
  143. "7. 若 status = 'error':告知用户网络/系统错误,等待后重试",
  144. "8. 除非 status = 'valid',否则绝不推进 workshop-progress.currentPhase"
  145. ],
  146. "forbidden": [
  147. "跳过本 skill 直接调 category-landscape / keyword-search 等付费 skill",
  148. "忽略 displayMessage 自己组装支付文案(易遗漏链接或步骤)",
  149. "把 status = 'error' 当成 'missing' 处理(会让用户误以为需要重新支付)",
  150. "在 status != 'valid' 时更新 workshop-progress.currentPhase 到 session-1"
  151. ]
  152. },
  153. "relatedFiles": {
  154. "executor": "scripts/tools/voc-token-preflight.js",
  155. "companion": "scripts/tools/set-voc-token.js",
  156. "protocolDocs": "workshop/workshop-global-rules.md#token-预飞协议",
  157. "callers": [
  158. "workshop/workshop-session-0-intake.md (Step 0.4)",
  159. "workshop/workshop-session-1-category.md (Step 1.0)"
  160. ]
  161. }
  162. }