@lijian-ui/pi-deepseek-web0.1.0
pi 扩展:为 pi 提供 web_search / web_fetch 工具,底层用 DeepSeek 官方网页搜索与抓取 API
Untested on omp
This is a pi package. No one has reported whether it works on omp yet. If you try it, add your result below.
Reports 0
No reports yet.
Readme
pi-deepseek-web
给 pi CLI 的扩展,新增两个工具:
| 工具 | 作用 | 后端 |
|---|---|---|
web_search |
搜索网页,返回标题、链接、长摘要、站点、权威性评分 | POST https://api.deepseek.com/v1/tools/search |
web_fetch |
打开指定 URL,返回标题 + Markdown 正文 | POST https://api.deepseek.com/v1/tools/fetch |
两者的分工和模型行为一致:先 web_search 拿线索,再对具体链接 web_fetch 读正文,避免模型凭摘要臆测细节。
准备
不需要额外配 Key:扩展直接复用 pi 里已经配置好的 DeepSeek 凭据。
# 在 pi 里登录一次(之后所有会话复用)
/login deepseek
如果你习惯用环境变量,pi 自身也会读 DEEPSEEK_API_KEY,两种方式都行:
export DEEPSEEK_API_KEY=sk-xxxx # macOS / Linux
$env:DEEPSEEK_API_KEY="sk-xxxx" # Windows PowerShell
一个都没有时,两个工具会返回一条明确的错误文本,提示你先去 /login deepseek,
不会静默失败。
安装
前置:先装 pi(另一台电脑上)
npm install -g @earendil-works/pi-coding-agent
pi --version
方式一:从 npm 安装(推荐)
pi install npm:@lijian-ui/pi-deepseek-web
# 锁版本
pi install npm:@lijian-ui/pi-deepseek-web@0.1.0
# 以后更新
pi update --extensions
# 卸载
pi remove npm:@lijian-ui/pi-deepseek-web
pi 会用生产模式安装依赖(--omit=dev),运行时依赖 typebox 已在 dependencies 里,无需额外操作。
方式二:本地目录安装(改代码时用)
cd E:\Project\deepseek-web
npm install --omit=dev
pi install .
方式三:临时试跑(完全不装)
cd E:\Project\deepseek-web
npm install # 开发用,含 devDependencies
pi -e ./src/index.ts
如果不想走 npm 而想直接拷源码目录,注意目录必须是 ~/.pi/agent/extensions/<名字>/,且里面要有 index.ts(仓库已带,它转发到 src/index.ts),并在该目录执行 npm install --omit=dev。
验证是否加载成功
进 pi 后输入 /reload,然后问一句:
你有哪些 web 工具?web_search 的参数是什么?
能看到 web_search / web_fetch 就算装好;如果会话启动时就弹了「没有配置 DeepSeek 凭据」的警告,说明扩展已加载,只是还没 /login deepseek。
配置项
| 环境变量 | 必填 | 默认 | 说明 |
|---|---|---|---|
DEEPSEEK_API_KEY |
否 | pi 的 DeepSeek 凭据 | 设了优先用环境变量;没设就用 pi 里 /login deepseek 存的 Key |
DEEPSEEK_BASE_URL |
否 | https://api.deepseek.com |
指向自建代理/网关时用,可写成 .../v1 也会自动归一 |
凭据每次调用时才解析,所以在 pi 里换 Key 不用重启扩展。
其他内置约束(改源码即可调整):
- 请求超时 60s,尊重 pi 的取消信号(Ctrl+C 立即中断);
count上限收到 20(官方允许 50,但一次塞 50 条摘要会污染上下文);web_fetch正文上限 10 万字符,超出截断并告知模型原文长度。
使用
装好后不用记工具名,正常提问即可,模型会自己选。它看到的是这几句引导:
- 需要时效性事实(新闻、价格、版本、文档变更)→ 用
web_search,不要凭记忆答; - 只有主题没有链接 → 先
web_search; - 已经拿到具体 URL、需要读正文 → 用
web_fetch。
实际对话示例:
> 帮我查一下 DeepSeek tools/search 的计费方式
⟳ web_search query="DeepSeek tools search 计费" count=8
⟳ web_fetch url="https://api-docs.deepseek.com/zh-cn/guides/search"
✔ 按官方文档,搜索按调用次数计费……
搜索语法直接写在 query 里:
site:api-docs.deepseek.com 限流-site:zhihu.com "DeepSeek V4" 发布
想控制条数就明说「看前 3 条」,模型会把 count 设成 3(上限 20)。
错误处理
所有失败都以文本返回给模型(而不是抛异常中断回合),模型可以据此换关键词或换 URL:
- pi 里没配 DeepSeek 凭据 → 返回提示,让你执行
/login deepseek(会话启动时也会先提醒一次); - 网络不可达 / 超时 → 提示检查网络与
DEEPSEEK_BASE_URL; - 接口 4xx/5xx → 返回状态码 + 响应体前 400 字符。
说明
- 工具名采用
web_search/web_fetch,与 pi 内置工具无冲突; - 运行时只依赖
typebox;@earendil-works/pi-coding-agent仅用于类型,不会在运行时加载; - 扩展通过 jiti 直接执行 TypeScript,无需编译。