dsh-tavily-resilient-search

DSH PLUGIN记忆与知识

仓库 frederico-kluser/dsh-tavily-resilient-search · npm dsh-tavily-resilient-search

记忆与知识 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

为 DeepSeek Harness 提供 Tavily 实时联网搜索,支持多 API 密钥原子轮换与 keyless 兜底,遇限流、配额耗尽或密钥吊销时自动切换,不中断 agent loop。

一句话选型结论

按资料字段整理

dsh-tavily-resilient-search 是记忆与知识类的 DSH 可安装插件,验证等级 L5 · 运行验证通过,安全审查为低风险,列出 5 项功能,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类记忆与知识 收录类型可安装插件 验证等级L5 · 运行验证通过 安全审查低风险
验证等级 L5 L5 · 运行验证通过
GitHub 星标 0 复刻 0 · 未关闭 issue 0
最近更新 2026-09-24 创建于 2026-09-24
README 13.6 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add dsh-tavily-resilient-search@0.1.3
  1. 1
    确认版本与运行环境

    兼容的 DSH 版本为 0.2.0-rc.2 等 3 个;版本不匹配时安装会报错。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本0.2.0-rc.2 等 3 个版本版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名dsh-tavily-resilient-search可用 npm view 查看包信息

能做什么

5 项功能
字段来自项目仓库与公开索引,中文说明由本站标注

dsh-tavily-resilient-search:为 DeepSeek Harness 提供不中断的 Tavily 联网搜索

  • Tavily 实时联网搜索
  • 多密钥原子轮换与重试
  • 限流/配额/吊销自动降级
  • 设置页管理密钥池
  • 密钥测试与审计日志

适用场景

联网搜索

上游标签

cordisdeepseek-harnessdsh-pluginkey-rotationtavilyweb-search

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

上面的结论来自上游最近一次自动化验证(2026-10-08): 同一套检查会在插件发新版后重跑,页面显示的是最新一次的逐项结果。

逐项检查结果

L1 · 已找到 ✓ 通过
  • L1.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L2 · 结构化 ✓ 通过
  • L2.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L3 · 安装规范 ✓ 通过
  • L3.1_INSTALL_COMMAND_PARSED 安装命令已解析 方式:安装规范解析
  • L3.2_DSH_VERSION_DECLARED DSH 版本已声明 方式:DSH 版本声明
L4 · 安装已测 ✓ 通过
  • L4.1_INSTALL_EXECUTED_CONFINED 受限沙盒内执行安装 方式:沙盒安装执行
  • L4.2_INSTALL_SUCCESS 沙盒安装成功 方式:沙盒安装执行
  • L4.3_ARTIFACT_CONFIRMED 安装产物已确认 方式:沙盒安装执行
L5 · 运行已测 ✓ 通过
  • L5.1_INSTALL_PASSED_SANDBOXED 沙盒安装通过 方式:沙盒安装执行
  • L5.2_WEB_BOOT_READY Web 启动就绪 方式:Web 启动
  • L5.3_HTTP_SERVED HTTP 服务响应 方式:HTTP 请求
  • L5.4_PLUGIN_INVENTORY_ACTIVE 插件清单中已激活 方式:插件清单查询

风险详情

  • 审查结论 通过
  • 结论说明 vet 静态分析未发现可疑行为,判定为干净(clean)。
  • 风险计数 严重 0 / 高 0 / 中 0
  • 风险详情 未发现严重或警告级问题。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L5:安装和运行都在沙盒里跑通过,装完能直接用的概率高。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。
  • 标注了兼容的 DSH 版本(0.2.0-rc.2 等 3 个),按版本装不容易报错。
  • 列出了 5 项功能,能直接看出它解决什么问题。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在记忆与知识场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-tavily-resilient-search当前 L5 · 运行验证通过 低风险 0 0.2.0-rc.2 等 3 个 有
ruflo L3 · 安装规范通过 低风险 7.4 万 未标注 无
OpenViking L3 · 安装规范通过 低风险 3.9 万 未标注 无
WeKnora L4 · 沙盒安装通过 低风险 3.3 万 未标注 有
distilly L4 · 沙盒安装通过 低风险 2.5 万 未标注 有
EverOS L4 · 沙盒安装通过 低风险 1.3 万 未标注 有

仓库档案

记忆与知识
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方frederico-kluser仓库 dsh-tavily-resilient-search · 默认分支 main
分类记忆与知识knowledge
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言TypeScript仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 0收录时的数值,非实时
创建 / 更新2026-09-24 · 2026-09-24最后推送 2026-09-24
本站收录2026-09-27首次进入本站目录的时间

README 全文

13.6 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-tavily-resilient-search

Pesquisa web em tempo real para o DeepSeek Harness (DSH), através da API
Tavily, com rotação atómica e resiliente de um agrupamento
de credenciais
e contingência keyless — sem quebrar o agent loop quando as
chaves atingem limites de taxa (429), esgotam a cota mensal (432/433) ou são
revogadas (401).

Plugin Cordis autónomo: instala-se por manifesto, sem forks do código do
DSH, e sobrevive a hot-reload/unload sem fugas nem escutas órfãs.


O problema que resolve

Numa implementação ingénua, um HTTP 429 ou 432 é propagado como rejeição de
promessa à rotina de turnos: o turno termina abruptamente — ou o modelo conclui,
erradamente, que "a internet deixou de existir". Aqui, a intenção semântica
(pesquisar) está desacoplada da camada física (qual credencial despacha agora):

  • erros de saturação/faturação mutam o estado da chave causadora e a chamada
    é reemitida de imediato com o payload intacto, pela próxima credencial
    desimpedida (round-robin);
  • quando todo o pool está impedido, ativa-se a contingência keyless
    (X-Tavily-Access-Mode: keyless);
  • só quando todas as alternativas de transporte se esgotam é que a ferramenta
    devolve uma conclusão estruturada de aviso — nunca uma exceção que ejetasse
    o processo hospedeiro.

Instalação

dsh plugin --profile web add dsh-tavily-resilient-search

A ativação é automática: o pacote declara dsh.bundle.patch (apenas
dsh.bundle.patch ativa um plugin — um bundle: {} vazio não ativa nada) e o
manifesto cordis.patch.yml entra na camada Bundle da composição.

Defina as credenciais por variáveis de ambiente (nunca em texto simples):

export TAVILY_API_KEY_A="tvly-..."
export TAVILY_API_KEY_B="tvly-..."   # tantas quantas as contas disponíveis
export TAVILY_API_KEY_C="tvly-..."
export TAVILY_API_KEY_D="tvly-..."

Sem nenhuma chave o plugin não rebenta o boot: degrada para o modo
keyless-only (limites muito mais severos) e avisa em voz alta. Estado
legítimo documentado: "ainda não configurado".

Gestão de chaves via interface

Todo o CRUD do pool vive num único sítio: a secção “Tavily Keys” em
Definições (Settings) — contribuída para o slot settings.section pelo
bundle de cliente (client/client.js, formato __ModuleLoader__ medido no
exemplo oficial), estilizada com o design system do DSH.

  • CRUD completo num só ecrã: adicionar (C, com Enter), listar com
    estados em cartões (R), editar/substituir (U, Enter guarda, Esc
    cancela), remover (D) e Testar (valida contra a API — 1 crédito).
  • Feedback em cada ação: spinner durante o pedido e confirmação ✓/⚠
    imediata — nada de cliques sem resposta.
  • Botão “🔑 Tavily Keys” na área lateral só quando não existe chave
    válida
    (desaparece assim que há credencial utilizável); abre diretamente as
    Definições. Não há ecrã paralelo: a antiga página autónoma responde 410.
  • Links úteis no painel: app.tavily.com para obter chaves, documentação e
    onde está o token.

Token administrativo (para abrir o painel): gerado por CSPRNG no primeiro
arranque, guardado em ~/.dsh/dsh-tavily-resilient-search/admin-token.txt
(0600) e impresso uma vez no registo do DSH (logger 'tavily-pool'). Perdeu?
Recarregue com DSH_TAVILY_ADMIN_RESET=1. Também pode definir
DSH_TAVILY_ADMIN_TOKEN.
- Fronteira: origem (socket + Origin) → Host → credencial, por esta
ordem fixa; denegações byte-idênticas (sem oráculo). Predefinição: só
loopback (admin.trustedRemotes / admin.allowedHosts).
- Força bruta: orçamento NIST SP 800-63B-4 (100 falhas → lockout com o
mesmo 401).
- Ações destrutivas (remoção e substituição/edição) exigem nonce de
confirmação, de uso único.
- Auditoria: audit.log apensível (0600, O_NOFOLLOW) com todas as
decisões mutáveis e denegações.
- Chaves removidas que vêm do ambiente regressam no próximo arranque (a
remoção é volátil e o painel avisa); chaves persistidas/removidas pelo painel
são definitivas.
- Sobre um bind público (0.0.0.0) o painel recusa-se a subir (fail-closed,
ruidoso) até admin.allowPublicBind: true — a ferramenta de pesquisa continua
a funcionar em qualquer caso.

Configuração

Sobreponha qualquer campo na camada Profile
($DSH_HOME/profiles//cordis.patch.yml), Home
($DSH_HOME/cordis.patch.yml) ou CLI overlay (dsh --patch ./o.yml). A
resolução é de entrada inteira (whole-entry replace), nunca deep-merge:
aponte sempre ao id do próprio plugin.

Campo Tipo Predefinição Função
apiKeys string[] [] Agrupamento de credenciais (round-robin). Vazio = keyless-only.
searchDepth ultra-fast\|fast\|basic\|advanced basic Profundidade predefinida quando o modelo não escolhe.
maxResults 1..100 (clamp a 10) 5 Máximo de fontes qualificadas.
includeAnswer boolean true Injeta a resposta preliminar sumarizada.
timeoutMs 250..300000 15000 Timeout por tentativa HTTP.
callTimeoutMs ≥ timeoutMs 120000 Orçamento cooperativo total da chamada (todas as rotações).
projectId string — Segregação por projeto (X-Project-ID).
admin.enabled boolean true Painel de gestão de chaves via interface.
admin.trustedRemotes string[] loopback Origens de soquete admitidas no painel.
admin.allowedHosts string[] 127.0.0.1, localhost, ::1 Nomes de Host admitidos (anti DNS-rebinding).
admin.stateDir string $DSH_HOME/dsh-tavily-resilient-search Diretório de estado (0700).
admin.allowPublicBind boolean false Opt-out explícito da recusa de bind não-loopback.
securityProfile {sandbox, approval} obrigatório Atestação do perfil de instalação (ver Segurança).

Exemplo (camada Bundle, já incluído no pacote):

- insert:
- id: dsh-tavily-resilient-search
name: 'dsh-tavily-resilient-search'
config:
searchDepth: 'basic'
maxResults: 5
includeAnswer: true
timeoutMs: 15000
callTimeoutMs: 120000
securityProfile:
sandbox: 'workspace-write'
approval: 'ask'
apiKeys: !!js >
(() => { try { return [process.env.TAVILY_API_KEY_A, process.env.TAVILY_API_KEY_B, process.env.TAVILY_API_KEY_C, process.env.TAVILY_API_KEY_D].filter(Boolean) } catch { return [] } })()

Regras medidas do manifesto (@deepseek-ai/dsh 0.1.x-rc): a ordem das linhas não
carrega semântica de carga (a ativação é dirigida por inject) e um !!js que
lança na carga impede o boot do DSH para todos os instaladores
— a expressão
acima é defensiva e devolve [] em falha.

Ferramenta exposta: web_search

Parâmetro Tipo Obrig. Descrição
query string sim Termos objetivos (recomendado < 1500 caracteres; limite duro 4000).
search_depth enum não ultra-fast/fast (< 800 ms) · basic · advanced (só documentação complexa).
max_results integer não 1 a 10 (predefinição 5).
topic enum não general | news.

Resultado canónico (forma total, null explícito quando não aplicável):
ok, query, answer, sources[] (title, url, snippet, score),
responseTime, resultsTruncated, keylessFallbackUsed, error, detail,
suggestion. A projeção para o modelo inclui sempre um aviso de
não-confiança
sobre o conteúdo web (contenção de injeção indireta).

Comportamento por código HTTP

HTTP Condição Comportamento do plugin
200 Sucesso Descodifica, normaliza, aplica teto de 50 KB, devolve resultados.
400 Parâmetros malformados Não rotaciona — devolve erro + sugestão de correção.
401 Chave inválida/revogada Banida em definitivo (REVOKED) e avança já para a próxima.
403 Domínio/rota interdita Não rotaciona — informa impossibilidade de acesso.
429 Limite de taxa Lê Retry-After (segundos ou data HTTP), arrefece a chave e rotaciona.
432 Cota mensal esgotada Suspende até à meia-noite UTC do mês seguinte e rotaciona.
433 Teto PAYGO atingido Igual a 432 (suspensão temporizada).
5xx Instabilidade transiente Nova tentativa com a alternativa; estado da chave não muda.

Máquina de estados do agrupamento

┌──────────────┐  401   ┌──────────┐
┌────────►│    ACTIVE    │───────►│ REVOKED  │ (definitivo)
│         └──────┬───────┘        └──────────┘
│  cooldown      │ 429
│  expirado      ▼
┌─────┴────────┐  ┌──────────────┐
│ (round-robin)│◄─│ RATE_LIMITED │  T = Retry-After ou min(Tmax, T0·2^k) + δ
└──────────────┘  └──────────────┘
▲
│ reposição mensal (1.º dia, UTC)
┌─────┴───────────┐
│ QUOTA_EXHAUSTED │  432/433 → suspensa até à meia-noite UTC do mês seguinte
└─────────────────┘

T₀ = 500 ms, T_max = 60 s, jitter δ ∈ [0, 500) ms contra ressaturação em
bloco. A recuperação é lazy (sem timers): a expiração é aplicada na seleção
seguinte, o que mantém leituras puras e o event loop limpo.

Segurança

Resumo (completo em docs/seguranca.md):

  • A conjugação sandbox: danger-full-access + approval: never é recusada no
    load
    (fail-loud, irrecuperável de propósito). O securityProfile é uma
    atestação obrigatória do operador — configuração ausente também falha alto.
  • Canário de segredos por valor: material de credencial é redigido de todo o
    texto de saída e registos (um corpo de resposta malicioso que ecoasse a chave
    do Authorization nunca a propaga); identificação em logs apenas por máscara
    …últimos4.
  • Teto volumétrico de 50 KB por invocação: documentos-bomba não saturam a
    janela de contexto (include_raw_content nunca é enviado).
  • Conteúdo web é dado não-confiável: a projeção do modelo carrega aviso
    permanente contra injeção indireta de instruções.
Sandbox \ Approval ask never
workspace-write Prudencial (padrão) Automação controlada
danger-full-access Alargado vigiado PROIBIDO — recusa de carga

API validada por medição (nunca por prosa)

A superfície usada foi lida dos .d.ts dentro dos tarballs npm publicados
(sha256 registado em types/; reverificado por pnpm run check:upstream) e é
travada por um contract test que falha se a API pública divergir. Factos
medidos que corrigem documentação circulante:

Afirmação morta Comportamento real medido
inject: [&#x27;tools&#x27;, &#x27;logger&#x27;] logger não é Service do Cordis: a fiber ficaria PENDING para sempre. Usa-se ctx.logger(nome); inject = [&#x27;tools&#x27;].
dsh.bundle: {} ativa o plugin Só dsh.bundle.patch ativa (medido em @deepseek-ai/dsh 0.1.0-rc.7+).
required: false nos parâmetros O DSL marca obrigatoriedade com required?: true — opcional = omitir a chave.
output: { schema: { type: &#x27;object&#x27; } } Objetos exigem additionalProperties: boolean explícito.
ctx.httpServer / spawn(cmd, args) ctx.webServer / ctx.subprocess.spawn(spec) (verificados na gama 0.1.x-rc).

Linhas suportadas: @deepseek-ai/dsh-tools ^0.1.1-rc.1 || ^0.1.7-rc.1 (o
drift entre ambas é apenas aditivo) e @deepseek-ai/cordis ~4.0.4. Nota: o
dist-tag latest dos subpacotes dsh-* aponta para a publicação mais antiga —
a linha viva é next.

Desenvolvimento

pnpm install
pnpm run gate          # lint + typecheck + build + test + check:tarball
pnpm run check:upstream # reverifica tarballs/sha256 pela rede (Q-1)

Testes em quatro camadas (node:test + tsx, determinísticos — relógio e RNG
injetados, sem sleeps):

Camada Prova
test/unit núcleo puro: máquina de estados, teto de bytes, validação fail-loud, token/nonce/lockout, persistência 0600 + auditoria à prova de symlink
test/integration rotação atómica sobre um double de transporte e o router do painel sobre servidor HTTP real (porta 0)
test/adversarial tenta brechar: canário de segredos, documento-bomba, injeção indireta, perfil YOLO, regressão P-09, boot-safety, CSRF/rebinding byte-idêntico, força bruta sem oráculo, nonce, recusa de bind público
test/contract os espelhos types/ correspondem verbatim aos .d.ts publicados

Empacotamento e publicação

Publica-se pré-compilado (dist/), sem scripts de build na instalação do
consumidor (risgo de cadeia de suprimentos). files é uma allowlist: dist/,
cordis.patch.yml, README.md, LICENSE, CHANGELOG.md. O gate de release é
pnpm run gate &amp;&amp; publint &amp;&amp; attw --pack . &amp;&amp; node scripts/check-tarball.mjs
(este último inspeciona o tarball real). Notas de versão via
changesets; em 0.x, um minor é
breaking. Releases em CI usam trusted publishing (OIDC) — configurar uma vez
no console do npm para este repositório.

Licença

MIT

常见问题

8 问
答案由本站依据条目字段整理,不引用上游原文
dsh-tavily-resilient-search 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add dsh-tavily-resilient-search@0.1.3` 即可。对应的 npm 包名是 `dsh-tavily-resilient-search`。

dsh-tavily-resilient-search 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-tavily-resilient-search 安全吗?

低风险。vet 静态分析未发现可疑行为,判定为干净(clean)。

dsh-tavily-resilient-search 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-tavily-resilient-search 支持哪些 DSH 版本?

上游记录的兼容版本包括 0.2.0-rc.2、0.2.0-rc.1、0.1.7-rc.2。

dsh-tavily-resilient-search 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

dsh-tavily-resilient-search 有哪些功能?

Tavily 实时联网搜索、多密钥原子轮换与重试、限流/配额/吊销自动降级、设置页管理密钥池、密钥测试与审计日志。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

记忆与知识
按星标排序,可作替代方案

ruflo

ruflo

L3 · 安装规范通过 7.4 万 星

OpenViking

OpenViking

面向 DeepSeek Harness 的 OpenViking 记忆与上下文插件:pre-step 自动召回与画像注入、会话捕获、`vik

L3 · 安装规范通过 3.9 万 星

WeKnora

WeKnora

把 WeKnora 知识库接入 dsh 的四个只读工具:列出知识库、混合检索原文片段、按顺序还原单篇文档,以及直接取用 WeKnora 自己

L4 · 沙盒安装通过 3.3 万 星

distilly

distilly

Distilly — Distill how they think into reusable Skills for any Agent o

L4 · 沙盒安装通过 2.5 万 星

EverOS

EverOS

L4 · 沙盒安装通过 1.3 万 星

MemOS

MemOS

L4 · 沙盒安装通过 1.2 万 星

frederico-kluser 的其它插件

6 个

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 2026-10-08。