@vymalo/opencode-models-info 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -2
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -1
- package/dist/mapping.d.ts +7 -0
- package/dist/mapping.js +13 -0
- package/dist/mapping.js.map +1 -1
- package/dist/opencode.js +19 -6
- package/dist/opencode.js.map +1 -1
- package/dist/plugin.d.ts +16 -0
- package/dist/plugin.js +125 -28
- package/dist/plugin.js.map +1 -1
- package/dist/scheduler.d.ts +23 -0
- package/dist/scheduler.js +61 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/types.d.ts +20 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -53,10 +53,11 @@ An absolute URL is clearest. A relative path is also accepted — it resolves ag
|
|
|
53
53
|
That's it. After OpenCode starts:
|
|
54
54
|
|
|
55
55
|
1. The hook picks up every provider with a `meta.modelsInfoUrl`.
|
|
56
|
-
2. It `GET`s that URL
|
|
56
|
+
2. It `GET`s that URL, sending whatever `options.headers` the provider already has (so it composes with any auth plugin — see [Auth composition](#auth-composition)).
|
|
57
57
|
3. Each model entry whose `id` matches an entry in the response gets `limit`, `cost`, `modalities`, `tool_call`, `reasoning`, `attachment`, etc. filled in — **only where they were not already set** (upstream wins).
|
|
58
58
|
4. The response is cached on disk for `modelsInfoTtlSeconds` (default 24h), keyed by `(providerId, url, modelsInfoHeaders)`. ETags are honored.
|
|
59
59
|
5. On fetch error with a valid cache, the stale snapshot is served — the plugin never blocks OpenCode startup on a network failure.
|
|
60
|
+
6. A background scheduler then keeps re-checking the endpoint on that same `modelsInfoTtlSeconds` cadence for as long as the process runs — see [Periodic refresh](#periodic-refresh).
|
|
60
61
|
|
|
61
62
|
### URL resolution
|
|
62
63
|
|
|
@@ -70,15 +71,25 @@ That's it. After OpenCode starts:
|
|
|
70
71
|
|
|
71
72
|
Two practical rules: drop the leading `/` to keep the metadata path under your inference API path; keep the leading `/` to escape to a different path under the same host.
|
|
72
73
|
|
|
74
|
+
### Periodic refresh
|
|
75
|
+
|
|
76
|
+
`config` — the only hook this plugin uses — runs once when OpenCode boots the plugin, and only re-runs on certain config edits (not on a timer). For a short-lived CLI invocation that's the whole story; but for a long-lived process (a desktop app window, or an embedded server that stays up for days), that hook would otherwise only ever see the catalog as it looked at boot.
|
|
77
|
+
|
|
78
|
+
To close that gap, every opted-in provider also gets a background scheduler that keeps re-fetching `modelsInfoUrl` — unconditionally (still cheap, via a conditional `ETag` request) — on the **same `meta.modelsInfoTtlSeconds` cadence that already governs cache freshness**. There's no separate interval to configure: set `modelsInfoTtlSeconds` once and it controls both "how stale can the cache be" and "how often do we go check." Default is once a day (`86400`).
|
|
79
|
+
|
|
80
|
+
This warms the cache for the **next** `config` run (the next launch, the next window, or the next config-triggered rebuild) — it can't push an update into an already-open session, since a `config` hook has no way to hot-patch a running one; there's simply no live channel for that in OpenCode's plugin API today. A failed check backs off (capped at the configured interval) instead of hammering a down endpoint, and resumes the normal cadence once a check succeeds. The scheduler is stopped and restarted whenever `config` reruns (so a rebuilt config never leaks a duplicate timer), and stopped for good on `dispose`.
|
|
81
|
+
|
|
73
82
|
### Options
|
|
74
83
|
|
|
75
84
|
| Option | Default | Notes |
|
|
76
85
|
| ------------------------------- | ------------------ | --------------------------------------------------------------------- |
|
|
77
86
|
| `meta.modelsInfoUrl` | _(required)_ | Absolute URL or path resolved against `options.baseURL` (see above). |
|
|
78
|
-
| `meta.modelsInfoTtlSeconds` | `86400` (24h) | Cache TTL.
|
|
87
|
+
| `meta.modelsInfoTtlSeconds` | `86400` (24h) | Cache TTL — also the background refresh interval, see [Periodic refresh](#periodic-refresh). |
|
|
79
88
|
| `meta.modelsInfoTimeoutMs` | `5000` | Per-fetch HTTP timeout. |
|
|
80
89
|
| `meta.modelsInfoHeaders` | _(none)_ | Extra request headers. Override `options.headers` on conflict. Included in the cache key, so a tenant switch busts the cache. |
|
|
81
90
|
| `meta.modelsInfoOverwrite` | _(none)_ | Array of field names (`name`, `attachment`, `reasoning`, `temperature`, `tool_call`, `cost`, `limit`, `modalities`) that the endpoint is allowed to overwrite even when already set. Opts those fields out of upstream-wins — see [Forcing endpoint values to win](#forcing-endpoint-values-to-win). Unknown names are ignored. |
|
|
91
|
+
| `meta.modelsInfoHideTextOnly` | `false` | When `true`, makes the `modelsInfoUrl` catalog authoritative for which models are shown: drops a model from `provider.models` entirely if the catalog reports it as text-in/text-out only, **or** if the catalog doesn't mention it at all — see [Hiding text-only models](#hiding-text-only-models). |
|
|
92
|
+
| `meta.modelsInfoHideInternal` | `false` | When `true`, drops a model from `provider.models` if the catalog reports a non-standard `internal: true` field for it. Independent of `modelsInfoHideTextOnly` — modality and internal/restricted status are unrelated signals — see [Hiding internal models](#hiding-internal-models). |
|
|
82
93
|
|
|
83
94
|
### Auth composition
|
|
84
95
|
|
|
@@ -139,6 +150,59 @@ Listed fields still only change when the endpoint actually provides a value (a m
|
|
|
139
150
|
|
|
140
151
|
> **Forcing a capability flag *off*.** The boolean flags (`tool_call`, `reasoning`, `temperature`, `attachment`) are normally emitted *true-only*. Listing one in `modelsInfoOverwrite` also lets the endpoint assert `false` (to clear a stale `true`) — but only when the endpoint actually reports the underlying data (`supported_parameters`, or `architecture.input_modalities` for `attachment`). If that data is absent the plugin can't tell true from false, so it leaves the field alone rather than inventing a `false`.
|
|
141
152
|
|
|
153
|
+
### Hiding text-only models
|
|
154
|
+
|
|
155
|
+
Some catalogs mix chat-only models in with multimodal ones, and you may only want to offer the multimodal set (vision, audio, etc.) in OpenCode's model picker. Set `meta.modelsInfoHideTextOnly: true` to make the **`modelsInfoUrl` catalog authoritative for which models exist**, not just their metadata:
|
|
156
|
+
|
|
157
|
+
```jsonc
|
|
158
|
+
{
|
|
159
|
+
"options": {
|
|
160
|
+
"meta": {
|
|
161
|
+
"modelsInfoUrl": "models/info",
|
|
162
|
+
"modelsInfoHideTextOnly": true
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
With the flag on, a model's entry is **deleted** from `provider.models` outright in either of two cases:
|
|
169
|
+
|
|
170
|
+
1. **The catalog reports it as text-only** — `architecture.input_modalities` / `.output_modalities` are both present and resolve to exactly `["text"]`.
|
|
171
|
+
2. **The catalog doesn't mention it at all** — no entry in the `modelsInfoUrl` response matches the model's `id` (or declared `id`). This is what makes the catalog take total precedence over whatever populated `provider.models` first (a static `opencode.json`, or `@vymalo/opencode-oauth2`'s own `/v1/models` discovery) — anything the richer catalog doesn't vouch for is dropped, not just left un-enriched.
|
|
172
|
+
|
|
173
|
+
This is a hard delete, not a flag — a hidden model can't be selected at all, the same as if it had never been listed in `models` to begin with. It never *adds* a model the catalog knows about but discovery/config didn't already list — only membership already present in `provider.models` can be pruned. Case 1 only fires when the endpoint's modality data is actually present; a model the plugin can't classify (missing `architecture`) but that *is* matched in the catalog is left alone rather than hidden on a guess. Case 2 fires purely on absence from the catalog, independent of modality data. Both cases log at debug (`models_info_model_hidden_text_only`, `models_info_model_hidden_unmatched`) and are reflected in the `hiddenCount` on the summary `models_info_enriched` event.
|
|
174
|
+
|
|
175
|
+
> **Composes with `modelsInfoOverwrite`.** Turning on `modelsInfoHideTextOnly` doesn't change how surviving models are merged — upstream-wins (or your `modelsInfoOverwrite` list) still governs individual fields. It only changes which model entries survive to be merged at all.
|
|
176
|
+
|
|
177
|
+
### Hiding internal models
|
|
178
|
+
|
|
179
|
+
If your catalog serves both externally-usable and internal-only/restricted models — models that exist on the backend but shouldn't be selectable in OpenCode — flag them explicitly and set `meta.modelsInfoHideInternal: true`:
|
|
180
|
+
|
|
181
|
+
```jsonc
|
|
182
|
+
{
|
|
183
|
+
"options": {
|
|
184
|
+
"meta": {
|
|
185
|
+
"modelsInfoUrl": "models/info",
|
|
186
|
+
"modelsInfoHideInternal": true
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Your catalog entry adds a non-standard `internal: true` field:
|
|
193
|
+
|
|
194
|
+
```json
|
|
195
|
+
{ "id": "internal-only-model", "internal": true, "architecture": { "input_modalities": ["text", "image"], "output_modalities": ["text"] } }
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Don't reach for `modelsInfoHideTextOnly` to hide internal models** — it was tempting because a catalog's internal models are *sometimes* also text-only, but that's a coincidence of your catalog, not a rule: it hides a matched model based on **modality**, so a legitimate text-only *external* model gets hidden right along with your internal ones, and a multimodal internal model sails through unhidden. `modelsInfoHideInternal` reacts only to the `internal` field — set it independently:
|
|
199
|
+
|
|
200
|
+
- `internal: true` + `modelsInfoHideInternal: true` → hidden, regardless of modality.
|
|
201
|
+
- `internal` absent or `false` → never hidden by this flag, regardless of modality.
|
|
202
|
+
- Unknown (`internal` field absent from the catalog entry) is left alone, not treated as `false` — same "known before we assert" rule as everywhere else in this plugin.
|
|
203
|
+
|
|
204
|
+
The two flags compose freely; set whichever your catalog's semantics call for, or both. Note that `modelsInfoHideInternal` does **not** extend case 2 above (dropping a model your catalog has no entry for at all) — that stays governed solely by `modelsInfoHideTextOnly`, since an unmatched model's status is unknown, not "internal." Logs at debug (`models_info_model_hidden_internal`).
|
|
205
|
+
|
|
142
206
|
### Expected response shape (OpenRouter)
|
|
143
207
|
|
|
144
208
|
```json
|
package/dist/config.js
CHANGED
|
@@ -56,6 +56,9 @@ function asPositiveInt(value, fallback) {
|
|
|
56
56
|
}
|
|
57
57
|
return fallback;
|
|
58
58
|
}
|
|
59
|
+
function asBoolean(value) {
|
|
60
|
+
return value === true;
|
|
61
|
+
}
|
|
59
62
|
/**
|
|
60
63
|
* Parse a provider's `options.meta` for opt-in model-info fields. Returns
|
|
61
64
|
* `null` if the provider has not opted in (no `meta.modelsInfoUrl`).
|
|
@@ -99,6 +102,8 @@ export function parseMetaOptions(providerOptions) {
|
|
|
99
102
|
modelsInfoTimeoutMs: asPositiveInt(meta.modelsInfoTimeoutMs, DEFAULT_TIMEOUT_MS),
|
|
100
103
|
modelsInfoHeaders: asStringMap(meta.modelsInfoHeaders),
|
|
101
104
|
modelsInfoOverwrite: asOverwriteList(meta.modelsInfoOverwrite),
|
|
105
|
+
modelsInfoHideTextOnly: asBoolean(meta.modelsInfoHideTextOnly),
|
|
106
|
+
modelsInfoHideInternal: asBoolean(meta.modelsInfoHideInternal),
|
|
102
107
|
modelsInfoFormat: "openrouter"
|
|
103
108
|
};
|
|
104
109
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/mapping.d.ts
CHANGED
|
@@ -27,6 +27,13 @@ export interface ModelMetadata {
|
|
|
27
27
|
* fields we can derive; callers do the upstream-wins merge.
|
|
28
28
|
*/
|
|
29
29
|
export declare function mapOpenRouterEntry(entry: OpenRouterModel, overwrite?: ReadonlySet<string>): ModelMetadata;
|
|
30
|
+
/**
|
|
31
|
+
* A model is "text-only" when the source reported modalities and both input
|
|
32
|
+
* and output are exactly `["text"]` — no vision/audio/video/pdf on either
|
|
33
|
+
* side. Undefined `modalities` means the source never told us, so we can't
|
|
34
|
+
* claim text-only (consistent with the true-only / "known" pattern above).
|
|
35
|
+
*/
|
|
36
|
+
export declare function isTextOnlyModality(modalities: ModelMetadata["modalities"]): boolean;
|
|
30
37
|
/**
|
|
31
38
|
* Merge a derived metadata snapshot onto an existing OpenCode model entry.
|
|
32
39
|
* Upstream wins by default: any field already present is left untouched.
|
package/dist/mapping.js
CHANGED
|
@@ -100,6 +100,19 @@ function roundTo(value, decimals) {
|
|
|
100
100
|
const factor = 10 ** decimals;
|
|
101
101
|
return Math.round(value * factor) / factor;
|
|
102
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* A model is "text-only" when the source reported modalities and both input
|
|
105
|
+
* and output are exactly `["text"]` — no vision/audio/video/pdf on either
|
|
106
|
+
* side. Undefined `modalities` means the source never told us, so we can't
|
|
107
|
+
* claim text-only (consistent with the true-only / "known" pattern above).
|
|
108
|
+
*/
|
|
109
|
+
export function isTextOnlyModality(modalities) {
|
|
110
|
+
if (!modalities) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
const isTextOnlyList = (mods) => mods.length === 1 && mods[0] === "text";
|
|
114
|
+
return isTextOnlyList(modalities.input) && isTextOnlyList(modalities.output);
|
|
115
|
+
}
|
|
103
116
|
function filterModalities(values) {
|
|
104
117
|
if (!values) {
|
|
105
118
|
return [];
|
package/dist/mapping.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC,CAAC;AAyBzF;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAsB,EACtB,SAA+B;IAE/B,MAAM,GAAG,GAAkB,EAAE,CAAC;IAE9B,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,EAAE,cAAc,IAAI,KAAK,CAAC,cAAc,CAAC;IAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,EAAE,qBAAqB,CAAC;IACzD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC9D,GAAG,CAAC,KAAK,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;SAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,4EAA4E;IAC9E,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,IAAI,EAAE,CAAC;QACT,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAC3E,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC7D,2EAA2E;IAC3E,4EAA4E;IAC5E,4CAA4C;IAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAE3E,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;QACpF,KAAK,EAAE,WAAW;QAClB,SAAS;KACV,CAAC,CAAC;IACH,aAAa,CACX,GAAG,EACH,WAAW,EACX,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EACzF,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,CAClC,CAAC;IACF,aAAa,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;QAC7D,KAAK,EAAE,WAAW;QAClB,SAAS;KACV,CAAC,CAAC;IACH,aAAa,CACX,GAAG,EACH,YAAY,EACZ,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,EACnC;QACE,KAAK,EAAE,cAAc;QACrB,SAAS;KACV,CACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,aAAa,CACpB,GAAkB,EAClB,KAA+D,EAC/D,OAAgB,EAChB,IAAyD;IAEzD,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACpB,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,OAAmC;IACrD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAuC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACnE,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IACD,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qFAAqF;AACrF,SAAS,UAAU,CAAC,GAAuB;IACzC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,OAAO,CAAC,KAAa,EAAE,QAAgB;IAC9C,MAAM,MAAM,GAAG,EAAE,IAAI,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;AAC7C,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAwC;IAChE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IACE,mBAAmB,CAAC,GAAG,CAAC,KAAyB,CAAC;YAClD,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAyB,CAAC,EACxC,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,KAAyB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAW,EACX,OAAsB,EACtB,SAA+B;IAE/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,QAAoC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"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"}
|
package/dist/opencode.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FileCacheStore } from "./cache.js";
|
|
2
2
|
import { createJsonConsoleLogger, DEFAULT_LOG_LEVEL, fromOpenCodeLogLevel, LOG_LEVEL_PRIORITY } from "./logging.js";
|
|
3
|
-
import { enrichConfig } from "./plugin.js";
|
|
3
|
+
import { enrichConfig, startCacheRefreshSchedulers } from "./plugin.js";
|
|
4
4
|
const PLUGIN_SERVICE_NAME = "opencode-models-info-plugin";
|
|
5
5
|
/**
|
|
6
6
|
* Pipe plugin logs through OpenCode's `client.app.log` so they show up in the
|
|
@@ -51,14 +51,27 @@ export function createOpencodeModelsInfoPlugin(factoryOptions = {}) {
|
|
|
51
51
|
let currentLogLevel = DEFAULT_LOG_LEVEL;
|
|
52
52
|
const logger = factoryOptions.logger ?? createOpenCodeLogger(client, () => currentLogLevel);
|
|
53
53
|
const cache = factoryOptions.cache ?? new FileCacheStore(factoryOptions.cacheDir);
|
|
54
|
+
let schedulers = [];
|
|
55
|
+
const stopSchedulers = () => {
|
|
56
|
+
for (const handle of schedulers) {
|
|
57
|
+
handle.stop();
|
|
58
|
+
}
|
|
59
|
+
schedulers = [];
|
|
60
|
+
};
|
|
54
61
|
return {
|
|
55
62
|
config: async (config) => {
|
|
56
63
|
currentLogLevel = fromOpenCodeLogLevel(config.logLevel) ?? DEFAULT_LOG_LEVEL;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
64
|
+
const deps = { cache, logger, fetchImpl: factoryOptions.fetchImpl };
|
|
65
|
+
await enrichConfig(config, deps);
|
|
66
|
+
// OpenCode re-runs `config` on certain config edits — stop the
|
|
67
|
+
// schedulers from any prior run before starting fresh ones so a
|
|
68
|
+
// rebuilt config never leaks a duplicate background timer per
|
|
69
|
+
// provider.
|
|
70
|
+
stopSchedulers();
|
|
71
|
+
schedulers = startCacheRefreshSchedulers(config, deps);
|
|
72
|
+
},
|
|
73
|
+
dispose: async () => {
|
|
74
|
+
stopSchedulers();
|
|
62
75
|
}
|
|
63
76
|
};
|
|
64
77
|
};
|
package/dist/opencode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../src/opencode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EAEpB,kBAAkB,EAGnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAA0B,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../src/opencode.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type CacheStore, FileCacheStore } from "./cache.js";
|
|
2
2
|
import type { Logger } from "./logging.js";
|
|
3
|
+
import { type SchedulerHandle } from "./scheduler.js";
|
|
3
4
|
export type ProviderOptions = Record<string, unknown> | undefined;
|
|
4
5
|
export interface ProviderConfigLike {
|
|
5
6
|
options?: Record<string, unknown>;
|
|
@@ -21,4 +22,19 @@ export interface EnrichDeps {
|
|
|
21
22
|
* failure never blocks others.
|
|
22
23
|
*/
|
|
23
24
|
export declare function enrichConfig(input: EnrichConfigInput, deps: EnrichDeps): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Start one background refresh scheduler per opted-in provider, keeping the
|
|
27
|
+
* on-disk cache warm at `meta.modelsInfoTtlSeconds` cadence (the same knob
|
|
28
|
+
* that already governs cache freshness — no separate interval to configure).
|
|
29
|
+
*
|
|
30
|
+
* `config` only runs at plugin load and on rare config-signature changes
|
|
31
|
+
* (see docs/models-info.md#periodic-refresh), so a long-lived OpenCode
|
|
32
|
+
* process would otherwise keep serving whatever the catalog looked like at
|
|
33
|
+
* boot until it happens to restart. This closes that gap for the *next*
|
|
34
|
+
* `config` run — it cannot push a live update into an already-open session,
|
|
35
|
+
* since a config hook has no way to hot-patch a running one. Callers own the
|
|
36
|
+
* returned handles' lifecycle: stop them when the config that produced them
|
|
37
|
+
* is superseded (a rebuilt `config` hook) or the plugin is disposed.
|
|
38
|
+
*/
|
|
39
|
+
export declare function startCacheRefreshSchedulers(input: EnrichConfigInput, deps: EnrichDeps): SchedulerHandle[];
|
|
24
40
|
export { FileCacheStore };
|
package/dist/plugin.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { cacheKey, FileCacheStore, isExpired } from "./cache.js";
|
|
2
2
|
import { parseMetaOptions } from "./config.js";
|
|
3
3
|
import { fetchOpenRouterModels } from "./fetcher.js";
|
|
4
|
-
import { mapOpenRouterEntry, mergeIntoModel } from "./mapping.js";
|
|
4
|
+
import { isTextOnlyModality, mapOpenRouterEntry, mergeIntoModel } from "./mapping.js";
|
|
5
|
+
import { startScheduler } from "./scheduler.js";
|
|
5
6
|
/**
|
|
6
7
|
* Walk every provider in the assembled OpenCode config, fetch its
|
|
7
8
|
* `meta.modelsInfoUrl` (if any) — honoring the cache — and merge derived
|
|
@@ -19,6 +20,43 @@ export async function enrichConfig(input, deps) {
|
|
|
19
20
|
});
|
|
20
21
|
await Promise.allSettled(Object.entries(providers).map(([providerId, providerConfig]) => enrichProvider(providerId, providerConfig, deps)));
|
|
21
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Start one background refresh scheduler per opted-in provider, keeping the
|
|
25
|
+
* on-disk cache warm at `meta.modelsInfoTtlSeconds` cadence (the same knob
|
|
26
|
+
* that already governs cache freshness — no separate interval to configure).
|
|
27
|
+
*
|
|
28
|
+
* `config` only runs at plugin load and on rare config-signature changes
|
|
29
|
+
* (see docs/models-info.md#periodic-refresh), so a long-lived OpenCode
|
|
30
|
+
* process would otherwise keep serving whatever the catalog looked like at
|
|
31
|
+
* boot until it happens to restart. This closes that gap for the *next*
|
|
32
|
+
* `config` run — it cannot push a live update into an already-open session,
|
|
33
|
+
* since a config hook has no way to hot-patch a running one. Callers own the
|
|
34
|
+
* returned handles' lifecycle: stop them when the config that produced them
|
|
35
|
+
* is superseded (a rebuilt `config` hook) or the plugin is disposed.
|
|
36
|
+
*/
|
|
37
|
+
export function startCacheRefreshSchedulers(input, deps) {
|
|
38
|
+
const providers = input.provider;
|
|
39
|
+
if (!providers) {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
const handles = [];
|
|
43
|
+
for (const [providerId, providerConfig] of Object.entries(providers)) {
|
|
44
|
+
const opts = parseMetaOptions(providerConfig?.options);
|
|
45
|
+
if (!opts) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const providerHeaders = asHeaderMap(providerConfig?.options?.headers);
|
|
49
|
+
const intervalMs = opts.modelsInfoTtlSeconds * 1000;
|
|
50
|
+
deps.logger.trace("models_info_refresh_scheduler_started", { providerId, intervalMs });
|
|
51
|
+
handles.push(startScheduler({
|
|
52
|
+
intervalMs,
|
|
53
|
+
logger: deps.logger,
|
|
54
|
+
taskName: `models-info-refresh:${providerId}`,
|
|
55
|
+
run: () => refreshProviderCache(providerId, opts, providerHeaders, deps)
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
return handles;
|
|
59
|
+
}
|
|
22
60
|
async function enrichProvider(providerId, providerConfig, deps) {
|
|
23
61
|
try {
|
|
24
62
|
if (!providerConfig) {
|
|
@@ -66,43 +104,27 @@ async function enrichProvider(providerId, providerConfig, deps) {
|
|
|
66
104
|
sourceModels: record.models.length,
|
|
67
105
|
overwriteFields: overwrite ? [...overwrite] : []
|
|
68
106
|
});
|
|
69
|
-
|
|
107
|
+
const totalModels = Object.keys(models).length;
|
|
108
|
+
const tally = { enriched: 0, hidden: 0 };
|
|
109
|
+
const reconcileCtx = { providerId, models, byId, opts, overwrite, deps };
|
|
70
110
|
for (const [modelId, modelConfig] of Object.entries(models)) {
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if (!match) {
|
|
75
|
-
deps.logger.trace("models_info_model_unmatched", { providerId, modelId, declaredId });
|
|
76
|
-
continue;
|
|
111
|
+
const outcome = reconcileModel(modelId, modelConfig, reconcileCtx);
|
|
112
|
+
if (outcome !== "skipped") {
|
|
113
|
+
tally[outcome] += 1;
|
|
77
114
|
}
|
|
78
|
-
deps.logger.trace("models_info_model_matched", {
|
|
79
|
-
providerId,
|
|
80
|
-
modelId,
|
|
81
|
-
matchedBy: matchById ? "id" : "declaredId"
|
|
82
|
-
});
|
|
83
|
-
const derived = mapOpenRouterEntry(match, overwrite);
|
|
84
|
-
const derivedFields = Object.keys(derived);
|
|
85
|
-
const appliedFields = derivedFields.filter((f) => modelConfig[f] === undefined || overwrite?.has(f));
|
|
86
|
-
const skippedFields = derivedFields.filter((f) => !appliedFields.includes(f));
|
|
87
|
-
deps.logger.trace("models_info_model_merge", {
|
|
88
|
-
providerId,
|
|
89
|
-
modelId,
|
|
90
|
-
derivedFields,
|
|
91
|
-
appliedFields,
|
|
92
|
-
skippedFields
|
|
93
|
-
});
|
|
94
|
-
mergeIntoModel(modelConfig, derived, overwrite);
|
|
95
|
-
enrichedCount += 1;
|
|
96
115
|
}
|
|
116
|
+
const { enriched: enrichedCount, hidden: hiddenCount } = tally;
|
|
97
117
|
deps.logger.trace("models_info_provider_done", {
|
|
98
118
|
providerId,
|
|
99
119
|
enrichedCount,
|
|
100
|
-
|
|
120
|
+
hiddenCount,
|
|
121
|
+
totalModels
|
|
101
122
|
});
|
|
102
123
|
deps.logger.debug("models_info_enriched", {
|
|
103
124
|
providerId,
|
|
104
125
|
enrichedCount,
|
|
105
|
-
|
|
126
|
+
hiddenCount,
|
|
127
|
+
totalModels,
|
|
106
128
|
sourceModels: record.models.length
|
|
107
129
|
});
|
|
108
130
|
}
|
|
@@ -115,6 +137,63 @@ async function enrichProvider(providerId, providerConfig, deps) {
|
|
|
115
137
|
});
|
|
116
138
|
}
|
|
117
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Decide one model's fate against the catalog and apply it in place —
|
|
142
|
+
* merge, delete, or leave untouched — returning what happened for the
|
|
143
|
+
* caller's tally. `modelsInfoHideTextOnly` governs both deletion paths: a
|
|
144
|
+
* model absent from the catalog entirely, and a matched model the catalog
|
|
145
|
+
* reports as text-in/text-out only. `modelsInfoHideInternal` is a separate,
|
|
146
|
+
* independent deletion path for a matched model the catalog flags
|
|
147
|
+
* `internal: true` — modality and internal/restricted status are unrelated
|
|
148
|
+
* signals, and conflating them (routing "hide internal" through
|
|
149
|
+
* `modelsInfoHideTextOnly`) hides legitimate text-only external models. It
|
|
150
|
+
* does NOT extend the unmatched-model path — an unmatched model's status is
|
|
151
|
+
* unknown, not "internal", so that stays governed solely by
|
|
152
|
+
* `modelsInfoHideTextOnly`.
|
|
153
|
+
*/
|
|
154
|
+
function reconcileModel(modelId, modelConfig, ctx) {
|
|
155
|
+
const { providerId, models, byId, opts, overwrite, deps } = ctx;
|
|
156
|
+
const declaredId = typeof modelConfig.id === "string" ? modelConfig.id : undefined;
|
|
157
|
+
const matchById = byId.has(modelId);
|
|
158
|
+
const match = byId.get(modelId) ?? (declaredId ? byId.get(declaredId) : undefined);
|
|
159
|
+
if (!match) {
|
|
160
|
+
if (!opts.modelsInfoHideTextOnly) {
|
|
161
|
+
deps.logger.trace("models_info_model_unmatched", { providerId, modelId, declaredId });
|
|
162
|
+
return "skipped";
|
|
163
|
+
}
|
|
164
|
+
delete models[modelId];
|
|
165
|
+
deps.logger.debug("models_info_model_hidden_unmatched", { providerId, modelId, declaredId });
|
|
166
|
+
return "hidden";
|
|
167
|
+
}
|
|
168
|
+
deps.logger.trace("models_info_model_matched", {
|
|
169
|
+
providerId,
|
|
170
|
+
modelId,
|
|
171
|
+
matchedBy: matchById ? "id" : "declaredId"
|
|
172
|
+
});
|
|
173
|
+
if (opts.modelsInfoHideInternal && match.internal === true) {
|
|
174
|
+
delete models[modelId];
|
|
175
|
+
deps.logger.debug("models_info_model_hidden_internal", { providerId, modelId });
|
|
176
|
+
return "hidden";
|
|
177
|
+
}
|
|
178
|
+
const derived = mapOpenRouterEntry(match, overwrite);
|
|
179
|
+
if (opts.modelsInfoHideTextOnly && isTextOnlyModality(derived.modalities)) {
|
|
180
|
+
delete models[modelId];
|
|
181
|
+
deps.logger.debug("models_info_model_hidden_text_only", { providerId, modelId });
|
|
182
|
+
return "hidden";
|
|
183
|
+
}
|
|
184
|
+
const derivedFields = Object.keys(derived);
|
|
185
|
+
const appliedFields = derivedFields.filter((f) => modelConfig[f] === undefined || overwrite?.has(f));
|
|
186
|
+
const skippedFields = derivedFields.filter((f) => !appliedFields.includes(f));
|
|
187
|
+
deps.logger.trace("models_info_model_merge", {
|
|
188
|
+
providerId,
|
|
189
|
+
modelId,
|
|
190
|
+
derivedFields,
|
|
191
|
+
appliedFields,
|
|
192
|
+
skippedFields
|
|
193
|
+
});
|
|
194
|
+
mergeIntoModel(modelConfig, derived, overwrite);
|
|
195
|
+
return "enriched";
|
|
196
|
+
}
|
|
118
197
|
async function loadRecord(providerId, opts, providerHeaders, deps) {
|
|
119
198
|
// Cache key is keyed on the user-specified `modelsInfoHeaders` (NOT the
|
|
120
199
|
// provider's rotating auth header) — so switching tenants busts the cache,
|
|
@@ -136,6 +215,24 @@ async function loadRecord(providerId, opts, providerHeaders, deps) {
|
|
|
136
215
|
});
|
|
137
216
|
return cached;
|
|
138
217
|
}
|
|
218
|
+
return fetchAndCache(providerId, opts, providerHeaders, deps, key, cached, now);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Unconditionally revalidates a provider's catalog against the network
|
|
222
|
+
* (still honoring the `ETag`, so an unchanged catalog is a cheap `304`) and
|
|
223
|
+
* writes the result back to the cache — regardless of whether the current
|
|
224
|
+
* entry is still within its TTL. This is the periodic-refresh path (see
|
|
225
|
+
* {@link startCacheRefreshSchedulers}): `loadRecord`'s TTL fast-path exists
|
|
226
|
+
* to avoid a network call from the `config` hook on every launch, but a
|
|
227
|
+
* background scheduler's entire point is to go check anyway.
|
|
228
|
+
*/
|
|
229
|
+
async function refreshProviderCache(providerId, opts, providerHeaders, deps) {
|
|
230
|
+
const key = cacheKey(providerId, opts.modelsInfoUrl, opts.modelsInfoHeaders);
|
|
231
|
+
const now = deps.now ? deps.now() : Date.now();
|
|
232
|
+
const cached = await deps.cache.get(key);
|
|
233
|
+
await fetchAndCache(providerId, opts, providerHeaders, deps, key, cached, now);
|
|
234
|
+
}
|
|
235
|
+
async function fetchAndCache(providerId, opts, providerHeaders, deps, key, cached, now) {
|
|
139
236
|
const headers = buildFetchHeaders(opts, providerHeaders);
|
|
140
237
|
deps.logger.trace("models_info_fetch_start", {
|
|
141
238
|
providerId,
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAmB,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAqBlE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAwB,EAAE,IAAgB;IAC3E,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC;IACjC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;QAC5C,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM;KAC7C,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,UAAU,CACtB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,EAAE,CAC7D,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,CAAC,CACjD,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,UAAkB,EAClB,cAA8C,EAC9C,IAAgB;IAEhB,IAAI,CAAC;QACH,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE;YACpD,UAAU;YACV,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC;SAChC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE;YACvD,UAAU;YACV,SAAS,EAAE,UAAU,GAAG,CAAC;YACzB,UAAU;SACX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QAED,uEAAuE;QACvE,qEAAqE;QACrE,qEAAqE;QACrE,0EAA0E;QAC1E,MAAM,eAAe,GAAG,WAAW,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE;YACzD,UAAU;YACV,kBAAkB,EAAE,OAAO,CAAC,eAAe,CAAC;YAC5C,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC;SAChD,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,GAAG,CAA0B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;YACjD,UAAU;YACV,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YAClC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;SACjD,CAAC,CAAC;QAEH,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5D,MAAM,UAAU,GAAG,OAAO,WAAW,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACnF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACnF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;gBACtF,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;gBAC7C,UAAU;gBACV,OAAO;gBACP,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY;aAC3C,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACrD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CACzD,CAAC;YACF,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;gBAC3C,UAAU;gBACV,OAAO;gBACP,aAAa;gBACb,aAAa;gBACb,aAAa;aACd,CAAC,CAAC;YACH,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAChD,aAAa,IAAI,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;YAC7C,UAAU;YACV,aAAa;YACb,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;YACxC,UAAU;YACV,aAAa;YACb,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM;YACvC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;SACnC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,yEAAyE;QACzE,0EAA0E;QAC1E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;YACjD,UAAU;YACV,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,UAAkB,EAClB,IAAyB,EACzB,eAAmD,EACnD,IAAgB;IAEhB,wEAAwE;IACxE,2EAA2E;IAC3E,6EAA6E;IAC7E,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC7E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;QAC5C,UAAU;QACV,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;KACrD,CAAC,CAAC;IAEH,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;YACzC,UAAU;YACV,GAAG,EAAE,IAAI,CAAC,aAAa;YACvB,KAAK,EAAE,GAAG,GAAG,MAAM,CAAC,SAAS;SAC9B,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;QAC3C,UAAU;QACV,GAAG,EAAE,IAAI,CAAC,aAAa;QACvB,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC;QAC5B,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;KACtC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;QACzC,GAAG,EAAE,IAAI,CAAC,aAAa;QACvB,OAAO;QACP,SAAS,EAAE,IAAI,CAAC,mBAAmB;QACnC,IAAI,EAAE,MAAM,EAAE,IAAI;QAClB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;QAC5C,UAAU;QACV,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM;KAC7B,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAuB;YAC/B,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,IAAI,CAAC,oBAAoB;YACrC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;QACF,sEAAsE;QACtE,sDAAsD;QACtD,MAAM,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;YACtC,UAAU;YACV,GAAG,EAAE,IAAI,CAAC,aAAa;YACvB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;SAC5B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,IAAI,MAAM,EAAE,CAAC;QAC/C,uEAAuE;QACvE,oEAAoE;QACpE,uCAAuC;QACvC,MAAM,SAAS,GAAuB;YACpC,GAAG,MAAM;YACT,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,IAAI,CAAC,oBAAoB;SACtC,CAAC;QACF,MAAM,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;YAC5C,UAAU;YACV,GAAG,EAAE,IAAI,CAAC,aAAa;SACxB,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;YACvD,UAAU;YACV,GAAG,EAAE,IAAI,CAAC,aAAa;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,GAAG,GAAG,MAAM,CAAC,SAAS;SAC9B,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;QACpD,UAAU;QACV,GAAG,EAAE,IAAI,CAAC,aAAa;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAC;IACH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CACxB,IAAyB,EACzB,eAAmD;IAEnD,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;QAC1B,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,IAAgB,EAChB,GAAW,EACX,MAA0B,EAC1B,UAAkB,EAClB,GAAW;IAEX,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;YACjD,UAAU;YACV,GAAG;YACH,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QACtE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Logger } from "./logging.js";
|
|
2
|
+
export interface SchedulerHandle {
|
|
3
|
+
stop(): void;
|
|
4
|
+
}
|
|
5
|
+
export interface SchedulerOptions {
|
|
6
|
+
intervalMs: number;
|
|
7
|
+
logger: Logger;
|
|
8
|
+
taskName: string;
|
|
9
|
+
run: () => Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Runs `options.run` on a fixed interval, forever, until `stop()` is called.
|
|
13
|
+
* The first run fires after one interval — not immediately — since callers
|
|
14
|
+
* are expected to have already done an initial run synchronously (e.g. the
|
|
15
|
+
* `config` hook's own on-demand cache check). A failure backs off (capped at
|
|
16
|
+
* `intervalMs`) instead of hammering a down endpoint, then resumes the normal
|
|
17
|
+
* cadence once a run succeeds.
|
|
18
|
+
*
|
|
19
|
+
* The underlying timer is `unref()`'d so it never keeps a short-lived process
|
|
20
|
+
* (a one-shot CLI invocation) alive on its own — it only fires if the process
|
|
21
|
+
* is still running for some other reason when the interval elapses.
|
|
22
|
+
*/
|
|
23
|
+
export declare function startScheduler(options: SchedulerOptions): SchedulerHandle;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs `options.run` on a fixed interval, forever, until `stop()` is called.
|
|
3
|
+
* The first run fires after one interval — not immediately — since callers
|
|
4
|
+
* are expected to have already done an initial run synchronously (e.g. the
|
|
5
|
+
* `config` hook's own on-demand cache check). A failure backs off (capped at
|
|
6
|
+
* `intervalMs`) instead of hammering a down endpoint, then resumes the normal
|
|
7
|
+
* cadence once a run succeeds.
|
|
8
|
+
*
|
|
9
|
+
* The underlying timer is `unref()`'d so it never keeps a short-lived process
|
|
10
|
+
* (a one-shot CLI invocation) alive on its own — it only fires if the process
|
|
11
|
+
* is still running for some other reason when the interval elapses.
|
|
12
|
+
*/
|
|
13
|
+
export function startScheduler(options) {
|
|
14
|
+
let failures = 0;
|
|
15
|
+
let stopped = false;
|
|
16
|
+
let timeout;
|
|
17
|
+
const schedule = (delayMs) => {
|
|
18
|
+
timeout = setTimeout(() => {
|
|
19
|
+
void tick();
|
|
20
|
+
}, delayMs);
|
|
21
|
+
timeout.unref?.();
|
|
22
|
+
};
|
|
23
|
+
const backoffDelay = () => {
|
|
24
|
+
const retryWindow = 15_000 * 2 ** Math.max(0, failures - 1);
|
|
25
|
+
return Math.min(options.intervalMs, retryWindow);
|
|
26
|
+
};
|
|
27
|
+
const tick = async () => {
|
|
28
|
+
if (stopped) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
options.logger.trace("models_info_scheduler_tick", {
|
|
32
|
+
taskName: options.taskName,
|
|
33
|
+
failures
|
|
34
|
+
});
|
|
35
|
+
try {
|
|
36
|
+
await options.run();
|
|
37
|
+
failures = 0;
|
|
38
|
+
schedule(options.intervalMs);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
failures += 1;
|
|
42
|
+
options.logger.warn("models_info_scheduler_retry", {
|
|
43
|
+
taskName: options.taskName,
|
|
44
|
+
failures,
|
|
45
|
+
delayMs: backoffDelay(),
|
|
46
|
+
error: error instanceof Error ? error.message : String(error)
|
|
47
|
+
});
|
|
48
|
+
schedule(backoffDelay());
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
schedule(options.intervalMs);
|
|
52
|
+
return {
|
|
53
|
+
stop() {
|
|
54
|
+
stopped = true;
|
|
55
|
+
if (timeout) {
|
|
56
|
+
clearTimeout(timeout);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,OAAyB;IACtD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAmC,CAAC;IAExC,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAQ,EAAE;QACzC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,KAAK,IAAI,EAAE,CAAC;QACd,CAAC,EAAE,OAAO,CAAC,CAAC;QACZ,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAW,EAAE;QAChC,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACnD,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;QACrC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE;YACjD,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ;SACT,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC;YACpB,QAAQ,GAAG,CAAC,CAAC;YACb,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,IAAI,CAAC,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBACjD,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,QAAQ;gBACR,OAAO,EAAE,YAAY,EAAE;gBACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC;IAEF,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE7B,OAAO;QACL,IAAI;YACF,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,OAAO,EAAE,CAAC;gBACZ,YAAY,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -26,6 +26,16 @@ export interface OpenRouterModel {
|
|
|
26
26
|
architecture?: OpenRouterArchitecture;
|
|
27
27
|
top_provider?: OpenRouterTopProvider;
|
|
28
28
|
supported_parameters?: string[];
|
|
29
|
+
/**
|
|
30
|
+
* Non-standard extension: not part of OpenRouter's own `/models` shape, but
|
|
31
|
+
* the field mapping is deliberately partial (see the package README), so a
|
|
32
|
+
* catalog is free to add fields the plugin knows how to use. Lets a
|
|
33
|
+
* catalog flag a model as internal/restricted independent of its
|
|
34
|
+
* modalities — see `modelsInfoHideInternal`. Absent means "the catalog
|
|
35
|
+
* doesn't know," same as every other capability flag here: never inferred,
|
|
36
|
+
* never defaulted to `false`.
|
|
37
|
+
*/
|
|
38
|
+
internal?: boolean;
|
|
29
39
|
}
|
|
30
40
|
export interface OpenRouterModelsResponse {
|
|
31
41
|
data: OpenRouterModel[];
|
|
@@ -36,6 +46,16 @@ export interface MetaProviderOptions {
|
|
|
36
46
|
modelsInfoTimeoutMs: number;
|
|
37
47
|
modelsInfoHeaders?: Record<string, string>;
|
|
38
48
|
modelsInfoOverwrite?: string[];
|
|
49
|
+
modelsInfoHideTextOnly: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Deletes a matched model from `provider.models` when the catalog reports
|
|
52
|
+
* `internal: true` for it. Independent of `modelsInfoHideTextOnly` — a
|
|
53
|
+
* model's modality says nothing about whether it's internal, and
|
|
54
|
+
* conflating the two hides legitimate text-only external models. Does
|
|
55
|
+
* NOT affect the unmatched-model deletion path, which stays governed
|
|
56
|
+
* solely by `modelsInfoHideTextOnly`.
|
|
57
|
+
*/
|
|
58
|
+
modelsInfoHideInternal: boolean;
|
|
39
59
|
modelsInfoFormat: "openrouter";
|
|
40
60
|
}
|
|
41
61
|
export interface CachedModelsRecord {
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vymalo/opencode-models-info",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "OpenCode plugin that enriches model entries with full metadata (context length, pricing, modalities, capability flags) fetched from a provider-supplied OpenRouter-shaped endpoint.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "vymalo contributors",
|
|
7
|
-
"homepage": "https://github.com/
|
|
7
|
+
"homepage": "https://github.com/ADORSYS-GIS/lightbridge-opencode-toolbeit#readme",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/
|
|
10
|
+
"url": "git+https://github.com/ADORSYS-GIS/lightbridge-opencode-toolbeit.git",
|
|
11
11
|
"directory": "packages/opencode-models-info"
|
|
12
12
|
},
|
|
13
13
|
"bugs": {
|
|
14
|
-
"url": "https://github.com/
|
|
14
|
+
"url": "https://github.com/ADORSYS-GIS/lightbridge-opencode-toolbeit/issues"
|
|
15
15
|
},
|
|
16
16
|
"keywords": [
|
|
17
17
|
"opencode",
|