npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@xyzensun/platypus

v0.0.3

Published

Provider-native search CLI with optional AI cleanup

Readme

Platypus CLI

Platypus 是按 Provider 独立调用的搜索 CLI,可选用 AI 清洗结果。Platypus 已以 @xyzensun/platypus 发布到 npm。本仓库准备发布 0.0.3;旧版 @xyzensun/platypus-mcp 是不同的 MCP 产品。

本地使用

需要 Node.js >=20。在仓库中安装依赖、构建并运行:

npm ci
npm run build
node dist/index.js search exa --query "Node.js" --numResults 5
node dist/index.js --ai search tavily --query "Node.js" --max_results 5
node dist/index.js --ai --prompt "只保留关键事实和来源链接" search jina --query "Node.js" --num 5

用户可通过 npm install -g @xyzensun/platypus 安装并运行 platypus search exa ...;本地构建后也可通过 npm link 使用 platypus。打包前通过 prepack 构建;npm 包包含 dist/、src/、README.md 和 .env.example,不附带项目 skill 或凭据。

platypus [--env <文件>] [--ai] [--prompt <文本>] [--ai-timeout <秒>] [--provider-timeout <秒>] search <provider> ... 的包装器只识别 search 之前的选项及 Provider 名称,Provider 后面的选项完全交给对应 adapter。现支持 exa、tavily、jina、brave、gemini、ollama、searxng;使用 platypus --help 和 platypus search <provider> --help 查看分层帮助。platypus [--env <文件>] list 只输出已配置所需 key(SearXNG 为实例地址)的 Provider 名称 JSON 数组,不访问上游,不保证实时可连通;这与源码支持的完整列表不同。普通搜索只统一 --query 名称,其余选项使用上游 API 的字段名:Exa 如 --numResults、--contents '{"text":true}';Tavily 如 --max_results、--include_domains '["example.com"]';Jina 如 --num、--type;Brave 如 --count;Ollama 如 --max_results;SearXNG 如 --engines。数组与对象选项请传入 JSON 字符串;不同厂商的参数不做跨平台语义转换。Gemini Grounding 使用 --query 映射模型的 contents,由模型自行搜索并返回原始 Gemini 响应,不等同于普通网页搜索结果列表。搜索模型可用 --model 指定,未指定时使用 PLATYPUS_GEMINI_MODEL,再回退到 gemini-flash-lite-latest。Gemini 搜索与 Gemini AI 清洗共用 src/ai/client/gemini.ts,仅在需要对应协议时加载 SDK;其他 Provider 的普通搜索不会加载 AI SDK。

输出

--provider-timeout <秒> 只在 search 前使用,设置单次上游 Provider API 调用 (包括响应正文读取) 的最长时间,默认 30 秒;只支持 CLI 参数,不读取 .env 或系统环境变量,超时后取消调用,不重试。它与 AI 清洗超时分别计时。

不加 --ai 时 stdout 输出上游返回的原始 JSON 文本,不统一响应结构。加 --ai 后 stdout 只输出 AI 清洗后的纯文本;--ai-timeout <秒> 设置单次 AI 清洗调用 (含 SDK 重试) 的最长时间,不包括上游搜索,默认 120 秒;优先级为 CLI 参数 > --env 文件中的 PLATYPUS_AI_TIMEOUT > 系统环境变量。超时值必须为正整数秒,且仅可与 --ai 同用;--prompt 替换默认清洗要求,系统提示和 user prompt 都会包含该要求,搜索词和原始响应一起发送给 AI。AI 支持 OpenAI Chat Completions、Anthropic Messages、Gemini 协议。默认非流式;PLATYPUS_AI_STREAMBLE=true 时 OpenAI、Anthropic 使用各自官方 SDK 的流式接口,等待 SDK 聚合完整响应后再输出正文,不逐块打印。Gemini AI 暂时始终使用非流式,即使设置该开关也不启动 Gemini 流式请求。

上游 HTTP 状态不是 200 时,stderr 输出状态及响应,退出码为 1,且不调用 AI。AI 失败时,把错误原因与完整原始上游响应写入权限受限的 /tmp/platypus-error-<provider>-<YYYYMMDDHHmmssSSS>.json(本地时间,精确到毫秒),stdout 仅输出 AI处理失败,原始响应与AI错误原因见<文件路径>,退出码为 1。黑白名单尚未实现。

配置

CLI 的 --env <文件> 必须写在 search 之前;不指定时仅使用系统环境变量。指定文件中的变量优先,同名变量不存在时才回退系统环境变量。不自动读取工作目录或可执行文件附近的 .env。变量名统一带 PLATYPUS_ 前缀:

PLATYPUS_EXA_API_KEY
PLATYPUS_TAVILY_API_KEY
PLATYPUS_JINA_API_KEY
PLATYPUS_BRAVE_API_KEY
PLATYPUS_GEMINI_API_KEY
PLATYPUS_GEMINI_MODEL
PLATYPUS_OLLAMA_API_KEY
PLATYPUS_SEARXNG_BASE_URL(自托管实例,必须启用 JSON 格式)
PLATYPUS_AI_FORMAT=openai、anthropic 或 gemini
PLATYPUS_AI_API_KEY
PLATYPUS_AI_MODEL
PLATYPUS_AI_BASE_URL(可选;OpenAI 将末段路径替换为 /v1;Anthropic 地址原样交给 SDK;Gemini 用作官方 SDK 的 httpOptions.baseUrl)
PLATYPUS_AI_TIMEOUT=120(可选;单次 AI 清洗调用含重试的超时秒数,CLI 可覆盖)
PLATYPUS_AI_STREAMBLE=true(可选,只有 true 且格式为 OpenAI 或 Anthropic 时启用流式,默认非流式)
PLATYPUS_AI_MAX_TOKENS=8192(可选,Anthropic 输出 token 上限,按模型能力调整)

Brave、Ollama 可选 PLATYPUS_<PROVIDER>_BASE_URL,填写服务根地址;Gemini 可选 PLATYPUS_GEMINI_BASE_URL,作为 SDK 的 httpOptions.baseUrl;Exa、Tavily、Jina 的根地址会追加 /search。示例见 .env.example。不要提交含真实密钥的文件。

开发检查:npm run typecheck、npm run build、npm run lint。