Mola-maker/dsh-kit--packages-deep-search ↗★ 1
@molamaker/dsh-deep-search
Multi-channel deep search for DeepSeek Harness: one deep_search tool fanning queries out to web/Exa/Tavily/GitHub, merged by reciprocal-rank fusion with cross-channel agreement
설치
npx -p @deepseek-ai/dsh dsh plugin --profile web add 'github:Mola-maker/dsh-kit#c80bb306cfc26fd256f73866d7b9f182346ef066&path:packages/deep-search'Configuration
Config goes in the deep-search row of your profile (or a --patch overlay):
- id: deep-search
config:
channels: [web, exa, github] # default channels when a call names none
cacheTtlMs: 300000 # 0 disables the result cache
rateLimits:
github: { perMinute: 10, burst: 5 }
registerProvider: false
| key | default | meaning |
|---|---|---|
channels | web, exa, tavily, github, molasearch, plus every configured mcp: | Channels used when a call names none. |
maxQueries | 8 | Most queries in one call. |
maxResultsPerChannel | 8 | Hits asked of each channel for each query. |
maxSources | 20 | Sources returned after merging. |
channelTimeoutMs | 30000 | One channel call, including pacing and retry waits. |
timeoutMs | 120000 | The whole tool call. |
excerptChars | 3000 | Characters kept from each fetched page. |
cacheTtlMs / cacheMaxEntries | 300000 / 200 | Per-channel answer cache. Identical concurrent requests share one fetch. fresh: true on a call bypasses it. |
retries | 1 | Extra attempts after a throttling answer (429, 502–504, or a 403 that says the rate limit is used up). The server's Retry-After / X-RateLimit-Reset is honoured. |
maxWaitMs | 10000 | Longest wait for a pacing slot or a server hint. Longer fails at once and says how long the server asked for. |
rateLimits.{exa,tavily,github} | GitHub: 10/min anonymous, 30/min with a token | Token bucket: perMinute sustained, burst at once. Exa and Tavily are unpaced unless you set it. |
registerProvider | false | See below. |
molasearch | – | Path to the MolaSearch executable. |
mcpChannels | – | [{name, command, args?, env?, tool, queryArg?, limitArg?}] → channel mcp:. |
maxClaims | 10 | Most claims in one deep_verify call. |
Using it as the harness search provider
Set registerProvider: true to register deep-search as a ctx.web search provider. This does not take over by itself: when another provider is available (for example web-search-deepseek), selection is up to the harness and that one may keep answering, or web_search may report the choice as ambiguous. Pin it explicitly:
- id: deep-search
config:
registerProvider: true
- id: web
config:
searchProvider: deep-search # or: export DSH_WEB_SEARCH_PROVIDER=deep-search
Tested in a real DSH 0.2.1-rc.5 profile: pinned, web_search returns merged sources from the channels; unpinned, the existing default keeps answering. The plugin logs a warning at start-up when it registers without a pin. When it is the provider, the web channel is left out to avoid asking itself.
deep_verify is lexical
supported means the page contains the claim's numbers and terms together, nothing more. It does not understand negation or context and is not a fact-check. It is meant to catch the common failure of an agent citing a page that does not say what it claims: read the returned passage before relying on a supported. Statuses: supported, partial, not_found, unreachable.