@tikomni/skills 0.1.3 → 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 (474) 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 -5
  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/{single-work-analysis/scripts/pipeline/asr → social-media-crawl/scripts/core}/asr_pipeline.py +98 -2
  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 +106 -141
  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/{single-work-analysis/scripts/pipeline/asr → social-media-crawl/scripts/core}/poll_u2_task.py +3 -1
  30. package/skills/{creator-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/social-media-crawl/scripts/core/u3_fallback.py +328 -0
  33. package/skills/social-media-crawl/scripts/pipelines/__init__.py +2 -0
  34. package/skills/social-media-crawl/scripts/pipelines/douyin_creator_home_helpers.py +35 -0
  35. package/skills/social-media-crawl/scripts/pipelines/douyin_platform_adapter.py +7 -0
  36. package/skills/{creator-analysis/scripts/author_home/asr → social-media-crawl/scripts/pipelines}/home_asr.py +1 -1
  37. package/skills/{creator-analysis/scripts/author_home/adapters → social-media-crawl/scripts/pipelines}/platform_adapters.py +8 -2
  38. package/skills/social-media-crawl/scripts/pipelines/run_douyin_creator_home.py +237 -0
  39. package/skills/{single-work-analysis/scripts/platform/douyin/run_douyin_single_video.py → social-media-crawl/scripts/pipelines/run_douyin_single_work.py} +58 -149
  40. package/skills/social-media-crawl/scripts/pipelines/run_xiaohongshu_creator_home.py +237 -0
  41. package/skills/{single-work-analysis/scripts/platform/xiaohongshu/run_xiaohongshu_extract.py → social-media-crawl/scripts/pipelines/run_xiaohongshu_single_work.py} +30 -119
  42. package/skills/{creator-analysis/scripts/author_home → social-media-crawl/scripts/pipelines}/schema.py +1 -1
  43. package/skills/social-media-crawl/scripts/pipelines/xiaohongshu_creator_home_helpers.py +35 -0
  44. package/skills/social-media-crawl/scripts/pipelines/xiaohongshu_platform_adapter.py +7 -0
  45. package/skills/social-media-crawl/scripts/writers/__init__.py +1 -0
  46. package/skills/social-media-crawl/scripts/writers/write_work_fact_card.py +391 -0
  47. package/skills/creator-analysis/SKILL.md +0 -95
  48. package/skills/creator-analysis/agents/openai.yaml +0 -4
  49. package/skills/creator-analysis/env.example +0 -36
  50. package/skills/creator-analysis/references/api-capability-index.md +0 -92
  51. package/skills/creator-analysis/references/api-contracts/asr-api.md +0 -130
  52. package/skills/creator-analysis/references/api-contracts/bilibili-app-api.md +0 -776
  53. package/skills/creator-analysis/references/api-contracts/bilibili-web-api.md +0 -2017
  54. package/skills/creator-analysis/references/api-contracts/demo-api.md +0 -717
  55. package/skills/creator-analysis/references/api-contracts/douyin-app-v3-api.md +0 -3594
  56. package/skills/creator-analysis/references/api-contracts/douyin-billboard-api.md +0 -2274
  57. package/skills/creator-analysis/references/api-contracts/douyin-creator-api.md +0 -1575
  58. package/skills/creator-analysis/references/api-contracts/douyin-creator-v2-api.md +0 -3254
  59. package/skills/creator-analysis/references/api-contracts/douyin-search-api.md +0 -4118
  60. package/skills/creator-analysis/references/api-contracts/douyin-web-api.md +0 -5544
  61. package/skills/creator-analysis/references/api-contracts/douyin-xingtu-api.md +0 -1916
  62. package/skills/creator-analysis/references/api-contracts/douyin-xingtu-v2-api.md +0 -1540
  63. package/skills/creator-analysis/references/api-contracts/health-check.md +0 -69
  64. package/skills/creator-analysis/references/api-contracts/hybrid-parsing.md +0 -78
  65. package/skills/creator-analysis/references/api-contracts/instagram-v1-api.md +0 -2256
  66. package/skills/creator-analysis/references/api-contracts/instagram-v2-api.md +0 -2011
  67. package/skills/creator-analysis/references/api-contracts/instagram-v3-api.md +0 -2630
  68. package/skills/creator-analysis/references/api-contracts/ios-shortcut.md +0 -44
  69. package/skills/creator-analysis/references/api-contracts/kuaishou-app-api.md +0 -1518
  70. package/skills/creator-analysis/references/api-contracts/kuaishou-web-api.md +0 -1242
  71. package/skills/creator-analysis/references/api-contracts/lemon8-app-api.md +0 -1088
  72. package/skills/creator-analysis/references/api-contracts/linkedin-web-api.md +0 -1949
  73. package/skills/creator-analysis/references/api-contracts/media-ingest-api.md +0 -126
  74. package/skills/creator-analysis/references/api-contracts/pipixia-app-api.md +0 -1142
  75. package/skills/creator-analysis/references/api-contracts/reddit-app-api.md +0 -2025
  76. package/skills/creator-analysis/references/api-contracts/sora2-api.md +0 -2266
  77. package/skills/creator-analysis/references/api-contracts/temp-mail-api.md +0 -208
  78. package/skills/creator-analysis/references/api-contracts/threads-web-api.md +0 -897
  79. package/skills/creator-analysis/references/api-contracts/tikhub-downloader-api.md +0 -134
  80. package/skills/creator-analysis/references/api-contracts/tikhub-user-api.md +0 -494
  81. package/skills/creator-analysis/references/api-contracts/tiktok-ads-api.md +0 -5947
  82. package/skills/creator-analysis/references/api-contracts/tiktok-analytics-api.md +0 -968
  83. package/skills/creator-analysis/references/api-contracts/tiktok-app-v3-api.md +0 -5735
  84. package/skills/creator-analysis/references/api-contracts/tiktok-creator-api.md +0 -1951
  85. package/skills/creator-analysis/references/api-contracts/tiktok-interaction-api.md +0 -742
  86. package/skills/creator-analysis/references/api-contracts/tiktok-shop-web-api.md +0 -1890
  87. package/skills/creator-analysis/references/api-contracts/tiktok-web-api.md +0 -4448
  88. package/skills/creator-analysis/references/api-contracts/toutiao-app-api.md +0 -342
  89. package/skills/creator-analysis/references/api-contracts/toutiao-web-api.md +0 -143
  90. package/skills/creator-analysis/references/api-contracts/twitter-web-api.md +0 -989
  91. package/skills/creator-analysis/references/api-contracts/wechat-channels-api.md +0 -809
  92. package/skills/creator-analysis/references/api-contracts/wechat-media-platform-web-api.md +0 -677
  93. package/skills/creator-analysis/references/api-contracts/weibo-app-api.md +0 -1547
  94. package/skills/creator-analysis/references/api-contracts/weibo-web-api.md +0 -798
  95. package/skills/creator-analysis/references/api-contracts/weibo-web-v2-api.md +0 -2459
  96. package/skills/creator-analysis/references/api-contracts/xiaohongshu-app-api.md +0 -1291
  97. package/skills/creator-analysis/references/api-contracts/xiaohongshu-app-v2-api.md +0 -1683
  98. package/skills/creator-analysis/references/api-contracts/xiaohongshu-web-api.md +0 -1324
  99. package/skills/creator-analysis/references/api-contracts/xiaohongshu-web-v2-api.md +0 -1209
  100. package/skills/creator-analysis/references/api-contracts/xigua-app-v2-api.md +0 -489
  101. package/skills/creator-analysis/references/api-contracts/youtube-web-api.md +0 -2636
  102. package/skills/creator-analysis/references/api-contracts/youtube-web-v2-api.md +0 -2660
  103. package/skills/creator-analysis/references/api-contracts/zhihu-web-api.md +0 -2315
  104. package/skills/creator-analysis/references/api-tags/asr-api.md +0 -100
  105. package/skills/creator-analysis/references/api-tags/bilibili-app-api.md +0 -482
  106. package/skills/creator-analysis/references/api-tags/bilibili-web-api.md +0 -1267
  107. package/skills/creator-analysis/references/api-tags/demo-api.md +0 -365
  108. package/skills/creator-analysis/references/api-tags/douyin-app-v3-api.md +0 -2012
  109. package/skills/creator-analysis/references/api-tags/douyin-billboard-api.md +0 -1428
  110. package/skills/creator-analysis/references/api-tags/douyin-creator-api.md +0 -694
  111. package/skills/creator-analysis/references/api-tags/douyin-creator-v2-api.md +0 -694
  112. package/skills/creator-analysis/references/api-tags/douyin-search-api.md +0 -1059
  113. package/skills/creator-analysis/references/api-tags/douyin-web-api.md +0 -3314
  114. package/skills/creator-analysis/references/api-tags/douyin-xingtu-api.md +0 -935
  115. package/skills/creator-analysis/references/api-tags/douyin-xingtu-v2-api.md +0 -925
  116. package/skills/creator-analysis/references/api-tags/health-check.md +0 -40
  117. package/skills/creator-analysis/references/api-tags/hybrid-parsing.md +0 -57
  118. package/skills/creator-analysis/references/api-tags/instagram-v1-api.md +0 -1224
  119. package/skills/creator-analysis/references/api-tags/instagram-v2-api.md +0 -1147
  120. package/skills/creator-analysis/references/api-tags/instagram-v3-api.md +0 -1123
  121. package/skills/creator-analysis/references/api-tags/ios-shortcut.md +0 -45
  122. package/skills/creator-analysis/references/api-tags/kuaishou-app-api.md +0 -846
  123. package/skills/creator-analysis/references/api-tags/kuaishou-web-api.md +0 -551
  124. package/skills/creator-analysis/references/api-tags/lemon8-app-api.md +0 -687
  125. package/skills/creator-analysis/references/api-tags/linkedin-web-api.md +0 -1105
  126. package/skills/creator-analysis/references/api-tags/media-ingest-api.md +0 -112
  127. package/skills/creator-analysis/references/api-tags/pipixia-app-api.md +0 -721
  128. package/skills/creator-analysis/references/api-tags/reddit-app-api.md +0 -1057
  129. package/skills/creator-analysis/references/api-tags/sora2-api.md +0 -737
  130. package/skills/creator-analysis/references/api-tags/temp-mail-api.md +0 -136
  131. package/skills/creator-analysis/references/api-tags/threads-web-api.md +0 -472
  132. package/skills/creator-analysis/references/api-tags/tikhub-downloader-api.md +0 -65
  133. package/skills/creator-analysis/references/api-tags/tikhub-user-api.md +0 -253
  134. package/skills/creator-analysis/references/api-tags/tiktok-ads-api.md +0 -1393
  135. package/skills/creator-analysis/references/api-tags/tiktok-analytics-api.md +0 -179
  136. package/skills/creator-analysis/references/api-tags/tiktok-app-v3-api.md +0 -3264
  137. package/skills/creator-analysis/references/api-tags/tiktok-creator-api.md +0 -709
  138. package/skills/creator-analysis/references/api-tags/tiktok-interaction-api.md +0 -366
  139. package/skills/creator-analysis/references/api-tags/tiktok-shop-web-api.md +0 -663
  140. package/skills/creator-analysis/references/api-tags/tiktok-web-api.md +0 -2516
  141. package/skills/creator-analysis/references/api-tags/toutiao-app-api.md +0 -220
  142. package/skills/creator-analysis/references/api-tags/toutiao-web-api.md +0 -96
  143. package/skills/creator-analysis/references/api-tags/twitter-web-api.md +0 -562
  144. package/skills/creator-analysis/references/api-tags/wechat-channels-api.md +0 -405
  145. package/skills/creator-analysis/references/api-tags/wechat-media-platform-web-api.md +0 -431
  146. package/skills/creator-analysis/references/api-tags/weibo-app-api.md +0 -851
  147. package/skills/creator-analysis/references/api-tags/weibo-web-api.md +0 -470
  148. package/skills/creator-analysis/references/api-tags/weibo-web-v2-api.md +0 -1405
  149. package/skills/creator-analysis/references/api-tags/xiaohongshu-app-api.md +0 -534
  150. package/skills/creator-analysis/references/api-tags/xiaohongshu-app-v2-api.md +0 -934
  151. package/skills/creator-analysis/references/api-tags/xiaohongshu-web-api.md +0 -757
  152. package/skills/creator-analysis/references/api-tags/xiaohongshu-web-v2-api.md +0 -762
  153. package/skills/creator-analysis/references/api-tags/xigua-app-v2-api.md +0 -308
  154. package/skills/creator-analysis/references/api-tags/youtube-web-api.md +0 -934
  155. package/skills/creator-analysis/references/api-tags/youtube-web-v2-api.md +0 -717
  156. package/skills/creator-analysis/references/api-tags/zhihu-web-api.md +0 -1384
  157. package/skills/creator-analysis/references/asr-orchestration.md +0 -33
  158. package/skills/creator-analysis/references/config-templates/defaults.yaml +0 -60
  159. package/skills/creator-analysis/references/contracts/creator-card-fields.md +0 -25
  160. package/skills/creator-analysis/references/contracts/work-card-fields.md +0 -68
  161. package/skills/creator-analysis/references/platform-guides/douyin.md +0 -54
  162. package/skills/creator-analysis/references/platform-guides/generic.md +0 -50
  163. package/skills/creator-analysis/references/platform-guides/xiaohongshu.md +0 -69
  164. package/skills/creator-analysis/references/prompt-contracts/asr-clean.md +0 -28
  165. package/skills/creator-analysis/references/prompt-contracts/author-analysis-v2.md +0 -46
  166. package/skills/creator-analysis/references/prompt-contracts/author-analysis.md +0 -49
  167. package/skills/creator-analysis/references/prompt-contracts/cta.md +0 -24
  168. package/skills/creator-analysis/references/prompt-contracts/hook.md +0 -25
  169. package/skills/creator-analysis/references/prompt-contracts/insight.md +0 -47
  170. package/skills/creator-analysis/references/prompt-contracts/sampled-work-batch-explanations.md +0 -30
  171. package/skills/creator-analysis/references/prompt-contracts/structure.md +0 -25
  172. package/skills/creator-analysis/references/prompt-contracts/style.md +0 -27
  173. package/skills/creator-analysis/references/prompt-contracts/summary.md +0 -29
  174. package/skills/creator-analysis/references/prompt-contracts/topic.md +0 -29
  175. package/skills/creator-analysis/references/schemas/author-analysis-input-v1.schema.json +0 -325
  176. package/skills/creator-analysis/references/schemas/author-analysis-v2.schema.json +0 -287
  177. package/skills/creator-analysis/references/schemas/sampled-work-batch-explanations.schema.json +0 -41
  178. package/skills/creator-analysis/references/service-guides/asr-u2-u3-fallback.md +0 -75
  179. package/skills/creator-analysis/references/workflow.md +0 -23
  180. package/skills/creator-analysis/scripts/__init__.py +0 -0
  181. package/skills/creator-analysis/scripts/author_home/__init__.py +0 -0
  182. package/skills/creator-analysis/scripts/author_home/adapters/__init__.py +0 -0
  183. package/skills/creator-analysis/scripts/author_home/analyzers/__init__.py +0 -0
  184. package/skills/creator-analysis/scripts/author_home/analyzers/author_analysis_v2_support.py +0 -1165
  185. package/skills/creator-analysis/scripts/author_home/analyzers/prompt_first_analyzers.py +0 -447
  186. package/skills/creator-analysis/scripts/author_home/analyzers/sampled_work_batch_explainer.py +0 -331
  187. package/skills/creator-analysis/scripts/author_home/asr/__init__.py +0 -5
  188. package/skills/creator-analysis/scripts/author_home/builders/__init__.py +0 -0
  189. package/skills/creator-analysis/scripts/author_home/builders/home_builders.py +0 -213
  190. package/skills/creator-analysis/scripts/author_home/collectors/__init__.py +0 -0
  191. package/skills/creator-analysis/scripts/author_home/orchestrator/__init__.py +0 -0
  192. package/skills/creator-analysis/scripts/author_home/orchestrator/run_author_analysis.py +0 -834
  193. package/skills/creator-analysis/scripts/author_home/orchestrator/work_analysis_artifacts.py +0 -609
  194. package/skills/creator-analysis/scripts/core/__init__.py +0 -0
  195. package/skills/creator-analysis/scripts/core/analysis_pipeline.py +0 -133
  196. package/skills/creator-analysis/scripts/core/config_loader.py +0 -418
  197. package/skills/creator-analysis/scripts/core/storage_router.py +0 -256
  198. package/skills/creator-analysis/scripts/core/tikomni_common.py +0 -588
  199. package/skills/creator-analysis/scripts/pipeline/__init__.py +0 -0
  200. package/skills/creator-analysis/scripts/pipeline/asr/__init__.py +0 -0
  201. package/skills/creator-analysis/scripts/pipeline/asr/asr_pipeline.py +0 -1189
  202. package/skills/creator-analysis/scripts/pipeline/asr/poll_u2_task.py +0 -95
  203. package/skills/creator-analysis/scripts/platform/__init__.py +0 -0
  204. package/skills/creator-analysis/scripts/platform/douyin/__init__.py +0 -0
  205. package/skills/creator-analysis/scripts/platform/douyin/run_douyin_single_video.py +0 -1208
  206. package/skills/creator-analysis/scripts/platform/xiaohongshu/__init__.py +0 -0
  207. package/skills/creator-analysis/scripts/platform/xiaohongshu/run_xiaohongshu_extract.py +0 -2128
  208. package/skills/creator-analysis/scripts/writers/__init__.py +0 -0
  209. package/skills/creator-analysis/scripts/writers/write_author_homepage_samples.py +0 -107
  210. package/skills/creator-analysis/scripts/writers/write_benchmark_card.py +0 -1579
  211. package/skills/meta-capability/SKILL.md +0 -69
  212. package/skills/meta-capability/agents/openai.yaml +0 -4
  213. package/skills/meta-capability/env.example +0 -42
  214. package/skills/meta-capability/references/api-capability-index.md +0 -92
  215. package/skills/meta-capability/references/api-contracts/asr-api.md +0 -130
  216. package/skills/meta-capability/references/api-contracts/bilibili-app-api.md +0 -776
  217. package/skills/meta-capability/references/api-contracts/bilibili-web-api.md +0 -2017
  218. package/skills/meta-capability/references/api-contracts/demo-api.md +0 -717
  219. package/skills/meta-capability/references/api-contracts/douyin-app-v3-api.md +0 -3594
  220. package/skills/meta-capability/references/api-contracts/douyin-billboard-api.md +0 -2274
  221. package/skills/meta-capability/references/api-contracts/douyin-creator-api.md +0 -1575
  222. package/skills/meta-capability/references/api-contracts/douyin-creator-v2-api.md +0 -3254
  223. package/skills/meta-capability/references/api-contracts/douyin-search-api.md +0 -4118
  224. package/skills/meta-capability/references/api-contracts/douyin-web-api.md +0 -5544
  225. package/skills/meta-capability/references/api-contracts/douyin-xingtu-api.md +0 -1916
  226. package/skills/meta-capability/references/api-contracts/douyin-xingtu-v2-api.md +0 -1540
  227. package/skills/meta-capability/references/api-contracts/health-check.md +0 -69
  228. package/skills/meta-capability/references/api-contracts/hybrid-parsing.md +0 -78
  229. package/skills/meta-capability/references/api-contracts/instagram-v1-api.md +0 -2256
  230. package/skills/meta-capability/references/api-contracts/instagram-v2-api.md +0 -2011
  231. package/skills/meta-capability/references/api-contracts/instagram-v3-api.md +0 -2630
  232. package/skills/meta-capability/references/api-contracts/ios-shortcut.md +0 -44
  233. package/skills/meta-capability/references/api-contracts/kuaishou-app-api.md +0 -1518
  234. package/skills/meta-capability/references/api-contracts/kuaishou-web-api.md +0 -1242
  235. package/skills/meta-capability/references/api-contracts/lemon8-app-api.md +0 -1088
  236. package/skills/meta-capability/references/api-contracts/linkedin-web-api.md +0 -1949
  237. package/skills/meta-capability/references/api-contracts/media-ingest-api.md +0 -126
  238. package/skills/meta-capability/references/api-contracts/pipixia-app-api.md +0 -1142
  239. package/skills/meta-capability/references/api-contracts/reddit-app-api.md +0 -2025
  240. package/skills/meta-capability/references/api-contracts/sora2-api.md +0 -2266
  241. package/skills/meta-capability/references/api-contracts/temp-mail-api.md +0 -208
  242. package/skills/meta-capability/references/api-contracts/threads-web-api.md +0 -897
  243. package/skills/meta-capability/references/api-contracts/tikhub-downloader-api.md +0 -134
  244. package/skills/meta-capability/references/api-contracts/tikhub-user-api.md +0 -494
  245. package/skills/meta-capability/references/api-contracts/tiktok-ads-api.md +0 -5947
  246. package/skills/meta-capability/references/api-contracts/tiktok-analytics-api.md +0 -968
  247. package/skills/meta-capability/references/api-contracts/tiktok-app-v3-api.md +0 -5735
  248. package/skills/meta-capability/references/api-contracts/tiktok-creator-api.md +0 -1951
  249. package/skills/meta-capability/references/api-contracts/tiktok-interaction-api.md +0 -742
  250. package/skills/meta-capability/references/api-contracts/tiktok-shop-web-api.md +0 -1890
  251. package/skills/meta-capability/references/api-contracts/tiktok-web-api.md +0 -4448
  252. package/skills/meta-capability/references/api-contracts/toutiao-app-api.md +0 -342
  253. package/skills/meta-capability/references/api-contracts/toutiao-web-api.md +0 -143
  254. package/skills/meta-capability/references/api-contracts/twitter-web-api.md +0 -989
  255. package/skills/meta-capability/references/api-contracts/wechat-channels-api.md +0 -809
  256. package/skills/meta-capability/references/api-contracts/wechat-media-platform-web-api.md +0 -677
  257. package/skills/meta-capability/references/api-contracts/weibo-app-api.md +0 -1547
  258. package/skills/meta-capability/references/api-contracts/weibo-web-api.md +0 -798
  259. package/skills/meta-capability/references/api-contracts/weibo-web-v2-api.md +0 -2459
  260. package/skills/meta-capability/references/api-contracts/xiaohongshu-app-api.md +0 -1291
  261. package/skills/meta-capability/references/api-contracts/xiaohongshu-app-v2-api.md +0 -1683
  262. package/skills/meta-capability/references/api-contracts/xiaohongshu-web-api.md +0 -1324
  263. package/skills/meta-capability/references/api-contracts/xiaohongshu-web-v2-api.md +0 -1209
  264. package/skills/meta-capability/references/api-contracts/xigua-app-v2-api.md +0 -489
  265. package/skills/meta-capability/references/api-contracts/youtube-web-api.md +0 -2636
  266. package/skills/meta-capability/references/api-contracts/youtube-web-v2-api.md +0 -2660
  267. package/skills/meta-capability/references/api-contracts/zhihu-web-api.md +0 -2315
  268. package/skills/meta-capability/references/api-tags/asr-api.md +0 -100
  269. package/skills/meta-capability/references/api-tags/bilibili-app-api.md +0 -482
  270. package/skills/meta-capability/references/api-tags/bilibili-web-api.md +0 -1267
  271. package/skills/meta-capability/references/api-tags/demo-api.md +0 -365
  272. package/skills/meta-capability/references/api-tags/douyin-app-v3-api.md +0 -2012
  273. package/skills/meta-capability/references/api-tags/douyin-billboard-api.md +0 -1428
  274. package/skills/meta-capability/references/api-tags/douyin-creator-api.md +0 -694
  275. package/skills/meta-capability/references/api-tags/douyin-creator-v2-api.md +0 -694
  276. package/skills/meta-capability/references/api-tags/douyin-search-api.md +0 -1059
  277. package/skills/meta-capability/references/api-tags/douyin-web-api.md +0 -3314
  278. package/skills/meta-capability/references/api-tags/douyin-xingtu-api.md +0 -935
  279. package/skills/meta-capability/references/api-tags/douyin-xingtu-v2-api.md +0 -925
  280. package/skills/meta-capability/references/api-tags/health-check.md +0 -40
  281. package/skills/meta-capability/references/api-tags/hybrid-parsing.md +0 -57
  282. package/skills/meta-capability/references/api-tags/instagram-v1-api.md +0 -1224
  283. package/skills/meta-capability/references/api-tags/instagram-v2-api.md +0 -1147
  284. package/skills/meta-capability/references/api-tags/instagram-v3-api.md +0 -1123
  285. package/skills/meta-capability/references/api-tags/ios-shortcut.md +0 -45
  286. package/skills/meta-capability/references/api-tags/kuaishou-app-api.md +0 -846
  287. package/skills/meta-capability/references/api-tags/kuaishou-web-api.md +0 -551
  288. package/skills/meta-capability/references/api-tags/lemon8-app-api.md +0 -687
  289. package/skills/meta-capability/references/api-tags/linkedin-web-api.md +0 -1105
  290. package/skills/meta-capability/references/api-tags/media-ingest-api.md +0 -112
  291. package/skills/meta-capability/references/api-tags/pipixia-app-api.md +0 -721
  292. package/skills/meta-capability/references/api-tags/reddit-app-api.md +0 -1057
  293. package/skills/meta-capability/references/api-tags/sora2-api.md +0 -737
  294. package/skills/meta-capability/references/api-tags/temp-mail-api.md +0 -136
  295. package/skills/meta-capability/references/api-tags/threads-web-api.md +0 -472
  296. package/skills/meta-capability/references/api-tags/tikhub-downloader-api.md +0 -65
  297. package/skills/meta-capability/references/api-tags/tikhub-user-api.md +0 -253
  298. package/skills/meta-capability/references/api-tags/tiktok-ads-api.md +0 -1393
  299. package/skills/meta-capability/references/api-tags/tiktok-analytics-api.md +0 -179
  300. package/skills/meta-capability/references/api-tags/tiktok-app-v3-api.md +0 -3264
  301. package/skills/meta-capability/references/api-tags/tiktok-creator-api.md +0 -709
  302. package/skills/meta-capability/references/api-tags/tiktok-interaction-api.md +0 -366
  303. package/skills/meta-capability/references/api-tags/tiktok-shop-web-api.md +0 -663
  304. package/skills/meta-capability/references/api-tags/tiktok-web-api.md +0 -2516
  305. package/skills/meta-capability/references/api-tags/toutiao-app-api.md +0 -220
  306. package/skills/meta-capability/references/api-tags/toutiao-web-api.md +0 -96
  307. package/skills/meta-capability/references/api-tags/twitter-web-api.md +0 -562
  308. package/skills/meta-capability/references/api-tags/wechat-channels-api.md +0 -405
  309. package/skills/meta-capability/references/api-tags/wechat-media-platform-web-api.md +0 -431
  310. package/skills/meta-capability/references/api-tags/weibo-app-api.md +0 -851
  311. package/skills/meta-capability/references/api-tags/weibo-web-api.md +0 -470
  312. package/skills/meta-capability/references/api-tags/weibo-web-v2-api.md +0 -1405
  313. package/skills/meta-capability/references/api-tags/xiaohongshu-app-api.md +0 -534
  314. package/skills/meta-capability/references/api-tags/xiaohongshu-app-v2-api.md +0 -934
  315. package/skills/meta-capability/references/api-tags/xiaohongshu-web-api.md +0 -757
  316. package/skills/meta-capability/references/api-tags/xiaohongshu-web-v2-api.md +0 -762
  317. package/skills/meta-capability/references/api-tags/xigua-app-v2-api.md +0 -308
  318. package/skills/meta-capability/references/api-tags/youtube-web-api.md +0 -934
  319. package/skills/meta-capability/references/api-tags/youtube-web-v2-api.md +0 -717
  320. package/skills/meta-capability/references/api-tags/zhihu-web-api.md +0 -1384
  321. package/skills/meta-capability/references/config-templates/defaults.yaml +0 -18
  322. package/skills/meta-capability/references/dispatch.md +0 -27
  323. package/skills/meta-capability/references/execution-guidelines.md +0 -25
  324. package/skills/meta-capability/references/implemented-route-map.md +0 -177
  325. package/skills/meta-capability/references/service-guides/asr-u2-u3-fallback.md +0 -75
  326. package/skills/meta-capability/scripts/__init__.py +0 -1
  327. package/skills/meta-capability/scripts/call_route.py +0 -141
  328. package/skills/meta-capability/scripts/core/__init__.py +0 -1
  329. package/skills/meta-capability/scripts/core/bootstrap_env.py +0 -32
  330. package/skills/meta-capability/scripts/core/config_loader.py +0 -204
  331. package/skills/meta-capability/scripts/core/tikomni_common.py +0 -443
  332. package/skills/meta-capability/scripts/test_auth.py +0 -98
  333. package/skills/single-work-analysis/SKILL.md +0 -62
  334. package/skills/single-work-analysis/agents/openai.yaml +0 -4
  335. package/skills/single-work-analysis/env.example +0 -36
  336. package/skills/single-work-analysis/references/api-capability-index.md +0 -92
  337. package/skills/single-work-analysis/references/api-contracts/asr-api.md +0 -130
  338. package/skills/single-work-analysis/references/api-contracts/bilibili-app-api.md +0 -776
  339. package/skills/single-work-analysis/references/api-contracts/bilibili-web-api.md +0 -2017
  340. package/skills/single-work-analysis/references/api-contracts/demo-api.md +0 -717
  341. package/skills/single-work-analysis/references/api-contracts/douyin-app-v3-api.md +0 -3594
  342. package/skills/single-work-analysis/references/api-contracts/douyin-billboard-api.md +0 -2274
  343. package/skills/single-work-analysis/references/api-contracts/douyin-creator-api.md +0 -1575
  344. package/skills/single-work-analysis/references/api-contracts/douyin-creator-v2-api.md +0 -3254
  345. package/skills/single-work-analysis/references/api-contracts/douyin-search-api.md +0 -4118
  346. package/skills/single-work-analysis/references/api-contracts/douyin-web-api.md +0 -5544
  347. package/skills/single-work-analysis/references/api-contracts/douyin-xingtu-api.md +0 -1916
  348. package/skills/single-work-analysis/references/api-contracts/douyin-xingtu-v2-api.md +0 -1540
  349. package/skills/single-work-analysis/references/api-contracts/health-check.md +0 -69
  350. package/skills/single-work-analysis/references/api-contracts/hybrid-parsing.md +0 -78
  351. package/skills/single-work-analysis/references/api-contracts/instagram-v1-api.md +0 -2256
  352. package/skills/single-work-analysis/references/api-contracts/instagram-v2-api.md +0 -2011
  353. package/skills/single-work-analysis/references/api-contracts/instagram-v3-api.md +0 -2630
  354. package/skills/single-work-analysis/references/api-contracts/ios-shortcut.md +0 -44
  355. package/skills/single-work-analysis/references/api-contracts/kuaishou-app-api.md +0 -1518
  356. package/skills/single-work-analysis/references/api-contracts/kuaishou-web-api.md +0 -1242
  357. package/skills/single-work-analysis/references/api-contracts/lemon8-app-api.md +0 -1088
  358. package/skills/single-work-analysis/references/api-contracts/linkedin-web-api.md +0 -1949
  359. package/skills/single-work-analysis/references/api-contracts/media-ingest-api.md +0 -126
  360. package/skills/single-work-analysis/references/api-contracts/pipixia-app-api.md +0 -1142
  361. package/skills/single-work-analysis/references/api-contracts/reddit-app-api.md +0 -2025
  362. package/skills/single-work-analysis/references/api-contracts/sora2-api.md +0 -2266
  363. package/skills/single-work-analysis/references/api-contracts/temp-mail-api.md +0 -208
  364. package/skills/single-work-analysis/references/api-contracts/threads-web-api.md +0 -897
  365. package/skills/single-work-analysis/references/api-contracts/tikhub-downloader-api.md +0 -134
  366. package/skills/single-work-analysis/references/api-contracts/tikhub-user-api.md +0 -494
  367. package/skills/single-work-analysis/references/api-contracts/tiktok-ads-api.md +0 -5947
  368. package/skills/single-work-analysis/references/api-contracts/tiktok-analytics-api.md +0 -968
  369. package/skills/single-work-analysis/references/api-contracts/tiktok-app-v3-api.md +0 -5735
  370. package/skills/single-work-analysis/references/api-contracts/tiktok-creator-api.md +0 -1951
  371. package/skills/single-work-analysis/references/api-contracts/tiktok-interaction-api.md +0 -742
  372. package/skills/single-work-analysis/references/api-contracts/tiktok-shop-web-api.md +0 -1890
  373. package/skills/single-work-analysis/references/api-contracts/tiktok-web-api.md +0 -4448
  374. package/skills/single-work-analysis/references/api-contracts/toutiao-app-api.md +0 -342
  375. package/skills/single-work-analysis/references/api-contracts/toutiao-web-api.md +0 -143
  376. package/skills/single-work-analysis/references/api-contracts/twitter-web-api.md +0 -989
  377. package/skills/single-work-analysis/references/api-contracts/wechat-channels-api.md +0 -809
  378. package/skills/single-work-analysis/references/api-contracts/wechat-media-platform-web-api.md +0 -677
  379. package/skills/single-work-analysis/references/api-contracts/weibo-app-api.md +0 -1547
  380. package/skills/single-work-analysis/references/api-contracts/weibo-web-api.md +0 -798
  381. package/skills/single-work-analysis/references/api-contracts/weibo-web-v2-api.md +0 -2459
  382. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-app-api.md +0 -1291
  383. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-app-v2-api.md +0 -1683
  384. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-web-api.md +0 -1324
  385. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-web-v2-api.md +0 -1209
  386. package/skills/single-work-analysis/references/api-contracts/xigua-app-v2-api.md +0 -489
  387. package/skills/single-work-analysis/references/api-contracts/youtube-web-api.md +0 -2636
  388. package/skills/single-work-analysis/references/api-contracts/youtube-web-v2-api.md +0 -2660
  389. package/skills/single-work-analysis/references/api-contracts/zhihu-web-api.md +0 -2315
  390. package/skills/single-work-analysis/references/api-tags/asr-api.md +0 -100
  391. package/skills/single-work-analysis/references/api-tags/bilibili-app-api.md +0 -482
  392. package/skills/single-work-analysis/references/api-tags/bilibili-web-api.md +0 -1267
  393. package/skills/single-work-analysis/references/api-tags/demo-api.md +0 -365
  394. package/skills/single-work-analysis/references/api-tags/douyin-app-v3-api.md +0 -2012
  395. package/skills/single-work-analysis/references/api-tags/douyin-billboard-api.md +0 -1428
  396. package/skills/single-work-analysis/references/api-tags/douyin-creator-api.md +0 -694
  397. package/skills/single-work-analysis/references/api-tags/douyin-creator-v2-api.md +0 -694
  398. package/skills/single-work-analysis/references/api-tags/douyin-search-api.md +0 -1059
  399. package/skills/single-work-analysis/references/api-tags/douyin-web-api.md +0 -3314
  400. package/skills/single-work-analysis/references/api-tags/douyin-xingtu-api.md +0 -935
  401. package/skills/single-work-analysis/references/api-tags/douyin-xingtu-v2-api.md +0 -925
  402. package/skills/single-work-analysis/references/api-tags/health-check.md +0 -40
  403. package/skills/single-work-analysis/references/api-tags/hybrid-parsing.md +0 -57
  404. package/skills/single-work-analysis/references/api-tags/instagram-v1-api.md +0 -1224
  405. package/skills/single-work-analysis/references/api-tags/instagram-v2-api.md +0 -1147
  406. package/skills/single-work-analysis/references/api-tags/instagram-v3-api.md +0 -1123
  407. package/skills/single-work-analysis/references/api-tags/ios-shortcut.md +0 -45
  408. package/skills/single-work-analysis/references/api-tags/kuaishou-app-api.md +0 -846
  409. package/skills/single-work-analysis/references/api-tags/kuaishou-web-api.md +0 -551
  410. package/skills/single-work-analysis/references/api-tags/lemon8-app-api.md +0 -687
  411. package/skills/single-work-analysis/references/api-tags/linkedin-web-api.md +0 -1105
  412. package/skills/single-work-analysis/references/api-tags/media-ingest-api.md +0 -112
  413. package/skills/single-work-analysis/references/api-tags/pipixia-app-api.md +0 -721
  414. package/skills/single-work-analysis/references/api-tags/reddit-app-api.md +0 -1057
  415. package/skills/single-work-analysis/references/api-tags/sora2-api.md +0 -737
  416. package/skills/single-work-analysis/references/api-tags/temp-mail-api.md +0 -136
  417. package/skills/single-work-analysis/references/api-tags/threads-web-api.md +0 -472
  418. package/skills/single-work-analysis/references/api-tags/tikhub-downloader-api.md +0 -65
  419. package/skills/single-work-analysis/references/api-tags/tikhub-user-api.md +0 -253
  420. package/skills/single-work-analysis/references/api-tags/tiktok-ads-api.md +0 -1393
  421. package/skills/single-work-analysis/references/api-tags/tiktok-analytics-api.md +0 -179
  422. package/skills/single-work-analysis/references/api-tags/tiktok-app-v3-api.md +0 -3264
  423. package/skills/single-work-analysis/references/api-tags/tiktok-creator-api.md +0 -709
  424. package/skills/single-work-analysis/references/api-tags/tiktok-interaction-api.md +0 -366
  425. package/skills/single-work-analysis/references/api-tags/tiktok-shop-web-api.md +0 -663
  426. package/skills/single-work-analysis/references/api-tags/tiktok-web-api.md +0 -2516
  427. package/skills/single-work-analysis/references/api-tags/toutiao-app-api.md +0 -220
  428. package/skills/single-work-analysis/references/api-tags/toutiao-web-api.md +0 -96
  429. package/skills/single-work-analysis/references/api-tags/twitter-web-api.md +0 -562
  430. package/skills/single-work-analysis/references/api-tags/wechat-channels-api.md +0 -405
  431. package/skills/single-work-analysis/references/api-tags/wechat-media-platform-web-api.md +0 -431
  432. package/skills/single-work-analysis/references/api-tags/weibo-app-api.md +0 -851
  433. package/skills/single-work-analysis/references/api-tags/weibo-web-api.md +0 -470
  434. package/skills/single-work-analysis/references/api-tags/weibo-web-v2-api.md +0 -1405
  435. package/skills/single-work-analysis/references/api-tags/xiaohongshu-app-api.md +0 -534
  436. package/skills/single-work-analysis/references/api-tags/xiaohongshu-app-v2-api.md +0 -934
  437. package/skills/single-work-analysis/references/api-tags/xiaohongshu-web-api.md +0 -757
  438. package/skills/single-work-analysis/references/api-tags/xiaohongshu-web-v2-api.md +0 -762
  439. package/skills/single-work-analysis/references/api-tags/xigua-app-v2-api.md +0 -308
  440. package/skills/single-work-analysis/references/api-tags/youtube-web-api.md +0 -934
  441. package/skills/single-work-analysis/references/api-tags/youtube-web-v2-api.md +0 -717
  442. package/skills/single-work-analysis/references/api-tags/zhihu-web-api.md +0 -1384
  443. package/skills/single-work-analysis/references/asr-and-fallback.md +0 -20
  444. package/skills/single-work-analysis/references/config-templates/defaults.yaml +0 -47
  445. package/skills/single-work-analysis/references/contracts/work-card-fields.md +0 -41
  446. package/skills/single-work-analysis/references/platform-guides/douyin.md +0 -47
  447. package/skills/single-work-analysis/references/platform-guides/generic.md +0 -43
  448. package/skills/single-work-analysis/references/platform-guides/xiaohongshu.md +0 -54
  449. package/skills/single-work-analysis/references/prompt-contracts/analysis-bundle.md +0 -82
  450. package/skills/single-work-analysis/references/schemas/work-card.schema.json +0 -39
  451. package/skills/single-work-analysis/references/service-guides/asr-u2-u3-fallback.md +0 -75
  452. package/skills/single-work-analysis/scripts/__init__.py +0 -0
  453. package/skills/single-work-analysis/scripts/core/__init__.py +0 -0
  454. package/skills/single-work-analysis/scripts/core/analysis_adapter.py +0 -384
  455. package/skills/single-work-analysis/scripts/core/analysis_pipeline.py +0 -456
  456. package/skills/single-work-analysis/scripts/core/bootstrap_env.py +0 -35
  457. package/skills/single-work-analysis/scripts/core/extract_pipeline.py +0 -173
  458. package/skills/single-work-analysis/scripts/core/progress_report.py +0 -258
  459. package/skills/single-work-analysis/scripts/core/storage_router.py +0 -220
  460. package/skills/single-work-analysis/scripts/pipeline/__init__.py +0 -0
  461. package/skills/single-work-analysis/scripts/pipeline/asr/__init__.py +0 -0
  462. package/skills/single-work-analysis/scripts/platform/__init__.py +0 -0
  463. package/skills/single-work-analysis/scripts/platform/douyin/__init__.py +0 -0
  464. package/skills/single-work-analysis/scripts/platform/douyin/douyin_video_type_matrix.py +0 -224
  465. package/skills/single-work-analysis/scripts/platform/douyin/select_low_quality_video_url.py +0 -200
  466. package/skills/single-work-analysis/scripts/platform/xiaohongshu/__init__.py +0 -0
  467. package/skills/single-work-analysis/scripts/writers/__init__.py +0 -0
  468. package/skills/single-work-analysis/scripts/writers/write_benchmark_card.py +0 -752
  469. /package/skills/{creator-analysis → social-media-crawl}/scripts/core/bootstrap_env.py +0 -0
  470. /package/skills/{creator-analysis → social-media-crawl}/scripts/core/extract_pipeline.py +0 -0
  471. /package/skills/{single-work-analysis → social-media-crawl}/scripts/core/tikomni_common.py +0 -0
  472. /package/skills/{creator-analysis/scripts/platform/douyin → social-media-crawl/scripts/pipelines}/douyin_video_type_matrix.py +0 -0
  473. /package/skills/{creator-analysis/scripts/author_home/collectors → social-media-crawl/scripts/pipelines}/homepage_collectors.py +0 -0
  474. /package/skills/{creator-analysis/scripts/platform/douyin → social-media-crawl/scripts/pipelines}/select_low_quality_video_url.py +0 -0
@@ -0,0 +1,237 @@
1
+ #!/usr/bin/env python3
2
+ """Douyin creator-home fixed pipeline."""
3
+
4
+ from __future__ import annotations
5
+
6
+ if __package__ in {None, ""}:
7
+ import sys
8
+ from pathlib import Path
9
+
10
+ _self = Path(__file__).resolve()
11
+ for _parent in _self.parents:
12
+ if (_parent / "scripts" / "core" / "bootstrap_env.py").is_file():
13
+ sys.path.insert(0, str(_parent))
14
+ break
15
+
16
+ import argparse
17
+ import json
18
+ from pathlib import Path
19
+ from typing import Any, Dict, List
20
+
21
+ from scripts.core.bootstrap_env import bootstrap_for_direct_run
22
+
23
+ bootstrap_for_direct_run(__file__, __package__)
24
+
25
+ from scripts.core.completeness import ensure_request_id, evaluate_collection, normalize_missing_fields
26
+ from scripts.core.config_loader import config_get, load_tikomni_config, resolve_storage_paths
27
+ from scripts.core.progress_report import build_progress_reporter
28
+ from scripts.core.storage_router import resolve_author_directory_name
29
+ from scripts.core.tikomni_common import resolve_runtime, write_json_stdout
30
+ from scripts.pipelines.douyin_creator_home_helpers import collect_and_adapt
31
+ from scripts.pipelines.home_asr import enrich_author_home_asr
32
+ from scripts.writers.write_work_fact_card import build_work_fact_card, persist_output_envelope, write_work_fact_card
33
+
34
+
35
+ def _write_collection_artifacts(
36
+ *,
37
+ profile: Dict[str, Any],
38
+ works: List[Dict[str, Any]],
39
+ card_root: str,
40
+ extract_trace: List[Dict[str, Any]],
41
+ request_id: str,
42
+ ) -> Dict[str, str]:
43
+ author_dir_name = resolve_author_directory_name(
44
+ "douyin",
45
+ str(profile.get("author_handle") or ""),
46
+ str(profile.get("platform_author_id") or ""),
47
+ )
48
+ author_dir = Path(card_root) / "内容系统" / "作品库" / author_dir_name
49
+ author_dir.mkdir(parents=True, exist_ok=True)
50
+
51
+ creator_profile = dict(profile)
52
+ creator_profile["request_id"] = request_id
53
+ creator_profile["extract_trace"] = extract_trace
54
+
55
+ work_collection = {
56
+ "platform": "douyin",
57
+ "platform_author_id": profile.get("platform_author_id"),
58
+ "count": len(works),
59
+ "items": [
60
+ {
61
+ "platform_work_id": item.get("platform_work_id"),
62
+ "title": item.get("title"),
63
+ "published_date": item.get("published_date"),
64
+ }
65
+ for item in works
66
+ if isinstance(item, dict)
67
+ ],
68
+ "request_id": request_id,
69
+ "extract_trace": extract_trace,
70
+ }
71
+
72
+ profile_path = author_dir / "_creator_profile.json"
73
+ collection_path = author_dir / "_work_collection.json"
74
+ profile_path.write_text(json.dumps(creator_profile, ensure_ascii=False, indent=2), encoding="utf-8")
75
+ collection_path.write_text(json.dumps(work_collection, ensure_ascii=False, indent=2), encoding="utf-8")
76
+ return {"creator_profile_path": str(profile_path), "work_collection_path": str(collection_path)}
77
+
78
+
79
+ def run_douyin_creator_home(
80
+ *,
81
+ input_value: str,
82
+ config: Dict[str, Any],
83
+ runtime: Dict[str, Any],
84
+ max_items: int,
85
+ write_card: bool,
86
+ persist_output: bool,
87
+ ) -> Dict[str, Any]:
88
+ progress = build_progress_reporter(
89
+ workflow="social-media-crawl",
90
+ platform="douyin",
91
+ content_kind="author_home",
92
+ input_value=input_value,
93
+ scope="workflow",
94
+ )
95
+ progress.started(stage="author_home.workflow", message="douyin author_home workflow started")
96
+
97
+ raw, profile, works, missing = collect_and_adapt(
98
+ input_value=input_value,
99
+ base_url=runtime["base_url"],
100
+ token=runtime["token"],
101
+ timeout_ms=runtime["timeout_ms"],
102
+ page_size=20,
103
+ pages_max=50,
104
+ max_items=max(1, int(max_items)),
105
+ progress=progress.child(scope="author_home.collect"),
106
+ )
107
+
108
+ asr_strategy = config_get(config, "asr_strategy", {})
109
+ asr_bundle = enrich_author_home_asr(
110
+ platform="douyin",
111
+ works=works,
112
+ base_url=runtime["base_url"],
113
+ token=runtime["token"],
114
+ timeout_ms=runtime["timeout_ms"],
115
+ poll_interval_sec=float(asr_strategy.get("poll_interval_sec", 3.0)),
116
+ max_polls=int(asr_strategy.get("max_polls", 30)),
117
+ douyin_submit_max_retries=int(config_get(config, "asr_strategy.submit_retry.douyin_video.max_retries", 2)),
118
+ douyin_submit_backoff_ms=int(config_get(config, "asr_strategy.submit_retry.douyin_video.backoff_ms", 1500)),
119
+ timeout_retry_enabled=bool(config_get(config, "asr_strategy.u2_timeout_retry.enabled", True)),
120
+ timeout_retry_max_retries=int(config_get(config, "asr_strategy.u2_timeout_retry.max_retries", 0)),
121
+ progress=progress.child(scope="author_home.asr"),
122
+ )
123
+ works = list(asr_bundle.get("works") or [])
124
+
125
+ card_root = resolve_storage_paths(config)["card_root"]
126
+ card_results: List[Dict[str, Any]] = []
127
+ if write_card:
128
+ for work in works:
129
+ card_results.append(
130
+ write_work_fact_card(
131
+ payload=work,
132
+ platform="douyin",
133
+ card_root=card_root,
134
+ storage_config=config,
135
+ )
136
+ )
137
+
138
+ request_id = ensure_request_id(
139
+ raw.get("request_id") or profile.get("request_id"),
140
+ fallback_seed=input_value,
141
+ )
142
+ extract_trace = list(raw.get("extract_trace") or []) + list(asr_bundle.get("trace") or [])
143
+
144
+ collection_artifacts = _write_collection_artifacts(
145
+ profile=profile,
146
+ works=works,
147
+ card_root=card_root,
148
+ extract_trace=extract_trace,
149
+ request_id=request_id,
150
+ )
151
+
152
+ normalized_profile = dict(profile)
153
+ normalized_profile["request_id"] = request_id
154
+ normalized_profile["extract_trace"] = extract_trace
155
+
156
+ normalized_works = [build_work_fact_card(work, platform="douyin") for work in works]
157
+ envelope = {
158
+ "object_type": "creator",
159
+ "platform": "douyin",
160
+ "input": input_value,
161
+ "normalized": {
162
+ "creator_profile": normalized_profile,
163
+ "work_collection": {
164
+ "platform": "douyin",
165
+ "platform_author_id": profile.get("platform_author_id"),
166
+ "count": len(normalized_works),
167
+ "items": normalized_works,
168
+ "request_id": request_id,
169
+ "extract_trace": extract_trace,
170
+ },
171
+ },
172
+ "completeness": evaluate_collection(profile, normalized_works),
173
+ "missing_fields": normalize_missing_fields(missing),
174
+ "error_reason": None,
175
+ "extract_trace": extract_trace,
176
+ "request_id": request_id,
177
+ "card_write": {
178
+ "enabled": bool(write_card),
179
+ "ok": all(item.get("ok") for item in card_results) if card_results else False,
180
+ "count": len(card_results),
181
+ "results": card_results,
182
+ },
183
+ "collection_artifacts": collection_artifacts,
184
+ }
185
+ envelope["output_persist"] = persist_output_envelope(
186
+ envelope=envelope,
187
+ storage_config=config,
188
+ platform="douyin",
189
+ fallback_identifier=str(profile.get("platform_author_id") or "author-home"),
190
+ ) if persist_output else {"enabled": False, "skipped": True, "reason": "disabled_by_flag"}
191
+
192
+ progress.done(
193
+ stage="author_home.workflow",
194
+ message="douyin author_home workflow finished",
195
+ data={"request_id": request_id, "works_count": len(normalized_works)},
196
+ )
197
+ return envelope
198
+
199
+
200
+ def main() -> None:
201
+ parser = argparse.ArgumentParser(description="Run Douyin creator-home fixed pipeline")
202
+ parser.add_argument("input", help="Douyin creator homepage or share URL")
203
+ parser.add_argument("--config", default=None, help="Runtime config YAML path")
204
+ parser.add_argument("--env-file", default=None, help="Explicit .env path")
205
+ parser.add_argument("--allow-process-env", action="store_true", help="Allow process env overrides")
206
+ parser.add_argument("--base-url", default=None, help="Override Tikomni base URL")
207
+ parser.add_argument("--timeout-ms", type=int, default=None, help="Override timeout in ms")
208
+ parser.add_argument("--max-items", type=int, default=5, help="Max works to collect from homepage")
209
+ parser.set_defaults(write_card=True, persist_output=True)
210
+ parser.add_argument("--write-card", dest="write_card", action="store_true", help="Write work fact cards")
211
+ parser.add_argument("--no-write-card", dest="write_card", action="store_false", help="Skip card writing")
212
+ parser.add_argument("--persist-output", dest="persist_output", action="store_true", help="Persist output JSON")
213
+ parser.add_argument("--no-persist-output", dest="persist_output", action="store_false", help="Skip output JSON persist")
214
+ args = parser.parse_args()
215
+
216
+ config, _ = load_tikomni_config(args.config, env_file=args.env_file, allow_process_env=args.allow_process_env)
217
+ runtime = resolve_runtime(
218
+ env_file=args.env_file,
219
+ api_key_env=str(config_get(config, "runtime.auth_env_key", "TIKOMNI_API_KEY")),
220
+ base_url=args.base_url or config_get(config, "runtime.base_url", None),
221
+ timeout_ms=args.timeout_ms or config_get(config, "runtime.timeout_ms", None),
222
+ allow_process_env=args.allow_process_env,
223
+ )
224
+ write_json_stdout(
225
+ run_douyin_creator_home(
226
+ input_value=args.input,
227
+ config=config,
228
+ runtime=runtime,
229
+ max_items=int(args.max_items),
230
+ write_card=bool(args.write_card),
231
+ persist_output=bool(args.persist_output),
232
+ )
233
+ )
234
+
235
+
236
+ if __name__ == "__main__":
237
+ main()
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env python3
2
- """Douyin single-video low-quality runner (APP first, WEB fallback)."""
2
+ """Douyin single-work fixed pipeline runner (APP first, WEB fallback)."""
3
3
 
4
4
  from __future__ import annotations
5
5
 
@@ -27,14 +27,12 @@ from datetime import datetime
27
27
  from pathlib import Path
28
28
  from typing import Any, Dict, List, Optional
29
29
 
30
- from scripts.core.config_loader import config_get, load_tikomni_config, resolve_storage_paths
30
+ from scripts.core.config_loader import config_get, load_tikomni_config
31
31
  from scripts.core.extract_pipeline import resolve_trace_error_context
32
32
  from scripts.core.progress_report import ProgressReporter, build_progress_reporter
33
- from scripts.core.storage_router import render_output_filename, resolve_json_filename_pattern
34
- from scripts.platform.douyin.douyin_video_type_matrix import normalize_douyin_video_type
35
- from scripts.pipeline.asr.asr_pipeline import derive_asr_clean_text, submit_u2_asr_with_retry
36
- from scripts.pipeline.asr.poll_u2_task import poll_u2_task
37
- from scripts.platform.douyin.select_low_quality_video_url import select_low_quality_video_url
33
+ from scripts.pipelines.douyin_video_type_matrix import normalize_douyin_video_type
34
+ from scripts.core.asr_pipeline import derive_asr_clean_text, run_u2_asr_with_timeout_retry
35
+ from scripts.pipelines.select_low_quality_video_url import select_low_quality_video_url
38
36
  from scripts.core.tikomni_common import (
39
37
  call_json_api,
40
38
  deep_find_all,
@@ -43,7 +41,11 @@ from scripts.core.tikomni_common import (
43
41
  summarize_content,
44
42
  write_json_stdout,
45
43
  )
46
- from scripts.writers.write_benchmark_card import write_benchmark_card
44
+ from scripts.writers.write_work_fact_card import (
45
+ build_work_output_envelope,
46
+ persist_output_envelope,
47
+ write_work_fact_card,
48
+ )
47
49
 
48
50
  APP_ENDPOINT = "/api/u1/v1/douyin/app/v3/fetch_one_video_by_share_url"
49
51
  WEB_ENDPOINT = "/api/u1/v1/douyin/web/fetch_one_video_by_share_url"
@@ -128,109 +130,6 @@ def _report_u2_progress(progress: Optional[ProgressReporter], *, stage: str, eve
128
130
  progress.progress(stage=stage, message=message, data=payload)
129
131
 
130
132
 
131
- def _build_persist_payload(
132
- *,
133
- result: Dict[str, Any],
134
- source_input: Dict[str, Optional[str]],
135
- platform_work_id: Optional[str],
136
- status: str,
137
- written_at: datetime,
138
- ) -> Dict[str, Any]:
139
- summary = {
140
- "summary": result.get("summary", ""),
141
- "insights": result.get("insights", []),
142
- "confidence": result.get("confidence"),
143
- "error_reason": result.get("error_reason"),
144
- }
145
- normalized = {
146
- "platform": result.get("platform", "douyin"),
147
- "content_kind": result.get("content_kind", "single_video"),
148
- "platform_work_id": result.get("platform_work_id"),
149
- "title": result.get("title"),
150
- "duration_ms": result.get("duration_ms"),
151
- "is_video": result.get("is_video"),
152
- "u2_task_id": result.get("u2_task_id"),
153
- "u2_task_status": result.get("u2_task_status"),
154
- "request_id": result.get("request_id"),
155
- "source": source_input,
156
- }
157
- return {
158
- "meta": {
159
- "written_at": written_at.isoformat(timespec="seconds"),
160
- "status": status,
161
- "platform": "douyin",
162
- "identifier": _traceable_identifier(source_input, platform_work_id),
163
- },
164
- "summary": summary,
165
- "normalized": normalized,
166
- "raw": result,
167
- }
168
-
169
-
170
- def _persist_output_artifact(
171
- *,
172
- result: Dict[str, Any],
173
- source_input: Dict[str, Optional[str]],
174
- platform_work_id: Optional[str],
175
- storage_config: Optional[Dict[str, Any]],
176
- persist_output: bool,
177
- ) -> Dict[str, Any]:
178
- if not persist_output:
179
- return {"enabled": False, "skipped": True, "reason": "disabled_by_flag"}
180
-
181
- try:
182
- paths = resolve_storage_paths(storage_config or {})
183
- except Exception as error:
184
- return {"enabled": True, "ok": False, "error": f"resolve_storage_paths_failed:{error}"}
185
-
186
- now = datetime.now()
187
- date_key = now.strftime("%Y%m%d")
188
- timestamp = now.strftime("%Y%m%dT%H%M%S")
189
- identifier = _traceable_identifier(source_input, platform_work_id)
190
- has_error = bool(result.get("error_reason"))
191
- status = "error" if has_error else "success"
192
-
193
- if has_error:
194
- target_dir = Path(paths.get("errors_root", "")) / date_key
195
- else:
196
- target_dir = Path(paths.get("results_root", "")) / date_key
197
-
198
- target_dir.mkdir(parents=True, exist_ok=True)
199
- file_name = render_output_filename(
200
- pattern=resolve_json_filename_pattern(storage_config),
201
- context={
202
- "prefix": status,
203
- "platform": "douyin",
204
- "card_type": "single_work_result",
205
- "author_slug": identifier,
206
- "title_slug": identifier,
207
- "identifier": identifier,
208
- "timestamp": timestamp,
209
- "date": date_key,
210
- "ext": ".json",
211
- },
212
- default_filename=f"{timestamp}-douyin-{identifier}.json",
213
- default_ext=".json",
214
- )
215
- file_path = target_dir / file_name
216
-
217
- payload = _build_persist_payload(
218
- result=result,
219
- source_input=source_input,
220
- platform_work_id=platform_work_id,
221
- status=status,
222
- written_at=now,
223
- )
224
- file_path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
225
-
226
- return {
227
- "enabled": True,
228
- "ok": True,
229
- "status": status,
230
- "path": str(file_path),
231
- }
232
-
233
-
234
133
  def _finalize_result(
235
134
  *,
236
135
  result: Dict[str, Any],
@@ -239,14 +138,19 @@ def _finalize_result(
239
138
  storage_config: Optional[Dict[str, Any]],
240
139
  persist_output: bool,
241
140
  ) -> Dict[str, Any]:
242
- result["output_persist"] = _persist_output_artifact(
243
- result=result,
244
- source_input=source_input,
245
- platform_work_id=platform_work_id,
141
+ envelope = build_work_output_envelope(result, platform="douyin")
142
+ if "card_write" in result:
143
+ envelope["card_write"] = result.get("card_write")
144
+ if not persist_output:
145
+ envelope["output_persist"] = {"enabled": False, "skipped": True, "reason": "disabled_by_flag"}
146
+ return envelope
147
+ envelope["output_persist"] = persist_output_envelope(
148
+ envelope=envelope,
246
149
  storage_config=storage_config,
247
- persist_output=persist_output,
150
+ platform="douyin",
151
+ fallback_identifier=platform_work_id or _traceable_identifier(source_input, platform_work_id),
248
152
  )
249
- return result
153
+ return envelope
250
154
 
251
155
  def _normalize_input(
252
156
  input_value: Optional[str],
@@ -872,7 +776,7 @@ def run_douyin_single_video(
872
776
  )
873
777
  if write_card:
874
778
  card_started_at = time.perf_counter()
875
- result["card_write"] = write_benchmark_card(
779
+ result["card_write"] = write_work_fact_card(
876
780
  payload=result,
877
781
  platform="douyin",
878
782
  card_type=card_type,
@@ -982,7 +886,7 @@ def run_douyin_single_video(
982
886
  )
983
887
  if write_card:
984
888
  card_started_at = time.perf_counter()
985
- result["card_write"] = write_benchmark_card(
889
+ result["card_write"] = write_work_fact_card(
986
890
  payload=result,
987
891
  platform="douyin",
988
892
  card_type=card_type,
@@ -1038,7 +942,7 @@ def run_douyin_single_video(
1038
942
  )
1039
943
  if write_card:
1040
944
  card_started_at = time.perf_counter()
1041
- result["card_write"] = write_benchmark_card(
945
+ result["card_write"] = write_work_fact_card(
1042
946
  payload=result,
1043
947
  platform="douyin",
1044
948
  card_type=card_type,
@@ -1143,20 +1047,23 @@ def run_douyin_single_video(
1143
1047
  data={"video_down_url_present": True, "timeout_ms": u2_timeout_ms},
1144
1048
  )
1145
1049
  submit_started_at = time.perf_counter()
1146
- submit_bundle = submit_u2_asr_with_retry(
1050
+ submit_bundle = run_u2_asr_with_timeout_retry(
1147
1051
  base_url=runtime["base_url"],
1148
1052
  token=runtime["token"],
1149
1053
  timeout_ms=u2_timeout_ms,
1150
1054
  video_url=video_down_url,
1151
- max_retries=u2_submit_max_retries,
1152
- backoff_ms=u2_submit_backoff_ms,
1055
+ submit_max_retries=u2_submit_max_retries,
1056
+ submit_backoff_ms=u2_submit_backoff_ms,
1057
+ poll_interval_sec=poll_interval_sec,
1058
+ max_polls=max_polls,
1059
+ pending_timeout_sec=int(config_get(storage_config or {}, "runtime.u2_pending_timeout_sec", 60) or 60),
1153
1060
  progress_callback=(
1154
1061
  lambda event: _report_u2_progress(progress, stage="single_video.u2", event=event, label="douyin")
1155
1062
  ) if progress is not None else None,
1156
1063
  )
1157
- timings["u2_submit_ms"] = _elapsed_ms(submit_started_at)
1158
- submit_response = submit_bundle["submit_response"]
1159
- u2_task_id = submit_bundle.get("task_id")
1064
+ timings["u2_submit_ms"] = _safe_int(submit_bundle.get("submit_duration_ms")) or _elapsed_ms(submit_started_at)
1065
+ submit_response = (submit_bundle.get("submit_bundle") or {}).get("submit_response", {})
1066
+ u2_task_id = (submit_bundle.get("submit_bundle") or {}).get("task_id")
1160
1067
  if progress is not None:
1161
1068
  progress.http_event(
1162
1069
  stage="single_video.u2",
@@ -1165,8 +1072,8 @@ def run_douyin_single_video(
1165
1072
  route_label="u2_submit",
1166
1073
  summary={
1167
1074
  "task_id": u2_task_id,
1168
- "final_submit_status": submit_bundle.get("final_submit_status"),
1169
- "retry_count": len(submit_bundle.get("retry_chain", [])),
1075
+ "final_submit_status": (submit_bundle.get("submit_bundle") or {}).get("final_submit_status"),
1076
+ "retry_count": len(((submit_bundle.get("submit_bundle") or {}).get("retry_chain") or [])),
1170
1077
  },
1171
1078
  )
1172
1079
 
@@ -1178,7 +1085,7 @@ def run_douyin_single_video(
1178
1085
  extra={
1179
1086
  "task_id": u2_task_id,
1180
1087
  "video_down_url": video_down_url,
1181
- "final_submit_status": submit_bundle.get("final_submit_status"),
1088
+ "final_submit_status": (submit_bundle.get("submit_bundle") or {}).get("final_submit_status"),
1182
1089
  },
1183
1090
  )
1184
1091
  )
@@ -1191,7 +1098,7 @@ def run_douyin_single_video(
1191
1098
  "u2_submit_max_retries": max(0, int(u2_submit_max_retries)),
1192
1099
  "u2_submit_backoff_ms": max(0, int(u2_submit_backoff_ms)),
1193
1100
  },
1194
- "attempts": submit_bundle.get("retry_chain", []),
1101
+ "attempts": ((submit_bundle.get("submit_bundle") or {}).get("retry_chain") or []),
1195
1102
  }
1196
1103
  )
1197
1104
 
@@ -1205,21 +1112,8 @@ def run_douyin_single_video(
1205
1112
  error_reason = submit_response.get("error_reason") or "u2_submit_failed_or_missing_task_id"
1206
1113
  u2_task_status = "UNKNOWN"
1207
1114
  else:
1208
- if progress is not None:
1209
- progress.progress(stage="single_video.u2", message="polling douyin u2 task", data={"task_id": u2_task_id})
1210
- poll_started_at = time.perf_counter()
1211
- poll_result = poll_u2_task(
1212
- base_url=runtime["base_url"],
1213
- token=runtime["token"],
1214
- timeout_ms=u2_timeout_ms,
1215
- task_id=u2_task_id,
1216
- poll_interval_sec=poll_interval_sec,
1217
- max_polls=max_polls,
1218
- progress_callback=(
1219
- lambda event: _report_u2_progress(progress, stage="single_video.u2", event=event, label="douyin")
1220
- ) if progress is not None else None,
1221
- )
1222
- timings["u2_poll_ms"] = _elapsed_ms(poll_started_at)
1115
+ poll_result = submit_bundle.get("poll_result", {})
1116
+ timings["u2_poll_ms"] = _safe_int(submit_bundle.get("poll_duration_ms"))
1223
1117
  u2_task_status = poll_result.get("task_status") or "UNKNOWN"
1224
1118
  raw_content = poll_result.get("transcript_text", "") if poll_result.get("ok") else ""
1225
1119
  error_reason = poll_result.get("error_reason")
@@ -1234,8 +1128,22 @@ def run_douyin_single_video(
1234
1128
  "request_id": poll_result.get("request_id"),
1235
1129
  "error_reason": poll_result.get("error_reason"),
1236
1130
  "attempts": len(poll_result.get("trace", [])),
1131
+ "timeout_retry": submit_bundle.get("timeout_retry", {}),
1132
+ "u3_fallback": submit_bundle.get("u3_fallback", {}),
1237
1133
  }
1238
1134
  )
1135
+ if submit_bundle.get("u3_fallback", {}).get("triggered"):
1136
+ trace.append(
1137
+ {
1138
+ "step": "u3_fallback",
1139
+ "triggered": True,
1140
+ "ok": submit_bundle.get("u3_fallback", {}).get("ok"),
1141
+ "result": submit_bundle.get("u3_fallback", {}).get("result"),
1142
+ "public_url": submit_bundle.get("u3_fallback", {}).get("public_url"),
1143
+ "error_reason": submit_bundle.get("u3_fallback", {}).get("error_reason"),
1144
+ "trace": submit_bundle.get("u3_fallback", {}).get("trace", []),
1145
+ }
1146
+ )
1239
1147
  if progress is not None:
1240
1148
  (progress.done if poll_result.get("ok") else progress.failed)(
1241
1149
  stage="single_video.u2",
@@ -1292,7 +1200,7 @@ def run_douyin_single_video(
1292
1200
  if progress is not None:
1293
1201
  progress.progress(stage="single_video.card_write", message="writing douyin single_video card")
1294
1202
  card_started_at = time.perf_counter()
1295
- result["card_write"] = write_benchmark_card(
1203
+ result["card_write"] = write_work_fact_card(
1296
1204
  payload=result,
1297
1205
  platform="douyin",
1298
1206
  card_type=card_type,
@@ -1332,7 +1240,7 @@ def run_douyin_single_video(
1332
1240
 
1333
1241
 
1334
1242
  def main() -> None:
1335
- parser = argparse.ArgumentParser(description="Run Douyin single-video low-quality extraction")
1243
+ parser = argparse.ArgumentParser(description="Run Douyin single-work fixed pipeline")
1336
1244
  parser.add_argument("input", nargs="?", default=None, help="Douyin share URL")
1337
1245
  parser.add_argument("--share-url", default=None, help="Douyin share URL")
1338
1246
  parser.add_argument("--config", default=None, help="Runtime config YAML path")
@@ -1359,7 +1267,8 @@ def main() -> None:
1359
1267
  )
1360
1268
  parser.add_argument("--card-type", choices=["work"], default="work", help="Primary card type")
1361
1269
  parser.add_argument("--content-kind", default="single_video", help="Routing kind, e.g. single_video/work")
1362
- parser.add_argument("--analysis-mode", choices=["auto", "local"], default="auto", help="Card analysis mode")
1270
+ parser.add_argument("--card-mode", dest="analysis_mode", choices=["standard", "auto", "local"], default="standard", help="Fact-card mode")
1271
+ parser.add_argument("--analysis-mode", dest="analysis_mode", choices=["standard", "auto", "local"], help=argparse.SUPPRESS)
1363
1272
  parser.set_defaults(write_card=True, persist_output=True)
1364
1273
  parser.add_argument("--write-card", dest="write_card", action="store_true", help="Write final work card")
1365
1274
  parser.add_argument("--no-write-card", dest="write_card", action="store_false", help="Skip card writing")
@@ -1379,7 +1288,7 @@ def main() -> None:
1379
1288
  timeout_ms = args.timeout_ms if args.timeout_ms is not None else config_get(config, "runtime.timeout_ms", None)
1380
1289
 
1381
1290
  progress = build_progress_reporter(
1382
- workflow="single-work-analysis",
1291
+ workflow="social-media-crawl",
1383
1292
  platform="douyin",
1384
1293
  content_kind=args.content_kind,
1385
1294
  input_value=args.share_url or args.input,