@oh-my-pi/pi-catalog 15.13.0 → 15.13.2
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/CHANGELOG.md +141 -56
- package/dist/types/identity/family.d.ts +2 -0
- package/dist/types/identity/index.d.ts +1 -0
- package/dist/types/identity/tool-syntax.d.ts +3 -0
- package/dist/types/types.d.ts +7 -0
- package/package.json +3 -3
- package/src/identity/family.ts +7 -0
- package/src/identity/index.ts +1 -0
- package/src/identity/tool-syntax.ts +25 -0
- package/src/models.json +203 -0
- package/src/provider-models/openai-compat.ts +5 -1
- package/src/types.ts +7 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,20 +2,161 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [15.13.2] - 2026-06-15
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Added the `ToolCallSyntax` union and `FALLBACK_TOOL_SYNTAX` constant to `@oh-my-pi/pi-catalog/identity` (re-exported from `@oh-my-pi/pi-ai/grammar`).
|
|
10
|
+
- Added `preferredToolSyntax(modelId)` to `@oh-my-pi/pi-catalog/identity`, resolving a model's native tool-call syntax affinity from its family token (Claude→`anthropic`, GLM→`glm`, Kimi→`kimi`, Qwen→`qwen3`, DeepSeek→`deepseek`, OpenAI/gpt-oss→`harmony`, else the `xml` fallback).
|
|
11
|
+
- Added `flux-1-schnell-fp8` to the Fireworks serverless model catalog
|
|
12
|
+
- Added `gpt-oss-20b` to the Fireworks model catalog
|
|
13
|
+
- Added `qwen3-embedding-8b` to the Fireworks model catalog
|
|
14
|
+
- Added `qwen3-reranker-8b` to the Fireworks model catalog
|
|
15
|
+
- Added `Gemma 4 E2B IT` and `Gemma 4 E4B IT` to the Google model catalog
|
|
16
|
+
- Added `qwen/qwen3-asr-flash` to the Zenmux model catalog
|
|
17
|
+
- Added sparse `supportsTools` model metadata so providers can mark models that require in-band tool-call formatting.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- Kept non-tool-capable Fireworks serverless models in discovery results and marked them with `supportsTools: false` for fallback-aware handling
|
|
22
|
+
- Extended `modelFamilyToken(modelId)` to classify Claude/OpenAI ids the structured parser misses (older dated forms such as `claude-3-5-sonnet-20241022` and `gpt-4o`), returning `anthropic`/`openai` instead of an empty token.
|
|
23
|
+
|
|
24
|
+
## [15.13.1] - 2026-06-15
|
|
25
|
+
|
|
5
26
|
### Added
|
|
6
27
|
|
|
7
28
|
- Added `modelFamilyToken(modelId)` to `@oh-my-pi/pi-catalog/identity`: a coarse vendor-lineage token (`anthropic`/`openai`/`gemini`/`kimi`/…) for "are two models the same family?" comparisons, backed by `parseKnownModel` canonical-id normalization. Opaque and comparison-only; kind/variant collapsed onto the vendor token ([#2406](https://github.com/can1357/oh-my-pi/issues/2406))
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- Changed catalog metadata to update a model’s per-token pricing to input 0.09 and output 0.18
|
|
33
|
+
- Changed the same cataloged model’s maximum token limit from 384000 to 65536
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
|
|
37
|
+
- Fixed MiniMax-M3 catalog context for `minimax` and `minimax-cn` to report the documented 1M long-context tier instead of the upstream 512K pricing boundary ([#2576](https://github.com/can1357/oh-my-pi/issues/2576)).
|
|
38
|
+
- Fixed OpenCode Go MiMo catalog metadata so title generation and other tool-enabled calls omit unsupported `tool_choice` instead of triggering provider 400s ([#2509](https://github.com/can1357/oh-my-pi/issues/2509)).
|
|
39
|
+
- Fixed OpenCode Go `kimi-k2.7-code` catalog metadata so resolve-gate requests use automatic tool selection instead of Moonshot-rejected forced `tool_choice` ([#2546](https://github.com/can1357/oh-my-pi/issues/2546)).
|
|
40
|
+
- Fixed Anthropic compat for the `github-copilot` host so `supportsEagerToolInputStreaming` defaults to `false` there, matching the Copilot proxy which rejects the per-tool `eager_input_streaming` field ([#2558](https://github.com/can1357/oh-my-pi/issues/2558)).
|
|
41
|
+
- Scoped vLLM model cache validity to the discovery base URL so changed endpoints refetch immediately, and bounded built-in vLLM discovery requests with a timeout.
|
|
42
|
+
|
|
43
|
+
## [15.12.6] - 2026-06-14
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
|
|
8
47
|
- Added GLM-5.2 to the bundled zai (GLM Coding Plan) catalog as the selectable 1M served model.
|
|
48
|
+
|
|
49
|
+
### Changed
|
|
50
|
+
|
|
51
|
+
- Pinned zai `glm-5.2` to 1M context during catalog generation so endpoint discovery and older fallbacks cannot regress it to 200k.
|
|
52
|
+
- Replaced the hand-maintained `zhipu-coding-plan` GLM reasoning allowlist and vision regex with a `parseGlmModel` family classifier in `identity/classify.ts` (variant + vision + version), surfaced as `isReasoningGlmModelId` / `isGlmVisionModelId`. Discovery now derives reasoning/vision capability from the GLM family instead of a per-id list, so newly-bumped integers (`glm-5.3`, `glm-6`, …) are covered automatically while `-flash`/`-preview` and the vision `…v` shape stay correctly classified.
|
|
53
|
+
|
|
54
|
+
## [15.12.4] - 2026-06-13
|
|
55
|
+
|
|
56
|
+
### Added
|
|
57
|
+
|
|
9
58
|
- Added bundled Fireworks models `deepseek-v4-flash`, `kimi-k2.7-code`, `minimax-m2.5`, `minimax-m3`, `nemotron-3-ultra-nvfp4`, `qwen3.6-plus`, and `qwen3.7-plus`
|
|
10
59
|
- Changed
|
|
60
|
+
|
|
61
|
+
### Changed
|
|
62
|
+
|
|
63
|
+
- Model `contextWindow`/`maxTokens` are now `number | null`; discovery emits `null` when a provider reports no limit, replacing the `222222`/`8888` (`UNK_CONTEXT_WINDOW`/`UNK_MAX_TOKENS`) sentinels (now removed). Bundled `models.json` unknown limits are `null`.
|
|
64
|
+
- Changed the `github-copilot` model context window to `524288` tokens
|
|
65
|
+
- Changed Fireworks model discovery to source the control-plane `List Models` API (`GET /v1/accounts/fireworks/models?filter=supports_serverless=true`) instead of the OpenAI-compatible `/v1/models` inference listing. The inference endpoint returns a sparse, account-specific subset that omits on-demand serverless models (e.g. `kimi-k2.7-code`), so newly published serverless models stayed invisible in the picker until hand-added to the bundled catalog. The control-plane catalog enumerates every serverless model with capability metadata (`supportsServerless`/`supportsTools`/`supportsImageInput`/`contextLength`/`displayName`), paginated and filtered to tool-capable `READY` entries, then merged with bundled/models.dev references — the Kimi K2 max-output clamp and DeepSeek V4 thinking-toggle strip are preserved, and unbundled models default to reasoning so `buildModel` derives the Fireworks effort map. New serverless releases now surface automatically with no catalog edits.
|
|
66
|
+
|
|
67
|
+
### Fixed
|
|
68
|
+
|
|
69
|
+
- Filled missing `contextWindow` and `maxTokens` in generated `models.json` for proxy/reseller variants by inheriting limits from canonical-family and segment-reference models
|
|
70
|
+
- Ignored zero-cost `x-ai` subscription entries as reference sources when backfilling limits so inflated values are not propagated
|
|
71
|
+
- Fixed the model cache opening with `PRAGMA journal_mode=WAL` before `PRAGMA busy_timeout`, so concurrent omp startups could crash inside `getDb()` on `SQLITE_BUSY` during WAL recovery instead of waiting through the transient lock. The busy handler is now installed before the first lock-taking statement ([#2421](https://github.com/can1357/oh-my-pi/issues/2421)).
|
|
72
|
+
|
|
73
|
+
## [15.11.8] - 2026-06-12
|
|
74
|
+
|
|
75
|
+
### Fixed
|
|
76
|
+
|
|
77
|
+
- Fixed Antigravity `gemini-3.1-pro --thinking high` failing with `Cloud Code Assist API error (400): Request contains an invalid argument.` — the upstream `gemini-3.1-pro-high` deployment rejects every `streamGenerateContent` request on both CCA endpoints while discovery still advertises it. High effort now routes to `gemini-pro-agent` (the same "Gemini 3.1 Pro (High)" model, verified accepting the identical request body), and the model-cache fingerprint version was bumped (`merge-v2` → `merge-v3`) so existing fresh caches refetch discovery and pick up the corrected routing immediately.
|
|
78
|
+
|
|
79
|
+
## [15.11.7] - 2026-06-12
|
|
80
|
+
|
|
81
|
+
### Added
|
|
82
|
+
|
|
11
83
|
- Added effort-tier variant collapsing (`variant-collapse`): providers that expose one logical model as several effort/thinking-suffixed upstream ids (Antigravity CCA `gemini-3.5-flash-extra-low`/`-low`/`gemini-3-flash-agent`, `gemini-3[.1]-pro-low|high`, `claude-*[-thinking]` pairs, `gpt-oss-120b-medium`) collapse into one logical entry carrying per-effort upstream routing in `thinking.effortRouting` (plus `thinking.suppressWhenOff` for Cloud Code Assist ids whose baked server default re-applies when `thinkingConfig` is omitted). Request-time code resolves the outbound id via `resolveWireModelId(model, effort)`; selection, caching, and usage attribution key on the logical id.
|
|
12
84
|
- Added the automatic `X`/`X-thinking` pair rule (`deriveThinkingPairFamilies`): any provider's live bare/thinking twin collapses into the bare id, routing thinking-enabled requests to the `-thinking` backing id (trailing or infix token, so `kimi-k2-thinking-turbo` pairs with `kimi-k2-turbo`). Gated on same api and compatible pricing — all-zero cost rows count as unknown, while twins that both carry real, differing prices remain separate SKUs.
|
|
13
85
|
- Added `collapseBuiltModelVariants` and wired collapsing at every materialization point — Antigravity discovery, the catalog generator, and the model-manager merge — so stale sources (old static beside collapsed dynamic results, mixed cache rows) converge on logical entries instead of unioning raw tier ids back into the catalog.
|
|
14
86
|
- Added `thinking.requiresEffort`, baked for reasoning-only upstreams — Gemini 3.x (levels only, no off), Gemini 2.5 Pro (thinkingBudget floors at 128, rejects 0), OpenAI o-series, MiniMax M2, and thinking-variant SKUs (`*-thinking`/`*-reasoner`/`*-reasoning`, with a negation-aware token grammar so `non-thinking` ids never match). Identity derivation bakes it for new entries and `fillThinkingWireDefaults` backfills explicit/cached metadata; `minimumSupportedEffort` exposes the canonical floor. Pair-collapsed twins drop member flags (their off routes to the bare SKU), while identity re-flags pairs whose logical id is itself mandatory
|
|
87
|
+
|
|
88
|
+
### Changed
|
|
89
|
+
|
|
90
|
+
- Changed model display names to drop model-extrinsic decorations: gateway author prefixes (`OpenAI: …`, `Google: …`), `(latest)` alias markers, `(Antigravity)` provider attribution, price tiers (`($$$$)`), and promo/lifecycle tags (`(20% off)`, `(retires …)`). `cleanModelName` is applied in `buildModel` (covers live discovery and stale caches) and as a catalog-generator pass; Antigravity discovery no longer appends `(Antigravity)` to display names. Variant tags that map to distinct wire ids (`(Thinking)`, `(free)`, `(Fast)`, dates, regions) are preserved.
|
|
91
|
+
- Changed the `google-antigravity` default model from `gemini-3-pro-high` to `gemini-3.1-pro`
|
|
92
|
+
- Changed `gemini-2.5-flash-thinking` handling from discovery-denylist to collapsing into `gemini-2.5-flash` (thinking-enabled requests route to the `-thinking` backing id)
|
|
93
|
+
- Bumped the model cache schema to v5 so rows predating effort-tier variant collapsing (raw `-low`/`-high`/`-thinking` member ids) are invalidated
|
|
94
|
+
|
|
95
|
+
### Fixed
|
|
96
|
+
|
|
97
|
+
- Fixed catalog generation to apply effort-tier variant collapsing before provider grouping to ensure collapsed model families are consistently materialized without being impacted by in-loop mutation
|
|
98
|
+
- Fixed Kimi K2.6 OpenAI-compatible compat metadata to use a 300s stream watchdog floor, covering Fire Pass router ids as well as public `kimi-k2.6` ids so long reasoning starts do not hit the generic first-event timeout ([#2366](https://github.com/can1357/oh-my-pi/issues/2366)).
|
|
99
|
+
|
|
100
|
+
## [15.11.4] - 2026-06-12
|
|
101
|
+
|
|
102
|
+
### Fixed
|
|
103
|
+
|
|
104
|
+
- Fixed MiniMax M2-family and OpenAI gpt-oss model metadata so OpenAI-compatible catalog entries declare only `low|medium|high` thinking efforts. Their upstreams reject `minimal`, `xhigh`, and Fireworks' `minimal → none` wire mapping, so `fireworks/minimax-m2.7` as the smol auto-thinking classifier model 400ed on every turn. OpenAI-compatible provider effort maps (`Groq qwen/qwen3-32b`, DeepSeek-family, OpenRouter Anthropic adaptive, Fireworks `minimal → none`) now bake into `thinking.effortMap` in catalog metadata instead of `buildOpenAICompat`, and request builders read that field directly. Regenerated `models.json` now makes `disableReasoning` choose `low` for those families while leaving GLM-5.x and other Fireworks models on the existing `minimal → none` path ([#2315](https://github.com/can1357/oh-my-pi/issues/2315)).
|
|
105
|
+
|
|
106
|
+
### Added
|
|
107
|
+
|
|
15
108
|
- Added `requiresJuiceZeroHack` Responses-API compat flag, resolved by `buildOpenAIResponsesCompat` from GPT-5-family model names and overridable via sparse model `compat` config. Replaces the request-time `model.name.startsWith("gpt-5")` sniff that gated the trailing `# Juice: 0 !important` no-reasoning developer item.
|
|
109
|
+
|
|
110
|
+
## [15.11.3] - 2026-06-11
|
|
111
|
+
|
|
112
|
+
### Added
|
|
113
|
+
|
|
16
114
|
- Added `requestModelId` on `Model` to represent the upstream model id used when a catalog entry is a local variant
|
|
17
115
|
- Added synthetic GitHub Copilot long-context model variants with `-1m` suffixes when tiered token pricing is advertised
|
|
116
|
+
|
|
117
|
+
### Changed
|
|
118
|
+
|
|
119
|
+
- Changed GitHub Copilot discovery to request `X-GitHub-Api-Version: 2026-06-01` from `api.githubcopilot.com`
|
|
120
|
+
- Changed GitHub Copilot discovery to cap base model `contextWindow` to the default token tier and keep long-context access as the separate `-1m` model entry
|
|
121
|
+
- Changed Copilot model mapping to omit non-chat `/models` entries and enable image input for models whose capabilities indicate vision support
|
|
122
|
+
|
|
123
|
+
### Fixed
|
|
124
|
+
|
|
125
|
+
- Fixed long-context variant pricing to use `billing.token_prices.long_context` rates instead of default model pricing
|
|
126
|
+
- Fixed `mapModel` handling in OpenAI-compatible discovery so returning `null` now skips a model entry rather than falling back to defaults
|
|
127
|
+
- Fixed model ID precedence so a real upstream Copilot model id is kept when it conflicts with a synthesized `-1m` variant
|
|
128
|
+
|
|
129
|
+
## [15.11.1] - 2026-06-11
|
|
130
|
+
|
|
131
|
+
### Fixed
|
|
132
|
+
|
|
133
|
+
- Fixed NVIDIA NIM Qwen turns failing with `400 Validation: Unsupported parameter(s): enable_thinking`. NIM's chat-completions schema is `additionalProperties: false` and exposes thinking via the vLLM convention `chat_template_kwargs.enable_thinking`; `buildOpenAICompat` was sending top-level `enable_thinking` for every `qwen/*` id regardless of host. Registered `nvidia` as a known host (`integrate.api.nvidia.com`) and routed NVIDIA-hosted Qwen models to `thinkingFormat: "qwen-chat-template"` ([#2299](https://github.com/can1357/oh-my-pi/issues/2299)).
|
|
134
|
+
- Fixed Moonshot/Kimi native OpenAI-compatible request metadata so Kimi K2 uses `max_tokens` and omits OpenAI-only `store`, restoring first-turn output with `MOONSHOT_API_KEY` ([#2289](https://github.com/can1357/oh-my-pi/issues/2289)).
|
|
135
|
+
|
|
136
|
+
## [15.11.0] - 2026-06-10
|
|
137
|
+
|
|
138
|
+
### Fixed
|
|
139
|
+
|
|
140
|
+
- Fixed `buildModel` so malformed explicit thinking metadata without `efforts` is treated as sparse input and inferred instead of crashing during model resolution ([#2251](https://github.com/can1357/oh-my-pi/issues/2251)).
|
|
141
|
+
|
|
142
|
+
## [15.10.12] - 2026-06-10
|
|
143
|
+
|
|
144
|
+
### Added
|
|
145
|
+
|
|
18
146
|
- Added `grok-composer-2.5-fast` (Cursor "Composer 2.5 Fast") to the xAI Grok OAuth (SuperGrok) catalog: non-reasoning, text-only, 200K context.
|
|
147
|
+
|
|
148
|
+
### Changed
|
|
149
|
+
|
|
150
|
+
- Set every xAI Grok OAuth (SuperGrok) curated model's max output tokens to mirror its context window (`grok-build`, `grok-4.3`, `grok-4.20-0309-{reasoning,non-reasoning}`, `grok-4.20-multi-agent-0309`, `grok-composer-2.5-fast`), replacing the `8888` `UNK_MAX_TOKENS` placeholder (and a stale `30000` on three grok-4.x entries). xAI's OAuth `/v1/models` reports no per-request output limit, so the curated catalog now owns `maxTokens` like `contextWindow`, deterministic on both the static-seed and online-overlay paths; the `openai-responses` wire still clamps the actual request to `OPENAI_MAX_OUTPUT_TOKENS` (64k).
|
|
151
|
+
|
|
152
|
+
### Fixed
|
|
153
|
+
|
|
154
|
+
- Excluded zero-cost `xai-oauth` subscription entries from the model reference indexes (`buildModelReferenceIndex`, `createReferenceResolver`), so their zero pricing and context-window-sized `maxTokens` cannot outrank paid/public Grok references when resolving custom-provider model identities.
|
|
155
|
+
|
|
156
|
+
## [15.10.11] - 2026-06-10
|
|
157
|
+
|
|
158
|
+
### Added
|
|
159
|
+
|
|
19
160
|
- Added `hostMatchesUrl`, `modelMatchesHost`, and endpoint-shape helpers in the new `hosts` module for consistent provider/baseUrl matching
|
|
20
161
|
- `buildModel(spec)` (`build.ts`) is now the single Model constructor: it materializes the fully-resolved compat record and canonical thinking metadata exactly once (compat first, thinking derived from identity + resolved compat), so `Model.compat` is a required, complete `CompatOf<TApi>` (`ResolvedOpenAICompat`/`ResolvedOpenAIResponsesCompat`/`ResolvedAnthropicCompat`) and request-path code reads fields with zero URL parsing and zero per-request allocation. Sparse user/config overrides live on the new `ModelSpec<TApi>` input shape and survive on `Model.compatConfig` for introspection.
|
|
21
162
|
- Added `ResolvedAnthropicCompat.supportsSamplingParams` (Opus 4.7+/Fable/Mythos reject `temperature`/`top_p`/`top_k` with a 400), baked at build time from model identity so the request path stops re-parsing model ids.
|
|
@@ -27,21 +168,6 @@
|
|
|
27
168
|
|
|
28
169
|
### Changed
|
|
29
170
|
|
|
30
|
-
- Changed catalog metadata to update a model’s per-token pricing to input 0.09 and output 0.18
|
|
31
|
-
- Changed the same cataloged model’s maximum token limit from 384000 to 65536
|
|
32
|
-
- Pinned zai `glm-5.2` to 1M context during catalog generation so endpoint discovery and older fallbacks cannot regress it to 200k.
|
|
33
|
-
- Replaced the hand-maintained `zhipu-coding-plan` GLM reasoning allowlist and vision regex with a `parseGlmModel` family classifier in `identity/classify.ts` (variant + vision + version), surfaced as `isReasoningGlmModelId` / `isGlmVisionModelId`. Discovery now derives reasoning/vision capability from the GLM family instead of a per-id list, so newly-bumped integers (`glm-5.3`, `glm-6`, …) are covered automatically while `-flash`/`-preview` and the vision `…v` shape stay correctly classified.
|
|
34
|
-
- Model `contextWindow`/`maxTokens` are now `number | null`; discovery emits `null` when a provider reports no limit, replacing the `222222`/`8888` (`UNK_CONTEXT_WINDOW`/`UNK_MAX_TOKENS`) sentinels (now removed). Bundled `models.json` unknown limits are `null`.
|
|
35
|
-
- Changed the `github-copilot` model context window to `524288` tokens
|
|
36
|
-
- Changed Fireworks model discovery to source the control-plane `List Models` API (`GET /v1/accounts/fireworks/models?filter=supports_serverless=true`) instead of the OpenAI-compatible `/v1/models` inference listing. The inference endpoint returns a sparse, account-specific subset that omits on-demand serverless models (e.g. `kimi-k2.7-code`), so newly published serverless models stayed invisible in the picker until hand-added to the bundled catalog. The control-plane catalog enumerates every serverless model with capability metadata (`supportsServerless`/`supportsTools`/`supportsImageInput`/`contextLength`/`displayName`), paginated and filtered to tool-capable `READY` entries, then merged with bundled/models.dev references — the Kimi K2 max-output clamp and DeepSeek V4 thinking-toggle strip are preserved, and unbundled models default to reasoning so `buildModel` derives the Fireworks effort map. New serverless releases now surface automatically with no catalog edits.
|
|
37
|
-
- Changed model display names to drop model-extrinsic decorations: gateway author prefixes (`OpenAI: …`, `Google: …`), `(latest)` alias markers, `(Antigravity)` provider attribution, price tiers (`($$$$)`), and promo/lifecycle tags (`(20% off)`, `(retires …)`). `cleanModelName` is applied in `buildModel` (covers live discovery and stale caches) and as a catalog-generator pass; Antigravity discovery no longer appends `(Antigravity)` to display names. Variant tags that map to distinct wire ids (`(Thinking)`, `(free)`, `(Fast)`, dates, regions) are preserved.
|
|
38
|
-
- Changed the `google-antigravity` default model from `gemini-3-pro-high` to `gemini-3.1-pro`
|
|
39
|
-
- Changed `gemini-2.5-flash-thinking` handling from discovery-denylist to collapsing into `gemini-2.5-flash` (thinking-enabled requests route to the `-thinking` backing id)
|
|
40
|
-
- Bumped the model cache schema to v5 so rows predating effort-tier variant collapsing (raw `-low`/`-high`/`-thinking` member ids) are invalidated
|
|
41
|
-
- Changed GitHub Copilot discovery to request `X-GitHub-Api-Version: 2026-06-01` from `api.githubcopilot.com`
|
|
42
|
-
- Changed GitHub Copilot discovery to cap base model `contextWindow` to the default token tier and keep long-context access as the separate `-1m` model entry
|
|
43
|
-
- Changed Copilot model mapping to omit non-chat `/models` entries and enable image input for models whose capabilities indicate vision support
|
|
44
|
-
- Set every xAI Grok OAuth (SuperGrok) curated model's max output tokens to mirror its context window (`grok-build`, `grok-4.3`, `grok-4.20-0309-{reasoning,non-reasoning}`, `grok-4.20-multi-agent-0309`, `grok-composer-2.5-fast`), replacing the `8888` `UNK_MAX_TOKENS` placeholder (and a stale `30000` on three grok-4.x entries). xAI's OAuth `/v1/models` reports no per-request output limit, so the curated catalog now owns `maxTokens` like `contextWindow`, deterministic on both the static-seed and online-overlay paths; the `openai-responses` wire still clamps the actual request to `OPENAI_MAX_OUTPUT_TOKENS` (64k).
|
|
45
171
|
- Changed OpenAI compatibility detection to use shared host classifiers (`modelMatchesHost`/`hostMatchesUrl`) with normalized matching instead of raw URL substring checks
|
|
46
172
|
- Changed `hostMatchesUrl`/`modelMatchesHost` usage in compatibility detection to reduce mismatches across case variants and provider alias hosts
|
|
47
173
|
- Provider catalog entries now carry the runtime API-key env fallback as an ordered `envVars` list; `catalogDiscovery.envVars` became an optional generation-time override (only `cursor` and `vercel-ai-gateway` differ) and `PROVIDER_DESCRIPTORS` materializes the resolved list for `generate-models.ts`.
|
|
@@ -52,25 +178,6 @@
|
|
|
52
178
|
|
|
53
179
|
### Fixed
|
|
54
180
|
|
|
55
|
-
- Fixed MiniMax-M3 catalog context for `minimax` and `minimax-cn` to report the documented 1M long-context tier instead of the upstream 512K pricing boundary ([#2576](https://github.com/can1357/oh-my-pi/issues/2576)).
|
|
56
|
-
- Fixed OpenCode Go MiMo catalog metadata so title generation and other tool-enabled calls omit unsupported `tool_choice` instead of triggering provider 400s ([#2509](https://github.com/can1357/oh-my-pi/issues/2509)).
|
|
57
|
-
- Fixed OpenCode Go `kimi-k2.7-code` catalog metadata so resolve-gate requests use automatic tool selection instead of Moonshot-rejected forced `tool_choice` ([#2546](https://github.com/can1357/oh-my-pi/issues/2546)).
|
|
58
|
-
- Fixed Anthropic compat for the `github-copilot` host so `supportsEagerToolInputStreaming` defaults to `false` there, matching the Copilot proxy which rejects the per-tool `eager_input_streaming` field ([#2558](https://github.com/can1357/oh-my-pi/issues/2558)).
|
|
59
|
-
- Scoped vLLM model cache validity to the discovery base URL so changed endpoints refetch immediately, and bounded built-in vLLM discovery requests with a timeout.
|
|
60
|
-
- Filled missing `contextWindow` and `maxTokens` in generated `models.json` for proxy/reseller variants by inheriting limits from canonical-family and segment-reference models
|
|
61
|
-
- Ignored zero-cost `x-ai` subscription entries as reference sources when backfilling limits so inflated values are not propagated
|
|
62
|
-
- Fixed the model cache opening with `PRAGMA journal_mode=WAL` before `PRAGMA busy_timeout`, so concurrent omp startups could crash inside `getDb()` on `SQLITE_BUSY` during WAL recovery instead of waiting through the transient lock. The busy handler is now installed before the first lock-taking statement ([#2421](https://github.com/can1357/oh-my-pi/issues/2421)).
|
|
63
|
-
- Fixed Antigravity `gemini-3.1-pro --thinking high` failing with `Cloud Code Assist API error (400): Request contains an invalid argument.` — the upstream `gemini-3.1-pro-high` deployment rejects every `streamGenerateContent` request on both CCA endpoints while discovery still advertises it. High effort now routes to `gemini-pro-agent` (the same "Gemini 3.1 Pro (High)" model, verified accepting the identical request body), and the model-cache fingerprint version was bumped (`merge-v2` → `merge-v3`) so existing fresh caches refetch discovery and pick up the corrected routing immediately.
|
|
64
|
-
- Fixed catalog generation to apply effort-tier variant collapsing before provider grouping to ensure collapsed model families are consistently materialized without being impacted by in-loop mutation
|
|
65
|
-
- Fixed Kimi K2.6 OpenAI-compatible compat metadata to use a 300s stream watchdog floor, covering Fire Pass router ids as well as public `kimi-k2.6` ids so long reasoning starts do not hit the generic first-event timeout ([#2366](https://github.com/can1357/oh-my-pi/issues/2366)).
|
|
66
|
-
- Fixed MiniMax M2-family and OpenAI gpt-oss model metadata so OpenAI-compatible catalog entries declare only `low|medium|high` thinking efforts. Their upstreams reject `minimal`, `xhigh`, and Fireworks' `minimal → none` wire mapping, so `fireworks/minimax-m2.7` as the smol auto-thinking classifier model 400ed on every turn. OpenAI-compatible provider effort maps (`Groq qwen/qwen3-32b`, DeepSeek-family, OpenRouter Anthropic adaptive, Fireworks `minimal → none`) now bake into `thinking.effortMap` in catalog metadata instead of `buildOpenAICompat`, and request builders read that field directly. Regenerated `models.json` now makes `disableReasoning` choose `low` for those families while leaving GLM-5.x and other Fireworks models on the existing `minimal → none` path ([#2315](https://github.com/can1357/oh-my-pi/issues/2315)).
|
|
67
|
-
- Fixed long-context variant pricing to use `billing.token_prices.long_context` rates instead of default model pricing
|
|
68
|
-
- Fixed `mapModel` handling in OpenAI-compatible discovery so returning `null` now skips a model entry rather than falling back to defaults
|
|
69
|
-
- Fixed model ID precedence so a real upstream Copilot model id is kept when it conflicts with a synthesized `-1m` variant
|
|
70
|
-
- Fixed NVIDIA NIM Qwen turns failing with `400 Validation: Unsupported parameter(s): enable_thinking`. NIM's chat-completions schema is `additionalProperties: false` and exposes thinking via the vLLM convention `chat_template_kwargs.enable_thinking`; `buildOpenAICompat` was sending top-level `enable_thinking` for every `qwen/*` id regardless of host. Registered `nvidia` as a known host (`integrate.api.nvidia.com`) and routed NVIDIA-hosted Qwen models to `thinkingFormat: "qwen-chat-template"` ([#2299](https://github.com/can1357/oh-my-pi/issues/2299)).
|
|
71
|
-
- Fixed Moonshot/Kimi native OpenAI-compatible request metadata so Kimi K2 uses `max_tokens` and omits OpenAI-only `store`, restoring first-turn output with `MOONSHOT_API_KEY` ([#2289](https://github.com/can1357/oh-my-pi/issues/2289)).
|
|
72
|
-
- Fixed `buildModel` so malformed explicit thinking metadata without `efforts` is treated as sparse input and inferred instead of crashing during model resolution ([#2251](https://github.com/can1357/oh-my-pi/issues/2251)).
|
|
73
|
-
- Excluded zero-cost `xai-oauth` subscription entries from the model reference indexes (`buildModelReferenceIndex`, `createReferenceResolver`), so their zero pricing and context-window-sized `maxTokens` cannot outrank paid/public Grok references when resolving custom-provider model identities.
|
|
74
181
|
- Fixed Anthropic official-endpoint detection to require strict HTTPS hostname matching so non-official or lookalike URLs are no longer treated as official Anthropic hosts
|
|
75
182
|
- Fixed Ollama Cloud dynamic discovery so same-id matches from other providers no longer supply context-window or max-output-token limits for discovered models.
|
|
76
183
|
- Wired `@oh-my-pi/pi-catalog` into the release publish package list, tarball install smoke test, and root `bun generate-models` script.
|
|
@@ -80,25 +187,3 @@
|
|
|
80
187
|
### Removed
|
|
81
188
|
|
|
82
189
|
- Removed the runtime enrichment layer: `enrichModelThinking` (and its non-enumerable memo-slot cache), `refreshModelThinking`, `modelOmitsReasoningEffort`, and the `model-thinking` re-exports of generator-only policies. Thinking metadata is resolved exactly once inside `buildModel`; runtime helpers (`getSupportedEfforts`, `clampThinkingLevelForModel`, `requireSupportedEffort`, the effort mappers) are pure field reads.
|
|
83
|
-
|
|
84
|
-
## [15.13.0] - 2026-06-14
|
|
85
|
-
|
|
86
|
-
## [15.12.6] - 2026-06-14
|
|
87
|
-
|
|
88
|
-
## [15.12.4] - 2026-06-13
|
|
89
|
-
|
|
90
|
-
## [15.11.8] - 2026-06-12
|
|
91
|
-
|
|
92
|
-
## [15.11.7] - 2026-06-12
|
|
93
|
-
|
|
94
|
-
## [15.11.4] - 2026-06-12
|
|
95
|
-
|
|
96
|
-
## [15.11.3] - 2026-06-11
|
|
97
|
-
|
|
98
|
-
## [15.11.1] - 2026-06-11
|
|
99
|
-
|
|
100
|
-
## [15.11.0] - 2026-06-10
|
|
101
|
-
|
|
102
|
-
## [15.10.12] - 2026-06-10
|
|
103
|
-
|
|
104
|
-
## [15.10.11] - 2026-06-10
|
|
@@ -37,6 +37,8 @@ export declare function isMinimaxM2FamilyModelId(modelId: string): boolean;
|
|
|
37
37
|
* and `none`.
|
|
38
38
|
*/
|
|
39
39
|
export declare function isOpenAIGptOssModelId(modelId: string): boolean;
|
|
40
|
+
/** OpenAI model ids (gpt-*, o1-*, o3-*, o4-*, or prefixed with openai/). */
|
|
41
|
+
export declare function isOpenAIModelId(modelId: string): boolean;
|
|
40
42
|
/**
|
|
41
43
|
* Reasoning-capable GLM coding SKUs: glm-4.5 and up on the base / `-air` /
|
|
42
44
|
* `-turbo` lines. Excludes the vision (`…v`) shape, the non-reasoning
|
package/dist/types/types.d.ts
CHANGED
|
@@ -371,6 +371,13 @@ export interface Model<TApi extends Api = Api> {
|
|
|
371
371
|
baseUrl: string;
|
|
372
372
|
reasoning: boolean;
|
|
373
373
|
input: ("text" | "image")[];
|
|
374
|
+
/**
|
|
375
|
+
* Native provider tool-call support. `false` is the only unsupported signal:
|
|
376
|
+
* `true` and `undefined` both mean callers may use native tools. Catalog and
|
|
377
|
+
* discovery sources should set this sparsely when an upstream explicitly
|
|
378
|
+
* reports that native tool calling is unsupported.
|
|
379
|
+
*/
|
|
380
|
+
supportsTools?: boolean;
|
|
374
381
|
cost: {
|
|
375
382
|
input: number;
|
|
376
383
|
output: number;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@oh-my-pi/pi-catalog",
|
|
4
|
-
"version": "15.13.
|
|
4
|
+
"version": "15.13.2",
|
|
5
5
|
"description": "Model catalog for omp: bundled model database, provider discovery descriptors, model identity, classification, and equivalence",
|
|
6
6
|
"homepage": "https://omp.sh",
|
|
7
7
|
"author": "Can Boluk",
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@bufbuild/protobuf": "^2.12.0",
|
|
37
|
-
"@oh-my-pi/pi-utils": "15.13.
|
|
37
|
+
"@oh-my-pi/pi-utils": "15.13.2",
|
|
38
38
|
"zod": "^4"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@oh-my-pi/pi-ai": "15.13.
|
|
41
|
+
"@oh-my-pi/pi-ai": "15.13.2",
|
|
42
42
|
"@types/bun": "^1.3.14"
|
|
43
43
|
},
|
|
44
44
|
"engines": {
|
package/src/identity/family.ts
CHANGED
|
@@ -78,6 +78,11 @@ export function isOpenAIGptOssModelId(modelId: string): boolean {
|
|
|
78
78
|
return /(^|\/)gpt-oss[-:]/i.test(modelId);
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
+
/** OpenAI model ids (gpt-*, o1-*, o3-*, o4-*, or prefixed with openai/). */
|
|
82
|
+
export function isOpenAIModelId(modelId: string): boolean {
|
|
83
|
+
return /(^|\/)(gpt|o1|o3|o4)[-.]/i.test(modelId) || modelId.toLowerCase().includes("openai/");
|
|
84
|
+
}
|
|
85
|
+
|
|
81
86
|
/**
|
|
82
87
|
* Reasoning-capable GLM coding SKUs: glm-4.5 and up on the base / `-air` /
|
|
83
88
|
* `-turbo` lines. Excludes the vision (`…v`) shape, the non-reasoning
|
|
@@ -114,6 +119,8 @@ export function isGlmVisionModelId(modelId: string): boolean {
|
|
|
114
119
|
export function modelFamilyToken(modelId: string): string {
|
|
115
120
|
const parsed = parseKnownModel(modelId);
|
|
116
121
|
if (parsed.family !== "unknown") return parsed.family;
|
|
122
|
+
if (isClaudeModelId(modelId) || isAnthropicNamespacedModelId(modelId)) return "anthropic";
|
|
123
|
+
if (isOpenAIModelId(modelId)) return "openai";
|
|
117
124
|
if (isKimiModelId(modelId)) return "kimi";
|
|
118
125
|
if (isQwenModelId(modelId)) return "qwen";
|
|
119
126
|
if (isMinimaxM2FamilyModelId(modelId)) return "minimax";
|
package/src/identity/index.ts
CHANGED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { modelFamilyToken } from "./family";
|
|
2
|
+
|
|
3
|
+
export type ToolCallSyntax = "glm" | "hermes" | "kimi" | "xml" | "anthropic" | "deepseek" | "harmony" | "pi" | "qwen3";
|
|
4
|
+
|
|
5
|
+
export const FALLBACK_TOOL_SYNTAX: ToolCallSyntax = "xml";
|
|
6
|
+
|
|
7
|
+
export function preferredToolSyntax(modelId: string): ToolCallSyntax {
|
|
8
|
+
switch (modelFamilyToken(modelId)) {
|
|
9
|
+
case "anthropic":
|
|
10
|
+
return "anthropic";
|
|
11
|
+
case "glm":
|
|
12
|
+
return "glm";
|
|
13
|
+
case "kimi":
|
|
14
|
+
return "kimi";
|
|
15
|
+
case "qwen":
|
|
16
|
+
return "qwen3";
|
|
17
|
+
case "deepseek":
|
|
18
|
+
return "deepseek";
|
|
19
|
+
case "openai":
|
|
20
|
+
case "gpt-oss":
|
|
21
|
+
return "harmony";
|
|
22
|
+
default:
|
|
23
|
+
return FALLBACK_TOOL_SYNTAX;
|
|
24
|
+
}
|
|
25
|
+
}
|
package/src/models.json
CHANGED
|
@@ -13692,6 +13692,39 @@
|
|
|
13692
13692
|
"requiresAssistantContentForToolCalls": true
|
|
13693
13693
|
}
|
|
13694
13694
|
},
|
|
13695
|
+
"flux-1-schnell-fp8": {
|
|
13696
|
+
"id": "flux-1-schnell-fp8",
|
|
13697
|
+
"name": "FLUX.1 [schnell] FP8",
|
|
13698
|
+
"api": "openai-completions",
|
|
13699
|
+
"provider": "fireworks",
|
|
13700
|
+
"baseUrl": "https://api.fireworks.ai/inference/v1",
|
|
13701
|
+
"reasoning": true,
|
|
13702
|
+
"input": [
|
|
13703
|
+
"text"
|
|
13704
|
+
],
|
|
13705
|
+
"cost": {
|
|
13706
|
+
"input": 0,
|
|
13707
|
+
"output": 0,
|
|
13708
|
+
"cacheRead": 0,
|
|
13709
|
+
"cacheWrite": 0
|
|
13710
|
+
},
|
|
13711
|
+
"contextWindow": null,
|
|
13712
|
+
"maxTokens": null,
|
|
13713
|
+
"supportsTools": false,
|
|
13714
|
+
"thinking": {
|
|
13715
|
+
"mode": "effort",
|
|
13716
|
+
"efforts": [
|
|
13717
|
+
"minimal",
|
|
13718
|
+
"low",
|
|
13719
|
+
"medium",
|
|
13720
|
+
"high",
|
|
13721
|
+
"xhigh"
|
|
13722
|
+
],
|
|
13723
|
+
"effortMap": {
|
|
13724
|
+
"minimal": "none"
|
|
13725
|
+
}
|
|
13726
|
+
}
|
|
13727
|
+
},
|
|
13695
13728
|
"glm-5": {
|
|
13696
13729
|
"id": "glm-5",
|
|
13697
13730
|
"name": "GLM-5",
|
|
@@ -13783,6 +13816,26 @@
|
|
|
13783
13816
|
]
|
|
13784
13817
|
}
|
|
13785
13818
|
},
|
|
13819
|
+
"gpt-oss-20b": {
|
|
13820
|
+
"id": "gpt-oss-20b",
|
|
13821
|
+
"name": "OpenAI gpt-oss-20b",
|
|
13822
|
+
"api": "openai-completions",
|
|
13823
|
+
"provider": "fireworks",
|
|
13824
|
+
"baseUrl": "https://api.fireworks.ai/inference/v1",
|
|
13825
|
+
"reasoning": false,
|
|
13826
|
+
"input": [
|
|
13827
|
+
"text"
|
|
13828
|
+
],
|
|
13829
|
+
"cost": {
|
|
13830
|
+
"input": 0,
|
|
13831
|
+
"output": 0,
|
|
13832
|
+
"cacheRead": 0,
|
|
13833
|
+
"cacheWrite": 0
|
|
13834
|
+
},
|
|
13835
|
+
"contextWindow": 131072,
|
|
13836
|
+
"maxTokens": 65536,
|
|
13837
|
+
"supportsTools": false
|
|
13838
|
+
},
|
|
13786
13839
|
"kimi-k2.5": {
|
|
13787
13840
|
"id": "kimi-k2.5",
|
|
13788
13841
|
"name": "Kimi K2.5",
|
|
@@ -14003,6 +14056,70 @@
|
|
|
14003
14056
|
}
|
|
14004
14057
|
}
|
|
14005
14058
|
},
|
|
14059
|
+
"qwen3-embedding-8b": {
|
|
14060
|
+
"id": "qwen3-embedding-8b",
|
|
14061
|
+
"name": "Qwen3 Embedding 8B",
|
|
14062
|
+
"api": "openai-completions",
|
|
14063
|
+
"provider": "fireworks",
|
|
14064
|
+
"baseUrl": "https://api.fireworks.ai/inference/v1",
|
|
14065
|
+
"reasoning": true,
|
|
14066
|
+
"input": [
|
|
14067
|
+
"text"
|
|
14068
|
+
],
|
|
14069
|
+
"cost": {
|
|
14070
|
+
"input": 0,
|
|
14071
|
+
"output": 0,
|
|
14072
|
+
"cacheRead": 0,
|
|
14073
|
+
"cacheWrite": 0
|
|
14074
|
+
},
|
|
14075
|
+
"contextWindow": 40960,
|
|
14076
|
+
"maxTokens": null,
|
|
14077
|
+
"supportsTools": false,
|
|
14078
|
+
"thinking": {
|
|
14079
|
+
"mode": "effort",
|
|
14080
|
+
"efforts": [
|
|
14081
|
+
"minimal",
|
|
14082
|
+
"low",
|
|
14083
|
+
"medium",
|
|
14084
|
+
"high"
|
|
14085
|
+
],
|
|
14086
|
+
"effortMap": {
|
|
14087
|
+
"minimal": "none"
|
|
14088
|
+
}
|
|
14089
|
+
}
|
|
14090
|
+
},
|
|
14091
|
+
"qwen3-reranker-8b": {
|
|
14092
|
+
"id": "qwen3-reranker-8b",
|
|
14093
|
+
"name": "Qwen3 Reranker 8B",
|
|
14094
|
+
"api": "openai-completions",
|
|
14095
|
+
"provider": "fireworks",
|
|
14096
|
+
"baseUrl": "https://api.fireworks.ai/inference/v1",
|
|
14097
|
+
"reasoning": true,
|
|
14098
|
+
"input": [
|
|
14099
|
+
"text"
|
|
14100
|
+
],
|
|
14101
|
+
"cost": {
|
|
14102
|
+
"input": 0,
|
|
14103
|
+
"output": 0,
|
|
14104
|
+
"cacheRead": 0,
|
|
14105
|
+
"cacheWrite": 0
|
|
14106
|
+
},
|
|
14107
|
+
"contextWindow": 40960,
|
|
14108
|
+
"maxTokens": null,
|
|
14109
|
+
"supportsTools": false,
|
|
14110
|
+
"thinking": {
|
|
14111
|
+
"mode": "effort",
|
|
14112
|
+
"efforts": [
|
|
14113
|
+
"minimal",
|
|
14114
|
+
"low",
|
|
14115
|
+
"medium",
|
|
14116
|
+
"high"
|
|
14117
|
+
],
|
|
14118
|
+
"effortMap": {
|
|
14119
|
+
"minimal": "none"
|
|
14120
|
+
}
|
|
14121
|
+
}
|
|
14122
|
+
},
|
|
14006
14123
|
"qwen3.6-plus": {
|
|
14007
14124
|
"id": "qwen3.6-plus",
|
|
14008
14125
|
"name": "Qwen3.6 Plus",
|
|
@@ -16509,6 +16626,64 @@
|
|
|
16509
16626
|
"high"
|
|
16510
16627
|
]
|
|
16511
16628
|
}
|
|
16629
|
+
},
|
|
16630
|
+
"gemma-4-E2B-it": {
|
|
16631
|
+
"id": "gemma-4-E2B-it",
|
|
16632
|
+
"name": "Gemma 4 E2B IT",
|
|
16633
|
+
"api": "google-generative-ai",
|
|
16634
|
+
"provider": "google",
|
|
16635
|
+
"baseUrl": "https://generativelanguage.googleapis.com/v1beta",
|
|
16636
|
+
"reasoning": true,
|
|
16637
|
+
"input": [
|
|
16638
|
+
"text",
|
|
16639
|
+
"image"
|
|
16640
|
+
],
|
|
16641
|
+
"cost": {
|
|
16642
|
+
"input": 0,
|
|
16643
|
+
"output": 0,
|
|
16644
|
+
"cacheRead": 0,
|
|
16645
|
+
"cacheWrite": 0
|
|
16646
|
+
},
|
|
16647
|
+
"contextWindow": 131072,
|
|
16648
|
+
"maxTokens": 8192,
|
|
16649
|
+
"thinking": {
|
|
16650
|
+
"mode": "budget",
|
|
16651
|
+
"efforts": [
|
|
16652
|
+
"minimal",
|
|
16653
|
+
"low",
|
|
16654
|
+
"medium",
|
|
16655
|
+
"high"
|
|
16656
|
+
]
|
|
16657
|
+
}
|
|
16658
|
+
},
|
|
16659
|
+
"gemma-4-E4B-it": {
|
|
16660
|
+
"id": "gemma-4-E4B-it",
|
|
16661
|
+
"name": "Gemma 4 E4B IT",
|
|
16662
|
+
"api": "google-generative-ai",
|
|
16663
|
+
"provider": "google",
|
|
16664
|
+
"baseUrl": "https://generativelanguage.googleapis.com/v1beta",
|
|
16665
|
+
"reasoning": true,
|
|
16666
|
+
"input": [
|
|
16667
|
+
"text",
|
|
16668
|
+
"image"
|
|
16669
|
+
],
|
|
16670
|
+
"cost": {
|
|
16671
|
+
"input": 0,
|
|
16672
|
+
"output": 0,
|
|
16673
|
+
"cacheRead": 0,
|
|
16674
|
+
"cacheWrite": 0
|
|
16675
|
+
},
|
|
16676
|
+
"contextWindow": 131072,
|
|
16677
|
+
"maxTokens": 8192,
|
|
16678
|
+
"thinking": {
|
|
16679
|
+
"mode": "budget",
|
|
16680
|
+
"efforts": [
|
|
16681
|
+
"minimal",
|
|
16682
|
+
"low",
|
|
16683
|
+
"medium",
|
|
16684
|
+
"high"
|
|
16685
|
+
]
|
|
16686
|
+
}
|
|
16512
16687
|
}
|
|
16513
16688
|
},
|
|
16514
16689
|
"google-antigravity": {
|
|
@@ -75419,6 +75594,34 @@
|
|
|
75419
75594
|
"requiresEffort": true
|
|
75420
75595
|
}
|
|
75421
75596
|
},
|
|
75597
|
+
"qwen/qwen3-asr-flash": {
|
|
75598
|
+
"id": "qwen/qwen3-asr-flash",
|
|
75599
|
+
"name": "Qwen3-ASR-Flash",
|
|
75600
|
+
"api": "openai-completions",
|
|
75601
|
+
"provider": "zenmux",
|
|
75602
|
+
"baseUrl": "https://zenmux.ai/api/v1",
|
|
75603
|
+
"reasoning": true,
|
|
75604
|
+
"input": [
|
|
75605
|
+
"text"
|
|
75606
|
+
],
|
|
75607
|
+
"cost": {
|
|
75608
|
+
"input": 0,
|
|
75609
|
+
"output": 0,
|
|
75610
|
+
"cacheRead": 0,
|
|
75611
|
+
"cacheWrite": 0
|
|
75612
|
+
},
|
|
75613
|
+
"contextWindow": 1000000,
|
|
75614
|
+
"maxTokens": null,
|
|
75615
|
+
"thinking": {
|
|
75616
|
+
"mode": "effort",
|
|
75617
|
+
"efforts": [
|
|
75618
|
+
"minimal",
|
|
75619
|
+
"low",
|
|
75620
|
+
"medium",
|
|
75621
|
+
"high"
|
|
75622
|
+
]
|
|
75623
|
+
}
|
|
75624
|
+
},
|
|
75422
75625
|
"qwen/qwen3-coder": {
|
|
75423
75626
|
"id": "qwen/qwen3-coder",
|
|
75424
75627
|
"name": "Qwen3-Coder",
|
|
@@ -1160,6 +1160,7 @@ function mapFireworksControlPlaneModel(
|
|
|
1160
1160
|
): ModelSpec<"openai-completions"> {
|
|
1161
1161
|
const name = toModelName(record.displayName, reference?.name ?? publicModelId);
|
|
1162
1162
|
const supportsImage = toBoolean(record.supportsImageInput) === true;
|
|
1163
|
+
const supportsTools = toBoolean(record.supportsTools);
|
|
1163
1164
|
const contextWindow = toPositiveNumber(record.contextLength, reference?.contextWindow ?? null);
|
|
1164
1165
|
// The control plane reports no max-output budget; default the Kimi family to
|
|
1165
1166
|
// its published cap, everyone else to the discovery fallback, then clamp.
|
|
@@ -1192,6 +1193,7 @@ function mapFireworksControlPlaneModel(
|
|
|
1192
1193
|
input: supportsImage ? ["text", "image"] : (reference?.input ?? ["text"]),
|
|
1193
1194
|
contextWindow,
|
|
1194
1195
|
maxTokens,
|
|
1196
|
+
...(supportsTools === false ? { supportsTools: false } : {}),
|
|
1195
1197
|
};
|
|
1196
1198
|
return stripFireworksDeepSeekThinkingToggle(model, publicModelId);
|
|
1197
1199
|
}
|
|
@@ -1240,7 +1242,6 @@ async function fetchFireworksServerlessModels(options: {
|
|
|
1240
1242
|
if (!isRecord(entry)) continue;
|
|
1241
1243
|
const record = entry as FireworksControlPlaneModel;
|
|
1242
1244
|
if (toBoolean(record.supportsServerless) !== true) continue;
|
|
1243
|
-
if (toBoolean(record.supportsTools) !== true) continue;
|
|
1244
1245
|
if (typeof record.state === "string" && record.state !== "READY") continue;
|
|
1245
1246
|
const wireName = typeof record.name === "string" ? record.name : "";
|
|
1246
1247
|
if (!wireName) continue;
|
|
@@ -1396,6 +1397,7 @@ function mapWaferModel(
|
|
|
1396
1397
|
const capabilities = wafer?.capabilities ?? {};
|
|
1397
1398
|
const reasoning = capabilities.reasoning === true;
|
|
1398
1399
|
const vision = capabilities.vision === true;
|
|
1400
|
+
const supportsTools = toBoolean(capabilities.tools) === false ? false : undefined;
|
|
1399
1401
|
const contextWindow = toPositiveNumber(
|
|
1400
1402
|
wafer?.context_length,
|
|
1401
1403
|
toPositiveNumber((entry as { max_model_len?: unknown }).max_model_len, defaults.contextWindow),
|
|
@@ -1434,6 +1436,7 @@ function mapWaferModel(
|
|
|
1434
1436
|
cost,
|
|
1435
1437
|
contextWindow,
|
|
1436
1438
|
maxTokens,
|
|
1439
|
+
...(supportsTools === false ? { supportsTools } : {}),
|
|
1437
1440
|
};
|
|
1438
1441
|
if (reasoning) {
|
|
1439
1442
|
// Wafer's `wafer.provider` envelope tells us which upstream backend serves
|
|
@@ -2928,6 +2931,7 @@ export function mapModelsDevToModels(
|
|
|
2928
2931
|
},
|
|
2929
2932
|
contextWindow: toPositiveNumber(m.limit?.context, desc.defaultContextWindow ?? null),
|
|
2930
2933
|
maxTokens: toPositiveNumber(m.limit?.output, desc.defaultMaxTokens ?? null),
|
|
2934
|
+
...(m.tool_call === false ? { supportsTools: false } : {}),
|
|
2931
2935
|
...(desc.compat && { compat: desc.compat }),
|
|
2932
2936
|
...(desc.headers && { headers: { ...desc.headers } }),
|
|
2933
2937
|
};
|
package/src/types.ts
CHANGED
|
@@ -436,6 +436,13 @@ export interface Model<TApi extends Api = Api> {
|
|
|
436
436
|
baseUrl: string;
|
|
437
437
|
reasoning: boolean;
|
|
438
438
|
input: ("text" | "image")[];
|
|
439
|
+
/**
|
|
440
|
+
* Native provider tool-call support. `false` is the only unsupported signal:
|
|
441
|
+
* `true` and `undefined` both mean callers may use native tools. Catalog and
|
|
442
|
+
* discovery sources should set this sparsely when an upstream explicitly
|
|
443
|
+
* reports that native tool calling is unsupported.
|
|
444
|
+
*/
|
|
445
|
+
supportsTools?: boolean;
|
|
439
446
|
cost: {
|
|
440
447
|
input: number; // $/million tokens
|
|
441
448
|
output: number; // $/million tokens
|