@tikomni/skills 0.1.2 → 0.1.4

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 (480) hide show
  1. package/.skill-package-allowlist.txt +1 -3
  2. package/README.md +41 -49
  3. package/README.zh-CN.md +43 -51
  4. package/bin/tikomni-skills.js +2 -2
  5. package/env.example +37 -56
  6. package/package.json +7 -3
  7. package/skills/social-media-crawl/SKILL.md +53 -0
  8. package/skills/social-media-crawl/agents/openai.yaml +5 -0
  9. package/skills/social-media-crawl/references/contracts/output-envelope.md +22 -0
  10. package/skills/social-media-crawl/references/contracts/work-fact-card-fields.md +48 -0
  11. package/skills/social-media-crawl/references/guides/generic-mcp-objects.md +30 -0
  12. package/skills/social-media-crawl/references/mcp-usage-contract.md +30 -0
  13. package/skills/social-media-crawl/references/pipelines/douyin-creator-home.md +7 -0
  14. package/skills/social-media-crawl/references/pipelines/douyin-single-work.md +7 -0
  15. package/skills/social-media-crawl/references/pipelines/xiaohongshu-creator-home.md +7 -0
  16. package/skills/social-media-crawl/references/pipelines/xiaohongshu-single-work.md +7 -0
  17. package/skills/social-media-crawl/references/schemas/creator-profile.schema.json +33 -0
  18. package/skills/social-media-crawl/references/schemas/output-envelope.schema.json +41 -0
  19. package/skills/social-media-crawl/references/schemas/work-collection.schema.json +29 -0
  20. package/skills/social-media-crawl/references/schemas/work-fact-card.schema.json +67 -0
  21. package/skills/social-media-crawl/references/service-guides/u2-u3-mandatory-fallback.md +21 -0
  22. package/skills/social-media-crawl/scripts/__init__.py +2 -0
  23. package/skills/social-media-crawl/scripts/core/__init__.py +2 -0
  24. package/skills/{creator-analysis/scripts/pipeline/asr → social-media-crawl/scripts/core}/asr_pipeline.py +252 -9
  25. package/skills/social-media-crawl/scripts/core/completeness.py +83 -0
  26. package/skills/{single-work-analysis → social-media-crawl}/scripts/core/config_loader.py +108 -167
  27. package/skills/social-media-crawl/scripts/core/mcp_dispatch.py +145 -0
  28. package/skills/social-media-crawl/scripts/core/object_detection.py +63 -0
  29. package/skills/{creator-analysis/scripts/pipeline/asr → social-media-crawl/scripts/core}/poll_u2_task.py +6 -2
  30. package/skills/{single-work-analysis → social-media-crawl}/scripts/core/progress_report.py +32 -0
  31. package/skills/social-media-crawl/scripts/core/storage_router.py +160 -0
  32. package/skills/{creator-analysis → social-media-crawl}/scripts/core/tikomni_common.py +13 -3
  33. package/skills/social-media-crawl/scripts/core/u3_fallback.py +328 -0
  34. package/skills/social-media-crawl/scripts/pipelines/__init__.py +2 -0
  35. package/skills/social-media-crawl/scripts/pipelines/douyin_creator_home_helpers.py +35 -0
  36. package/skills/social-media-crawl/scripts/pipelines/douyin_platform_adapter.py +7 -0
  37. package/skills/{creator-analysis/scripts/author_home/asr → social-media-crawl/scripts/pipelines}/home_asr.py +1 -1
  38. package/skills/{creator-analysis/scripts/author_home/adapters → social-media-crawl/scripts/pipelines}/platform_adapters.py +8 -2
  39. package/skills/social-media-crawl/scripts/pipelines/run_douyin_creator_home.py +237 -0
  40. package/skills/{single-work-analysis/scripts/platform/douyin/run_douyin_single_video.py → social-media-crawl/scripts/pipelines/run_douyin_single_work.py} +282 -174
  41. package/skills/social-media-crawl/scripts/pipelines/run_xiaohongshu_creator_home.py +237 -0
  42. package/skills/{single-work-analysis/scripts/platform/xiaohongshu/run_xiaohongshu_extract.py → social-media-crawl/scripts/pipelines/run_xiaohongshu_single_work.py} +290 -141
  43. package/skills/{creator-analysis/scripts/author_home → social-media-crawl/scripts/pipelines}/schema.py +1 -1
  44. package/skills/social-media-crawl/scripts/pipelines/xiaohongshu_creator_home_helpers.py +35 -0
  45. package/skills/social-media-crawl/scripts/pipelines/xiaohongshu_platform_adapter.py +7 -0
  46. package/skills/social-media-crawl/scripts/writers/__init__.py +1 -0
  47. package/skills/social-media-crawl/scripts/writers/write_work_fact_card.py +391 -0
  48. package/skills/creator-analysis/SKILL.md +0 -95
  49. package/skills/creator-analysis/agents/openai.yaml +0 -4
  50. package/skills/creator-analysis/env.example +0 -36
  51. package/skills/creator-analysis/references/api-capability-index.md +0 -92
  52. package/skills/creator-analysis/references/api-contracts/asr-api.md +0 -130
  53. package/skills/creator-analysis/references/api-contracts/bilibili-app-api.md +0 -776
  54. package/skills/creator-analysis/references/api-contracts/bilibili-web-api.md +0 -2017
  55. package/skills/creator-analysis/references/api-contracts/demo-api.md +0 -717
  56. package/skills/creator-analysis/references/api-contracts/douyin-app-v3-api.md +0 -3594
  57. package/skills/creator-analysis/references/api-contracts/douyin-billboard-api.md +0 -2274
  58. package/skills/creator-analysis/references/api-contracts/douyin-creator-api.md +0 -1575
  59. package/skills/creator-analysis/references/api-contracts/douyin-creator-v2-api.md +0 -3254
  60. package/skills/creator-analysis/references/api-contracts/douyin-search-api.md +0 -4118
  61. package/skills/creator-analysis/references/api-contracts/douyin-web-api.md +0 -5544
  62. package/skills/creator-analysis/references/api-contracts/douyin-xingtu-api.md +0 -1916
  63. package/skills/creator-analysis/references/api-contracts/douyin-xingtu-v2-api.md +0 -1540
  64. package/skills/creator-analysis/references/api-contracts/health-check.md +0 -69
  65. package/skills/creator-analysis/references/api-contracts/hybrid-parsing.md +0 -78
  66. package/skills/creator-analysis/references/api-contracts/instagram-v1-api.md +0 -2256
  67. package/skills/creator-analysis/references/api-contracts/instagram-v2-api.md +0 -2011
  68. package/skills/creator-analysis/references/api-contracts/instagram-v3-api.md +0 -2630
  69. package/skills/creator-analysis/references/api-contracts/ios-shortcut.md +0 -44
  70. package/skills/creator-analysis/references/api-contracts/kuaishou-app-api.md +0 -1518
  71. package/skills/creator-analysis/references/api-contracts/kuaishou-web-api.md +0 -1242
  72. package/skills/creator-analysis/references/api-contracts/lemon8-app-api.md +0 -1088
  73. package/skills/creator-analysis/references/api-contracts/linkedin-web-api.md +0 -1949
  74. package/skills/creator-analysis/references/api-contracts/media-ingest-api.md +0 -126
  75. package/skills/creator-analysis/references/api-contracts/pipixia-app-api.md +0 -1142
  76. package/skills/creator-analysis/references/api-contracts/reddit-app-api.md +0 -2025
  77. package/skills/creator-analysis/references/api-contracts/sora2-api.md +0 -2266
  78. package/skills/creator-analysis/references/api-contracts/temp-mail-api.md +0 -208
  79. package/skills/creator-analysis/references/api-contracts/threads-web-api.md +0 -897
  80. package/skills/creator-analysis/references/api-contracts/tikhub-downloader-api.md +0 -134
  81. package/skills/creator-analysis/references/api-contracts/tikhub-user-api.md +0 -494
  82. package/skills/creator-analysis/references/api-contracts/tiktok-ads-api.md +0 -5947
  83. package/skills/creator-analysis/references/api-contracts/tiktok-analytics-api.md +0 -968
  84. package/skills/creator-analysis/references/api-contracts/tiktok-app-v3-api.md +0 -5735
  85. package/skills/creator-analysis/references/api-contracts/tiktok-creator-api.md +0 -1951
  86. package/skills/creator-analysis/references/api-contracts/tiktok-interaction-api.md +0 -742
  87. package/skills/creator-analysis/references/api-contracts/tiktok-shop-web-api.md +0 -1890
  88. package/skills/creator-analysis/references/api-contracts/tiktok-web-api.md +0 -4448
  89. package/skills/creator-analysis/references/api-contracts/toutiao-app-api.md +0 -342
  90. package/skills/creator-analysis/references/api-contracts/toutiao-web-api.md +0 -143
  91. package/skills/creator-analysis/references/api-contracts/twitter-web-api.md +0 -989
  92. package/skills/creator-analysis/references/api-contracts/wechat-channels-api.md +0 -809
  93. package/skills/creator-analysis/references/api-contracts/wechat-media-platform-web-api.md +0 -677
  94. package/skills/creator-analysis/references/api-contracts/weibo-app-api.md +0 -1547
  95. package/skills/creator-analysis/references/api-contracts/weibo-web-api.md +0 -798
  96. package/skills/creator-analysis/references/api-contracts/weibo-web-v2-api.md +0 -2459
  97. package/skills/creator-analysis/references/api-contracts/xiaohongshu-app-api.md +0 -1291
  98. package/skills/creator-analysis/references/api-contracts/xiaohongshu-app-v2-api.md +0 -1683
  99. package/skills/creator-analysis/references/api-contracts/xiaohongshu-web-api.md +0 -1324
  100. package/skills/creator-analysis/references/api-contracts/xiaohongshu-web-v2-api.md +0 -1209
  101. package/skills/creator-analysis/references/api-contracts/xigua-app-v2-api.md +0 -489
  102. package/skills/creator-analysis/references/api-contracts/youtube-web-api.md +0 -2636
  103. package/skills/creator-analysis/references/api-contracts/youtube-web-v2-api.md +0 -2660
  104. package/skills/creator-analysis/references/api-contracts/zhihu-web-api.md +0 -2315
  105. package/skills/creator-analysis/references/api-tags/asr-api.md +0 -100
  106. package/skills/creator-analysis/references/api-tags/bilibili-app-api.md +0 -482
  107. package/skills/creator-analysis/references/api-tags/bilibili-web-api.md +0 -1267
  108. package/skills/creator-analysis/references/api-tags/demo-api.md +0 -365
  109. package/skills/creator-analysis/references/api-tags/douyin-app-v3-api.md +0 -2012
  110. package/skills/creator-analysis/references/api-tags/douyin-billboard-api.md +0 -1428
  111. package/skills/creator-analysis/references/api-tags/douyin-creator-api.md +0 -694
  112. package/skills/creator-analysis/references/api-tags/douyin-creator-v2-api.md +0 -694
  113. package/skills/creator-analysis/references/api-tags/douyin-search-api.md +0 -1059
  114. package/skills/creator-analysis/references/api-tags/douyin-web-api.md +0 -3314
  115. package/skills/creator-analysis/references/api-tags/douyin-xingtu-api.md +0 -935
  116. package/skills/creator-analysis/references/api-tags/douyin-xingtu-v2-api.md +0 -925
  117. package/skills/creator-analysis/references/api-tags/health-check.md +0 -40
  118. package/skills/creator-analysis/references/api-tags/hybrid-parsing.md +0 -57
  119. package/skills/creator-analysis/references/api-tags/instagram-v1-api.md +0 -1224
  120. package/skills/creator-analysis/references/api-tags/instagram-v2-api.md +0 -1147
  121. package/skills/creator-analysis/references/api-tags/instagram-v3-api.md +0 -1123
  122. package/skills/creator-analysis/references/api-tags/ios-shortcut.md +0 -45
  123. package/skills/creator-analysis/references/api-tags/kuaishou-app-api.md +0 -846
  124. package/skills/creator-analysis/references/api-tags/kuaishou-web-api.md +0 -551
  125. package/skills/creator-analysis/references/api-tags/lemon8-app-api.md +0 -687
  126. package/skills/creator-analysis/references/api-tags/linkedin-web-api.md +0 -1105
  127. package/skills/creator-analysis/references/api-tags/media-ingest-api.md +0 -112
  128. package/skills/creator-analysis/references/api-tags/pipixia-app-api.md +0 -721
  129. package/skills/creator-analysis/references/api-tags/reddit-app-api.md +0 -1057
  130. package/skills/creator-analysis/references/api-tags/sora2-api.md +0 -737
  131. package/skills/creator-analysis/references/api-tags/temp-mail-api.md +0 -136
  132. package/skills/creator-analysis/references/api-tags/threads-web-api.md +0 -472
  133. package/skills/creator-analysis/references/api-tags/tikhub-downloader-api.md +0 -65
  134. package/skills/creator-analysis/references/api-tags/tikhub-user-api.md +0 -253
  135. package/skills/creator-analysis/references/api-tags/tiktok-ads-api.md +0 -1393
  136. package/skills/creator-analysis/references/api-tags/tiktok-analytics-api.md +0 -179
  137. package/skills/creator-analysis/references/api-tags/tiktok-app-v3-api.md +0 -3264
  138. package/skills/creator-analysis/references/api-tags/tiktok-creator-api.md +0 -709
  139. package/skills/creator-analysis/references/api-tags/tiktok-interaction-api.md +0 -366
  140. package/skills/creator-analysis/references/api-tags/tiktok-shop-web-api.md +0 -663
  141. package/skills/creator-analysis/references/api-tags/tiktok-web-api.md +0 -2516
  142. package/skills/creator-analysis/references/api-tags/toutiao-app-api.md +0 -220
  143. package/skills/creator-analysis/references/api-tags/toutiao-web-api.md +0 -96
  144. package/skills/creator-analysis/references/api-tags/twitter-web-api.md +0 -562
  145. package/skills/creator-analysis/references/api-tags/wechat-channels-api.md +0 -405
  146. package/skills/creator-analysis/references/api-tags/wechat-media-platform-web-api.md +0 -431
  147. package/skills/creator-analysis/references/api-tags/weibo-app-api.md +0 -851
  148. package/skills/creator-analysis/references/api-tags/weibo-web-api.md +0 -470
  149. package/skills/creator-analysis/references/api-tags/weibo-web-v2-api.md +0 -1405
  150. package/skills/creator-analysis/references/api-tags/xiaohongshu-app-api.md +0 -534
  151. package/skills/creator-analysis/references/api-tags/xiaohongshu-app-v2-api.md +0 -934
  152. package/skills/creator-analysis/references/api-tags/xiaohongshu-web-api.md +0 -757
  153. package/skills/creator-analysis/references/api-tags/xiaohongshu-web-v2-api.md +0 -762
  154. package/skills/creator-analysis/references/api-tags/xigua-app-v2-api.md +0 -308
  155. package/skills/creator-analysis/references/api-tags/youtube-web-api.md +0 -934
  156. package/skills/creator-analysis/references/api-tags/youtube-web-v2-api.md +0 -717
  157. package/skills/creator-analysis/references/api-tags/zhihu-web-api.md +0 -1384
  158. package/skills/creator-analysis/references/asr-orchestration.md +0 -33
  159. package/skills/creator-analysis/references/config-templates/defaults.yaml +0 -60
  160. package/skills/creator-analysis/references/contracts/creator-card-fields.md +0 -25
  161. package/skills/creator-analysis/references/contracts/work-card-fields.md +0 -68
  162. package/skills/creator-analysis/references/platform-guides/douyin.md +0 -54
  163. package/skills/creator-analysis/references/platform-guides/generic.md +0 -50
  164. package/skills/creator-analysis/references/platform-guides/xiaohongshu.md +0 -69
  165. package/skills/creator-analysis/references/prompt-contracts/asr-clean.md +0 -28
  166. package/skills/creator-analysis/references/prompt-contracts/author-analysis-v2.md +0 -46
  167. package/skills/creator-analysis/references/prompt-contracts/author-analysis.md +0 -49
  168. package/skills/creator-analysis/references/prompt-contracts/cta.md +0 -24
  169. package/skills/creator-analysis/references/prompt-contracts/hook.md +0 -25
  170. package/skills/creator-analysis/references/prompt-contracts/insight.md +0 -47
  171. package/skills/creator-analysis/references/prompt-contracts/sampled-work-batch-explanations.md +0 -30
  172. package/skills/creator-analysis/references/prompt-contracts/structure.md +0 -25
  173. package/skills/creator-analysis/references/prompt-contracts/style.md +0 -27
  174. package/skills/creator-analysis/references/prompt-contracts/summary.md +0 -29
  175. package/skills/creator-analysis/references/prompt-contracts/topic.md +0 -29
  176. package/skills/creator-analysis/references/schemas/author-analysis-input-v1.schema.json +0 -325
  177. package/skills/creator-analysis/references/schemas/author-analysis-v2.schema.json +0 -287
  178. package/skills/creator-analysis/references/schemas/sampled-work-batch-explanations.schema.json +0 -41
  179. package/skills/creator-analysis/references/service-guides/asr-u2-u3-fallback.md +0 -75
  180. package/skills/creator-analysis/references/workflow.md +0 -23
  181. package/skills/creator-analysis/scripts/__init__.py +0 -0
  182. package/skills/creator-analysis/scripts/author_home/__init__.py +0 -0
  183. package/skills/creator-analysis/scripts/author_home/adapters/__init__.py +0 -0
  184. package/skills/creator-analysis/scripts/author_home/analyzers/__init__.py +0 -0
  185. package/skills/creator-analysis/scripts/author_home/analyzers/author_analysis_v2_support.py +0 -1165
  186. package/skills/creator-analysis/scripts/author_home/analyzers/prompt_first_analyzers.py +0 -447
  187. package/skills/creator-analysis/scripts/author_home/analyzers/sampled_work_batch_explainer.py +0 -331
  188. package/skills/creator-analysis/scripts/author_home/asr/__init__.py +0 -5
  189. package/skills/creator-analysis/scripts/author_home/builders/__init__.py +0 -0
  190. package/skills/creator-analysis/scripts/author_home/builders/home_builders.py +0 -213
  191. package/skills/creator-analysis/scripts/author_home/collectors/__init__.py +0 -0
  192. package/skills/creator-analysis/scripts/author_home/orchestrator/__init__.py +0 -0
  193. package/skills/creator-analysis/scripts/author_home/orchestrator/run_author_analysis.py +0 -834
  194. package/skills/creator-analysis/scripts/author_home/orchestrator/work_analysis_artifacts.py +0 -609
  195. package/skills/creator-analysis/scripts/core/__init__.py +0 -0
  196. package/skills/creator-analysis/scripts/core/analysis_pipeline.py +0 -133
  197. package/skills/creator-analysis/scripts/core/config_loader.py +0 -418
  198. package/skills/creator-analysis/scripts/core/progress_report.py +0 -111
  199. package/skills/creator-analysis/scripts/core/storage_router.py +0 -256
  200. package/skills/creator-analysis/scripts/pipeline/__init__.py +0 -0
  201. package/skills/creator-analysis/scripts/pipeline/asr/__init__.py +0 -0
  202. package/skills/creator-analysis/scripts/platform/__init__.py +0 -0
  203. package/skills/creator-analysis/scripts/platform/douyin/__init__.py +0 -0
  204. package/skills/creator-analysis/scripts/platform/douyin/run_douyin_single_video.py +0 -1208
  205. package/skills/creator-analysis/scripts/platform/xiaohongshu/__init__.py +0 -0
  206. package/skills/creator-analysis/scripts/platform/xiaohongshu/run_xiaohongshu_extract.py +0 -2128
  207. package/skills/creator-analysis/scripts/writers/__init__.py +0 -0
  208. package/skills/creator-analysis/scripts/writers/write_author_homepage_samples.py +0 -107
  209. package/skills/creator-analysis/scripts/writers/write_benchmark_card.py +0 -1579
  210. package/skills/meta-capability/SKILL.md +0 -69
  211. package/skills/meta-capability/agents/openai.yaml +0 -4
  212. package/skills/meta-capability/env.example +0 -42
  213. package/skills/meta-capability/references/api-capability-index.md +0 -92
  214. package/skills/meta-capability/references/api-contracts/asr-api.md +0 -130
  215. package/skills/meta-capability/references/api-contracts/bilibili-app-api.md +0 -776
  216. package/skills/meta-capability/references/api-contracts/bilibili-web-api.md +0 -2017
  217. package/skills/meta-capability/references/api-contracts/demo-api.md +0 -717
  218. package/skills/meta-capability/references/api-contracts/douyin-app-v3-api.md +0 -3594
  219. package/skills/meta-capability/references/api-contracts/douyin-billboard-api.md +0 -2274
  220. package/skills/meta-capability/references/api-contracts/douyin-creator-api.md +0 -1575
  221. package/skills/meta-capability/references/api-contracts/douyin-creator-v2-api.md +0 -3254
  222. package/skills/meta-capability/references/api-contracts/douyin-search-api.md +0 -4118
  223. package/skills/meta-capability/references/api-contracts/douyin-web-api.md +0 -5544
  224. package/skills/meta-capability/references/api-contracts/douyin-xingtu-api.md +0 -1916
  225. package/skills/meta-capability/references/api-contracts/douyin-xingtu-v2-api.md +0 -1540
  226. package/skills/meta-capability/references/api-contracts/health-check.md +0 -69
  227. package/skills/meta-capability/references/api-contracts/hybrid-parsing.md +0 -78
  228. package/skills/meta-capability/references/api-contracts/instagram-v1-api.md +0 -2256
  229. package/skills/meta-capability/references/api-contracts/instagram-v2-api.md +0 -2011
  230. package/skills/meta-capability/references/api-contracts/instagram-v3-api.md +0 -2630
  231. package/skills/meta-capability/references/api-contracts/ios-shortcut.md +0 -44
  232. package/skills/meta-capability/references/api-contracts/kuaishou-app-api.md +0 -1518
  233. package/skills/meta-capability/references/api-contracts/kuaishou-web-api.md +0 -1242
  234. package/skills/meta-capability/references/api-contracts/lemon8-app-api.md +0 -1088
  235. package/skills/meta-capability/references/api-contracts/linkedin-web-api.md +0 -1949
  236. package/skills/meta-capability/references/api-contracts/media-ingest-api.md +0 -126
  237. package/skills/meta-capability/references/api-contracts/pipixia-app-api.md +0 -1142
  238. package/skills/meta-capability/references/api-contracts/reddit-app-api.md +0 -2025
  239. package/skills/meta-capability/references/api-contracts/sora2-api.md +0 -2266
  240. package/skills/meta-capability/references/api-contracts/temp-mail-api.md +0 -208
  241. package/skills/meta-capability/references/api-contracts/threads-web-api.md +0 -897
  242. package/skills/meta-capability/references/api-contracts/tikhub-downloader-api.md +0 -134
  243. package/skills/meta-capability/references/api-contracts/tikhub-user-api.md +0 -494
  244. package/skills/meta-capability/references/api-contracts/tiktok-ads-api.md +0 -5947
  245. package/skills/meta-capability/references/api-contracts/tiktok-analytics-api.md +0 -968
  246. package/skills/meta-capability/references/api-contracts/tiktok-app-v3-api.md +0 -5735
  247. package/skills/meta-capability/references/api-contracts/tiktok-creator-api.md +0 -1951
  248. package/skills/meta-capability/references/api-contracts/tiktok-interaction-api.md +0 -742
  249. package/skills/meta-capability/references/api-contracts/tiktok-shop-web-api.md +0 -1890
  250. package/skills/meta-capability/references/api-contracts/tiktok-web-api.md +0 -4448
  251. package/skills/meta-capability/references/api-contracts/toutiao-app-api.md +0 -342
  252. package/skills/meta-capability/references/api-contracts/toutiao-web-api.md +0 -143
  253. package/skills/meta-capability/references/api-contracts/twitter-web-api.md +0 -989
  254. package/skills/meta-capability/references/api-contracts/wechat-channels-api.md +0 -809
  255. package/skills/meta-capability/references/api-contracts/wechat-media-platform-web-api.md +0 -677
  256. package/skills/meta-capability/references/api-contracts/weibo-app-api.md +0 -1547
  257. package/skills/meta-capability/references/api-contracts/weibo-web-api.md +0 -798
  258. package/skills/meta-capability/references/api-contracts/weibo-web-v2-api.md +0 -2459
  259. package/skills/meta-capability/references/api-contracts/xiaohongshu-app-api.md +0 -1291
  260. package/skills/meta-capability/references/api-contracts/xiaohongshu-app-v2-api.md +0 -1683
  261. package/skills/meta-capability/references/api-contracts/xiaohongshu-web-api.md +0 -1324
  262. package/skills/meta-capability/references/api-contracts/xiaohongshu-web-v2-api.md +0 -1209
  263. package/skills/meta-capability/references/api-contracts/xigua-app-v2-api.md +0 -489
  264. package/skills/meta-capability/references/api-contracts/youtube-web-api.md +0 -2636
  265. package/skills/meta-capability/references/api-contracts/youtube-web-v2-api.md +0 -2660
  266. package/skills/meta-capability/references/api-contracts/zhihu-web-api.md +0 -2315
  267. package/skills/meta-capability/references/api-tags/asr-api.md +0 -100
  268. package/skills/meta-capability/references/api-tags/bilibili-app-api.md +0 -482
  269. package/skills/meta-capability/references/api-tags/bilibili-web-api.md +0 -1267
  270. package/skills/meta-capability/references/api-tags/demo-api.md +0 -365
  271. package/skills/meta-capability/references/api-tags/douyin-app-v3-api.md +0 -2012
  272. package/skills/meta-capability/references/api-tags/douyin-billboard-api.md +0 -1428
  273. package/skills/meta-capability/references/api-tags/douyin-creator-api.md +0 -694
  274. package/skills/meta-capability/references/api-tags/douyin-creator-v2-api.md +0 -694
  275. package/skills/meta-capability/references/api-tags/douyin-search-api.md +0 -1059
  276. package/skills/meta-capability/references/api-tags/douyin-web-api.md +0 -3314
  277. package/skills/meta-capability/references/api-tags/douyin-xingtu-api.md +0 -935
  278. package/skills/meta-capability/references/api-tags/douyin-xingtu-v2-api.md +0 -925
  279. package/skills/meta-capability/references/api-tags/health-check.md +0 -40
  280. package/skills/meta-capability/references/api-tags/hybrid-parsing.md +0 -57
  281. package/skills/meta-capability/references/api-tags/instagram-v1-api.md +0 -1224
  282. package/skills/meta-capability/references/api-tags/instagram-v2-api.md +0 -1147
  283. package/skills/meta-capability/references/api-tags/instagram-v3-api.md +0 -1123
  284. package/skills/meta-capability/references/api-tags/ios-shortcut.md +0 -45
  285. package/skills/meta-capability/references/api-tags/kuaishou-app-api.md +0 -846
  286. package/skills/meta-capability/references/api-tags/kuaishou-web-api.md +0 -551
  287. package/skills/meta-capability/references/api-tags/lemon8-app-api.md +0 -687
  288. package/skills/meta-capability/references/api-tags/linkedin-web-api.md +0 -1105
  289. package/skills/meta-capability/references/api-tags/media-ingest-api.md +0 -112
  290. package/skills/meta-capability/references/api-tags/pipixia-app-api.md +0 -721
  291. package/skills/meta-capability/references/api-tags/reddit-app-api.md +0 -1057
  292. package/skills/meta-capability/references/api-tags/sora2-api.md +0 -737
  293. package/skills/meta-capability/references/api-tags/temp-mail-api.md +0 -136
  294. package/skills/meta-capability/references/api-tags/threads-web-api.md +0 -472
  295. package/skills/meta-capability/references/api-tags/tikhub-downloader-api.md +0 -65
  296. package/skills/meta-capability/references/api-tags/tikhub-user-api.md +0 -253
  297. package/skills/meta-capability/references/api-tags/tiktok-ads-api.md +0 -1393
  298. package/skills/meta-capability/references/api-tags/tiktok-analytics-api.md +0 -179
  299. package/skills/meta-capability/references/api-tags/tiktok-app-v3-api.md +0 -3264
  300. package/skills/meta-capability/references/api-tags/tiktok-creator-api.md +0 -709
  301. package/skills/meta-capability/references/api-tags/tiktok-interaction-api.md +0 -366
  302. package/skills/meta-capability/references/api-tags/tiktok-shop-web-api.md +0 -663
  303. package/skills/meta-capability/references/api-tags/tiktok-web-api.md +0 -2516
  304. package/skills/meta-capability/references/api-tags/toutiao-app-api.md +0 -220
  305. package/skills/meta-capability/references/api-tags/toutiao-web-api.md +0 -96
  306. package/skills/meta-capability/references/api-tags/twitter-web-api.md +0 -562
  307. package/skills/meta-capability/references/api-tags/wechat-channels-api.md +0 -405
  308. package/skills/meta-capability/references/api-tags/wechat-media-platform-web-api.md +0 -431
  309. package/skills/meta-capability/references/api-tags/weibo-app-api.md +0 -851
  310. package/skills/meta-capability/references/api-tags/weibo-web-api.md +0 -470
  311. package/skills/meta-capability/references/api-tags/weibo-web-v2-api.md +0 -1405
  312. package/skills/meta-capability/references/api-tags/xiaohongshu-app-api.md +0 -534
  313. package/skills/meta-capability/references/api-tags/xiaohongshu-app-v2-api.md +0 -934
  314. package/skills/meta-capability/references/api-tags/xiaohongshu-web-api.md +0 -757
  315. package/skills/meta-capability/references/api-tags/xiaohongshu-web-v2-api.md +0 -762
  316. package/skills/meta-capability/references/api-tags/xigua-app-v2-api.md +0 -308
  317. package/skills/meta-capability/references/api-tags/youtube-web-api.md +0 -934
  318. package/skills/meta-capability/references/api-tags/youtube-web-v2-api.md +0 -717
  319. package/skills/meta-capability/references/api-tags/zhihu-web-api.md +0 -1384
  320. package/skills/meta-capability/references/config-templates/defaults.yaml +0 -18
  321. package/skills/meta-capability/references/dispatch.md +0 -27
  322. package/skills/meta-capability/references/execution-guidelines.md +0 -25
  323. package/skills/meta-capability/references/implemented-route-map.md +0 -177
  324. package/skills/meta-capability/references/service-guides/asr-u2-u3-fallback.md +0 -75
  325. package/skills/meta-capability/scripts/__init__.py +0 -1
  326. package/skills/meta-capability/scripts/call_route.py +0 -141
  327. package/skills/meta-capability/scripts/core/__init__.py +0 -1
  328. package/skills/meta-capability/scripts/core/bootstrap_env.py +0 -32
  329. package/skills/meta-capability/scripts/core/config_loader.py +0 -204
  330. package/skills/meta-capability/scripts/core/tikomni_common.py +0 -443
  331. package/skills/meta-capability/scripts/test_auth.py +0 -98
  332. package/skills/single-work-analysis/SKILL.md +0 -62
  333. package/skills/single-work-analysis/agents/openai.yaml +0 -4
  334. package/skills/single-work-analysis/env.example +0 -36
  335. package/skills/single-work-analysis/references/api-capability-index.md +0 -92
  336. package/skills/single-work-analysis/references/api-contracts/asr-api.md +0 -130
  337. package/skills/single-work-analysis/references/api-contracts/bilibili-app-api.md +0 -776
  338. package/skills/single-work-analysis/references/api-contracts/bilibili-web-api.md +0 -2017
  339. package/skills/single-work-analysis/references/api-contracts/demo-api.md +0 -717
  340. package/skills/single-work-analysis/references/api-contracts/douyin-app-v3-api.md +0 -3594
  341. package/skills/single-work-analysis/references/api-contracts/douyin-billboard-api.md +0 -2274
  342. package/skills/single-work-analysis/references/api-contracts/douyin-creator-api.md +0 -1575
  343. package/skills/single-work-analysis/references/api-contracts/douyin-creator-v2-api.md +0 -3254
  344. package/skills/single-work-analysis/references/api-contracts/douyin-search-api.md +0 -4118
  345. package/skills/single-work-analysis/references/api-contracts/douyin-web-api.md +0 -5544
  346. package/skills/single-work-analysis/references/api-contracts/douyin-xingtu-api.md +0 -1916
  347. package/skills/single-work-analysis/references/api-contracts/douyin-xingtu-v2-api.md +0 -1540
  348. package/skills/single-work-analysis/references/api-contracts/health-check.md +0 -69
  349. package/skills/single-work-analysis/references/api-contracts/hybrid-parsing.md +0 -78
  350. package/skills/single-work-analysis/references/api-contracts/instagram-v1-api.md +0 -2256
  351. package/skills/single-work-analysis/references/api-contracts/instagram-v2-api.md +0 -2011
  352. package/skills/single-work-analysis/references/api-contracts/instagram-v3-api.md +0 -2630
  353. package/skills/single-work-analysis/references/api-contracts/ios-shortcut.md +0 -44
  354. package/skills/single-work-analysis/references/api-contracts/kuaishou-app-api.md +0 -1518
  355. package/skills/single-work-analysis/references/api-contracts/kuaishou-web-api.md +0 -1242
  356. package/skills/single-work-analysis/references/api-contracts/lemon8-app-api.md +0 -1088
  357. package/skills/single-work-analysis/references/api-contracts/linkedin-web-api.md +0 -1949
  358. package/skills/single-work-analysis/references/api-contracts/media-ingest-api.md +0 -126
  359. package/skills/single-work-analysis/references/api-contracts/pipixia-app-api.md +0 -1142
  360. package/skills/single-work-analysis/references/api-contracts/reddit-app-api.md +0 -2025
  361. package/skills/single-work-analysis/references/api-contracts/sora2-api.md +0 -2266
  362. package/skills/single-work-analysis/references/api-contracts/temp-mail-api.md +0 -208
  363. package/skills/single-work-analysis/references/api-contracts/threads-web-api.md +0 -897
  364. package/skills/single-work-analysis/references/api-contracts/tikhub-downloader-api.md +0 -134
  365. package/skills/single-work-analysis/references/api-contracts/tikhub-user-api.md +0 -494
  366. package/skills/single-work-analysis/references/api-contracts/tiktok-ads-api.md +0 -5947
  367. package/skills/single-work-analysis/references/api-contracts/tiktok-analytics-api.md +0 -968
  368. package/skills/single-work-analysis/references/api-contracts/tiktok-app-v3-api.md +0 -5735
  369. package/skills/single-work-analysis/references/api-contracts/tiktok-creator-api.md +0 -1951
  370. package/skills/single-work-analysis/references/api-contracts/tiktok-interaction-api.md +0 -742
  371. package/skills/single-work-analysis/references/api-contracts/tiktok-shop-web-api.md +0 -1890
  372. package/skills/single-work-analysis/references/api-contracts/tiktok-web-api.md +0 -4448
  373. package/skills/single-work-analysis/references/api-contracts/toutiao-app-api.md +0 -342
  374. package/skills/single-work-analysis/references/api-contracts/toutiao-web-api.md +0 -143
  375. package/skills/single-work-analysis/references/api-contracts/twitter-web-api.md +0 -989
  376. package/skills/single-work-analysis/references/api-contracts/wechat-channels-api.md +0 -809
  377. package/skills/single-work-analysis/references/api-contracts/wechat-media-platform-web-api.md +0 -677
  378. package/skills/single-work-analysis/references/api-contracts/weibo-app-api.md +0 -1547
  379. package/skills/single-work-analysis/references/api-contracts/weibo-web-api.md +0 -798
  380. package/skills/single-work-analysis/references/api-contracts/weibo-web-v2-api.md +0 -2459
  381. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-app-api.md +0 -1291
  382. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-app-v2-api.md +0 -1683
  383. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-web-api.md +0 -1324
  384. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-web-v2-api.md +0 -1209
  385. package/skills/single-work-analysis/references/api-contracts/xigua-app-v2-api.md +0 -489
  386. package/skills/single-work-analysis/references/api-contracts/youtube-web-api.md +0 -2636
  387. package/skills/single-work-analysis/references/api-contracts/youtube-web-v2-api.md +0 -2660
  388. package/skills/single-work-analysis/references/api-contracts/zhihu-web-api.md +0 -2315
  389. package/skills/single-work-analysis/references/api-tags/asr-api.md +0 -100
  390. package/skills/single-work-analysis/references/api-tags/bilibili-app-api.md +0 -482
  391. package/skills/single-work-analysis/references/api-tags/bilibili-web-api.md +0 -1267
  392. package/skills/single-work-analysis/references/api-tags/demo-api.md +0 -365
  393. package/skills/single-work-analysis/references/api-tags/douyin-app-v3-api.md +0 -2012
  394. package/skills/single-work-analysis/references/api-tags/douyin-billboard-api.md +0 -1428
  395. package/skills/single-work-analysis/references/api-tags/douyin-creator-api.md +0 -694
  396. package/skills/single-work-analysis/references/api-tags/douyin-creator-v2-api.md +0 -694
  397. package/skills/single-work-analysis/references/api-tags/douyin-search-api.md +0 -1059
  398. package/skills/single-work-analysis/references/api-tags/douyin-web-api.md +0 -3314
  399. package/skills/single-work-analysis/references/api-tags/douyin-xingtu-api.md +0 -935
  400. package/skills/single-work-analysis/references/api-tags/douyin-xingtu-v2-api.md +0 -925
  401. package/skills/single-work-analysis/references/api-tags/health-check.md +0 -40
  402. package/skills/single-work-analysis/references/api-tags/hybrid-parsing.md +0 -57
  403. package/skills/single-work-analysis/references/api-tags/instagram-v1-api.md +0 -1224
  404. package/skills/single-work-analysis/references/api-tags/instagram-v2-api.md +0 -1147
  405. package/skills/single-work-analysis/references/api-tags/instagram-v3-api.md +0 -1123
  406. package/skills/single-work-analysis/references/api-tags/ios-shortcut.md +0 -45
  407. package/skills/single-work-analysis/references/api-tags/kuaishou-app-api.md +0 -846
  408. package/skills/single-work-analysis/references/api-tags/kuaishou-web-api.md +0 -551
  409. package/skills/single-work-analysis/references/api-tags/lemon8-app-api.md +0 -687
  410. package/skills/single-work-analysis/references/api-tags/linkedin-web-api.md +0 -1105
  411. package/skills/single-work-analysis/references/api-tags/media-ingest-api.md +0 -112
  412. package/skills/single-work-analysis/references/api-tags/pipixia-app-api.md +0 -721
  413. package/skills/single-work-analysis/references/api-tags/reddit-app-api.md +0 -1057
  414. package/skills/single-work-analysis/references/api-tags/sora2-api.md +0 -737
  415. package/skills/single-work-analysis/references/api-tags/temp-mail-api.md +0 -136
  416. package/skills/single-work-analysis/references/api-tags/threads-web-api.md +0 -472
  417. package/skills/single-work-analysis/references/api-tags/tikhub-downloader-api.md +0 -65
  418. package/skills/single-work-analysis/references/api-tags/tikhub-user-api.md +0 -253
  419. package/skills/single-work-analysis/references/api-tags/tiktok-ads-api.md +0 -1393
  420. package/skills/single-work-analysis/references/api-tags/tiktok-analytics-api.md +0 -179
  421. package/skills/single-work-analysis/references/api-tags/tiktok-app-v3-api.md +0 -3264
  422. package/skills/single-work-analysis/references/api-tags/tiktok-creator-api.md +0 -709
  423. package/skills/single-work-analysis/references/api-tags/tiktok-interaction-api.md +0 -366
  424. package/skills/single-work-analysis/references/api-tags/tiktok-shop-web-api.md +0 -663
  425. package/skills/single-work-analysis/references/api-tags/tiktok-web-api.md +0 -2516
  426. package/skills/single-work-analysis/references/api-tags/toutiao-app-api.md +0 -220
  427. package/skills/single-work-analysis/references/api-tags/toutiao-web-api.md +0 -96
  428. package/skills/single-work-analysis/references/api-tags/twitter-web-api.md +0 -562
  429. package/skills/single-work-analysis/references/api-tags/wechat-channels-api.md +0 -405
  430. package/skills/single-work-analysis/references/api-tags/wechat-media-platform-web-api.md +0 -431
  431. package/skills/single-work-analysis/references/api-tags/weibo-app-api.md +0 -851
  432. package/skills/single-work-analysis/references/api-tags/weibo-web-api.md +0 -470
  433. package/skills/single-work-analysis/references/api-tags/weibo-web-v2-api.md +0 -1405
  434. package/skills/single-work-analysis/references/api-tags/xiaohongshu-app-api.md +0 -534
  435. package/skills/single-work-analysis/references/api-tags/xiaohongshu-app-v2-api.md +0 -934
  436. package/skills/single-work-analysis/references/api-tags/xiaohongshu-web-api.md +0 -757
  437. package/skills/single-work-analysis/references/api-tags/xiaohongshu-web-v2-api.md +0 -762
  438. package/skills/single-work-analysis/references/api-tags/xigua-app-v2-api.md +0 -308
  439. package/skills/single-work-analysis/references/api-tags/youtube-web-api.md +0 -934
  440. package/skills/single-work-analysis/references/api-tags/youtube-web-v2-api.md +0 -717
  441. package/skills/single-work-analysis/references/api-tags/zhihu-web-api.md +0 -1384
  442. package/skills/single-work-analysis/references/asr-and-fallback.md +0 -20
  443. package/skills/single-work-analysis/references/config-templates/defaults.yaml +0 -58
  444. package/skills/single-work-analysis/references/contracts/work-card-fields.md +0 -41
  445. package/skills/single-work-analysis/references/platform-guides/douyin.md +0 -47
  446. package/skills/single-work-analysis/references/platform-guides/generic.md +0 -43
  447. package/skills/single-work-analysis/references/platform-guides/xiaohongshu.md +0 -54
  448. package/skills/single-work-analysis/references/prompt-contracts/asr-clean.md +0 -28
  449. package/skills/single-work-analysis/references/prompt-contracts/cta.md +0 -24
  450. package/skills/single-work-analysis/references/prompt-contracts/hook.md +0 -25
  451. package/skills/single-work-analysis/references/prompt-contracts/insight.md +0 -47
  452. package/skills/single-work-analysis/references/prompt-contracts/structure.md +0 -25
  453. package/skills/single-work-analysis/references/prompt-contracts/style.md +0 -27
  454. package/skills/single-work-analysis/references/prompt-contracts/summary.md +0 -29
  455. package/skills/single-work-analysis/references/prompt-contracts/topic.md +0 -29
  456. package/skills/single-work-analysis/references/schemas/work-card.schema.json +0 -39
  457. package/skills/single-work-analysis/references/service-guides/asr-u2-u3-fallback.md +0 -75
  458. package/skills/single-work-analysis/scripts/__init__.py +0 -0
  459. package/skills/single-work-analysis/scripts/core/__init__.py +0 -0
  460. package/skills/single-work-analysis/scripts/core/analysis_pipeline.py +0 -133
  461. package/skills/single-work-analysis/scripts/core/bootstrap_env.py +0 -35
  462. package/skills/single-work-analysis/scripts/core/extract_pipeline.py +0 -173
  463. package/skills/single-work-analysis/scripts/core/storage_router.py +0 -253
  464. package/skills/single-work-analysis/scripts/core/tikomni_common.py +0 -588
  465. package/skills/single-work-analysis/scripts/pipeline/__init__.py +0 -0
  466. package/skills/single-work-analysis/scripts/pipeline/asr/__init__.py +0 -0
  467. package/skills/single-work-analysis/scripts/pipeline/asr/asr_pipeline.py +0 -1189
  468. package/skills/single-work-analysis/scripts/pipeline/asr/poll_u2_task.py +0 -95
  469. package/skills/single-work-analysis/scripts/platform/__init__.py +0 -0
  470. package/skills/single-work-analysis/scripts/platform/douyin/__init__.py +0 -0
  471. package/skills/single-work-analysis/scripts/platform/douyin/douyin_video_type_matrix.py +0 -224
  472. package/skills/single-work-analysis/scripts/platform/douyin/select_low_quality_video_url.py +0 -200
  473. package/skills/single-work-analysis/scripts/platform/xiaohongshu/__init__.py +0 -0
  474. package/skills/single-work-analysis/scripts/writers/__init__.py +0 -0
  475. package/skills/single-work-analysis/scripts/writers/write_benchmark_card.py +0 -1402
  476. /package/skills/{creator-analysis → social-media-crawl}/scripts/core/bootstrap_env.py +0 -0
  477. /package/skills/{creator-analysis → social-media-crawl}/scripts/core/extract_pipeline.py +0 -0
  478. /package/skills/{creator-analysis/scripts/platform/douyin → social-media-crawl/scripts/pipelines}/douyin_video_type_matrix.py +0 -0
  479. /package/skills/{creator-analysis/scripts/author_home/collectors → social-media-crawl/scripts/pipelines}/homepage_collectors.py +0 -0
  480. /package/skills/{creator-analysis/scripts/platform/douyin → social-media-crawl/scripts/pipelines}/select_low_quality_video_url.py +0 -0
@@ -1,331 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Batch explanations for sampled works."""
3
-
4
- from __future__ import annotations
5
-
6
- import json
7
- import os
8
- import re
9
- import subprocess
10
- from pathlib import Path
11
- from typing import Any, Dict, List, Tuple
12
-
13
- import jsonschema
14
-
15
-
16
- SKILL_ROOT = Path(__file__).resolve().parents[3]
17
- PROMPT_CONTRACT_PATH = SKILL_ROOT / "references" / "prompt-contracts" / "sampled-work-batch-explanations.md"
18
- SCHEMA_PATH = SKILL_ROOT / "references" / "schemas" / "sampled-work-batch-explanations.schema.json"
19
- DEFAULT_TIMEOUT_SEC = 45
20
- TEXT_LIMITS = {
21
- "title": 120,
22
- "caption_raw": 220,
23
- "primary_text": 420,
24
- "top_list": 8,
25
- }
26
-
27
-
28
- class SampledExplanationResourceError(RuntimeError):
29
- def __init__(self, *, code: str, path: Path, detail: str = "") -> None:
30
- self.code = code
31
- self.path = path
32
- self.detail = detail
33
- message = f"{code}:{path}"
34
- if detail:
35
- message = f"{message}:{detail}"
36
- super().__init__(message)
37
-
38
-
39
- def _safe_text(value: Any) -> str:
40
- if value is None:
41
- return ""
42
- if isinstance(value, str):
43
- return value.strip()
44
- return str(value).strip()
45
-
46
-
47
- def _truncate_text(value: Any, limit: int) -> str:
48
- text = _safe_text(value)
49
- if limit <= 0 or len(text) <= limit:
50
- return text
51
- return text[: max(limit - 1, 0)] + "…"
52
-
53
-
54
- def _load_json(path: Path) -> Dict[str, Any]:
55
- try:
56
- return json.loads(path.read_text(encoding="utf-8"))
57
- except Exception as error:
58
- raise SampledExplanationResourceError(code="schema_load_failed", path=path, detail=f"{type(error).__name__}:{error}") from error
59
-
60
-
61
- def _schema_errors(payload: Any, schema: Dict[str, Any]) -> List[Dict[str, str]]:
62
- if not schema:
63
- raise SampledExplanationResourceError(code="schema_empty", path=SCHEMA_PATH)
64
- try:
65
- validator = jsonschema.Draft202012Validator(schema)
66
- errors: List[Dict[str, str]] = []
67
- for error in sorted(validator.iter_errors(payload), key=lambda item: list(item.absolute_path)):
68
- field = ".".join(str(part) for part in error.absolute_path) or "$"
69
- errors.append({"field": field, "reason": f"schema:{error.message}"})
70
- return errors
71
- except Exception as error:
72
- return [{"field": "$", "reason": f"schema_runtime:{type(error).__name__}:{error}"}]
73
-
74
-
75
- def _prompt_contract_text() -> str:
76
- try:
77
- return PROMPT_CONTRACT_PATH.read_text(encoding="utf-8").strip()
78
- except Exception as error:
79
- raise SampledExplanationResourceError(code="contract_load_failed", path=PROMPT_CONTRACT_PATH, detail=f"{type(error).__name__}:{error}") from error
80
-
81
-
82
- def _extract_json_block(text: str) -> Dict[str, Any]:
83
- content = (text or "").strip()
84
- if not content:
85
- return {}
86
- try:
87
- return json.loads(content)
88
- except Exception:
89
- pass
90
-
91
- fenced = re.search(r"```(?:json)?\s*(\{[\s\S]*?\})\s*```", content)
92
- if fenced:
93
- try:
94
- return json.loads(fenced.group(1))
95
- except Exception:
96
- pass
97
-
98
- match = re.search(r"\{[\s\S]*\}", content)
99
- if not match:
100
- return {}
101
- try:
102
- return json.loads(match.group(0))
103
- except Exception:
104
- return {}
105
-
106
-
107
- def _compact_input(analysis_input: Dict[str, Any]) -> Dict[str, Any]:
108
- sampled = analysis_input.get("sampled_works") if isinstance(analysis_input.get("sampled_works"), list) else []
109
- aggregate = analysis_input.get("aggregate_stats") if isinstance(analysis_input.get("aggregate_stats"), dict) else {}
110
- deltas = aggregate.get("global_top_vs_mid_vs_bottom_deltas") if isinstance(aggregate.get("global_top_vs_mid_vs_bottom_deltas"), dict) else {}
111
-
112
- compacted_sampled: List[Dict[str, Any]] = []
113
- for item in sampled:
114
- if not isinstance(item, dict):
115
- continue
116
- compacted_sampled.append(
117
- {
118
- "platform_work_id": _safe_text(item.get("platform_work_id")),
119
- "title": _truncate_text(item.get("title"), TEXT_LIMITS["title"]),
120
- "caption_raw": _truncate_text(item.get("caption_raw"), TEXT_LIMITS["caption_raw"]),
121
- "work_modality": _safe_text(item.get("work_modality")),
122
- "primary_text": _truncate_text(item.get("primary_text"), TEXT_LIMITS["primary_text"]),
123
- "bucket": _safe_text(item.get("bucket")),
124
- "hook_type": _safe_text(item.get("hook_type")),
125
- "structure_type": _safe_text(item.get("structure_type")),
126
- "cta_type": _safe_text(item.get("cta_type")),
127
- "content_form": _safe_text(item.get("content_form")),
128
- "style_markers": list(item.get("style_markers") or [])[: TEXT_LIMITS["top_list"]],
129
- "digg_count": item.get("digg_count"),
130
- "comment_count": item.get("comment_count"),
131
- "collect_count": item.get("collect_count"),
132
- "share_count": item.get("share_count"),
133
- "play_count": item.get("play_count"),
134
- }
135
- )
136
-
137
- compacted_deltas: Dict[str, Any] = {}
138
- for group in ("top", "mid", "bottom"):
139
- block = deltas.get(group) if isinstance(deltas, dict) else None
140
- if not isinstance(block, dict):
141
- continue
142
- compacted_deltas[group] = {
143
- "title_keywords": list(block.get("title_keywords") or [])[: TEXT_LIMITS["top_list"]],
144
- "caption_keywords": list(block.get("caption_keywords") or [])[: TEXT_LIMITS["top_list"]],
145
- "primary_text_keywords": list(block.get("primary_text_keywords") or [])[: TEXT_LIMITS["top_list"]],
146
- "hook_types": list(block.get("hook_types") or [])[: TEXT_LIMITS["top_list"]],
147
- "structure_types": list(block.get("structure_types") or [])[: TEXT_LIMITS["top_list"]],
148
- "cta_types": list(block.get("cta_types") or [])[: TEXT_LIMITS["top_list"]],
149
- "content_forms": list(block.get("content_forms") or [])[: TEXT_LIMITS["top_list"]],
150
- }
151
-
152
- return {
153
- "sampled_works": compacted_sampled,
154
- "aggregate_deltas": compacted_deltas,
155
- }
156
-
157
-
158
- def _build_prompt(analysis_input: Dict[str, Any], *, contract_text: str) -> str:
159
- compacted = _compact_input(analysis_input)
160
- return (
161
- "请严格根据以下提示词原文输出,结果必须是 JSON 对象,且只输出 JSON。\n"
162
- "顶层对象必须是 sampled_work_explanations。\n"
163
- "不得输出 markdown,不得输出解释。\n\n"
164
- "=== 提示词原文开始 ===\n"
165
- f"{contract_text}\n"
166
- "=== 提示词原文结束 ===\n\n"
167
- "=== 输入数据(JSON) ===\n"
168
- f"{json.dumps(compacted, ensure_ascii=False)}"
169
- )
170
-
171
-
172
- def _coverage_errors(payload: Dict[str, Any], analysis_input: Dict[str, Any]) -> List[Dict[str, str]]:
173
- sampled = analysis_input.get("sampled_works") if isinstance(analysis_input.get("sampled_works"), list) else []
174
- explanations = payload.get("sampled_work_explanations") if isinstance(payload.get("sampled_work_explanations"), dict) else {}
175
- errors: List[Dict[str, str]] = []
176
- for item in sampled:
177
- if not isinstance(item, dict):
178
- continue
179
- work_id = _safe_text(item.get("platform_work_id"))
180
- if not work_id:
181
- continue
182
- if not isinstance(explanations.get(work_id), dict):
183
- errors.append({"field": f"sampled_work_explanations.{work_id}", "reason": "missing_work_explanation"})
184
- return errors
185
-
186
-
187
- def _classify_runtime_reason(text: str) -> str:
188
- lowered = (text or "").lower()
189
- if "timeoutexpired" in lowered or "timeout" in lowered:
190
- return "timeout"
191
- if "rate limit" in lowered or "ratelimit" in lowered or "429" in lowered:
192
- return "rate_limit"
193
- return "transient_llm_error"
194
-
195
-
196
- def _stage_status(*, status: str, ok_count: int, failed_count: int, degraded_count: int, reason_codes: List[str], failure_kind: str = "") -> Dict[str, Any]:
197
- return {
198
- "status": status,
199
- "ok_count": ok_count,
200
- "failed_count": failed_count,
201
- "degraded_count": degraded_count,
202
- "reason_codes": list(dict.fromkeys([code for code in reason_codes if code])),
203
- "failure_kind": failure_kind or None,
204
- }
205
-
206
-
207
- def run_sampled_work_batch_explanations(analysis_input: Dict[str, Any]) -> Tuple[Dict[str, Any], List[Dict[str, str]], List[Dict[str, Any]], Dict[str, Any]]:
208
- sampled = analysis_input.get("sampled_works") if isinstance(analysis_input.get("sampled_works"), list) else []
209
- trace: List[Dict[str, Any]] = [
210
- {
211
- "step": "sampled_work_explanations.input_built",
212
- "sampled_works_count": len(sampled),
213
- "prompt_contract": "prompt-contracts/sampled-work-batch-explanations.md@v1",
214
- "contract_path": str(PROMPT_CONTRACT_PATH),
215
- "schema_path": str(SCHEMA_PATH),
216
- }
217
- ]
218
-
219
- if not sampled:
220
- trace.append({"step": "sampled_work_explanations.skipped", "reason": "empty_sampled_works"})
221
- return {"sampled_work_explanations": {}}, [], trace, _stage_status(
222
- status="skipped",
223
- ok_count=0,
224
- failed_count=0,
225
- degraded_count=0,
226
- reason_codes=["empty_sampled_works"],
227
- )
228
-
229
- llm_timeout_sec = max(int(os.getenv("TIKOMNI_SAMPLED_EXPLANATION_TIMEOUT_SEC", str(DEFAULT_TIMEOUT_SEC))), 5)
230
- result: Dict[str, Any] = {}
231
- errors: List[Dict[str, str]] = []
232
- reason_codes: List[str] = []
233
-
234
- try:
235
- contract_text = _prompt_contract_text()
236
- schema = _load_json(SCHEMA_PATH)
237
- trace.append(
238
- {
239
- "step": "sampled_work_explanations.resources_loaded",
240
- "contract_loaded": True,
241
- "contract_chars": len(contract_text),
242
- "schema_loaded": True,
243
- }
244
- )
245
- except SampledExplanationResourceError as error:
246
- trace.append(
247
- {
248
- "step": "sampled_work_explanations.resource_error",
249
- "contract_loaded": error.code != "contract_load_failed",
250
- "contract_chars": 0,
251
- "schema_loaded": error.code not in {"schema_load_failed", "schema_empty"},
252
- "error": str(error),
253
- }
254
- )
255
- return {"sampled_work_explanations": {}}, [], trace, _stage_status(
256
- status="failed",
257
- ok_count=0,
258
- failed_count=len(sampled),
259
- degraded_count=0,
260
- reason_codes=[error.code],
261
- failure_kind="configuration",
262
- )
263
-
264
- prompt = _build_prompt(analysis_input, contract_text=contract_text)
265
-
266
- try:
267
- run = subprocess.run(
268
- ["openclaw", "agent", "--agent", "main", "--message", prompt, "--json"],
269
- capture_output=True,
270
- text=True,
271
- timeout=llm_timeout_sec,
272
- check=False,
273
- )
274
- parsed = json.loads(run.stdout or "{}")
275
- chunks: List[str] = []
276
- for item in parsed.get("result", {}).get("payloads", []):
277
- if isinstance(item, dict) and isinstance(item.get("text"), str):
278
- chunks.append(item["text"])
279
- response_text = "\n".join(chunks).strip()
280
- result = _extract_json_block(response_text)
281
- trace.append(
282
- {
283
- "step": "sampled_work_explanations.llm_called",
284
- "returncode": run.returncode,
285
- "has_text": bool(response_text),
286
- "parsed": bool(result),
287
- "stdout_chars": len(run.stdout or ""),
288
- "stderr_chars": len(run.stderr or ""),
289
- }
290
- )
291
- except Exception as error:
292
- reason_code = _classify_runtime_reason(f"{type(error).__name__}:{error}")
293
- trace.append({"step": "sampled_work_explanations.llm_error", "error": f"{type(error).__name__}:{error}", "reason_code": reason_code})
294
- return {"sampled_work_explanations": {}}, [], trace, _stage_status(
295
- status="degraded",
296
- ok_count=0,
297
- failed_count=0,
298
- degraded_count=len(sampled),
299
- reason_codes=[reason_code],
300
- failure_kind="runtime",
301
- )
302
-
303
- errors = _schema_errors(result, schema) if result else [{"field": "$", "reason": "empty_result"}]
304
- if not errors:
305
- errors.extend(_coverage_errors(result, analysis_input))
306
- if errors:
307
- trace.append(
308
- {
309
- "step": "sampled_work_explanations.validation_failed",
310
- "reason": "llm_empty_or_validation_failed",
311
- "validation_error_count": len(errors),
312
- }
313
- )
314
- reason_codes.append("validation_failed")
315
- return {"sampled_work_explanations": {}}, errors, trace, _stage_status(
316
- status="degraded",
317
- ok_count=0,
318
- failed_count=0,
319
- degraded_count=len(sampled),
320
- reason_codes=reason_codes,
321
- failure_kind="runtime",
322
- )
323
-
324
- trace.append({"step": "sampled_work_explanations.schema_validation_passed"})
325
- return result, [], trace, _stage_status(
326
- status="full",
327
- ok_count=len(sampled),
328
- failed_count=0,
329
- degraded_count=0,
330
- reason_codes=[],
331
- )
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env python3
2
-
3
- from .home_asr import enrich_author_home_asr
4
-
5
- __all__ = ["enrich_author_home_asr"]
@@ -1,213 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Builders for author-home outputs.
3
-
4
- Hard rule: single-work cards reuse existing writer implementation.
5
- """
6
-
7
- from __future__ import annotations
8
-
9
- from typing import Any, Dict, List, Optional
10
-
11
- from scripts.writers.write_benchmark_card import write_benchmark_card
12
-
13
-
14
- AUTHOR_SAMPLE_CARD_ROLE = "author_sample_card"
15
- SAMPLE_WORK_CARD_ROLE = "sample_work_card"
16
- AUTHOR_CARD_ROLE = "author_card"
17
-
18
-
19
- def build_work_cards(
20
- *,
21
- platform: str,
22
- profile: Dict[str, Any],
23
- works: List[Dict[str, Any]],
24
- render_payloads: Dict[str, Dict[str, Any]],
25
- sampled_work_ids: Optional[List[str]],
26
- sampled_work_explanations: Optional[Dict[str, Any]],
27
- card_root: Optional[str],
28
- storage_config: Optional[Dict[str, Any]],
29
- write_card: bool,
30
- failed_items: Optional[List[Dict[str, Any]]] = None,
31
- ) -> Dict[str, Any]:
32
- if not write_card:
33
- return {
34
- "author_sample_cards": {"enabled": False, "count": 0, "results": []},
35
- "sample_work_cards": {"enabled": False, "count": 0, "results": []},
36
- }
37
-
38
- sample_author = str(profile.get("nickname") or profile.get("platform_author_id") or "作者")
39
- author_sample_results: List[Dict[str, Any]] = []
40
- sample_work_results: List[Dict[str, Any]] = []
41
- author_sample_failed: List[Dict[str, Any]] = list(failed_items or [])
42
- sample_work_failed: List[Dict[str, Any]] = []
43
- sampled_id_set = {str(item).strip() for item in (sampled_work_ids or []) if str(item).strip()}
44
- explanation_map = sampled_work_explanations if isinstance(sampled_work_explanations, dict) else {}
45
-
46
- for work in works:
47
- platform_work_id = str(work.get("platform_work_id") or "").strip()
48
- payload = render_payloads.get(platform_work_id)
49
- if not isinstance(payload, dict):
50
- author_sample_failed.append(
51
- {
52
- "platform_work_id": platform_work_id,
53
- "error_reason": "missing_work_analysis_artifact",
54
- }
55
- )
56
- continue
57
-
58
- base_payload = dict(payload)
59
- try:
60
- full_result = write_benchmark_card(
61
- payload=base_payload,
62
- platform=platform,
63
- card_type="author_sample_work",
64
- card_root=card_root,
65
- sample_author=sample_author,
66
- content_kind="author_home",
67
- storage_config=storage_config,
68
- card_role=AUTHOR_SAMPLE_CARD_ROLE,
69
- )
70
- author_sample_results.append(full_result)
71
- except Exception as error:
72
- author_sample_failed.append(
73
- {
74
- "platform_work_id": platform_work_id,
75
- "error_reason": f"author_sample_card_write_failed:{type(error).__name__}:{error}",
76
- }
77
- )
78
- continue
79
-
80
- if platform_work_id in sampled_id_set:
81
- sample_payload = dict(base_payload)
82
- explanation = explanation_map.get(platform_work_id)
83
- sample_payload["sampled_explanation"] = explanation if isinstance(explanation, dict) else {}
84
- try:
85
- sample_result = write_benchmark_card(
86
- payload=sample_payload,
87
- platform=platform,
88
- card_type="author_sample_work",
89
- card_root=card_root,
90
- sample_author=sample_author,
91
- content_kind="author_home",
92
- storage_config=storage_config,
93
- route_card_type="author",
94
- route_extra_parts=["sample_work"],
95
- card_role=SAMPLE_WORK_CARD_ROLE,
96
- )
97
- sample_work_results.append(sample_result)
98
- except Exception as error:
99
- sample_work_failed.append(
100
- {
101
- "platform_work_id": platform_work_id,
102
- "error_reason": f"sample_work_card_write_failed:{type(error).__name__}:{error}",
103
- }
104
- )
105
-
106
- return {
107
- "author_sample_cards": {
108
- "enabled": True,
109
- "count": len(author_sample_results),
110
- "results": author_sample_results,
111
- "failed_items": author_sample_failed,
112
- },
113
- "sample_work_cards": {
114
- "enabled": True,
115
- "count": len(sample_work_results),
116
- "results": sample_work_results,
117
- "failed_items": sample_work_failed,
118
- },
119
- }
120
-
121
-
122
- def build_author_card(
123
- *,
124
- platform: str,
125
- profile: Dict[str, Any],
126
- analysis_payload: Dict[str, Any],
127
- card_root: Optional[str],
128
- storage_config: Optional[Dict[str, Any]],
129
- write_card: bool,
130
- ) -> Dict[str, Any]:
131
- if not write_card:
132
- return {"enabled": False, "skipped": True, "reason": "write_card_disabled"}
133
-
134
- author_analysis_v2 = analysis_payload.get("author_analysis_v2") if isinstance(analysis_payload.get("author_analysis_v2"), dict) else {}
135
- positioning = author_analysis_v2.get("author_positioning") if isinstance(author_analysis_v2.get("author_positioning"), dict) else {}
136
- trust_model = author_analysis_v2.get("trust_model") if isinstance(author_analysis_v2.get("trust_model"), dict) else {}
137
- content_mechanism = author_analysis_v2.get("content_mechanism") if isinstance(author_analysis_v2.get("content_mechanism"), dict) else {}
138
- commercial_bridge = author_analysis_v2.get("commercial_bridge") if isinstance(author_analysis_v2.get("commercial_bridge"), dict) else {}
139
- core_tensions = author_analysis_v2.get("core_tensions") if isinstance(author_analysis_v2.get("core_tensions"), dict) else {}
140
- clone_guidance = author_analysis_v2.get("clone_guidance") if isinstance(author_analysis_v2.get("clone_guidance"), dict) else {}
141
-
142
- winning_structures = list(content_mechanism.get("winning_content_structures") or [])[:3] if isinstance(content_mechanism.get("winning_content_structures"), list) else []
143
- likely_products = list(commercial_bridge.get("likely_products") or [])[:3] if isinstance(commercial_bridge.get("likely_products"), list) else []
144
- author_card_highlights = {
145
- "one_liner": positioning.get("one_liner") or analysis_payload.get("author_portrait", ""),
146
- "core_value_proposition": positioning.get("core_value_proposition") or "",
147
- "primary_trust_source": trust_model.get("primary_trust_source") or "",
148
- "winning_content_structures": winning_structures,
149
- "likely_products": likely_products,
150
- "most_important_tension": core_tensions.get("most_important_tension") or "",
151
- "if_only_learn_one_thing": clone_guidance.get("if_only_learn_one_thing") or "",
152
- }
153
-
154
- payload = {
155
- "content_kind": "author_analysis",
156
- "title": f"{profile.get('nickname') or profile.get('platform_author_id') or '作者'} 主页画像",
157
- "desc": profile.get("signature") or "",
158
- "summary": author_card_highlights.get("one_liner") or analysis_payload.get("author_portrait", ""),
159
- "insights": [
160
- f"business_score={analysis_payload.get('business_score', 0)}",
161
- f"benchmark_gap_score={analysis_payload.get('benchmark_gap_score', 0)}",
162
- f"trust_source={author_card_highlights.get('primary_trust_source') or 'unknown'}",
163
- ],
164
- "author": {
165
- "nickname": profile.get("nickname"),
166
- "platform_author_id": profile.get("author_platform_id") or profile.get("platform_author_id"),
167
- "author_handle": profile.get("author_handle") or "",
168
- },
169
- "author_handle": profile.get("author_handle") or "",
170
- "platform_author_id": profile.get("author_platform_id") or profile.get("platform_author_id"),
171
- "nickname": profile.get("nickname") or "",
172
- "ip_location": profile.get("ip_location") or "",
173
- "signature": profile.get("signature") or "",
174
- "avatar_url": profile.get("avatar_url") or "",
175
- "fans_count": int(profile.get("fans_count", 0) or 0),
176
- "liked_count": int(profile.get("liked_count", 0) or 0),
177
- "collected_count": int(profile.get("collected_count", 0) or 0),
178
- "works_count": int(profile.get("works_count", 0) or 0),
179
- "verified": bool(profile.get("verified", False)),
180
- "snapshot_at": profile.get("snapshot_at") or "",
181
- "digg_count": int(profile.get("liked_count", 0) or 0),
182
- "collect_count": int(profile.get("collected_count", 0) or 0),
183
- "play_count": 0,
184
- "raw_content": analysis_payload.get("business_analysis", ""),
185
- "platform_work_id": f"author-{profile.get('platform_author_id') or 'unknown'}",
186
- "analysis_output": analysis_payload,
187
- "author_analysis_v2": author_analysis_v2,
188
- "author_analysis_input_v1": analysis_payload.get("author_analysis_input_v1") if isinstance(analysis_payload.get("author_analysis_input_v1"), dict) else {},
189
- "sampled_work_explanations": analysis_payload.get("sampled_work_explanations") if isinstance(analysis_payload.get("sampled_work_explanations"), dict) else {},
190
- "stage_status": analysis_payload.get("stage_status") if isinstance(analysis_payload.get("stage_status"), dict) else {},
191
- "quality_tier": analysis_payload.get("quality_tier") or "",
192
- "sampled_work_ids": list(analysis_payload.get("sampled_work_ids") or []) if isinstance(analysis_payload.get("sampled_work_ids"), list) else [],
193
- "author_card_highlights": author_card_highlights,
194
- "business_score": int(analysis_payload.get("business_score", 0) or 0),
195
- "benchmark_gap_score": int(analysis_payload.get("benchmark_gap_score", 0) or 0),
196
- "style_radar": analysis_payload.get("style_radar") if isinstance(analysis_payload.get("style_radar"), dict) else {},
197
- "core_contradictions": analysis_payload.get("core_contradictions") if isinstance(analysis_payload.get("core_contradictions"), list) else [],
198
- "recommendations": analysis_payload.get("recommendations") if isinstance(analysis_payload.get("recommendations"), list) else [],
199
- "business_analysis": analysis_payload.get("business_analysis", ""),
200
- "benchmark_analysis": analysis_payload.get("benchmark_analysis", ""),
201
- "validation": analysis_payload.get("validation") if isinstance(analysis_payload.get("validation"), dict) else {},
202
- }
203
-
204
- return write_benchmark_card(
205
- payload=payload,
206
- platform=platform,
207
- card_type="author",
208
- card_root=card_root,
209
- sample_author=None,
210
- content_kind="author_analysis",
211
- storage_config=storage_config,
212
- card_role=AUTHOR_CARD_ROLE,
213
- )