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

opencode-magpie-plugin

v0.5.1

Published

Discover Magpie providers and models in OpenCode V2 with built-in pricing and automatic local gateway startup

Readme

opencode-magpie-plugin

npm CI License: MIT

在 OpenCode V2 中动态使用 Magpie 的 Cursor、WorkBuddy 等服务,无需手写模型配置。

An OpenCode V2 plugin for local or remote Magpie gateways. It discovers providers and models, supplies built-in token pricing, and starts an installed local gateway when needed. Zero runtime npm dependencies; no private registry or company-scoped packages required.

插件图标沿用 Magpie 官网的小尺寸喜鹊 SVG,保留原始轮廓,透明底、currentColor 单色渲染。源文件为 icon.svg,package.json 顶层 icon 内嵌同一图形的 data URI,不依赖远程图片。

它解决什么问题

Magpie 管理多个服务的账号、模型、协议转换和路由;这个插件负责把这些能力接入 OpenCode。

OpenCode V2
  ├─ /models:Cursor、WorkBuddy、Magpie(路由分组)
  ├─ 模型能力、上下文限制、reasoning 档位和价格
  └─ 原生 Chat / Responses / Anthropic 请求
          ↓
    本机或远程 Magpie 网关
          ↓
    Cursor / WorkBuddy / 其他已配置服务
  • opencode.jsonc 只加载插件,不维护 providers.models。
  • 启动时发现目录,每 30 秒刷新;服务新增、模型下线都能反映到 OpenCode。
  • Provider 显示 Magpie 中的分组名称,而不是统一挤在一个 “Magpie” 下。路由分组默认仍归入 Magpie;要换呈现方式,在插件 options 里声明,不要改构建产物。
  • 内置独立价格表和模型名归一化逻辑,支持输入、输出、缓存读取与写入价格。
  • Magpie 已安装但未运行时自动启动;macOS 上找到 app 内的可执行文件时优先启动 app,保留路由页;未安装时给出安装链接。
  • 登录和服务凭据由 Magpie 管理,插件不需要复制上游 token。

这不是一个绕过 Magpie 的社区插件宿主:推理请求仍经过所配置的 Magpie 网关。

前置条件

  1. 使用支持 setup()、provider.transform 和原生 provider runtime 的 OpenCode V2。不支持 V1。
  2. 从 Magpie 官网 安装 Magpie,并在其中登录需要的服务、启用模型;使用远程网关时,本机无需安装。
  3. 网关对 OpenCode 服务进程可访问。本机默认地址 http://127.0.0.1:3425;远程连接见下方配置。

包的 Node.js 要求为 22 或更高。macOS 上已验证插件加载与 Cursor / WorkBuddy 目录注册;Windows 和 Linux 的实际网关联调尚未验证。

安装

在全局 ~/.config/opencode/opencode.jsonc 中加入插件;如果已有 plugins 数组,追加即可:

{
  "$schema": "https://opencode.ai/config.json",
  "plugins": ["opencode-magpie-plugin"]
}

也可以固定版本:

{
    "plugins": ["[email protected]"]
}

OpenCode 会从公网 npm 安装插件,不需要先全局安装 npm 包。不要同时加载本插件的 npm 版和本地 file 版。

重启 OpenCode 服务,使全局配置生效:

opencode service restart

打开 /plugins,应看到 magpie.providers;打开 /models,选择 Cursor、WorkBuddy 等分组下的模型。

Provider 名称与模型 ID

显示名与 Magpie 保持一致,只去掉上下文窗口前的空格(Claude Opus 5.5 @ 1m 显示为 Claude Opus 5.5 @1m)。模型 ID 不变。内部 ID 使用命名空间,避免覆盖另一个 Cursor / WorkBuddy 插件:

| OpenCode 中的显示名 | 内部 provider ID | 示例模型引用 | 发给 Magpie 的 model | | --- | --- | --- | --- | | Cursor | magpie-cursor | magpie-cursor/gpt-5.5 | cursor/gpt-5.5 | | WorkBuddy | magpie-workbuddy | magpie-workbuddy/claude-opus-4-6 | workbuddy/claude-opus-4-6 | | Magpie Group | magpie-group | magpie-group/auto | group/auto | | Magpie Auto | magpie-auto | magpie-auto/auto-glm-5.2 | auto/glm-5.2 | | Group · Remote Magpie | magpie-remote-magpie%2Fgroup | magpie-remote-magpie%2Fgroup/group/auto | remote-magpie/group/auto | | Auto · Remote Magpie | magpie-remote-magpie%2Fauto | magpie-remote-magpie%2Fauto/auto/glm-5.2 | remote-magpie/auto/glm-5.2 |

示例模型仅说明格式,实际列表取决于 Magpie 当前账号与配置。Magpie 自定义 provider ID 会原样映射为带 magpie- 前缀的 ID。

网关中嵌套的远程来源按内层服务独立分组,例如 remote-magpie/cursor/gpt-5.6-terra@272k 显示在 Cursor · Remote Magpie 下,WorkBuddy、Codex、Astra 等各自分组,不再由首条模型的标签决定整个 remote 的名称。该示例的 provider ID 为 magpie-remote-magpie%2Fcursor,模型 ID 为 cursor/gpt-5.6-terra@272k,请求仍发送完整的 remote-magpie/cursor/gpt-5.6-terra@272k。从旧版本升级后,原先选在合并 remote 分组中的模型需要重新选择。

Routing group(例如 group/auto)会跨多个服务路由,因此不按 owned_by 或首个候选服务拆成 provider。本地 group/ 与 auto/ 分别归到 Magpie Group、Magpie Auto;远程嵌套的 remote-magpie/group/ 与 remote-magpie/auto/ 分别显示为 Group · Remote Magpie、Auto · Remote Magpie。默认路由组的 provider 名称只出现一次 Magpie,不再把 Group 和 Auto 显示成同名分组。远端未给模型标签时也遵循这一规则。发送时仍保留网关原始 id,价格只用 Magpie 给出的价格,不按成员猜测。

本地默认路由组的 provider ID 从 magpie-magpie 拆为 magpie-group 与 magpie-auto,旧模型选择需要重新选择,options.order 的 key 也需对应更新。选择器中的模型 ID 和发给网关的 ID 不变;远程嵌套来源与自定义分桶的 provider ID 不变。

目录呈现

新版 Auto Group 的 auto/<model> 也按路由组处理,默认放在 magpie-auto(Magpie Auto),选择器 ID 为 auto-<model>,请求仍发送原始 auto/<model>。它按 auto-<model> 匹配下述 groups.prefix,因此可用 auto- 单独分桶;模型名中的点号保持原样。旧的 group/ 格式继续支持,默认放在 magpie-group(Magpie Group),普通厂商模型不会被自动组覆盖。自动组及其 Fast 变体仅采用 Magpie 报价。

路由组的成员由 Magpie 维护;这个插件只决定 OpenCode 选择器里怎么摆。分组、显示名和排序写在 opencode.jsonc 的插件 options 里,升级插件包之后仍在,不用再改 dist。空 options(或仍用字符串引用插件)和不声明时完全一样:group/ 行都在 magpie-group,auto/ 行都在 magpie-auto。

{
  "plugins": [
    {
      "package": "opencode-magpie-plugin",
      "options": {
        "groups": [
          { "prefix": "adams-", "id": "adams", "name": "Adams" },
          { "prefix": "combo-", "id": "combo", "name": "Combo" }
        ],
        "order": {
          "magpie-adams": ["deepseek-v4.1-flash"],
          "magpie-cursor": ["grok-4.7@500k"]
        }
      }
    }
  ]
}

上面只是写法示例,不是插件默认值。语义:

  • 只对 id 以 group/ 或 auto/ 开头的行分桶。groups 按 prefix 最长优先匹配。命中后 provider 是 magpie-<id>,显示名是 name,选择器里的模型 id 去掉这段 prefix(group/adams-deepseek-v4.1-flash → magpie-adams/deepseek-v4.1-flash)。发给 Magpie 的仍是原始 id。没匹配到的组分别回到 magpie-group(Magpie Group)或 magpie-auto(Magpie Auto),保留各自默认的选择器模型 ID。厂商模型(cursor/、workbuddy/)不受 groups 影响。
  • OpenCode 同 provider 内按 time.released 倒序排。order 的 key 是最终 provider id,值是最终模型 id(已去前缀),越靠前越靠前。名单里没有的保持 0,退化为字母序。-fast 克隆继承父模型的权重并紧跟在后面;不要给它单独写一条,除非那个 -fast id 自己出现在 order 里。provider 之间的顺序控制不了。
  • 插件不隐藏模型。网关列出的都会出现,没标价的也一样。不想在 OpenCode 里看到某个组,在 Magpie 里处理:不用了就 magpie group rm <id>,只对 OpenCode 收窄就用 magpie visible opencode …。组的成员是厂商模型时,删掉一个组不会影响把同一批模型当成员的其他组。

options 非法会在启动时失败,并写明出错字段的路径,不会静默忽略。改 options 后要重启 OpenCode 服务(opencode service restart)。热重载不一定会重新执行 setup,目录的 30 秒刷新也仍用启动时解析的那一份。

自动发现与请求行为

本机模式先检查网关根路径的 name: "magpie",再请求 /v1/models。远程模式直接请求配置的 API baseURL 下的 models,不探测站点根路径,以兼容只暴露 API 的反向代理。请求携带 X-Magpie-Prices: 1 读取可用的网关价格扩展。

目录映射保留模型的上下文窗口、最大输出、输入输出模态和 reasoning 档位。网关未提供有效上下文窗口时,默认使用 256K(256,000 tokens)。仅发现聊天目录;重复的无 provider 前缀别名、视频或其他非聊天专用模型不会注册为聊天模型。图片模型不进入聊天目录,改由下方的生图工具使用。

思考强度读取新版 reasoning_levels,并兼容已安装版本常见的 supported_reasoning_levels({ effort } 对象或字符串列表)。只有网关实际声明的档位才会出现,可在 OpenCode 的模型变体控件中选择,或使用 provider/model#high 这样的引用。default 保留服务默认行为,不额外生成档位;网关未提供档位时不会凭模型名称猜测。

支持 Fast 的模型会额外显示一个 -fast 模型,例如 composer-2.5 / composer-2.5-fast,显示名为 Composer 2.5 / Composer 2.5 Fast。选择 Fast 后仍向 Magpie 发送原模型 ID,同时附带 service_tier: "priority",并保留原有思考档位。检测依据是 /v1/models 的 service_tiers 包含 priority;本机模式在旧网关漏报时,补读本机 Magpie 配置目录的 plugin-providers.json 中 Cursor 的 fast: true 或插件的 serviceTiers。远程模式只采用远端模型目录的能力,不读取本机插件能力。仅扩展网关当前列出的模型,已有同名 -fast 模型优先,刷新时同步增删。

Fast 模型优先采用内置表中明确登记的 Fast 费率及上下文档位;没有独立 Fast 费率时仍沿用原模型参考价,不代表 Fast 实际费率。缺少原模型报价时仍按未知价格处理。

根据 native_endpoints 选择 OpenCode 内置 runtime:

| Magpie 元数据 | OpenCode runtime | | --- | --- | | 包含 /v1/messages | anthropic-compatible | | 否则包含 /v1/responses | openai-compatible/responses | | 其他情况 | openai-compatible(Chat Completions) |

消息、工具调用和工具结果由 OpenCode 原生 runtime 编码,再由 Magpie 转接。插件传递 X-Magpie-Session 保持会话标识,并指定 HTTP 传输。模型上游支持的完整能力仍取决于 Magpie 和相应服务。

切换到 openai provider 时,插件会在请求编码前,将历史中超过 64 字符的工具调用 ID 稳定映射为 48 字符,并同步替换对应工具结果的 ID。这适用于 HTTP、WebSocket 及压缩请求,不修改持久化历史、工具参数或输出。实测范围见 工具调用 ID 兼容性验证。

思考档位按所选协议编码:Chat 使用 reasoning_effort,Responses 使用 reasoning.effort,Anthropic 使用 thinking.type=adaptive 配合 output_config.effort;Anthropic 的 none 关闭 thinking。

刷新成功时替换完整目录;刷新失败保留最近一次成功的目录。首次发现失败会报告初始化错误,不生成虚假的可用模型。

网关地址与启动

远程网关与反向代理

在插件 options.remote 中配置 API baseURL 和 Magpie Gateway Key:

{
  "plugins": [
    {
      "package": "opencode-magpie-plugin",
      "options": {
        "remote": {
          "baseURL": "https://magpie.example.com/magpie/v1",
          "token": "{env:MAGPIE_REMOTE_TOKEN}"
        }
      }
    }
  ]
}

token 是远端 Magpie 的 Gateway Key(网关调用密钥),不是管理页面链接里的 ?k= 登录密钥,也不是上游服务的 token。可直接填写密钥,或像示例一样由 OpenCode 从其服务进程环境变量展开。remote 可与 groups、order 同时配置。

OpenCode V2 使用 plugins 数组中的 { "package": "…", "options": { … } } 对象传入配置;[packageName, options] 是旧版 tuple 写法,V2 配置请使用上述对象形式。

baseURL 必须包含实际使用的完整 API 前缀;插件只去掉末尾的 /,不会补 /v1、截掉 path 或推测 rewrite 规则:

| 配置 | 请求模型目录 | Chat 请求 | | --- | --- | --- | | https://host/v1 | https://host/v1/models | https://host/v1/chat/completions | | https://host/magpie/v1/ | https://host/magpie/v1/models | https://host/magpie/v1/chat/completions | | https://host/custom-api | https://host/custom-api/models | https://host/custom-api/chat/completions |

Responses 和 Anthropic 请求同样在该前缀下使用 responses、messages。例如 NGINX 把 /magpie/ 转发到远端网关根路径时,填写 https://magpie.example.com/magpie/v1;外部的 /magpie/v1/models 对应上游 /v1/models。如果把 /custom-api/ rewrite 到远端网关 /v1/,则填写 https://host/custom-api。地址指向 Magpie API 网关(默认端口 3425),而不是 Web 管理界面(默认端口 3430)。支持 HTTP/HTTPS;不接受 URL 内的用户名、密码、查询参数或片段。

模型发现、30 秒刷新和推理都使用同一个远端与 token。远程模式不读取本机 Magpie 地址或 Fast 配置,也不会自动启动本机网关、失败后回退到本机。首次发现失败会报错;后续刷新失败保留最近成功的目录。目录请求不跟随重定向,反代应直接处理所配置的地址。

本机网关

未配置 remote 时,地址优先级:

  1. OpenCode 服务进程中的 MAGPIE_ADDR。
  2. $XDG_CONFIG_HOME/magpie/settings.json 的 port。
  3. 未指定 XDG 路径时,使用 ~/.config/magpie/settings.json 的 port。
  4. 默认端口 3425。

MAGPIE_ADDR 使用 Magpie 自身的监听地址格式,例如:

MAGPIE_ADDR=127.0.0.1:3426 opencode --standalone

0.0.0.0、:: 监听地址会转换为本机访问地址。MAGPIE_ADDR 只用于本机网关,远程服务器使用上面的 options.remote。共享服务模式下,在终端临时设置变量不一定会改变已经启动的 OpenCode 服务环境。

网关不在线时,插件在 PATH、~/.local/bin、常见 Homebrew 路径以及 macOS 的 Magpie.app 中寻找可执行文件并把它拉起来。找到的是 Magpie.app 里的可执行文件时(安装器的软链会解析到真实路径),macOS 上优先启动 magpie tray——它同样提供网关,而且带窗口,路由页可以查看。app 非零退出或被信号终止后,才退回无窗口的 magpie serve。其他情况直接用 serve。Windows 通过 PATH / ~/.local/bin 寻找 magpie.exe。如果无法找到,请安装 Magpie 或把它加入 OpenCode 服务的 PATH。

启动后会等待网关就绪;app 明确异常退出时才降级到 serve。app 仍在启动或正常退出(可能已交给现有 app)时,超时会提示检查 app,不会另起 serve 抢占端口。请求前和目录刷新时也会检查网关。插件卸载不会关闭已启动的共享网关。若端口被其他服务占用,会报错而不是向其发送模型请求。

便携版使用自定义端口时,请显式设置 MAGPIE_ADDR;插件不自动推断便携版的 data 目录。

价格与费用统计

价格从哪里来

价格表完整内置于 src/model-pricing.ts,包含模型别名、渠道后缀处理、版本回退与 provider 专属覆盖。它从原有共享价格模块迁移而来,之后随本项目版本独立维护;运行时不请求私有包、私有 registry 或其他仓库。

普通模型使用以下顺序:

  1. 内置价格表,优先应用已识别 provider 的专属覆盖。
  2. 内置表未覆盖时,使用 Magpie 返回的 magpie_price。
  3. 普通模型仍缺价时,查询 models.dev 本地缓存:优先同 provider 的精确 ID,再查已识别厂商(OpenAI、Anthropic、DeepSeek、Google、xAI、Meta)的精确 ID 或 canonical_model_id。不跨版本猜价、不采用其他转售商报价、不使用订阅 plan 目录的零价。
  4. 所有来源均没有价格时,模型仍然列出、仍然可选,只是不填 cost。空费用不是 0 元,OpenCode 不会把它当成免费;实际费用以 Magpie 或服务账单为准。路由组同样如此:Magpie 只在组内全部成员同价时才给组报价,而路由组每一轮的成员由路由决定,成本本来就是一个区间而不是单一数字。路由分组仍只用 Magpie 报价,不根据 auto-* 名称推断成员价格。

models.dev 缓存写入 $XDG_CACHE_HOME/opencode-magpie-plugin/models.json(默认 ~/.cache/opencode-magpie-plugin/models.json)。首次可只读复用 Magpie、OpenCode 的 models.json;下载只写插件自己的目录。每次模型刷新检查缓存,超过 24 小时后台更新,缺价时可提前到 6 小时;同进程下载去重且失败后至少间隔 6 小时重试。首次下载和更新不阻塞模型发现,成功后下一次 30 秒刷新采用新目录;离线保留旧缓存。下载源为 https://models.dev/api.json,仍然零运行时依赖,基础价和 context 阶梯价一并传给 OpenCode。

0.5.0

  • 本地默认路由组拆为 Magpie Group(magpie-group)与 Magpie Auto(magpie-auto);旧 magpie-magpie 下的模型需重新选择,排序配置需更新 provider ID。
  • 远程嵌套路由组分别显示为 Group · Remote Magpie、Auto · Remote Magpie,provider 名称只出现一次 Magpie,并统一远程来源名的大小写。远程 provider ID、原始请求 ID、计价与 Fast 行为不变。

0.4.2

  • 修正远端网关下路由组(auto / group)的 provider 显示名:不再显示为 "routing group",改为 "Magpie"。

0.4.1

  • 生图 skill 增加回退规则:某模型不可用(额度、积分、不支持的尺寸等)时不重试原模型,改用 image_list 中其他模型(优先换 provider),最多尝试三个模型。

0.4.0

  • 新增生图能力:插件注册 magpie.image_list(列出 Magpie 可用的生图模型)和 magpie.image_gen(经 Magpie /v1/images/generations 出图,结果以 ![image](路径) 返回),以及 skill magpie-image-generate。生图前由 Agent 加载该 skill。
  • 不传 model 时使用 Magpie 设置里选定的生图模型;图片保存在系统临时目录的 magpie-images/ 下。

0.3.0

  • 新增 options.remote.baseURL 与 options.remote.token,支持远端 Magpie 网关及带路径前缀的反向代理。
  • API baseURL 保留完整路径,不自动追加 /v1;模型发现、刷新和三种原生推理协议共用远端配置与 Gateway Key。
  • 远程模式不启动本机 Magpie,也不读取本机插件 Fast 能力;刷新失败仍保留最近成功的目录。

0.2.0

  • 目录呈现改为插件 options:路由组的分桶、显示名和排序写在 opencode.jsonc,升级不再冲掉使用者自己的摆法。默认为空,与之前的目录一致。网关、价格表和 Fast 计价不变。

0.1.9

  • 缺价模型不再从选择器里拿掉:仍然列出、仍然可选,只是不填 cost。空费用不是 0 元,也不代表实际免费。
  • muse-* 在 Magpie 未报价时,回退到 models.dev 的 Meta 官方价,不采用转售商报价。Muse Wonder 1.0 为输入/输出/缓存读 $4/$20/$0.20,Muse Spark 1.3 为 $1.25/$4.25/$0.15。单位为美元/百万 token。这是 Meta 标价,不是 Cursor 账单价。

0.1.8

  • 修复上下文阶梯价丢失:保留内置表、models.dev 的 tier.type=context 与 Magpie 的 above 分档,交给 OpenCode 根据单次输入(含缓存)选择整单费率。
  • GPT-6 Astra 标准价为输入/输出/缓存读/缓存写 $10/$50/$1/$12.5,超过 272K 输入后为 $20/$75/$2/$25;Fast 两档均为标准价的两倍。单位为美元/百万 token。
  • 同步补齐 GPT-6 Sol、GPT-6 Luna、GPT-6.1 Sol 的 Standard/Fast 长上下文分档;GPT-6.1 Sol 独立使用 $0.10 缓存读取价,不再回退到旧 Sol 的 $0.20。依据 OpenAI 官方价格表(2026-10-18)。
  • 自动派生 Fast 模型优先使用已登记的独立 Fast 价格;保留 provider 覆盖、未知价格及路由组原有策略。

0.1.7

  • 根据模型声明的 Fast 能力自动派生 -fast 模型,使用原模型 ID 加 service_tier: "priority" 路由,并保留思考档位。
  • 兼容旧网关未透出的本地插件 Fast 元数据;已有同名模型优先,目录刷新同步增删。
  • 内置费率不变;派生 Fast 模型沿用原模型参考价,尚未接入独立 Fast 费率。

0.1.6

  • 无报价路由组保持可选并保留原名;OpenCode 对这些请求的费用估算仍为 0,不代表实际免费,实际费用请查看 Magpie 或服务账单。
  • macOS 找到 Magpie app 时优先启动带窗口的网关,解析安装器软链;仅在 app 异常退出时降级到 serve,避免慢启动或交接现有 app 时被无窗口进程抢占端口。
  • 内置费率不变,尚未接入按请求实际路由成员计费。

0.1.5

新增 models.dev 缓存作为缺价兜底,不改动内置费率和 provider 覆盖。补充的价格来自 models.dev,对应目录更新后可能变化;以实际服务账单为准。

Cursor 使用 cursor 覆盖,WorkBuddy 使用 codebuddy 覆盖;其他已识别服务按表中对应 provider 处理。Routing group 只用 Magpie 提供的价格,不按成员猜测。明确记录的零价格仍视为有效价格。

所有价格单位都是 美元 / 百万 token。OpenCode 用这些单价计算请求费用。普通计费的概念公式为:

费用 = (非缓存输入 × input + (可见输出 + 推理) × output
      + 缓存读取 × cache.read + 缓存写入 × cache.write) / 1,000,000

缓存部分不能再次算入非缓存输入。不同协议的 token 字段由宿主 runtime 归一化;插件不重写 token 来凑费用。继承的价格记录缺少缓存单价时,当前映射将该项设为 0。

准确性边界

  • 表中同时存在官方参考价、服务专属估算价和版本回退,不是所有模型的实时账单价。
  • Magpie 用户自定义价格不会覆盖已命中的内置价格表。
  • Routing group 可能动态切换成员,目录价格不保证等于实际被选成员的价格。
  • Cursor 等服务的 usage.magpie_deferred 是迟到用量,Magpie 会补记到账本;OpenCode 原生 runtime 不会因此修改历史费用。
  • 当前价格映射仍不支持 Magpie 独立的一小时缓存写入价。

因此,OpenCode 费用适合观察 token 成本,不能承诺与 Magpie 或订阅服务最终账单完全一致。

查看或复用价格表

包提供公开的 pricing 子路径:

import { getModelPricing, resolveModelPricingKey } from 'opencode-magpie-plugin/pricing';

console.log(resolveModelPricingKey('claude-opus-4-6'));
console.log(getModelPricing('claude-opus-4-6', 'cursor'));

getModelPricing() 对未知模型返回 undefined,不会自动填零;调用方获得的是副本,不会修改全局价格表。

本地开发 / file 模式

git clone https://github.com/yee94/opencode-magpie-plugin.git
cd opencode-magpie-plugin
corepack enable
pnpm install
pnpm check

把配置中的 npm 包替换为构建目录的 URL:

{
  "plugins": ["file:///absolute/path/opencode-magpie-plugin/dist"]
}

必须指向 dist 目录,不是 dist/index.mjs 文件,也不是仓库根目录。 V2 本地目录加载器寻找目录内的 server / index 入口;直接填写文件路径会被忽略并记录 configured plugin path must be a directory。

修改源码后重新执行 pnpm build,再重新加载 OpenCode 服务。

排查

| 现象 | 检查项 | | --- | --- | | /plugins 没有 magpie.providers | 全局配置是否被当前服务读取;file 模式是否填写 dist 目录并已构建;查看 OpenCode 日志 | | 提示未安装 Magpie | 安装 Magpie,确认服务进程 PATH 可以找到它 | | 启动超时 | 手动执行 magpie serve 查看错误,检查监听端口 | | 插件已加载但没有模型 | 在 Magpie 登录并启用服务,检查 /v1/models 是否有模型;缺价不再隐藏模型 | | 添加模型后没出现 | 等待下一个 30 秒刷新周期;初次初始化失败则重载 OpenCode | | 改了 options 但分组没变 | 重启 OpenCode 服务;reload 不一定重新执行 setup | | profile 报 Model unavailable | id 是否和 groups 一致(去前缀后的 id);该组是否已在 Magpie 里删掉 | | 原有 Cursor 与新 Cursor 同时出现 | 两个插件可同时存在;Magpie 的内部 ID 是 magpie-cursor | | 费用和实际账单不同 | 查看上面的价格优先级、迟到用量和阶梯价格边界 |

本机目录检查(不会调用模型):

curl http://127.0.0.1:3425/
curl -H 'Authorization: Bearer magpie' -H 'X-Magpie-Prices: 1' \
  http://127.0.0.1:3425/v1/models

这里的 magpie 是本机网关占位 key,不是上游账号 token。

测试与发布

pnpm check
pnpm pack

维护者发布采用 tag 驱动:推送与 package.json.version 一致的 v<version> tag 后,GitHub Actions 自动检查、发布公网 npm 并创建 GitHub Release。正式版使用 latest,预发布版使用 next。完整步骤、认证要求与失败恢复见 发布指南。

测试覆盖目录分组与替换、options 呈现(分桶、排序、非法配置)、wire model ID、协议元数据、价格归一化与覆盖、未知价格、会话头、网关身份检查、自动启动与并发去重、未安装提示、刷新失败和清理。测试不消耗真实服务额度。

只发布 dist、README 和许可证,没有 runtime dependencies。价格表变更时应更新相应测试,并在 release 说明价格来源与变化。

相关项目与许可证

这是独立集成项目,不是 Magpie 或 OpenCode 官方插件。插件代码采用 MIT;Magpie 与各上游服务遵循各自的许可证和服务条款。