@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,491 @@
1
+ #!/usr/bin/env python3
2
+
3
+ if __package__ in {None, ""}:
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ _self = Path(__file__).resolve()
8
+ for _parent in _self.parents:
9
+ if (_parent / "scripts" / "core" / "bootstrap_env.py").is_file():
10
+ sys.path.insert(0, str(_parent))
11
+ break
12
+
13
+ """Componentized author-home orchestrator."""
14
+
15
+ import hashlib
16
+ import json
17
+ from datetime import datetime
18
+ from pathlib import Path
19
+ from typing import Any, Callable, Dict, List, Optional
20
+
21
+ from scripts.core.config_loader import resolve_storage_paths
22
+ from scripts.core.storage_router import render_output_filename, resolve_json_filename_pattern
23
+
24
+ from scripts.author_home.adapters.platform_adapters import adapt_douyin_author_home, adapt_xhs_author_home
25
+ from scripts.author_home.orchestrator.work_analysis_artifacts import orchestrate_work_analysis_artifacts
26
+ from scripts.core.progress_report import ProgressReporter
27
+ from scripts.author_home.analyzers.prompt_first_analyzers import run_prompt_first_author_analysis
28
+ from scripts.author_home.asr.home_asr import enrich_author_home_asr
29
+ from scripts.author_home.builders.home_builders import build_author_card, build_work_cards
30
+ from scripts.author_home.collectors.homepage_collectors import collect_douyin_author_home_raw, collect_xhs_author_home_raw
31
+
32
+ CollectorFn = Callable[..., Dict[str, Any]]
33
+
34
+
35
+ def _unsupported(platform: str) -> Dict[str, Any]:
36
+ return {
37
+ "platform": platform,
38
+ "content_kind": "author_home",
39
+ "raw_content": "",
40
+ "summary": "",
41
+ "insights": ["source=author_home_orchestrator", "unsupported_platform"],
42
+ "confidence": "low",
43
+ "error_reason": f"unsupported_platform:{platform}",
44
+ "missing_fields": [],
45
+ "extract_trace": [],
46
+ "fallback_trace": [],
47
+ "request_id": None,
48
+ }
49
+
50
+
51
+ def _enforce_fixed_pipeline_persistence(*, platform: str, content_kind: str, write_card: bool, persist_output: bool) -> None:
52
+ if write_card and persist_output:
53
+ return
54
+ raise ValueError(
55
+ f"fixed_pipeline_requires_full_persistence:{platform}:{content_kind}:write_card={bool(write_card)}:persist_output={bool(persist_output)}"
56
+ )
57
+
58
+
59
+ def _safe_slug(value: Any, fallback: str = "unknown") -> str:
60
+ text = str(value or "").strip().lower()
61
+ if not text:
62
+ return fallback
63
+ filtered = "".join(ch if ch.isalnum() or ch in {"-", "_"} else "-" for ch in text).strip("-")
64
+ return filtered[:64] or fallback
65
+
66
+
67
+ def _resolve_identifier(input_value: str, result: Dict[str, Any]) -> str:
68
+ for key in ("platform_work_id", "note_id", "request_id"):
69
+ hit = _safe_slug(result.get(key), fallback="")
70
+ if hit:
71
+ return hit
72
+
73
+ source = result.get("source")
74
+ if isinstance(source, dict):
75
+ for key in ("share_url", "share_text", "note_id"):
76
+ candidate = str(source.get(key) or "").strip()
77
+ if candidate:
78
+ return f"url-{hashlib.sha1(candidate.encode('utf-8')).hexdigest()[:10]}"
79
+
80
+ fallback = str(input_value or "").strip()
81
+ if fallback:
82
+ return f"url-{hashlib.sha1(fallback.encode('utf-8')).hexdigest()[:10]}"
83
+ return "missing_input"
84
+
85
+
86
+ def _build_persist_payload(*, result: Dict[str, Any], status: str, written_at: datetime, identifier: str) -> Dict[str, Any]:
87
+ platform = str(result.get("platform") or "unknown")
88
+ content_kind = str(result.get("content_kind") or "unknown")
89
+ summary = {
90
+ "summary": result.get("summary", ""),
91
+ "insights": result.get("insights", []),
92
+ "confidence": result.get("confidence"),
93
+ "error_reason": result.get("error_reason"),
94
+ }
95
+ normalized = {
96
+ "platform": platform,
97
+ "content_kind": content_kind,
98
+ "platform_work_id": result.get("platform_work_id") or result.get("note_id"),
99
+ "request_id": result.get("request_id"),
100
+ "source": result.get("source") if isinstance(result.get("source"), dict) else {},
101
+ }
102
+ return {
103
+ "meta": {
104
+ "written_at": written_at.isoformat(timespec="seconds"),
105
+ "status": status,
106
+ "platform": platform,
107
+ "identifier": identifier,
108
+ },
109
+ "summary": summary,
110
+ "normalized": normalized,
111
+ "raw": result,
112
+ }
113
+
114
+
115
+ def _persist_output_artifact(*, result: Dict[str, Any], input_value: str, storage_config: Dict[str, Any], persist_output: bool) -> Dict[str, Any]:
116
+ if not persist_output:
117
+ return {"enabled": False, "skipped": True, "reason": "disabled_by_flag"}
118
+
119
+ try:
120
+ paths = resolve_storage_paths(storage_config or {})
121
+ except Exception as error:
122
+ return {"enabled": True, "ok": False, "error": f"resolve_storage_paths_failed:{error}"}
123
+
124
+ now = datetime.now()
125
+ date_key = now.strftime("%Y%m%d")
126
+ timestamp = now.strftime("%Y%m%dT%H%M%S")
127
+ platform = _safe_slug(result.get("platform"), fallback="unknown")
128
+ identifier = _resolve_identifier(input_value, result)
129
+ has_error = bool(result.get("error_reason"))
130
+ status = "error" if has_error else "success"
131
+
132
+ if has_error:
133
+ target_dir = Path(paths.get("errors_root", "")) / date_key
134
+ else:
135
+ target_dir = Path(paths.get("results_root", "")) / date_key
136
+
137
+ target_dir.mkdir(parents=True, exist_ok=True)
138
+ file_name = render_output_filename(
139
+ pattern=resolve_json_filename_pattern(storage_config),
140
+ context={
141
+ "prefix": status,
142
+ "platform": platform,
143
+ "card_type": "author_home_result",
144
+ "author_slug": identifier,
145
+ "title_slug": identifier,
146
+ "identifier": identifier,
147
+ "timestamp": timestamp,
148
+ "date": date_key,
149
+ "ext": ".json",
150
+ },
151
+ default_filename=f"{timestamp}-{platform}-{identifier}.json",
152
+ default_ext=".json",
153
+ )
154
+ file_path = target_dir / file_name
155
+ payload = _build_persist_payload(
156
+ result=result,
157
+ status=status,
158
+ written_at=now,
159
+ identifier=identifier,
160
+ )
161
+ file_path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
162
+ return {
163
+ "enabled": True,
164
+ "ok": True,
165
+ "status": status,
166
+ "path": str(file_path),
167
+ }
168
+
169
+
170
+ def run_author_home_analysis(
171
+ *,
172
+ platform: str,
173
+ input_value: str,
174
+ base_url: str,
175
+ token: str,
176
+ timeout_ms: int,
177
+ page_size: int = 20,
178
+ pages_max: int = 50,
179
+ max_items: int = 200,
180
+ poll_interval_sec: float = 3.0,
181
+ max_polls: int = 30,
182
+ douyin_u2_submit_max_retries: int = 2,
183
+ douyin_u2_submit_backoff_ms: int = 1500,
184
+ xhs_u2_submit_max_retries: int = 0,
185
+ xhs_u2_submit_backoff_ms: int = 0,
186
+ u2_timeout_retry_enabled: bool = True,
187
+ u2_timeout_retry_max_retries: int = 3,
188
+ asr_batch_size: int = 20,
189
+ checkpoint: Optional[Dict[str, Any]] = None,
190
+ write_card: bool = True,
191
+ persist_output: bool = True,
192
+ card_root: Optional[str] = None,
193
+ storage_config: Optional[Dict[str, Any]] = None,
194
+ collector_override: Optional[CollectorFn] = None,
195
+ progress: Optional[ProgressReporter] = None,
196
+ ) -> Dict[str, Any]:
197
+ _enforce_fixed_pipeline_persistence(
198
+ platform=platform,
199
+ content_kind="author_home",
200
+ write_card=bool(write_card),
201
+ persist_output=bool(persist_output),
202
+ )
203
+
204
+ # hard default policy: latest + cursor loop + max 200 across all platforms
205
+ capped_max_items = min(max(max_items, 1), 200)
206
+ capped_page_size = min(max(page_size, 1), 20)
207
+ if progress is not None:
208
+ progress.started(
209
+ stage="author_home.workflow",
210
+ message="author_home workflow started",
211
+ data={"page_size": capped_page_size, "max_items": capped_max_items},
212
+ )
213
+
214
+ if platform == "douyin":
215
+ collector = collector_override or collect_douyin_author_home_raw
216
+ raw = collector(
217
+ input_value=input_value,
218
+ base_url=base_url,
219
+ token=token,
220
+ timeout_ms=timeout_ms,
221
+ page_size=capped_page_size,
222
+ pages_max=max(pages_max, 1),
223
+ max_items=capped_max_items,
224
+ progress=progress.child(scope="author_home.collect") if progress is not None else None,
225
+ )
226
+ profile, works, adapter_missing = adapt_douyin_author_home(raw)
227
+ elif platform == "xiaohongshu":
228
+ collector = collector_override or collect_xhs_author_home_raw
229
+ raw = collector(
230
+ input_value=input_value,
231
+ base_url=base_url,
232
+ token=token,
233
+ timeout_ms=timeout_ms,
234
+ page_size=capped_page_size,
235
+ pages_max=max(pages_max, 1),
236
+ max_items=capped_max_items,
237
+ progress=progress.child(scope="author_home.collect") if progress is not None else None,
238
+ )
239
+ profile, works, adapter_missing = adapt_xhs_author_home(raw)
240
+ else:
241
+ return _unsupported(platform)
242
+
243
+ # Defensive cap enforcement at orchestrator layer.
244
+ works = works[:capped_max_items]
245
+ if progress is not None:
246
+ progress.progress(
247
+ stage="author_home.adapt",
248
+ message="author_home raw payload adapted",
249
+ data={"works_count": len(works), "missing_fields": len(adapter_missing)},
250
+ )
251
+
252
+ asr_bundle = enrich_author_home_asr(
253
+ platform=platform,
254
+ works=works,
255
+ base_url=base_url,
256
+ token=token,
257
+ timeout_ms=timeout_ms,
258
+ poll_interval_sec=poll_interval_sec,
259
+ max_polls=max_polls,
260
+ douyin_submit_max_retries=douyin_u2_submit_max_retries,
261
+ douyin_submit_backoff_ms=douyin_u2_submit_backoff_ms,
262
+ xhs_submit_max_retries=xhs_u2_submit_max_retries,
263
+ xhs_submit_backoff_ms=xhs_u2_submit_backoff_ms,
264
+ timeout_retry_enabled=u2_timeout_retry_enabled,
265
+ timeout_retry_max_retries=u2_timeout_retry_max_retries,
266
+ batch_size=asr_batch_size,
267
+ checkpoint=checkpoint,
268
+ progress=progress.child(scope="author_home.asr") if progress is not None else None,
269
+ )
270
+ works = list(asr_bundle.get("works") or [])[:capped_max_items]
271
+
272
+ if write_card:
273
+ work_analysis_bundle = orchestrate_work_analysis_artifacts(
274
+ platform=platform,
275
+ profile=profile,
276
+ works=works,
277
+ storage_config=storage_config,
278
+ progress=progress.child(scope="author_home.work_analysis") if progress is not None else None,
279
+ )
280
+ else:
281
+ work_analysis_bundle = {
282
+ "render_payloads": {},
283
+ "artifact_manifest": {},
284
+ "stats": {
285
+ "total_count": len(works),
286
+ "cache_hit_count": 0,
287
+ "queued_count": 0,
288
+ "running_workers": 0,
289
+ "running_workers_peak": 0,
290
+ "finished_count": 0,
291
+ "failed_count": 0,
292
+ "max_workers": 0,
293
+ },
294
+ "failed_items": [],
295
+ "trace": [],
296
+ "artifact_root": None,
297
+ "analysis_logic_version": None,
298
+ "prompt_contract_hash": None,
299
+ }
300
+ work_analysis_stats = work_analysis_bundle.get("stats") if isinstance(work_analysis_bundle.get("stats"), dict) else {}
301
+ work_analysis_failed = work_analysis_bundle.get("failed_items") if isinstance(work_analysis_bundle.get("failed_items"), list) else []
302
+ work_analysis_trace = list(work_analysis_bundle.get("trace") or [])
303
+ artifact_manifest = work_analysis_bundle.get("artifact_manifest") if isinstance(work_analysis_bundle.get("artifact_manifest"), dict) else {}
304
+ render_payloads = work_analysis_bundle.get("render_payloads") if isinstance(work_analysis_bundle.get("render_payloads"), dict) else {}
305
+ failed_work_ids = {str(item.get("platform_work_id") or "").strip() for item in work_analysis_failed if isinstance(item, dict)}
306
+ for work in works:
307
+ if not isinstance(work, dict):
308
+ continue
309
+ platform_work_id = str(work.get("platform_work_id") or "").strip()
310
+ manifest = artifact_manifest.get(platform_work_id) if platform_work_id else None
311
+ if isinstance(manifest, dict):
312
+ work["analysis_artifact_status"] = "cache_hit" if manifest.get("from_cache") else "generated"
313
+ work["analysis_artifact_path"] = manifest.get("artifact_path")
314
+ elif platform_work_id in failed_work_ids:
315
+ work["analysis_artifact_status"] = "failed"
316
+ work["analysis_artifact_path"] = None
317
+
318
+ if progress is not None:
319
+ progress.progress(stage="author_home.analysis", message="running author analysis")
320
+ analysis, analysis_missing, analysis_trace = run_prompt_first_author_analysis(profile, works)
321
+ if progress is not None:
322
+ progress.done(
323
+ stage="author_home.analysis",
324
+ message="author analysis finished",
325
+ data={"missing_fields": len(analysis_missing)},
326
+ )
327
+
328
+ if progress is not None:
329
+ progress.progress(
330
+ stage="author_home.card_write",
331
+ message="writing author and work cards",
332
+ data={"write_card": bool(write_card)},
333
+ )
334
+ work_card_write = build_work_cards(
335
+ platform=platform,
336
+ profile=profile,
337
+ works=works,
338
+ render_payloads=render_payloads,
339
+ card_root=card_root,
340
+ storage_config=storage_config,
341
+ write_card=write_card,
342
+ failed_items=work_analysis_failed,
343
+ )
344
+ author_card_write = build_author_card(
345
+ platform=platform,
346
+ profile=profile,
347
+ analysis_payload=analysis,
348
+ card_root=card_root,
349
+ storage_config=storage_config,
350
+ write_card=write_card,
351
+ )
352
+
353
+ asr_trace = list(asr_bundle.get("trace") or [])
354
+ all_extract_trace = list(raw.get("extract_trace") or []) + asr_trace + work_analysis_trace + analysis_trace
355
+
356
+ fallback_trace: List[Dict[str, Any]] = []
357
+ for step in all_extract_trace:
358
+ if not isinstance(step, dict):
359
+ continue
360
+ name = str(step.get("step") or "")
361
+ try:
362
+ has_retry = int(step.get("retry_attempt") or 0) > 0
363
+ except Exception:
364
+ has_retry = False
365
+ if "fallback" in name or not step.get("ok", True) or step.get("fallback_trigger_reason") or has_retry:
366
+ fallback_trace.append(step)
367
+
368
+ asr_missing: List[Dict[str, str]] = []
369
+ for item in works:
370
+ if not isinstance(item, dict):
371
+ continue
372
+ if str(item.get("analysis_eligibility") or "") == "eligible":
373
+ continue
374
+ asr_missing.append(
375
+ {
376
+ "field": f"works[{item.get('platform_work_id') or 'unknown'}].asr",
377
+ "reason": str(item.get("analysis_exclusion_reason") or item.get("asr_error_reason") or "asr_failed"),
378
+ }
379
+ )
380
+
381
+ work_analysis_missing: List[Dict[str, str]] = []
382
+ for item in work_analysis_failed:
383
+ if not isinstance(item, dict):
384
+ continue
385
+ work_analysis_missing.append(
386
+ {
387
+ "field": f"works[{item.get('platform_work_id') or 'unknown'}].analysis_artifact",
388
+ "reason": str(item.get("error_reason") or "work_analysis_artifact_failed"),
389
+ }
390
+ )
391
+
392
+ asr_stats = asr_bundle.get("stats") if isinstance(asr_bundle.get("stats"), dict) else {}
393
+ asr_checkpoint = asr_bundle.get("checkpoint") if isinstance(asr_bundle.get("checkpoint"), dict) else {}
394
+
395
+ if progress is not None:
396
+ progress.done(
397
+ stage="author_home.card_write",
398
+ message="author_home card writing finished",
399
+ data={
400
+ "author_card_ok": bool(author_card_write.get("ok")),
401
+ "work_cards_count": int(work_card_write.get("count") or 0),
402
+ "work_card_results": len(work_card_write.get("results") or []),
403
+ },
404
+ )
405
+
406
+ result = {
407
+ "platform": platform,
408
+ "content_kind": "author_home",
409
+ "raw_content": "",
410
+ "summary": analysis.get("author_portrait", ""),
411
+ "insights": [
412
+ "source=author_home_componentized",
413
+ f"works_count={len(works)}",
414
+ f"business_score={analysis.get('business_score', 0)}",
415
+ f"benchmark_gap_score={analysis.get('benchmark_gap_score', 0)}",
416
+ f"asr_success={asr_stats.get('success', 0)}",
417
+ "analysis_strategy=prompt_first",
418
+ f"work_cache_hit={work_analysis_stats.get('cache_hit_count', 0)}",
419
+ f"work_queued={work_analysis_stats.get('queued_count', 0)}",
420
+ f"work_failed={work_analysis_stats.get('failed_count', 0)}",
421
+ ],
422
+ "confidence": "medium" if not analysis_missing else "low",
423
+ "error_reason": None,
424
+ "missing_fields": adapter_missing + analysis_missing + asr_missing + work_analysis_missing,
425
+ "extract_trace": all_extract_trace,
426
+ "fallback_trace": fallback_trace,
427
+ "request_id": raw.get("request_id"),
428
+ "author_profile": profile,
429
+ "works": works,
430
+ "pagination": {
431
+ **(raw.get("pagination") or {}),
432
+ "total_collected": len(works),
433
+ "max_items": capped_max_items,
434
+ },
435
+ "analysis_output": analysis,
436
+ "author_analysis_v2": analysis.get("author_analysis_v2") if isinstance(analysis.get("author_analysis_v2"), dict) else {},
437
+ "author_analysis_input_v1": analysis.get("author_analysis_input_v1") if isinstance(analysis.get("author_analysis_input_v1"), dict) else {},
438
+ "analysis_validation": analysis.get("validation") if isinstance(analysis.get("validation"), dict) else {},
439
+ "asr_stats": asr_stats,
440
+ "work_analysis": {
441
+ "stats": work_analysis_stats,
442
+ "failed_items": work_analysis_failed,
443
+ "artifact_root": work_analysis_bundle.get("artifact_root"),
444
+ "analysis_logic_version": work_analysis_bundle.get("analysis_logic_version"),
445
+ "prompt_contract_hash": work_analysis_bundle.get("prompt_contract_hash"),
446
+ },
447
+ "card_write": {
448
+ "author": author_card_write,
449
+ "works": work_card_write,
450
+ },
451
+ "checkpoint": {
452
+ "last_cursor": ((raw.get("pagination") or {}).get("pages") or [{}])[-1].get("cursor_out") if isinstance((raw.get("pagination") or {}).get("pages"), list) and (raw.get("pagination") or {}).get("pages") else "",
453
+ "pages": len((raw.get("pagination") or {}).get("pages") or []),
454
+ "total_collected": len(works),
455
+ "max_items": capped_max_items,
456
+ "sort": "latest",
457
+ "cursor_mode": (raw.get("pagination") or {}).get("cursor_mode", "cursor"),
458
+ "asr": asr_checkpoint,
459
+ "work_analysis": {
460
+ "cache_hit_count": work_analysis_stats.get("cache_hit_count", 0),
461
+ "queued_count": work_analysis_stats.get("queued_count", 0),
462
+ "finished_count": work_analysis_stats.get("finished_count", 0),
463
+ "failed_count": work_analysis_stats.get("failed_count", 0),
464
+ "artifact_root": work_analysis_bundle.get("artifact_root"),
465
+ "failed_items": work_analysis_failed,
466
+ },
467
+ },
468
+ }
469
+ result["output_persist"] = _persist_output_artifact(
470
+ result=result,
471
+ input_value=input_value,
472
+ storage_config=storage_config or {},
473
+ persist_output=bool(persist_output),
474
+ )
475
+ if progress is not None:
476
+ final_event = progress.failed if result.get("error_reason") else progress.done
477
+ final_event(
478
+ stage="author_home.workflow",
479
+ message="author_home workflow finished" if not result.get("error_reason") else "author_home workflow failed",
480
+ data={
481
+ "works_count": len(works),
482
+ "request_id": result.get("request_id"),
483
+ "author_card_ok": bool((result.get("card_write") or {}).get("author", {}).get("ok")),
484
+ "work_cards_count": int(((result.get("card_write") or {}).get("works") or {}).get("count") or 0),
485
+ "cache_hit_count": work_analysis_stats.get("cache_hit_count", 0),
486
+ "queued_count": work_analysis_stats.get("queued_count", 0),
487
+ "failed_count": work_analysis_stats.get("failed_count", 0),
488
+ "output_persist_ok": bool((result.get("output_persist") or {}).get("ok")),
489
+ },
490
+ )
491
+ return result