@tikomni/skills 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/.skill-package-allowlist.txt +4 -0
  2. package/LICENSE +21 -0
  3. package/README.md +167 -0
  4. package/README.zh-CN.md +167 -0
  5. package/bin/tikomni-skills.js +127 -0
  6. package/env.example +160 -0
  7. package/lib/installer.js +176 -0
  8. package/package.json +44 -0
  9. package/skills/creator-analysis/SKILL.md +71 -0
  10. package/skills/creator-analysis/agents/openai.yaml +4 -0
  11. package/skills/creator-analysis/env.example +36 -0
  12. package/skills/creator-analysis/references/api-capability-index.md +92 -0
  13. package/skills/creator-analysis/references/api-contracts/asr-api.md +130 -0
  14. package/skills/creator-analysis/references/api-contracts/bilibili-app-api.md +776 -0
  15. package/skills/creator-analysis/references/api-contracts/bilibili-web-api.md +2017 -0
  16. package/skills/creator-analysis/references/api-contracts/demo-api.md +717 -0
  17. package/skills/creator-analysis/references/api-contracts/douyin-app-v3-api.md +3594 -0
  18. package/skills/creator-analysis/references/api-contracts/douyin-billboard-api.md +2274 -0
  19. package/skills/creator-analysis/references/api-contracts/douyin-creator-api.md +1575 -0
  20. package/skills/creator-analysis/references/api-contracts/douyin-creator-v2-api.md +3254 -0
  21. package/skills/creator-analysis/references/api-contracts/douyin-search-api.md +4118 -0
  22. package/skills/creator-analysis/references/api-contracts/douyin-web-api.md +5544 -0
  23. package/skills/creator-analysis/references/api-contracts/douyin-xingtu-api.md +1916 -0
  24. package/skills/creator-analysis/references/api-contracts/douyin-xingtu-v2-api.md +1540 -0
  25. package/skills/creator-analysis/references/api-contracts/health-check.md +69 -0
  26. package/skills/creator-analysis/references/api-contracts/hybrid-parsing.md +78 -0
  27. package/skills/creator-analysis/references/api-contracts/instagram-v1-api.md +2256 -0
  28. package/skills/creator-analysis/references/api-contracts/instagram-v2-api.md +2011 -0
  29. package/skills/creator-analysis/references/api-contracts/instagram-v3-api.md +2630 -0
  30. package/skills/creator-analysis/references/api-contracts/ios-shortcut.md +44 -0
  31. package/skills/creator-analysis/references/api-contracts/kuaishou-app-api.md +1518 -0
  32. package/skills/creator-analysis/references/api-contracts/kuaishou-web-api.md +1242 -0
  33. package/skills/creator-analysis/references/api-contracts/lemon8-app-api.md +1088 -0
  34. package/skills/creator-analysis/references/api-contracts/linkedin-web-api.md +1949 -0
  35. package/skills/creator-analysis/references/api-contracts/media-ingest-api.md +126 -0
  36. package/skills/creator-analysis/references/api-contracts/pipixia-app-api.md +1142 -0
  37. package/skills/creator-analysis/references/api-contracts/reddit-app-api.md +2025 -0
  38. package/skills/creator-analysis/references/api-contracts/sora2-api.md +2266 -0
  39. package/skills/creator-analysis/references/api-contracts/temp-mail-api.md +208 -0
  40. package/skills/creator-analysis/references/api-contracts/threads-web-api.md +897 -0
  41. package/skills/creator-analysis/references/api-contracts/tikhub-downloader-api.md +134 -0
  42. package/skills/creator-analysis/references/api-contracts/tikhub-user-api.md +494 -0
  43. package/skills/creator-analysis/references/api-contracts/tiktok-ads-api.md +5947 -0
  44. package/skills/creator-analysis/references/api-contracts/tiktok-analytics-api.md +968 -0
  45. package/skills/creator-analysis/references/api-contracts/tiktok-app-v3-api.md +5735 -0
  46. package/skills/creator-analysis/references/api-contracts/tiktok-creator-api.md +1951 -0
  47. package/skills/creator-analysis/references/api-contracts/tiktok-interaction-api.md +742 -0
  48. package/skills/creator-analysis/references/api-contracts/tiktok-shop-web-api.md +1890 -0
  49. package/skills/creator-analysis/references/api-contracts/tiktok-web-api.md +4448 -0
  50. package/skills/creator-analysis/references/api-contracts/toutiao-app-api.md +342 -0
  51. package/skills/creator-analysis/references/api-contracts/toutiao-web-api.md +143 -0
  52. package/skills/creator-analysis/references/api-contracts/twitter-web-api.md +989 -0
  53. package/skills/creator-analysis/references/api-contracts/wechat-channels-api.md +809 -0
  54. package/skills/creator-analysis/references/api-contracts/wechat-media-platform-web-api.md +677 -0
  55. package/skills/creator-analysis/references/api-contracts/weibo-app-api.md +1547 -0
  56. package/skills/creator-analysis/references/api-contracts/weibo-web-api.md +798 -0
  57. package/skills/creator-analysis/references/api-contracts/weibo-web-v2-api.md +2459 -0
  58. package/skills/creator-analysis/references/api-contracts/xiaohongshu-app-api.md +1291 -0
  59. package/skills/creator-analysis/references/api-contracts/xiaohongshu-app-v2-api.md +1683 -0
  60. package/skills/creator-analysis/references/api-contracts/xiaohongshu-web-api.md +1324 -0
  61. package/skills/creator-analysis/references/api-contracts/xiaohongshu-web-v2-api.md +1209 -0
  62. package/skills/creator-analysis/references/api-contracts/xigua-app-v2-api.md +489 -0
  63. package/skills/creator-analysis/references/api-contracts/youtube-web-api.md +2636 -0
  64. package/skills/creator-analysis/references/api-contracts/youtube-web-v2-api.md +2660 -0
  65. package/skills/creator-analysis/references/api-contracts/zhihu-web-api.md +2315 -0
  66. package/skills/creator-analysis/references/api-tags/asr-api.md +100 -0
  67. package/skills/creator-analysis/references/api-tags/bilibili-app-api.md +482 -0
  68. package/skills/creator-analysis/references/api-tags/bilibili-web-api.md +1267 -0
  69. package/skills/creator-analysis/references/api-tags/demo-api.md +365 -0
  70. package/skills/creator-analysis/references/api-tags/douyin-app-v3-api.md +2012 -0
  71. package/skills/creator-analysis/references/api-tags/douyin-billboard-api.md +1428 -0
  72. package/skills/creator-analysis/references/api-tags/douyin-creator-api.md +694 -0
  73. package/skills/creator-analysis/references/api-tags/douyin-creator-v2-api.md +694 -0
  74. package/skills/creator-analysis/references/api-tags/douyin-search-api.md +1059 -0
  75. package/skills/creator-analysis/references/api-tags/douyin-web-api.md +3314 -0
  76. package/skills/creator-analysis/references/api-tags/douyin-xingtu-api.md +935 -0
  77. package/skills/creator-analysis/references/api-tags/douyin-xingtu-v2-api.md +925 -0
  78. package/skills/creator-analysis/references/api-tags/health-check.md +40 -0
  79. package/skills/creator-analysis/references/api-tags/hybrid-parsing.md +57 -0
  80. package/skills/creator-analysis/references/api-tags/instagram-v1-api.md +1224 -0
  81. package/skills/creator-analysis/references/api-tags/instagram-v2-api.md +1147 -0
  82. package/skills/creator-analysis/references/api-tags/instagram-v3-api.md +1123 -0
  83. package/skills/creator-analysis/references/api-tags/ios-shortcut.md +45 -0
  84. package/skills/creator-analysis/references/api-tags/kuaishou-app-api.md +846 -0
  85. package/skills/creator-analysis/references/api-tags/kuaishou-web-api.md +551 -0
  86. package/skills/creator-analysis/references/api-tags/lemon8-app-api.md +687 -0
  87. package/skills/creator-analysis/references/api-tags/linkedin-web-api.md +1105 -0
  88. package/skills/creator-analysis/references/api-tags/media-ingest-api.md +112 -0
  89. package/skills/creator-analysis/references/api-tags/pipixia-app-api.md +721 -0
  90. package/skills/creator-analysis/references/api-tags/reddit-app-api.md +1057 -0
  91. package/skills/creator-analysis/references/api-tags/sora2-api.md +737 -0
  92. package/skills/creator-analysis/references/api-tags/temp-mail-api.md +136 -0
  93. package/skills/creator-analysis/references/api-tags/threads-web-api.md +472 -0
  94. package/skills/creator-analysis/references/api-tags/tikhub-downloader-api.md +65 -0
  95. package/skills/creator-analysis/references/api-tags/tikhub-user-api.md +253 -0
  96. package/skills/creator-analysis/references/api-tags/tiktok-ads-api.md +1393 -0
  97. package/skills/creator-analysis/references/api-tags/tiktok-analytics-api.md +179 -0
  98. package/skills/creator-analysis/references/api-tags/tiktok-app-v3-api.md +3264 -0
  99. package/skills/creator-analysis/references/api-tags/tiktok-creator-api.md +709 -0
  100. package/skills/creator-analysis/references/api-tags/tiktok-interaction-api.md +366 -0
  101. package/skills/creator-analysis/references/api-tags/tiktok-shop-web-api.md +663 -0
  102. package/skills/creator-analysis/references/api-tags/tiktok-web-api.md +2516 -0
  103. package/skills/creator-analysis/references/api-tags/toutiao-app-api.md +220 -0
  104. package/skills/creator-analysis/references/api-tags/toutiao-web-api.md +96 -0
  105. package/skills/creator-analysis/references/api-tags/twitter-web-api.md +562 -0
  106. package/skills/creator-analysis/references/api-tags/wechat-channels-api.md +405 -0
  107. package/skills/creator-analysis/references/api-tags/wechat-media-platform-web-api.md +431 -0
  108. package/skills/creator-analysis/references/api-tags/weibo-app-api.md +851 -0
  109. package/skills/creator-analysis/references/api-tags/weibo-web-api.md +470 -0
  110. package/skills/creator-analysis/references/api-tags/weibo-web-v2-api.md +1405 -0
  111. package/skills/creator-analysis/references/api-tags/xiaohongshu-app-api.md +534 -0
  112. package/skills/creator-analysis/references/api-tags/xiaohongshu-app-v2-api.md +934 -0
  113. package/skills/creator-analysis/references/api-tags/xiaohongshu-web-api.md +757 -0
  114. package/skills/creator-analysis/references/api-tags/xiaohongshu-web-v2-api.md +762 -0
  115. package/skills/creator-analysis/references/api-tags/xigua-app-v2-api.md +308 -0
  116. package/skills/creator-analysis/references/api-tags/youtube-web-api.md +934 -0
  117. package/skills/creator-analysis/references/api-tags/youtube-web-v2-api.md +717 -0
  118. package/skills/creator-analysis/references/api-tags/zhihu-web-api.md +1384 -0
  119. package/skills/creator-analysis/references/asr-orchestration.md +33 -0
  120. package/skills/creator-analysis/references/config-templates/defaults.yaml +60 -0
  121. package/skills/creator-analysis/references/contracts/creator-card-fields.md +23 -0
  122. package/skills/creator-analysis/references/contracts/work-card-fields.md +32 -0
  123. package/skills/creator-analysis/references/platform-guides/douyin.md +49 -0
  124. package/skills/creator-analysis/references/platform-guides/generic.md +46 -0
  125. package/skills/creator-analysis/references/platform-guides/xiaohongshu.md +54 -0
  126. package/skills/creator-analysis/references/prompt-contracts/asr-clean.md +28 -0
  127. package/skills/creator-analysis/references/prompt-contracts/author-analysis-v2.md +46 -0
  128. package/skills/creator-analysis/references/prompt-contracts/author-analysis.md +49 -0
  129. package/skills/creator-analysis/references/prompt-contracts/cta.md +24 -0
  130. package/skills/creator-analysis/references/prompt-contracts/hook.md +25 -0
  131. package/skills/creator-analysis/references/prompt-contracts/insight.md +47 -0
  132. package/skills/creator-analysis/references/prompt-contracts/sampled-work-batch-explanations.md +30 -0
  133. package/skills/creator-analysis/references/prompt-contracts/structure.md +25 -0
  134. package/skills/creator-analysis/references/prompt-contracts/style.md +27 -0
  135. package/skills/creator-analysis/references/prompt-contracts/summary.md +29 -0
  136. package/skills/creator-analysis/references/prompt-contracts/topic.md +29 -0
  137. package/skills/creator-analysis/references/schemas/author-analysis-input-v1.schema.json +325 -0
  138. package/skills/creator-analysis/references/schemas/author-analysis-v2.schema.json +158 -0
  139. package/skills/creator-analysis/references/schemas/sampled-work-batch-explanations.schema.json +41 -0
  140. package/skills/creator-analysis/references/service-guides/asr-u2-u3-fallback.md +75 -0
  141. package/skills/creator-analysis/references/workflow.md +18 -0
  142. package/skills/creator-analysis/scripts/__init__.py +0 -0
  143. package/skills/creator-analysis/scripts/author_home/__init__.py +0 -0
  144. package/skills/creator-analysis/scripts/author_home/adapters/__init__.py +0 -0
  145. package/skills/creator-analysis/scripts/author_home/adapters/platform_adapters.py +299 -0
  146. package/skills/creator-analysis/scripts/author_home/analyzers/__init__.py +0 -0
  147. package/skills/creator-analysis/scripts/author_home/analyzers/author_analysis_v2_support.py +1122 -0
  148. package/skills/creator-analysis/scripts/author_home/analyzers/prompt_first_analyzers.py +260 -0
  149. package/skills/creator-analysis/scripts/author_home/analyzers/sampled_work_batch_explainer.py +260 -0
  150. package/skills/creator-analysis/scripts/author_home/asr/__init__.py +5 -0
  151. package/skills/creator-analysis/scripts/author_home/asr/home_asr.py +961 -0
  152. package/skills/creator-analysis/scripts/author_home/builders/__init__.py +0 -0
  153. package/skills/creator-analysis/scripts/author_home/builders/home_builders.py +149 -0
  154. package/skills/creator-analysis/scripts/author_home/collectors/__init__.py +0 -0
  155. package/skills/creator-analysis/scripts/author_home/collectors/homepage_collectors.py +636 -0
  156. package/skills/creator-analysis/scripts/author_home/orchestrator/__init__.py +0 -0
  157. package/skills/creator-analysis/scripts/author_home/orchestrator/run_author_analysis.py +491 -0
  158. package/skills/creator-analysis/scripts/author_home/orchestrator/work_analysis_artifacts.py +553 -0
  159. package/skills/creator-analysis/scripts/author_home/schema.py +417 -0
  160. package/skills/creator-analysis/scripts/core/__init__.py +0 -0
  161. package/skills/creator-analysis/scripts/core/analysis_pipeline.py +133 -0
  162. package/skills/creator-analysis/scripts/core/bootstrap_env.py +35 -0
  163. package/skills/creator-analysis/scripts/core/config_loader.py +418 -0
  164. package/skills/creator-analysis/scripts/core/extract_pipeline.py +173 -0
  165. package/skills/creator-analysis/scripts/core/progress_report.py +111 -0
  166. package/skills/creator-analysis/scripts/core/storage_router.py +253 -0
  167. package/skills/creator-analysis/scripts/core/tikomni_common.py +588 -0
  168. package/skills/creator-analysis/scripts/pipeline/__init__.py +0 -0
  169. package/skills/creator-analysis/scripts/pipeline/asr/__init__.py +0 -0
  170. package/skills/creator-analysis/scripts/pipeline/asr/asr_pipeline.py +1189 -0
  171. package/skills/creator-analysis/scripts/pipeline/asr/poll_u2_task.py +95 -0
  172. package/skills/creator-analysis/scripts/platform/__init__.py +0 -0
  173. package/skills/creator-analysis/scripts/platform/douyin/__init__.py +0 -0
  174. package/skills/creator-analysis/scripts/platform/douyin/douyin_video_type_matrix.py +224 -0
  175. package/skills/creator-analysis/scripts/platform/douyin/run_douyin_single_video.py +1208 -0
  176. package/skills/creator-analysis/scripts/platform/douyin/select_low_quality_video_url.py +200 -0
  177. package/skills/creator-analysis/scripts/platform/xiaohongshu/__init__.py +0 -0
  178. package/skills/creator-analysis/scripts/platform/xiaohongshu/run_xiaohongshu_extract.py +2128 -0
  179. package/skills/creator-analysis/scripts/writers/__init__.py +0 -0
  180. package/skills/creator-analysis/scripts/writers/write_author_homepage_samples.py +106 -0
  181. package/skills/creator-analysis/scripts/writers/write_benchmark_card.py +1402 -0
  182. package/skills/meta-capability/SKILL.md +69 -0
  183. package/skills/meta-capability/agents/openai.yaml +4 -0
  184. package/skills/meta-capability/env.example +42 -0
  185. package/skills/meta-capability/references/api-capability-index.md +92 -0
  186. package/skills/meta-capability/references/api-contracts/asr-api.md +130 -0
  187. package/skills/meta-capability/references/api-contracts/bilibili-app-api.md +776 -0
  188. package/skills/meta-capability/references/api-contracts/bilibili-web-api.md +2017 -0
  189. package/skills/meta-capability/references/api-contracts/demo-api.md +717 -0
  190. package/skills/meta-capability/references/api-contracts/douyin-app-v3-api.md +3594 -0
  191. package/skills/meta-capability/references/api-contracts/douyin-billboard-api.md +2274 -0
  192. package/skills/meta-capability/references/api-contracts/douyin-creator-api.md +1575 -0
  193. package/skills/meta-capability/references/api-contracts/douyin-creator-v2-api.md +3254 -0
  194. package/skills/meta-capability/references/api-contracts/douyin-search-api.md +4118 -0
  195. package/skills/meta-capability/references/api-contracts/douyin-web-api.md +5544 -0
  196. package/skills/meta-capability/references/api-contracts/douyin-xingtu-api.md +1916 -0
  197. package/skills/meta-capability/references/api-contracts/douyin-xingtu-v2-api.md +1540 -0
  198. package/skills/meta-capability/references/api-contracts/health-check.md +69 -0
  199. package/skills/meta-capability/references/api-contracts/hybrid-parsing.md +78 -0
  200. package/skills/meta-capability/references/api-contracts/instagram-v1-api.md +2256 -0
  201. package/skills/meta-capability/references/api-contracts/instagram-v2-api.md +2011 -0
  202. package/skills/meta-capability/references/api-contracts/instagram-v3-api.md +2630 -0
  203. package/skills/meta-capability/references/api-contracts/ios-shortcut.md +44 -0
  204. package/skills/meta-capability/references/api-contracts/kuaishou-app-api.md +1518 -0
  205. package/skills/meta-capability/references/api-contracts/kuaishou-web-api.md +1242 -0
  206. package/skills/meta-capability/references/api-contracts/lemon8-app-api.md +1088 -0
  207. package/skills/meta-capability/references/api-contracts/linkedin-web-api.md +1949 -0
  208. package/skills/meta-capability/references/api-contracts/media-ingest-api.md +126 -0
  209. package/skills/meta-capability/references/api-contracts/pipixia-app-api.md +1142 -0
  210. package/skills/meta-capability/references/api-contracts/reddit-app-api.md +2025 -0
  211. package/skills/meta-capability/references/api-contracts/sora2-api.md +2266 -0
  212. package/skills/meta-capability/references/api-contracts/temp-mail-api.md +208 -0
  213. package/skills/meta-capability/references/api-contracts/threads-web-api.md +897 -0
  214. package/skills/meta-capability/references/api-contracts/tikhub-downloader-api.md +134 -0
  215. package/skills/meta-capability/references/api-contracts/tikhub-user-api.md +494 -0
  216. package/skills/meta-capability/references/api-contracts/tiktok-ads-api.md +5947 -0
  217. package/skills/meta-capability/references/api-contracts/tiktok-analytics-api.md +968 -0
  218. package/skills/meta-capability/references/api-contracts/tiktok-app-v3-api.md +5735 -0
  219. package/skills/meta-capability/references/api-contracts/tiktok-creator-api.md +1951 -0
  220. package/skills/meta-capability/references/api-contracts/tiktok-interaction-api.md +742 -0
  221. package/skills/meta-capability/references/api-contracts/tiktok-shop-web-api.md +1890 -0
  222. package/skills/meta-capability/references/api-contracts/tiktok-web-api.md +4448 -0
  223. package/skills/meta-capability/references/api-contracts/toutiao-app-api.md +342 -0
  224. package/skills/meta-capability/references/api-contracts/toutiao-web-api.md +143 -0
  225. package/skills/meta-capability/references/api-contracts/twitter-web-api.md +989 -0
  226. package/skills/meta-capability/references/api-contracts/wechat-channels-api.md +809 -0
  227. package/skills/meta-capability/references/api-contracts/wechat-media-platform-web-api.md +677 -0
  228. package/skills/meta-capability/references/api-contracts/weibo-app-api.md +1547 -0
  229. package/skills/meta-capability/references/api-contracts/weibo-web-api.md +798 -0
  230. package/skills/meta-capability/references/api-contracts/weibo-web-v2-api.md +2459 -0
  231. package/skills/meta-capability/references/api-contracts/xiaohongshu-app-api.md +1291 -0
  232. package/skills/meta-capability/references/api-contracts/xiaohongshu-app-v2-api.md +1683 -0
  233. package/skills/meta-capability/references/api-contracts/xiaohongshu-web-api.md +1324 -0
  234. package/skills/meta-capability/references/api-contracts/xiaohongshu-web-v2-api.md +1209 -0
  235. package/skills/meta-capability/references/api-contracts/xigua-app-v2-api.md +489 -0
  236. package/skills/meta-capability/references/api-contracts/youtube-web-api.md +2636 -0
  237. package/skills/meta-capability/references/api-contracts/youtube-web-v2-api.md +2660 -0
  238. package/skills/meta-capability/references/api-contracts/zhihu-web-api.md +2315 -0
  239. package/skills/meta-capability/references/api-tags/asr-api.md +100 -0
  240. package/skills/meta-capability/references/api-tags/bilibili-app-api.md +482 -0
  241. package/skills/meta-capability/references/api-tags/bilibili-web-api.md +1267 -0
  242. package/skills/meta-capability/references/api-tags/demo-api.md +365 -0
  243. package/skills/meta-capability/references/api-tags/douyin-app-v3-api.md +2012 -0
  244. package/skills/meta-capability/references/api-tags/douyin-billboard-api.md +1428 -0
  245. package/skills/meta-capability/references/api-tags/douyin-creator-api.md +694 -0
  246. package/skills/meta-capability/references/api-tags/douyin-creator-v2-api.md +694 -0
  247. package/skills/meta-capability/references/api-tags/douyin-search-api.md +1059 -0
  248. package/skills/meta-capability/references/api-tags/douyin-web-api.md +3314 -0
  249. package/skills/meta-capability/references/api-tags/douyin-xingtu-api.md +935 -0
  250. package/skills/meta-capability/references/api-tags/douyin-xingtu-v2-api.md +925 -0
  251. package/skills/meta-capability/references/api-tags/health-check.md +40 -0
  252. package/skills/meta-capability/references/api-tags/hybrid-parsing.md +57 -0
  253. package/skills/meta-capability/references/api-tags/instagram-v1-api.md +1224 -0
  254. package/skills/meta-capability/references/api-tags/instagram-v2-api.md +1147 -0
  255. package/skills/meta-capability/references/api-tags/instagram-v3-api.md +1123 -0
  256. package/skills/meta-capability/references/api-tags/ios-shortcut.md +45 -0
  257. package/skills/meta-capability/references/api-tags/kuaishou-app-api.md +846 -0
  258. package/skills/meta-capability/references/api-tags/kuaishou-web-api.md +551 -0
  259. package/skills/meta-capability/references/api-tags/lemon8-app-api.md +687 -0
  260. package/skills/meta-capability/references/api-tags/linkedin-web-api.md +1105 -0
  261. package/skills/meta-capability/references/api-tags/media-ingest-api.md +112 -0
  262. package/skills/meta-capability/references/api-tags/pipixia-app-api.md +721 -0
  263. package/skills/meta-capability/references/api-tags/reddit-app-api.md +1057 -0
  264. package/skills/meta-capability/references/api-tags/sora2-api.md +737 -0
  265. package/skills/meta-capability/references/api-tags/temp-mail-api.md +136 -0
  266. package/skills/meta-capability/references/api-tags/threads-web-api.md +472 -0
  267. package/skills/meta-capability/references/api-tags/tikhub-downloader-api.md +65 -0
  268. package/skills/meta-capability/references/api-tags/tikhub-user-api.md +253 -0
  269. package/skills/meta-capability/references/api-tags/tiktok-ads-api.md +1393 -0
  270. package/skills/meta-capability/references/api-tags/tiktok-analytics-api.md +179 -0
  271. package/skills/meta-capability/references/api-tags/tiktok-app-v3-api.md +3264 -0
  272. package/skills/meta-capability/references/api-tags/tiktok-creator-api.md +709 -0
  273. package/skills/meta-capability/references/api-tags/tiktok-interaction-api.md +366 -0
  274. package/skills/meta-capability/references/api-tags/tiktok-shop-web-api.md +663 -0
  275. package/skills/meta-capability/references/api-tags/tiktok-web-api.md +2516 -0
  276. package/skills/meta-capability/references/api-tags/toutiao-app-api.md +220 -0
  277. package/skills/meta-capability/references/api-tags/toutiao-web-api.md +96 -0
  278. package/skills/meta-capability/references/api-tags/twitter-web-api.md +562 -0
  279. package/skills/meta-capability/references/api-tags/wechat-channels-api.md +405 -0
  280. package/skills/meta-capability/references/api-tags/wechat-media-platform-web-api.md +431 -0
  281. package/skills/meta-capability/references/api-tags/weibo-app-api.md +851 -0
  282. package/skills/meta-capability/references/api-tags/weibo-web-api.md +470 -0
  283. package/skills/meta-capability/references/api-tags/weibo-web-v2-api.md +1405 -0
  284. package/skills/meta-capability/references/api-tags/xiaohongshu-app-api.md +534 -0
  285. package/skills/meta-capability/references/api-tags/xiaohongshu-app-v2-api.md +934 -0
  286. package/skills/meta-capability/references/api-tags/xiaohongshu-web-api.md +757 -0
  287. package/skills/meta-capability/references/api-tags/xiaohongshu-web-v2-api.md +762 -0
  288. package/skills/meta-capability/references/api-tags/xigua-app-v2-api.md +308 -0
  289. package/skills/meta-capability/references/api-tags/youtube-web-api.md +934 -0
  290. package/skills/meta-capability/references/api-tags/youtube-web-v2-api.md +717 -0
  291. package/skills/meta-capability/references/api-tags/zhihu-web-api.md +1384 -0
  292. package/skills/meta-capability/references/config-templates/defaults.yaml +18 -0
  293. package/skills/meta-capability/references/dispatch.md +27 -0
  294. package/skills/meta-capability/references/execution-guidelines.md +25 -0
  295. package/skills/meta-capability/references/implemented-route-map.md +177 -0
  296. package/skills/meta-capability/references/service-guides/asr-u2-u3-fallback.md +75 -0
  297. package/skills/meta-capability/scripts/__init__.py +1 -0
  298. package/skills/meta-capability/scripts/call_route.py +141 -0
  299. package/skills/meta-capability/scripts/core/__init__.py +1 -0
  300. package/skills/meta-capability/scripts/core/bootstrap_env.py +32 -0
  301. package/skills/meta-capability/scripts/core/config_loader.py +204 -0
  302. package/skills/meta-capability/scripts/core/tikomni_common.py +443 -0
  303. package/skills/meta-capability/scripts/test_auth.py +98 -0
  304. package/skills/single-work-analysis/SKILL.md +62 -0
  305. package/skills/single-work-analysis/agents/openai.yaml +4 -0
  306. package/skills/single-work-analysis/env.example +36 -0
  307. package/skills/single-work-analysis/references/api-capability-index.md +92 -0
  308. package/skills/single-work-analysis/references/api-contracts/asr-api.md +130 -0
  309. package/skills/single-work-analysis/references/api-contracts/bilibili-app-api.md +776 -0
  310. package/skills/single-work-analysis/references/api-contracts/bilibili-web-api.md +2017 -0
  311. package/skills/single-work-analysis/references/api-contracts/demo-api.md +717 -0
  312. package/skills/single-work-analysis/references/api-contracts/douyin-app-v3-api.md +3594 -0
  313. package/skills/single-work-analysis/references/api-contracts/douyin-billboard-api.md +2274 -0
  314. package/skills/single-work-analysis/references/api-contracts/douyin-creator-api.md +1575 -0
  315. package/skills/single-work-analysis/references/api-contracts/douyin-creator-v2-api.md +3254 -0
  316. package/skills/single-work-analysis/references/api-contracts/douyin-search-api.md +4118 -0
  317. package/skills/single-work-analysis/references/api-contracts/douyin-web-api.md +5544 -0
  318. package/skills/single-work-analysis/references/api-contracts/douyin-xingtu-api.md +1916 -0
  319. package/skills/single-work-analysis/references/api-contracts/douyin-xingtu-v2-api.md +1540 -0
  320. package/skills/single-work-analysis/references/api-contracts/health-check.md +69 -0
  321. package/skills/single-work-analysis/references/api-contracts/hybrid-parsing.md +78 -0
  322. package/skills/single-work-analysis/references/api-contracts/instagram-v1-api.md +2256 -0
  323. package/skills/single-work-analysis/references/api-contracts/instagram-v2-api.md +2011 -0
  324. package/skills/single-work-analysis/references/api-contracts/instagram-v3-api.md +2630 -0
  325. package/skills/single-work-analysis/references/api-contracts/ios-shortcut.md +44 -0
  326. package/skills/single-work-analysis/references/api-contracts/kuaishou-app-api.md +1518 -0
  327. package/skills/single-work-analysis/references/api-contracts/kuaishou-web-api.md +1242 -0
  328. package/skills/single-work-analysis/references/api-contracts/lemon8-app-api.md +1088 -0
  329. package/skills/single-work-analysis/references/api-contracts/linkedin-web-api.md +1949 -0
  330. package/skills/single-work-analysis/references/api-contracts/media-ingest-api.md +126 -0
  331. package/skills/single-work-analysis/references/api-contracts/pipixia-app-api.md +1142 -0
  332. package/skills/single-work-analysis/references/api-contracts/reddit-app-api.md +2025 -0
  333. package/skills/single-work-analysis/references/api-contracts/sora2-api.md +2266 -0
  334. package/skills/single-work-analysis/references/api-contracts/temp-mail-api.md +208 -0
  335. package/skills/single-work-analysis/references/api-contracts/threads-web-api.md +897 -0
  336. package/skills/single-work-analysis/references/api-contracts/tikhub-downloader-api.md +134 -0
  337. package/skills/single-work-analysis/references/api-contracts/tikhub-user-api.md +494 -0
  338. package/skills/single-work-analysis/references/api-contracts/tiktok-ads-api.md +5947 -0
  339. package/skills/single-work-analysis/references/api-contracts/tiktok-analytics-api.md +968 -0
  340. package/skills/single-work-analysis/references/api-contracts/tiktok-app-v3-api.md +5735 -0
  341. package/skills/single-work-analysis/references/api-contracts/tiktok-creator-api.md +1951 -0
  342. package/skills/single-work-analysis/references/api-contracts/tiktok-interaction-api.md +742 -0
  343. package/skills/single-work-analysis/references/api-contracts/tiktok-shop-web-api.md +1890 -0
  344. package/skills/single-work-analysis/references/api-contracts/tiktok-web-api.md +4448 -0
  345. package/skills/single-work-analysis/references/api-contracts/toutiao-app-api.md +342 -0
  346. package/skills/single-work-analysis/references/api-contracts/toutiao-web-api.md +143 -0
  347. package/skills/single-work-analysis/references/api-contracts/twitter-web-api.md +989 -0
  348. package/skills/single-work-analysis/references/api-contracts/wechat-channels-api.md +809 -0
  349. package/skills/single-work-analysis/references/api-contracts/wechat-media-platform-web-api.md +677 -0
  350. package/skills/single-work-analysis/references/api-contracts/weibo-app-api.md +1547 -0
  351. package/skills/single-work-analysis/references/api-contracts/weibo-web-api.md +798 -0
  352. package/skills/single-work-analysis/references/api-contracts/weibo-web-v2-api.md +2459 -0
  353. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-app-api.md +1291 -0
  354. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-app-v2-api.md +1683 -0
  355. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-web-api.md +1324 -0
  356. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-web-v2-api.md +1209 -0
  357. package/skills/single-work-analysis/references/api-contracts/xigua-app-v2-api.md +489 -0
  358. package/skills/single-work-analysis/references/api-contracts/youtube-web-api.md +2636 -0
  359. package/skills/single-work-analysis/references/api-contracts/youtube-web-v2-api.md +2660 -0
  360. package/skills/single-work-analysis/references/api-contracts/zhihu-web-api.md +2315 -0
  361. package/skills/single-work-analysis/references/api-tags/asr-api.md +100 -0
  362. package/skills/single-work-analysis/references/api-tags/bilibili-app-api.md +482 -0
  363. package/skills/single-work-analysis/references/api-tags/bilibili-web-api.md +1267 -0
  364. package/skills/single-work-analysis/references/api-tags/demo-api.md +365 -0
  365. package/skills/single-work-analysis/references/api-tags/douyin-app-v3-api.md +2012 -0
  366. package/skills/single-work-analysis/references/api-tags/douyin-billboard-api.md +1428 -0
  367. package/skills/single-work-analysis/references/api-tags/douyin-creator-api.md +694 -0
  368. package/skills/single-work-analysis/references/api-tags/douyin-creator-v2-api.md +694 -0
  369. package/skills/single-work-analysis/references/api-tags/douyin-search-api.md +1059 -0
  370. package/skills/single-work-analysis/references/api-tags/douyin-web-api.md +3314 -0
  371. package/skills/single-work-analysis/references/api-tags/douyin-xingtu-api.md +935 -0
  372. package/skills/single-work-analysis/references/api-tags/douyin-xingtu-v2-api.md +925 -0
  373. package/skills/single-work-analysis/references/api-tags/health-check.md +40 -0
  374. package/skills/single-work-analysis/references/api-tags/hybrid-parsing.md +57 -0
  375. package/skills/single-work-analysis/references/api-tags/instagram-v1-api.md +1224 -0
  376. package/skills/single-work-analysis/references/api-tags/instagram-v2-api.md +1147 -0
  377. package/skills/single-work-analysis/references/api-tags/instagram-v3-api.md +1123 -0
  378. package/skills/single-work-analysis/references/api-tags/ios-shortcut.md +45 -0
  379. package/skills/single-work-analysis/references/api-tags/kuaishou-app-api.md +846 -0
  380. package/skills/single-work-analysis/references/api-tags/kuaishou-web-api.md +551 -0
  381. package/skills/single-work-analysis/references/api-tags/lemon8-app-api.md +687 -0
  382. package/skills/single-work-analysis/references/api-tags/linkedin-web-api.md +1105 -0
  383. package/skills/single-work-analysis/references/api-tags/media-ingest-api.md +112 -0
  384. package/skills/single-work-analysis/references/api-tags/pipixia-app-api.md +721 -0
  385. package/skills/single-work-analysis/references/api-tags/reddit-app-api.md +1057 -0
  386. package/skills/single-work-analysis/references/api-tags/sora2-api.md +737 -0
  387. package/skills/single-work-analysis/references/api-tags/temp-mail-api.md +136 -0
  388. package/skills/single-work-analysis/references/api-tags/threads-web-api.md +472 -0
  389. package/skills/single-work-analysis/references/api-tags/tikhub-downloader-api.md +65 -0
  390. package/skills/single-work-analysis/references/api-tags/tikhub-user-api.md +253 -0
  391. package/skills/single-work-analysis/references/api-tags/tiktok-ads-api.md +1393 -0
  392. package/skills/single-work-analysis/references/api-tags/tiktok-analytics-api.md +179 -0
  393. package/skills/single-work-analysis/references/api-tags/tiktok-app-v3-api.md +3264 -0
  394. package/skills/single-work-analysis/references/api-tags/tiktok-creator-api.md +709 -0
  395. package/skills/single-work-analysis/references/api-tags/tiktok-interaction-api.md +366 -0
  396. package/skills/single-work-analysis/references/api-tags/tiktok-shop-web-api.md +663 -0
  397. package/skills/single-work-analysis/references/api-tags/tiktok-web-api.md +2516 -0
  398. package/skills/single-work-analysis/references/api-tags/toutiao-app-api.md +220 -0
  399. package/skills/single-work-analysis/references/api-tags/toutiao-web-api.md +96 -0
  400. package/skills/single-work-analysis/references/api-tags/twitter-web-api.md +562 -0
  401. package/skills/single-work-analysis/references/api-tags/wechat-channels-api.md +405 -0
  402. package/skills/single-work-analysis/references/api-tags/wechat-media-platform-web-api.md +431 -0
  403. package/skills/single-work-analysis/references/api-tags/weibo-app-api.md +851 -0
  404. package/skills/single-work-analysis/references/api-tags/weibo-web-api.md +470 -0
  405. package/skills/single-work-analysis/references/api-tags/weibo-web-v2-api.md +1405 -0
  406. package/skills/single-work-analysis/references/api-tags/xiaohongshu-app-api.md +534 -0
  407. package/skills/single-work-analysis/references/api-tags/xiaohongshu-app-v2-api.md +934 -0
  408. package/skills/single-work-analysis/references/api-tags/xiaohongshu-web-api.md +757 -0
  409. package/skills/single-work-analysis/references/api-tags/xiaohongshu-web-v2-api.md +762 -0
  410. package/skills/single-work-analysis/references/api-tags/xigua-app-v2-api.md +308 -0
  411. package/skills/single-work-analysis/references/api-tags/youtube-web-api.md +934 -0
  412. package/skills/single-work-analysis/references/api-tags/youtube-web-v2-api.md +717 -0
  413. package/skills/single-work-analysis/references/api-tags/zhihu-web-api.md +1384 -0
  414. package/skills/single-work-analysis/references/asr-and-fallback.md +20 -0
  415. package/skills/single-work-analysis/references/config-templates/defaults.yaml +58 -0
  416. package/skills/single-work-analysis/references/contracts/work-card-fields.md +41 -0
  417. package/skills/single-work-analysis/references/platform-guides/douyin.md +47 -0
  418. package/skills/single-work-analysis/references/platform-guides/generic.md +43 -0
  419. package/skills/single-work-analysis/references/platform-guides/xiaohongshu.md +54 -0
  420. package/skills/single-work-analysis/references/prompt-contracts/asr-clean.md +28 -0
  421. package/skills/single-work-analysis/references/prompt-contracts/cta.md +24 -0
  422. package/skills/single-work-analysis/references/prompt-contracts/hook.md +25 -0
  423. package/skills/single-work-analysis/references/prompt-contracts/insight.md +47 -0
  424. package/skills/single-work-analysis/references/prompt-contracts/structure.md +25 -0
  425. package/skills/single-work-analysis/references/prompt-contracts/style.md +27 -0
  426. package/skills/single-work-analysis/references/prompt-contracts/summary.md +29 -0
  427. package/skills/single-work-analysis/references/prompt-contracts/topic.md +29 -0
  428. package/skills/single-work-analysis/references/schemas/work-card.schema.json +39 -0
  429. package/skills/single-work-analysis/references/service-guides/asr-u2-u3-fallback.md +75 -0
  430. package/skills/single-work-analysis/scripts/__init__.py +0 -0
  431. package/skills/single-work-analysis/scripts/core/__init__.py +0 -0
  432. package/skills/single-work-analysis/scripts/core/analysis_pipeline.py +133 -0
  433. package/skills/single-work-analysis/scripts/core/bootstrap_env.py +35 -0
  434. package/skills/single-work-analysis/scripts/core/config_loader.py +418 -0
  435. package/skills/single-work-analysis/scripts/core/extract_pipeline.py +173 -0
  436. package/skills/single-work-analysis/scripts/core/progress_report.py +111 -0
  437. package/skills/single-work-analysis/scripts/core/storage_router.py +253 -0
  438. package/skills/single-work-analysis/scripts/core/tikomni_common.py +588 -0
  439. package/skills/single-work-analysis/scripts/pipeline/__init__.py +0 -0
  440. package/skills/single-work-analysis/scripts/pipeline/asr/__init__.py +0 -0
  441. package/skills/single-work-analysis/scripts/pipeline/asr/asr_pipeline.py +1189 -0
  442. package/skills/single-work-analysis/scripts/pipeline/asr/poll_u2_task.py +95 -0
  443. package/skills/single-work-analysis/scripts/platform/__init__.py +0 -0
  444. package/skills/single-work-analysis/scripts/platform/douyin/__init__.py +0 -0
  445. package/skills/single-work-analysis/scripts/platform/douyin/douyin_video_type_matrix.py +224 -0
  446. package/skills/single-work-analysis/scripts/platform/douyin/run_douyin_single_video.py +1233 -0
  447. package/skills/single-work-analysis/scripts/platform/douyin/select_low_quality_video_url.py +200 -0
  448. package/skills/single-work-analysis/scripts/platform/xiaohongshu/__init__.py +0 -0
  449. package/skills/single-work-analysis/scripts/platform/xiaohongshu/run_xiaohongshu_extract.py +2156 -0
  450. package/skills/single-work-analysis/scripts/writers/__init__.py +0 -0
  451. package/skills/single-work-analysis/scripts/writers/write_benchmark_card.py +1402 -0
@@ -0,0 +1,417 @@
1
+ #!/usr/bin/env python3
2
+ """Schema definitions and minimal validators for creator-analysis."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from dataclasses import asdict, dataclass, field
7
+ from datetime import datetime, timedelta, timezone
8
+ from typing import Any, Dict, List, Optional
9
+
10
+
11
+ DISPLAY_TIMEZONE = timezone(timedelta(hours=8))
12
+ SUBTITLE_SOURCE_ENUM = {"native_subtitle", "external_asr", "missing"}
13
+ ASR_SOURCE_ENUM = {"native_subtitle", "external_asr", "fallback_none"}
14
+ WORK_MODALITY_ENUM = {"video", "text"}
15
+ PRIMARY_TEXT_SOURCE_ENUM = {"asr_clean", "caption_raw"}
16
+ ANALYSIS_ELIGIBILITY_ENUM = {"eligible", "incomplete"}
17
+
18
+
19
+ def _to_text(value: Any) -> str:
20
+ if value is None:
21
+ return ""
22
+ if isinstance(value, str):
23
+ return value.strip()
24
+ return str(value).strip()
25
+
26
+
27
+ def _to_int(value: Any, default: int = 0) -> int:
28
+ try:
29
+ if isinstance(value, bool):
30
+ return int(value)
31
+ if isinstance(value, (int, float)):
32
+ return int(value)
33
+ text = _to_text(value).replace(",", "")
34
+ return int(float(text)) if text else default
35
+ except Exception:
36
+ return default
37
+
38
+
39
+ def _to_bool(value: Any, default: bool = False) -> bool:
40
+ if isinstance(value, bool):
41
+ return value
42
+ if isinstance(value, (int, float)):
43
+ return bool(int(value))
44
+ text = _to_text(value).lower()
45
+ if not text:
46
+ return default
47
+ if text in {"1", "true", "yes", "y", "video"}:
48
+ return True
49
+ if text in {"0", "false", "no", "n", "text", "image", "photo", "note"}:
50
+ return False
51
+ return default
52
+
53
+
54
+ def _normalize_timestamp(value: Any) -> Optional[datetime]:
55
+ if value is None:
56
+ return None
57
+ if isinstance(value, datetime):
58
+ dt = value
59
+ if dt.tzinfo is None:
60
+ return dt.replace(tzinfo=DISPLAY_TIMEZONE)
61
+ return dt.astimezone(DISPLAY_TIMEZONE)
62
+
63
+ if isinstance(value, (int, float)):
64
+ timestamp = float(value)
65
+ else:
66
+ text = _to_text(value)
67
+ if not text:
68
+ return None
69
+ try:
70
+ timestamp = float(text)
71
+ except Exception:
72
+ normalized = text.replace("Z", "+00:00")
73
+ try:
74
+ dt = datetime.fromisoformat(normalized)
75
+ except Exception:
76
+ for fmt in ("%Y-%m-%d", "%Y/%m/%d", "%Y-%m-%d %H:%M:%S", "%Y/%m/%d %H:%M:%S"):
77
+ try:
78
+ dt = datetime.strptime(text, fmt)
79
+ break
80
+ except Exception:
81
+ dt = None
82
+ if dt is None:
83
+ return None
84
+ return dt.replace(tzinfo=DISPLAY_TIMEZONE)
85
+
86
+ if dt.tzinfo is None:
87
+ return dt.replace(tzinfo=DISPLAY_TIMEZONE)
88
+ return dt.astimezone(DISPLAY_TIMEZONE)
89
+
90
+ if abs(timestamp) >= 1_000_000_000_000:
91
+ timestamp /= 1000.0
92
+ if timestamp <= 0:
93
+ return None
94
+ return datetime.fromtimestamp(timestamp, tz=timezone.utc).astimezone(DISPLAY_TIMEZONE)
95
+
96
+
97
+ def _format_published_date(value: Any) -> str:
98
+ dt = _normalize_timestamp(value)
99
+ return dt.strftime("%Y-%m-%d") if dt else "N/A"
100
+
101
+
102
+ def _infer_work_modality(*, work_modality: str, is_video: Any, content_type: str, subtitle_raw: str, video_download_url: str) -> str:
103
+ modality = _to_text(work_modality).lower()
104
+ if modality in WORK_MODALITY_ENUM:
105
+ return modality
106
+
107
+ if _to_bool(is_video, default=False):
108
+ return "video"
109
+
110
+ content_type_value = _to_text(content_type).lower()
111
+ if content_type_value in {"video", "mixed", "mix", "video_note", "note_video", "normal", "0"}:
112
+ return "video"
113
+ if content_type_value in {"text", "note", "image", "photo", "album", "1"}:
114
+ return "text"
115
+
116
+ if subtitle_raw or video_download_url:
117
+ return "video"
118
+ return "text"
119
+
120
+
121
+ def _infer_primary_text(*, work_modality: str, caption_raw: str, asr_clean: str) -> str:
122
+ if work_modality == "video":
123
+ return asr_clean
124
+ return caption_raw
125
+
126
+
127
+ def _infer_primary_text_source(*, work_modality: str, caption_raw: str, asr_clean: str) -> str:
128
+ if work_modality == "video":
129
+ return "asr_clean"
130
+ return "caption_raw"
131
+
132
+
133
+ def _infer_analysis_state(*, work_modality: str, caption_raw: str, asr_raw: str, video_download_url: str) -> Dict[str, str]:
134
+ if work_modality == "video":
135
+ if asr_raw:
136
+ return {"analysis_eligibility": "eligible", "analysis_exclusion_reason": ""}
137
+ return {
138
+ "analysis_eligibility": "incomplete",
139
+ "analysis_exclusion_reason": "video_asr_unavailable",
140
+ }
141
+
142
+ if caption_raw:
143
+ return {"analysis_eligibility": "eligible", "analysis_exclusion_reason": ""}
144
+ return {
145
+ "analysis_eligibility": "incomplete",
146
+ "analysis_exclusion_reason": "caption_raw_missing",
147
+ }
148
+
149
+
150
+ @dataclass
151
+ class AuthorProfileNormalized:
152
+ platform: str
153
+ platform_author_id: str
154
+ author_handle: str
155
+ nickname: str
156
+ ip_location: str
157
+ fans_count: int
158
+ liked_count: int
159
+ collected_count: int
160
+ signature: str
161
+ avatar_url: str
162
+ works_count: int
163
+ verified: bool
164
+ snapshot_at: str
165
+ author_platform_id: str = ""
166
+ platform_native_refs: Dict[str, Any] = field(default_factory=dict)
167
+
168
+
169
+ @dataclass
170
+ class WorkItemNormalized:
171
+ platform: str
172
+ platform_work_id: str
173
+ platform_author_id: str
174
+ author_handle: str
175
+ title: str
176
+ caption_raw: str
177
+ work_modality: str
178
+ published_date: str
179
+ duration_ms: int
180
+ tags: List[str] = field(default_factory=list)
181
+ metrics: Dict[str, int] = field(default_factory=dict)
182
+ cover_image: str = ""
183
+ source_url: str = ""
184
+ share_url: str = ""
185
+ video_download_url: str = ""
186
+ primary_text: str = ""
187
+ primary_text_source: str = "caption_raw"
188
+ analysis_eligibility: str = "eligible"
189
+ analysis_exclusion_reason: str = ""
190
+ platform_native_refs: Dict[str, Any] = field(default_factory=dict)
191
+ raw_ref: Dict[str, Any] = field(default_factory=dict)
192
+ author_platform_id: str = ""
193
+ subtitle_raw: str = ""
194
+ subtitle_source: str = "missing"
195
+ publish_time: str = ""
196
+ create_time_sec: int = 0
197
+ content_type: str = ""
198
+ video_down_url: str = ""
199
+ asr_raw: str = ""
200
+ asr_clean: str = ""
201
+ asr_status: str = "pending"
202
+ asr_error_reason: str = ""
203
+ asr_source: str = "fallback_none"
204
+ is_video: bool = False
205
+
206
+
207
+ def validate_author_profile(payload: Dict[str, Any]) -> List[Dict[str, str]]:
208
+ required_types = {
209
+ "platform": str,
210
+ "platform_author_id": str,
211
+ "author_handle": str,
212
+ "nickname": str,
213
+ "ip_location": str,
214
+ "fans_count": int,
215
+ "liked_count": int,
216
+ "collected_count": int,
217
+ "signature": str,
218
+ "avatar_url": str,
219
+ "works_count": int,
220
+ "verified": bool,
221
+ "snapshot_at": str,
222
+ }
223
+ missing: List[Dict[str, str]] = []
224
+ for key, expected in required_types.items():
225
+ if key not in payload:
226
+ missing.append({"field": key, "reason": "missing"})
227
+ continue
228
+ value = payload.get(key)
229
+ if expected is int and not isinstance(value, int):
230
+ missing.append({"field": key, "reason": "type_error:int"})
231
+ elif expected is bool and not isinstance(value, bool):
232
+ missing.append({"field": key, "reason": "type_error:bool"})
233
+ elif expected is str and not isinstance(value, str):
234
+ missing.append({"field": key, "reason": "type_error:str"})
235
+
236
+ for key in ("platform", "platform_author_id", "nickname"):
237
+ value = payload.get(key)
238
+ if isinstance(value, str) and not value.strip():
239
+ missing.append({"field": key, "reason": "empty_value"})
240
+ return missing
241
+
242
+
243
+ def validate_work_item(payload: Dict[str, Any]) -> List[Dict[str, str]]:
244
+ required_types = {
245
+ "platform": str,
246
+ "platform_work_id": str,
247
+ "platform_author_id": str,
248
+ "author_handle": str,
249
+ "title": str,
250
+ "caption_raw": str,
251
+ "work_modality": str,
252
+ "published_date": str,
253
+ "duration_ms": int,
254
+ "tags": list,
255
+ "metrics": dict,
256
+ "cover_image": str,
257
+ "source_url": str,
258
+ "share_url": str,
259
+ "video_download_url": str,
260
+ "primary_text": str,
261
+ "primary_text_source": str,
262
+ "analysis_eligibility": str,
263
+ "analysis_exclusion_reason": str,
264
+ "platform_native_refs": dict,
265
+ "raw_ref": dict,
266
+ "subtitle_raw": str,
267
+ "subtitle_source": str,
268
+ "publish_time": str,
269
+ "content_type": str,
270
+ "video_down_url": str,
271
+ "asr_raw": str,
272
+ "asr_clean": str,
273
+ "asr_status": str,
274
+ "asr_error_reason": str,
275
+ "asr_source": str,
276
+ }
277
+ missing: List[Dict[str, str]] = []
278
+ for key, expected in required_types.items():
279
+ if key not in payload:
280
+ missing.append({"field": key, "reason": "missing"})
281
+ continue
282
+ if not isinstance(payload.get(key), expected):
283
+ missing.append({"field": key, "reason": f"type_error:{expected.__name__}"})
284
+
285
+ for key in ("platform", "platform_work_id", "platform_author_id"):
286
+ value = payload.get(key)
287
+ if isinstance(value, str) and not value.strip():
288
+ missing.append({"field": key, "reason": "empty_value"})
289
+
290
+ if not any(_to_text(payload.get(key)) for key in ("title", "caption_raw", "asr_raw")):
291
+ missing.append({"field": "title|caption_raw|asr_raw", "reason": "all_empty"})
292
+
293
+ if _to_text(payload.get("work_modality")) not in WORK_MODALITY_ENUM:
294
+ missing.append({"field": "work_modality", "reason": "invalid_enum"})
295
+
296
+ if _to_text(payload.get("primary_text_source")) not in PRIMARY_TEXT_SOURCE_ENUM:
297
+ missing.append({"field": "primary_text_source", "reason": "invalid_enum"})
298
+
299
+ if _to_text(payload.get("analysis_eligibility")) not in ANALYSIS_ELIGIBILITY_ENUM:
300
+ missing.append({"field": "analysis_eligibility", "reason": "invalid_enum"})
301
+
302
+ subtitle_source = payload.get("subtitle_source")
303
+ if isinstance(subtitle_source, str) and subtitle_source not in SUBTITLE_SOURCE_ENUM:
304
+ missing.append({"field": "subtitle_source", "reason": "invalid_enum"})
305
+
306
+ asr_source = payload.get("asr_source")
307
+ if isinstance(asr_source, str) and asr_source not in ASR_SOURCE_ENUM:
308
+ missing.append({"field": "asr_source", "reason": "invalid_enum"})
309
+ return missing
310
+
311
+
312
+ def validate_works_collection(works: Any) -> List[Dict[str, str]]:
313
+ if not isinstance(works, list):
314
+ return [{"field": "works", "reason": "type_error:list"}]
315
+ if not works:
316
+ return [{"field": "works", "reason": "empty_collection"}]
317
+ return []
318
+
319
+
320
+ def build_author_profile(**kwargs: Any) -> Dict[str, Any]:
321
+ platform_author_id = _to_text(kwargs.get("platform_author_id"))
322
+ profile = AuthorProfileNormalized(
323
+ platform=_to_text(kwargs.get("platform")),
324
+ platform_author_id=platform_author_id,
325
+ author_handle=_to_text(kwargs.get("author_handle")),
326
+ nickname=_to_text(kwargs.get("nickname")),
327
+ ip_location=_to_text(kwargs.get("ip_location")),
328
+ fans_count=_to_int(kwargs.get("fans_count")),
329
+ liked_count=_to_int(kwargs.get("liked_count")),
330
+ collected_count=_to_int(kwargs.get("collected_count")),
331
+ signature=_to_text(kwargs.get("signature")),
332
+ avatar_url=_to_text(kwargs.get("avatar_url")),
333
+ works_count=_to_int(kwargs.get("works_count")),
334
+ verified=bool(kwargs.get("verified", False)),
335
+ snapshot_at=_to_text(kwargs.get("snapshot_at")) or datetime.now(tz=DISPLAY_TIMEZONE).isoformat(timespec="seconds"),
336
+ author_platform_id=_to_text(kwargs.get("author_platform_id")) or platform_author_id,
337
+ platform_native_refs=dict(kwargs.get("platform_native_refs") or {}),
338
+ )
339
+ return asdict(profile)
340
+
341
+
342
+ def build_work_item(**kwargs: Any) -> Dict[str, Any]:
343
+ caption_raw = _to_text(kwargs.get("caption_raw") if kwargs.get("caption_raw") is not None else kwargs.get("desc"))
344
+ subtitle_raw = _to_text(kwargs.get("subtitle_raw"))
345
+ subtitle_source = _to_text(kwargs.get("subtitle_source")) or ("native_subtitle" if subtitle_raw else "missing")
346
+ asr_raw = _to_text(kwargs.get("asr_raw")) or subtitle_raw
347
+ asr_clean = _to_text(kwargs.get("asr_clean")) or asr_raw
348
+ video_download_url = _to_text(kwargs.get("video_download_url") if kwargs.get("video_download_url") is not None else kwargs.get("video_down_url"))
349
+ work_modality = _infer_work_modality(
350
+ work_modality=_to_text(kwargs.get("work_modality")),
351
+ is_video=kwargs.get("is_video"),
352
+ content_type=_to_text(kwargs.get("content_type")),
353
+ subtitle_raw=subtitle_raw,
354
+ video_download_url=video_download_url,
355
+ )
356
+ primary_text = _to_text(kwargs.get("primary_text")) or _infer_primary_text(
357
+ work_modality=work_modality,
358
+ caption_raw=caption_raw,
359
+ asr_clean=asr_clean,
360
+ )
361
+ primary_text_source_raw = _to_text(kwargs.get("primary_text_source"))
362
+ primary_text_source = (
363
+ primary_text_source_raw
364
+ if primary_text_source_raw in PRIMARY_TEXT_SOURCE_ENUM
365
+ else _infer_primary_text_source(
366
+ work_modality=work_modality,
367
+ caption_raw=caption_raw,
368
+ asr_clean=asr_clean,
369
+ )
370
+ )
371
+ analysis_state = _infer_analysis_state(
372
+ work_modality=work_modality,
373
+ caption_raw=caption_raw,
374
+ asr_raw=asr_raw,
375
+ video_download_url=video_download_url,
376
+ )
377
+ item = WorkItemNormalized(
378
+ platform=_to_text(kwargs.get("platform")),
379
+ platform_work_id=_to_text(kwargs.get("platform_work_id")),
380
+ platform_author_id=_to_text(kwargs.get("platform_author_id")),
381
+ author_handle=_to_text(kwargs.get("author_handle")),
382
+ title=_to_text(kwargs.get("title")),
383
+ caption_raw=caption_raw,
384
+ work_modality=work_modality,
385
+ published_date=_to_text(kwargs.get("published_date")) or _format_published_date(kwargs.get("publish_time")),
386
+ duration_ms=_to_int(kwargs.get("duration_ms")),
387
+ tags=list(kwargs.get("tags") or []),
388
+ metrics=dict(kwargs.get("metrics") or {}),
389
+ cover_image=_to_text(kwargs.get("cover_image")),
390
+ source_url=_to_text(kwargs.get("source_url")),
391
+ share_url=_to_text(kwargs.get("share_url")) or _to_text(kwargs.get("source_url")),
392
+ video_download_url=video_download_url,
393
+ primary_text=primary_text,
394
+ primary_text_source=primary_text_source,
395
+ analysis_eligibility=_to_text(kwargs.get("analysis_eligibility")) or analysis_state["analysis_eligibility"],
396
+ analysis_exclusion_reason=_to_text(kwargs.get("analysis_exclusion_reason")) or analysis_state["analysis_exclusion_reason"],
397
+ platform_native_refs=dict(kwargs.get("platform_native_refs") or {}),
398
+ raw_ref=dict(kwargs.get("raw_ref") or {}),
399
+ author_platform_id=_to_text(kwargs.get("author_platform_id")) or _to_text(kwargs.get("platform_author_id")),
400
+ subtitle_raw=subtitle_raw,
401
+ subtitle_source=subtitle_source,
402
+ publish_time=_to_text(kwargs.get("publish_time")),
403
+ create_time_sec=_to_int(kwargs.get("create_time_sec")),
404
+ content_type=_to_text(kwargs.get("content_type")),
405
+ video_down_url=video_download_url,
406
+ asr_raw=asr_raw,
407
+ asr_clean=asr_clean,
408
+ asr_status=_to_text(kwargs.get("asr_status")) or ("success" if asr_raw else "pending"),
409
+ asr_error_reason=_to_text(kwargs.get("asr_error_reason")),
410
+ asr_source=_to_text(kwargs.get("asr_source")) or (
411
+ "native_subtitle"
412
+ if subtitle_source == "native_subtitle" and subtitle_raw
413
+ else ("external_asr" if subtitle_source == "external_asr" and asr_raw else "fallback_none")
414
+ ),
415
+ is_video=work_modality == "video",
416
+ )
417
+ return asdict(item)
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env python3
2
+ """Shared analysis pipeline helpers for benchmark card generation."""
3
+
4
+ import json
5
+ import os
6
+ import re
7
+ import subprocess
8
+ from typing import Any, Dict, List, Optional
9
+
10
+ PROMPT_CONTRACT_FILES: Dict[str, str] = {
11
+ "选题": "topic.md",
12
+ "文风": "style.md",
13
+ "Hook": "hook.md",
14
+ "结构": "structure.md",
15
+ "洞察分析": "insight.md",
16
+ "CTA": "cta.md",
17
+ "总结": "summary.md",
18
+ }
19
+
20
+ DEFAULT_MODULE_SECTIONS: List[str] = ["选题", "文风", "Hook", "结构"]
21
+ DEFAULT_INSIGHT_SECTION = "洞察分析"
22
+
23
+
24
+ def contracts_dir() -> str:
25
+ here = os.path.dirname(os.path.abspath(__file__))
26
+ return os.path.normpath(os.path.join(here, "..", "..", "references", "prompt-contracts"))
27
+
28
+
29
+ def load_contract_prompt(filename: str) -> str:
30
+ path = os.path.join(contracts_dir(), filename)
31
+ try:
32
+ with open(path, "r", encoding="utf-8") as handle:
33
+ content = handle.read()
34
+ except Exception:
35
+ return ""
36
+
37
+ match = re.search(r"##\s*User Prompt \(Verbatim\).*?```text\n(.*?)\n```", content, flags=re.S)
38
+ if match:
39
+ return match.group(1).strip()
40
+ return content.strip()
41
+
42
+
43
+ def _analysis_payload(fields: Dict[str, Any]) -> Dict[str, Any]:
44
+ asr_raw = fields.get("raw_content")
45
+ return {
46
+ "title": fields.get("title"),
47
+ "asr_raw": asr_raw,
48
+ "asr_clean": fields.get("asr_clean") or asr_raw,
49
+ "metrics": {
50
+ "digg_count": fields.get("digg_count"),
51
+ "comment_count": fields.get("comment_count"),
52
+ "collect_count": fields.get("collect_count"),
53
+ "share_count": fields.get("share_count"),
54
+ "play_count": fields.get("play_count"),
55
+ },
56
+ }
57
+
58
+
59
+ def call_prompt_llm(section: str, prompt_text: str, fields: Dict[str, Any], timeout_sec: int = 240) -> str:
60
+ if not prompt_text:
61
+ return "数据不足"
62
+
63
+ message = (
64
+ f"请严格根据下面提示词原文完成【{section}】段落输出。\n"
65
+ "要求:\n"
66
+ "1) 不要解释提示词,不要输出思考过程。\n"
67
+ "2) 不要套额外模板,不要输出打分。\n"
68
+ "3) 仅输出该段正文内容。\n\n"
69
+ "=== 提示词原文开始 ===\n"
70
+ f"{prompt_text}\n"
71
+ "=== 提示词原文结束 ===\n\n"
72
+ "=== 输入数据(JSON) ===\n"
73
+ f"{json.dumps(_analysis_payload(fields), ensure_ascii=False)}"
74
+ )
75
+
76
+ try:
77
+ run = subprocess.run(
78
+ ["openclaw", "agent", "--agent", "main", "--message", message, "--json"],
79
+ capture_output=True,
80
+ text=True,
81
+ timeout=timeout_sec,
82
+ check=False,
83
+ )
84
+ data = json.loads(run.stdout or "{}")
85
+ texts: List[str] = []
86
+ for payload in data.get("result", {}).get("payloads", []):
87
+ text = payload.get("text") if isinstance(payload, dict) else None
88
+ if isinstance(text, str) and text.strip():
89
+ texts.append(text.strip())
90
+ if texts:
91
+ return "\n".join(texts).strip()
92
+ except Exception:
93
+ pass
94
+
95
+ return "数据不足"
96
+
97
+
98
+ def build_module_lines(
99
+ fields: Dict[str, Any],
100
+ sections: Optional[List[str]] = None,
101
+ contract_files: Optional[Dict[str, str]] = None,
102
+ ) -> Dict[str, List[str]]:
103
+ picked_sections = sections or DEFAULT_MODULE_SECTIONS
104
+ mapping = contract_files or PROMPT_CONTRACT_FILES
105
+ outputs: Dict[str, List[str]] = {}
106
+
107
+ for section in picked_sections:
108
+ prompt_text = load_contract_prompt(mapping.get(section, ""))
109
+ content = call_prompt_llm(section, prompt_text, fields)
110
+ outputs[section] = [content if content else "数据不足"]
111
+
112
+ return outputs
113
+
114
+
115
+ def build_single_section_lines(
116
+ fields: Dict[str, Any],
117
+ section: str = DEFAULT_INSIGHT_SECTION,
118
+ contract_files: Optional[Dict[str, str]] = None,
119
+ ) -> List[str]:
120
+ mapping = contract_files or PROMPT_CONTRACT_FILES
121
+ prompt_text = load_contract_prompt(mapping.get(section, ""))
122
+ content = call_prompt_llm(section, prompt_text, fields)
123
+ return [content if content else "数据不足"]
124
+
125
+
126
+ def build_analysis_sections(fields: Dict[str, Any]) -> Dict[str, Any]:
127
+ """Build prompt-contract-driven analysis sections for benchmark cards."""
128
+ modules = build_module_lines(fields)
129
+ insight = build_single_section_lines(fields, section=DEFAULT_INSIGHT_SECTION)
130
+ return {
131
+ "modules": modules,
132
+ "insight": insight,
133
+ }
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env python3
2
+ """Shared bootstrap utilities for direct script execution."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import sys
7
+ from pathlib import Path
8
+ from typing import Optional
9
+
10
+
11
+ def _locate_repo_root(file_path: str) -> Optional[Path]:
12
+ current = Path(file_path).resolve()
13
+ for parent in current.parents:
14
+ if (parent / "scripts").is_dir():
15
+ return parent
16
+ return None
17
+
18
+
19
+ def bootstrap_for_direct_run(file_path: str, package: Optional[str] = None) -> Optional[str]:
20
+ """Inject repo root into sys.path when executed as a direct script path.
21
+
22
+ Returns the injected repo-root string on success, otherwise ``None``.
23
+ """
24
+
25
+ if package not in {None, ""}:
26
+ return None
27
+
28
+ repo_root = _locate_repo_root(file_path)
29
+ if repo_root is None:
30
+ return None
31
+
32
+ repo_root_str = str(repo_root)
33
+ if repo_root_str not in sys.path:
34
+ sys.path.insert(0, repo_root_str)
35
+ return repo_root_str