@konbakuyomu/smart-search-linux-x64 0.1.30-beta.1 → 0.1.31
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/package.json +1 -1
- package/runtime/smart-search/_internal/base_library.zip +0 -0
- package/runtime/smart-search/_internal/smart_search/assets/i18n/messages.json +4 -0
- package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/deep-research-mode.md +1 -1
- package/runtime/smart-search/_internal/smart_search/assets/skills/smart-search-cli/references/provider-routing.md +1 -1
- package/runtime/smart-search/_internal/smart_search/intent_router.py +17 -2
- package/runtime/smart-search/_internal/smart_search/jev_search.py +11 -3
- package/runtime/smart-search/_internal/smart_search/ui_api.py +5 -5
- package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/METADATA +1 -1
- package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/RECORD +15 -15
- package/runtime/smart-search/package.json +7 -7
- package/runtime/smart-search/smart-search +0 -0
- /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/INSTALLER +0 -0
- /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/REQUESTED +0 -0
- /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/WHEEL +0 -0
- /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/direct_url.json +0 -0
- /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/entry_points.txt +0 -0
- /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/licenses/LICENSE +0 -0
- /package/runtime/smart-search/_internal/{smart_search-0.1.30b1.dist-info → smart_search-0.1.31.dist-info}/top_level.txt +0 -0
package/package.json
CHANGED
|
Binary file
|
|
@@ -18022,5 +18022,9 @@
|
|
|
18022
18022
|
"正在卸载 CLI…": [
|
|
18023
18023
|
"正在卸载 CLI…",
|
|
18024
18024
|
"Removing the CLI…"
|
|
18025
|
+
],
|
|
18026
|
+
"检索渠道": [
|
|
18027
|
+
"检索渠道",
|
|
18028
|
+
"Retrieval channel"
|
|
18025
18029
|
]
|
|
18026
18030
|
}
|
|
@@ -180,7 +180,7 @@ Research provider advantage routing:
|
|
|
180
180
|
- AnySearch: explicit vertical intent only, such as CVE, finance, legal, academic, and repository/codebase search.
|
|
181
181
|
- Sciverse: explicit-only academic provider in this release; use direct `sciverse-*` commands rather than `research` fallback.
|
|
182
182
|
|
|
183
|
-
Safe
|
|
183
|
+
Safe routing overrides are `SMART_SEARCH_RESEARCH_PREFERRED_PROVIDERS` and `SMART_SEARCH_RESEARCH_DISABLED_PROVIDERS`; despite the names they apply to automatic routing in both ordinary search and research. They may reorder or disable providers only inside capabilities the provider already supports; they must not move a provider across capability boundaries.
|
|
184
184
|
|
|
185
185
|
## Closeout Lessons
|
|
186
186
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
- `research`: the shared loop selects complementary actions in parallel, reads discovered pages, assesses evidence gaps, and continues while useful and within budget. Jev or local rules choose from program-built original/subquestion/gap query candidates; Jev does not generate arbitrary queries or tool calls. Only fetched/read content enters `citations`. Optional filtering and `SMART_SEARCH_JEV_SYNTHESIZE=false|auto|true` apply only here.
|
|
9
9
|
- `deep` remains an offline planner. Its `steps[].command` entries are suggestions for manual/AI orchestration; `research` records its actual actions separately in `routing_decision.rounds` and `stage_results`.
|
|
10
10
|
|
|
11
|
-
The default is `SMART_SEARCH_INTENT_ROUTER=jev`. In Jev mode, ordinary search makes at most one routing judgment and, when Jev is configured, one additional judgment on a returned model answer; without a TypeSafe key or a valid judgment, `--fallback auto` uses local capability rules and reports degradation, while `--fallback off` fails clearly. Explicit `local` needs no TypeSafe key and never calls Jev. Legacy `hybrid` maps to `jev`; `rules` and `off` map to `local`. Old embedding/classifier keys remain stored but unused. `route-calibrate` is a retired, non-network compatibility command.
|
|
11
|
+
The default is `SMART_SEARCH_INTENT_ROUTER=jev`. In Jev mode, ordinary search makes at most one routing judgment and, when Jev is configured, one additional judgment on a returned model answer; without a TypeSafe key or a valid judgment, `--fallback auto` uses local capability rules and reports degradation, while `--fallback off` fails clearly. Without a TypeSafe key, `research` stops after the first round that reads page text (`judgment_unavailable`), is always reported as degraded, and with `deep` (strict) never returns `ok=true`; read `content` and `gap_check` instead of treating that as a failed search. `SMART_SEARCH_JEV_SYNTHESIZE=true` still summarizes read evidence; `auto` needs Jev. Explicit `local` needs no TypeSafe key and never calls Jev. Legacy `hybrid` maps to `jev`; `rules` and `off` map to `local`. Old embedding/classifier keys remain stored but unused. `route-calibrate` is a retired, non-network compatibility command.
|
|
12
12
|
|
|
13
13
|
`route` previews local capabilities without calling a model or retrieval provider. Add `--remote` only for an explicit, potentially billable Jev diagnostic. Direct provider commands keep their explicit behavior.
|
|
14
14
|
|
|
@@ -166,6 +166,21 @@ def contains_any(query: str, keywords: set[str]) -> bool:
|
|
|
166
166
|
return any(keyword.lower() in q for keyword in keywords)
|
|
167
167
|
|
|
168
168
|
|
|
169
|
+
def contains_term(query: str, keywords: set[str]) -> bool:
|
|
170
|
+
"""Like contains_any, but Latin keywords match whole words (with a plural s or a version
|
|
171
|
+
number), so "api" is not found in "capital" nor "repo" in "report". CJK keywords have no
|
|
172
|
+
word boundaries and still match as substrings."""
|
|
173
|
+
q = query.lower()
|
|
174
|
+
for keyword in keywords:
|
|
175
|
+
term = keyword.lower()
|
|
176
|
+
if not term.isascii():
|
|
177
|
+
if term in q:
|
|
178
|
+
return True
|
|
179
|
+
elif re.search(rf"(?<![a-z0-9]){re.escape(term)}(?:e?s)?(?![a-z])", q):
|
|
180
|
+
return True
|
|
181
|
+
return False
|
|
182
|
+
|
|
183
|
+
|
|
169
184
|
def extract_urls(query: str) -> list[str]:
|
|
170
185
|
urls = []
|
|
171
186
|
for match in re.findall(r"https?://[^\s<>\]\)\"',。;!?、:)】》」』]+", query):
|
|
@@ -189,7 +204,7 @@ def build_rules_route(
|
|
|
189
204
|
) -> IntentRouteResult:
|
|
190
205
|
plan_intent_signals = plan_intent_signals or {}
|
|
191
206
|
urls = extract_urls(query)
|
|
192
|
-
docs_intent = bool(plan_intent_signals.get("docs_api_intent")) or
|
|
207
|
+
docs_intent = bool(plan_intent_signals.get("docs_api_intent")) or contains_term(query, DOCS_INTENT_KEYWORDS)
|
|
193
208
|
zh_current_intent = (
|
|
194
209
|
plan_intent_signals.get("locale_domain_scope") == "china"
|
|
195
210
|
or contains_any(query, ZH_CURRENT_INTENT_KEYWORDS)
|
|
@@ -200,7 +215,7 @@ def build_rules_route(
|
|
|
200
215
|
or contains_any(query, CURRENT_INTENT_KEYWORDS)
|
|
201
216
|
)
|
|
202
217
|
fetch_intent = bool(plan_intent_signals.get("known_url")) or bool(urls) or contains_any(query, FETCH_INTENT_KEYWORDS)
|
|
203
|
-
vertical_intent =
|
|
218
|
+
vertical_intent = contains_term(query, VERTICAL_INTENT_KEYWORDS)
|
|
204
219
|
|
|
205
220
|
capabilities: set[str] = set()
|
|
206
221
|
supplemental_paths: list[str] = []
|
|
@@ -509,8 +509,8 @@ async def search(
|
|
|
509
509
|
before = len(evidence)
|
|
510
510
|
round_attempt_start = len(attempts)
|
|
511
511
|
if is_research:
|
|
512
|
-
tasks = {asyncio.create_task(execute_one(item, retrieval_timeout)) for item in selected}
|
|
513
|
-
pending = tasks
|
|
512
|
+
tasks = {asyncio.create_task(execute_one(item, retrieval_timeout)): item for item in selected}
|
|
513
|
+
pending = set(tasks)
|
|
514
514
|
try:
|
|
515
515
|
while pending:
|
|
516
516
|
done, pending = await asyncio.wait(pending, return_when=asyncio.FIRST_COMPLETED)
|
|
@@ -519,6 +519,12 @@ async def search(
|
|
|
519
519
|
_, pending = await asyncio.wait(
|
|
520
520
|
pending, timeout=max(STRAGGLER_GRACE_SECONDS, time.monotonic() - phase_start)
|
|
521
521
|
)
|
|
522
|
+
# A search model runs its own web search and is far slower than an index
|
|
523
|
+
# lookup; it keeps its retrieval timeout instead of the straggler grace.
|
|
524
|
+
models = {task for task in pending if tasks[task]["capability"] == "main_search"}
|
|
525
|
+
if models:
|
|
526
|
+
await asyncio.wait(models)
|
|
527
|
+
pending -= models
|
|
522
528
|
break
|
|
523
529
|
finally:
|
|
524
530
|
for task in pending:
|
|
@@ -613,7 +619,9 @@ async def search(
|
|
|
613
619
|
"status": "disabled" if settings.synthesis_mode == "false" else "skipped",
|
|
614
620
|
"decision_source": "config",
|
|
615
621
|
}
|
|
616
|
-
|
|
622
|
+
# Without Jev, usefulness is unknown (None); an explicit "true" still summarizes what was read.
|
|
623
|
+
useful_evidence = bool(answer_evidence and (assessment["useful"] or
|
|
624
|
+
(assessment["useful"] is None and settings.synthesis_mode == "true")))
|
|
617
625
|
if settings.synthesis_mode != "false" and not useful_evidence:
|
|
618
626
|
synthesis["reason"] = "no_confirmed_useful_evidence"
|
|
619
627
|
if settings.synthesis_mode == "auto" and not judge_available:
|
|
@@ -158,16 +158,16 @@ def preview(payload: dict[str, Any]) -> dict[str, Any]:
|
|
|
158
158
|
merged = {str(key).strip().upper(): "" if value is None else str(value) for key, value in values.items()}
|
|
159
159
|
with config.snapshot(merged):
|
|
160
160
|
capability_status = service.get_capability_status()
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
# The same minimum profile the overview reports, so a draft never "passes" differently.
|
|
162
|
+
minimum = service._minimum_profile_result(config.minimum_profile, capability_status)
|
|
163
163
|
return {
|
|
164
164
|
"ok": True,
|
|
165
165
|
"error_type": "",
|
|
166
166
|
"error": "",
|
|
167
167
|
"capability_status": capability_status,
|
|
168
|
-
"required": required,
|
|
169
|
-
"missing": missing,
|
|
170
|
-
"minimum_profile_ok":
|
|
168
|
+
"required": minimum["required"],
|
|
169
|
+
"missing": minimum["missing"],
|
|
170
|
+
"minimum_profile_ok": minimum["ok"],
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: smart-search
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.31
|
|
4
4
|
Summary: CLI-first multi-source web research with xAI/OpenAI-compatible search, Exa, Context7, Zhipu, Tavily, Firecrawl, and Deep Research planning.
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
../../../bin/smart-search,sha256=3Si0-mMx4MCMjCfKNF0xeBuTy8aXkDufWgG0psj8uJs,205
|
|
2
|
-
smart_search-0.1.
|
|
3
|
-
smart_search-0.1.
|
|
4
|
-
smart_search-0.1.
|
|
5
|
-
smart_search-0.1.
|
|
6
|
-
smart_search-0.1.
|
|
7
|
-
smart_search-0.1.
|
|
8
|
-
smart_search-0.1.
|
|
9
|
-
smart_search-0.1.
|
|
10
|
-
smart_search-0.1.
|
|
2
|
+
smart_search-0.1.31.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
|
3
|
+
smart_search-0.1.31.dist-info/METADATA,sha256=D6orY0Z46H1tNCkaDxUFKhYjlRN9wE3tI9EwyUej7RI,19626
|
|
4
|
+
smart_search-0.1.31.dist-info/RECORD,,
|
|
5
|
+
smart_search-0.1.31.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
+
smart_search-0.1.31.dist-info/WHEEL,sha256=a-udL2m4V_6Yn8b-uKzWb12RjRxwwMo6ohYFM24tpaY,91
|
|
7
|
+
smart_search-0.1.31.dist-info/direct_url.json,sha256=lFRY6ow2tINE_t60B1wCO0WZXfSjjC9GUsp1Y2OjrAY,75
|
|
8
|
+
smart_search-0.1.31.dist-info/entry_points.txt,sha256=fiHguhz7hQ6ybeepO0OPpZm19XCi2J-Bkigf8DGBuKM,55
|
|
9
|
+
smart_search-0.1.31.dist-info/licenses/LICENSE,sha256=o_zbH827gkTiZfsNLJGQn1z8Z4eLAvb8heFaSqSGVv8,1067
|
|
10
|
+
smart_search-0.1.31.dist-info/top_level.txt,sha256=mBPprcb_b3tBApeRa2nlLaGj3UVNxXCdyz6QQvDzJpc,13
|
|
11
11
|
smart_search/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
|
|
12
12
|
smart_search/__pycache__/__init__.cpython-313.pyc,,
|
|
13
13
|
smart_search/__pycache__/activity.cpython-313.pyc,,
|
|
@@ -40,14 +40,14 @@ smart_search/__pycache__/ui_metadata.cpython-313.pyc,,
|
|
|
40
40
|
smart_search/__pycache__/ui_server.cpython-313.pyc,,
|
|
41
41
|
smart_search/__pycache__/utils.cpython-313.pyc,,
|
|
42
42
|
smart_search/activity.py,sha256=66yPPAfuaDSF4UTEuRRDefp2m1-l8eVnr8K5_ShoQCU,13368
|
|
43
|
-
smart_search/assets/i18n/messages.json,sha256=
|
|
43
|
+
smart_search/assets/i18n/messages.json,sha256=RumiIIb_AqRPRyNR0SXVVDQA5WmcJl_qp4y6WCO0WZw,638870
|
|
44
44
|
smart_search/assets/skills/smart-search-cli/SKILL.md,sha256=465CCVKGCHfiJLDD9LlYbIhlbxWucwLiNVVAcRRlEf8,8561
|
|
45
45
|
smart_search/assets/skills/smart-search-cli/agents/openai.yaml,sha256=4S1VuEER7Puw9JvxDsyI__Tdrr1j2h6aF26yHho_x8E,162
|
|
46
46
|
smart_search/assets/skills/smart-search-cli/references/cli-contract.md,sha256=mZyQRioJ4_ySkxcl9WQBMGXk5fcWOEMBMnXXUGnRoEA,1843
|
|
47
47
|
smart_search/assets/skills/smart-search-cli/references/cli-core.md,sha256=7Wf9csFgjRfQmk7EyssAZBn7BWbw6yNQcu_1-T9LJXA,15029
|
|
48
48
|
smart_search/assets/skills/smart-search-cli/references/command-patterns.md,sha256=PvMBXjDg0acGf-9uZAyK3p_Ox_kI5aQuhae12WsqRj0,12534
|
|
49
|
-
smart_search/assets/skills/smart-search-cli/references/deep-research-mode.md,sha256=
|
|
50
|
-
smart_search/assets/skills/smart-search-cli/references/provider-routing.md,sha256=
|
|
49
|
+
smart_search/assets/skills/smart-search-cli/references/deep-research-mode.md,sha256=Yt1qHQnbpKgA6P5PTXwv4qFDZTJn7MqarZvCqlmCg-0,14485
|
|
50
|
+
smart_search/assets/skills/smart-search-cli/references/provider-routing.md,sha256=BsjrSVLNtG5h77lUXUTPdnR35GJZU79keIzOeuYclSI,27548
|
|
51
51
|
smart_search/assets/skills/smart-search-cli/references/regression-release.md,sha256=SkOUwxpPm_HeBGlpUil5ybTBiwa-wAzt-765zw9kYqk,5673
|
|
52
52
|
smart_search/assets/skills/smart-search-cli/references/setup-config.md,sha256=Bi-yqcoGb0T1SV5tzJLwW9gW_ygx00LPTKXHAHM2t7c,18213
|
|
53
53
|
smart_search/assets/ui/index.html,sha256=i3se6JX5iHnGXIEXhHvLKZgPzNh8JMJAeRqfIlqac3U,63800
|
|
@@ -62,9 +62,9 @@ smart_search/desktop_skills.py,sha256=IAJyn83Zops05XD2MyYAHP93JYzBz9ze1wGqvWEUB4
|
|
|
62
62
|
smart_search/desktop_updates.py,sha256=Kn4Q5ZO_axpqPhDvlZ4dnilhVhzDXxq0ONEePAsemR4,7587
|
|
63
63
|
smart_search/desktop_worker.py,sha256=Nkw_FMNNejrt8oJ6aNUmziSd7vVu_Xy9ijvfgstdawQ,5489
|
|
64
64
|
smart_search/i18n.py,sha256=-mDfpi-P4AQPCUpnuI--W9c1AFurN5QPhAGYMXB02kU,4869
|
|
65
|
-
smart_search/intent_router.py,sha256=
|
|
65
|
+
smart_search/intent_router.py,sha256=UkFnv4R2xC6bF6QEn_lqSYqYOoWgoT_mXeG4CNcSJ3M,7931
|
|
66
66
|
smart_search/jev.py,sha256=C80OBG2RMOJCMtogltVDHUg0xoCHO_8uIT69736myq8,27169
|
|
67
|
-
smart_search/jev_search.py,sha256=
|
|
67
|
+
smart_search/jev_search.py,sha256=oW_hvKVBAd10V3e-Hbhd1i133feAQ4_x64NwgO2W3w4,49256
|
|
68
68
|
smart_search/logger.py,sha256=pwfjP50ywoTRirH4H7qYTNgt4TgoMhZlX2pb8dNvO9k,1203
|
|
69
69
|
smart_search/provider_descriptions.py,sha256=Y5I1vOz-trKoVfXZ3bQLVfA1aHIRAJ4maN42ya-Zqds,10234
|
|
70
70
|
smart_search/provider_errors.py,sha256=IXyLo6Kc4WSP7faH5mMTQyAIVKR0BR0680qd0ZApKUo,5384
|
|
@@ -101,7 +101,7 @@ smart_search/skill_installer.py,sha256=CvM9GQShaTR8ttNhilx8Up0vVsHZfsnYD5uM7wZrz
|
|
|
101
101
|
smart_search/skill_maintenance.py,sha256=2s2-1ZEEjRg2MfRKlaw6Y51OO86kOf9axl7fW6KMv0g,8818
|
|
102
102
|
smart_search/sources.py,sha256=WvyRXqX_IdbDPpsqcSbulipxNtZvQbWv1MsZ2Ud5bTY,14376
|
|
103
103
|
smart_search/state_files.py,sha256=K02dlR3Xuj2vIkRiEdrFr3OSiEsPxN5_HSo4NTmz0sc,2063
|
|
104
|
-
smart_search/ui_api.py,sha256=
|
|
104
|
+
smart_search/ui_api.py,sha256=p73zozirtzu7u8AQS4uWTCbsbomkbkxCExs_mE1_HW4,10043
|
|
105
105
|
smart_search/ui_metadata.py,sha256=6WO8WT-P9bwkmgi2i4XXXUqSL4xUijd4gJnImS_cka8,51028
|
|
106
106
|
smart_search/ui_server.py,sha256=pcAPiYWmJXTmX1Xpy12v97JhkbRx-nJ3zRYefGW1Tc0,20508
|
|
107
107
|
smart_search/utils.py,sha256=HVpxtyveEHcpGSkIObf97GbCJVRd68f1X6ecQeH14Ks,8992
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@konbakuyomu/smart-search",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.31",
|
|
4
4
|
"description": "CLI-first multi-source web research with xAI/OpenAI-compatible search, Exa, Context7, Zhipu, Tavily, Firecrawl, and Deep Research planning.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/konbakuyomu/smartsearch#readme",
|
|
@@ -39,11 +39,11 @@
|
|
|
39
39
|
},
|
|
40
40
|
"smartSearchBinary": true,
|
|
41
41
|
"optionalDependencies": {
|
|
42
|
-
"@konbakuyomu/smart-search-darwin-x64": "0.1.
|
|
43
|
-
"@konbakuyomu/smart-search-darwin-arm64": "0.1.
|
|
44
|
-
"@konbakuyomu/smart-search-win32-x64": "0.1.
|
|
45
|
-
"@konbakuyomu/smart-search-win32-arm64": "0.1.
|
|
46
|
-
"@konbakuyomu/smart-search-linux-x64": "0.1.
|
|
47
|
-
"@konbakuyomu/smart-search-linux-arm64": "0.1.
|
|
42
|
+
"@konbakuyomu/smart-search-darwin-x64": "0.1.31",
|
|
43
|
+
"@konbakuyomu/smart-search-darwin-arm64": "0.1.31",
|
|
44
|
+
"@konbakuyomu/smart-search-win32-x64": "0.1.31",
|
|
45
|
+
"@konbakuyomu/smart-search-win32-arm64": "0.1.31",
|
|
46
|
+
"@konbakuyomu/smart-search-linux-x64": "0.1.31",
|
|
47
|
+
"@konbakuyomu/smart-search-linux-arm64": "0.1.31"
|
|
48
48
|
}
|
|
49
49
|
}
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|