argo-search 2.9.7 → 2.9.9
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/README.en.md +73 -150
- package/README.es.md +73 -150
- package/README.ja.md +79 -156
- package/README.ko.md +78 -155
- package/README.md +80 -159
- package/SKILL.md +3 -3
- package/assets/readme/hero.svg +2 -2
- package/backends/domain_profiles.json +48 -0
- package/backends/engine_registry.yaml +118 -4
- package/backends/quota_profiles.json +92 -12
- package/backends/source_types_cn.json +27 -1
- package/bin/argo +78 -5
- package/bin/argo.js +33 -2
- package/config.yaml +269 -63
- package/docs/ARGO_INTRO.md +5 -3
- package/docs/ENGINE_CATALOG.md +50 -39
- package/docs/MCP_SETUP.md +3 -1
- package/docs/RELEASE_NOTES_v2.9.8.md +73 -0
- package/docs/RELEASE_NOTES_v2.9.9.md +78 -0
- package/engines/specs/cfets.yaml +41 -0
- package/engines/specs/defillama.yaml +38 -0
- package/engines/specs/firecrawl.yaml +1 -1
- package/engines/specs/fxtwitter.yaml +5 -0
- package/engines/specs/gleif.yaml +55 -0
- package/engines/specs/hkex.yaml +40 -0
- package/engines/specs/keenable_free.yaml +36 -0
- package/engines/specs/shfe.yaml +39 -0
- package/engines/specs/stackexchange.yaml +2 -2
- package/engines/specs/tavily_free.yaml +56 -0
- package/engines/specs/yuanbao.yaml +93 -0
- package/mcp/clients.yaml +32 -0
- package/package.json +7 -2
- package/packages/dsh-plugin/README.md +25 -6
- package/packages/dsh-plugin/dsh/client.js +402 -47
- package/packages/dsh-plugin/dsh/diagnostics.js +97 -0
- package/packages/dsh-plugin/dsh/index.js +135 -1876
- package/packages/dsh-plugin/dsh/native-tools.mjs +7 -1
- 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 +3 -3
- package/packages/dsh-plugin/scripts/sync-local.sh +70 -0
- package/packages/dsh-plugin/test/client.test.js +177 -2
- package/packages/dsh-plugin/test/diagnostics.test.js +28 -0
- package/packages/dsh-plugin/test/index.test.js +44 -0
- package/scripts/adaptive.py +126 -43
- package/scripts/article_meta.py +131 -0
- package/scripts/bench_tail_ab.py +281 -0
- package/scripts/bounded_run.py +91 -49
- package/scripts/budget.py +247 -0
- package/scripts/budget_cli.py +93 -0
- package/scripts/build_release_assets.sh +65 -0
- package/scripts/cache.py +60 -72
- package/scripts/ci_drift_gate.py +90 -0
- package/scripts/clock_bridge.py +22 -0
- package/scripts/content_boundary.py +46 -0
- package/scripts/content_security.py +119 -4
- package/scripts/content_signals.py +26 -5
- package/scripts/cross_lingual_trace.py +293 -0
- package/scripts/dispatch_result.py +105 -0
- package/scripts/engine_add.py +602 -0
- package/scripts/engine_dispatch.py +58 -86
- package/scripts/engine_env.py +5 -0
- package/scripts/engine_families.py +6 -0
- package/scripts/engine_policy.py +7 -7
- package/scripts/engines.py +21 -0
- package/scripts/engines_base.py +3 -3
- package/scripts/engines_builders.py +12 -0
- package/scripts/engines_builders_batch10.py +48 -3
- package/scripts/engines_builders_batch14.py +656 -0
- package/scripts/engines_builders_batch15.py +249 -0
- package/scripts/engines_builders_keyless.py +111 -0
- package/scripts/engines_builders_tech.py +0 -1
- package/scripts/evidence.py +31 -3
- package/scripts/evidence_loop.py +58 -22
- package/scripts/fetch_quality.py +13 -0
- package/scripts/fetch_v3.py +28 -3
- package/scripts/gen_routing_snapshot.py +11 -0
- package/scripts/http_client.py +24 -38
- package/scripts/install.ps1 +18 -0
- package/scripts/install.sh +16 -1
- package/scripts/job.py +3 -3
- package/scripts/local_seek.py +41 -5
- package/scripts/macro_countries.py +15 -0
- package/scripts/matrix_search_eval.py +192 -0
- package/scripts/mcp_compact.py +234 -0
- package/scripts/mcp_handlers.py +60 -642
- package/scripts/mcp_launch.sh +10 -8
- package/scripts/mcp_local.py +241 -0
- package/scripts/mcp_server.py +19 -14
- package/scripts/mcp_setup.py +33 -9
- package/scripts/mcp_tools.py +1 -0
- package/scripts/mcp_transport.py +1 -1
- package/scripts/mcp_warm.py +127 -0
- package/scripts/net_proxy.py +27 -0
- package/scripts/output_transparency.py +200 -0
- package/scripts/paid_policy.py +98 -0
- package/scripts/quota.py +158 -13
- package/scripts/recovery.py +7 -3
- package/scripts/recovery_runner.py +150 -0
- package/scripts/replay_eval.py +18 -0
- package/scripts/research.py +37 -21
- package/scripts/research_expand.py +24 -1
- package/scripts/retry_policy.py +76 -0
- package/scripts/route.py +6 -6
- package/scripts/route_cache.py +18 -0
- package/scripts/route_combo.py +26 -5
- package/scripts/route_domains.py +170 -31
- package/scripts/safe_conn.py +52 -0
- package/scripts/search.py +15 -27
- package/scripts/search_attribution.py +100 -3
- package/scripts/search_cli.py +24 -11
- package/scripts/search_entry.py +8 -1
- package/scripts/search_output.py +99 -15
- package/scripts/search_pipeline.py +62 -195
- package/scripts/search_rank.py +6 -0
- package/scripts/search_types.py +107 -9
- package/scripts/semantic_evidence.py +179 -3
- package/scripts/serp_guard.py +138 -7
- package/scripts/serp_kill_log.py +25 -2
- package/scripts/stats_cli.py +13 -1
- package/scripts/tail_completion.py +212 -0
- package/scripts/url_safety.py +126 -3
- package/scripts/usage_log.py +45 -0
- package/scripts/wide_research.py +45 -0
- package/scripts/zhihu_quota.py +139 -0
- package/sub-skills/local-search/bm25.py +27 -3
- package/sub-skills/local-search/cli_runner.py +331 -0
- package/sub-skills/local-search/parsers.py +328 -0
- package/sub-skills/local-search/search_v3.py +31 -674
- package/sub-skills/local-seek/scripts/seek_rank.py +7 -3
- package/assets/readme/settings-keys.png +0 -0
- package/assets/readme/settings-tools.png +0 -0
- package/sub-skills/ego-search/references/browser-runtime.md +0 -43
- package/sub-skills/ego-search/references/install.md +0 -67
- package/sub-skills/ego-search/references/original-ego-upgrade.md +0 -51
- package/sub-skills/ego-search/tests/test_query_normalize.py +0 -68
- package/sub-skills/js-run/tests/fixtures/challenge_like.js +0 -27
- package/sub-skills/js-run/tests/test_jsrun.py +0 -165
- package/sub-skills/local-seek/references/auto-behaviors.md +0 -24
- package/sub-skills/local-seek/references/fd-mdfind-recipes.md +0 -62
- package/sub-skills/local-seek/references/git-integration.md +0 -54
- package/sub-skills/local-seek/references/remote-handoff.md +0 -46
- package/sub-skills/local-seek/references/rg-recipes.md +0 -96
- package/sub-skills/local-seek/references/strategies.md +0 -52
- package/sub-skills/local-seek/references/structural-search.md +0 -59
- package/sub-skills/local-seek/tests/test_content_rank.py +0 -222
- package/sub-skills/local-seek/tests/test_determinism_20261006.py +0 -145
- package/sub-skills/local-seek/tests/test_noise_tier.py +0 -101
- package/sub-skills/local-seek/tests/test_pcre2_probe.py +0 -136
- package/sub-skills/local-seek/tests/test_rank_pinyin.py +0 -77
- package/sub-skills/local-seek/tests/test_regression_20261003.py +0 -169
- package/sub-skills/local-seek/tests/test_regression_20261006.py +0 -146
- package/sub-skills/local-seek/tests/test_seek_degradation.py +0 -111
- package/sub-skills/local-seek/tests/test_seek_fts.py +0 -313
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
_generated: 由 scripts/sync_backends.py 从运行时引擎声明派生,勿手工修改。
|
|
2
2
|
version: 2
|
|
3
|
-
last_updated: '2026-10-
|
|
3
|
+
last_updated: '2026-10-22'
|
|
4
4
|
engines:
|
|
5
5
|
- name: aljazeera
|
|
6
6
|
tier: T1
|
|
@@ -242,6 +242,21 @@ engines:
|
|
|
242
242
|
recommended: false
|
|
243
243
|
explicit_only: false
|
|
244
244
|
desc: 英国电网碳强度与发电结构(国家电网官方,免认证)
|
|
245
|
+
- name: cfets
|
|
246
|
+
tier: T1
|
|
247
|
+
type: cfets
|
|
248
|
+
coverage:
|
|
249
|
+
- finance
|
|
250
|
+
- macro
|
|
251
|
+
- china
|
|
252
|
+
- official
|
|
253
|
+
- realtime
|
|
254
|
+
latency_ms: 2000
|
|
255
|
+
cost: free
|
|
256
|
+
status: ok
|
|
257
|
+
recommended: false
|
|
258
|
+
explicit_only: false
|
|
259
|
+
desc: 中国外汇交易中心人民币中间价(25 个币种,官方授权口径,免 key)
|
|
245
260
|
- name: cinii
|
|
246
261
|
tier: T1
|
|
247
262
|
type: http
|
|
@@ -518,6 +533,20 @@ engines:
|
|
|
518
533
|
recommended: false
|
|
519
534
|
explicit_only: false
|
|
520
535
|
desc: 音乐艺人/专辑(Deezer,免认证)
|
|
536
|
+
- name: defillama
|
|
537
|
+
tier: T1
|
|
538
|
+
type: defillama
|
|
539
|
+
coverage:
|
|
540
|
+
- crypto
|
|
541
|
+
- finance
|
|
542
|
+
- blockchain
|
|
543
|
+
- defi
|
|
544
|
+
latency_ms: 2000
|
|
545
|
+
cost: free
|
|
546
|
+
status: ok
|
|
547
|
+
recommended: false
|
|
548
|
+
explicit_only: false
|
|
549
|
+
desc: DeFiLlama 协议 TVL(8700+ 协议资金规模/24h 与 7d 变化,免 key)
|
|
521
550
|
- name: deps_dev
|
|
522
551
|
tier: T1
|
|
523
552
|
type: deps_dev
|
|
@@ -1115,6 +1144,20 @@ engines:
|
|
|
1115
1144
|
recommended: true
|
|
1116
1145
|
explicit_only: false
|
|
1117
1146
|
desc: GitHub 代码搜索 API
|
|
1147
|
+
- name: gleif
|
|
1148
|
+
tier: T1
|
|
1149
|
+
type: http
|
|
1150
|
+
coverage:
|
|
1151
|
+
- company
|
|
1152
|
+
- business
|
|
1153
|
+
- legal
|
|
1154
|
+
- org_entity
|
|
1155
|
+
latency_ms: 2000
|
|
1156
|
+
cost: free
|
|
1157
|
+
status: ok
|
|
1158
|
+
recommended: false
|
|
1159
|
+
explicit_only: false
|
|
1160
|
+
desc: GLEIF 全球法人 LEI 注册库(法定名称/注册地/状态/母公司,免 key)
|
|
1118
1161
|
- name: google_news
|
|
1119
1162
|
tier: T1
|
|
1120
1163
|
type: google_news
|
|
@@ -1246,6 +1289,21 @@ engines:
|
|
|
1246
1289
|
recommended: true
|
|
1247
1290
|
explicit_only: false
|
|
1248
1291
|
desc: 日本技术圈书签搜索(RDF RSS,带收藏日期)
|
|
1292
|
+
- name: hkex
|
|
1293
|
+
tier: T1
|
|
1294
|
+
type: hkex
|
|
1295
|
+
coverage:
|
|
1296
|
+
- finance
|
|
1297
|
+
- stock
|
|
1298
|
+
- hk_stock
|
|
1299
|
+
- legal
|
|
1300
|
+
- official
|
|
1301
|
+
latency_ms: 2000
|
|
1302
|
+
cost: free
|
|
1303
|
+
status: ok
|
|
1304
|
+
recommended: false
|
|
1305
|
+
explicit_only: false
|
|
1306
|
+
desc: 港交所披露易公告检索(港股一手公告 PDF,代码/公司名/标题关键词,免 key)
|
|
1249
1307
|
- name: huggingface
|
|
1250
1308
|
tier: T1
|
|
1251
1309
|
type: http
|
|
@@ -1405,6 +1463,19 @@ engines:
|
|
|
1405
1463
|
recommended: true
|
|
1406
1464
|
explicit_only: false
|
|
1407
1465
|
desc: Keenable 通用网页搜索(ranked results,含 published_at,按 credits 计费)
|
|
1466
|
+
- name: keenable_free
|
|
1467
|
+
tier: T1
|
|
1468
|
+
type: keenable_free
|
|
1469
|
+
coverage:
|
|
1470
|
+
- general
|
|
1471
|
+
- english
|
|
1472
|
+
- chinese
|
|
1473
|
+
latency_ms: 2000
|
|
1474
|
+
cost: free
|
|
1475
|
+
status: ok
|
|
1476
|
+
recommended: false
|
|
1477
|
+
explicit_only: false
|
|
1478
|
+
desc: Keenable 官方免 key 匿名通道(通用网页搜索,无需注册)
|
|
1408
1479
|
- name: know_your_meme
|
|
1409
1480
|
tier: T1
|
|
1410
1481
|
type: html
|
|
@@ -2425,6 +2496,21 @@ engines:
|
|
|
2425
2496
|
recommended: true
|
|
2426
2497
|
explicit_only: false
|
|
2427
2498
|
desc: 神马搜索(m.sm.cn/s 移动端 HTML 解析),中文通用网页
|
|
2499
|
+
- name: shfe
|
|
2500
|
+
tier: T1
|
|
2501
|
+
type: shfe
|
|
2502
|
+
coverage:
|
|
2503
|
+
- finance
|
|
2504
|
+
- futures
|
|
2505
|
+
- commodity
|
|
2506
|
+
- china
|
|
2507
|
+
- official
|
|
2508
|
+
latency_ms: 2000
|
|
2509
|
+
cost: free
|
|
2510
|
+
status: ok
|
|
2511
|
+
recommended: false
|
|
2512
|
+
explicit_only: false
|
|
2513
|
+
desc: 上海期货交易所日行情(铜/铝/黄金/螺纹钢等品种,官方一手,免 key)
|
|
2428
2514
|
- name: sina_quote
|
|
2429
2515
|
tier: T1
|
|
2430
2516
|
type: sina_quote
|
|
@@ -2587,7 +2673,20 @@ engines:
|
|
|
2587
2673
|
status: ok
|
|
2588
2674
|
recommended: true
|
|
2589
2675
|
explicit_only: false
|
|
2590
|
-
desc: Tavily AI 搜索 API(免费层 1000
|
|
2676
|
+
desc: Tavily AI 搜索 API(免费层 1000 次/月,超出按美元计费;与 exa 同为 api 档)
|
|
2677
|
+
- name: tavily_free
|
|
2678
|
+
tier: T1
|
|
2679
|
+
type: http
|
|
2680
|
+
coverage:
|
|
2681
|
+
- general
|
|
2682
|
+
- english
|
|
2683
|
+
- chinese
|
|
2684
|
+
latency_ms: 2000
|
|
2685
|
+
cost: free
|
|
2686
|
+
status: ok
|
|
2687
|
+
recommended: false
|
|
2688
|
+
explicit_only: false
|
|
2689
|
+
desc: Tavily 官方免 key 匿名通道(通用网页搜索,无需注册)
|
|
2591
2690
|
- name: tencent_kline
|
|
2592
2691
|
tier: T1
|
|
2593
2692
|
type: tencent_kline
|
|
@@ -2747,13 +2846,14 @@ engines:
|
|
|
2747
2846
|
tier: T1
|
|
2748
2847
|
type: cli
|
|
2749
2848
|
coverage:
|
|
2750
|
-
-
|
|
2849
|
+
- social
|
|
2850
|
+
- english
|
|
2751
2851
|
latency_ms: 2000
|
|
2752
2852
|
cost: free
|
|
2753
2853
|
status: ok
|
|
2754
2854
|
recommended: true
|
|
2755
2855
|
explicit_only: false
|
|
2756
|
-
desc: Twitter/
|
|
2856
|
+
desc: X/Twitter 关键词搜索(ego-browser 通道,原生布尔语法 from:/-is:retweet/lang:)
|
|
2757
2857
|
- name: twitter_syndication
|
|
2758
2858
|
tier: T1
|
|
2759
2859
|
type: twitter_syndication
|
|
@@ -3196,6 +3296,20 @@ engines:
|
|
|
3196
3296
|
recommended: true
|
|
3197
3297
|
explicit_only: false
|
|
3198
3298
|
desc: You.com 网页+新闻搜索(时效性强,官方一手源,web/news 合并)
|
|
3299
|
+
- name: yuanbao
|
|
3300
|
+
tier: T1
|
|
3301
|
+
type: yuanbao
|
|
3302
|
+
coverage:
|
|
3303
|
+
- web
|
|
3304
|
+
- chinese
|
|
3305
|
+
- news
|
|
3306
|
+
- official
|
|
3307
|
+
latency_ms: 2000
|
|
3308
|
+
cost: api
|
|
3309
|
+
status: ok
|
|
3310
|
+
recommended: false
|
|
3311
|
+
explicit_only: false
|
|
3312
|
+
desc: 腾讯元宝搜索(yuanbao)
|
|
3199
3313
|
- name: zbmath
|
|
3200
3314
|
tier: T1
|
|
3201
3315
|
type: http
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"anysearch": {
|
|
24
24
|
"label": "AnySearch",
|
|
25
25
|
"qps": 5,
|
|
26
|
-
"limit":
|
|
26
|
+
"limit": 1000,
|
|
27
27
|
"period": "day",
|
|
28
28
|
"cost_per_call": 0.0,
|
|
29
29
|
"cost_unit": "free",
|
|
@@ -143,8 +143,8 @@
|
|
|
143
143
|
"bocha": {
|
|
144
144
|
"label": "博查搜索",
|
|
145
145
|
"qps": 5,
|
|
146
|
-
"limit":
|
|
147
|
-
"period": "
|
|
146
|
+
"limit": null,
|
|
147
|
+
"period": "second",
|
|
148
148
|
"cost_per_call": 0.0001,
|
|
149
149
|
"cost_unit": "credit",
|
|
150
150
|
"cost_tier": "low",
|
|
@@ -153,8 +153,8 @@
|
|
|
153
153
|
"bocha_ai": {
|
|
154
154
|
"label": "博查AI搜索",
|
|
155
155
|
"qps": 5,
|
|
156
|
-
"limit":
|
|
157
|
-
"period": "
|
|
156
|
+
"limit": null,
|
|
157
|
+
"period": "second",
|
|
158
158
|
"cost_per_call": 0.001,
|
|
159
159
|
"cost_unit": "credit",
|
|
160
160
|
"cost_tier": "low",
|
|
@@ -190,6 +190,16 @@
|
|
|
190
190
|
"cost_tier": "free",
|
|
191
191
|
"priority": 50
|
|
192
192
|
},
|
|
193
|
+
"cfets": {
|
|
194
|
+
"label": "人民币中间价",
|
|
195
|
+
"qps": 2,
|
|
196
|
+
"limit": null,
|
|
197
|
+
"period": "second",
|
|
198
|
+
"cost_per_call": 0.0,
|
|
199
|
+
"cost_unit": "free",
|
|
200
|
+
"cost_tier": "free",
|
|
201
|
+
"priority": 51
|
|
202
|
+
},
|
|
193
203
|
"cinii": {
|
|
194
204
|
"label": "cinii",
|
|
195
205
|
"qps": 2,
|
|
@@ -410,6 +420,16 @@
|
|
|
410
420
|
"cost_tier": "free",
|
|
411
421
|
"priority": 50
|
|
412
422
|
},
|
|
423
|
+
"defillama": {
|
|
424
|
+
"label": "DeFiLlama",
|
|
425
|
+
"qps": 1,
|
|
426
|
+
"limit": null,
|
|
427
|
+
"period": "second",
|
|
428
|
+
"cost_per_call": 0.0,
|
|
429
|
+
"cost_unit": "free",
|
|
430
|
+
"cost_tier": "free",
|
|
431
|
+
"priority": 45
|
|
432
|
+
},
|
|
413
433
|
"deps_dev": {
|
|
414
434
|
"label": "deps_dev",
|
|
415
435
|
"qps": 2,
|
|
@@ -665,8 +685,8 @@
|
|
|
665
685
|
"qps": 1,
|
|
666
686
|
"limit": 1000,
|
|
667
687
|
"period": "month",
|
|
668
|
-
"cost_per_call": 0.
|
|
669
|
-
"cost_unit": "
|
|
688
|
+
"cost_per_call": 0.01,
|
|
689
|
+
"cost_unit": "usd",
|
|
670
690
|
"cost_tier": "api",
|
|
671
691
|
"priority": 14
|
|
672
692
|
},
|
|
@@ -706,7 +726,7 @@
|
|
|
706
726
|
"limit": null,
|
|
707
727
|
"period": "second",
|
|
708
728
|
"cost_per_call": 0.0,
|
|
709
|
-
"cost_unit": "
|
|
729
|
+
"cost_unit": "usd",
|
|
710
730
|
"cost_tier": "paid",
|
|
711
731
|
"priority": 8
|
|
712
732
|
},
|
|
@@ -736,7 +756,7 @@
|
|
|
736
756
|
"limit": 1000,
|
|
737
757
|
"period": "month",
|
|
738
758
|
"cost_per_call": 0.001,
|
|
739
|
-
"cost_unit": "
|
|
759
|
+
"cost_unit": "usd",
|
|
740
760
|
"cost_tier": "free",
|
|
741
761
|
"priority": 50
|
|
742
762
|
},
|
|
@@ -890,6 +910,16 @@
|
|
|
890
910
|
"cost_tier": "free",
|
|
891
911
|
"priority": 11
|
|
892
912
|
},
|
|
913
|
+
"gleif": {
|
|
914
|
+
"label": "GLEIF 法人标识",
|
|
915
|
+
"qps": 2,
|
|
916
|
+
"limit": null,
|
|
917
|
+
"period": "second",
|
|
918
|
+
"cost_per_call": 0.0,
|
|
919
|
+
"cost_unit": "free",
|
|
920
|
+
"cost_tier": "free",
|
|
921
|
+
"priority": 55
|
|
922
|
+
},
|
|
893
923
|
"google_news": {
|
|
894
924
|
"label": "google_news",
|
|
895
925
|
"qps": 2,
|
|
@@ -990,6 +1020,16 @@
|
|
|
990
1020
|
"cost_tier": "free",
|
|
991
1021
|
"priority": 48
|
|
992
1022
|
},
|
|
1023
|
+
"hkex": {
|
|
1024
|
+
"label": "港交所披露易",
|
|
1025
|
+
"qps": 1,
|
|
1026
|
+
"limit": null,
|
|
1027
|
+
"period": "second",
|
|
1028
|
+
"cost_per_call": 0.0,
|
|
1029
|
+
"cost_unit": "free",
|
|
1030
|
+
"cost_tier": "free",
|
|
1031
|
+
"priority": 50
|
|
1032
|
+
},
|
|
993
1033
|
"huggingface": {
|
|
994
1034
|
"label": "Hugging Face",
|
|
995
1035
|
"qps": 2,
|
|
@@ -1110,6 +1150,16 @@
|
|
|
1110
1150
|
"cost_tier": "free",
|
|
1111
1151
|
"priority": 50
|
|
1112
1152
|
},
|
|
1153
|
+
"keenable_free": {
|
|
1154
|
+
"label": "Keenable (keyless)",
|
|
1155
|
+
"qps": 1,
|
|
1156
|
+
"limit": null,
|
|
1157
|
+
"period": "second",
|
|
1158
|
+
"cost_per_call": 0.0,
|
|
1159
|
+
"cost_unit": "free",
|
|
1160
|
+
"cost_tier": "free",
|
|
1161
|
+
"priority": 57
|
|
1162
|
+
},
|
|
1113
1163
|
"know_your_meme": {
|
|
1114
1164
|
"label": "Know Your Meme",
|
|
1115
1165
|
"qps": 2,
|
|
@@ -1940,6 +1990,16 @@
|
|
|
1940
1990
|
"cost_tier": "free",
|
|
1941
1991
|
"priority": 20
|
|
1942
1992
|
},
|
|
1993
|
+
"shfe": {
|
|
1994
|
+
"label": "上期所行情",
|
|
1995
|
+
"qps": 2,
|
|
1996
|
+
"limit": null,
|
|
1997
|
+
"period": "second",
|
|
1998
|
+
"cost_per_call": 0.0,
|
|
1999
|
+
"cost_unit": "free",
|
|
2000
|
+
"cost_tier": "free",
|
|
2001
|
+
"priority": 52
|
|
2002
|
+
},
|
|
1943
2003
|
"sina_quote": {
|
|
1944
2004
|
"label": "新浪行情",
|
|
1945
2005
|
"qps": 2,
|
|
@@ -2005,8 +2065,8 @@
|
|
|
2005
2065
|
"qps": 1,
|
|
2006
2066
|
"limit": 300,
|
|
2007
2067
|
"period": "day",
|
|
2008
|
-
"cost_per_call":
|
|
2009
|
-
"cost_unit": "
|
|
2068
|
+
"cost_per_call": 0.0,
|
|
2069
|
+
"cost_unit": "usd",
|
|
2010
2070
|
"cost_tier": "free",
|
|
2011
2071
|
"priority": 45
|
|
2012
2072
|
},
|
|
@@ -2066,10 +2126,20 @@
|
|
|
2066
2126
|
"limit": 1000,
|
|
2067
2127
|
"period": "month",
|
|
2068
2128
|
"cost_per_call": 0.001,
|
|
2069
|
-
"cost_unit": "
|
|
2129
|
+
"cost_unit": "usd",
|
|
2070
2130
|
"cost_tier": "api",
|
|
2071
2131
|
"priority": 5
|
|
2072
2132
|
},
|
|
2133
|
+
"tavily_free": {
|
|
2134
|
+
"label": "Tavily (keyless)",
|
|
2135
|
+
"qps": 1,
|
|
2136
|
+
"limit": null,
|
|
2137
|
+
"period": "second",
|
|
2138
|
+
"cost_per_call": 0.0,
|
|
2139
|
+
"cost_unit": "free",
|
|
2140
|
+
"cost_tier": "free",
|
|
2141
|
+
"priority": 56
|
|
2142
|
+
},
|
|
2073
2143
|
"tencent_kline": {
|
|
2074
2144
|
"label": "腾讯 K 线",
|
|
2075
2145
|
"qps": 2,
|
|
@@ -2550,6 +2620,16 @@
|
|
|
2550
2620
|
"cost_tier": "api",
|
|
2551
2621
|
"priority": 12
|
|
2552
2622
|
},
|
|
2623
|
+
"yuanbao": {
|
|
2624
|
+
"label": "腾讯元宝搜索",
|
|
2625
|
+
"qps": 2,
|
|
2626
|
+
"limit": 2000,
|
|
2627
|
+
"period": "month",
|
|
2628
|
+
"cost_per_call": 0.0,
|
|
2629
|
+
"cost_unit": "credit",
|
|
2630
|
+
"cost_tier": "api",
|
|
2631
|
+
"priority": 55
|
|
2632
|
+
},
|
|
2553
2633
|
"zbmath": {
|
|
2554
2634
|
"label": "zbmath",
|
|
2555
2635
|
"qps": 2,
|
|
@@ -30,12 +30,38 @@
|
|
|
30
30
|
"zhuanlan.zhihu.com": 0.65,
|
|
31
31
|
"www.zhihu.com": 0.90
|
|
32
32
|
},
|
|
33
|
+
"content_farm_markers": [
|
|
34
|
+
"ctolib.com",
|
|
35
|
+
"coder.work",
|
|
36
|
+
"voidcn.com",
|
|
37
|
+
"it1352.com",
|
|
38
|
+
"oommake.com",
|
|
39
|
+
"py4u.net",
|
|
40
|
+
"wenku.zone",
|
|
41
|
+
"chinadmd.com",
|
|
42
|
+
"biquge",
|
|
43
|
+
"99lib.net",
|
|
44
|
+
"shubaow.net",
|
|
45
|
+
"jb51.cc",
|
|
46
|
+
"kafan.cn",
|
|
47
|
+
"yiidian.com"
|
|
48
|
+
],
|
|
49
|
+
"content_farm_url_patterns": [
|
|
50
|
+
"/tag/",
|
|
51
|
+
"/tags/",
|
|
52
|
+
"/label/",
|
|
53
|
+
"/zt/",
|
|
54
|
+
"/zhuanti/"
|
|
55
|
+
],
|
|
33
56
|
"demote_domains": {
|
|
34
57
|
"maigoo.com": {"score": 0.28, "class": "commercial_recommendation", "reason": "商业品牌榜单"},
|
|
35
58
|
"chinapp.com": {"score": 0.28, "class": "commercial_recommendation", "reason": "加盟/品牌网"},
|
|
36
59
|
"cnpp.cn": {"score": 0.28, "class": "commercial_recommendation", "reason": "十大品牌网类"},
|
|
37
60
|
"canyin88.com": {"score": 0.35, "class": "commercial_recommendation", "reason": "行业加盟倾向"},
|
|
38
|
-
"xiuxianshipin.com": {"score": 0.3, "class": "commercial_recommendation", "reason": "加盟内容"}
|
|
61
|
+
"xiuxianshipin.com": {"score": 0.3, "class": "commercial_recommendation", "reason": "加盟内容"},
|
|
62
|
+
"jb51.net": {"score": 0.35, "class": "aggregated_tech", "reason": "SEO爬虫抓取聚合"},
|
|
63
|
+
"pc6.com": {"score": 0.25, "class": "download_portal", "reason": "软件下载引流壳"},
|
|
64
|
+
"onlinedown.net": {"score": 0.25, "class": "download_portal", "reason": "软件下载引流壳"}
|
|
39
65
|
},
|
|
40
66
|
"serp_host_markers": [
|
|
41
67
|
"baidu.com",
|
package/bin/argo
CHANGED
|
@@ -69,13 +69,35 @@ MIN_PYTHON = (3, 9)
|
|
|
69
69
|
# 运行(静默跑在不支持的解释器上)。根因是把「版本」和「依赖」两个判据拆到了两条
|
|
70
70
|
# 分支上,谁抄漏一个就少一半闸门。现在两个脚本同源生成,只换 yaml 那一段。
|
|
71
71
|
_PY_MIN_VER = ",".join(str(part) for part in MIN_PYTHON)
|
|
72
|
+
# 廉价档:find_spec 只问「存在性」,不 import(~15 ms)。
|
|
72
73
|
_PY_CHEAP_CHECK = (
|
|
73
74
|
"import sys, importlib.util as u; sys.exit(0 if sys.version_info >= (%s,) "
|
|
74
75
|
"and u.find_spec('yaml') is not None else 1)" % _PY_MIN_VER
|
|
75
76
|
)
|
|
77
|
+
# 严格档:真 import 一遍(~80–170 ms),抓「find_spec 说在、import 却炸」——
|
|
78
|
+
# 半装的 PyYAML、被 sys.path 上的坏 .pth 顶掉的 namespace 包、ABI 不匹配的
|
|
79
|
+
# 扩展模块都属这类。版本判据必须与廉价档同源,否则又会回到「3.9 被选中写进
|
|
80
|
+
# 缓存」那个历史 bug(见上方历史注记)。
|
|
81
|
+
#
|
|
82
|
+
# 2026-10-21 修复:此前的写法是
|
|
83
|
+
# import sys; sys.exit(0 if sys.version_info >= (3,9,) else 1); import yaml
|
|
84
|
+
# `sys.exit()` 在版本判据成立的那一刻就终止进程,`import yaml` 是**永不执行的
|
|
85
|
+
# 死代码**——严格档与廉价档的唯一区别(真 import)被自己吃掉了,两个档退化成
|
|
86
|
+
# 同一个判据。实锤后果:macOS 自带 python3.9(无 PyYAML)通过探测、被写进
|
|
87
|
+
# ~/.cache/unified-search/.argo_python,此后每个 `type: cli` 引擎都先付一次
|
|
88
|
+
# 子进程 ModuleNotFoundError;实测 weather 引擎单次 5.8s 失败、weather_query
|
|
89
|
+
# 域 p50 被抬到 3071ms(本机最慢域)。
|
|
90
|
+
#
|
|
91
|
+
# 现在的写法把「版本不达标 → exit(1)」写成**前置 if**,import yaml 与 sys.exit(0)
|
|
92
|
+
# 都在它后面:只有版本放过之后才碰依赖,依赖炸就炸在 exit 之前,rc 非 0。
|
|
93
|
+
# 反过来写(`sys.exit(0 if ... else 1); import yaml`,无论单行还是换行)都还是
|
|
94
|
+
# 死代码——exit 是立即终止,同一行分号挡不住它。测试见
|
|
95
|
+
# tests/test_python_probe.py::test_strict_check_fails_when_yaml_is_unavailable。
|
|
76
96
|
_PY_STRICT_CHECK = (
|
|
77
|
-
"import sys
|
|
78
|
-
%
|
|
97
|
+
"import sys\n"
|
|
98
|
+
"if sys.version_info < (%s,): sys.exit(1)\n"
|
|
99
|
+
"import yaml\n"
|
|
100
|
+
"sys.exit(0)" % _PY_MIN_VER
|
|
79
101
|
)
|
|
80
102
|
|
|
81
103
|
|
|
@@ -145,6 +167,43 @@ def _remember_python(p: str) -> None:
|
|
|
145
167
|
pass
|
|
146
168
|
|
|
147
169
|
|
|
170
|
+
# 已知安装前缀:GUI / 非交互式 shell 常常没跑 `brew shellenv`,于是
|
|
171
|
+
# /opt/homebrew/bin 不在 PATH 上,`shutil.which("python3.14")` 一律落空。
|
|
172
|
+
#
|
|
173
|
+
# 本机实测(2026-10-21):`/opt/homebrew/bin/python3.14` 带 PyYAML 6.0.3,
|
|
174
|
+
# 而 PATH 上只有 `/usr/bin/python3`(3.9.6,无 PyYAML)。探测链全部落空后
|
|
175
|
+
# _pick_python 回落到 sys.executable=3.9,argo 全程跑在缺依赖的解释器上:
|
|
176
|
+
# 每个 `type: cli` 引擎(weather/wx.py 等)都先付一次 ModuleNotFoundError
|
|
177
|
+
# (实测 weather 单次 5.8s 失败,weather_query 域 p50 被抬到 3071ms)。
|
|
178
|
+
#
|
|
179
|
+
# PATH 仍然优先(那是用户的显式意图),这只是「which 落空时按惯例位置再找
|
|
180
|
+
# 一遍」的兜底,不改变任何 PATH 上已能解析到的选择。Windows 无这些前缀,
|
|
181
|
+
# 列表里的路径不存在即跳过(isfile 守卫),不引入平台分支。
|
|
182
|
+
_KNOWN_PY_PREFIXES = (
|
|
183
|
+
"/opt/homebrew/bin", # macOS arm64 Homebrew
|
|
184
|
+
"/usr/local/bin", # macOS x86 Homebrew / 手工安装
|
|
185
|
+
"/opt/local/bin", # MacPorts
|
|
186
|
+
os.path.expanduser("~/.local/bin"),
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _which_python(name: str) -> str:
|
|
191
|
+
"""按「PATH → 已知安装前缀」的顺序解析解释器;都找不到返回空串。
|
|
192
|
+
|
|
193
|
+
只替换 `shutil.which` 的调用点,语义是它的**严格超集**:PATH 上有就直接
|
|
194
|
+
用它(含用户自建的 shim/pyenv),没有才去惯例位置找。因此不会改变任何
|
|
195
|
+
「原本就能解析到」的机器上的选择。
|
|
196
|
+
"""
|
|
197
|
+
found = shutil.which(name)
|
|
198
|
+
if found:
|
|
199
|
+
return found
|
|
200
|
+
for prefix in _KNOWN_PY_PREFIXES:
|
|
201
|
+
cand = os.path.join(prefix, name)
|
|
202
|
+
if os.path.isfile(cand) and os.access(cand, os.X_OK):
|
|
203
|
+
return cand
|
|
204
|
+
return ""
|
|
205
|
+
|
|
206
|
+
|
|
148
207
|
def _pick_python() -> str:
|
|
149
208
|
"""选择可用解释器:ARGO_PYTHON 优先,其次高版本 python3.x,兜底当前解释器。
|
|
150
209
|
|
|
@@ -153,13 +212,17 @@ def _pick_python() -> str:
|
|
|
153
212
|
python3),只有在没有更高版本时才被选中——那时 MIN_PYTHON 仍会兜住,
|
|
154
213
|
不会静默选一个跑不动的解释器。
|
|
155
214
|
|
|
215
|
+
候选名经 `_which_python` 解析(PATH 优先 + 已知安装前缀兜底),见
|
|
216
|
+
_KNOWN_PY_PREFIXES 的实测记录:只查 PATH 会让「装了 3.14 但没进 PATH」
|
|
217
|
+
的机器静默回落到无 PyYAML 的系统 python。
|
|
218
|
+
|
|
156
219
|
探测结果落盘缓存(见 _PY_CACHE):命中时不再起子进程 import 依赖。显式
|
|
157
220
|
指定 ARGO_PYTHON 时不查也不写缓存——用户的覆盖是权威,不该被缓存遮蔽,
|
|
158
221
|
也不该把它固化下来。
|
|
159
222
|
"""
|
|
160
223
|
env_py = os.environ.get("ARGO_PYTHON", "").strip()
|
|
161
224
|
if env_py:
|
|
162
|
-
p =
|
|
225
|
+
p = _which_python(env_py) if not os.path.isabs(env_py) else env_py
|
|
163
226
|
if p and _probe_python(p, True):
|
|
164
227
|
return p
|
|
165
228
|
else:
|
|
@@ -177,9 +240,9 @@ def _pick_python() -> str:
|
|
|
177
240
|
if isinstance(cand, str):
|
|
178
241
|
if not cand:
|
|
179
242
|
continue
|
|
180
|
-
py = cand if os.path.isabs(cand) else
|
|
243
|
+
py = cand if os.path.isabs(cand) else _which_python(cand)
|
|
181
244
|
else:
|
|
182
|
-
launcher =
|
|
245
|
+
launcher = _which_python(cand[0])
|
|
183
246
|
py = _resolve_launcher([launcher] + list(cand[1:])) if launcher else ""
|
|
184
247
|
if not py:
|
|
185
248
|
continue
|
|
@@ -498,6 +561,8 @@ Usage:
|
|
|
498
561
|
argo paths [--check] [--migrate] 路径自省 / 本机自检 / 搬历史状态到惯例目录
|
|
499
562
|
argo daemon {{start|status|stop}} 常驻进程(search 自动走 UDS 快路径,消每次 ~85ms 启动+import;ARGO_NO_DAEMON=1 关)
|
|
500
563
|
argo stats [-n N] 使用日志与反馈状态(本地使用日志只读出口)
|
|
564
|
+
argo budget {{list|set|unset}} 按引擎的月度预算(原生币种;默认 DeepSeek ¥5/月)
|
|
565
|
+
argo quota [--json] [--refresh] 知乎开放平台当日额度(官方 API,不消耗业务额度)
|
|
501
566
|
|
|
502
567
|
Common flags: --json --mode {{fast|auto|deep|budget}} --max-results N --depth {{fast|balanced|deep}}
|
|
503
568
|
|
|
@@ -593,8 +658,16 @@ def main():
|
|
|
593
658
|
"job": ("job.py", []),
|
|
594
659
|
"preflight": ("batch_probe.py", []),
|
|
595
660
|
"mcp": ("mcp_setup.py", []),
|
|
661
|
+
# engine:新引擎一键接入(spec → 探测 → 派生 → 语料 → 验证 → 准入 → 同步)。
|
|
662
|
+
# `argo engine add --from-yaml ...` / `--from-url ...` / `--engine ...`;
|
|
663
|
+
# 详见 scripts/engine_add.py 与 docs/ADDING_NEW_ENGINE.md。
|
|
664
|
+
"engine": ("engine_add.py", []),
|
|
596
665
|
# stats:本地使用日志只读出口(日志与反馈的规范化入口,见 references/usage.md)
|
|
597
666
|
"stats": ("stats_cli.py", ["--json"]),
|
|
667
|
+
# budget:按引擎的月度预算(原生币种);quota 启动时读取并强制执行
|
|
668
|
+
"budget": ("budget_cli.py", []),
|
|
669
|
+
# quota:知乎开放平台当日额度(官方 /api/v1/quota,不消耗业务额度)
|
|
670
|
+
"quota": ("zhihu_quota.py", []),
|
|
598
671
|
# paths:路径自省(状态目录/密钥文件到底解析到了哪里)。支持类问题的
|
|
599
672
|
# 第一问,且不必进 MCP 工具面(与 answer/watch 同类)。
|
|
600
673
|
"paths": ("argo_paths.py", []),
|
package/bin/argo.js
CHANGED
|
@@ -45,9 +45,37 @@ const env = { ...process.env, PYTHONUTF8: process.env.PYTHONUTF8 || '1' };
|
|
|
45
45
|
|
|
46
46
|
const argv = process.argv.slice(2);
|
|
47
47
|
|
|
48
|
+
// 快速参数与帮助支持
|
|
49
|
+
if (argv[0] === '-v' || argv[0] === '--version') {
|
|
50
|
+
try {
|
|
51
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8'));
|
|
52
|
+
console.log(pkg.version);
|
|
53
|
+
} catch (_) {
|
|
54
|
+
console.log('2.9.9');
|
|
55
|
+
}
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (argv[0] === '-h' || argv[0] === '--help') {
|
|
60
|
+
console.log(`Argo Search — 专为 Agent 打造的统一搜索与证据核验工具
|
|
61
|
+
|
|
62
|
+
用法:
|
|
63
|
+
argo-search 启动 MCP Stdio 服务(默认)
|
|
64
|
+
argo-search mcp 显式启动 MCP Stdio 服务
|
|
65
|
+
argo-search call <tool> [json-args] CLI 单发调用指定 MCP 工具
|
|
66
|
+
argo-search -v, --version 查看当前版本
|
|
67
|
+
argo-search -h, --help 查看本帮助信息
|
|
68
|
+
|
|
69
|
+
环境依赖:
|
|
70
|
+
需要 Python 3.9+ 及 PyYAML。
|
|
71
|
+
无配置零门槛运行推荐: uvx argo-search argo-mcp
|
|
72
|
+
`);
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
|
|
48
76
|
// 子命令分发:`argo-search call <tool> '<json-args>'` —— CLI 单发,与 stdio
|
|
49
77
|
// 服务共用 mcp_server.py --call / execute_tool 入口(同引擎同压缩),供 DSH
|
|
50
|
-
// 原生工具等调用方免 MCP
|
|
78
|
+
// 原生工具等调用方免 MCP 帧协议复用;无子命令或 'mcp' 保持原行为:启动 stdio 服务。
|
|
51
79
|
if (argv[0] === 'call') {
|
|
52
80
|
const tool = argv[1];
|
|
53
81
|
if (!tool) {
|
|
@@ -66,7 +94,9 @@ if (argv[0] === 'call') {
|
|
|
66
94
|
process.exit(exitCodeOf(code, signal));
|
|
67
95
|
});
|
|
68
96
|
} else {
|
|
69
|
-
|
|
97
|
+
// 'mcp' 子命令作为 stdio 服务的显式别名,去除该前导参数
|
|
98
|
+
const forwardedArgs = argv[0] === 'mcp' ? argv.slice(1) : argv;
|
|
99
|
+
const proc = spawn(PYTHON, [SCRIPT, ...forwardedArgs], {
|
|
70
100
|
stdio: ['pipe', 'pipe', 'inherit'],
|
|
71
101
|
env,
|
|
72
102
|
});
|
|
@@ -77,6 +107,7 @@ if (argv[0] === 'call') {
|
|
|
77
107
|
proc.on('error', (err) => {
|
|
78
108
|
console.error(`argo-search: 无法启动 Python (${PYTHON}): ${err.message}`);
|
|
79
109
|
console.error('请确认已安装 Python 3.9+,并已执行: pip install pyyaml');
|
|
110
|
+
console.error('或使用无需预装环境的现代包管理工具: uvx argo-search argo-mcp');
|
|
80
111
|
process.exit(1);
|
|
81
112
|
});
|
|
82
113
|
|