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.
- package/LICENSE +201 -21
- package/README.en.md +735 -0
- package/README.es.md +777 -0
- package/README.ja.md +777 -0
- package/README.ko.md +777 -0
- package/README.md +778 -320
- package/SKILL.md +135 -0
- package/assets/readme/hero.svg +121 -0
- package/assets/readme/made-with-beautify.svg +10 -0
- package/assets/readme/proof-routes.svg +73 -0
- package/assets/readme/why-better.svg +104 -0
- package/assets/readme/workflow.svg +83 -0
- package/backends/domain_profiles.json +2356 -96
- package/backends/engine_registry.yaml +3428 -503
- package/backends/query_synonyms_cn.json +35 -0
- package/backends/quota_profiles.json +2488 -160
- package/backends/source_types_cn.json +109 -0
- package/backends/text_lexicon.json +44 -0
- package/bin/argo +772 -0
- package/bin/argo.js +102 -39
- package/config.yaml +5139 -367
- package/cordis.patch.yml +21 -0
- package/data/countries.json +40 -0
- package/data/lang_matrix/lang_capability.json +842 -0
- package/data/lang_matrix/matrix_2026-09-10.json +11921 -0
- package/data/regions_cn.json +1 -0
- package/docs/ADDING_NEW_ENGINE.md +184 -0
- package/docs/ARGO_INTRO.md +124 -0
- package/docs/DATA_SOURCE_GAPS.md +81 -0
- package/docs/DESIGN_LOCAL_DATA_FUSION.md +90 -0
- package/docs/ENGINE_CATALOG.md +575 -0
- package/docs/MCP_SETUP.md +108 -0
- package/docs/PLATFORM_PATHS.md +111 -0
- package/docs/RELEASE_NOTES_v2.8.0.md +71 -0
- package/docs/RELEASE_NOTES_v2.8.2.md +63 -0
- package/docs/RELEASE_NOTES_v2.8.3.md +55 -0
- package/docs/RELEASE_NOTES_v2.8.4.md +79 -0
- package/docs/RELEASE_NOTES_v2.8.5.md +102 -0
- package/docs/RELEASE_NOTES_v2.8.6.md +66 -0
- package/docs/RELEASE_NOTES_v2.8.7.md +65 -0
- package/docs/RELEASE_NOTES_v2.8.8.md +67 -0
- package/docs/RELEASE_NOTES_v2.8.9.md +67 -0
- package/docs/RELEASE_NOTES_v2.9.0.md +64 -0
- package/docs/RELEASE_NOTES_v2.9.8.md +73 -0
- package/docs/SEARCH_ARCHIVE.md +115 -0
- package/docs/assets/architecture.svg +104 -0
- package/docs/assets/hero.svg +98 -0
- package/docs/engines/bangumi.md +27 -0
- package/docs/engines/biorxiv.md +27 -0
- package/docs/engines/clawhub.md +27 -0
- package/docs/engines/crt_sh.md +27 -0
- package/docs/engines/datacite.md +27 -0
- package/docs/engines/deps_dev.md +27 -0
- package/docs/engines/douban_movie.md +27 -0
- package/docs/engines/endoflife.md +27 -0
- package/docs/engines/flk_law.md +27 -0
- package/docs/engines/fxtwitter.md +27 -0
- package/docs/engines/google_news.md +27 -0
- package/docs/engines/gov_regulations.md +27 -0
- package/docs/engines/guqian.md +27 -0
- package/docs/engines/hackernews.md +27 -0
- package/docs/engines/iplant.md +27 -0
- package/docs/engines/keenable.md +27 -0
- package/docs/engines/met_museum.md +27 -0
- package/docs/engines/nasa_images.md +27 -0
- package/docs/engines/netease_music.md +27 -0
- package/docs/engines/npm.md +27 -0
- package/docs/engines/nvd.md +27 -0
- package/docs/engines/openreview.md +27 -0
- package/docs/engines/openstd.md +27 -0
- package/docs/engines/parallel_free.md +27 -0
- package/docs/engines/people_daily.md +27 -0
- package/docs/engines/realtime_index.md +27 -0
- package/docs/engines/sec_edgar.md +27 -0
- package/docs/engines/seltz.md +27 -0
- package/docs/engines/skillsmp.md +27 -0
- package/docs/engines/sspai.md +27 -0
- package/docs/engines/std_samr.md +27 -0
- package/docs/engines/train.md +27 -0
- package/docs/engines/un_comtrade.md +27 -0
- package/docs/engines/wikisource.md +27 -0
- package/docs/engines/zdic.md +27 -0
- package/docs/engines/zenodo.md +27 -0
- package/docs/engines/zhihu_hot_app.md +27 -0
- package/docs//344/270/272/344/273/200/344/271/210/351/200/211/346/213/251argo.md +176 -0
- package/engines/README.md +10 -0
- package/engines/_template_cli.yaml +39 -0
- package/engines/_template_http.yaml +37 -0
- package/engines/plugins/_template_plugin.py +50 -0
- package/engines/specs/_cisa_kev.yaml +54 -0
- package/engines/specs/_osv.yaml +63 -0
- package/engines/specs/aljazeera.yaml +43 -0
- package/engines/specs/antara.yaml +43 -0
- package/engines/specs/artic.yaml +20 -0
- package/engines/specs/aviation_weather.yaml +39 -0
- package/engines/specs/bangumi.yaml +21 -0
- package/engines/specs/biorxiv.yaml +24 -0
- package/engines/specs/carbon_intensity.yaml +32 -0
- package/engines/specs/cfets.yaml +41 -0
- package/engines/specs/cinii.yaml +44 -0
- package/engines/specs/clawhub.yaml +49 -0
- package/engines/specs/cleveland.yaml +19 -0
- package/engines/specs/cn_ai_news.yaml +43 -0
- package/engines/specs/core.yaml +35 -0
- package/engines/specs/crt_sh.yaml +38 -0
- package/engines/specs/ct24.yaml +43 -0
- package/engines/specs/datacite.yaml +27 -0
- package/engines/specs/datagov_uk.yaml +41 -0
- package/engines/specs/ddgs_images.yaml +45 -0
- package/engines/specs/deepseek_search.yaml +74 -0
- package/engines/specs/deezer.yaml +20 -0
- package/engines/specs/defillama.yaml +38 -0
- package/engines/specs/deps_dev.yaml +21 -0
- package/engines/specs/digup.yaml +36 -0
- package/engines/specs/doi.yaml +39 -0
- package/engines/specs/douban_movie.yaml +22 -0
- package/engines/specs/dw_news.yaml +47 -0
- package/engines/specs/egov_law.yaml +21 -0
- package/engines/specs/elpais.yaml +43 -0
- package/engines/specs/endoflife.yaml +21 -0
- package/engines/specs/energy_charts.yaml +21 -0
- package/engines/specs/factcheck_org.yaml +52 -0
- package/engines/specs/faz.yaml +43 -0
- package/engines/specs/federal_register.yaml +57 -0
- package/engines/specs/firecrawl.yaml +53 -0
- package/engines/specs/flk_law.yaml +24 -0
- package/engines/specs/folha.yaml +43 -0
- package/engines/specs/france24.yaml +44 -0
- package/engines/specs/full_fact.yaml +47 -0
- package/engines/specs/fxtwitter.yaml +36 -0
- package/engines/specs/gbfs_nyc.yaml +32 -0
- package/engines/specs/gdacs.yaml +21 -0
- package/engines/specs/gdelt.yaml +64 -0
- package/engines/specs/gleif.yaml +55 -0
- package/engines/specs/google_news.yaml +22 -0
- package/engines/specs/gov_regulations.yaml +38 -0
- package/engines/specs/guardian_rss.yaml +59 -0
- package/engines/specs/hkex.yaml +40 -0
- package/engines/specs/hurriyet.yaml +43 -0
- package/engines/specs/iplant.yaml +25 -0
- package/engines/specs/jikan.yaml +24 -0
- package/engines/specs/jolpica.yaml +20 -0
- package/engines/specs/k10plus.yaml +20 -0
- package/engines/specs/keenable.yaml +44 -0
- package/engines/specs/keenable_free.yaml +36 -0
- package/engines/specs/lefigaro.yaml +43 -0
- package/engines/specs/listenbrainz.yaml +19 -0
- package/engines/specs/matichon.yaml +43 -0
- package/engines/specs/met_museum.yaml +21 -0
- package/engines/specs/nasa_images.yaml +45 -0
- package/engines/specs/netease_music.yaml +38 -0
- package/engines/specs/nhk.yaml +43 -0
- package/engines/specs/nhtsa_vpic.yaml +20 -0
- package/engines/specs/noaa_swpc.yaml +20 -0
- package/engines/specs/nvd.yaml +38 -0
- package/engines/specs/obis.yaml +20 -0
- package/engines/specs/opencitations.yaml +52 -0
- package/engines/specs/openf1.yaml +21 -0
- package/engines/specs/openfoodfacts.yaml +45 -0
- package/engines/specs/openligadb.yaml +20 -0
- package/engines/specs/openreview.yaml +37 -0
- package/engines/specs/openstd.yaml +21 -0
- package/engines/specs/people_daily.yaml +22 -0
- package/engines/specs/realtime_index.yaml +34 -0
- package/engines/specs/ror.yaml +20 -0
- package/engines/specs/satnogs.yaml +20 -0
- package/engines/specs/sec_edgar.yaml +46 -0
- package/engines/specs/shfe.yaml +39 -0
- package/engines/specs/skillsmp.yaml +50 -0
- package/engines/specs/sogou_weixin_browser.yaml +30 -0
- package/engines/specs/soilgrids.yaml +25 -0
- package/engines/specs/sspai.yaml +36 -0
- package/engines/specs/stackexchange.yaml +46 -0
- package/engines/specs/std_samr.yaml +21 -0
- package/engines/specs/tass.yaml +43 -0
- package/engines/specs/tavily_free.yaml +56 -0
- package/engines/specs/tle_mirror.yaml +21 -0
- package/engines/specs/train.yaml +37 -0
- package/engines/specs/tvmaze.yaml +20 -0
- package/engines/specs/twitter_syndication.yaml +31 -0
- package/engines/specs/un_comtrade.yaml +23 -0
- package/engines/specs/unpaywall.yaml +54 -0
- package/engines/specs/vnpress.yaml +43 -0
- package/engines/specs/weather.yaml +32 -0
- package/engines/specs/who_don.yaml +21 -0
- package/engines/specs/who_gho.yaml +20 -0
- package/engines/specs/wikimedia_commons.yaml +34 -0
- package/engines/specs/wikisource.yaml +22 -0
- package/engines/specs/worms.yaml +19 -0
- package/engines/specs/x_trending.yaml +34 -0
- package/engines/specs/yna.yaml +43 -0
- package/engines/specs/ynet.yaml +43 -0
- package/engines/specs/yuanbao.yaml +93 -0
- package/engines/specs/zbmath.yaml +40 -0
- package/engines/specs/zdic.yaml +22 -0
- package/engines/specs/zenodo.yaml +27 -0
- package/engines/specs/zhihu_hot_app.yaml +35 -0
- package/mcp/clients.yaml +106 -0
- package/package.json +55 -12
- package/packages/dsh-plugin/README.md +152 -0
- package/packages/dsh-plugin/cordis.patch.yml +48 -0
- package/packages/dsh-plugin/dsh/client.js +1533 -0
- package/packages/dsh-plugin/dsh/diagnostics.js +54 -0
- package/packages/dsh-plugin/dsh/index.js +527 -0
- package/packages/dsh-plugin/dsh/native-tools.mjs +749 -0
- package/packages/dsh-plugin/dsh/runner.js +666 -0
- package/packages/dsh-plugin/dsh/wide-research.js +878 -0
- package/packages/dsh-plugin/package.json +38 -0
- package/packages/dsh-plugin/scripts/sync-local.sh +70 -0
- package/packages/dsh-plugin/test/client.test.js +406 -0
- package/packages/dsh-plugin/test/config.test.js +30 -0
- package/packages/dsh-plugin/test/diagnostics.test.js +28 -0
- package/packages/dsh-plugin/test/index.test.js +1382 -0
- package/references/query-templates.md +96 -0
- package/references/query-templates.yaml +118 -0
- package/scripts/ab_eval.py +219 -0
- package/scripts/ab_eval_p0p1.py +266 -0
- package/scripts/adaptive.py +294 -70
- package/scripts/answer.py +154 -0
- package/scripts/archive_run.py +591 -0
- package/scripts/argo_engine_registry.py +172 -0
- package/scripts/argo_paths.py +728 -0
- package/scripts/article.py +136 -0
- package/scripts/article_meta.py +131 -0
- package/scripts/arxiv_source.py +201 -0
- package/scripts/badcase_ledger.py +252 -0
- package/scripts/batch_probe.py +241 -0
- package/scripts/benchmark.py +19 -0
- package/scripts/bounded_run.py +144 -0
- package/scripts/browser_auth.py +323 -0
- package/scripts/budget.py +247 -0
- package/scripts/budget_cli.py +93 -0
- package/scripts/build_release_assets.sh +65 -0
- package/scripts/burstiness_detector.py +147 -0
- package/scripts/cache.py +1066 -67
- package/scripts/cache_guard.py +271 -0
- package/scripts/cache_key_vdom.py +56 -0
- package/scripts/cache_similarity.py +170 -0
- package/scripts/caliber_isolation.py +195 -0
- package/scripts/calibrate_lowquality.py +210 -0
- package/scripts/candidate_envelope.py +366 -0
- package/scripts/chrome_cdp.py +871 -0
- package/scripts/ci_drift_gate.py +90 -0
- package/scripts/circuit_breaker.py +389 -0
- package/scripts/citations.py +334 -0
- package/scripts/cite_cli.py +59 -0
- package/scripts/cjk_tokens.py +95 -0
- package/scripts/clarify.py +47 -24
- package/scripts/cli_io.py +240 -0
- package/scripts/config.py +683 -45
- package/scripts/config_cache.py +402 -0
- package/scripts/conn_pool.py +220 -0
- package/scripts/content_boundary.py +46 -0
- package/scripts/content_security.py +685 -0
- package/scripts/content_signals.py +751 -0
- package/scripts/crawl.py +74 -35
- package/scripts/cross_lingual_trace.py +293 -0
- package/scripts/daemon.py +866 -0
- package/scripts/digup_bridge.py +214 -0
- package/scripts/dispatch_result.py +98 -0
- package/scripts/engine_admission.py +366 -0
- package/scripts/engine_dispatch.py +982 -0
- package/scripts/engine_env.py +539 -0
- package/scripts/engine_failure.py +411 -0
- package/scripts/engine_families.py +738 -0
- package/scripts/engine_policy.py +218 -0
- package/scripts/engine_requires.py +190 -0
- package/scripts/engine_status.py +322 -0
- package/scripts/engine_validate.py +638 -0
- package/scripts/engines.py +799 -294
- package/scripts/engines_base.py +1521 -0
- package/scripts/engines_builders.py +310 -0
- package/scripts/engines_builders_batch10.py +204 -0
- package/scripts/engines_builders_batch11.py +174 -0
- package/scripts/engines_builders_batch12.py +103 -0
- package/scripts/engines_builders_batch13.py +340 -0
- package/scripts/engines_builders_batch14.py +656 -0
- package/scripts/engines_builders_batch15.py +249 -0
- package/scripts/engines_builders_batch9.py +1468 -0
- package/scripts/engines_builders_cn.py +2283 -0
- package/scripts/engines_builders_data.py +2923 -0
- package/scripts/engines_builders_data_macro.py +775 -0
- package/scripts/engines_builders_feeds.py +255 -0
- package/scripts/engines_builders_intl.py +1239 -0
- package/scripts/engines_builders_keyless.py +111 -0
- package/scripts/engines_builders_search.py +440 -0
- package/scripts/engines_builders_tech.py +1359 -0
- package/scripts/evidence.py +620 -166
- package/scripts/evidence_loop.py +624 -0
- package/scripts/evidence_tier.py +298 -0
- package/scripts/except_sets.py +25 -0
- package/scripts/extract.py +55 -16
- package/scripts/fact_align.py +207 -0
- package/scripts/fact_crosscheck.py +230 -0
- package/scripts/fetch.py +25 -12
- package/scripts/fetch_browser.py +87 -0
- package/scripts/fetch_jsrun.py +122 -0
- package/scripts/fetch_quality.py +225 -0
- package/scripts/fetch_render_tinyfish.py +117 -0
- package/scripts/fetch_v3.py +1804 -0
- package/scripts/focus_extract.py +350 -0
- package/scripts/fulltext_store.py +169 -0
- package/scripts/fxtwitter_api.py +325 -0
- package/scripts/gen_engine_catalog.py +364 -0
- package/scripts/gen_native_tools.py +91 -0
- package/scripts/gen_routing_snapshot.py +195 -0
- package/scripts/health_check.py +140 -402
- package/scripts/health_probe.py +23 -8
- package/scripts/hot_state.py +134 -0
- package/scripts/http_client.py +1053 -0
- package/scripts/image_ops.py +430 -0
- package/scripts/image_vision/vision_probe.swift +126 -0
- package/scripts/install.ps1 +166 -0
- package/scripts/install.sh +221 -0
- package/scripts/job.py +1186 -0
- package/scripts/jump_resolver.py +235 -0
- package/scripts/lang_capability.py +150 -0
- package/scripts/lang_detect.py +289 -0
- package/scripts/lang_matrix_probe.py +329 -0
- package/scripts/lang_pref.py +311 -0
- package/scripts/link_source.py +340 -0
- package/scripts/local_image.py +970 -0
- package/scripts/local_seek.py +402 -0
- package/scripts/macro_countries.py +97 -0
- package/scripts/matrix_search_eval.py +1187 -0
- package/scripts/mcp_compact.py +234 -0
- package/scripts/mcp_diag.py +8 -3
- package/scripts/mcp_handlers.py +492 -0
- package/scripts/mcp_handlers_surface.py +157 -0
- package/scripts/mcp_launch.sh +124 -0
- package/scripts/mcp_local.py +241 -0
- package/scripts/mcp_server.py +125 -419
- package/scripts/mcp_setup.py +431 -0
- package/scripts/mcp_tools.py +331 -0
- package/scripts/mcp_transport.py +191 -0
- package/scripts/mcp_warm.py +127 -0
- package/scripts/min_version_scan.py +335 -0
- package/scripts/net_proxy.py +258 -0
- package/scripts/network_aware.py +152 -0
- package/scripts/output_transparency.py +200 -0
- package/scripts/paid_policy.py +98 -0
- package/scripts/paper.py +274 -0
- package/scripts/pdf_extract.py +518 -0
- package/scripts/phrase_filter.py +66 -0
- package/scripts/plan.py +422 -0
- package/scripts/postprocess_signals.py +150 -0
- package/scripts/pre-commit +48 -0
- package/scripts/query_enhance.py +157 -0
- package/scripts/query_operators.py +196 -0
- package/scripts/query_rewriter.py +116 -7
- package/scripts/query_signals.py +300 -0
- package/scripts/query_templates.py +167 -0
- package/scripts/query_understanding.py +411 -0
- package/scripts/query_variants.py +298 -0
- package/scripts/quota.py +633 -76
- package/scripts/rank_signals.py +775 -0
- package/scripts/ranking_eval.py +319 -0
- package/scripts/readability_extract.py +433 -0
- package/scripts/recompute.py +415 -0
- package/scripts/recovery.py +616 -0
- package/scripts/recovery_l0.py +160 -0
- package/scripts/recovery_runner.py +150 -0
- package/scripts/redskill/redskill_engine.py +332 -0
- package/scripts/regression_p0p1.py +318 -0
- package/scripts/replay_eval.py +658 -0
- package/scripts/rerank_tfidf.py +225 -0
- package/scripts/research.py +607 -403
- package/scripts/research_cli.py +361 -0
- package/scripts/research_dossier.py +492 -0
- package/scripts/research_expand.py +169 -0
- package/scripts/research_gates.py +272 -0
- package/scripts/research_report.py +209 -0
- package/scripts/research_strategy.py +37 -0
- package/scripts/research_work_packages.py +195 -0
- package/scripts/result_lang.py +311 -0
- package/scripts/retry_policy.py +76 -0
- package/scripts/robots_guard.py +259 -0
- package/scripts/route.py +921 -254
- package/scripts/route_bangs.py +40 -0
- package/scripts/route_cache.py +243 -0
- package/scripts/route_combo.py +917 -0
- package/scripts/route_domains.py +341 -0
- package/scripts/route_lang.py +605 -0
- package/scripts/route_log.py +63 -0
- package/scripts/route_policy.py +250 -0
- package/scripts/rrf_classic.py +66 -0
- package/scripts/screenshot.py +73 -0
- package/scripts/search.py +886 -406
- package/scripts/search_attribution.py +185 -0
- package/scripts/search_benchmark.py +407 -0
- package/scripts/search_cli.py +640 -0
- package/scripts/search_entry.py +395 -0
- package/scripts/search_output.py +690 -0
- package/scripts/search_pipeline.py +926 -0
- package/scripts/search_rank.py +991 -0
- package/scripts/search_types.py +129 -16
- package/scripts/seek_locator.py +68 -0
- package/scripts/semantic_evidence.py +391 -0
- package/scripts/serp_guard.py +336 -0
- package/scripts/serp_kill_log.py +74 -0
- package/scripts/single_flight.py +120 -0
- package/scripts/social_engines/__init__.py +10 -0
- package/scripts/social_engines/bilibili_engine.py +131 -0
- package/scripts/social_engines/hackernews_engine.py +113 -0
- package/scripts/social_engines/reddit_engine.py +172 -0
- package/scripts/social_engines/twitter_engine.py +397 -0
- package/scripts/social_engines/v2ex_engine.py +101 -0
- package/scripts/social_engines/weibo_engine.py +128 -0
- package/scripts/social_engines/xiaohongshu_engine.py +137 -0
- package/scripts/social_engines/zhihu_engine.py +139 -0
- package/scripts/social_research.py +201 -0
- package/scripts/sogou_weixin_browser.py +318 -0
- package/scripts/source_ledger.py +249 -0
- package/scripts/stage_timing.py +58 -0
- package/scripts/stats_cli.py +107 -0
- package/scripts/straggler_policy.py +60 -0
- package/scripts/stylometry_detector.py +231 -0
- package/scripts/sync_backends.py +353 -0
- package/scripts/sync_installs.py +29 -0
- package/scripts/template_cli.py +127 -0
- package/scripts/text_lexicon.py +72 -0
- package/scripts/tfidf_router.py +109 -37
- package/scripts/time_utils.py +233 -0
- package/scripts/topic_research_profiles.py +643 -0
- package/scripts/train.py +737 -0
- package/scripts/tweet.py +596 -0
- package/scripts/url_canon.py +217 -0
- package/scripts/url_optimize.py +56 -0
- package/scripts/url_safety.py +236 -0
- package/scripts/usage_log.py +116 -0
- package/scripts/usage_log_clean.py +113 -0
- package/scripts/v2ex_nodes.py +311 -0
- package/scripts/variant_recall.py +188 -0
- package/scripts/watch.py +205 -0
- package/scripts/wechat_article.py +258 -0
- package/scripts/wide_research.py +447 -0
- package/scripts/wx.py +349 -0
- package/scripts/x_article_fetch.py +141 -0
- package/scripts/x_search.py +234 -0
- package/scripts/x_trending.py +189 -0
- package/scripts/yaml_load.py +67 -0
- package/scripts/zhihu_quota.py +139 -0
- package/sub-skills/ego-search/SKILL.md +253 -0
- package/sub-skills/ego-search/scripts/ego_search.py +800 -0
- package/sub-skills/ego-search/scripts/merge.py +226 -0
- package/sub-skills/ego-search/scripts/quality.py +64 -0
- package/sub-skills/ego-search/scripts/runtime.py +172 -0
- package/sub-skills/ego-search/scripts/safety.py +109 -0
- package/sub-skills/ego-search/scripts/serp_spec.py +109 -0
- package/sub-skills/ego-search/scripts/webbridge_adapter.py +374 -0
- package/sub-skills/js-run/SKILL.md +67 -0
- package/sub-skills/js-run/scripts/jsrun.py +112 -0
- package/sub-skills/js-run/scripts/shim.js +188 -0
- package/sub-skills/local-search/SKILL.md +50 -53
- package/sub-skills/local-search/bm25.py +186 -0
- package/sub-skills/local-search/cli_runner.py +331 -0
- package/sub-skills/local-search/config.yaml +152 -55
- package/sub-skills/local-search/engine_registry.py +91 -26
- package/sub-skills/local-search/{health_check.py → local_health_check.py} +140 -10
- package/sub-skills/local-search/local_search_adapter.py +13 -2
- package/sub-skills/local-search/parse_maps.yaml +40 -42
- package/sub-skills/local-search/parsers.py +328 -0
- package/sub-skills/local-search/search_v3.py +716 -242
- package/sub-skills/local-search/smart_router.py +47 -7
- package/sub-skills/local-seek/SKILL.md +110 -0
- package/sub-skills/local-seek/config/domains.yaml +20 -0
- package/sub-skills/local-seek/scripts/eval_rank.py +216 -0
- package/sub-skills/local-seek/scripts/eval_seek.py +224 -0
- package/sub-skills/local-seek/scripts/seek.py +1465 -0
- package/sub-skills/local-seek/scripts/seek_frecency.py +126 -0
- package/sub-skills/local-seek/scripts/seek_fts.py +430 -0
- 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"
|