@konbakuyomu/smart-search-linux-x64 0.1.31 → 0.1.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/package.json +1 -1
  2. package/runtime/smart-search/_internal/base_library.zip +0 -0
  3. package/runtime/smart-search/_internal/certifi/cacert.pem +0 -51
  4. package/runtime/smart-search/_internal/smart_search/assets/i18n/messages.json +112 -0
  5. package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/cli-core.md +2 -2
  6. package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/command-patterns.md +3 -0
  7. package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/provider-routing.md +13 -4
  8. package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/setup-config.md +1 -0
  9. package/runtime/smart-search/_internal/smart_search/cli.py +41 -8
  10. package/runtime/smart-search/_internal/smart_search/config.py +34 -1
  11. package/runtime/smart-search/_internal/smart_search/jev_search.py +2 -0
  12. package/runtime/smart-search/_internal/smart_search/provider_descriptions.py +8 -0
  13. package/runtime/smart-search/_internal/smart_search/providers/__init__.py +2 -0
  14. package/runtime/smart-search/_internal/smart_search/providers/xai_responses.py +14 -9
  15. package/runtime/smart-search/_internal/smart_search/providers/yuanbao.py +157 -0
  16. package/runtime/smart-search/_internal/smart_search/service.py +98 -54
  17. package/runtime/smart-search/_internal/smart_search/ui_metadata.py +30 -2
  18. package/runtime/smart-search/_internal/{smart_search-0.1.31.dist-info → smart_search-0.1.32.dist-info}/METADATA +3 -3
  19. package/runtime/smart-search/_internal/{smart_search-0.1.31.dist-info → smart_search-0.1.32.dist-info}/RECORD +24 -22
  20. package/runtime/smart-search/_internal/{smart_search-0.1.31.dist-info → smart_search-0.1.32.dist-info}/WHEEL +1 -1
  21. package/runtime/smart-search/_internal/wcwidth/_wcwidth_c.abi3.so +0 -0
  22. package/runtime/smart-search/_internal/wcwidth/_wcwidth_c.pyi +6 -0
  23. package/runtime/smart-search/package.json +7 -7
  24. package/runtime/smart-search/smart-search +0 -0
  25. /package/runtime/smart-search/_internal/{smart_search-0.1.31.dist-info → smart_search-0.1.32.dist-info}/INSTALLER +0 -0
  26. /package/runtime/smart-search/_internal/{smart_search-0.1.31.dist-info → smart_search-0.1.32.dist-info}/REQUESTED +0 -0
  27. /package/runtime/smart-search/_internal/{smart_search-0.1.31.dist-info → smart_search-0.1.32.dist-info}/direct_url.json +0 -0
  28. /package/runtime/smart-search/_internal/{smart_search-0.1.31.dist-info → smart_search-0.1.32.dist-info}/entry_points.txt +0 -0
  29. /package/runtime/smart-search/_internal/{smart_search-0.1.31.dist-info → smart_search-0.1.32.dist-info}/licenses/LICENSE +0 -0
  30. /package/runtime/smart-search/_internal/{smart_search-0.1.31.dist-info → smart_search-0.1.32.dist-info}/top_level.txt +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@konbakuyomu/smart-search-linux-x64",
3
- "version": "0.1.31",
3
+ "version": "0.1.32",
4
4
  "description": "Self-contained Smart Search CLI for linux/x64",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -2005,57 +2005,6 @@ RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
2005
2005
  iN66zB+Afko=
2006
2006
  -----END CERTIFICATE-----
2007
2007
 
2008
- # Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI
2009
- # Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI
2010
- # Label: "emSign Root CA - C1"
2011
- # Serial: 825510296613316004955058
2012
- # MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68
2013
- # SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01
2014
- # SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f
2015
- -----BEGIN CERTIFICATE-----
2016
- MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG
2017
- A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg
2018
- SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw
2019
- MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln
2020
- biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v
2021
- dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ
2022
- BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ
2023
- HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH
2024
- 3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH
2025
- GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c
2026
- xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1
2027
- aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq
2028
- TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
2029
- BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87
2030
- /kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4
2031
- kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG
2032
- YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT
2033
- +xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo
2034
- WXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
2035
- -----END CERTIFICATE-----
2036
-
2037
- # Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI
2038
- # Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI
2039
- # Label: "emSign ECC Root CA - C3"
2040
- # Serial: 582948710642506000014504
2041
- # MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5
2042
- # SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66
2043
- # SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3
2044
- -----BEGIN CERTIFICATE-----
2045
- MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG
2046
- EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx
2047
- IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw
2048
- MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln
2049
- biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND
2050
- IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci
2051
- MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti
2052
- sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O
2053
- BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
2054
- Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c
2055
- 3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J
2056
- 0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
2057
- -----END CERTIFICATE-----
2058
-
2059
2008
  # Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post
2060
2009
  # Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post
2061
2010
  # Label: "Hongkong Post Root CA 3"
@@ -1447,6 +1447,34 @@
1447
1447
  "TinyFish 搜索与抓取 API 均可用",
1448
1448
  "Both TinyFish search and fetch APIs are available"
1449
1449
  ],
1450
+ "Yuanbao Search API is available": [
1451
+ "元宝搜索 API 可用",
1452
+ "Yuanbao Search API is available"
1453
+ ],
1454
+ "YUANBAO_SECRET_ID or YUANBAO_SECRET_KEY is not set; Yuanbao Search is unavailable": [
1455
+ "YUANBAO_SECRET_ID 或 YUANBAO_SECRET_KEY 未设置,元宝搜索不可用",
1456
+ "YUANBAO_SECRET_ID or YUANBAO_SECRET_KEY is not set; Yuanbao Search is unavailable"
1457
+ ],
1458
+ "Yuanbao Search: {0}": [
1459
+ "元宝搜索:{0}",
1460
+ "Yuanbao Search: {0}"
1461
+ ],
1462
+ "Yuanbao Search API request timed out": [
1463
+ "元宝搜索 API 请求超时",
1464
+ "Yuanbao Search API request timed out"
1465
+ ],
1466
+ "YUANBAO_SECRET_ID and YUANBAO_SECRET_KEY are not configured.": [
1467
+ "YUANBAO_SECRET_ID 和 YUANBAO_SECRET_KEY 未配置。",
1468
+ "YUANBAO_SECRET_ID and YUANBAO_SECRET_KEY are not configured."
1469
+ ],
1470
+ "Yuanbao search response is missing Response": [
1471
+ "元宝搜索响应缺少 Response",
1472
+ "Yuanbao search response is missing Response"
1473
+ ],
1474
+ "Yuanbao search Pages is not a list": [
1475
+ "元宝搜索返回的 Pages 不是列表",
1476
+ "Yuanbao search Pages is not a list"
1477
+ ],
1450
1478
  "Branch or version": [
1451
1479
  "分支或版本",
1452
1480
  "Branch or version"
@@ -4635,6 +4663,10 @@
4635
4663
  "OpenAI 兼容 API 模式",
4636
4664
  "openai-compatible API mode"
4637
4665
  ],
4666
+ "xai-responses 流式": [
4667
+ "xai-responses 流式",
4668
+ "xai-responses stream"
4669
+ ],
4638
4670
  "OpenAI 兼容回退": [
4639
4671
  "OpenAI 兼容回退",
4640
4672
  "openai-compatible fallback"
@@ -5735,6 +5767,10 @@
5735
5767
  "保存 XAI_TOOLS。",
5736
5768
  "Save XAI_TOOLS."
5737
5769
  ],
5770
+ "Save XAI_STREAM.": [
5771
+ "保存 XAI_STREAM。",
5772
+ "Save XAI_STREAM."
5773
+ ],
5738
5774
  "Save ZHIPU_API_KEY.": [
5739
5775
  "保存 ZHIPU_API_KEY。",
5740
5776
  "Save ZHIPU_API_KEY."
@@ -7387,6 +7423,34 @@
7387
7423
  "TinyFish 搜索与抓取 API 均可用",
7388
7424
  "Both TinyFish search and fetch APIs are available"
7389
7425
  ],
7426
+ "元宝搜索 API 可用": [
7427
+ "元宝搜索 API 可用",
7428
+ "Yuanbao Search API is available"
7429
+ ],
7430
+ "YUANBAO_SECRET_ID 或 YUANBAO_SECRET_KEY 未设置,元宝搜索不可用": [
7431
+ "YUANBAO_SECRET_ID 或 YUANBAO_SECRET_KEY 未设置,元宝搜索不可用",
7432
+ "YUANBAO_SECRET_ID or YUANBAO_SECRET_KEY is not set; Yuanbao Search is unavailable"
7433
+ ],
7434
+ "元宝搜索:{0}": [
7435
+ "元宝搜索:{0}",
7436
+ "Yuanbao Search: {0}"
7437
+ ],
7438
+ "元宝搜索 API 请求超时": [
7439
+ "元宝搜索 API 请求超时",
7440
+ "Yuanbao Search API request timed out"
7441
+ ],
7442
+ "YUANBAO_SECRET_ID 和 YUANBAO_SECRET_KEY 未配置。": [
7443
+ "YUANBAO_SECRET_ID 和 YUANBAO_SECRET_KEY 未配置。",
7444
+ "YUANBAO_SECRET_ID and YUANBAO_SECRET_KEY are not configured."
7445
+ ],
7446
+ "元宝搜索响应缺少 Response": [
7447
+ "元宝搜索响应缺少 Response",
7448
+ "Yuanbao search response is missing Response"
7449
+ ],
7450
+ "元宝搜索返回的 Pages 不是列表": [
7451
+ "元宝搜索返回的 Pages 不是列表",
7452
+ "Yuanbao search Pages is not a list"
7453
+ ],
7390
7454
  "TinyFish 搜索响应不是 JSON 对象": [
7391
7455
  "TinyFish 搜索响应不是 JSON 对象",
7392
7456
  "TinyFish search response is not a JSON object"
@@ -8415,6 +8479,10 @@
8415
8479
  "OpenAI 兼容 API 模式",
8416
8480
  "openai-compatible API mode"
8417
8481
  ],
8482
+ "xai-responses stream": [
8483
+ "xai-responses 流式",
8484
+ "xai-responses stream"
8485
+ ],
8418
8486
  "openai-compatible fallback": [
8419
8487
  "OpenAI 兼容回退",
8420
8488
  "openai-compatible fallback"
@@ -8675,10 +8743,26 @@
8675
8743
  "xAI Responses API 可用 (HTTP {0})",
8676
8744
  "xAI Responses API is available (HTTP {0})"
8677
8745
  ],
8746
+ "{0} (sent: {1})": [
8747
+ "{0}(本次发送:{1})",
8748
+ "{0} (sent: {1})"
8749
+ ],
8750
+ "xAI Responses stream returned no text": [
8751
+ "xAI Responses 流式响应没有返回文本",
8752
+ "xAI Responses stream returned no text"
8753
+ ],
8678
8754
  "xAI Responses API 可用 (HTTP {0})": [
8679
8755
  "xAI Responses API 可用 (HTTP {0})",
8680
8756
  "xAI Responses API is available (HTTP {0})"
8681
8757
  ],
8758
+ "{0}(本次发送:{1})": [
8759
+ "{0}(本次发送:{1})",
8760
+ "{0} (sent: {1})"
8761
+ ],
8762
+ "xAI Responses 流式响应没有返回文本": [
8763
+ "xAI Responses 流式响应没有返回文本",
8764
+ "xAI Responses stream returned no text"
8765
+ ],
8682
8766
  "xAI Responses model": [
8683
8767
  "xAI 模型",
8684
8768
  "xAI Responses model"
@@ -9527,6 +9611,10 @@
9527
9611
  "保存 XAI_TOOLS。",
9528
9612
  "Save XAI_TOOLS."
9529
9613
  ],
9614
+ "保存 XAI_STREAM。": [
9615
+ "保存 XAI_STREAM。",
9616
+ "Save XAI_STREAM."
9617
+ ],
9530
9618
  "保存 ZHIPU_API_KEY。": [
9531
9619
  "保存 ZHIPU_API_KEY。",
9532
9620
  "Save ZHIPU_API_KEY."
@@ -18026,5 +18114,29 @@
18026
18114
  "检索渠道": [
18027
18115
  "检索渠道",
18028
18116
  "Retrieval channel"
18117
+ ],
18118
+ "{0} · 正在连接": [
18119
+ "{0} · 正在连接",
18120
+ "{0} · Connecting"
18121
+ ],
18122
+ "再次检测没有找到正在使用的 Smart Search CLI,当前连接保持不变。如已卸载或移动,请在“环境详情…”中重新检测。": [
18123
+ "再次检测没有找到正在使用的 Smart Search CLI,当前连接保持不变。如已卸载或移动,请在“环境详情…”中重新检测。",
18124
+ "Detecting again did not find the Smart Search CLI in use, so the current connection stays. If you uninstalled or moved it, choose Detect again in Environment details…."
18125
+ ],
18126
+ "Smart Search CLI 有变化。完成当前任务后,点击右上角的刷新即可切换。": [
18127
+ "Smart Search CLI 有变化。完成当前任务后,点击右上角的刷新即可切换。",
18128
+ "The Smart Search CLI has changed. When the current task is done, click Refresh at the top right to switch to it."
18129
+ ],
18130
+ "Smart Search CLI 有变化,已切换到 {0}。": [
18131
+ "Smart Search CLI 有变化,已切换到 {0}。",
18132
+ "The Smart Search CLI has changed; switched to {0}."
18133
+ ],
18134
+ "Smart Search {0} 已发布,当前版本为 {1}。立即更新会下载新版本并重启 App;配置、独立 CLI 和 Skills 会保留。": [
18135
+ "Smart Search {0} 已发布,当前版本为 {1}。立即更新会下载新版本并重启 App;配置、独立 CLI 和 Skills 会保留。",
18136
+ "Smart Search {0} is available (you have {1}). Update now downloads it and restarts the App; your configuration, independent CLI and Skills are kept."
18137
+ ],
18138
+ "立即更新": [
18139
+ "立即更新",
18140
+ "Update now"
18029
18141
  ]
18030
18142
  }
@@ -43,12 +43,12 @@
43
43
  - `smart-search context7-library NAME [QUERY] [--format json|markdown|content] [--output PATH]`
44
44
  - `smart-search context7-docs LIBRARY_ID QUERY [--format json|markdown|content] [--output PATH]`
45
45
  - `smart-search deep QUERY [--budget quick|standard|deep] [--evidence-dir PATH] [--format json|markdown|content] [--output PATH]`
46
- - `smart-search research QUERY [--budget quick|standard|deep] [--evidence-dir PATH] [--fallback auto|off] [--format json|markdown|content] [--output PATH]`
46
+ - `smart-search research QUERY [--budget quick|standard|deep] [--evidence-dir PATH] [--fallback auto|off] [--stream|--no-stream] [--format json|markdown|content] [--output PATH]`
47
47
  - `smart-search route-calibrate [--models CSV] [--format json|markdown|content] [--output PATH]`
48
48
  - `smart-search map URL [--instructions TEXT] [--max-depth N] [--max-breadth N] [--limit N] [--timeout SECONDS] [--format json|markdown|content] [--output PATH]`
49
49
  - `smart-search doctor [--format json|markdown|content] [--output PATH]`
50
50
  - `smart-search diagnose openai-compatible [--timeout SECONDS] [--format json|markdown] [--output PATH]`
51
- - `smart-search setup [--lang zh|en] [--advanced] [--non-interactive] [--skip-skills] [--install-skills CSV] [--skills-root PATH] [--xai-api-url URL] [--xai-api-key KEY] [--xai-model ID] [--xai-tools-explicit CSV] [--openai-compatible-api-url URL] [--openai-compatible-api-key KEY] [--openai-compatible-model ID] [--openai-compatible-fallback-models CSV] [--openai-compatible-api-mode chat-completions|responses] [--openai-compatible-stream true|false] [--validation-level fast|balanced|strict] [--fallback-mode auto|off] [--minimum-profile standard|off] [--intent-router jev|local] [--search-timeout SECONDS] [--provider-cooldown SECONDS] [--provider-failure-threshold N] [--exa-key KEY] [--context7-key KEY] [--zhipu-key KEY] [--zhipu-api-url URL] [--zhipu-search-engine ENGINE] [--zhipu-mcp-key KEY] [--zhipu-mcp-search-api-url URL] [--zhipu-mcp-reader-api-url URL] [--zhipu-mcp-zread-api-url URL] [--zhipu-mcp-timeout SECONDS] [--jina-key KEY] [--jina-reader-api-url URL] [--jina-respond-with MODE] [--jina-timeout SECONDS] [--tavily-api-url URL] [--tavily-key KEY] [--firecrawl-api-url URL] [--firecrawl-key KEY] [--tinyfish-key KEY] [--tinyfish-search-api-url URL] [--tinyfish-fetch-api-url URL] [--tinyfish-timeout SECONDS] [--deepseek-key KEY] [--deepseek-api-url URL] [--deepseek-timeout SECONDS] [--anysearch-api-url URL] [--anysearch-key KEY] [--anysearch-timeout SECONDS] [--sciverse-api-url URL] [--sciverse-token TOKEN] [--sciverse-timeout SECONDS] [--format json|markdown|content] [--output PATH]`
51
+ - `smart-search setup [--lang zh|en] [--advanced] [--non-interactive] [--skip-skills] [--install-skills CSV] [--skills-root PATH] [--xai-api-url URL] [--xai-api-key KEY] [--xai-model ID] [--xai-tools-explicit CSV] [--xai-stream true|false] [--openai-compatible-api-url URL] [--openai-compatible-api-key KEY] [--openai-compatible-model ID] [--openai-compatible-fallback-models CSV] [--openai-compatible-api-mode chat-completions|responses] [--openai-compatible-stream true|false] [--validation-level fast|balanced|strict] [--fallback-mode auto|off] [--minimum-profile standard|off] [--intent-router jev|local] [--search-timeout SECONDS] [--provider-cooldown SECONDS] [--provider-failure-threshold N] [--exa-key KEY] [--context7-key KEY] [--zhipu-key KEY] [--zhipu-api-url URL] [--zhipu-search-engine ENGINE] [--zhipu-mcp-key KEY] [--zhipu-mcp-search-api-url URL] [--zhipu-mcp-reader-api-url URL] [--zhipu-mcp-zread-api-url URL] [--zhipu-mcp-timeout SECONDS] [--jina-key KEY] [--jina-reader-api-url URL] [--jina-respond-with MODE] [--jina-timeout SECONDS] [--tavily-api-url URL] [--tavily-key KEY] [--firecrawl-api-url URL] [--firecrawl-key KEY] [--tinyfish-key KEY] [--tinyfish-search-api-url URL] [--tinyfish-fetch-api-url URL] [--tinyfish-timeout SECONDS] [--yuanbao-secret-id ID] [--yuanbao-secret-key KEY] [--yuanbao-api-url URL] [--yuanbao-timeout SECONDS] [--deepseek-key KEY] [--deepseek-api-url URL] [--deepseek-timeout SECONDS] [--anysearch-api-url URL] [--anysearch-key KEY] [--anysearch-timeout SECONDS] [--sciverse-api-url URL] [--sciverse-token TOKEN] [--sciverse-timeout SECONDS] [--format json|markdown|content] [--output PATH]`
52
52
  - `smart-search config path|list|set|unset ... [--format json|markdown|content] [--output PATH]`
53
53
  - `smart-search model set MODEL [--format json|markdown|content] [--output PATH]`
54
54
  - `smart-search model current [--format json|markdown|content] [--output PATH]`
@@ -71,6 +71,7 @@ smart-search config set XAI_API_KEY "key" --format json
71
71
  smart-search config set XAI_MODEL "grok-4-fast" --format json
72
72
  smart-search config set XAI_TOOLS "web_search,x_search" --format json
73
73
  smart-search config set XAI_REASONING_EFFORT "high" --format json
74
+ smart-search config set XAI_STREAM "true" --format json
74
75
  smart-search search "Latest Grok news" --providers xai-responses --stream --format json
75
76
  smart-search config set OPENAI_COMPATIBLE_API_URL "https://api.openai.com/v1" --format json
76
77
  smart-search config set OPENAI_COMPATIBLE_API_KEY "key" --format json
@@ -98,6 +99,8 @@ smart-search config set TINYFISH_SEARCH_API_URL "https://api.search.tinyfish.ai"
98
99
  smart-search config set TINYFISH_FETCH_API_URL "https://api.fetch.tinyfish.ai" --format json
99
100
  smart-search config set DEEPSEEK_API_KEY "key" --format json
100
101
  smart-search config set DEEPSEEK_API_URL "https://api.deepseek.com" --format json
102
+ smart-search config set YUANBAO_SECRET_ID "id" --format json
103
+ smart-search config set YUANBAO_SECRET_KEY "key" --format json
101
104
  smart-search model current --format json
102
105
  smart-search doctor --format json
103
106
  smart-search doctor --format markdown
@@ -22,10 +22,11 @@ For research, `SMART_SEARCH_JEV_SYNTHESIZE` accepts `true`, `false`, and `auto`.
22
22
 
23
23
  - `deep` uses offline rules/local signals only and must not call remote embeddings or classifier components.
24
24
  - Official xAI uses `/responses` through `XAI_*`. OpenAI-compatible relays default to `/chat/completions`; `OPENAI_COMPATIBLE_API_MODE=responses` explicitly selects `/responses` for a relay that supports the documented subset.
25
- - `search --stream` sets `stream=true` for xAI Responses and OpenAI-compatible search, including Grok search selected by Jev. `--no-stream` disables streaming for that request. `OPENAI_COMPATIBLE_STREAM=true` remains the default switch for OpenAI-compatible search and provider-side fetch.
25
+ - `search --stream` and `research --stream` set `stream=true` for xAI Responses and OpenAI-compatible search, including Grok search selected by Jev. `--no-stream` disables streaming for that request. `OPENAI_COMPATIBLE_STREAM=true` remains the default switch for OpenAI-compatible search and provider-side fetch.
26
+ - `XAI_STREAM` defaults to `false` and accepts `true`, `1`, or `yes` as true. When true, every xAI Responses request uses `stream=true`, including `research` and Grok search selected by Jev; `--stream` / `--no-stream` override it for one run. A failed xAI stream is an error; it is not retried with `stream=false`.
26
27
  - Legacy `SMART_SEARCH_API_URL`, `SMART_SEARCH_API_KEY`, `SMART_SEARCH_API_MODE`, `SMART_SEARCH_MODEL`, and `SMART_SEARCH_XAI_TOOLS` are unsupported config keys.
27
28
  - xAI Responses mode may use only `XAI_TOOLS=web_search,x_search` and a subset of those tools.
28
- - `XAI_REASONING_EFFORT` accepts `low`, `medium`, or `high` (case-insensitive, stored lowercase). Optional; when set, sends reasoning.effort in xAI Responses requests; omitted by default. This also applies to Grok search selected by Jev. Unsupported reasoning values reported by the upstream API remain errors; the field is not silently removed and retried.
29
+ - `XAI_REASONING_EFFORT` accepts `low`, `medium`, or `high` (case-insensitive, stored lowercase). Optional; when set, sends reasoning.effort in xAI Responses requests; omitted by default. This also applies to Grok search selected by Jev. Unsupported reasoning values reported by the upstream API remain errors; the field is not silently removed and retried. The xAI connection test in `doctor` and the App sends the same `reasoning.effort` and `stream` as a search, without tools, and names them in its message and under `sent`; a stream that fails after HTTP 200 fails the test.
29
30
  - Neither OpenAI-compatible API mode sends xAI `web_search` / `x_search` tools or legacy `search_parameters`; xAI Chat Completions Live Search is deprecated.
30
31
  - AnySearch is reported only as optional experimental `vertical_search`; it is not part of the `web_search` fallback and is not required by the `standard` minimum profile.
31
32
  - Sciverse is reported only as optional experimental explicit-only `vertical_search`; it is not `docs_search`, not part of default `search` / `research` fallback, and not required by the `standard` minimum profile.
@@ -33,7 +34,7 @@ For research, `SMART_SEARCH_JEV_SYNTHESIZE` accepts `true`, `false`, and `auto`.
33
34
  - Same-capability fallback is allowed; model answers and web search are mutual fallbacks in ordinary search. Context7 is not used for unrelated broad web queries, and page extraction providers are not used as docs search providers.
34
35
  - `TAVILY_ENABLED=false` removes Tavily from registered `web_search` and `web_fetch` routes even when its key is present. Direct Tavily search/extract calls, `map`, `doctor`, and smoke must make no Tavily network request; `map` reports a local configuration error. Firecrawl remains independently configured and all fallback stays within its capability.
35
36
  - In Jev mode, Jev chooses among allowed capabilities and providers for the question; there is no mandatory main-model call or fixed global provider order. Local routing prioritizes suitable capabilities and configured preferences; a docs question with no docs channel configured uses web search instead of no channel.
36
- - `main_search` contains xAI Responses and OpenAI-compatible model channels; `web_search` contains Zhipu REST/MCP, Tavily, Firecrawl, TinyFish and DeepSeek; `docs_search` contains Context7 and Exa. Failure fallback stays within the selected capability family; model answers and web search are mutual fallbacks in ordinary search.
37
+ - `main_search` contains xAI Responses and OpenAI-compatible model channels; `web_search` contains Zhipu REST/MCP, Tavily, Firecrawl, TinyFish, DeepSeek and Yuanbao Search; `docs_search` contains Context7 and Exa. Failure fallback stays within the selected capability family; model answers and web search are mutual fallbacks in ordinary search.
37
38
  - Ordinary Context7 uses the first library in Context7's ranked candidates, without a second Jev call. Research may use Jev to select the matching library, using the first candidate if Jev fails or no score reaches its threshold. Empty results may fall through to same-capability Exa; explicit Context7 commands remain unchanged.
38
39
  - `--extra-sources N` controls the selected channel's result count. It does not add channels, split a budget between providers, or make Tavily/Firecrawl a required extra stage. A known-URL search follows the configured Jev/local routing; local routing prefers page reading.
39
40
  - `fetch` tries Tavily first, then Jina with `JINA_API_KEY`, then Zhipu Coding Plan MCP Reader, then Firecrawl, then TinyFish, then DeepSeek.
@@ -55,6 +56,14 @@ DeepSeek:
55
56
  - Search results normalize `summary` (falling back to `snippet`) to `description`, `site_name` to `source`, and `date` to `published_date`. Summaries are not page text: fetch a key page before citing it. An empty result set is a successful empty response.
56
57
  - Fetch returns the page Markdown. HTTP 403 (URL refused by DeepSeek's safety policy) and 404 (no usable page content, which currently includes PDF links and private network addresses) mean that page has nothing to read: the attempt is `empty`, fallback continues, and the provider is not cooled down. `401` maps to `auth_error`, `402` (insufficient balance) to `provider_error`, `429` to `rate_limited`, `5xx` to `network_error`.
57
58
  - DeepSeek bills each successful search or fetch request. `doctor` and `providers test deepseek` send one real request to each.
59
+
60
+ Yuanbao Search:
61
+
62
+ - `YUANBAO_SECRET_ID` and `YUANBAO_SECRET_KEY`, a Tencent Cloud API key with Yuanbao Search enabled, register Yuanbao Search for `web_search` only. It never satisfies `main_search`, `docs_search` or `web_fetch`. Jev may select it directly; `search --providers yuanbao` forces it.
63
+ - `YUANBAO_API_URL` defaults to `https://wsa.tencentcloudapi.com`. Each search is one Tencent Cloud API 3.0 `SearchPro` call (version `2025-05-08`) with `{"Query"}`, signed with TC3-HMAC-SHA256 the way the official SDK signs it. Never log or echo either secret.
64
+ - Results normalize `passage` to `description`, the longer `content` summary (standard and flagship tiers only) to `content`, `site` to `source`, and `date` to `published_date`. At most 10 results come back.
65
+ - Errors arrive as HTTP 200 with `Response.Error`. `AuthFailure*` and `UnauthorizedOperation*` map to `auth_error`, `RequestLimitExceeded*` and `LimitExceeded*` to `rate_limited`, `InvalidParameter*`, `MissingParameter*` and `UnknownParameter*` to `parameter_error`, and any other code to `provider_error`; the code stays in the message.
66
+ - Every search counts against the Tencent Cloud quota. `doctor` and `providers test yuanbao` send one real search.
58
67
  - `map` currently uses Tavily only.
59
68
  - `exa-search` and `exa-similar` use Exa only.
60
69
  - `context7-library` and `context7-docs` use Context7 only.
@@ -135,7 +144,7 @@ OpenAI-compatible streaming:
135
144
  - `SMART_SEARCH_TIMEOUT_SECONDS` defines one 300-second default monotonic `search` budget. Jev selection, channel dependencies and failure fallback share its remaining time; no budget is reserved for a mandatory main model. `search --timeout` overrides the saved value for one invocation. Research uses the same deadline with its configured budget ceilings.
136
145
  - `OPENAI_COMPATIBLE_FALLBACK_MODELS` is an optional comma-separated ordered list. It is fail-over after a hard primary-model failure, not a time slice. The current candidate keeps the remaining shared main-search budget; extra fallback models must not shrink that budget. `--fallback off` or `--model MODEL` disables this model fallback for the invocation.
137
146
  - `timeout_phase`, `phase_attempts`, elapsed/remaining deadline values, and `partial_success` report execution progress. Research judgment/filter/synthesis failures preserve completed evidence; ordinary search has no extra/supplemental phase. Strict validation still reports an evidence error when its source requirements are not met.
138
- - OpenAI-compatible attempts may include `model`, `transport`, `fallback_from_transport`, `fallback_from_model`, and `breaker_state`. `transport_fallback_used` records stream-to-non-stream recovery separately from provider/model `fallback_used`.
147
+ - OpenAI-compatible attempts may include `model`, `transport`, `fallback_from_transport`, `fallback_from_model`, and `breaker_state`. `transport_fallback_used` records stream-to-non-stream recovery separately from provider/model `fallback_used`. xAI Responses attempts include `stream`, `transport`, and `reasoning_effort`.
139
148
  - Streaming applies to xAI Responses `search()` and OpenAI-compatible `search()` and provider-side `fetch()` calls. `describe_url()` and `rank_sources()` stay non-streaming. xAI Responses uses the shared Responses SSE parser and does not retry with `stream=false`.
140
149
 
141
150
  Exa domain filters:
@@ -99,6 +99,7 @@
99
99
  - `TINYFISH_SEARCH_API_URL` defaults to `https://api.search.tinyfish.ai`, and `TINYFISH_FETCH_API_URL` defaults to `https://api.fetch.tinyfish.ai`. Both authenticate with the `X-API-Key` header, not a bearer token.
100
100
  - `TINYFISH_TIMEOUT_SECONDS` defaults to `60` and covers both TinyFish search and fetch reads.
101
101
  - Use `smart-search setup --non-interactive --deepseek-key "key"` to add DeepSeek to `web_search` and `web_fetch` with the same key as the DeepSeek model API. It never satisfies `main_search` or `docs_search`; Jev can select it among the allowed channels.
102
+ - Use `smart-search setup --non-interactive --yuanbao-secret-id "id" --yuanbao-secret-key "key"` to add Yuanbao Search to `web_search` with a Tencent Cloud API key that has Yuanbao Search enabled. It never satisfies `main_search`, `docs_search` or `web_fetch`. `YUANBAO_API_URL` defaults to `https://wsa.tencentcloudapi.com`, and `YUANBAO_TIMEOUT_SECONDS` defaults to `30`.
102
103
  - `DEEPSEEK_API_URL` defaults to `https://api.deepseek.com`, and `DEEPSEEK_TIMEOUT_SECONDS` defaults to `60` and covers both DeepSeek search and fetch reads. Each successful DeepSeek request is billed.
103
104
 
104
105
  ## Provider Failure Cooldown
@@ -628,6 +628,7 @@ def _format_doctor_markdown(data: dict[str, Any]) -> str:
628
628
  ("firecrawl", data.get("firecrawl_connection_test") or {}),
629
629
  ("tinyfish", data.get("tinyfish_connection_test") or {}),
630
630
  ("deepseek", data.get("deepseek_connection_test") or {}),
631
+ ("yuanbao", data.get("yuanbao_connection_test") or {}),
631
632
  ("zhipu", data.get("zhipu_connection_test") or {}),
632
633
  ("zhipu-mcp", data.get("zhipu_mcp_connection_test") or {}),
633
634
  ("context7", data.get("context7_connection_test") or {}),
@@ -862,6 +863,8 @@ def _format_model_markdown(data: dict[str, Any]) -> str:
862
863
  rows = []
863
864
  if data.get("xai_model"):
864
865
  rows.append(["xai-responses", data.get("xai_model")])
866
+ if "xai_stream" in data:
867
+ rows.append([tr('xai-responses stream'), "true" if data["xai_stream"] else "false"])
865
868
  if data.get("openai_compatible_model"):
866
869
  rows.append(["openai-compatible", data.get("openai_compatible_model")])
867
870
  if data.get("openai_compatible_api_mode"):
@@ -1424,6 +1427,12 @@ def _print_result(command: str, data: dict[str, Any], fmt: str, output: str = ""
1424
1427
  return _exit_code(data)
1425
1428
 
1426
1429
 
1430
+ def _add_stream_args(parser: argparse.ArgumentParser) -> None:
1431
+ group = parser.add_mutually_exclusive_group()
1432
+ group.add_argument("--stream", dest="stream", action="store_true", default=None, help="Use stream=true for xAI Responses or OpenAI-compatible main search.")
1433
+ group.add_argument("--no-stream", dest="stream", action="store_false", help="Force stream=false for xAI Responses or OpenAI-compatible main search.")
1434
+
1435
+
1427
1436
  def _add_format_args(parser: argparse.ArgumentParser) -> None:
1428
1437
  parser.add_argument("--format", choices=["json", "markdown", "content"], default="json")
1429
1438
  parser.add_argument("--output", default="", help="Write rendered output to a file.")
@@ -1479,6 +1488,7 @@ def _display_provider(provider: str, lang: str) -> str:
1479
1488
  "tavily": "Tavily",
1480
1489
  "firecrawl": "Firecrawl",
1481
1490
  "tinyfish": "TinyFish",
1491
+ "yuanbao": _t(lang, "元宝搜索", "Yuanbao Search"),
1482
1492
  "deepseek": "DeepSeek",
1483
1493
  "anysearch": "AnySearch",
1484
1494
  "sciverse": "Sciverse",
@@ -2125,14 +2135,14 @@ def _prompt_optional_enhancements(values: dict[str, str], current: dict[str, str
2125
2135
  _write_stderr(
2126
2136
  _t(
2127
2137
  lang,
2128
- "\n[可选增强] web_search 网页补强\n用途: 中文、国内、时效、域名过滤类来源检索。\n推荐: 中文场景建议配置 Zhipu。\n",
2129
- "\n[Optional] web_search web reinforcement\nPurpose: Chinese, domestic, current, or domain-filtered source discovery.\nRecommended: configure Zhipu for Chinese/current scenarios.\n",
2138
+ "\n[可选增强] web_search 网页补强\n用途: 中文、国内、时效、域名过滤类来源检索。\n推荐: 中文场景建议配置 Zhipu;需要腾讯新闻等腾讯内容时可加元宝搜索。\n",
2139
+ "\n[Optional] web_search web reinforcement\nPurpose: Chinese, domestic, current, or domain-filtered source discovery.\nRecommended: configure Zhipu for Chinese/current scenarios; add Yuanbao Search for Tencent content such as Tencent News.\n",
2130
2140
  )
2131
2141
  )
2132
- default_selected = ["zhipu"] if current.get("ZHIPU_API_KEY") else []
2142
+ default_selected = [provider for provider, key in (("zhipu", "ZHIPU_API_KEY"), ("yuanbao", "YUANBAO_SECRET_KEY")) if current.get(key)]
2133
2143
  selected = _prompt_provider_multi_select(
2134
2144
  _t(lang, "选择可选 web_search 增强", "Choose optional web_search reinforcement"),
2135
- ["zhipu"],
2145
+ ["zhipu", "yuanbao"],
2136
2146
  default_selected,
2137
2147
  lang,
2138
2148
  )
@@ -2140,6 +2150,13 @@ def _prompt_optional_enhancements(values: dict[str, str], current: dict[str, str
2140
2150
  values["ZHIPU_API_KEY"] = _prompt_value("ZHIPU_API_KEY", "Zhipu API key", current.get("ZHIPU_API_KEY", ""), lang=lang)
2141
2151
  _prompt_zhipu_api_url(values, current, lang)
2142
2152
  _prompt_zhipu_search_engine(values, current, lang)
2153
+ if "yuanbao" in selected:
2154
+ values["YUANBAO_SECRET_ID"] = _prompt_value(
2155
+ "YUANBAO_SECRET_ID", "Yuanbao Search SecretId", current.get("YUANBAO_SECRET_ID", ""), lang=lang,
2156
+ )
2157
+ values["YUANBAO_SECRET_KEY"] = _prompt_value(
2158
+ "YUANBAO_SECRET_KEY", "Yuanbao Search SecretKey", current.get("YUANBAO_SECRET_KEY", ""), lang=lang,
2159
+ )
2143
2160
  if _prompt_yes_no(_t(lang, "是否调整验证/兜底默认值?", "Adjust validation/fallback defaults?"), default=False):
2144
2161
  values["SMART_SEARCH_VALIDATION_LEVEL"] = _prompt_value(
2145
2162
  "SMART_SEARCH_VALIDATION_LEVEL",
@@ -2356,6 +2373,10 @@ def _run_advanced_setup_prompts(values: dict[str, str], current: dict[str, str],
2356
2373
  ("TINYFISH_SEARCH_API_URL", "TinyFish Search API URL", True),
2357
2374
  ("TINYFISH_FETCH_API_URL", "TinyFish Fetch API URL", True),
2358
2375
  ("TINYFISH_TIMEOUT_SECONDS", "TinyFish timeout seconds", True),
2376
+ ("YUANBAO_SECRET_ID", "Yuanbao Search SecretId", True),
2377
+ ("YUANBAO_SECRET_KEY", "Yuanbao Search SecretKey", True),
2378
+ ("YUANBAO_API_URL", "Yuanbao Search API URL", True),
2379
+ ("YUANBAO_TIMEOUT_SECONDS", "Yuanbao Search timeout seconds", True),
2359
2380
  ("DEEPSEEK_API_KEY", "DeepSeek API key", True),
2360
2381
  ("DEEPSEEK_API_URL", "DeepSeek API URL", True),
2361
2382
  ("DEEPSEEK_TIMEOUT_SECONDS", "DeepSeek timeout seconds", True),
@@ -2382,7 +2403,7 @@ def _run_advanced_setup_prompts(values: dict[str, str], current: dict[str, str],
2382
2403
  value = _normalize_custom_base_url(value)
2383
2404
  elif key == "SCIVERSE_API_URL":
2384
2405
  value = _normalize_custom_base_url(value)
2385
- elif key in {"TINYFISH_SEARCH_API_URL", "TINYFISH_FETCH_API_URL", "DEEPSEEK_API_URL"}:
2406
+ elif key in {"TINYFISH_SEARCH_API_URL", "TINYFISH_FETCH_API_URL", "DEEPSEEK_API_URL", "YUANBAO_API_URL"}:
2386
2407
  value = _normalize_custom_base_url(value)
2387
2408
  values[key] = value
2388
2409
 
@@ -2576,6 +2597,7 @@ async def _run_async_impl(args: argparse.Namespace) -> int:
2576
2597
  budget=args.budget,
2577
2598
  evidence_dir=args.evidence_dir,
2578
2599
  fallback=args.fallback,
2600
+ stream=args.stream,
2579
2601
  )
2580
2602
  return _print_result("research", data, args.format, args.output)
2581
2603
  if args.command == "smoke":
@@ -2742,6 +2764,7 @@ def _run_setup(args: argparse.Namespace) -> int:
2742
2764
  "XAI_API_KEY": args.xai_api_key,
2743
2765
  "XAI_MODEL": args.xai_model,
2744
2766
  "XAI_TOOLS": args.xai_tools_explicit,
2767
+ "XAI_STREAM": args.xai_stream,
2745
2768
  "OPENAI_COMPATIBLE_API_URL": args.openai_compatible_api_url,
2746
2769
  "OPENAI_COMPATIBLE_API_KEY": args.openai_compatible_api_key,
2747
2770
  "OPENAI_COMPATIBLE_MODEL": args.openai_compatible_model,
@@ -2787,6 +2810,10 @@ def _run_setup(args: argparse.Namespace) -> int:
2787
2810
  "TINYFISH_SEARCH_API_URL": _normalize_custom_base_url(args.tinyfish_search_api_url),
2788
2811
  "TINYFISH_FETCH_API_URL": _normalize_custom_base_url(args.tinyfish_fetch_api_url),
2789
2812
  "TINYFISH_TIMEOUT_SECONDS": args.tinyfish_timeout,
2813
+ "YUANBAO_SECRET_ID": args.yuanbao_secret_id,
2814
+ "YUANBAO_SECRET_KEY": args.yuanbao_secret_key,
2815
+ "YUANBAO_API_URL": _normalize_custom_base_url(args.yuanbao_api_url),
2816
+ "YUANBAO_TIMEOUT_SECONDS": args.yuanbao_timeout,
2790
2817
  "DEEPSEEK_API_KEY": args.deepseek_key,
2791
2818
  "DEEPSEEK_API_URL": _normalize_custom_base_url(args.deepseek_api_url),
2792
2819
  "DEEPSEEK_TIMEOUT_SECONDS": args.deepseek_timeout,
@@ -2900,6 +2927,8 @@ def _run_regression() -> int:
2900
2927
  "tests/test_jina_provider.py",
2901
2928
  "tests/test_tinyfish_provider.py",
2902
2929
  "tests/test_tinyfish_service.py",
2930
+ "tests/test_yuanbao_provider.py",
2931
+ "tests/test_yuanbao_service.py",
2903
2932
  "tests/test_deepseek_provider.py",
2904
2933
  "tests/test_zhipu_mcp_provider.py",
2905
2934
  "tests/test_smoke.py",
@@ -2942,9 +2971,7 @@ def build_parser() -> argparse.ArgumentParser:
2942
2971
  search_parser.add_argument("--validation", choices=["fast", "balanced", "strict"], default="")
2943
2972
  search_parser.add_argument("--fallback", choices=["auto", "off"], default="")
2944
2973
  search_parser.add_argument("--providers", default="auto")
2945
- stream_group = search_parser.add_mutually_exclusive_group()
2946
- stream_group.add_argument("--stream", dest="stream", action="store_true", default=None, help="Use stream=true for xAI Responses or OpenAI-compatible main search.")
2947
- stream_group.add_argument("--no-stream", dest="stream", action="store_false", help="Force stream=false for xAI Responses or OpenAI-compatible main search.")
2974
+ _add_stream_args(search_parser)
2948
2975
  search_parser.add_argument(
2949
2976
  "--timeout",
2950
2977
  type=float,
@@ -3264,6 +3291,7 @@ def build_parser() -> argparse.ArgumentParser:
3264
3291
  research_parser.add_argument("--budget", choices=["quick", "standard", "deep"], default="deep")
3265
3292
  research_parser.add_argument("--evidence-dir", default="")
3266
3293
  research_parser.add_argument("--fallback", choices=["auto", "off"], default="auto")
3294
+ _add_stream_args(research_parser)
3267
3295
  _add_format_args(research_parser)
3268
3296
 
3269
3297
  smoke_parser = sub.add_parser(
@@ -3435,6 +3463,7 @@ def build_parser() -> argparse.ArgumentParser:
3435
3463
  setup_parser.add_argument("--xai-api-key", default="", help="Save XAI_API_KEY.")
3436
3464
  setup_parser.add_argument("--xai-model", default="", help="Save XAI_MODEL.")
3437
3465
  setup_parser.add_argument("--xai-tools-explicit", default="", help="Save XAI_TOOLS.")
3466
+ setup_parser.add_argument("--xai-stream", default="", help="Save XAI_STREAM.")
3438
3467
  setup_parser.add_argument("--openai-compatible-api-url", default="", help="Save OPENAI_COMPATIBLE_API_URL.")
3439
3468
  setup_parser.add_argument("--openai-compatible-api-key", default="", help="Save OPENAI_COMPATIBLE_API_KEY.")
3440
3469
  setup_parser.add_argument("--openai-compatible-model", default="", help="Save OPENAI_COMPATIBLE_MODEL.")
@@ -3500,6 +3529,10 @@ def build_parser() -> argparse.ArgumentParser:
3500
3529
  setup_parser.add_argument("--tinyfish-search-api-url", default="", help="Save TINYFISH_SEARCH_API_URL.")
3501
3530
  setup_parser.add_argument("--tinyfish-fetch-api-url", default="", help="Save TINYFISH_FETCH_API_URL.")
3502
3531
  setup_parser.add_argument("--tinyfish-timeout", default="", help="Save TINYFISH_TIMEOUT_SECONDS.")
3532
+ setup_parser.add_argument("--yuanbao-secret-id", default="", help="Save YUANBAO_SECRET_ID.")
3533
+ setup_parser.add_argument("--yuanbao-secret-key", default="", help="Save YUANBAO_SECRET_KEY.")
3534
+ setup_parser.add_argument("--yuanbao-api-url", default="", help="Save YUANBAO_API_URL.")
3535
+ setup_parser.add_argument("--yuanbao-timeout", default="", help="Save YUANBAO_TIMEOUT_SECONDS.")
3503
3536
  setup_parser.add_argument("--deepseek-key", default="", help="Save DEEPSEEK_API_KEY.")
3504
3537
  setup_parser.add_argument("--deepseek-api-url", default="", help="Save DEEPSEEK_API_URL.")
3505
3538
  setup_parser.add_argument("--deepseek-timeout", default="", help="Save DEEPSEEK_TIMEOUT_SECONDS.")
@@ -58,6 +58,7 @@ class Config:
58
58
  "tavily": "TAVILY_ENABLED",
59
59
  "firecrawl": "FIRECRAWL_ENABLED",
60
60
  "tinyfish": "TINYFISH_ENABLED",
61
+ "yuanbao": "YUANBAO_ENABLED",
61
62
  "deepseek": "DEEPSEEK_ENABLED",
62
63
  "jina": "JINA_ENABLED",
63
64
  "anysearch": "ANYSEARCH_ENABLED",
@@ -70,6 +71,7 @@ class Config:
70
71
  "XAI_MODEL",
71
72
  "XAI_TOOLS",
72
73
  "XAI_REASONING_EFFORT",
74
+ "XAI_STREAM",
73
75
  "OPENAI_COMPATIBLE_API_URL",
74
76
  "OPENAI_COMPATIBLE_API_KEY",
75
77
  "OPENAI_COMPATIBLE_MODEL",
@@ -123,6 +125,10 @@ class Config:
123
125
  "TINYFISH_SEARCH_API_URL",
124
126
  "TINYFISH_FETCH_API_URL",
125
127
  "TINYFISH_TIMEOUT_SECONDS",
128
+ "YUANBAO_SECRET_ID",
129
+ "YUANBAO_SECRET_KEY",
130
+ "YUANBAO_API_URL",
131
+ "YUANBAO_TIMEOUT_SECONDS",
126
132
  "DEEPSEEK_API_KEY",
127
133
  "DEEPSEEK_API_URL",
128
134
  "DEEPSEEK_TIMEOUT_SECONDS",
@@ -153,6 +159,7 @@ class Config:
153
159
  "XAI_MODEL",
154
160
  "XAI_TOOLS",
155
161
  "XAI_REASONING_EFFORT",
162
+ "XAI_STREAM",
156
163
  "OPENAI_COMPATIBLE_API_URL",
157
164
  "OPENAI_COMPATIBLE_API_KEY",
158
165
  "OPENAI_COMPATIBLE_ENABLED",
@@ -588,6 +595,10 @@ class Config:
588
595
  value = (self._get_config_value("XAI_REASONING_EFFORT", "") or "").strip().lower()
589
596
  return self._validate_enum_value("XAI_REASONING_EFFORT", value, self._ALLOWED_XAI_REASONING_EFFORTS) if value else ""
590
597
 
598
+ @property
599
+ def xai_stream(self) -> bool:
600
+ return (self._get_config_value("XAI_STREAM", "false") or "false").lower() in ("true", "1", "yes")
601
+
591
602
  @property
592
603
  def openai_compatible_api_url(self) -> str | None:
593
604
  return self._get_config_value("OPENAI_COMPATIBLE_API_URL")
@@ -716,7 +727,7 @@ class Config:
716
727
  if key in JEV_DEFAULTS:
717
728
  validate_jev_value(key, value)
718
729
  return
719
- if key in {"SMART_SEARCH_TIMEOUT_SECONDS", "TINYFISH_TIMEOUT_SECONDS", "DEEPSEEK_TIMEOUT_SECONDS"}:
730
+ if key in {"SMART_SEARCH_TIMEOUT_SECONDS", "TINYFISH_TIMEOUT_SECONDS", "YUANBAO_TIMEOUT_SECONDS", "DEEPSEEK_TIMEOUT_SECONDS"}:
720
731
  self._parse_positive_float_value(key, value)
721
732
  return
722
733
  if key == "SMART_SEARCH_PROVIDER_COOLDOWN_SECONDS":
@@ -740,6 +751,7 @@ class Config:
740
751
  return
741
752
  enum_allowed = {
742
753
  "XAI_REASONING_EFFORT": self._ALLOWED_XAI_REASONING_EFFORTS,
754
+ "XAI_STREAM": {"true", "false", "1", "0", "yes", "no"},
743
755
  "SMART_SEARCH_VALIDATION_LEVEL": self._ALLOWED_VALIDATION_LEVELS,
744
756
  "SMART_SEARCH_FALLBACK_MODE": self._ALLOWED_FALLBACK_MODES,
745
757
  "SMART_SEARCH_MINIMUM_PROFILE": self._ALLOWED_MINIMUM_PROFILES,
@@ -974,6 +986,22 @@ class Config:
974
986
  def tinyfish_timeout(self) -> float:
975
987
  return self._parse_positive_float_value("TINYFISH_TIMEOUT_SECONDS", self._get_config_value("TINYFISH_TIMEOUT_SECONDS", "150") or "150")
976
988
 
989
+ @property
990
+ def yuanbao_secret_id(self) -> str | None:
991
+ return self._get_config_value("YUANBAO_SECRET_ID")
992
+
993
+ @property
994
+ def yuanbao_secret_key(self) -> str | None:
995
+ return self._get_config_value("YUANBAO_SECRET_KEY")
996
+
997
+ @property
998
+ def yuanbao_api_url(self) -> str:
999
+ return self._get_config_value("YUANBAO_API_URL", "https://wsa.tencentcloudapi.com") or "https://wsa.tencentcloudapi.com"
1000
+
1001
+ @property
1002
+ def yuanbao_timeout(self) -> float:
1003
+ return self._parse_positive_float_value("YUANBAO_TIMEOUT_SECONDS", self._get_config_value("YUANBAO_TIMEOUT_SECONDS", "30") or "30")
1004
+
977
1005
  @property
978
1006
  def deepseek_api_key(self) -> str | None:
979
1007
  return self._get_config_value("DEEPSEEK_API_KEY")
@@ -1239,6 +1267,7 @@ class Config:
1239
1267
  "XAI_MODEL": self.xai_model,
1240
1268
  "XAI_TOOLS": self.xai_tools_raw,
1241
1269
  "XAI_REASONING_EFFORT": xai_reasoning_effort,
1270
+ "XAI_STREAM": self.xai_stream,
1242
1271
  "OPENAI_COMPATIBLE_API_URL": self.openai_compatible_api_url or tr('未配置'),
1243
1272
  "OPENAI_COMPATIBLE_API_KEY": self._mask_api_key(self.openai_compatible_api_key) if self.openai_compatible_api_key else tr('未配置'),
1244
1273
  "OPENAI_COMPATIBLE_MODEL": self.openai_compatible_model,
@@ -1269,6 +1298,10 @@ class Config:
1269
1298
  "TINYFISH_FETCH_API_URL": self.tinyfish_fetch_api_url,
1270
1299
  "TINYFISH_API_KEY": self._mask_api_key(self.tinyfish_api_key) if self.tinyfish_api_key else tr('未配置'),
1271
1300
  "TINYFISH_TIMEOUT_SECONDS": self.tinyfish_timeout,
1301
+ "YUANBAO_API_URL": self.yuanbao_api_url,
1302
+ "YUANBAO_SECRET_ID": self._mask_api_key(self.yuanbao_secret_id) if self.yuanbao_secret_id else tr('未配置'),
1303
+ "YUANBAO_SECRET_KEY": self._mask_api_key(self.yuanbao_secret_key) if self.yuanbao_secret_key else tr('未配置'),
1304
+ "YUANBAO_TIMEOUT_SECONDS": self.yuanbao_timeout,
1272
1305
  "DEEPSEEK_API_URL": self.deepseek_api_url,
1273
1306
  "DEEPSEEK_API_KEY": self._mask_api_key(self.deepseek_api_key) if self.deepseek_api_key else tr('未配置'),
1274
1307
  "DEEPSEEK_TIMEOUT_SECONDS": self.deepseek_timeout,
@@ -185,6 +185,8 @@ class ChannelExecutor:
185
185
  results = await svc.call_tinyfish_search(query, self.count) or []
186
186
  elif provider == "deepseek":
187
187
  results = await svc.call_deepseek_search(query, self.count) or []
188
+ elif provider == "yuanbao":
189
+ results = await svc.call_yuanbao_search(query, self.count) or []
188
190
  elif provider == "anysearch":
189
191
  results = _check_data(await svc.anysearch_search(query, max_results=self.count)).get("results", [])
190
192
  elif provider == "context7":
@@ -127,6 +127,14 @@ PROVIDER_DESCRIPTIONS: dict[str, dict[str, dict[str, str]]] = {
127
127
  "guidance_zh": "擅长读取已找到的公开网页;不适合发现新来源,也读不了 PDF、需登录的页面或内网地址。",
128
128
  },
129
129
  },
130
+ "yuanbao": {
131
+ "search": {
132
+ "en": "Searches the web with Tencent Yuanbao Search, which adds Tencent's own content such as Tencent News, and returns titles, links, publish dates and summaries.",
133
+ "zh": "通过腾讯元宝搜索检索网页,叠加腾讯新闻等腾讯内容,返回标题、链接、发布时间和摘要。",
134
+ "guidance_en": "Best for Chinese and current-events discovery; summaries are not full page text, so read key pages before citing them. This action passes only the query, so it cannot restrict sites or dates.",
135
+ "guidance_zh": "擅长中文和时事来源发现;摘要不是网页全文,引用关键结论前应读取原页。此操作只传入查询词,不能限定网站或时间。",
136
+ },
137
+ },
130
138
  "anysearch": {
131
139
  "search": {
132
140
  "en": "Searches AnySearch's available domains with a plain query.",