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
package/README.en.md
ADDED
|
@@ -0,0 +1,735 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/readme/hero.svg" width="100%" alt="Argo: search and deep research for agents — 272 search sources, routing by domain and language, absorbable evidence output">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<a href="README.md">中文</a> ·
|
|
7
|
+
<strong>English</strong> ·
|
|
8
|
+
<a href="README.ja.md">日本語</a> ·
|
|
9
|
+
<a href="README.ko.md">한국어</a> ·
|
|
10
|
+
<a href="README.es.md">Español</a>
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
<p align="center">
|
|
14
|
+
<a href="#what-it-is">Intro</a> ·
|
|
15
|
+
<a href="#why-its-stronger-than-built-in-search--ai-search--metasearch">Compare</a> ·
|
|
16
|
+
<a href="#query-shaped-routing">Proof</a> ·
|
|
17
|
+
<a href="#how-it-works">How it works</a> ·
|
|
18
|
+
<a href="#quick-start">Quick start</a> ·
|
|
19
|
+
<a href="#capabilities">Capabilities</a> ·
|
|
20
|
+
<a href="#install--config">Config</a> ·
|
|
21
|
+
<a href="#recent-updates">Recent updates</a>
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
<p align="center">
|
|
25
|
+
<img alt="license" src="https://img.shields.io/badge/license-Apache_2.0-blue">
|
|
26
|
+
<img alt="python" src="https://img.shields.io/badge/python-3.9+-green">
|
|
27
|
+
<img alt="version" src="https://img.shields.io/badge/version-2.9.8-informational">
|
|
28
|
+
<img alt="engines" src="https://img.shields.io/badge/engines-272-orange">
|
|
29
|
+
<img alt="mcp" src="https://img.shields.io/badge/MCP-19%20tools-purple">
|
|
30
|
+
</p>
|
|
31
|
+
|
|
32
|
+
> **Part of the taxueseek DeepSeek Harness plugin lineup** ([dsh-files](https://github.com/taxueseek/dsh-files) 39★). Same-author skill series: [session-digger](https://github.com/taxueseek/session-digger) 29★ · [taxue-invest](https://github.com/taxueseek/taxue-invest) 21★ · [taxueskills](https://github.com/taxueseek/taxueskills) 23★ · [taxue-creative-style](https://github.com/taxueseek/taxue-creative-style) 12★
|
|
33
|
+
|
|
34
|
+
# Argo: search and deep research for agents
|
|
35
|
+
|
|
36
|
+
## What it is
|
|
37
|
+
|
|
38
|
+
**Argo is a search and deep-research tool that lives inside your agent, and can also pull information from the relevant web pages. It connects to 272 search sources across 97 business domains, and also covers basic local file search. Among open-source search projects, its search capability is exceptionally strong.**
|
|
39
|
+
|
|
40
|
+
API keys are optional and improve quality (keyed sources are usually better; unkeyed ones are skipped automatically), with free engines and local engines as an automatic fallback. It covers 18 languages including Chinese, English, Japanese and Korean, and supports vertical scenarios such as finance, academia, film, sports, code and macro data.
|
|
41
|
+
|
|
42
|
+
## Sub-skills
|
|
43
|
+
|
|
44
|
+
Argo's capabilities are organized as four sub-skills, each a standalone pipeline:
|
|
45
|
+
|
|
46
|
+
| Sub-skill | Capability |
|
|
47
|
+
|-----------|------------|
|
|
48
|
+
| **local-search** | Local file search + local zero-cost aggregation engines (32 local engines). Search code symbols, filenames, document text and file structure. Can merge into web search results: flip one switch and local hits join the same search |
|
|
49
|
+
| **local-seek** | Local semantic search (BM25 + vector hybrid) for notes, memories and knowledge bases. Three layers: locate the file, read the context, then read the passage closely |
|
|
50
|
+
| **ego-search** | Logged-in professional search. Content behind logins on Zhihu, Xiaohongshu, WeChat public accounts and similar, searched with a real browser and a logged-in session. Off by default; turn it on when needed |
|
|
51
|
+
| **js-run** | Run web JS without a browser. Run environment-probe and pure-compute page scripts without opening a browser; median single-run context is about 1ms |
|
|
52
|
+
|
|
53
|
+
Together the four cover the full chain from local machine to open web to behind login walls. Most cases need only local-search plus web search; turn on ego-search and js-run for special cases.
|
|
54
|
+
|
|
55
|
+
## DSH plugin
|
|
56
|
+
|
|
57
|
+
Argo is also a DeepSeek Harness plugin. One line installs it:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
dsh plugin --profile web add "github:taxueseek/argo"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Restart `dsh web` and it takes effect. Search and fetch become native first-class tools: no MCP connection, no standing context overhead. There is also one `wide_research` parallel researcher and 19 MCP tools you can enable on demand. See integration forms below.
|
|
64
|
+
|
|
65
|
+
### Three invocation channels, one capability set
|
|
66
|
+
|
|
67
|
+
The same argo retrieval core (same engines, same compression, same guards) opens three channels inside DSH. They degrade automatically by host capability and back each other up:
|
|
68
|
+
|
|
69
|
+
| Channel | Default | What it does |
|
|
70
|
+
|---------|---------|--------------|
|
|
71
|
+
| **Native first-class tools** | On | `argo_search` / `argo_fetch` and friends register via `ctx.tools.register` and run as CLI single-shots (`--call`), reusing the exact engine and guard stack MCP uses — **no MCP connection, zero standing token overhead** |
|
|
72
|
+
| **Native web seam** | On | Registers `argo` as both a search and a fetch provider, so the host's built-in `web_search` routes to argo's engine chain and `web_fetch` to argo's fetch chain (HTTP first, auto-escalating to an anti-detection browser on Cloudflare / JS-rendered pages) |
|
|
73
|
+
| **MCP form** | On demand | The full 19-tool `mcp__argo__*` surface. Tool definitions are injected into context every round and survive compaction (measured ≈3.7K tokens/round for 19 tools), and the hot path is already covered by native tools and the web seam — so it is not mounted by default. Uncomment the `mcp-argo` line in the profile patch when you need the long-tail forensics tools |
|
|
74
|
+
|
|
75
|
+
There is also one `wide_research`: it plans complementary tracks (`depends_on` staggers them, parallel by default) → bounded concurrent subagent evidence gathering → a source ledger (only http(s) URLs are recorded) → a synthesis report. Output carries `quality_gate_results` (`conclusion_cap`: low/medium/high); when `passed=false` the wording is downgraded and the ledger sources are verified before any conclusion. The worker evidence-tool allowlist writes both MCP and native tool names (allow semantics), so it works whether or not MCP is mounted: with MCP it uses the full surface, without it falls back to `argo_search` / `argo_fetch` and the host's `web_search` / `web_fetch`.
|
|
76
|
+
|
|
77
|
+
For an everyday question use `argo_search`; for single-agent forensics use `argo_research`; for multi-perspective comparison with a citation ledger use `wide_research`. Workers can only call argo evidence tools by default and cannot call `argo_research` again (hard guard — user-level overrides do not work).
|
|
78
|
+
|
|
79
|
+
### Built-in settings page: six sections, effective on save
|
|
80
|
+
|
|
81
|
+
The plugin ships a browser-side settings page with two entries: the settings popup (`Cmd+,`) left-hand menu item "Argo", or Settings > Plugins > Argo (a summary card for the same panel — click to open).
|
|
82
|
+
|
|
83
|
+
<p align="center">
|
|
84
|
+
<img src="assets/readme/settings-tools.webp" width="100%" alt="Argo settings, Tools: 18 native tools to toggle — argo_search / argo_fetch on in the hot path, 16 long-tail tools on demand, with per-call timeout and returned-text cap">
|
|
85
|
+
</p>
|
|
86
|
+
|
|
87
|
+
<p align="center">
|
|
88
|
+
<img src="assets/readme/settings-engines.webp" width="100%" alt="Argo settings, Engines: argo's 28 behaviour switches moved into the panel — cache / TF-IDF rerank / numeric cross-check / MinHash dedup / SERP guard and dedup threshold; unconfigured rows show the default and changes apply immediately">
|
|
89
|
+
</p>
|
|
90
|
+
|
|
91
|
+
<p align="center">
|
|
92
|
+
<img src="assets/readme/settings-keys.webp" width="100%" alt="Argo settings, Keys: DeepSeek official search shows configured · credential store and shares one key with the host's web_search; common engine keys (Tencent Yuanbao / Tavily) can be set, updated or cleared, plaintext never echoed">
|
|
93
|
+
</p>
|
|
94
|
+
|
|
95
|
+
| Section | What it controls |
|
|
96
|
+
|---------|------------------|
|
|
97
|
+
| **Access** | `web_search` / `web_fetch` seam toggles; engine entry command and args (npx or local `mcp_server.py`); search/fetch timeouts, body cap, idle connection reclamation, concurrent connections |
|
|
98
|
+
| **Tools** | Toggles for the 18 native first-class tools (only `argo_search` / `argo_fetch` on by default); per-call timeout and returned-text cap |
|
|
99
|
+
| **Engines** | argo's own behaviour switches (formerly env vars, curated allowlist of 28: cache / TF-IDF rerank / numeric cross-check / MinHash dedup / SERP guard, Jina / mobile UA / Parallel fetch layer, semantic evidence layer, hedge grace and tail width, engine enable list, proxy, local search roots and read allowlist, warmup / usage log / connection pool / assorted TTLs). Switch-type changes apply immediately; number / text / list types save as a group; unconfigured rows show argo's default and are marked "default". Authorisation switches (recompute, intranet URLs) deliberately stay out of the panel |
|
|
100
|
+
| **Keys** | Set, update and clear common engine keys; shows "configured / unconfigured + source layer (credential store / startup env / .env) + read-only state", never echoing plaintext; each row has a Forward checkbox, equivalent to adding the reference name to `keyRefs` |
|
|
101
|
+
| **Research** | worker / track / sources-per-track / token caps and report output directory |
|
|
102
|
+
| **Advanced** | worker tool allow / deny lists, credential forward list |
|
|
103
|
+
|
|
104
|
+
Saving takes effect immediately (all volatile config): the native tool set is registered and unregistered per the toggles, timeouts / concurrency / research caps are read on the next call; engine switches are written as `argoEnv` (one `KEY=VALUE` per line) into the argo subprocess env and apply to the next new connection (pooled old connections are reclaimed by `searchIdleMs`, default 60s). Structural fields (`toolName`, `provider`, `searchProviderId`, `fetchProviderId`) are not in the settings page — they still go through the profile patch and need a restart.
|
|
105
|
+
|
|
106
|
+
**Key security**: keys are written to the DSH credential store (the same place as the Models page) — never into plugin config, never logged, never echoed. Credential resolution priority is **stored file layer > startup env > project .env > home .env**: saving in the panel (or the Models page) overrides older startup-env values, and the argo subprocess picks up the new key on the next new connection; Clear only deletes the credential-store value, so keys supplied by env vars or `.env` reappear. The settings page is only a write entry for the credential domain — reads are still performed by the host on every call.
|
|
107
|
+
|
|
108
|
+
**DeepSeek official key, supplied natively**: argo's `deepseek_search` engine (the official `api.deepseek.com/v1/tools/search`, whose results carry authority levels / rerank scores / publish times) **shares one key with DSH's official search backend**. The plugin obtains it through DSH's native credential seam, so no manual configuration is needed: resolution is `ctx.get('credentials').resolve('DEEPSEEK_API_KEY')`, resolved per call — after rotating the key on the web Models page the next new connection uses it, with no plugin restart. The plugin never reads key files, never writes to disk, never logs; the key value reaches the argo subprocess env in memory only, and no output or error message contains it. On older hosts without a credentials service it silently skips: that engine is disabled for lack of a key, and the other 263 sources are unaffected.
|
|
109
|
+
|
|
110
|
+
**The web seam pin is required reading** (a missing pin breaks `web_fetch`): the host `dsh-web` provider selection rule is "configured id wins; if none is configured and exactly one is available, pick it; **if more than one is available, fail with `WEB_PROVIDER_AMBIGUOUS`**". The web profile ships an official http fetch provider by default (keyless, always available), and this bundle registers another — so without a pin there are two available and **`web_fetch` breaks entirely** (same for `web_search` if the profile has another search provider). Any profile with the web seam enabled must therefore specify explicitly on the web service line:
|
|
111
|
+
|
|
112
|
+
```yaml
|
|
113
|
+
- id: web
|
|
114
|
+
config:
|
|
115
|
+
searchProvider: argo # required when the search seam is enabled (it is by default)
|
|
116
|
+
fetchProvider: argo # required when the fetch seam is enabled (it is by default)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
`searchProviderEnabled: false` / `fetchProviderEnabled: false` turn the corresponding seam off entirely (the provider is still registered but not selectable, and the other is unaffected). On the engine side, anonymously usable engines such as Firecrawl work **keyless out of the box** (free-tier quota), engines with a configured key automatically upgrade to authenticated requests, and a missing key does not block routing.
|
|
120
|
+
|
|
121
|
+
> Full configuration options, the Compatibility version table and uninstall steps are in [packages/dsh-plugin/README.md](packages/dsh-plugin/README.md).
|
|
122
|
+
|
|
123
|
+
## Core strengths
|
|
124
|
+
|
|
125
|
+
**272 sources, 235 keyless and ready out of the box.** Runs without any API key; free and local engines fall back automatically. Keyed sources are usually better, and unkeyed ones are skipped automatically. One install covers every scenario.
|
|
126
|
+
|
|
127
|
+
**Local and web search in one.** This is a capability only Argo has. Local file search is built on the same tools developers use daily, rg and mdfind: code symbols, filenames, document text and file structure. Flip one switch and local hits join the same web search results, labelled with the local file as the source. When you remember writing something six months ago but forget where, this beats digging through folders.
|
|
128
|
+
|
|
129
|
+
**Two-layer cache, ~10ms for hot queries.** For content whose freshness matters less (encyclopedia entries, historical data), the first query populates the cache and the same query then hits it directly instead of going through the API again. Saves money and time.
|
|
130
|
+
|
|
131
|
+
**Multilingual and vertical.** Tested across 18 languages; Chinese, English and Japanese reach local first-party sources. Papers go to academic databases, film to title databases, code to Q&A communities, market quotes to financial sources. Only broad questions go to generic search.
|
|
132
|
+
|
|
133
|
+
## Install and run
|
|
134
|
+
|
|
135
|
+
Zero config works. Three ways to install, pick your habit:
|
|
136
|
+
|
|
137
|
+
**Want your AI assistant to search on its own**: install the skill package into its skills directory. Then when you say "look this up" or "verify this", it goes and searches.
|
|
138
|
+
|
|
139
|
+
**Want to try it casually**: one npx command, no install needed.
|
|
140
|
+
|
|
141
|
+
**Want it always on**: attach it over MCP, 19 retrieval tools ready. There is also a one-command injector that configures Claude Code, Cursor and Windsurf automatically; Codex, OpenCode and Cline are on the list too. Your config is backed up before writing, so you can always roll back.
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
# Option 1: install script (recommended for long-term local use)
|
|
145
|
+
curl -fsSL https://raw.githubusercontent.com/taxueseek/argo/main/scripts/install.sh | bash
|
|
146
|
+
|
|
147
|
+
# Option 2: npx on demand (recommended for quick agent attachment)
|
|
148
|
+
npx -y github:taxueseek/argo
|
|
149
|
+
|
|
150
|
+
# Option 3: git clone (development / editing source)
|
|
151
|
+
git clone https://github.com/taxueseek/argo.git
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Try one query right after install:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
argo search "python asyncio error handling"
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
What you get is questions from StackOverflow's official API, ranked by community score and marked with accepted status, not a pile of SEO farms.
|
|
161
|
+
|
|
162
|
+
To see how many sources are available on your machine right now:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
argo search --list-engines
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Integration forms
|
|
169
|
+
|
|
170
|
+
Argo supports four integration forms; pick by scenario:
|
|
171
|
+
|
|
172
|
+
| Form | Best for | Notes |
|
|
173
|
+
|------|----------|-------|
|
|
174
|
+
| **MCP Server** | Always-on agent attachment | 19 retrieval tools ready; one command injects Claude Code / Cursor / Windsurf / Codex / OpenCode / Cline, config backed up first |
|
|
175
|
+
| **DSH plugin** | DeepSeek Harness users | One line `dsh plugin add`; search and fetch become native first-class tools, no MCP connection, no standing context overhead; ships a six-section settings page effective on save |
|
|
176
|
+
| **Skill files** | Claude Code / Grok Build / Kimi, etc. | Drop the skill package into the agent's skills directory; say "look this up" or "verify this" and it searches |
|
|
177
|
+
| **npx on demand** | Quick trial | `npx -y github:taxueseek/argo`, no install, good for temporarily attaching MCP to any client |
|
|
178
|
+
|
|
179
|
+
All four forms run the same Python code underneath; CLI and MCP tools map one to one, so no form lacks capability.
|
|
180
|
+
|
|
181
|
+
## Why it's stronger than built-in search / AI search / metasearch
|
|
182
|
+
|
|
183
|
+
> In short: the first three help **people** find information. Argo helps **agents** search and verify in one pipeline. The difference is the deliverable: a summary page or link list for humans vs ranked, reviewable, context-safe evidence for agents.
|
|
184
|
+
|
|
185
|
+
<p align="center">
|
|
186
|
+
<img src="assets/readme/why-better.svg" width="100%" alt="Left: three default searches made for humans; right: Argo's absorbable evidence JSON for agents">
|
|
187
|
+
</p>
|
|
188
|
+
|
|
189
|
+
| Dimension | Model built-in search | AI search (summaries) | Metasearch / engines | **Argo** |
|
|
190
|
+
|-----------|----------------------|------------------------|----------------------|----------|
|
|
191
|
+
| Result shape | Stitched long text | Human summary page | SERP link list | **Compact JSON: evidence candidates + credibility breakdown** |
|
|
192
|
+
| Vertical questions (quotes / formulas) | Generic web | Generic web then summarize | Generic web | **Direct vertical sources, answer-shaped** |
|
|
193
|
+
| Evidence credibility | No score | No structured score | No score | **selection · absorption · freshness · consensus** |
|
|
194
|
+
| Repeat queries | Hit the network every time | Hit the network every time | Page cache | **Two-layer cache (memory + SQLite); hot queries ~10ms** |
|
|
195
|
+
| Cost control | Uncontrollable | Expensive per call | Free but laborious | **Budget modes; free first; keys all optional** |
|
|
196
|
+
| Multilingual | Follows the model | Follows the model | Follows the engine | **Language detect + engine locale params + multilingual routing** |
|
|
197
|
+
|
|
198
|
+
> Mechanically, Argo treats search as an **evidence pipeline**: language detect → domain route → multi-engine recall → RRF fuse → evidence skim. The output is material an agent can rank, `fetch` to verify, and keep inside context.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## What changed in search by 2026
|
|
203
|
+
|
|
204
|
+
1. **From links to evidence.** Agents need structured material they can rank, verify and fit in context — Argo returns credibility-decomposed JSON, not SERP lists.
|
|
205
|
+
2. **Context is the first cost.** A single page scrape can burn 10k+ tokens; Argo's agent profile is ~3.7KB per call, with field sets and byte budgets pinned by gates.
|
|
206
|
+
3. **Sites now prepare content for AI.** llms.txt and `.md` direct-out are spreading across major doc sites — Argo's fetch chain probes them at level 0, with an r.jina.ai reader fallback.
|
|
207
|
+
4. **The free/open ecosystem is enough.** Government, academic, standards and security open APIs plus keyless engines cover most domains (235 keyless sources).
|
|
208
|
+
5. **Quality is measurable.** Ranking golden floors, fusion-ablation gates and negative routing controls — "is this version better" is now a number, not a vibe.
|
|
209
|
+
|
|
210
|
+
> All five are already shipped across the v2.9.x line: 272 sources, 97 domains, 235 keyless out of the box. Details in [docs/为什么选择argo.md](docs/为什么选择argo.md).
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Query-shaped routing
|
|
215
|
+
|
|
216
|
+
<p align="center">
|
|
217
|
+
<img src="assets/readme/proof-routes.svg" width="100%" alt="Four real routes: finance, film, multilingual, geo">
|
|
218
|
+
</p>
|
|
219
|
+
|
|
220
|
+
| You ask | What tends to happen |
|
|
221
|
+
|---------|----------------------|
|
|
222
|
+
| python asyncio error handling | Coding-QA domain → StackOverflow/StackExchange official API, with score & accepted-answer markers |
|
|
223
|
+
| AAPL / US pre-market | US equities domain, split from A-shares |
|
|
224
|
+
| 肖申克的救赎 主演 / Inception director | Film domain → IMDb etc. |
|
|
225
|
+
| 梅西 俱乐部 / 库里 球队 | Sports domain → TheSportsDB etc. |
|
|
226
|
+
| 埃菲尔铁塔在哪 / where is Eiffel Tower | Geo entity → OpenStreetMap etc. |
|
|
227
|
+
| NASA founding year / 国务院职能 | Org entity → Wikidata etc. |
|
|
228
|
+
| 周杰伦 专辑 / Taylor Swift album | Media domain → iTunes etc. |
|
|
229
|
+
| アニメ おすすめ / 한국 영화 추천 | Detect JA/KO → language-friendly sources; avoid Chinese-only sites |
|
|
230
|
+
| US CPI, Japan inflation | Macro domain; country split (national authoritative sources first) |
|
|
231
|
+
| log4j CVSS / nodejs 22 end of life | Security → NVD official; lifecycle → endoflife.date |
|
|
232
|
+
| attention is all you need | Academic → arXiv/OpenAlex/CrossRef metadata with DOI links |
|
|
233
|
+
| 阿司匹林 分子式 | Chemistry → PubChem-style answers |
|
|
234
|
+
| TSMC valuation debate (deep research) | Sub-questions + parallel sources; verticals boosted |
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## How it works
|
|
239
|
+
|
|
240
|
+
<p align="center">
|
|
241
|
+
<img src="assets/readme/workflow.svg" width="100%" alt="Query → language & domain → multi-engine recall → RRF → evidence → unified JSON">
|
|
242
|
+
</p>
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
query
|
|
246
|
+
├─ intent clarify (optional)
|
|
247
|
+
├─ query rewrite (optional; routing still sees original intent)
|
|
248
|
+
├─ language detect + language preference
|
|
249
|
+
├─ route (domain rules + TF-IDF + budget + lang supplements + hot-path cache)
|
|
250
|
+
├─ multi-engine recall (circuit breaker / negative cache / parallel)
|
|
251
|
+
├─ staged empty-result recovery (widen → same family/general → cross-lang; anti-pollution)
|
|
252
|
+
├─ RRF fusion + optional re-rank
|
|
253
|
+
├─ evidence skim (authority · density · freshness · consensus)
|
|
254
|
+
└─ unified JSON (incl. engine_outcomes / recovery)
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Evidence scoring (short)
|
|
258
|
+
|
|
259
|
+
```
|
|
260
|
+
selection ≈ domain authority; SERP / redirect shells ranked very low
|
|
261
|
+
absorption ≈ density of numbers / definitions / comparisons / disclosures
|
|
262
|
+
freshness ≈ publish time (ignores historical comparison years like “since 2015”)
|
|
263
|
+
composite ≈ 0.40·selection + 0.35·absorption + 0.15·freshness + 0.10·engine score
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Results include `selection`, `absorption`, `credibility_fast`, `evidence_flags`, etc. so agents can sort directly.
|
|
267
|
+
|
|
268
|
+
### Agent discipline (recommended)
|
|
269
|
+
|
|
270
|
+
1. **High-stakes questions** (positions, safety, “is this true?”): search → read fast scores → `fetch` top hits → then conclude
|
|
271
|
+
2. **Numbers**: state the计算方式 (definition/scope); when sources conflict, list them—don’t force a merge
|
|
272
|
+
3. **SERP / redirect pages**: never treat as primary sources
|
|
273
|
+
4. **Social posts**: sentiment and narrative, not ground truth
|
|
274
|
+
5. **Fact-check**: prefer a few stratified queries (source / comparison / subject)
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Quick start
|
|
279
|
+
|
|
280
|
+
Pick any path. **GitHub is the only install source of truth** (`npx github:taxueseek/argo` or `install.sh`); current recommendation **v2.9.8**. **Do not `npm install argo-search`** — the npm registry copy is an **unofficial stale v1.0.1** (not this repo, incomplete, not updated). This package sets `private: true` so it is not published to npm by mistake.
|
|
281
|
+
|
|
282
|
+
**Zero-config works**: without API keys, free engines + local `local_*` engines run; keyed engines are skipped when missing (and usually better when present).
|
|
283
|
+
|
|
284
|
+
### Option 1: Install script (best for long-term local use)
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
curl -fsSL https://raw.githubusercontent.com/taxueseek/argo/main/scripts/install.sh | bash
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
Custom home + Skill link:
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
curl -fsSL https://raw.githubusercontent.com/taxueseek/argo/main/scripts/install.sh \
|
|
294
|
+
| bash -s -- --home "$HOME/.local/share/argo" --link "$HOME/.claude/skills/argo"
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Verify:
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
python3 ~/.local/share/argo/scripts/search.py "python asyncio error handling" --json
|
|
301
|
+
python3 ~/.local/share/argo/scripts/search.py --list-engines
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### Option 2: MCP from GitHub (fast agent attach)
|
|
305
|
+
|
|
306
|
+
Needs **Node.js 18+** and **Python 3.9+**. Once:
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
pip3 install pyyaml
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
```bash
|
|
313
|
+
npx -y github:taxueseek/argo
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
Client config (Claude Code / Cursor / Kimi, etc.):
|
|
317
|
+
|
|
318
|
+
```json
|
|
319
|
+
{
|
|
320
|
+
"mcpServers": {
|
|
321
|
+
"argo": {
|
|
322
|
+
"command": "npx",
|
|
323
|
+
"args": ["-y", "github:taxueseek/argo"]
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
More stable, no Node: install via Option 1, point at local Python:
|
|
330
|
+
|
|
331
|
+
```json
|
|
332
|
+
{
|
|
333
|
+
"mcpServers": {
|
|
334
|
+
"argo": {
|
|
335
|
+
"command": "python3",
|
|
336
|
+
"args": ["/path/to/argo/scripts/mcp_server.py"]
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Unusual Python path: `export ARGO_PYTHON=/path/to/python3` (read by the npx entry only).
|
|
343
|
+
|
|
344
|
+
### DeepSeek Harness one-line plugin
|
|
345
|
+
|
|
346
|
+
Two install paths inside DeepSeek Harness:
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
# A: 19 mcp__argo__* tools (main-package bundle, same as full MCP)
|
|
350
|
+
dsh plugin --profile web add "github:taxueseek/argo"
|
|
351
|
+
|
|
352
|
+
# B: search tools + wide_research parallel research orchestration (subpackage)
|
|
353
|
+
dsh plugin --profile web add "github:taxueseek/argo#main&path:packages/dsh-plugin"
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
Restart `dsh web` after install. See `packages/dsh-plugin/`.
|
|
357
|
+
|
|
358
|
+
### Option 3: git clone (dev / patch source)
|
|
359
|
+
|
|
360
|
+
```bash
|
|
361
|
+
git clone https://github.com/taxueseek/argo.git
|
|
362
|
+
cd argo
|
|
363
|
+
pip3 install pyyaml
|
|
364
|
+
bash scripts/install.sh --link ~/.claude/skills/argo # optional
|
|
365
|
+
python3 scripts/search.py --list-engines
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
## Platforms
|
|
371
|
+
|
|
372
|
+
| Platform | Integration | Notes |
|
|
373
|
+
|----------|-------------|-------|
|
|
374
|
+
| **Claude Code** | MCP / Skill link | `npx` or `mcp_server.py`; `link_source.py` ok |
|
|
375
|
+
| **Kimi / Grok Build** | MCP Server | same |
|
|
376
|
+
| **Cursor / Cline / Continue** | MCP | any MCP-capable IDE plugin |
|
|
377
|
+
| **CLI** | `search.py` / `bin/argo` | scripts, cron, manual debug |
|
|
378
|
+
| **Python projects** | `from search import super_search` | library call |
|
|
379
|
+
|
|
380
|
+
### Post-install check
|
|
381
|
+
|
|
382
|
+
```bash
|
|
383
|
+
python3 --version # 3.9+
|
|
384
|
+
python3 -c "import yaml; print('PyYAML OK')"
|
|
385
|
+
python3 -m pytest tests/test_unit.py -q # optional
|
|
386
|
+
python3 scripts/search.py --list-engines
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## Capabilities
|
|
392
|
+
|
|
393
|
+
| Capability | What it does | Entry |
|
|
394
|
+
|------------|--------------|-------|
|
|
395
|
+
| Unified search | route → recall → fuse → skim score | `search.py` / `argo_search` |
|
|
396
|
+
| Local file search | on-disk code/notes/memory (offline) | `argo_local_search` |
|
|
397
|
+
| Local text preview | whitelist-dir preview (fail-closed) | `argo_local_read` |
|
|
398
|
+
| Recompute | sandboxed numeric recalc (deny by default) | `argo_recompute` |
|
|
399
|
+
| Deep research | sub-questions, multi-source, gap hints | `research.py` / `argo_research` |
|
|
400
|
+
| Credibility | authority / density / freshness / cross-check | `evidence.py` / `argo_evidence` |
|
|
401
|
+
| Intent clarify | polysemy, brand collisions, strategy hints | `clarify.py` / `argo_clarify` |
|
|
402
|
+
| Page fetch | HTTP first, browser fallback when needed | `argo_fetch` (`mode=extract` for structure) |
|
|
403
|
+
| Screenshot / PDF | page shots, structured PDF extract | `argo_screenshot` / `argo_pdf` |
|
|
404
|
+
| Site crawl | list-page batch crawl | `argo_crawl` |
|
|
405
|
+
| Query operators | `site:` / `-site:` / `-term` / `-"phrase"` / `"phrase"` / `lang:` / `after:` / `before:` stripped from routing and retrieval (details in references/usage.md) | write directly in the query |
|
|
406
|
+
| Trust signals | `authority_level` discrete grade (0-4, >=3 highly authoritative) + `summary` agent-grade digest (backfilled after verification) | result fields, visible via `--fields agent` |
|
|
407
|
+
| Social / sentiment | Weibo / Xiaohongshu / Bilibili / Reddit / X … | `argo_social_search` |
|
|
408
|
+
| DSH native tools | once installed as a DSH plugin, `argo_search` / `argo_fetch` and friends become first-class host tools running as CLI single-shots with zero standing token overhead | call directly after `dsh plugin add` |
|
|
409
|
+
| DSH web seam | the host's built-in `web_search` / `web_fetch` route to argo's engine and fetch chains (HTTP first, auto-escalating to a browser on Cloudflare / JS-rendered pages) | registered by default by the plugin; pin `searchProvider` / `fetchProvider` in the profile |
|
|
410
|
+
| DSH settings page | six sections — Access / Tools / Engines / Keys / Research / Advanced — effective on save; keys go to the host credential store and are never echoed | settings popup `Cmd+,` → left menu "Argo" |
|
|
411
|
+
|
|
412
|
+
### Budget modes
|
|
413
|
+
|
|
414
|
+
| Mode | Best for | Behavior |
|
|
415
|
+
|------|----------|----------|
|
|
416
|
+
| `fast` | simple Q, need speed | free engines first; skip paid re-rank |
|
|
417
|
+
| `auto` | daily default | cost-aware quality/spend tradeoff |
|
|
418
|
+
| `deep` | research, surveys | quality first; more engines allowed |
|
|
419
|
+
| `budget` | tight quota | quota control; degrade when exhausted |
|
|
420
|
+
|
|
421
|
+
### Rough capability set (v2.9.8)
|
|
422
|
+
|
|
423
|
+
What Argo does, in one sentence: it sends each question to the right sources by domain and language, ranks what comes back by credibility, and hands the agent material it can sort and verify. Search, fetch, evidence checking and local file search share one pipeline, the 19 MCP tools map one-to-one onto CLI commands, so nothing is missing whichever form you install. A few standalone commands round it out: argo tweet packs an X post, argo auth handles login state, argo job aggregates job listings. The full catalog, with cost, key and status per source, sits in docs/ENGINE_CATALOG.md: **272 sources (235 usable with no key), 97 domains**.
|
|
424
|
+
|
|
425
|
+
Installed as a DSH plugin, these capabilities become native host tools: the hot-path search and fetch are on by default, the long-tail forensics tools toggle on in the settings page, and argo's own 28 behaviour switches (cache, rerank, dedup, guard, proxy, TTLs and the rest) moved out of environment variables and into the panel. Keys go into the host credential store, are never echoed, and every change takes effect on save.
|
|
426
|
+
|
|
427
|
+
The last few releases each fixed one class of problems.
|
|
428
|
+
|
|
429
|
+
v2.9.8 is a routing-precision and feedback-loop release. The three problems in issue #18 — "latest" being routed into realtime news, people_daily returning its default feed when nothing matches, and local_bing matching only "2026" — were all reproduced and fixed. Replaying real queries along the same lines tightened 16 more classes of false triggers: "snow" inside brand names, "Volcano Engine" inside product names, UI-troubleshooting "icons", "code" inside business/finance field names, and "exchange rate" inside code/library queries. A SERP coverage gate and CJK cross-validation now stop "it returned something" from counting as "it is relevant". Thanks to @wpp666 for the reproduction and diagnosis.
|
|
430
|
+
|
|
431
|
+
v2.9.7 fixed three long-standing ones. When an AI inside a DSH host asked to read a URL, the host used its own fetcher, so short-link redirects and JS challenge pages often failed outright while argo's fetch chain sat unused; this release wires the host's reads through argo, and those pages go from failing to succeeding, with static pages unchanged. The routing candidate pool used to hold 18 explicit-only engines, and if one was ever auto-selected the only paid engine would quietly bill you; the pool is clean now, and using them requires saying so. Every engine success used to take a file lock and rewrite breaker state on disk; healthy engines now cost zero file I/O, and multi-engine accounting commits in one transaction. The license also moved from MIT to Apache-2.0, which sits easier with commercial users.
|
|
432
|
+
|
|
433
|
+
After that the DSH plugin gained another layer: the settings page grew from five sections to six, the new "Engines" section brings argo's behaviour switches into the panel (they used to be env-var only), the keys page now shows whether each key comes from the credential store, the startup environment or `.env`, and tool toggles, timeouts, concurrency and research caps all apply on save. Cancellation now reaches the connection-establishment stage too — when the AI stops mid-flight, an argo subprocess that is still being spawned is killed immediately instead of waiting out its timeout.
|
|
434
|
+
|
|
435
|
+
v2.9.6 handled query operators and the transport layer. A query like site:github.com foo used to have its operator treated as a plain word, or parsed but never applied; a contract layer now strips operators before routing and caching, applies site: as a real filter, and folds it into the cache key, so two searches don't bleed into each other. On transport, every POST used to re-pay the TLS handshake, 320 to 561 ms of it; with connections pooled, a resident MCP process saves that on every query. This release also added the official DeepSeek search engine, billed per call and kept out of the everyday combos.
|
|
436
|
+
|
|
437
|
+
v2.9.5 added FX rates and tightened dedup. Asking for the USD/CNY rate used to spin through the macro domain and land on an encyclopedia entry, 1.4 s with no answer; a dedicated fx domain now answers in 675 ms with the live rate and daily news. Dedup gained site-suffix normalization and a fuzzy second pass, so official docs with separators in the title stop getting pushed to the back.
|
|
438
|
+
|
|
439
|
+
v2.9.4 fixed the explicit-engine path. Pinning --engine X used to get a blanket cache TTL; with domain determination in place, the TTL follows the domain, and a missing fallback engine no longer triggers an empty re-run of the same engine.
|
|
440
|
+
|
|
441
|
+
Per-version detail lives in "Recent updates"; release notes for each version are in docs/.
|
|
442
|
+
---
|
|
443
|
+
|
|
444
|
+
## Engines & routing
|
|
445
|
+
|
|
446
|
+
Config currently has **272** sources (**235** usable with no key) and **97** domains (see `config.yaml` and `--list-engines`).
|
|
447
|
+
|
|
448
|
+
### Direct & vertical (excerpt)
|
|
449
|
+
|
|
450
|
+
| Engine | Scenario | Cost bias |
|
|
451
|
+
|--------|----------|-----------|
|
|
452
|
+
| anysearch / duckduckgo | general / tech | free |
|
|
453
|
+
| sina_quote / tencent_quote / eastmoney | A-share quotes / flows | free |
|
|
454
|
+
| finviz / seeking_alpha | US & overseas finance | depends |
|
|
455
|
+
| imdb / itunes / thesportsdb | film / music / sports | mostly free |
|
|
456
|
+
| local_openstreetmap / wikidata / wikipedia | geo / org / encyclopedia | free |
|
|
457
|
+
| arxiv / semantic_scholar / openalex | academic | mostly free |
|
|
458
|
+
| pubchem / gbif / rfc_editor | chemistry / species / standards | free |
|
|
459
|
+
| github / stackoverflow / pypi / npm | code & packages | depends |
|
|
460
|
+
| byted / bocha / metaso / octen / yuanbao | Chinese web / AI search | API / low cost |
|
|
461
|
+
| hkex / shfe / cfets / defillama / gleif | HKEX announcements / SHFE / RMB central parity / DeFi / legal entity IDs | Free |
|
|
462
|
+
| zhihu / wechat_sogou | Chinese opinion / WeChat | API / free |
|
|
463
|
+
| tavily / felo / exa | international / semantic | paid or quota |
|
|
464
|
+
| twitter / reddit / xiaohongshu / bilibili / weibo | social UGC | free (some need login) |
|
|
465
|
+
|
|
466
|
+
### Local zero-cost layer (`local_*`)
|
|
467
|
+
|
|
468
|
+
No separate SearXNG service. Main path uses in-process HTML / RSS / JSON parsing (`local_bing`, `local_sogou`, `local_google`, `local_arxiv`, …). For **multilingual queries**, routing rewrites engine language params (e.g. Bing `setlang`) and fuses with RRF.
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
## Examples
|
|
473
|
+
|
|
474
|
+
### Finance
|
|
475
|
+
|
|
476
|
+
```bash
|
|
477
|
+
python3 scripts/search.py "python asyncio error handling" --explain
|
|
478
|
+
# typical: stock_query → quote snapshot sources
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### Academic
|
|
482
|
+
|
|
483
|
+
```bash
|
|
484
|
+
python3 scripts/search.py "transformer attention mechanism paper" --json
|
|
485
|
+
# domain often academic; combo includes arxiv etc.
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
### Research & verify
|
|
489
|
+
|
|
490
|
+
```bash
|
|
491
|
+
python3 scripts/research.py "2026 mutual fund Q2 holdings structure" --depth deep --json
|
|
492
|
+
|
|
493
|
+
python3 scripts/search.py "same query" --json | \
|
|
494
|
+
python3 scripts/evidence.py "same query" --stdin --json
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
### MCP tools (12)
|
|
498
|
+
|
|
499
|
+
| Tool | Purpose |
|
|
500
|
+
|------|---------|
|
|
501
|
+
| `argo_search` | unified search |
|
|
502
|
+
| `argo_local_search` | local files (offline) |
|
|
503
|
+
| `argo_local_read` | whitelist local text preview (fail-closed) |
|
|
504
|
+
| `argo_recompute` | sandboxed recalc (deny by default; needs auth) |
|
|
505
|
+
| `argo_research` | deep research (incl. social-sentiment mode) |
|
|
506
|
+
| `argo_evidence` | credibility scoring |
|
|
507
|
+
| `argo_clarify` | intent disambiguation |
|
|
508
|
+
| `argo_fetch` | smart fetch (`mode=extract` structured extract) |
|
|
509
|
+
| `argo_crawl` | site crawl |
|
|
510
|
+
| `argo_screenshot` | page screenshot |
|
|
511
|
+
| `argo_pdf` | PDF extract |
|
|
512
|
+
| `argo_social_search` | multi-platform social (`mode=sentiment`) |
|
|
513
|
+
|
|
514
|
+
---
|
|
515
|
+
|
|
516
|
+
## Install & config
|
|
517
|
+
|
|
518
|
+
### Requirements
|
|
519
|
+
|
|
520
|
+
| Item | Requirement |
|
|
521
|
+
|------|-------------|
|
|
522
|
+
| Python | 3.9+ (CLI + MCP core) |
|
|
523
|
+
| Deps | `pip install pyyaml` (only hard dependency) |
|
|
524
|
+
| Node.js | **only** for `npx` entry, 18+ |
|
|
525
|
+
| SearXNG | not required (built-in local engines) |
|
|
526
|
+
|
|
527
|
+
### API keys (all optional)
|
|
528
|
+
|
|
529
|
+
Missing keys skip that engine; free engines backstop. **Use env vars**—never commit real keys or paste them into issues.
|
|
530
|
+
|
|
531
|
+
```bash
|
|
532
|
+
# recommended (better quality)
|
|
533
|
+
export TAVILY_API_KEY="your_key"
|
|
534
|
+
export BOCHA_API_KEY="your_key"
|
|
535
|
+
export METASO_API_KEY="your_key"
|
|
536
|
+
export ZHIHU_ACCESS_SECRET="your_key"
|
|
537
|
+
|
|
538
|
+
# optional
|
|
539
|
+
export BRAVE_API_KEY="your_key"
|
|
540
|
+
export FELO_API_KEY="your_key"
|
|
541
|
+
export GITHUB_TOKEN="your_key"
|
|
542
|
+
export WEB_SEARCH_API_KEY="your_key"
|
|
543
|
+
export ANYSEARCH_API_KEY="your_key"
|
|
544
|
+
export OCTEN_API_KEY="your_key"
|
|
545
|
+
export ARGO_KEENABLE_API_KEY="your_key" # optional; Keenable free trial
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
`config.yaml` only stores `{ENV_NAME}` placeholders—no plaintext secrets in git.
|
|
549
|
+
|
|
550
|
+
### Cache
|
|
551
|
+
|
|
552
|
+
Default SQLite path is `cache.db_path` in `config.yaml` (usually `~/.cache/unified-search/cache.db`).
|
|
553
|
+
|
|
554
|
+
| Type | Approx. TTL |
|
|
555
|
+
|------|-------------|
|
|
556
|
+
| Finance | ~5 min |
|
|
557
|
+
| News / realtime | ~10–15 min |
|
|
558
|
+
| General | ~1 hour |
|
|
559
|
+
| Research / evergreen | ~2–24 hours |
|
|
560
|
+
| Empty results | very short (avoid freezing “no hits”) |
|
|
561
|
+
|
|
562
|
+
### FAQ
|
|
563
|
+
|
|
564
|
+
**Works without API keys?**
|
|
565
|
+
Yes. Many local free engines and free APIs; unkeyed path is automatic.
|
|
566
|
+
|
|
567
|
+
**Install script vs npx?**
|
|
568
|
+
Script: fixed local install, config, Skill link. npx: attach MCP fast. Same Python core.
|
|
569
|
+
|
|
570
|
+
**How to check engines?**
|
|
571
|
+
`python3 scripts/search.py --list-engines`, or add `--explain`.
|
|
572
|
+
|
|
573
|
+
**Multiple code copies in the repo?**
|
|
574
|
+
No. Prefer one source + symlinks via `link_source.py`, not rsync clones.
|
|
575
|
+
|
|
576
|
+
---
|
|
577
|
+
|
|
578
|
+
## CLI flags
|
|
579
|
+
|
|
580
|
+
```
|
|
581
|
+
python3 scripts/search.py [options] query
|
|
582
|
+
|
|
583
|
+
--engine, -e engine, default auto
|
|
584
|
+
--max-results, -n count, default 5
|
|
585
|
+
--depth, -d fast | balanced | deep
|
|
586
|
+
--mode fast | auto | deep | budget
|
|
587
|
+
--no-cache skip cache
|
|
588
|
+
--explain print routing explanation
|
|
589
|
+
--json JSON output
|
|
590
|
+
--timeout, -t timeout seconds
|
|
591
|
+
--list-engines list engines
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
596
|
+
## Design trade-offs
|
|
597
|
+
|
|
598
|
+
1. **Agent absorption first, link count second.**
|
|
599
|
+
2. **Free and local first; paid is optional lift.**
|
|
600
|
+
3. **Failures are observable**: empty / timeout / breaker are labeled—no silent swallow.
|
|
601
|
+
4. **Config-driven engines**; `config.yaml` is the single source of truth.
|
|
602
|
+
5. **Single-source install**: link entries, don’t rsync copies.
|
|
603
|
+
6. **Social is not a truth library**; good for expansion and sentiment, not sole ground truth.
|
|
604
|
+
|
|
605
|
+
---
|
|
606
|
+
|
|
607
|
+
## Good fits
|
|
608
|
+
|
|
609
|
+
- Search backend for Claude Code / Grok Build / Codex / Kimi agents
|
|
610
|
+
- **Multilingual, multi-domain** Q&A: CJK + EN + finance / film / sports / academic / code
|
|
611
|
+
- Scripts and pipelines that need **reproducible, cacheable** retrieval
|
|
612
|
+
- Fact-check and multi-source comparison of public finance / entity data
|
|
613
|
+
|
|
614
|
+
Not a great sole solution for: platform-native engagement ranking, or long-lived max-recall aggregators (embedded local engines replace external SearXNG as the main path).
|
|
615
|
+
|
|
616
|
+
---
|
|
617
|
+
|
|
618
|
+
## Tree (short)
|
|
619
|
+
|
|
620
|
+
```
|
|
621
|
+
argo/
|
|
622
|
+
├── README.md # Chinese (default)
|
|
623
|
+
├── README.en.md # English
|
|
624
|
+
├── README.ja.md # Japanese
|
|
625
|
+
├── README.ko.md # Korean
|
|
626
|
+
├── README.es.md # Spanish
|
|
627
|
+
├── SKILL.md
|
|
628
|
+
├── package.json # npx entry
|
|
629
|
+
├── bin/argo.js # Node MCP launcher
|
|
630
|
+
├── bin/argo # Python CLI
|
|
631
|
+
├── config.yaml # engines & domains (source of truth)
|
|
632
|
+
├── assets/readme/ # README visuals
|
|
633
|
+
├── backends/
|
|
634
|
+
├── mcp/ # MCP client inject source (clients.yaml)
|
|
635
|
+
├── scripts/ # search / research / mcp / install …
|
|
636
|
+
├── sub-skills/local-search/
|
|
637
|
+
├── sub-skills/ego-search/ # logged-in professional search (off by default)
|
|
638
|
+
├── tests/
|
|
639
|
+
└── docs/
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
---
|
|
643
|
+
|
|
644
|
+
## Recent updates
|
|
645
|
+
|
|
646
|
+
Only the three most recent versions. Full history in the [changelog](#changelog); per-release detail on [Releases](https://github.com/taxueseek/argo/releases).
|
|
647
|
+
|
|
648
|
+
### Next version: Tencent Yuanbao search + three more keyless sources + a structured failure list
|
|
649
|
+
|
|
650
|
+
- **Yuanbao search**: a first-hand, official-voice Chinese source that complements the portal-and-self-media mix of bocha and byted; sits 2nd in the Chinese-general domain as an authority hedge. Key: `ARGO_YUANBAO_API_KEY`
|
|
651
|
+
- **Three more sources usable with no key**: `tavily_free`, `keenable_free` and the `exa` anonymous fallback now work with no key configured at all
|
|
652
|
+
- **Failures you can act on**: each failure names its source and class and says whether to retry, switch sources or configure a key, alongside a `meta.uncertainty` confidence level
|
|
653
|
+
- **Local config overlay `config.local.yaml`**: machine-local tuning is no longer written into the public config shipped with each release
|
|
654
|
+
- **A new "Engines" section on the DSH settings page**: argo's 28 behaviour switches move out of environment variables and into the panel
|
|
655
|
+
|
|
656
|
+
### v2.9.7: architecture consolidation + host web fetching handed to argo + License moved to Apache-2.0
|
|
657
|
+
|
|
658
|
+
- **License change**: MIT → Apache License 2.0. The patent grant is now explicit; nothing else changes
|
|
659
|
+
- **Pages the host could not fetch now succeed**: short-link redirects, protocol upgrades, redirect shells and Cloudflare / JS challenge pages go through argo's fetch chain (HTTP first, auto-escalating to a browser when a site pushes back). On by default; turn it off with `fetchProviderEnabled`
|
|
660
|
+
- **Auto mode no longer calls paid engines by accident**: the 18 explicit-only engines are removed from the routing candidate pool and are reached only when named with `--engine`
|
|
661
|
+
- **A new key recovers on the next hop**: quota-exhausted engines no longer wait for their recovery window, and the routing cache is recomputed
|
|
662
|
+
- **Running JS from crawl / research / MCP no longer crashes**
|
|
663
|
+
|
|
664
|
+
### v2.9.6: DeepSeek Search + query operators + no double-paying for the same POST
|
|
665
|
+
|
|
666
|
+
- **New `deepseek_search` engine**: 445-510ms, the only one of the three covering authority tiering, rerank_score and publish time; `--since/--until` genuinely works. Billed per call, needs your own `DEEPSEEK_API_KEY` and is skipped automatically without one
|
|
667
|
+
- **Query operators behind one contract**: `site:` / `-site:` / `-term` / `lang:` / `after:` / `before:` are parsed uniformly, and `site:` performs real post-filtering
|
|
668
|
+
- **The same POST is no longer paid for twice**: connection-pool reuse saves 320ms (anysearch) / 561ms (octen) on the second request over one connection
|
|
669
|
+
- **Two link-resolution and ranking defects fixed**: results from one engine all scoring the same had flattened the output; Bing redirect shells left unresolved cost 40.2% of queries their results over 7 days
|
|
670
|
+
- **Routing decisions are snapshot-gated**: routing flips become a diffable golden instead of changing silently
|
|
671
|
+
|
|
672
|
+
---
|
|
673
|
+
|
|
674
|
+
## Changelog
|
|
675
|
+
|
|
676
|
+
| Version | Notes |
|
|
677
|
+
|---------|-------|
|
|
678
|
+
| **v2.9.8** | **Routing precision audit + issue #18/#19 fixes + test-state isolation**: replayed real queries and tightened 16 classes of false triggers (brand/product names, field names, ASCII substrings); added the SERP coverage gate and CJK cross-validation; fixed the empty-log nightly ledger, people_daily default feed, and cached-result guarding; isolated adaptive/breaker state per test. Thanks to @wpp666 for the reproduction and diagnosis. See [release notes](docs/RELEASE_NOTES_v2.9.8.md). |
|
|
679
|
+
| **v2.9.7** | **Architecture consolidation + DSH web_fetch seam + License to Apache-2.0**: MIT → Apache License 2.0. Host web_fetch now flows through argo's fetch chain (HTTP first, browser upgrade on JS challenges), and explicit-only engines leave the routing pool so auto mode cannot bill them by accident. |
|
|
680
|
+
| **v2.9.6** | **DeepSeek Search engine + query operator contract + transport connection pooling + routing snapshot gate**: New `deepseek_search` engine, on by default (445-510ms; skipped without a key). Query operators (`site:`, `-term`, `lang:`, `after:`, `before:`) share one contract with real post-filtering; POST pooling saves 320-561ms per request. |
|
|
681
|
+
| **v2.9.5** | **FX-rate dedicated domain + two-layer dedup + ranking false-kill fix + per-checkout daemon isolation**: New `fx_query` domain answers rate and parity questions in 675ms. Dedup gains site-suffix normalization plus an optional fuzzy check (`ARGO_DEDUP_FUZZY`), and a separator false-kill is fixed. |
|
|
682
|
+
| **v2.9.4** | **Explicit engine domain attribution + recovery chain circuit-breaker + gate sync**: `--engine X` supplements domain matching, so cached results are no longer blanket-general, and single-engine runs skip the empty first level. `config.yaml` domain rules gained unless-terms handling. |
|
|
683
|
+
| **v2.9.3** | **Full X post packaging + browser login-state lane + local-chain quality/speed fixes**: New `argo tweet` packs a full post into a `--out` bundle; `argo auth` adds browser login-state sessions excluded from the shared cache. English dispatch falls to 2.2-2.5s, image fingerprints 158ms→3.9ms. |
|
|
684
|
+
| **v2.9.2** | **DSH 0.2.1-alpha.1 compatibility verified + routing/guard fixes + js-run sub-skill**: The DSH plugin is verified on DSH 0.2.1-alpha.1, and `argo mcp inject` adds WorkBuddy as a seventh host. Import cost drops 50%, and js-run (a new sub-skill) runs web JS with no browser, P50 ≈1ms. |
|
|
685
|
+
| **v2.9.1** | **Content-quality optimization + content-farm resistance + latest-version adaptation**: Content-quality scoring better identifies and filters low-quality bulk-generated content, and local search gained a self-install-tree guard so argo's own source stops polluting results. |
|
|
686
|
+
| **v2.9.0** | **Source optimization + plugin/CLI parity + minor languages**: Sources 237→253 (keyless 198→219), adding 14 minor-language news sources and the CORE full-text source; Baidu and Sogou are revived. Import −79%, rerank 33ms→1.5ms, new `argo stats`. See [release notes](docs/RELEASE_NOTES_v2.9.0.md) |
|
|
687
|
+
| **v2.8.9** | **Output slimming + richer, faster retrieval + 5 international & fact-check sources**: Default output 15.5KB→5.2KB (−66%, `--envelope` restores the full envelope); slow-network dispatch −36%. Five keyless sources added, taking sources to 237 and keyless to 198. See [release notes](docs/RELEASE_NOTES_v2.8.9.md) |
|
|
688
|
+
| **v2.8.8** | **Real-user fixes (#12 key-alias silence, #13 proxy-less fetch) + across-the-board speedups + sources 218 → 235**: One egress path for all traffic (`ARGO_PROXY`). Cold start 2.1s→0.55s; new `argo answer` and `argo watch` (page-change watching), web_general fallback 41%→20%. See [release notes](docs/RELEASE_NOTES_v2.8.8.md) |
|
|
689
|
+
| **v2.8.7** | **218 sources / 89 domains + three fetch direct-out channels + routing trigger discipline + macro zero-result fix**: 218 sources across 89 domains after 50 new ones (statutes, standards, security, academia, news, legal). Fetch probes llms.txt and `.md` variants; `--engine` takes comma lists again. See [release notes](docs/RELEASE_NOTES_v2.8.7.md) |
|
|
690
|
+
| **v2.8.6** | **Hedged racing + Zhihu three-source split + declarative language dispatch + reachability gate + academic search protocol**: First-engine grace-window racing lets fast engines pay one call. Zhihu global search and personal data are wired in, dead sources surface, geo tail latency drops 56%. See [release notes](docs/RELEASE_NOTES_v2.8.6.md) |
|
|
691
|
+
| **v2.8.5** | **Native DSH plugin tools + MCP off by default + Windows compat + quota self-healing + fetch deadline**: `argo_search` and `argo_fetch` are now first-class tools; MCP is on demand only. Windows support (`install.ps1`), quota self-healing, and `ARGO_FETCH_DEADLINE_S` for the fetch deadline. See [release notes](docs/RELEASE_NOTES_v2.8.5.md) |
|
|
692
|
+
| **v2.8.4** | **Local data fusion + multi-client MCP inject + structured search + Keenable**: Research L1 can draw on first-hand local data (`file_inputs`, `recompute`), and `argo mcp inject` wires clients from `mcp/clients.yaml`. Query normalization and `--include-local` added. See [release notes](docs/RELEASE_NOTES_v2.8.4.md) |
|
|
693
|
+
| **v2.8.3** | **Multilingual routing fix + in-process anysearch + weighted RRF**: ja/ko queries return the target language; DE/FR/ES/IT via anysearch; weakest-link downweight (paper 2508.01405). See [release notes](docs/RELEASE_NOTES_v2.8.3.md) |
|
|
694
|
+
| **v2.8.2** | **Windows + unified evidence semantics**: npm `os` limit removed; UTF-8 path against GBK crashes; main-package `dsh.bundle`; `wide_research` quality gate. See [release notes](docs/RELEASE_NOTES_v2.8.2.md) |
|
|
695
|
+
| **v2.8.0** | **Evidence loop + jobs v3 + dual weather**: `fetch_required` / `--verify`; `argo job`; wttr.in + Open-Meteo; Parallel / You.com. See [release notes](docs/RELEASE_NOTES_v2.8.0.md) |
|
|
696
|
+
| **v2.7.3** | Engine-layer HTTP client; TF-IDF activates 25 verticals; 70-domain TTL; bilingual verticals. See [release notes](docs/RELEASE_NOTES_v2.7.3.md) |
|
|
697
|
+
| **v2.7.2** | Logged-in professional search (ego-search, off by default); JA/KO no longer mix Chinese engines. See [release notes](docs/RELEASE_NOTES_v2.7.2.md) |
|
|
698
|
+
| **v2.7.1** | SSRF hardening + routing health-state fix. See [release notes](docs/RELEASE_NOTES_v2.7.1.md) |
|
|
699
|
+
| **v2.7.0** | **Vertical structured modal cards**: Built-in `bocha` / `bocha_ai` engines; the `modal_card` domain recognizes real-time cards in one place: train tickets, fuel prices, calendar, horoscope, vehicles, hospital registration. See [release notes](docs/RELEASE_NOTES_v2.7.0.md) |
|
|
700
|
+
| **v2.6.2** | Merged improvement lines: network-environment awareness, weighted RRF with semantic cache, adaptive engine disabling, content safety with query variants, vertical engines and ja-ko routing. See [release notes](docs/RELEASE_NOTES_v2.6.2.md) |
|
|
701
|
+
| **v2.6.1** | v2.6.0 fix release: routing collateral-damage fix (`capital of` no longer grabs fact_check); version sync. See [release notes](docs/RELEASE_NOTES_v2.6.1.md) |
|
|
702
|
+
| **v2.6.0** | **Multilingual search** (detect / engine params / cross-lang fallback); film·sports·geo·org·media verticals; recovery anti-pollution; capability families + matrix regression; ~120+ sources. See [release notes](docs/RELEASE_NOTES_v2.6.0.md) |
|
|
703
|
+
| **v2.5.1** | Thicker finance/macro/chemistry answer sources; engine tiers + combo budget; [v2.5.1 notes](docs/RELEASE_NOTES_v2.5.1.md) |
|
|
704
|
+
| **v2.5.0** | Install script + npx; rewrite decoupled from routing; hot-path cache; compact MCP |
|
|
705
|
+
| **v2.4.0** | Low-score route fallback + social mis-route filters; cache depth / soft hits; breakers & negative cache; `engine_outcomes` |
|
|
706
|
+
| **v2.2–v2.3** | Two-stage evidence, Chinese source table, content_signals, fetch stack, more engines |
|
|
707
|
+
| **v2.1** | Social engine layer (multi-platform UGC) |
|
|
708
|
+
| **v1.x** | Unified name Argo; multi-engine routing + two-layer cache |
|
|
709
|
+
|
|
710
|
+
---
|
|
711
|
+
|
|
712
|
+
## Contributing
|
|
713
|
+
|
|
714
|
+
Issues and PRs welcome. When you change routing or evidence logic, please add tests:
|
|
715
|
+
|
|
716
|
+
```bash
|
|
717
|
+
python3 -m pytest tests/test_unit.py tests/test_multilingual.py -q
|
|
718
|
+
python3 scripts/regression_p0p1.py --offline
|
|
719
|
+
python3 scripts/matrix_search_eval.py --offline
|
|
720
|
+
python3 scripts/ab_eval_p0p1.py # optional, online
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
Before commit: no real API keys, absolute machine paths, or account cookies. Local Skill paths belong in `installs.local.yaml` (gitignored).
|
|
724
|
+
|
|
725
|
+
## License
|
|
726
|
+
|
|
727
|
+
Apache License 2.0 © 2026 [taxueseek](https://github.com/taxueseek)
|
|
728
|
+
|
|
729
|
+
<p align="center">
|
|
730
|
+
<a href="https://github.com/oil-oil/beautify-github-readme"><img src="assets/readme/made-with-beautify.svg" width="300" alt="README made with beautify-github-readme"></a>
|
|
731
|
+
</p>
|
|
732
|
+
|
|
733
|
+
---
|
|
734
|
+
|
|
735
|
+
> Good search is not about seeing more—it is about concluding with confidence, and knowing when you still should not.
|