@plurnk/plurnk-providers 1.3.12 → 1.4.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.
Files changed (132) hide show
  1. package/.env.defaults +39 -22
  2. package/README.md +65 -4
  3. package/SPEC.md +222 -56
  4. package/dist/AiSdkProvider.d.ts +18 -5
  5. package/dist/AiSdkProvider.d.ts.map +1 -1
  6. package/dist/AiSdkProvider.js +240 -153
  7. package/dist/AiSdkProvider.js.map +1 -1
  8. package/dist/Mock.d.ts +14 -15
  9. package/dist/Mock.d.ts.map +1 -1
  10. package/dist/Mock.js +26 -10
  11. package/dist/Mock.js.map +1 -1
  12. package/dist/Pool.d.ts +8 -2
  13. package/dist/Pool.d.ts.map +1 -1
  14. package/dist/Pool.js +41 -8
  15. package/dist/Pool.js.map +1 -1
  16. package/dist/ProviderRegistry.d.ts +4 -1
  17. package/dist/ProviderRegistry.d.ts.map +1 -1
  18. package/dist/ProviderRegistry.js +7 -3
  19. package/dist/ProviderRegistry.js.map +1 -1
  20. package/dist/aiSdkTransport.d.ts +4 -2
  21. package/dist/aiSdkTransport.d.ts.map +1 -1
  22. package/dist/aiSdkTransport.js +18 -3
  23. package/dist/aiSdkTransport.js.map +1 -1
  24. package/dist/catalogProvider.d.ts +3 -1
  25. package/dist/catalogProvider.d.ts.map +1 -1
  26. package/dist/catalogProvider.js +20 -7
  27. package/dist/catalogProvider.js.map +1 -1
  28. package/dist/compatibleProvider.d.ts.map +1 -1
  29. package/dist/compatibleProvider.js +11 -4
  30. package/dist/compatibleProvider.js.map +1 -1
  31. package/dist/cost.d.ts +11 -0
  32. package/dist/cost.d.ts.map +1 -0
  33. package/dist/cost.js +64 -0
  34. package/dist/cost.js.map +1 -0
  35. package/dist/discover.d.ts +2 -0
  36. package/dist/discover.d.ts.map +1 -1
  37. package/dist/discover.js +15 -9
  38. package/dist/discover.js.map +1 -1
  39. package/dist/env.d.ts +4 -0
  40. package/dist/env.d.ts.map +1 -1
  41. package/dist/env.js +29 -9
  42. package/dist/env.js.map +1 -1
  43. package/dist/errors.d.ts +27 -0
  44. package/dist/errors.d.ts.map +1 -0
  45. package/dist/errors.js +150 -0
  46. package/dist/errors.js.map +1 -0
  47. package/dist/index.d.ts +11 -5
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +7 -4
  50. package/dist/index.js.map +1 -1
  51. package/dist/notices.d.ts +10 -0
  52. package/dist/notices.d.ts.map +1 -0
  53. package/dist/notices.js +11 -0
  54. package/dist/notices.js.map +1 -0
  55. package/dist/ollama.d.ts.map +1 -1
  56. package/dist/ollama.js +3 -3
  57. package/dist/ollama.js.map +1 -1
  58. package/dist/openai.d.ts +1 -1
  59. package/dist/openai.d.ts.map +1 -1
  60. package/dist/promptTokens.d.ts +4 -0
  61. package/dist/promptTokens.d.ts.map +1 -0
  62. package/dist/promptTokens.js +32 -0
  63. package/dist/promptTokens.js.map +1 -0
  64. package/dist/sdkModels.d.ts.map +1 -1
  65. package/dist/sdkModels.js +4 -3
  66. package/dist/sdkModels.js.map +1 -1
  67. package/dist/types.d.ts +43 -16
  68. package/dist/types.d.ts.map +1 -1
  69. package/dist/types.js +1 -1
  70. package/dist/types.js.map +1 -1
  71. package/dist/usage.d.ts +3 -0
  72. package/dist/usage.d.ts.map +1 -1
  73. package/dist/usage.js +26 -14
  74. package/dist/usage.js.map +1 -1
  75. package/dist/warnings.js +0 -0
  76. package/dist/warnings.js.map +1 -1
  77. package/package.json +13 -9
  78. package/src/AiSdkProvider.test.ts +480 -159
  79. package/src/AiSdkProvider.ts +320 -196
  80. package/src/Mock.test.ts +29 -14
  81. package/src/Mock.ts +33 -15
  82. package/src/Pool.test.ts +43 -6
  83. package/src/Pool.ts +56 -10
  84. package/src/ProviderRegistry.test.ts +158 -9
  85. package/src/ProviderRegistry.ts +19 -6
  86. package/src/aiSdkTransport.ts +25 -6
  87. package/src/boundaries.test.ts +8 -3
  88. package/src/catalogProvider.test.ts +17 -0
  89. package/src/catalogProvider.ts +25 -10
  90. package/src/compatibleProvider.test.ts +96 -0
  91. package/src/compatibleProvider.ts +15 -6
  92. package/src/cost.test.ts +63 -0
  93. package/src/cost.ts +83 -0
  94. package/src/defaults.test.ts +1 -0
  95. package/src/discover.test.ts +48 -7
  96. package/src/discover.ts +31 -21
  97. package/src/env.test.ts +38 -23
  98. package/src/env.ts +45 -18
  99. package/src/errors.test.ts +148 -0
  100. package/src/errors.ts +207 -0
  101. package/src/index.ts +29 -7
  102. package/src/lexicon-guard.test.ts +6 -6
  103. package/src/notices.ts +22 -0
  104. package/src/ollama.test.ts +64 -0
  105. package/src/ollama.ts +6 -3
  106. package/src/openai.ts +3 -0
  107. package/src/promptTokens.ts +41 -0
  108. package/src/sdkModels.test.ts +7 -0
  109. package/src/sdkModels.ts +4 -8
  110. package/src/types.ts +106 -64
  111. package/src/usage.test.ts +15 -4
  112. package/src/usage.ts +32 -14
  113. package/src/warnings.test.ts +10 -10
  114. package/src/warnings.ts +0 -0
  115. package/dist/OpenAICompat.d.ts +0 -76
  116. package/dist/OpenAICompat.d.ts.map +0 -1
  117. package/dist/OpenAICompat.js +0 -555
  118. package/dist/OpenAICompat.js.map +0 -1
  119. package/dist/openaiStream.d.ts +0 -47
  120. package/dist/openaiStream.d.ts.map +0 -1
  121. package/dist/openaiStream.js +0 -280
  122. package/dist/openaiStream.js.map +0 -1
  123. package/dist/standardProviders.d.ts +0 -31
  124. package/dist/standardProviders.d.ts.map +0 -1
  125. package/dist/standardProviders.js +0 -518
  126. package/dist/standardProviders.js.map +0 -1
  127. package/dist/telemetry.d.ts +0 -24
  128. package/dist/telemetry.d.ts.map +0 -1
  129. package/dist/telemetry.js +0 -85
  130. package/dist/telemetry.js.map +0 -1
  131. package/src/telemetry.test.ts +0 -69
  132. package/src/telemetry.ts +0 -116
@@ -1,518 +0,0 @@
1
- // Pure-config OpenAI-compatible providers. A provider qualifies as "standard"
2
- // when it has no unique runtime surface — no catalog probe, no pricing fetch,
3
- // no bespoke wire shape — so it reduces to: an env var for the key, a base
4
- // URL, a reasoning-translation style, and a tokenizer. Such providers need NO
5
- // sibling package; the framework instantiates them directly.
6
- //
7
- // Two-tier resolution (SPEC §5): the consumer tries standardProviderFromEnv
8
- // first, then falls back to the discover() node_modules scan for the bespoke
9
- // ones (openrouter, ollama, google, xai, cloudflare, third-party). The scan
10
- // resolves the package specifier — it is NOT a hardcoded @plurnk/ pattern.
11
- import OpenAICompatProvider from "./OpenAICompat.js";
12
- import { parseRequiredInt, parseOptionalInt, parseRequiredFloat, parseOptionalFloat, reasoningFromEnv, dataCaptureFromEnv, contextWindowFromEnv, envelopeFromEnv, resolveReserve } from "./env.js";
13
- import { emitWarningOnce } from "./warnings.js";
14
- import { providerSource } from "./telemetry.js";
15
- import { calculateCostUsd } from "./usage.js";
16
- import { lookup } from "@plurnk/plurnk-models";
17
- // Frozen so a downstream can't mutate the shared table.
18
- export const STANDARD_PROVIDERS = Object.freeze({
19
- // Generic OpenAI-compatible endpoint (OpenAI proper, llama-server, vLLM,
20
- // LM Studio, or any chat-completions shim). Operator supplies the base.
21
- // Replaces the former @plurnk/plurnk-providers-openai sibling verbatim.
22
- openai: {
23
- apiKeyVar: "OPENAI_API_KEY", apiKeyRequired: false,
24
- baseUrlVar: ["OPENAI_BASE_URL", "OPENAI_API_BASE"], chatPath: "/v1/chat/completions", flexBaseStrip: true,
25
- reasoningStyle: "think", tokenizerEnvVar: "OPENAI_TOKENIZER",
26
- probeNctx: true,
27
- },
28
- groq: {
29
- apiKeyVar: "GROQ_API_KEY", apiKeyRequired: true,
30
- baseUrlVar: "GROQ_BASE_URL", chatPath: "/chat/completions",
31
- reasoningStyle: "effort", tokenizerEnvVar: "GROQ_TOKENIZER",
32
- },
33
- deepseek: {
34
- apiKeyVar: "DEEPSEEK_API_KEY", apiKeyRequired: true,
35
- baseUrlVar: "DEEPSEEK_BASE_URL", chatPath: "/chat/completions",
36
- reasoningStyle: "none", tokenizerEnvVar: "DEEPSEEK_TOKENIZER",
37
- },
38
- mistral: {
39
- apiKeyVar: "MISTRAL_API_KEY", apiKeyRequired: true,
40
- baseUrlVar: "MISTRAL_BASE_URL", chatPath: "/chat/completions",
41
- reasoningStyle: "none", tokenizerEnvVar: "MISTRAL_TOKENIZER",
42
- },
43
- together: {
44
- apiKeyVar: "TOGETHER_API_KEY", apiKeyRequired: true,
45
- baseUrlVar: "TOGETHER_BASE_URL", chatPath: "/chat/completions",
46
- reasoningStyle: "none", tokenizerEnvVar: "TOGETHER_TOKENIZER",
47
- },
48
- // reasoningStyle "effort_explicit", NOT "none": fireworks serves reason-by-
49
- // DEFAULT models (DeepSeek V4 defaults 'high'), so budget 0 must SEND
50
- // reasoning_effort:"none" — omitting the field leaves the reasoner live inside
51
- // a constrained decode until max_tokens (#30; 0/5 → 30/30 measured).
52
- fireworks: {
53
- apiKeyVar: "FIREWORKS_API_KEY", apiKeyRequired: true,
54
- baseUrlVar: "FIREWORKS_BASE_URL", chatPath: "/chat/completions",
55
- reasoningStyle: "effort_explicit",
56
- modelPrefix: "accounts/fireworks/models/",
57
- qualifiedModelPrefix: "accounts/fireworks/",
58
- serviceTiers: ["auto", "default", "flex", "priority"],
59
- tokenizerEnvVar: "FIREWORKS_TOKENIZER",
60
- },
61
- deepinfra: {
62
- apiKeyVar: ["DEEPINFRA_API_KEY", "DEEPINFRA_API_TOKEN", "DEEPINFRA_TOKEN"], apiKeyRequired: true,
63
- baseUrlVar: "DEEPINFRA_BASE_URL", chatPath: "/chat/completions",
64
- reasoningStyle: "none", tokenizerEnvVar: "DEEPINFRA_TOKENIZER",
65
- },
66
- // — Chinese cloud hosts (all OpenAI-compat, plain bearer, doc-verified 2026). —
67
- // The .env.defaults base is the INTERNATIONAL endpoint; mainland operators
68
- // point the override var at the `.cn` twin noted per entry. Reasoning is left
69
- // "none" for the whole cohort: each host's reasoning toggle is either
70
- // model-selected or a non-standard param that rides in `extra_body` (the
71
- // `effort`/`anthropic` styles don't reach it) — same posture as deepseek.
72
- // None are in the @plurnk/plurnk-models snapshot, so context comes from
73
- // PLURNK_PROVIDERS_CONTEXT_WINDOW and cost stays unknown until the catalog adds
74
- // them (a plurnk-models issue, not this repo's).
75
- moonshot: {
76
- apiKeyVar: "MOONSHOT_API_KEY", apiKeyRequired: true,
77
- baseUrlVar: "MOONSHOT_BASE_URL", chatPath: "/chat/completions",
78
- reasoningStyle: "none", tokenizerEnvVar: "MOONSHOT_TOKENIZER",
79
- },
80
- // Alibaba Qwen via DashScope "compatible-mode". Mainland: dashscope.aliyuncs.com.
81
- dashscope: {
82
- apiKeyVar: "DASHSCOPE_API_KEY", apiKeyRequired: true,
83
- baseUrlVar: "DASHSCOPE_BASE_URL", chatPath: "/chat/completions",
84
- reasoningStyle: "none", tokenizerEnvVar: "DASHSCOPE_TOKENIZER",
85
- },
86
- // Zhipu GLM. Base carries /api/paas/v4 (non-/v1). Mainland: open.bigmodel.cn/api/paas/v4.
87
- zhipu: {
88
- apiKeyVar: ["ZHIPUAI_API_KEY", "ZAI_API_KEY"], apiKeyRequired: true,
89
- baseUrlVar: "ZHIPU_BASE_URL", chatPath: "/chat/completions",
90
- reasoningStyle: "none", tokenizerEnvVar: "ZHIPU_TOKENIZER",
91
- },
92
- // ByteDance Doubao via BytePlus ModelArk (base carries /api/v3; `model` is an
93
- // inference-endpoint/model id). Mainland (Volcengine): ark.cn-beijing.volces.com/api/v3.
94
- volcengine: {
95
- apiKeyVar: "ARK_API_KEY", apiKeyRequired: true,
96
- baseUrlVar: "ARK_BASE_URL", chatPath: "/chat/completions",
97
- reasoningStyle: "none", tokenizerEnvVar: "ARK_TOKENIZER",
98
- },
99
- // Tencent Hunyuan — single global host (no intl/mainland split).
100
- hunyuan: {
101
- apiKeyVar: "HUNYUAN_API_KEY", apiKeyRequired: true,
102
- baseUrlVar: "HUNYUAN_BASE_URL", chatPath: "/chat/completions",
103
- reasoningStyle: "none", tokenizerEnvVar: "HUNYUAN_TOKENIZER",
104
- },
105
- // MiniMax. Mainland twin is api.minimaxi.com (note the extra "i").
106
- minimax: {
107
- apiKeyVar: "MINIMAX_API_KEY", apiKeyRequired: true,
108
- baseUrlVar: "MINIMAX_BASE_URL", chatPath: "/chat/completions",
109
- reasoningStyle: "none", tokenizerEnvVar: "MINIMAX_TOKENIZER",
110
- },
111
- // StepFun. Intl twin is api.stepfun.ai (.ai vs the .com mainland host).
112
- stepfun: {
113
- apiKeyVar: "STEP_API_KEY", apiKeyRequired: true,
114
- baseUrlVar: "STEPFUN_BASE_URL", chatPath: "/chat/completions",
115
- reasoningStyle: "none", tokenizerEnvVar: "STEPFUN_TOKENIZER",
116
- },
117
- // Baichuan — single host.
118
- baichuan: {
119
- apiKeyVar: "BAICHUAN_API_KEY", apiKeyRequired: true,
120
- baseUrlVar: "BAICHUAN_BASE_URL", chatPath: "/chat/completions",
121
- reasoningStyle: "none", tokenizerEnvVar: "BAICHUAN_TOKENIZER",
122
- },
123
- // Baidu ERNIE via Qianfan v2 (key is a bce-v3/ALTAK-… bearer; base carries /v2).
124
- qianfan: {
125
- apiKeyVar: "QIANFAN_API_KEY", apiKeyRequired: true,
126
- baseUrlVar: "QIANFAN_BASE_URL", chatPath: "/chat/completions",
127
- reasoningStyle: "none", tokenizerEnvVar: "QIANFAN_TOKENIZER",
128
- },
129
- // SiliconFlow aggregator. Mainland twin is api.siliconflow.cn.
130
- siliconflow: {
131
- apiKeyVar: "SILICONFLOW_API_KEY", apiKeyRequired: true,
132
- baseUrlVar: "SILICONFLOW_BASE_URL", chatPath: "/chat/completions",
133
- reasoningStyle: "none", tokenizerEnvVar: "SILICONFLOW_TOKENIZER",
134
- },
135
- // ModelScope API-Inference aggregator — single host (.cn).
136
- modelscope: {
137
- apiKeyVar: ["MODELSCOPE_API_KEY", "MODELSCOPE_TOKEN"], apiKeyRequired: true,
138
- baseUrlVar: "MODELSCOPE_BASE_URL", chatPath: "/chat/completions",
139
- reasoningStyle: "none", tokenizerEnvVar: "MODELSCOPE_TOKENIZER",
140
- },
141
- // First-party Claude via Anthropic's OpenAI-compat endpoint: bearer auth,
142
- // OpenAI SSE, the `thinking` reasoning param (reasoning_effort is ignored).
143
- // No probe — context/cost come from the @plurnk/plurnk-models catalog.
144
- anthropic: {
145
- apiKeyVar: "ANTHROPIC_API_KEY", apiKeyRequired: true,
146
- baseUrlVar: "ANTHROPIC_BASE_URL", chatPath: "/chat/completions",
147
- reasoningStyle: "anthropic", tokenizerEnvVar: "ANTHROPIC_TOKENIZER",
148
- promptCacheKey: false, // #518: anthropic caches via cache_control breakpoints, not prompt_cache_key (unverified) — opt out
149
- suppressFrequencyPenalty: true, // Claude's native API has no frequency_penalty; the compat endpoint rejects it (DOC #568)
150
- },
151
- // AWS Bedrock via its OpenAI-compat endpoint (path is /openai/v1, NOT /v1),
152
- // bearer-authed with a Bedrock API key (SigV4 optional). Region-templated base
153
- // (see baseUrlFromEnv); model ids are inference profiles like
154
- // `us.anthropic.claude-sonnet-4-6` (see catalogContextLookup). Cost stays unknown —
155
- // bedrock marks up over the native rate, so set PLURNK_PROVIDERS_CONTEXT_WINDOW for
156
- // a publisher the catalog lacks (#22). frequency_penalty suppressed: Bedrock's
157
- // OpenAI-compat surfaces Claude's native param set, which excludes it (DOC #568).
158
- bedrock: {
159
- apiKeyVar: "AWS_BEARER_TOKEN_BEDROCK", apiKeyRequired: true,
160
- baseUrlVar: "BEDROCK_BASE_URL", chatPath: "/chat/completions",
161
- baseUrlFromEnv: (env) => {
162
- const region = firstSet(env, ["AWS_REGION", "AWS_DEFAULT_REGION"]);
163
- if (region === undefined)
164
- throw new Error("bedrock provider: BEDROCK_BASE_URL must be set, or AWS_REGION / AWS_DEFAULT_REGION to derive it");
165
- return `https://bedrock-runtime.${region}.amazonaws.com/openai/v1`;
166
- },
167
- // Inference profile <region>.<publisher>.<model> — the catalog has no
168
- // `bedrock` provider, so strip the region scope and look the model up under
169
- // its PUBLISHER (anthropic, …). Only the context window rides; bedrock marks
170
- // up, so the native cost is NOT used (cost stays unknown, #22).
171
- catalogContextLookup: (model) => {
172
- const stripped = model.replace(/^(?:us-gov|us|eu|apac)\./, "");
173
- const dot = stripped.indexOf(".");
174
- if (dot < 0)
175
- return undefined;
176
- return lookup(stripped.slice(0, dot), stripped.slice(dot + 1))?.contextWindow;
177
- },
178
- reasoningStyle: "none", tokenizerEnvVar: "BEDROCK_TOKENIZER",
179
- suppressFrequencyPenalty: true, // Bedrock surfaces Claude's native param set, which has no frequency_penalty (DOC #568)
180
- },
181
- // The plurnk hosted model — deliberately the most boring OpenAI-compatible
182
- // client we can ship: the ecosystem must not know what sits behind
183
- // plurnk.ai (model/window/grammar/tuning are the router's business).
184
- // probeNctx reads the window from upstream (a 32k→48k change is a server
185
- // decision, not a client release), but detectLlamaServer:false keeps it a
186
- // plain remote server that can NOT be flipped into grammar/slot behavior.
187
- // PLURNK_API_KEY is REQUIRED — plurnk.ai rejects keyless requests (live 401
188
- // error_invalid_key, #537). The unset path throws the friendly apiKeyMessage
189
- // pre-call instead of letting a raw upstream 401 terminate the loop.
190
- plurnk: {
191
- baseUrlVar: "PLURNK_BASE_URL", chatPath: "/chat/completions",
192
- apiKeyVar: "PLURNK_API_KEY", apiKeyRequired: true,
193
- apiKeyMessage: "PLURNK_API_KEY not found. Acquire one at https://plurnk.ai . Plurnk also supports local models and alternative cloud provider configurations.",
194
- apiKeyRejectedMessage: "PLURNK_API_KEY was rejected by plurnk.ai (invalid or expired). Verify it at https://plurnk.ai .",
195
- reasoningStyle: "none", tokenizerEnvVar: "PLURNK_TOKENIZER",
196
- probeNctx: true, detectLlamaServer: false, firstPartyMetadata: true, suppressTuningFloors: true,
197
- },
198
- });
199
- export const isStandardProvider = (name) => name in STANDARD_PROVIDERS;
200
- // Normalize a single-or-list env-var spec to a list, and return the first env
201
- // var that is set non-empty (the accepted-alias resolution — first wins).
202
- const asList = (v) => v === undefined ? [] : typeof v === "string" ? [v] : v;
203
- const firstSet = (env, names) => {
204
- for (const name of names) {
205
- const value = env[name];
206
- if (value !== undefined && value.length > 0)
207
- return value;
208
- }
209
- return undefined;
210
- };
211
- const resolveUrl = (spec, env, label, override) => {
212
- // per-alias override (PLURNK_BASEURL_<alias>) → base-URL var(s) → env-derived
213
- // template. No in-code default — the endpoint is required operator config.
214
- // The override goes through the same normalization (flexBaseStrip + chatPath),
215
- // so an operator pastes the box URL verbatim.
216
- const base = override ?? firstSet(env, asList(spec.baseUrlVar)) ?? spec.baseUrlFromEnv?.(env);
217
- if (base === undefined || base.length === 0) {
218
- const names = asList(spec.baseUrlVar);
219
- throw new Error(`${label} provider: ${names.length > 0 ? names.join(" or ") : "base URL"} must be set`);
220
- }
221
- const trimmed = spec.flexBaseStrip === true ? base.replace(/\/v1\/?$/, "") : base.replace(/\/$/, "");
222
- return `${trimmed}${spec.chatPath}`;
223
- };
224
- // Auth/routing headers. A custom builder (multi-credential auth) wins; otherwise
225
- // the bearer from the first accepted alias that is set: required → fail-hard
226
- // naming every accepted var, optional → omitted when none set (a keyless server
227
- // then receives no Authorization header).
228
- const resolveHeaders = (spec, env, label) => {
229
- if (spec.headersFromEnv !== undefined)
230
- return spec.headersFromEnv(env);
231
- const names = asList(spec.apiKeyVar);
232
- if (names.length === 0)
233
- return {};
234
- const apiKey = firstSet(env, names);
235
- if (apiKey === undefined) {
236
- if (spec.apiKeyRequired === true)
237
- throw new Error(spec.apiKeyMessage ?? `${label} provider: ${names.join(" or ")} must be set`);
238
- return {};
239
- }
240
- return { Authorization: `Bearer ${apiKey}` };
241
- };
242
- // One probe failure must never decide capability (#34). Attempts/delay are
243
- // operator knobs (PLURNK_PROVIDERS_PROBE_ATTEMPTS / _PROBE_DELAY, canonical
244
- // 3 / 250ms in .env.defaults) — the full-sweep rule: no magic numbers in code.
245
- const probeModels = async (chatUrl, headers, model, fetchTimeoutMs) => {
246
- const modelsUrl = chatUrl.replace(/\/chat\/completions$/, "/models");
247
- try {
248
- const res = await fetch(modelsUrl, { headers, signal: AbortSignal.timeout(fetchTimeoutMs) });
249
- if (!res.ok)
250
- return { nCtx: null, llamaServer: false, servedModel: null, failed: true };
251
- const data = (await res.json());
252
- const rows = data.data ?? [];
253
- const row = rows.find((r) => r.id === model) ?? rows[0];
254
- const n = row?.meta?.n_ctx ?? row?.n_ctx;
255
- // A clean 200 without the meta block is a CONFIRMED non-llama-server —
256
- // a valid answer, not a failure; no retry.
257
- return {
258
- nCtx: typeof n === "number" && n > 0 ? n : null,
259
- llamaServer: row?.meta !== undefined,
260
- // #37: the backend's self-reported id — for a local llama-server the
261
- // wire model is the ALIAS, but this row carries the real served name
262
- // (the .gguf) the tokenizer seam maps. Absent when the probe read no row.
263
- servedModel: typeof row?.id === "string" && row.id.length > 0 ? row.id : null,
264
- failed: false,
265
- };
266
- }
267
- catch {
268
- return { nCtx: null, llamaServer: false, servedModel: null, failed: true };
269
- }
270
- };
271
- // Retry wrapper (#34): only FAILED probes (non-200 / thrown fetch / timeout)
272
- // retry — a confirmed answer returns immediately. Exhaustion returns the last
273
- // failed result; the CALLER decides what a still-unknown capability means.
274
- const probeModelsRetrying = async (chatUrl, headers, model, fetchTimeoutMs, attempts, delayMs) => {
275
- let probe = { nCtx: null, llamaServer: false, servedModel: null, failed: true };
276
- for (let attempt = 0; attempt < attempts; attempt++) {
277
- if (attempt > 0)
278
- await new Promise((r) => setTimeout(r, delayMs * 2 ** (attempt - 1)));
279
- probe = await probeModels(chatUrl, headers, model, fetchTimeoutMs);
280
- if (!probe.failed)
281
- return probe;
282
- }
283
- return probe;
284
- };
285
- // llama-server /props: total_slots (the valid id_slot range for slot pinning) +
286
- // eos_token (the EOG the server renders as TEXT under --special, #539). One fetch,
287
- // both facts. Only queried after the llama-server fingerprint confirms; same
288
- // best-effort posture as the models probe.
289
- const probeServerProps = async (chatUrl, headers, fetchTimeoutMs) => {
290
- const propsUrl = chatUrl.replace(/\/v1\/chat\/completions$/, "/props");
291
- try {
292
- const res = await fetch(propsUrl, { headers, signal: AbortSignal.timeout(fetchTimeoutMs) });
293
- if (!res.ok)
294
- return { slotCount: null, eosToken: null };
295
- const data = (await res.json());
296
- return {
297
- slotCount: typeof data.total_slots === "number" && data.total_slots > 0 ? data.total_slots : null,
298
- eosToken: typeof data.eos_token === "string" && data.eos_token.length > 0 ? data.eos_token : null,
299
- };
300
- }
301
- catch {
302
- return { slotCount: null, eosToken: null };
303
- }
304
- };
305
- // Returns a configured Provider, or null when `name` is not a standard
306
- // provider (so the consumer falls through to dynamic import). Async because a
307
- // probeNctx-enabled provider queries /v1/models at construction.
308
- export const standardProviderFromEnv = async (name, env, model, baseUrlOverride) => {
309
- const spec = STANDARD_PROVIDERS[name];
310
- if (spec === undefined)
311
- return null;
312
- // The on-the-wire model id: a backend-required constant prefix (fireworks)
313
- // prepended idempotently, so the operator's alias carries only the distinctive
314
- // tail. This id is what the backend, the probe, AND the catalog key on.
315
- const qualified = spec.qualifiedModelPrefix !== undefined && model.startsWith(spec.qualifiedModelPrefix);
316
- const wireModel = spec.modelPrefix !== undefined && !qualified && !model.startsWith(spec.modelPrefix)
317
- ? `${spec.modelPrefix}${model}`
318
- : model;
319
- const headers = resolveHeaders(spec, env, name);
320
- // Tokenizer shed (mimetypes#44 landed): client-side families are GONE — exact
321
- // counting lives in the mimetypes tokenizer seam + the tokenize() capability.
322
- // A still-set family var fails hard with the migration pointer; countTokens is
323
- // the chars/2 upper bound, surfaced so window math is never silently inexact.
324
- // Namespace seizure (fail-forward): the debug knob moved into the owned
325
- // PLURNK_PROVIDERS_ namespace (alias-scopable). The old name fails hard.
326
- if (env.PLURNK_GBNF_DEBUG !== undefined && env.PLURNK_GBNF_DEBUG.length > 0) {
327
- throw new Error(`${name} provider: PLURNK_GBNF_DEBUG was renamed to PLURNK_PROVIDERS_GBNF_DEBUG (alias-scopable as _<alias>); update the env`);
328
- }
329
- const staleTokenizer = env[spec.tokenizerEnvVar];
330
- if (staleTokenizer !== undefined && staleTokenizer.length > 0) {
331
- throw new Error(`${name} provider: ${spec.tokenizerEnvVar} was removed — exact counting moved to the @plurnk/plurnk-mimetypes tokenizer seam (mimetypes#44) and Provider.tokenize(); unset the var (countTokens is a chars/2 upper bound)`);
332
- }
333
- // Once per process per (code, message) — #40: construction-per-worker daemons
334
- // repeated this until operators tuned warnings out.
335
- emitWarningOnce(`${name} provider: countTokens is a chars/2 upper bound — exact counts come from the mimetypes tokenizer seam or tokenize()`, "PLURNK_TOKENIZER_HEURISTIC");
336
- const url = resolveUrl(spec, env, name, baseUrlOverride);
337
- const fetchTimeoutMs = parseRequiredInt(env.PLURNK_PROVIDERS_FETCH_TIMEOUT, "PLURNK_PROVIDERS_FETCH_TIMEOUT", name);
338
- const streamIdleTimeoutMs = parseRequiredInt(env.PLURNK_PROVIDERS_STREAM_IDLE_TIMEOUT, "PLURNK_PROVIDERS_STREAM_IDLE_TIMEOUT", name);
339
- const serviceTier = (() => {
340
- const raw = env.PLURNK_PROVIDERS_SERVICE_TIER;
341
- if (raw === undefined || raw.length === 0)
342
- return undefined;
343
- if (spec.serviceTiers === undefined) {
344
- throw new Error(`${name} provider: PLURNK_PROVIDERS_SERVICE_TIER is not supported`);
345
- }
346
- if (!spec.serviceTiers.includes(raw)) {
347
- throw new Error(`${name} provider: PLURNK_PROVIDERS_SERVICE_TIER must be one of ${spec.serviceTiers.map((tier) => JSON.stringify(tier)).join(", ")} (got "${raw}")`);
348
- }
349
- return raw;
350
- })();
351
- // The probe always runs for probeNctx specs — grammar capability must not
352
- // hinge on whether the operator pinned PLURNK_PROVIDERS_CONTEXT_WINDOW. For
353
- // contextWindow itself, explicit env still wins over the probed n_ctx.
354
- let contextWindow = contextWindowFromEnv(env, name);
355
- // GBNF transport is upgraded to "llamacpp" only when the probe fingerprints
356
- // a llama-server. Slot
357
- // pinning is llama-server-only, so it keys on that same fingerprint. A spec
358
- // can opt out of the fingerprint entirely (detectLlamaServer: false → plurnk)
359
- // to read the window but stay a plain remote OpenAI server.
360
- let grammarStyle = "none";
361
- let supportsSlotPinning = false;
362
- let slotCount = null;
363
- let eosText;
364
- let tokenizeUrl;
365
- let servedModel;
366
- let requiresMaxTokens;
367
- let reasoningStyle = spec.reasoningStyle;
368
- if (spec.probeNctx === true) {
369
- // Operator pin (#34): "1" → llama-server capabilities WITHOUT trusting
370
- // the probe; "0" → plain remote, skip the fingerprint; unset → detect.
371
- // A plurnk-owned UNIVERSAL knob (alias-scopable: _<alias> suffix wins).
372
- const pinRaw = env.PLURNK_PROVIDERS_LLAMA_SERVER;
373
- if (pinRaw !== undefined && pinRaw !== "" && pinRaw !== "0" && pinRaw !== "1") {
374
- throw new Error(`${name} provider: PLURNK_PROVIDERS_LLAMA_SERVER must be "1" (pin llama-server capabilities), "0" (force plain remote), or unset (auto-detect) (got "${pinRaw}")`);
375
- }
376
- const pin = pinRaw === undefined || pinRaw === "" ? null : pinRaw === "1";
377
- const probeAttempts = parseRequiredInt(env.PLURNK_PROVIDERS_PROBE_ATTEMPTS, "PLURNK_PROVIDERS_PROBE_ATTEMPTS", name);
378
- const probe = await probeModelsRetrying(url, headers, wireModel, fetchTimeoutMs, probeAttempts, parseRequiredInt(env.PLURNK_PROVIDERS_PROBE_DELAY, "PLURNK_PROVIDERS_PROBE_DELAY", name));
379
- contextWindow ??= probe.nCtx;
380
- // #37: the backend's self-reported served id (from the same probe), so an
381
- // alias-fronted local model resolves its exact tokenizer. Absent otherwise.
382
- servedModel = probe.servedModel ?? undefined;
383
- const isLlama = pin ?? (probe.llamaServer && spec.detectLlamaServer !== false);
384
- if (isLlama && spec.detectLlamaServer !== false) {
385
- grammarStyle = "llamacpp";
386
- supportsSlotPinning = true;
387
- const serverProps = await probeServerProps(url, headers, fetchTimeoutMs);
388
- slotCount = serverProps.slotCount;
389
- eosText = serverProps.eosToken ?? undefined;
390
- // llama-server serves its NATIVE /tokenize at the root (like /props):
391
- // the model's own vocab, exact — surfaced as the tokenize() capability.
392
- tokenizeUrl = url.replace(/\/v1\/chat\/completions$/, "/tokenize");
393
- // llama-server ignores `think` — its working reasoning toggle is the
394
- // jinja chat_template_kwargs.enable_thinking, including the explicit
395
- // FALSE at REASONING=off that grammar-constrained loops require (§13).
396
- if (reasoningStyle === "think")
397
- reasoningStyle = "template";
398
- // #43: llama-server honors n_predict to the CONTEXT WALL (providers#10)
399
- // — no self-clamp. Surface the fact so a consumer can boot-refuse a
400
- // local alias whose output envelope was never declared.
401
- requiresMaxTokens = true;
402
- }
403
- else if (pin === null && probe.failed && spec.detectLlamaServer !== false) {
404
- // Detection exhausted its retries with NO answer: capability stays
405
- // un-upgraded, but NEVER silently (#34) — rails going dark without a
406
- // signal cost the consumer weeks of misattributed rambles.
407
- emitWarningOnce(`${name} provider: llama-server detection failed after ${probeAttempts} attempts — local capabilities are unknown. If this endpoint is a llama-server, pin PLURNK_PROVIDERS_LLAMA_SERVER=1 (or its _<alias> form).`, "PLURNK_PROBE_FAILED");
408
- }
409
- }
410
- // Vendored-snapshot FALLBACK (#19) — live always wins. contextWindow already
411
- // preferred env then the live probe; the catalog only fills a still-null
412
- // window for a known cloud model (groq/deepseek/mistral/…, which don't
413
- // probe). A local llama-server model misses the catalog and keeps its
414
- // probed n_ctx. Standard providers carry NO live pricing, so the catalog is
415
- // the sole — never shadowing — cost source, expressed in USD per 1M tokens.
416
- // A relay with a catalogContextLookup (bedrock) resolves its window via the
417
- // underlying model's publisher and carries NO catalog cost (native rate ≠ relay
418
- // rate, #22); everyone else keys the catalog directly on (name, wireModel).
419
- const fallback = spec.catalogContextLookup === undefined ? lookup(name, wireModel) : undefined;
420
- contextWindow ??= (spec.catalogContextLookup !== undefined ? spec.catalogContextLookup(wireModel) : fallback?.contextWindow) ?? null;
421
- // Unresolved window (env, probe, catalog ALL missed) - two paths (#419 hybrid).
422
- // A CLOUD provider (no probe) has no other window source, so an uncataloged,
423
- // unpinned model is a config error we FAIL-HARD on (the #417 kimi case) rather
424
- // than budget against a wrong number. A PROBING provider (openai/llama-server)
425
- // DEGRADES to null instead: a probe blip or a box that doesn't report n_ctx must
426
- // not crash construction (#34 robustness); the consumer treats null as "no cap",
427
- // never a wrong CTX stand-in. Either way the unknown is SURFACED, never silent.
428
- if (contextWindow === null) {
429
- if (spec.probeNctx !== true) {
430
- throw new Error(`${name} provider: context window unresolved for "${wireModel}" - a cloud provider with no probe, absent from the @plurnk/plurnk-models catalog and unpinned. Pin PLURNK_PROVIDERS_CONTEXT_WINDOW (alias-scopable as _<alias>) or add the model to the catalog (#419)`);
431
- }
432
- emitWarningOnce(`${name} provider: context window underivable for "${wireModel}" (probe returned no n_ctx, catalog miss) - contextWindow=null; set PLURNK_PROVIDERS_CONTEXT_WINDOW (alias-scopable as _<alias>) so window budgets are deliberate`, "PLURNK_CONTEXT_UNKNOWN");
433
- }
434
- const cost = fallback?.cost;
435
- const calculateCost = cost === undefined
436
- ? undefined
437
- : (usage) => calculateCostUsd(usage, {
438
- input: cost.inputPer1M,
439
- output: cost.outputPer1M,
440
- cached: cost.cacheReadPer1M ?? cost.inputPer1M,
441
- });
442
- // #507: completion cap — when the catalog reports a maxOutput, use
443
- // min(maxOutput, percentage_amount) as an absolute reserve instead of the
444
- // raw percentage. The 25% floor dramatically over-reserves on large-context
445
- // models (gpt-4.1-mini: 1M ctx → 262K reserved, real cap 32K; claude-sonnet:
446
- // 1M ctx → 250K reserved, real cap 128K). The min() preserves the floor on
447
- // models where maxOutput > 25%*ctx (deepseek 1M/384K, llama 131K/131K).
448
- // An operator absolute pin (COMPLETION_RESERVE=8192 not "25%") always wins.
449
- const reasoning = reasoningFromEnv(env, name);
450
- const { reasoningReserve: envReasoning, completionReserve: envCompletion } = envelopeFromEnv(env, name);
451
- const completionReserve = (() => {
452
- if ("tokens" in envCompletion)
453
- return envCompletion; // operator absolute always wins
454
- if (fallback?.maxOutput === undefined || contextWindow === null)
455
- return envCompletion;
456
- return { tokens: Math.min(fallback.maxOutput, Math.round(envCompletion.percent * contextWindow)) };
457
- })();
458
- // #568: reasoning reserve — exact REASONING_BUDGET > half-completion > env%.
459
- // Using the budget directly prevents double-counting (half of 250K = 125K when
460
- // the actual budget is 8K). Half-completion is the adaptive heuristic when
461
- // reasoning=adaptive (budget=null). The env% is the last resort (only reached
462
- // when contextWindow is null AND reasoning=adaptive).
463
- const resolvedCompletion = resolveReserve(completionReserve, contextWindow);
464
- const reasoningReserve = (() => {
465
- if ("tokens" in envReasoning)
466
- return envReasoning; // operator absolute always wins
467
- if (reasoning.budget !== null)
468
- return { tokens: reasoning.budget }; // exact budget when reasoning=on
469
- if (resolvedCompletion !== null)
470
- return { tokens: Math.round(resolvedCompletion / 2) }; // half-completion for adaptive
471
- return envReasoning; // last resort: env percentage
472
- })();
473
- return new OpenAICompatProvider({
474
- model: wireModel,
475
- url,
476
- headers,
477
- contextWindow,
478
- fetchTimeoutMs,
479
- streamIdleTimeoutMs,
480
- reasoning,
481
- temperature: parseRequiredFloat(env.PLURNK_PROVIDERS_TEMPERATURE, "PLURNK_PROVIDERS_TEMPERATURE", name, 0),
482
- repeatPenalty: parseRequiredFloat(env.PLURNK_PROVIDERS_REPEAT_PENALTY, "PLURNK_PROVIDERS_REPEAT_PENALTY", name, 0),
483
- frequencyPenalty: spec.suppressFrequencyPenalty === true ? 0 : parseRequiredFloat(env.PLURNK_PROVIDERS_FREQUENCY_PENALTY, "PLURNK_PROVIDERS_FREQUENCY_PENALTY", name, 0),
484
- // #567: llama.cpp loop-breakers — optional, off by default (absent = the box's own
485
- // default). The provider sends them only on the llamacpp path; values are operator config.
486
- dryMultiplier: parseOptionalFloat(env.PLURNK_PROVIDERS_DRY_MULTIPLIER, "PLURNK_PROVIDERS_DRY_MULTIPLIER", name, 0) ?? undefined,
487
- dryBase: parseOptionalFloat(env.PLURNK_PROVIDERS_DRY_BASE, "PLURNK_PROVIDERS_DRY_BASE", name, 0) ?? undefined,
488
- dryAllowedLength: parseOptionalInt(env.PLURNK_PROVIDERS_DRY_ALLOWED_LENGTH, "PLURNK_PROVIDERS_DRY_ALLOWED_LENGTH", name) ?? undefined,
489
- repeatLastN: parseOptionalInt(env.PLURNK_PROVIDERS_REPEAT_LAST_N, "PLURNK_PROVIDERS_REPEAT_LAST_N", name) ?? undefined,
490
- // #507: resolved envelope (catalog-capped completion above) + router-owned-tuning suppression (plurnk).
491
- reasoningReserve,
492
- completionReserve,
493
- tuningFloors: spec.suppressTuningFloors !== true,
494
- retryAttempts: parseRequiredInt(env.PLURNK_PROVIDERS_RETRY_ATTEMPTS, "PLURNK_PROVIDERS_RETRY_ATTEMPTS", name),
495
- reasoningStyle,
496
- calculateCost,
497
- source: providerSource(name),
498
- grammarStyle,
499
- // Optional debug toggle (off by default): validate a transported grammar
500
- // locally and throw on invalid, without sending it to the model (§13).
501
- gbnfDebug: env.PLURNK_PROVIDERS_GBNF_DEBUG !== undefined && env.PLURNK_PROVIDERS_GBNF_DEBUG !== "" && env.PLURNK_PROVIDERS_GBNF_DEBUG !== "0",
502
- // Opt-in data capture (#36), off by default, per-alias-scopable — universal
503
- // across every standard provider (any backend that returns logprobs).
504
- ...dataCaptureFromEnv(env, name),
505
- streaming: spec.streaming,
506
- firstPartyMetadata: spec.firstPartyMetadata,
507
- apiKeyRejectedMessage: spec.apiKeyRejectedMessage,
508
- promptCacheKey: spec.promptCacheKey ?? true, // #518: default-on for standard providers (OpenAI-standard field, 6/6 backends verified accept it); per-spec opt-out below
509
- serviceTier,
510
- supportsSlotPinning,
511
- slotCount,
512
- eosText,
513
- tokenizeUrl,
514
- servedModel,
515
- requiresMaxTokens,
516
- });
517
- };
518
- //# sourceMappingURL=standardProviders.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"standardProviders.js","sourceRoot":"","sources":["../src/standardProviders.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- export type TelemetryEvent = {
2
- source: string;
3
- kind: string;
4
- message?: string | null;
5
- position?: number | null;
6
- };
7
- export type ProviderTelemetryKind = "rate_limit" | "network_failure" | "model_refused" | "invalid_response" | "unauthorized" | "quota_exceeded" | "grammar_invalid" | "grammar_unenforced";
8
- export declare const providerSource: (vendor: string) => string;
9
- export declare class ProviderError extends Error {
10
- readonly source: string;
11
- readonly kind: ProviderTelemetryKind;
12
- readonly status: number | null;
13
- constructor(source: string, kind: ProviderTelemetryKind, message: string, options?: {
14
- status?: number | null;
15
- cause?: unknown;
16
- });
17
- toTelemetryEvent(): TelemetryEvent;
18
- }
19
- export declare const classifyProviderError: (err: unknown) => {
20
- kind: ProviderTelemetryKind;
21
- message: string;
22
- };
23
- export declare const toProviderError: (err: unknown, source: string) => ProviderError;
24
- //# sourceMappingURL=telemetry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,cAAc,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAGF,MAAM,MAAM,qBAAqB,GAC3B,YAAY,GACZ,iBAAiB,GACjB,eAAe,GACf,kBAAkB,GAClB,cAAc,GACd,gBAAgB,GAIhB,iBAAiB,GAMjB,oBAAoB,CAAC;AAG3B,eAAO,MAAM,cAAc,WAAY,MAAM,KAAG,MAA8B,CAAC;AAK/E,qBAAa,aAAc,SAAQ,KAAK;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B,YAAY,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,EAMlI;IAED,gBAAgB,IAAI,cAAc,CAEjC;CACJ;AAeD,eAAO,MAAM,qBAAqB,QAAS,OAAO,KAAG;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CA0BlG,CAAC;AAIF,eAAO,MAAM,eAAe,QAAS,OAAO,UAAU,MAAM,KAAG,aAM9D,CAAC"}