dsh-plugin-browserskill
Tencent/BrowserSkillBrowserSkill 的 DeepSeek Harness 浏览器自动化桥接插件,通过原生浏览器工具控制可见的 Chrome 和 Edge Agent Window,支持可访问性与 VOM 页面观察、截图、隔离的多会话控制和 Web UI 实时观察浮层。
基于 OpenAI 兼容 Responses API 的通用联网搜索插件:配置 baseURL / API Key / 模型即可让内置 web_search 工具对接 Qwen Token Plan、OpenAI 等任意网关。
OpenAI-compatible web search provider for DeepSeek Harness (DSH).
It plugs into the harness ctx.web seam and powers the built-in web_search tool through any gateway that
implements the OpenAI Responses API with the built-in web_search tool.
Your chat LLM (e.g. deepseek-v4) decides to call the web_search tool; the tool executes through the
ctx.web seam, which routes to the provider configured here (e.g. qwen3.7-plus + your Qwen Token Plan key).
Search and conversation models are fully decoupled — no model switching, no manual steps.
you ──> chat LLM (deepseek-v4, …)
│ decides it needs live info
▼
web_search tool (model-agnostic)
│ ctx.web seam ──> configured provider
▼
this provider: POST {baseURL}/responses
tools: [{ type: "web_search" }]
│
▼
qwen3.7-plus / any compatible model ──> real search results
│
▼
chat LLM answers grounded in the results
| Field | Value |
|---|---|
baseURL | https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 (Qwen Token Plan CN) |
apiKeyEnv | QWEN_TOKEN_PLAN_CN_API_KEY |
model | qwen3.7-plus (also qwen3.7-max, qwen3.8-max) |
Why Responses API? Built-in web search on Qwen Token Plan only triggers through the Responses API with an explicit
tools: [{type: "web_search"}]declaration. The Chat Completionsenable_searchflag is silently ignored on that gateway. OpenAI and most OpenAI-compatible gateways expose the same shape.
Published as an npm package; one command once published:
dsh plugin add dsh-web-search-openai
For a local checkout (development), add it as a profile dependency and bundle:
cd ~/.dsh/profiles/web
pnpm add file:/path/to/dsh-web-search-openai
then add the package name to the dsh.profile.bundles list in profiles/web/package.json
(append it after the shipped bundles) and restart the app. The bundle's cordis.patch.yml
registers the provider and switches the web service's searchProvider to openai-search
— no shipped file is modified.
Install the plugin and open Settings → Plugins → Plugin config: the
dsh-web-search-openai card edits endpoint, credential reference, model,
maxOutputTokens, and the API key (stored through the credentials service,
never in config or code). Values take effect immediately — no restart needed.
Runtime precedence: UI-managed file ($DSH_HOME/dsh-web-search-openai.json)
web-search-openai:settings section > package defaults.
Provider config lives in the web-search-openai settings section (or the plugin row in your composition):
web-search-openai:
baseURL: https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
apiKeyEnv: QWEN_TOKEN_PLAN_CN_API_KEY
model: qwen3.7-plus
| Key | Default | Meaning |
|---|---|---|
apiKey | unset | Literal API key (prefer apiKeyEnv; secrets never enter config). |
apiKeyEnv | QWEN_TOKEN_PLAN_CN_API_KEY | Credential reference resolved per search via the ctx.credentials seam, falling back to the launching environment. |
baseURL | Qwen Token Plan CN | OpenAI-compatible base URL (no trailing /); /responses is appended. |
model | qwen3.7-plus | Any model exposing the web_search tool on your gateway. |
maxOutputTokens | 1024 | Generated-token cap for one search call (the search itself is not truncated). |
Store the key through the standard harness credential paths — the Web Models settings page,
~/.dsh/.credentials.yaml, or the launching environment — under your apiKeyEnv name.
Each web_search call is a full model turn on the search gateway (reasoning + tool use + grounded answer,
roughly 3–4k tokens). On Qwen Token Plan, the built-in tools are billed per successful call and deducted
from your plan Credits. The chat model's tokens are billed separately.
cd dsh-web-search-openai
npm install
QWEN_TOKEN_PLAN_CN_API_KEY=sk-... node scripts/smoke.mjs "2025年诺贝尔物理学奖得主是谁?"
id: openai-search) on ctx.web via registerSearchProvider.web_search tool stays the only entry point.web_search_call block fails with WEB_PROVIDER_ERROR
instead of scraping prose. Sources are deduped by URL; url_citation annotations add titles when present.WEB_PROVIDER_CREDENTIAL_MISSING, WEB_PROVIDER_ERROR,
WEB_ABORTED.npm install
node scripts/smoke.mjs # requires a key in the environment
npm publish # after bumping version
MIT licensed. Fork, adapt, and swap baseURL/apiKeyEnv/model to point at any compatible gateway.