argo-search 1.0.1 → 2.9.8

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 (472) hide show
  1. package/LICENSE +201 -21
  2. package/README.en.md +735 -0
  3. package/README.es.md +777 -0
  4. package/README.ja.md +777 -0
  5. package/README.ko.md +777 -0
  6. package/README.md +778 -320
  7. package/SKILL.md +135 -0
  8. package/assets/readme/hero.svg +121 -0
  9. package/assets/readme/made-with-beautify.svg +10 -0
  10. package/assets/readme/proof-routes.svg +73 -0
  11. package/assets/readme/why-better.svg +104 -0
  12. package/assets/readme/workflow.svg +83 -0
  13. package/backends/domain_profiles.json +2356 -96
  14. package/backends/engine_registry.yaml +3428 -503
  15. package/backends/query_synonyms_cn.json +35 -0
  16. package/backends/quota_profiles.json +2488 -160
  17. package/backends/source_types_cn.json +109 -0
  18. package/backends/text_lexicon.json +44 -0
  19. package/bin/argo +772 -0
  20. package/bin/argo.js +102 -39
  21. package/config.yaml +5139 -367
  22. package/cordis.patch.yml +21 -0
  23. package/data/countries.json +40 -0
  24. package/data/lang_matrix/lang_capability.json +842 -0
  25. package/data/lang_matrix/matrix_2026-09-10.json +11921 -0
  26. package/data/regions_cn.json +1 -0
  27. package/docs/ADDING_NEW_ENGINE.md +184 -0
  28. package/docs/ARGO_INTRO.md +124 -0
  29. package/docs/DATA_SOURCE_GAPS.md +81 -0
  30. package/docs/DESIGN_LOCAL_DATA_FUSION.md +90 -0
  31. package/docs/ENGINE_CATALOG.md +575 -0
  32. package/docs/MCP_SETUP.md +108 -0
  33. package/docs/PLATFORM_PATHS.md +111 -0
  34. package/docs/RELEASE_NOTES_v2.8.0.md +71 -0
  35. package/docs/RELEASE_NOTES_v2.8.2.md +63 -0
  36. package/docs/RELEASE_NOTES_v2.8.3.md +55 -0
  37. package/docs/RELEASE_NOTES_v2.8.4.md +79 -0
  38. package/docs/RELEASE_NOTES_v2.8.5.md +102 -0
  39. package/docs/RELEASE_NOTES_v2.8.6.md +66 -0
  40. package/docs/RELEASE_NOTES_v2.8.7.md +65 -0
  41. package/docs/RELEASE_NOTES_v2.8.8.md +67 -0
  42. package/docs/RELEASE_NOTES_v2.8.9.md +67 -0
  43. package/docs/RELEASE_NOTES_v2.9.0.md +64 -0
  44. package/docs/RELEASE_NOTES_v2.9.8.md +73 -0
  45. package/docs/SEARCH_ARCHIVE.md +115 -0
  46. package/docs/assets/architecture.svg +104 -0
  47. package/docs/assets/hero.svg +98 -0
  48. package/docs/engines/bangumi.md +27 -0
  49. package/docs/engines/biorxiv.md +27 -0
  50. package/docs/engines/clawhub.md +27 -0
  51. package/docs/engines/crt_sh.md +27 -0
  52. package/docs/engines/datacite.md +27 -0
  53. package/docs/engines/deps_dev.md +27 -0
  54. package/docs/engines/douban_movie.md +27 -0
  55. package/docs/engines/endoflife.md +27 -0
  56. package/docs/engines/flk_law.md +27 -0
  57. package/docs/engines/fxtwitter.md +27 -0
  58. package/docs/engines/google_news.md +27 -0
  59. package/docs/engines/gov_regulations.md +27 -0
  60. package/docs/engines/guqian.md +27 -0
  61. package/docs/engines/hackernews.md +27 -0
  62. package/docs/engines/iplant.md +27 -0
  63. package/docs/engines/keenable.md +27 -0
  64. package/docs/engines/met_museum.md +27 -0
  65. package/docs/engines/nasa_images.md +27 -0
  66. package/docs/engines/netease_music.md +27 -0
  67. package/docs/engines/npm.md +27 -0
  68. package/docs/engines/nvd.md +27 -0
  69. package/docs/engines/openreview.md +27 -0
  70. package/docs/engines/openstd.md +27 -0
  71. package/docs/engines/parallel_free.md +27 -0
  72. package/docs/engines/people_daily.md +27 -0
  73. package/docs/engines/realtime_index.md +27 -0
  74. package/docs/engines/sec_edgar.md +27 -0
  75. package/docs/engines/seltz.md +27 -0
  76. package/docs/engines/skillsmp.md +27 -0
  77. package/docs/engines/sspai.md +27 -0
  78. package/docs/engines/std_samr.md +27 -0
  79. package/docs/engines/train.md +27 -0
  80. package/docs/engines/un_comtrade.md +27 -0
  81. package/docs/engines/wikisource.md +27 -0
  82. package/docs/engines/zdic.md +27 -0
  83. package/docs/engines/zenodo.md +27 -0
  84. package/docs/engines/zhihu_hot_app.md +27 -0
  85. package/docs//344/270/272/344/273/200/344/271/210/351/200/211/346/213/251argo.md +176 -0
  86. package/engines/README.md +10 -0
  87. package/engines/_template_cli.yaml +39 -0
  88. package/engines/_template_http.yaml +37 -0
  89. package/engines/plugins/_template_plugin.py +50 -0
  90. package/engines/specs/_cisa_kev.yaml +54 -0
  91. package/engines/specs/_osv.yaml +63 -0
  92. package/engines/specs/aljazeera.yaml +43 -0
  93. package/engines/specs/antara.yaml +43 -0
  94. package/engines/specs/artic.yaml +20 -0
  95. package/engines/specs/aviation_weather.yaml +39 -0
  96. package/engines/specs/bangumi.yaml +21 -0
  97. package/engines/specs/biorxiv.yaml +24 -0
  98. package/engines/specs/carbon_intensity.yaml +32 -0
  99. package/engines/specs/cfets.yaml +41 -0
  100. package/engines/specs/cinii.yaml +44 -0
  101. package/engines/specs/clawhub.yaml +49 -0
  102. package/engines/specs/cleveland.yaml +19 -0
  103. package/engines/specs/cn_ai_news.yaml +43 -0
  104. package/engines/specs/core.yaml +35 -0
  105. package/engines/specs/crt_sh.yaml +38 -0
  106. package/engines/specs/ct24.yaml +43 -0
  107. package/engines/specs/datacite.yaml +27 -0
  108. package/engines/specs/datagov_uk.yaml +41 -0
  109. package/engines/specs/ddgs_images.yaml +45 -0
  110. package/engines/specs/deepseek_search.yaml +74 -0
  111. package/engines/specs/deezer.yaml +20 -0
  112. package/engines/specs/defillama.yaml +38 -0
  113. package/engines/specs/deps_dev.yaml +21 -0
  114. package/engines/specs/digup.yaml +36 -0
  115. package/engines/specs/doi.yaml +39 -0
  116. package/engines/specs/douban_movie.yaml +22 -0
  117. package/engines/specs/dw_news.yaml +47 -0
  118. package/engines/specs/egov_law.yaml +21 -0
  119. package/engines/specs/elpais.yaml +43 -0
  120. package/engines/specs/endoflife.yaml +21 -0
  121. package/engines/specs/energy_charts.yaml +21 -0
  122. package/engines/specs/factcheck_org.yaml +52 -0
  123. package/engines/specs/faz.yaml +43 -0
  124. package/engines/specs/federal_register.yaml +57 -0
  125. package/engines/specs/firecrawl.yaml +53 -0
  126. package/engines/specs/flk_law.yaml +24 -0
  127. package/engines/specs/folha.yaml +43 -0
  128. package/engines/specs/france24.yaml +44 -0
  129. package/engines/specs/full_fact.yaml +47 -0
  130. package/engines/specs/fxtwitter.yaml +36 -0
  131. package/engines/specs/gbfs_nyc.yaml +32 -0
  132. package/engines/specs/gdacs.yaml +21 -0
  133. package/engines/specs/gdelt.yaml +64 -0
  134. package/engines/specs/gleif.yaml +55 -0
  135. package/engines/specs/google_news.yaml +22 -0
  136. package/engines/specs/gov_regulations.yaml +38 -0
  137. package/engines/specs/guardian_rss.yaml +59 -0
  138. package/engines/specs/hkex.yaml +40 -0
  139. package/engines/specs/hurriyet.yaml +43 -0
  140. package/engines/specs/iplant.yaml +25 -0
  141. package/engines/specs/jikan.yaml +24 -0
  142. package/engines/specs/jolpica.yaml +20 -0
  143. package/engines/specs/k10plus.yaml +20 -0
  144. package/engines/specs/keenable.yaml +44 -0
  145. package/engines/specs/keenable_free.yaml +36 -0
  146. package/engines/specs/lefigaro.yaml +43 -0
  147. package/engines/specs/listenbrainz.yaml +19 -0
  148. package/engines/specs/matichon.yaml +43 -0
  149. package/engines/specs/met_museum.yaml +21 -0
  150. package/engines/specs/nasa_images.yaml +45 -0
  151. package/engines/specs/netease_music.yaml +38 -0
  152. package/engines/specs/nhk.yaml +43 -0
  153. package/engines/specs/nhtsa_vpic.yaml +20 -0
  154. package/engines/specs/noaa_swpc.yaml +20 -0
  155. package/engines/specs/nvd.yaml +38 -0
  156. package/engines/specs/obis.yaml +20 -0
  157. package/engines/specs/opencitations.yaml +52 -0
  158. package/engines/specs/openf1.yaml +21 -0
  159. package/engines/specs/openfoodfacts.yaml +45 -0
  160. package/engines/specs/openligadb.yaml +20 -0
  161. package/engines/specs/openreview.yaml +37 -0
  162. package/engines/specs/openstd.yaml +21 -0
  163. package/engines/specs/people_daily.yaml +22 -0
  164. package/engines/specs/realtime_index.yaml +34 -0
  165. package/engines/specs/ror.yaml +20 -0
  166. package/engines/specs/satnogs.yaml +20 -0
  167. package/engines/specs/sec_edgar.yaml +46 -0
  168. package/engines/specs/shfe.yaml +39 -0
  169. package/engines/specs/skillsmp.yaml +50 -0
  170. package/engines/specs/sogou_weixin_browser.yaml +30 -0
  171. package/engines/specs/soilgrids.yaml +25 -0
  172. package/engines/specs/sspai.yaml +36 -0
  173. package/engines/specs/stackexchange.yaml +46 -0
  174. package/engines/specs/std_samr.yaml +21 -0
  175. package/engines/specs/tass.yaml +43 -0
  176. package/engines/specs/tavily_free.yaml +56 -0
  177. package/engines/specs/tle_mirror.yaml +21 -0
  178. package/engines/specs/train.yaml +37 -0
  179. package/engines/specs/tvmaze.yaml +20 -0
  180. package/engines/specs/twitter_syndication.yaml +31 -0
  181. package/engines/specs/un_comtrade.yaml +23 -0
  182. package/engines/specs/unpaywall.yaml +54 -0
  183. package/engines/specs/vnpress.yaml +43 -0
  184. package/engines/specs/weather.yaml +32 -0
  185. package/engines/specs/who_don.yaml +21 -0
  186. package/engines/specs/who_gho.yaml +20 -0
  187. package/engines/specs/wikimedia_commons.yaml +34 -0
  188. package/engines/specs/wikisource.yaml +22 -0
  189. package/engines/specs/worms.yaml +19 -0
  190. package/engines/specs/x_trending.yaml +34 -0
  191. package/engines/specs/yna.yaml +43 -0
  192. package/engines/specs/ynet.yaml +43 -0
  193. package/engines/specs/yuanbao.yaml +93 -0
  194. package/engines/specs/zbmath.yaml +40 -0
  195. package/engines/specs/zdic.yaml +22 -0
  196. package/engines/specs/zenodo.yaml +27 -0
  197. package/engines/specs/zhihu_hot_app.yaml +35 -0
  198. package/mcp/clients.yaml +106 -0
  199. package/package.json +55 -12
  200. package/packages/dsh-plugin/README.md +152 -0
  201. package/packages/dsh-plugin/cordis.patch.yml +48 -0
  202. package/packages/dsh-plugin/dsh/client.js +1533 -0
  203. package/packages/dsh-plugin/dsh/diagnostics.js +54 -0
  204. package/packages/dsh-plugin/dsh/index.js +527 -0
  205. package/packages/dsh-plugin/dsh/native-tools.mjs +749 -0
  206. package/packages/dsh-plugin/dsh/runner.js +666 -0
  207. package/packages/dsh-plugin/dsh/wide-research.js +878 -0
  208. package/packages/dsh-plugin/package.json +38 -0
  209. package/packages/dsh-plugin/scripts/sync-local.sh +70 -0
  210. package/packages/dsh-plugin/test/client.test.js +406 -0
  211. package/packages/dsh-plugin/test/config.test.js +30 -0
  212. package/packages/dsh-plugin/test/diagnostics.test.js +28 -0
  213. package/packages/dsh-plugin/test/index.test.js +1382 -0
  214. package/references/query-templates.md +96 -0
  215. package/references/query-templates.yaml +118 -0
  216. package/scripts/ab_eval.py +219 -0
  217. package/scripts/ab_eval_p0p1.py +266 -0
  218. package/scripts/adaptive.py +294 -70
  219. package/scripts/answer.py +154 -0
  220. package/scripts/archive_run.py +591 -0
  221. package/scripts/argo_engine_registry.py +172 -0
  222. package/scripts/argo_paths.py +728 -0
  223. package/scripts/article.py +136 -0
  224. package/scripts/article_meta.py +131 -0
  225. package/scripts/arxiv_source.py +201 -0
  226. package/scripts/badcase_ledger.py +252 -0
  227. package/scripts/batch_probe.py +241 -0
  228. package/scripts/benchmark.py +19 -0
  229. package/scripts/bounded_run.py +144 -0
  230. package/scripts/browser_auth.py +323 -0
  231. package/scripts/budget.py +247 -0
  232. package/scripts/budget_cli.py +93 -0
  233. package/scripts/build_release_assets.sh +65 -0
  234. package/scripts/burstiness_detector.py +147 -0
  235. package/scripts/cache.py +1066 -67
  236. package/scripts/cache_guard.py +271 -0
  237. package/scripts/cache_key_vdom.py +56 -0
  238. package/scripts/cache_similarity.py +170 -0
  239. package/scripts/caliber_isolation.py +195 -0
  240. package/scripts/calibrate_lowquality.py +210 -0
  241. package/scripts/candidate_envelope.py +366 -0
  242. package/scripts/chrome_cdp.py +871 -0
  243. package/scripts/ci_drift_gate.py +90 -0
  244. package/scripts/circuit_breaker.py +389 -0
  245. package/scripts/citations.py +334 -0
  246. package/scripts/cite_cli.py +59 -0
  247. package/scripts/cjk_tokens.py +95 -0
  248. package/scripts/clarify.py +47 -24
  249. package/scripts/cli_io.py +240 -0
  250. package/scripts/config.py +683 -45
  251. package/scripts/config_cache.py +402 -0
  252. package/scripts/conn_pool.py +220 -0
  253. package/scripts/content_boundary.py +46 -0
  254. package/scripts/content_security.py +685 -0
  255. package/scripts/content_signals.py +751 -0
  256. package/scripts/crawl.py +74 -35
  257. package/scripts/cross_lingual_trace.py +293 -0
  258. package/scripts/daemon.py +866 -0
  259. package/scripts/digup_bridge.py +214 -0
  260. package/scripts/dispatch_result.py +98 -0
  261. package/scripts/engine_admission.py +366 -0
  262. package/scripts/engine_dispatch.py +982 -0
  263. package/scripts/engine_env.py +539 -0
  264. package/scripts/engine_failure.py +411 -0
  265. package/scripts/engine_families.py +738 -0
  266. package/scripts/engine_policy.py +218 -0
  267. package/scripts/engine_requires.py +190 -0
  268. package/scripts/engine_status.py +322 -0
  269. package/scripts/engine_validate.py +638 -0
  270. package/scripts/engines.py +799 -294
  271. package/scripts/engines_base.py +1521 -0
  272. package/scripts/engines_builders.py +310 -0
  273. package/scripts/engines_builders_batch10.py +204 -0
  274. package/scripts/engines_builders_batch11.py +174 -0
  275. package/scripts/engines_builders_batch12.py +103 -0
  276. package/scripts/engines_builders_batch13.py +340 -0
  277. package/scripts/engines_builders_batch14.py +656 -0
  278. package/scripts/engines_builders_batch15.py +249 -0
  279. package/scripts/engines_builders_batch9.py +1468 -0
  280. package/scripts/engines_builders_cn.py +2283 -0
  281. package/scripts/engines_builders_data.py +2923 -0
  282. package/scripts/engines_builders_data_macro.py +775 -0
  283. package/scripts/engines_builders_feeds.py +255 -0
  284. package/scripts/engines_builders_intl.py +1239 -0
  285. package/scripts/engines_builders_keyless.py +111 -0
  286. package/scripts/engines_builders_search.py +440 -0
  287. package/scripts/engines_builders_tech.py +1359 -0
  288. package/scripts/evidence.py +620 -166
  289. package/scripts/evidence_loop.py +624 -0
  290. package/scripts/evidence_tier.py +298 -0
  291. package/scripts/except_sets.py +25 -0
  292. package/scripts/extract.py +55 -16
  293. package/scripts/fact_align.py +207 -0
  294. package/scripts/fact_crosscheck.py +230 -0
  295. package/scripts/fetch.py +25 -12
  296. package/scripts/fetch_browser.py +87 -0
  297. package/scripts/fetch_jsrun.py +122 -0
  298. package/scripts/fetch_quality.py +225 -0
  299. package/scripts/fetch_render_tinyfish.py +117 -0
  300. package/scripts/fetch_v3.py +1804 -0
  301. package/scripts/focus_extract.py +350 -0
  302. package/scripts/fulltext_store.py +169 -0
  303. package/scripts/fxtwitter_api.py +325 -0
  304. package/scripts/gen_engine_catalog.py +364 -0
  305. package/scripts/gen_native_tools.py +91 -0
  306. package/scripts/gen_routing_snapshot.py +195 -0
  307. package/scripts/health_check.py +140 -402
  308. package/scripts/health_probe.py +23 -8
  309. package/scripts/hot_state.py +134 -0
  310. package/scripts/http_client.py +1053 -0
  311. package/scripts/image_ops.py +430 -0
  312. package/scripts/image_vision/vision_probe.swift +126 -0
  313. package/scripts/install.ps1 +166 -0
  314. package/scripts/install.sh +221 -0
  315. package/scripts/job.py +1186 -0
  316. package/scripts/jump_resolver.py +235 -0
  317. package/scripts/lang_capability.py +150 -0
  318. package/scripts/lang_detect.py +289 -0
  319. package/scripts/lang_matrix_probe.py +329 -0
  320. package/scripts/lang_pref.py +311 -0
  321. package/scripts/link_source.py +340 -0
  322. package/scripts/local_image.py +970 -0
  323. package/scripts/local_seek.py +402 -0
  324. package/scripts/macro_countries.py +97 -0
  325. package/scripts/matrix_search_eval.py +1187 -0
  326. package/scripts/mcp_compact.py +234 -0
  327. package/scripts/mcp_diag.py +8 -3
  328. package/scripts/mcp_handlers.py +492 -0
  329. package/scripts/mcp_handlers_surface.py +157 -0
  330. package/scripts/mcp_launch.sh +124 -0
  331. package/scripts/mcp_local.py +241 -0
  332. package/scripts/mcp_server.py +125 -419
  333. package/scripts/mcp_setup.py +431 -0
  334. package/scripts/mcp_tools.py +331 -0
  335. package/scripts/mcp_transport.py +191 -0
  336. package/scripts/mcp_warm.py +127 -0
  337. package/scripts/min_version_scan.py +335 -0
  338. package/scripts/net_proxy.py +258 -0
  339. package/scripts/network_aware.py +152 -0
  340. package/scripts/output_transparency.py +200 -0
  341. package/scripts/paid_policy.py +98 -0
  342. package/scripts/paper.py +274 -0
  343. package/scripts/pdf_extract.py +518 -0
  344. package/scripts/phrase_filter.py +66 -0
  345. package/scripts/plan.py +422 -0
  346. package/scripts/postprocess_signals.py +150 -0
  347. package/scripts/pre-commit +48 -0
  348. package/scripts/query_enhance.py +157 -0
  349. package/scripts/query_operators.py +196 -0
  350. package/scripts/query_rewriter.py +116 -7
  351. package/scripts/query_signals.py +300 -0
  352. package/scripts/query_templates.py +167 -0
  353. package/scripts/query_understanding.py +411 -0
  354. package/scripts/query_variants.py +298 -0
  355. package/scripts/quota.py +633 -76
  356. package/scripts/rank_signals.py +775 -0
  357. package/scripts/ranking_eval.py +319 -0
  358. package/scripts/readability_extract.py +433 -0
  359. package/scripts/recompute.py +415 -0
  360. package/scripts/recovery.py +616 -0
  361. package/scripts/recovery_l0.py +160 -0
  362. package/scripts/recovery_runner.py +150 -0
  363. package/scripts/redskill/redskill_engine.py +332 -0
  364. package/scripts/regression_p0p1.py +318 -0
  365. package/scripts/replay_eval.py +658 -0
  366. package/scripts/rerank_tfidf.py +225 -0
  367. package/scripts/research.py +607 -403
  368. package/scripts/research_cli.py +361 -0
  369. package/scripts/research_dossier.py +492 -0
  370. package/scripts/research_expand.py +169 -0
  371. package/scripts/research_gates.py +272 -0
  372. package/scripts/research_report.py +209 -0
  373. package/scripts/research_strategy.py +37 -0
  374. package/scripts/research_work_packages.py +195 -0
  375. package/scripts/result_lang.py +311 -0
  376. package/scripts/retry_policy.py +76 -0
  377. package/scripts/robots_guard.py +259 -0
  378. package/scripts/route.py +921 -254
  379. package/scripts/route_bangs.py +40 -0
  380. package/scripts/route_cache.py +243 -0
  381. package/scripts/route_combo.py +917 -0
  382. package/scripts/route_domains.py +341 -0
  383. package/scripts/route_lang.py +605 -0
  384. package/scripts/route_log.py +63 -0
  385. package/scripts/route_policy.py +250 -0
  386. package/scripts/rrf_classic.py +66 -0
  387. package/scripts/screenshot.py +73 -0
  388. package/scripts/search.py +886 -406
  389. package/scripts/search_attribution.py +185 -0
  390. package/scripts/search_benchmark.py +407 -0
  391. package/scripts/search_cli.py +640 -0
  392. package/scripts/search_entry.py +395 -0
  393. package/scripts/search_output.py +690 -0
  394. package/scripts/search_pipeline.py +926 -0
  395. package/scripts/search_rank.py +991 -0
  396. package/scripts/search_types.py +129 -16
  397. package/scripts/seek_locator.py +68 -0
  398. package/scripts/semantic_evidence.py +391 -0
  399. package/scripts/serp_guard.py +336 -0
  400. package/scripts/serp_kill_log.py +74 -0
  401. package/scripts/single_flight.py +120 -0
  402. package/scripts/social_engines/__init__.py +10 -0
  403. package/scripts/social_engines/bilibili_engine.py +131 -0
  404. package/scripts/social_engines/hackernews_engine.py +113 -0
  405. package/scripts/social_engines/reddit_engine.py +172 -0
  406. package/scripts/social_engines/twitter_engine.py +397 -0
  407. package/scripts/social_engines/v2ex_engine.py +101 -0
  408. package/scripts/social_engines/weibo_engine.py +128 -0
  409. package/scripts/social_engines/xiaohongshu_engine.py +137 -0
  410. package/scripts/social_engines/zhihu_engine.py +139 -0
  411. package/scripts/social_research.py +201 -0
  412. package/scripts/sogou_weixin_browser.py +318 -0
  413. package/scripts/source_ledger.py +249 -0
  414. package/scripts/stage_timing.py +58 -0
  415. package/scripts/stats_cli.py +107 -0
  416. package/scripts/straggler_policy.py +60 -0
  417. package/scripts/stylometry_detector.py +231 -0
  418. package/scripts/sync_backends.py +353 -0
  419. package/scripts/sync_installs.py +29 -0
  420. package/scripts/template_cli.py +127 -0
  421. package/scripts/text_lexicon.py +72 -0
  422. package/scripts/tfidf_router.py +109 -37
  423. package/scripts/time_utils.py +233 -0
  424. package/scripts/topic_research_profiles.py +643 -0
  425. package/scripts/train.py +737 -0
  426. package/scripts/tweet.py +596 -0
  427. package/scripts/url_canon.py +217 -0
  428. package/scripts/url_optimize.py +56 -0
  429. package/scripts/url_safety.py +236 -0
  430. package/scripts/usage_log.py +116 -0
  431. package/scripts/usage_log_clean.py +113 -0
  432. package/scripts/v2ex_nodes.py +311 -0
  433. package/scripts/variant_recall.py +188 -0
  434. package/scripts/watch.py +205 -0
  435. package/scripts/wechat_article.py +258 -0
  436. package/scripts/wide_research.py +447 -0
  437. package/scripts/wx.py +349 -0
  438. package/scripts/x_article_fetch.py +141 -0
  439. package/scripts/x_search.py +234 -0
  440. package/scripts/x_trending.py +189 -0
  441. package/scripts/yaml_load.py +67 -0
  442. package/scripts/zhihu_quota.py +139 -0
  443. package/sub-skills/ego-search/SKILL.md +253 -0
  444. package/sub-skills/ego-search/scripts/ego_search.py +800 -0
  445. package/sub-skills/ego-search/scripts/merge.py +226 -0
  446. package/sub-skills/ego-search/scripts/quality.py +64 -0
  447. package/sub-skills/ego-search/scripts/runtime.py +172 -0
  448. package/sub-skills/ego-search/scripts/safety.py +109 -0
  449. package/sub-skills/ego-search/scripts/serp_spec.py +109 -0
  450. package/sub-skills/ego-search/scripts/webbridge_adapter.py +374 -0
  451. package/sub-skills/js-run/SKILL.md +67 -0
  452. package/sub-skills/js-run/scripts/jsrun.py +112 -0
  453. package/sub-skills/js-run/scripts/shim.js +188 -0
  454. package/sub-skills/local-search/SKILL.md +50 -53
  455. package/sub-skills/local-search/bm25.py +186 -0
  456. package/sub-skills/local-search/cli_runner.py +331 -0
  457. package/sub-skills/local-search/config.yaml +152 -55
  458. package/sub-skills/local-search/engine_registry.py +91 -26
  459. package/sub-skills/local-search/{health_check.py → local_health_check.py} +140 -10
  460. package/sub-skills/local-search/local_search_adapter.py +13 -2
  461. package/sub-skills/local-search/parse_maps.yaml +40 -42
  462. package/sub-skills/local-search/parsers.py +328 -0
  463. package/sub-skills/local-search/search_v3.py +716 -242
  464. package/sub-skills/local-search/smart_router.py +47 -7
  465. package/sub-skills/local-seek/SKILL.md +110 -0
  466. package/sub-skills/local-seek/config/domains.yaml +20 -0
  467. package/sub-skills/local-seek/scripts/eval_rank.py +216 -0
  468. package/sub-skills/local-seek/scripts/eval_seek.py +224 -0
  469. package/sub-skills/local-seek/scripts/seek.py +1465 -0
  470. package/sub-skills/local-seek/scripts/seek_frecency.py +126 -0
  471. package/sub-skills/local-seek/scripts/seek_fts.py +430 -0
  472. package/sub-skills/local-seek/scripts/seek_rank.py +197 -0
@@ -0,0 +1,30 @@
1
+ # 搜狗微信搜索·浏览器兜底通道(ego-browser)
2
+ # 定位:HTTP 快车道 wechat_sogou(spec 在 config.yaml wechat_search 路由)被
3
+ # 搜狗反爬墙拦截(302 antispiderwall)时的域内兜底——借 ego-browser 驱动用户
4
+ # 默认浏览器的真实会话拉取同源结果页,指纹与 cookie 连续,2026-09-30 实测
5
+ # 连查无风控(对比:raw curl 第 2 次查询即被墙)。只挂在 wechat_search 路由
6
+ # 的 engines_combo 里(primary 之后、anysearch 之前),不进任何通用池。
7
+ # 实现:scripts/sogou_weixin_browser.py(纯标准库;空间复用+文件锁+最小间隔;
8
+ # 中间链在浏览器会话内解析为 mp.weixin.qq.com 真实链接,语义与 HTTP 车道对齐)
9
+ # 验证:
10
+ # python3 scripts/engine_validate.py --engine sogou_weixin_browser --stage all --admit
11
+ # python3 scripts/search.py "公众号 石墨化" --engine sogou_weixin_browser --json
12
+
13
+ engine_id: sogou_weixin_browser
14
+ type: cli
15
+ enabled: true
16
+ cost_tier: free
17
+ cmd:
18
+ - python3
19
+ - scripts/sogou_weixin_browser.py
20
+ search_args:
21
+ - '{query}'
22
+ - --n
23
+ - '{n}'
24
+ output_format: yaml
25
+ timeout: 75
26
+ canary_query: "人工智能"
27
+ desc: "搜狗微信搜索·浏览器兜底通道(ego-browser 真实会话,HTTP 车道被反爬时保底;中间链会话内解析为微信真实链接)"
28
+ coverage: [chinese, wechat, article]
29
+ recommended: false
30
+ family: web_general
@@ -0,0 +1,25 @@
1
+ # ISRIC SoilGrids 全球土壤属性(逐点栅格,免认证)——【暂不启用】
2
+ # 2026-09-13 实测:端点可达、schema 正确,但**所有 property × 所有深度的 values 全为 null**
3
+ # (clay/sand/silt/soc/nitrogen/phh2o/bdod × 0-5cm… 全空,多坐标复核一致),
4
+ # 属服务端降级(此前 also 出现过 503)。builder 逻辑已验证正确,待上游恢复后
5
+ # 把 enabled 改回 true 即可启用,无需改代码。
6
+ # 补 earth_science 域的「土壤」维度:usgs(地震/水文)、nasa_cmr(地球观测)、
7
+ # 现在加上土壤属性。查地名 → 地理编码 → 取该点土壤理化属性。
8
+ # 验证:
9
+ # python3 scripts/engine_validate.py --engine soilgrids --stage all --admit --write-doc
10
+
11
+ engine_id: soilgrids
12
+ type: soilgrids
13
+ enabled: false
14
+ disabled_reason: 72fd95a 源治理轮批量停用,未单独评估;土壤数据查询占比低,重开前需实测对比
15
+ cost_tier: free
16
+ timeout: 25
17
+ canary_query: "amsterdam"
18
+ desc: "全球土壤属性(ISRIC SoilGrids,逐点栅格,免认证)"
19
+ coverage: [earth_science, agriculture, environment]
20
+ recommended: false
21
+ latency_ms: 4000
22
+
23
+ quality_queries:
24
+ - query: "amsterdam"
25
+ - query: "nairobi"
@@ -0,0 +1,36 @@
1
+ # 少数派搜索 — 中文效率/数码/软件内容(JSON API,免认证)
2
+ # 补 cn_tech_community 域的效率工具/数码生活维度:juejin/v2ex 偏开发向。
3
+ # v3 路径已 404,用 v1;版本漂移风险自担,失败诚实空。
4
+ # 验证:
5
+ # python3 scripts/engine_validate.py --engine sspai --stage all --admit --write-doc
6
+
7
+ engine_id: sspai
8
+ type: http
9
+ enabled: true
10
+ cost_tier: free
11
+ method: GET
12
+ url: https://sspai.com/api/v1/search/article/page/get
13
+ timeout: 10
14
+ query_param: title
15
+ canary_query: "notion"
16
+ desc: "少数派搜索(中文效率/数码/软件文章,免认证)"
17
+ coverage: [chinese, tech, article]
18
+ recommended: false
19
+ latency_ms: 1000
20
+
21
+ headers:
22
+ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
23
+
24
+ extra_params:
25
+ offset: "0"
26
+ limit: "{n}"
27
+
28
+ output_map:
29
+ items: data
30
+ item_title: title
31
+ item_summary: summary
32
+ url_template: "https://sspai.com/post/{id}"
33
+
34
+ quality_queries:
35
+ - query: "notion"
36
+ - query: "iphone"
@@ -0,0 +1,46 @@
1
+ # StackExchange API 族引擎(180+ 问答站官方 API,keyless 匿名直连)
2
+ # 文档: https://api.stackexchange.com/docs/search
3
+ # 额度: 匿名 300/天/IP(全站共享配额,实测 quota_remaining 299/300);
4
+ # 免费注册 key 后 10,000/天——需要提额时在 extra_params 加
5
+ # key: "{ARGO_STACKEXCHANGE_API_KEY}" 并配置该环境变量
6
+ # 特点: search/advanced 端点 q 自由文本检索,items 自带 link(无需拼 URL)、
7
+ # score/IsAnswered 质量信号;--compressed(gzip)由 http_client 统一解压
8
+ # 定位: T2 补充引擎 —— 免费池可路由(daily_support),匿名额度小,
9
+ # 日常 combo 排后排保配额(engine_policy.get_engine_tier 读 spec.tier)
10
+ # 验证:
11
+ # python3 scripts/engine_validate.py --engine stackexchange --stage all --admit
12
+ # python3 scripts/search.py "python asyncio" --engine stackexchange --json
13
+
14
+ engine_id: stackexchange
15
+ type: http
16
+ enabled: true
17
+ cost_tier: free
18
+ # 匿名额度小(300/天/IP 与全站共享),日常只当补位,budget 截断优先命中
19
+ tier: daily_support
20
+ label: StackExchange 问答族
21
+ family: knowledge
22
+ priority: 45
23
+ qps: 1
24
+ period: day
25
+ limit: 300
26
+ cost_per_call: 0.0
27
+ cost_unit: usd
28
+ method: GET
29
+ url: https://api.stackexchange.com/2.3/search/advanced
30
+ timeout: 12
31
+ canary_query: "python asyncio"
32
+ coverage:
33
+ - english
34
+ - tech
35
+ desc: "StackExchange API 族(StackOverflow 等 180+ 问答站结构化检索,匿名 300/天/IP,免费 key 可提额 10000/天)"
36
+ format: json
37
+ query_param: q
38
+ extra_params:
39
+ site: stackoverflow
40
+ order: desc
41
+ sort: relevance
42
+ pagesize: "{n}"
43
+ output_map:
44
+ items: items
45
+ item_title: title
46
+ item_url: link
@@ -0,0 +1,21 @@
1
+ # 全国标准信息公共服务平台 — 国标/行标检索(JSON API,免认证)
2
+ # 标准文档域补位:RFC 有、国标无。C_C_NAME 带 <sacinfo> 高亮标签需剥离,
3
+ # 标题由「标准号 + 名称」拼装。id 字段即 openstd hcno,直通全文页。
4
+ # 验证:
5
+ # python3 scripts/engine_validate.py --engine std_samr --stage all --admit --write-doc
6
+
7
+ engine_id: std_samr
8
+ type: std_samr
9
+ enabled: true
10
+ cost_tier: free
11
+ timeout: 12
12
+ canary_query: "数据安全"
13
+ desc: "全国标准信息公共服务平台(国标检索,标准号/状态/日期,免认证)"
14
+ coverage: [standards, tech, chinese]
15
+ recommended: false
16
+ latency_ms: 1500
17
+
18
+ quality_queries:
19
+ - query: "数据安全"
20
+ - query: "个人信息保护"
21
+ - query: "网络安全"
@@ -0,0 +1,43 @@
1
+ # 塔斯社 RSS — 俄罗斯国家通讯社(ТАСС),俄语一手新闻
2
+ #
3
+ # 补的盲区:**ru 本地一手新闻**。接入前 argo 的新闻链路只有中英源
4
+ # (google_news/guardian_rss/dw_news/france24 都是英语视角),ru 查询
5
+ # 拿不到本地一手报道。
6
+ #
7
+ # 实测(2026-09-21):**100 条**,摘要中位 64 字、最长 304 字。
8
+ #
9
+ # 形态:feed_mode=hot(实时流语义,同 guardian_rss)。归 world_news 族——
10
+ # 与 hot_trending(热榜)分族,避免同族 max_per_family=2 把本地源互相挤掉。
11
+ # 语言由 langs 声明,路由按查询语言选源(见 route._lang_aware_combo_order)。
12
+ #
13
+ # 验证:
14
+ # python3 scripts/engine_validate.py --engine tass --stage all --admit
15
+ # python3 scripts/search.py "новости сегодня" --engine tass --json
16
+
17
+ engine_id: tass
18
+ type: rss_feed
19
+ enabled: true
20
+ cost_tier: free
21
+ label: 塔斯社 RSS
22
+ family: world_news
23
+ feed_mode: hot
24
+ relevance_check: false
25
+ priority: 41
26
+ qps: 1
27
+ period: second
28
+ cost_per_call: 0.0
29
+ cost_unit: free
30
+ timeout: 12
31
+ feed_url: https://tass.ru/rss/v2.xml
32
+ langs:
33
+ - ru
34
+ canary_query: "новости сегодня"
35
+ coverage:
36
+ - news
37
+ - russia
38
+ desc: "塔斯社(俄罗斯国家通讯社(ТАСС),俄语一手新闻,免 key)"
39
+ recommended: false
40
+
41
+ quality_queries:
42
+ - query: "новости сегодня"
43
+ - query: "Россия экономика"
@@ -0,0 +1,56 @@
1
+ # Tavily 免 key 通道(官方 keyless 匿名额度)
2
+ #
3
+ # 为什么与 tavily 并列而不是合并:两者同上游、不同经济模型——tavily 用
4
+ # ARGO_TAVILY_API_KEY 走账号档(额度高、结果稳),本引擎走官方 keyless
5
+ # 头(x-tavily-access-mode),不读任何 key。计费语义不同,合并会让
6
+ # 「免费源不当计费源」的检查失真(与 parallel / parallel_free 同一处理)。
7
+ #
8
+ # 端点语义(2026-10-21 实测):POST /search,带 `x-tavily-access-mode: keyless`
9
+ # 且不带 Authorization,返回与账号档同构的 {results:[{title,url,content,score}]}。
10
+ # 匿名额度有 IP 级限流;失效时返回 4xx,由调度层换源,不静默伪装成空结果。
11
+ #
12
+ # 验证:
13
+ # python3 scripts/engine_validate.py --engine tavily_free --stage health --admit
14
+ # argo search "OpenAI" --engine tavily_free --json
15
+
16
+ engine_id: tavily_free
17
+ type: http
18
+ enabled: true
19
+ cost_tier: free
20
+ label: Tavily (keyless)
21
+ family: web_general
22
+ priority: 56
23
+ qps: 1
24
+ period: second
25
+ cost_per_call: 0.0
26
+ cost_unit: free
27
+ recommended: false
28
+
29
+ method: POST
30
+ url: https://api.tavily.com/search
31
+ timeout: 15
32
+
33
+ headers:
34
+ Content-Type: application/json
35
+ x-tavily-access-mode: keyless
36
+
37
+ body:
38
+ query: "{query}"
39
+ max_results: "{n}"
40
+ search_depth: basic
41
+ include_answer: false
42
+
43
+ output_map:
44
+ items: results
45
+ item_title: title
46
+ item_url: url
47
+ item_summary: content
48
+ item_published_at: published_date
49
+
50
+ canary_query: OpenAI
51
+ desc: "Tavily 官方免 key 匿名通道(通用网页搜索,无需注册)"
52
+ coverage: [general, english, chinese]
53
+
54
+ quality_queries:
55
+ - query: OpenAI
56
+ - query: 人工智能 应用
@@ -0,0 +1,21 @@
1
+ # TLE 两行根数镜像(第三方,免认证)
2
+ # 补 astronomy 域的轨道根数:官方 Celestrak 在本机网络不可达(TLS 握手失败),
3
+ # 此镜像提供同构数据。**第三方非官方 SLA**,接入时应配 fallback 链
4
+ # (Celestrak 官方 → 本镜像),失败诚实空。
5
+ # 验证:
6
+ # python3 scripts/engine_validate.py --engine tle_mirror --stage all --admit --write-doc
7
+
8
+ engine_id: tle_mirror
9
+ type: tle_mirror
10
+ enabled: true
11
+ cost_tier: free
12
+ timeout: 15
13
+ canary_query: "ISS"
14
+ desc: "TLE 轨道根数镜像(第三方,Celestrak 不可达时替代,免认证)"
15
+ coverage: [astronomy, space, satellites]
16
+ recommended: false
17
+ latency_ms: 2000
18
+
19
+ quality_queries:
20
+ - query: "ISS"
21
+ - query: "NOAA"
@@ -0,0 +1,37 @@
1
+ # 火车余票/中转/经停查询(免 Key)
2
+ # 数据源: 12306 官方接口(init 取会话 Cookie → queryG 查余票 / lcquery 查中转 /
3
+ # queryTrainInfo 查经停),免 Key,查询路径运行时解析跟随官方改版
4
+ # 能力: 自然语言查询车次时刻与余票("上海到北京 后天 G")、中转换乘方案
5
+ # ("北京到拉萨 中转",可「经西宁」指定换乘站)、全程经停("G2 经停")
6
+ # 输出: 行 URL 带查询身份参数(train_code/first_train_no 等)——表格行不共享
7
+ # 裸 URL,避免被 URL 去重折叠成一条(fred/worldbank 时序引擎同款约定)
8
+ # 实现: scripts/train.py(纯标准库,站点表 station_name.js 解析 + 7 天缓存,输出结构化 YAML)
9
+ # 验证:
10
+ # python3 scripts/engine_validate.py --engine train --stage all --admit
11
+ # python3 scripts/search.py "上海到北京高铁" --engine train --json
12
+ # python3 scripts/search.py "北京到拉萨 中转" --engine train --json
13
+ # python3 scripts/search.py "G2 经停" --engine train --json
14
+
15
+ engine_id: train
16
+ type: cli
17
+ enabled: true
18
+ cost_tier: free
19
+ label: 火车余票
20
+ desc: 火车余票/中转/经停查询(免 Key:12306 官方接口)
21
+ canary_query: "北京到上海"
22
+ cmd:
23
+ - python3
24
+ - scripts/train.py
25
+ search_args:
26
+ - '{query}'
27
+ - --n
28
+ - '{n}'
29
+ output_format: yaml
30
+ timeout: 20
31
+ family: misc_vertical
32
+ # 质量门禁自述查询集:通用英文探针(Python asyncio 等)会被当站名解析,
33
+ # 必然 rc=2——垂直引擎按 engine_validate 的设计自述适用集,标准不降
34
+ quality_queries:
35
+ - {id: tickets_zh, query: "上海到北京 高铁", category: travel}
36
+ - {id: transfer_zh, query: "北京到上海 中转", category: travel}
37
+ - {id: route_zh, query: "G2 经停", category: travel}
@@ -0,0 +1,20 @@
1
+ # TVMaze 电视剧元数据(免认证)
2
+ # 补 film_search 域的「剧集/电视」维度:现有 imdb/douban_movie 偏电影,
3
+ # TVMaze 按剧集组织且含播出日期与语言,适合「某剧哪年首播」类查询。
4
+ # 验证:
5
+ # python3 scripts/engine_validate.py --engine tvmaze --stage all --admit --write-doc
6
+
7
+ engine_id: tvmaze
8
+ type: tvmaze
9
+ enabled: true
10
+ cost_tier: free
11
+ timeout: 15
12
+ canary_query: "dark"
13
+ desc: "电视剧元数据(TVMaze,免认证,含首播/语言/评分)"
14
+ coverage: [film, tv, media, entertainment]
15
+ recommended: false
16
+ latency_ms: 2000
17
+
18
+ quality_queries:
19
+ - query: "dark"
20
+ - query: "breaking bad"
@@ -0,0 +1,31 @@
1
+ # X/Twitter 单条推文(syndication 免登录通道)
2
+ #
3
+ # 定位:按推文取单条的抽取型引擎,与 twitter(搜索型)互为补充。
4
+ # 通道原理:面向第三方网页嵌入的公开接口,访问凭证由推文 ID 本地推导
5
+ #(见 engines_builders_intl.syndication_token),无需任何账号或密钥——
6
+ # X 网页与官方 API 对未登录请求一律拒绝,这是常年可用的第二条通道。
7
+ #
8
+ # 查询词形态:推文 URL(x.com / twitter.com / 分享链接带 tweet_id 参数)或裸 ID。
9
+ # 示例:
10
+ # python3 scripts/search.py "https://x.com/elonmusk/status/1585841080431321088" --engine twitter_syndication --json
11
+
12
+ engine_id: twitter_syndication
13
+ type: twitter_syndication
14
+ enabled: true
15
+ cost_tier: free
16
+ timeout: 8
17
+ canary_query: "https://x.com/elonmusk/status/1585841080431321088"
18
+ desc: "X/Twitter 单条推文(syndication 通道,免登录零 key,含正文/作者/时间/媒体计数)"
19
+ coverage: [social]
20
+ recommended: false
21
+ # explicit_only:关键词查询永不触发(无搜索端点),只能按 URL/ID 显式调用;
22
+ # known-url 交接会提示该通道。声明在此,不计入死源。
23
+ explicit_only: true
24
+ latency_ms: 2000
25
+
26
+ # 抽取型引擎:查询词是推文 URL 而非关键词。质量自述集用真实推文 URL,
27
+ # 避免默认关键词探针对单条抽取引擎误判「零结果」
28
+ quality_queries:
29
+ - query: "https://x.com/elonmusk/status/1585841080431321088"
30
+ - query: "https://twitter.com/elonmusk/status/1585841080431321088"
31
+ - query: "1585841080431321088"
@@ -0,0 +1,23 @@
1
+ # UN Comtrade — 双边商品贸易(preview 端点免 key;正式端点免费注册提额)
2
+ # 查询形态:「<国家> <HS 码> [年份] [出口]」,如「中国 8541」「美国 8542 2024 出口」。
3
+ # 国家词表 35 个主要经济体;未提供国家或 HS 码诚实返回空(参数解析不做猜测)。
4
+ # preview 返回代码与数值(Desc 字段为 null),标题用查询词回显、每条附
5
+ # comtradeplus 网页链接可核验。
6
+ # 验证:
7
+ # python3 scripts/engine_validate.py --engine un_comtrade --stage all --admit --write-doc
8
+
9
+ engine_id: un_comtrade
10
+ type: un_comtrade
11
+ enabled: true
12
+ cost_tier: free
13
+ timeout: 15
14
+ canary_query: "中国 8541 2023"
15
+ desc: "UN Comtrade 双边贸易(国家+HS 码+年份+流向;preview 免 key)"
16
+ coverage: [macro, finance]
17
+ recommended: false
18
+ latency_ms: 4000
19
+
20
+ quality_queries:
21
+ - query: "中国 8541 2023"
22
+ - query: "美国 8703 2023 出口"
23
+ - query: "日本 8542 2023"
@@ -0,0 +1,54 @@
1
+ # Unpaywall — 开放获取全文定位(免 key,但**必须带真实邮箱**)
2
+ #
3
+ # 补的盲区:这不是搜索源,而是「论文 → 合法免费全文」的**后置解析器**。
4
+ # 用户搜到一篇论文后,真正的问题常是「有没有免费合法全文」。Unpaywall 专门
5
+ # 解决这件事,是 argo 学术链路从「找到论文」升级到「找到合法全文」的关键一环:
6
+ # paper_found → DOI → Unpaywall → 合法 OA 全文 → fetch
7
+ #
8
+ # 端点语义(实测 2026-09-16):
9
+ # /v2/{doi}?email=<邮箱> → 单对象:is_oa / best_oa_location.url / title ...
10
+ # 邮箱是**硬要求**:上游校验邮箱真实性,测试域名会被 422 拒(实测
11
+ # "Please use your own email address")。故走环境变量注入,不写死在仓里。
12
+ #
13
+ # 用法:显式专用(explicit_only)——查询词传裸 DOI,不参与自动路由。
14
+ #
15
+ # 验证(需先设 ARGO_UNPAYWALL_EMAIL):
16
+ # ARGO_UNPAYWALL_EMAIL=you@example.org python3 scripts/search.py \
17
+ # "10.1038/nature12373" --engine unpaywall --json
18
+
19
+ engine_id: unpaywall
20
+ type: http
21
+ enabled: true
22
+ # 按 DOI 精查,不参与关键词路由
23
+ explicit_only: true
24
+ cost_tier: free
25
+ label: Unpaywall 开放获取定位
26
+ family: academic
27
+ priority: 53
28
+ qps: 2
29
+ period: second
30
+ cost_per_call: 0.0
31
+ cost_unit: free
32
+ method: GET
33
+ # 邮箱从环境变量注入。占位符写**裸名** UNPAYWALL_EMAIL:engine_env 的
34
+ # PLACEHOLDER_ALIASES 会按 [ARGO_UNPAYWALL_EMAIL, UNPAYWALL_EMAIL] 顺序解析;
35
+ # 若这里直接写 ARGO_UNPAYWALL_EMAIL,别名表未命中时会再补一次 ARGO_ 前缀,
36
+ # 报错信息会变成难懂的 ARGO_ARGO_UNPAYWALL_EMAIL(已实测)。
37
+ # 未设置时引擎报 skipped-missing-env(如实提示),而非静默空结果。
38
+ url: https://api.unpaywall.org/v2/{query}?email={UNPAYWALL_EMAIL}
39
+ query_param: ""
40
+ timeout: 12
41
+ format: json
42
+ canary_query: "10.1038/nature12373"
43
+ coverage:
44
+ - academic
45
+ - open_access
46
+ desc: "Unpaywall 开放获取定位(DOI → 是否有合法免费全文及链接;需 ARGO_UNPAYWALL_EMAIL)"
47
+ # 不写 output_map:响应是单对象根、且答案在嵌套字段里,声明式 output_map 只
48
+ # 支持数组根。由 scripts/engines_base.py 的 _CUSTOM_JSON_PARSERS["unpaywall"]
49
+ # 专用解析(与 doi 同一机制)。
50
+ recommended: false
51
+ latency_ms: 900
52
+
53
+ quality_queries:
54
+ - query: "10.1038/nature12373"
@@ -0,0 +1,43 @@
1
+ # VnExpress RSS — 越南最大网络新闻
2
+ #
3
+ # 补的盲区:**vi 本地一手新闻**。接入前 argo 的新闻链路只有中英源
4
+ # (google_news/guardian_rss/dw_news/france24 都是英语视角),vi 查询
5
+ # 拿不到本地一手报道。
6
+ #
7
+ # 实测(2026-09-21):**49 条**,摘要中位 140 字、最长 202 字。
8
+ #
9
+ # 形态:feed_mode=hot(实时流语义,同 guardian_rss)。归 world_news 族——
10
+ # 与 hot_trending(热榜)分族,避免同族 max_per_family=2 把本地源互相挤掉。
11
+ # 语言由 langs 声明,路由按查询语言选源(见 route._lang_aware_combo_order)。
12
+ #
13
+ # 验证:
14
+ # python3 scripts/engine_validate.py --engine vnpress --stage all --admit
15
+ # python3 scripts/search.py "tin tức hôm nay" --engine vnpress --json
16
+
17
+ engine_id: vnpress
18
+ type: rss_feed
19
+ enabled: true
20
+ cost_tier: free
21
+ label: VnExpress RSS
22
+ family: world_news
23
+ feed_mode: hot
24
+ relevance_check: false
25
+ priority: 49
26
+ qps: 1
27
+ period: second
28
+ cost_per_call: 0.0
29
+ cost_unit: free
30
+ timeout: 12
31
+ feed_url: https://vnexpress.net/rss/tin-moi-nhat.rss
32
+ langs:
33
+ - vi
34
+ canary_query: "tin tức hôm nay"
35
+ coverage:
36
+ - news
37
+ - vietnam
38
+ desc: "VnExpress(越南最大网络新闻,免 key)"
39
+ recommended: false
40
+
41
+ quality_queries:
42
+ - query: "tin tức hôm nay"
43
+ - query: "kinh tế Việt Nam"
@@ -0,0 +1,32 @@
1
+ # 天气查询(免 Key)
2
+ # 数据源: wttr.in(主用,免费公开)+ Open-Meteo(兜底,需要坐标)
3
+ # 能力: 按地点名(城市/机场码/邮编)或坐标查询当前天气与未来预报
4
+ # 实现: scripts/wx.py(纯标准库,输出结构化 YAML 结果列表)
5
+ # 验证:
6
+ # python3 scripts/engine_validate.py --engine weather --stage all --admit
7
+ # python3 scripts/search.py "上海天气" --engine weather --json
8
+
9
+ engine_id: weather
10
+ type: cli
11
+ enabled: true
12
+ cost_tier: free
13
+ cmd:
14
+ - python3
15
+ - scripts/wx.py
16
+ search_args:
17
+ - '{query}'
18
+ - --n
19
+ - '{n}'
20
+ output_format: yaml
21
+ timeout: 15
22
+ canary_query: "Shanghai"
23
+ desc: "天气查询(免 Key:wttr.in 主用 + Open-Meteo 兜底,当前+未来预报)"
24
+ coverage: [weather, forecast, geo]
25
+ recommended: false
26
+ # 数据型源:回答的是天气数据而非与查询词面匹配的文档,相关性判据不适用。
27
+ # 实证:canary "Shanghai" 返回 wttr.in 的中文本地化结果(「上海…」),拉丁
28
+ # 查询配 CJK 输出零词面交集,2026-09-16 实测被相关性门判负——同热榜类,
29
+ # 标准不降,只是问错了问题。
30
+ relevance_check: false
31
+
32
+ family: misc_vertical
@@ -0,0 +1,21 @@
1
+ # WHO Disease Outbreak News — 世卫官方疫情暴发通报(免认证 OData)
2
+ # 补 medical 域的「官方疫情暴发」维度:现有 medical 只有 clinicaltrials(试验登记)
3
+ # 与 openfda(药品/器械),没有公共卫生事件源。ProMED 无公开 API,此为其官方替代。
4
+ # OData 支持 $top/$orderby/$filter。
5
+ # 验证:
6
+ # python3 scripts/engine_validate.py --engine who_don --stage all --admit --write-doc
7
+
8
+ engine_id: who_don
9
+ type: who_don
10
+ enabled: true
11
+ cost_tier: free
12
+ timeout: 20
13
+ canary_query: "cholera"
14
+ desc: "WHO 疫情暴发通报(世卫官方公共卫生事件,免认证 OData)"
15
+ coverage: [medical, health, news, official]
16
+ recommended: false
17
+ latency_ms: 2500
18
+
19
+ quality_queries:
20
+ - query: "cholera"
21
+ - query: "influenza"
@@ -0,0 +1,20 @@
1
+ # WHO GHO 全球卫生指标(官方 OData,免认证)
2
+ # 补 medical 域的「全球公共卫生统计」维度:现有 medical 只有临床登记/药品/文献,
3
+ # 没有国别卫生统计。指标目录本地过滤(OData contains 引号转义不可靠)。
4
+ # 验证:
5
+ # python3 scripts/engine_validate.py --engine who_gho --stage all --admit --write-doc
6
+
7
+ engine_id: who_gho
8
+ type: who_gho
9
+ enabled: true
10
+ cost_tier: free
11
+ timeout: 15
12
+ canary_query: "malaria"
13
+ desc: "WHO GHO 全球卫生指标(世卫官方统计目录,免认证)"
14
+ coverage: [medical, health, statistics, official]
15
+ recommended: false
16
+ latency_ms: 2500
17
+
18
+ quality_queries:
19
+ - query: "malaria"
20
+ - query: "tobacco"
@@ -0,0 +1,34 @@
1
+ # Wikimedia Commons — 通用图库(免 key,CC 素材,字段齐全)
2
+ #
3
+ # 为什么收这个源:argo 的图片能力此前只有 openverse 一个通用图库,而 Openverse
4
+ # 自身的统计显示其图库主体就来自 Wikimedia(88M 图里 Commons 占最大份额)——
5
+ # 直连 Commons 等于绕过中间层拿上游,且字段更全(extmetadata 带许可全称、
6
+ # 作者、描述原文,imageinfo 带原图直链与宽高)。中文查询覆盖也优于 Openverse
7
+ # (Commons 有大量中文题注的素材)。
8
+ #
9
+ # 与既有图源的分工:
10
+ # - wikimedia_commons:通用图库,CC 授权明确,**首选素材源**
11
+ # - openverse:同为 CC 图库,含 Flickr 等来源,与 Commons 互补不重复
12
+ # - ddgs_images:全网图片(无许可标注),覆盖优先
13
+ # - met/artic/cleveland/nasa_images:垂直馆藏(艺术/航天)
14
+ #
15
+ # 解析说明:query.pages 是以 pageid 为键的字典,声明式 output_map 处理不了
16
+ # (_extract_items 会把 dict 包成单条且字段全空),故用 builder 展开。
17
+ # 验证:
18
+ # python3 scripts/engine_validate.py --engine wikimedia_commons --stage all --admit
19
+
20
+ engine_id: wikimedia_commons
21
+ type: wikimedia_commons
22
+ enabled: true
23
+ cost_tier: free
24
+ label: Wikimedia图库
25
+ desc: "Wikimedia Commons 通用图库(免 key,CC 素材,原图直链+许可+宽高)"
26
+ coverage: [image, media, cc, reference]
27
+ family: misc_vertical
28
+ priority: 30
29
+ timeout: 20
30
+ canary_query: "snow mountain"
31
+ quality_queries:
32
+ - query: "snow mountain"
33
+ - query: "ukiyo-e"
34
+ - query: "cat"
@@ -0,0 +1,22 @@
1
+ # 维基文库 — 古文/公版文献全文(MediaWiki API,免认证)
2
+ # 古文引文溯源补位:中文引文核验需要原文全文(出师表/论语/史记),
3
+ # wikipedia 词条给不了。与 zh_wikipedia 同构;标题含空格需编码后拼
4
+ # wiki 路径,builder 内处理(声明式 url_template 不做编码)。
5
+ # 验证:
6
+ # python3 scripts/engine_validate.py --engine wikisource --stage all --admit --write-doc
7
+
8
+ engine_id: wikisource
9
+ type: wikisource
10
+ enabled: true
11
+ cost_tier: free
12
+ timeout: 10
13
+ canary_query: "出师表"
14
+ desc: "维基文库(古文/公版文献全文检索,中文引文溯源,免认证)"
15
+ coverage: [reference, chinese, classic]
16
+ recommended: false
17
+ latency_ms: 800
18
+
19
+ quality_queries:
20
+ - query: "出师表"
21
+ - query: "论语"
22
+ - query: "史记"
@@ -0,0 +1,19 @@
1
+ # WoRMS 世界海洋物种名录(分类学权威,免认证)
2
+ # 与 OBIS 互补:OBIS 给观测记录,WoRMS 给分类学「正确学名/接受名」判定。
3
+ # 验证:
4
+ # python3 scripts/engine_validate.py --engine worms --stage all --admit --write-doc
5
+
6
+ engine_id: worms
7
+ type: worms
8
+ enabled: true
9
+ cost_tier: free
10
+ timeout: 15
11
+ canary_query: "Gadus morhua"
12
+ desc: "WoRMS 海洋物种权威命名(分类学标准,免认证)"
13
+ coverage: [species, marine, science, reference]
14
+ recommended: false
15
+ latency_ms: 2000
16
+
17
+ quality_queries:
18
+ - query: "Gadus morhua"
19
+ - query: "Octopus vulgaris"