@plurnk/plurnk-providers 1.3.4 → 1.3.6

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 (101) hide show
  1. package/.env.defaults +41 -52
  2. package/README.md +44 -53
  3. package/SPEC.md +215 -354
  4. package/dist/AiSdkProvider.d.ts +78 -0
  5. package/dist/AiSdkProvider.d.ts.map +1 -0
  6. package/dist/AiSdkProvider.js +591 -0
  7. package/dist/AiSdkProvider.js.map +1 -0
  8. package/dist/Mock.d.ts +1 -1
  9. package/dist/Mock.d.ts.map +1 -1
  10. package/dist/Mock.js +1 -1
  11. package/dist/Mock.js.map +1 -1
  12. package/dist/OpenAICompat.d.ts +3 -5
  13. package/dist/OpenAICompat.d.ts.map +1 -1
  14. package/dist/OpenAICompat.js +44 -133
  15. package/dist/OpenAICompat.js.map +1 -1
  16. package/dist/Pool.d.ts +1 -1
  17. package/dist/Pool.d.ts.map +1 -1
  18. package/dist/Pool.js +1 -1
  19. package/dist/Pool.js.map +1 -1
  20. package/dist/ProviderRegistry.d.ts.map +1 -1
  21. package/dist/ProviderRegistry.js +37 -24
  22. package/dist/ProviderRegistry.js.map +1 -1
  23. package/dist/aiSdkTransport.d.ts +52 -0
  24. package/dist/aiSdkTransport.d.ts.map +1 -0
  25. package/dist/aiSdkTransport.js +294 -0
  26. package/dist/aiSdkTransport.js.map +1 -0
  27. package/dist/catalogProvider.d.ts +15 -0
  28. package/dist/catalogProvider.d.ts.map +1 -0
  29. package/dist/catalogProvider.js +103 -0
  30. package/dist/catalogProvider.js.map +1 -0
  31. package/dist/compatibleProvider.d.ts +3 -0
  32. package/dist/compatibleProvider.d.ts.map +1 -0
  33. package/dist/compatibleProvider.js +146 -0
  34. package/dist/compatibleProvider.js.map +1 -0
  35. package/dist/discover.d.ts.map +1 -1
  36. package/dist/discover.js.map +1 -1
  37. package/dist/env.d.ts +1 -0
  38. package/dist/env.d.ts.map +1 -1
  39. package/dist/env.js +13 -6
  40. package/dist/env.js.map +1 -1
  41. package/dist/index.d.ts +5 -7
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +4 -8
  44. package/dist/index.js.map +1 -1
  45. package/dist/ollama.d.ts +3 -0
  46. package/dist/ollama.d.ts.map +1 -0
  47. package/dist/ollama.js +39 -0
  48. package/dist/ollama.js.map +1 -0
  49. package/dist/openai.d.ts +2 -4
  50. package/dist/openai.d.ts.map +1 -1
  51. package/dist/openai.js +1 -2
  52. package/dist/openai.js.map +1 -1
  53. package/dist/sdkModels.d.ts +13 -0
  54. package/dist/sdkModels.d.ts.map +1 -0
  55. package/dist/sdkModels.js +153 -0
  56. package/dist/sdkModels.js.map +1 -0
  57. package/dist/standardProviders.d.ts +0 -1
  58. package/dist/standardProviders.d.ts.map +1 -1
  59. package/dist/standardProviders.js +9 -11
  60. package/dist/standardProviders.js.map +1 -1
  61. package/dist/telemetry.d.ts.map +1 -1
  62. package/dist/telemetry.js +20 -9
  63. package/dist/telemetry.js.map +1 -1
  64. package/dist/types.d.ts +4 -3
  65. package/dist/types.d.ts.map +1 -1
  66. package/dist/usage.d.ts +1 -1
  67. package/dist/usage.d.ts.map +1 -1
  68. package/dist/usage.js +4 -2
  69. package/dist/usage.js.map +1 -1
  70. package/package.json +19 -8
  71. package/src/{OpenAICompat.test.ts → AiSdkProvider.test.ts} +202 -177
  72. package/src/{OpenAICompat.ts → AiSdkProvider.ts} +89 -144
  73. package/src/Mock.test.ts +3 -3
  74. package/src/Mock.ts +1 -1
  75. package/src/Pool.test.ts +3 -3
  76. package/src/Pool.ts +1 -1
  77. package/src/ProviderRegistry.test.ts +40 -27
  78. package/src/ProviderRegistry.ts +35 -24
  79. package/src/aiSdkTransport.test.ts +253 -0
  80. package/src/aiSdkTransport.ts +369 -0
  81. package/src/boundaries.test.ts +2 -2
  82. package/src/catalogProvider.test.ts +100 -0
  83. package/src/catalogProvider.ts +151 -0
  84. package/src/compatibleProvider.test.ts +44 -0
  85. package/src/compatibleProvider.ts +205 -0
  86. package/src/discover.test.ts +12 -12
  87. package/src/discover.ts +3 -6
  88. package/src/env.ts +14 -6
  89. package/src/index.ts +7 -11
  90. package/src/ollama.ts +63 -0
  91. package/src/openai.ts +2 -8
  92. package/src/sdkModels.test.ts +47 -0
  93. package/src/sdkModels.ts +194 -0
  94. package/src/telemetry.test.ts +17 -10
  95. package/src/telemetry.ts +22 -14
  96. package/src/types.ts +10 -13
  97. package/src/usage.test.ts +8 -10
  98. package/src/usage.ts +7 -3
  99. package/src/openaiStream.ts +0 -310
  100. package/src/standardProviders.test.ts +0 -949
  101. package/src/standardProviders.ts +0 -635
@@ -3,12 +3,10 @@
3
3
  // overrides) lives in @plurnk/plurnk-aliases — the zero-dep parser shared with
4
4
  // thin clients (#27); this module resolves the active alias to a Provider.
5
5
  //
6
- // Two-tier resolution (SPEC §5): tier 1 is the closed standard-provider table;
7
- // tier 2 is a SCOPE-AGNOSTIC node_modules scan (discover()) for packages
8
- // declaring `plurnk.kind:"provider"` — first-party plugins (installed flat
9
- // via @plurnk/plurnk-providers-all) AND third-party providers under any scope.
10
- // The framework is contract-only — it does NOT depend on its plugins; the
11
- // scan is what surfaces them (#12/#14).
6
+ // Resolution order (SPEC §5): models.dev catalog → PLURNK provider declaration
7
+ // → local protocol adapter → scope-agnostic AI SDK plugin discovery. Generic
8
+ // provider facts belong to models.dev or operator config; PLURNK owns only the
9
+ // stable Provider contract and product-specific local behavior.
12
10
  var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
13
11
  if (typeof path === "string" && /^\.\.?\//.test(path)) {
14
12
  return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
@@ -17,10 +15,13 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
17
15
  }
18
16
  return path;
19
17
  };
20
- import { isStandardProvider, standardProviderFromEnv } from "./standardProviders.js";
18
+ import { catalogProviderFromEnv, providerFromSdkModel } from "./catalogProvider.js";
21
19
  import { discover } from "./discover.js";
22
20
  import { resolveActiveAlias } from "@plurnk/plurnk-aliases";
23
21
  import { scopeEnvToAlias } from "./env.js";
22
+ import { ollamaProviderFromEnv } from "./ollama.js";
23
+ import { compatibleProviderFromEnv } from "./compatibleProvider.js";
24
+ import { contextWindowFromEnv } from "./env.js";
24
25
  const importModule = (specifier) => import(__rewriteRelativeImportExtension(specifier));
25
26
  // The node_modules scan is filesystem work that never changes within a process,
26
27
  // so it runs once and the result is memoized. A long-lived daemon pays one scan
@@ -31,22 +32,21 @@ const providerPackages = async (discoverFn, env) => {
31
32
  discoveredCache ??= await discoverFn({ env });
32
33
  return discoveredCache;
33
34
  };
34
- // Two-tier resolution (SPEC §5): tier 1 standard table → tier 2 discovered
35
- // package (scope-agnostic scan, trust-gated) → fail-hard. The standard table is
36
- // authoritative — a scanned package whose name duplicates a standard one is
37
- // shadowed here (never reached), since tier 1 returns first.
35
+ // Catalog and explicit declarations are authoritative. Discovery is the
36
+ // extensibility seam for an AI SDK provider that neither source describes.
38
37
  export const instantiateProvider = async (name, env, model, importImpl = importModule, discoverFn = discover, baseUrl, // per-alias endpoint override (PLURNK_BASEURL_<alias>); threaded to both tiers
39
38
  alias) => {
40
- // Per-alias knob scoping: overlay any _<alias>-suffixed knob onto its bare
41
- // name so both tiers (and every fromEnv) read plain vars, per-alias-resolved.
39
+ // Per-alias knob scoping overlays _<alias>-suffixed knobs onto their bare
40
+ // names before any resolver reads them.
42
41
  if (alias !== undefined)
43
42
  env = scopeEnvToAlias(env, alias);
44
- if (isStandardProvider(name)) {
45
- const standard = await standardProviderFromEnv(name, env, model, baseUrl);
46
- if (standard === null)
47
- throw new Error(`provider "${name}": standard registry resolution failed`);
48
- return standard;
49
- }
43
+ const catalog = catalogProviderFromEnv(name, env, model, baseUrl);
44
+ if (catalog !== null)
45
+ return catalog;
46
+ if (name === "ollama")
47
+ return ollamaProviderFromEnv(env, model, baseUrl === undefined ? undefined : { baseUrl });
48
+ if (name === "openai" || name === "plurnk")
49
+ return compatibleProviderFromEnv(name, env, model, baseUrl);
50
50
  const { registry, skipped } = await providerPackages(discoverFn, env);
51
51
  const specifier = registry.get(name);
52
52
  if (specifier === undefined) {
@@ -54,7 +54,7 @@ alias) => {
54
54
  if (declined !== undefined) {
55
55
  throw new Error(`provider "${name}" resolves to ${declined}, but it is untrusted under PLURNK_PLUGINS_TRUSTED_ONLY — add it to the allowlist (or publish under @plurnk/)`);
56
56
  }
57
- throw new Error(`unknown provider "${name}": not a standard provider, and no installed package declares plurnk.kind:"provider" with name "${name}"`);
57
+ throw new Error(`unknown provider "${name}": absent from models.dev, operator declarations, local adapters, and installed AI SDK provider plugins`);
58
58
  }
59
59
  let mod;
60
60
  try {
@@ -63,11 +63,24 @@ alias) => {
63
63
  catch (cause) {
64
64
  throw new Error(`provider "${name}" resolves to ${specifier}, but importing it failed`, { cause });
65
65
  }
66
- const factory = mod.default;
67
- if (factory === undefined || typeof factory.fromEnv !== "function") {
68
- throw new Error(`${specifier} default export is not a Provider factory (missing static fromEnv)`);
66
+ const sdkProvider = mod.default;
67
+ if (sdkProvider === undefined || typeof sdkProvider.languageModel !== "function") {
68
+ throw new Error(`${specifier} default export is not an AI SDK provider (missing languageModel)`);
69
+ }
70
+ if (baseUrl !== undefined) {
71
+ throw new Error(`${specifier}: PLURNK_BASEURL_${alias ?? "<alias>"} cannot reconfigure an installed AI SDK provider; declare the provider through PLURNK_PROVIDERS_PROVIDER_* instead`);
72
+ }
73
+ const contextWindow = contextWindowFromEnv(env, name);
74
+ if (contextWindow === null) {
75
+ throw new Error(`${specifier}: PLURNK_PROVIDERS_CONTEXT_WINDOW must be set because Models.dev has no metadata for provider "${name}"`);
69
76
  }
70
- return await factory.fromEnv(env, model, baseUrl !== undefined ? { baseUrl } : undefined);
77
+ return providerFromSdkModel({
78
+ name,
79
+ env,
80
+ model,
81
+ languageModel: sdkProvider.languageModel(model),
82
+ contextWindow,
83
+ });
71
84
  };
72
85
  // Test-only: drop the memoized discovery so a fresh scan/injection runs next.
73
86
  export const resetDiscoveryCache = () => { discoveredCache = null; };
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderRegistry.js","sourceRoot":"","sources":["../src/ProviderRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProviderRegistry.js","sourceRoot":"","sources":["../src/ProviderRegistry.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,2EAA2E;AAC3E,+EAA+E;AAC/E,2EAA2E;AAC3E,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,+EAA+E;AAC/E,gEAAgE;;;;;;;;;AAGhE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAwC,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAMhD,MAAM,YAAY,GAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,kCAAC,SAAS,EAAC,CAAC;AAGpE,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,sEAAsE;AACtE,IAAI,eAAe,GAAqB,IAAI,CAAC;AAC7C,MAAM,gBAAgB,GAAG,KAAK,EAAE,UAAsB,EAAE,GAAsB,EAAsB,EAAE;IAClG,eAAe,KAAK,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,OAAO,eAAe,CAAC;AAC3B,CAAC,CAAC;AAEF,wEAAwE;AACxE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACpC,IAAY,EACZ,GAAsB,EACtB,KAAa,EACb,UAAU,GAAiB,YAAY,EACvC,UAAU,GAAe,QAAQ,EACjC,OAAgB,EAAE,+EAA+E;AACjG,KAAc,EACG,EAAE;IACnB,0EAA0E;IAC1E,wCAAwC;IACxC,IAAI,KAAK,KAAK,SAAS;QAAE,GAAG,GAAG,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAClE,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IACrC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACjH,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,yBAAyB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACxG,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,iBAAiB,QAAQ,+GAA+G,CAAC,CAAC;QAC/K,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,yGAAyG,CAAC,CAAC;IACxJ,CAAC;IACD,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACD,GAAG,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,iBAAiB,SAAS,2BAA2B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,MAAM,WAAW,GAAI,GAAyC,CAAC,OAAO,CAAC;IACvE,IAAI,WAAW,KAAK,SAAS,IAAI,OAAO,WAAW,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,mEAAmE,CAAC,CAAC;IACrG,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,oBAAoB,KAAK,IAAI,SAAS,oHAAoH,CAAC,CAAC;IAC5L,CAAC;IACD,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtD,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,kGAAkG,IAAI,GAAG,CAAC,CAAC;IAC3I,CAAC;IACD,OAAO,oBAAoB,CAAC;QACxB,IAAI;QACJ,GAAG;QACH,KAAK;QACL,aAAa,EAAE,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC;QAC/C,aAAa;KAChB,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAS,EAAE,GAAG,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAE3E,yEAAyE;AACzE,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACnC,GAAG,GAAsB,OAAO,CAAC,GAAG,EACpC,UAAU,GAAiB,YAAY,EACvC,UAAU,GAAe,QAAQ,EAChB,EAAE;IACnB,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uGAAuG,CAAC,CAAC;IAC7H,CAAC;IACD,OAAO,mBAAmB,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AACrH,CAAC,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { type JSONValue, type LanguageModel } from "ai";
2
+ import type { ChatMessage, FinishReason, ProviderUsage, TokenLogprob } from "./types.ts";
3
+ export type AiSdkTransportRequest = {
4
+ url: string;
5
+ model: string;
6
+ headers: Record<string, string>;
7
+ body: Record<string, unknown>;
8
+ messages: ChatMessage[];
9
+ signal?: AbortSignal;
10
+ fetch?: typeof globalThis.fetch;
11
+ fetchTimeoutMs: number;
12
+ streamIdleTimeoutMs?: number;
13
+ retryAttempts: number;
14
+ streaming: boolean;
15
+ captureRawBody: boolean;
16
+ };
17
+ export type AiSdkTransportResponse = {
18
+ model: string;
19
+ content: string;
20
+ reasoning: string;
21
+ finishReason: FinishReason;
22
+ usage: ProviderUsage;
23
+ metadata: Record<string, unknown>;
24
+ reasoningEncrypted: Array<{
25
+ id: string | null;
26
+ subtype: string;
27
+ encrypted: Array<{
28
+ data: string;
29
+ format: string | null;
30
+ }>;
31
+ }>;
32
+ logprobs: TokenLogprob[];
33
+ rawBody?: unknown;
34
+ };
35
+ export type AiSdkModelRequest = Omit<AiSdkTransportRequest, "url" | "model" | "body" | "fetch"> & {
36
+ languageModel: LanguageModel;
37
+ providerOptions?: Record<string, Record<string, JSONValue | undefined>>;
38
+ temperature?: number;
39
+ topP?: number;
40
+ topK?: number;
41
+ presencePenalty?: number;
42
+ frequencyPenalty?: number;
43
+ stopSequences?: string[];
44
+ seed?: number;
45
+ maxOutputTokens?: number;
46
+ reasoning?: "minimal" | "low" | "medium" | "high" | "xhigh" | "none" | "provider-default";
47
+ };
48
+ declare const executeModel: (request: AiSdkModelRequest) => Promise<AiSdkTransportResponse>;
49
+ export declare const executeAiSdkModel: typeof executeModel;
50
+ export declare const executeOpenAICompatible: (request: AiSdkTransportRequest) => Promise<AiSdkTransportResponse>;
51
+ export {};
52
+ //# sourceMappingURL=aiSdkTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiSdkTransport.d.ts","sourceRoot":"","sources":["../src/aiSdkTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,SAAS,EAAE,KAAK,aAAa,EAA2B,MAAM,IAAI,CAAC;AAE3G,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgHzF,MAAM,MAAM,qBAAqB,GAAG;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,kBAAkB,EAAE,KAAK,CAAC;QACtB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC,CAAC;KAC7D,CAAC,CAAC;IACH,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG;IAC9F,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,kBAAkB,CAAC;CAC7F,CAAC;AAEF,QAAA,MAAM,YAAY,YACL,iBAAiB,KAC3B,OAAO,CAAC,sBAAsB,CAwGhC,CAAC;AAEF,eAAO,MAAM,iBAAiB,qBAAe,CAAC;AAE9C,eAAO,MAAM,uBAAuB,YACvB,qBAAqB,KAC/B,OAAO,CAAC,sBAAsB,CA4BhC,CAAC"}
@@ -0,0 +1,294 @@
1
+ import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
2
+ import { generateText, streamText } from "ai";
3
+ import { z } from "zod/v4";
4
+ import { normalizeUsage } from "./usage.js";
5
+ import { emitWarningOnce } from "./warnings.js";
6
+ const errorSchema = z.object({
7
+ error: z.object({
8
+ message: z.string(),
9
+ type: z.string().nullish(),
10
+ param: z.unknown().nullish(),
11
+ code: z.union([z.string(), z.number()]).nullish(),
12
+ }).passthrough(),
13
+ }).passthrough();
14
+ const errorStructure = {
15
+ errorSchema,
16
+ errorToMessage: ({ error }) => error.message,
17
+ isRetryable(response) {
18
+ const directive = response.headers.get("x-should-retry")?.trim().toLowerCase();
19
+ if (directive === "false")
20
+ return false;
21
+ if (directive === "true")
22
+ return true;
23
+ if (response.status >= 520 && response.status <= 527)
24
+ return false;
25
+ return response.status === 408
26
+ || response.status === 409
27
+ || response.status === 429
28
+ || response.status >= 500;
29
+ },
30
+ };
31
+ const baseUrl = (completionUrl) => {
32
+ const url = new URL(completionUrl);
33
+ if (!url.pathname.endsWith("/chat/completions")) {
34
+ throw new Error(`OpenAI-compatible URL must end in /chat/completions: ${completionUrl}`);
35
+ }
36
+ url.pathname = url.pathname.slice(0, -"/chat/completions".length);
37
+ return url.toString().replace(/\/$/, "");
38
+ };
39
+ const usageOf = (usage, reasoningText, contentText) => normalizeUsage({
40
+ prompt_tokens: usage.inputTokens,
41
+ completion_tokens: usage.outputTokens,
42
+ total_tokens: usage.totalTokens,
43
+ prompt_tokens_details: { cached_tokens: usage.inputTokenDetails.cacheReadTokens },
44
+ completion_tokens_details: usage.outputTokenDetails.reasoningTokens !== undefined
45
+ ? { reasoning_tokens: usage.outputTokenDetails.reasoningTokens }
46
+ : undefined,
47
+ }, reasoningText, contentText);
48
+ const wireUsageOf = (values, reasoningText, contentText) => {
49
+ for (let index = values.length - 1; index >= 0; index -= 1) {
50
+ const usage = recordOf(values[index])?.usage;
51
+ if (usage !== null && typeof usage === "object") {
52
+ return normalizeUsage(usage, reasoningText, contentText);
53
+ }
54
+ }
55
+ return null;
56
+ };
57
+ const finishReasonOf = (reason) => {
58
+ switch (reason?.toLowerCase()) {
59
+ case "stop":
60
+ case "end_turn":
61
+ case "stop_sequence":
62
+ case "eos_token":
63
+ return "stop";
64
+ case "length":
65
+ case "max_tokens":
66
+ case "model_length":
67
+ case "max_completion_tokens":
68
+ return "length";
69
+ case "tool_calls":
70
+ case "tool_use":
71
+ return "tool_calls";
72
+ case "content_filter":
73
+ case "safety":
74
+ case "recitation":
75
+ return "content_filter";
76
+ default:
77
+ if (reason !== undefined && reason.length > 0) {
78
+ emitWarningOnce(`unrecognized finish_reason "${reason}"; treated as no-signal (finishReason=null). If it denotes a token-cap hit, core's length-cap detection will miss it.`, "PLURNK_FINISH_REASON_UNKNOWN");
79
+ }
80
+ return null;
81
+ }
82
+ };
83
+ const recordOf = (value) => value !== null && typeof value === "object"
84
+ ? value
85
+ : null;
86
+ const metadataOf = (values) => {
87
+ const metadata = {};
88
+ for (const value of values) {
89
+ const record = recordOf(value);
90
+ if (record === null)
91
+ continue;
92
+ for (const [key, item] of Object.entries(record)) {
93
+ if (key !== "choices" && key !== "usage")
94
+ metadata[key] = item;
95
+ }
96
+ }
97
+ return metadata;
98
+ };
99
+ const executeModel = async (request) => {
100
+ const { languageModel: model, providerOptions, temperature, topP, topK, presencePenalty, frequencyPenalty, stopSequences, seed, maxOutputTokens, reasoning, } = request;
101
+ const settings = {
102
+ ...(temperature === undefined ? {} : { temperature }),
103
+ ...(topP === undefined ? {} : { topP }),
104
+ ...(topK === undefined ? {} : { topK }),
105
+ ...(presencePenalty === undefined ? {} : { presencePenalty }),
106
+ ...(frequencyPenalty === undefined ? {} : { frequencyPenalty }),
107
+ ...(stopSequences === undefined ? {} : { stopSequences }),
108
+ ...(seed === undefined ? {} : { seed }),
109
+ ...(maxOutputTokens === undefined ? {} : { maxOutputTokens }),
110
+ ...(reasoning === undefined ? {} : { reasoning }),
111
+ ...(providerOptions === undefined ? {} : { providerOptions }),
112
+ };
113
+ const firstNonSystem = request.messages.findIndex((message) => message.role !== "system");
114
+ const instructionCount = firstNonSystem === -1 ? request.messages.length : firstNonSystem;
115
+ if (request.messages.slice(instructionCount).some((message) => message.role === "system")) {
116
+ throw new Error("provider messages: system instructions must precede conversational messages");
117
+ }
118
+ const instructions = request.messages.slice(0, instructionCount).map(({ content }) => ({
119
+ role: "system",
120
+ content,
121
+ }));
122
+ const messages = request.messages.slice(instructionCount);
123
+ const common = {
124
+ model,
125
+ ...(instructions.length === 0 ? {} : { instructions }),
126
+ messages: messages.length > 0
127
+ ? messages
128
+ : [{ role: "user", content: "" }],
129
+ maxRetries: request.retryAttempts,
130
+ abortSignal: request.signal,
131
+ headers: request.headers,
132
+ timeout: {
133
+ totalMs: request.fetchTimeoutMs,
134
+ ...(request.streamIdleTimeoutMs !== undefined && request.streamIdleTimeoutMs > 0
135
+ ? { chunkMs: request.streamIdleTimeoutMs }
136
+ : {}),
137
+ },
138
+ ...settings,
139
+ };
140
+ if (!request.streaming) {
141
+ const result = await generateText({
142
+ ...common,
143
+ include: { responseBody: true },
144
+ });
145
+ const rawBody = result.response.body;
146
+ const values = [rawBody];
147
+ const evidence = extractEvidence(values);
148
+ const reasoningText = evidence.reasoning || result.reasoningText || "";
149
+ return {
150
+ model: result.response.modelId,
151
+ content: result.text,
152
+ reasoning: reasoningText,
153
+ finishReason: finishReasonOf(result.rawFinishReason),
154
+ usage: wireUsageOf(values, reasoningText, result.text)
155
+ ?? usageOf(result.usage, reasoningText, result.text),
156
+ metadata: metadataOf(values),
157
+ reasoningEncrypted: evidence.reasoningEncrypted,
158
+ logprobs: evidence.logprobs,
159
+ ...(request.captureRawBody ? { rawBody } : {}),
160
+ };
161
+ }
162
+ const result = streamText({
163
+ ...common,
164
+ includeRawChunks: true,
165
+ onError: () => { },
166
+ });
167
+ const rawChunks = [];
168
+ let streamError;
169
+ for await (const part of result.fullStream) {
170
+ if (part.type === "raw")
171
+ rawChunks.push(part.rawValue);
172
+ if (part.type === "error")
173
+ streamError ??= part.error;
174
+ }
175
+ if (streamError !== undefined)
176
+ throw streamError;
177
+ const evidence = extractEvidence(rawChunks);
178
+ const content = await result.text;
179
+ const reasoningText = evidence.reasoning || (await result.reasoningText) || "";
180
+ return {
181
+ model: (await result.response).modelId,
182
+ content,
183
+ reasoning: reasoningText,
184
+ finishReason: finishReasonOf(await result.rawFinishReason),
185
+ usage: wireUsageOf(rawChunks, reasoningText, content)
186
+ ?? usageOf(await result.usage, reasoningText, content),
187
+ metadata: metadataOf(rawChunks),
188
+ reasoningEncrypted: evidence.reasoningEncrypted,
189
+ logprobs: evidence.logprobs,
190
+ ...(request.captureRawBody ? { rawBody: rawChunks } : {}),
191
+ };
192
+ };
193
+ export const executeAiSdkModel = executeModel;
194
+ export const executeOpenAICompatible = async (request) => {
195
+ const provider = createOpenAICompatible({
196
+ name: "plurnk",
197
+ baseURL: baseUrl(request.url),
198
+ headers: request.headers,
199
+ fetch: request.fetch,
200
+ includeUsage: true,
201
+ transformRequestBody: (sdkBody) => ({
202
+ ...sdkBody,
203
+ ...request.body,
204
+ stream: sdkBody.stream,
205
+ ...(sdkBody.stream_options !== undefined
206
+ ? { stream_options: sdkBody.stream_options }
207
+ : {}),
208
+ }),
209
+ });
210
+ const model = provider.languageModel(request.model, { errorStructure });
211
+ return executeModel({
212
+ languageModel: model,
213
+ headers: {},
214
+ messages: request.messages,
215
+ signal: request.signal,
216
+ fetchTimeoutMs: request.fetchTimeoutMs,
217
+ streamIdleTimeoutMs: request.streamIdleTimeoutMs,
218
+ retryAttempts: request.retryAttempts,
219
+ streaming: request.streaming,
220
+ captureRawBody: request.captureRawBody,
221
+ });
222
+ };
223
+ const extractEvidence = (values) => {
224
+ const encrypted = new Map();
225
+ const logprobs = [];
226
+ let reasoning = "";
227
+ let anonymous = 0;
228
+ for (const value of values) {
229
+ const choices = recordOf(value)?.choices;
230
+ if (!Array.isArray(choices))
231
+ continue;
232
+ const choice = recordOf(choices[0]);
233
+ if (choice === null)
234
+ continue;
235
+ const logprobRecord = recordOf(choice.logprobs);
236
+ const entries = logprobRecord?.content;
237
+ if (Array.isArray(entries)) {
238
+ for (const value of entries) {
239
+ const entry = recordOf(value);
240
+ if (typeof entry?.token !== "string" || typeof entry.logprob !== "number")
241
+ continue;
242
+ const top = Array.isArray(entry.top_logprobs)
243
+ ? entry.top_logprobs.flatMap((value) => {
244
+ const item = recordOf(value);
245
+ return typeof item?.token === "string" && typeof item.logprob === "number"
246
+ ? [{ token: item.token, logprob: item.logprob }]
247
+ : [];
248
+ })
249
+ : undefined;
250
+ logprobs.push(top === undefined
251
+ ? { token: entry.token, logprob: entry.logprob }
252
+ : { token: entry.token, logprob: entry.logprob, top });
253
+ }
254
+ }
255
+ const message = recordOf(choice.delta) ?? recordOf(choice.message) ?? {};
256
+ for (const key of ["reasoning_content", "reasoning", "thinking"]) { // lexicon-allow: backend wire fields
257
+ if (typeof message[key] === "string")
258
+ reasoning += message[key];
259
+ }
260
+ if (!Array.isArray(message.reasoning_details))
261
+ continue;
262
+ for (const value of message.reasoning_details) {
263
+ const detail = recordOf(value);
264
+ if (detail?.type !== "reasoning.encrypted" || typeof detail.data !== "string")
265
+ continue;
266
+ const id = typeof detail.id === "string" ? detail.id : null;
267
+ const key = typeof detail.index === "number"
268
+ ? `index:${detail.index}`
269
+ : id === null ? `anonymous:${anonymous++}` : `id:${id}`;
270
+ const item = encrypted.get(key) ?? {
271
+ id,
272
+ subtype: "message",
273
+ encrypted: [],
274
+ };
275
+ const format = typeof detail.format === "string" ? detail.format : null;
276
+ const prior = item.encrypted.at(-1);
277
+ if (prior !== undefined) {
278
+ prior.data += detail.data;
279
+ if (prior.format === null && format !== null)
280
+ prior.format = format;
281
+ }
282
+ else {
283
+ item.encrypted.push({ data: detail.data, format });
284
+ }
285
+ encrypted.set(key, item);
286
+ }
287
+ }
288
+ return {
289
+ reasoningEncrypted: [...encrypted.values()],
290
+ logprobs,
291
+ reasoning,
292
+ };
293
+ };
294
+ //# sourceMappingURL=aiSdkTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiSdkTransport.js","sourceRoot":"","sources":["../src/aiSdkTransport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type ModelInfo } from "@plurnk/plurnk-models";
2
+ import type { Provider } from "./types.ts";
3
+ import type { LanguageModel } from "ai";
4
+ export declare const providerFromSdkModel: ({ name, env, model, languageModel, url, headers, contextWindow, info, }: {
5
+ name: string;
6
+ env: NodeJS.ProcessEnv;
7
+ model: string;
8
+ languageModel?: LanguageModel;
9
+ url?: string;
10
+ headers?: Readonly<Record<string, string>>;
11
+ contextWindow: number;
12
+ info?: ModelInfo;
13
+ }) => Provider;
14
+ export declare const catalogProviderFromEnv: (name: string, env: NodeJS.ProcessEnv, model: string, baseUrlOverride?: string) => Provider | null;
15
+ //# sourceMappingURL=catalogProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalogProvider.d.ts","sourceRoot":"","sources":["../src/catalogProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAerF,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AAG1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAmBxC,eAAO,MAAM,oBAAoB,4EAS9B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,SAAS,CAAC;CACpB,KAAG,QAwDH,CAAC;AAEF,eAAO,MAAM,sBAAsB,SACzB,MAAM,OACP,MAAM,CAAC,UAAU,SACf,MAAM,oBACK,MAAM,KACzB,QAAQ,GAAG,IAgCb,CAAC"}
@@ -0,0 +1,103 @@
1
+ import { lookupProvider, resolveModel } from "@plurnk/plurnk-models";
2
+ import { contextWindowFromEnv, dataCaptureFromEnv, envelopeFromEnv, parseRequiredFloat, parseRequiredInt, promptCacheKeyFromEnv, reasoningFromEnv, resolveReserve, } from "./env.js";
3
+ import AiSdkProvider from "./AiSdkProvider.js";
4
+ import { configuredProviderInfo, createSdkModel } from "./sdkModels.js";
5
+ import { providerSource } from "./telemetry.js";
6
+ import { calculateCostUsd } from "./usage.js";
7
+ import { emitWarningOnce } from "./warnings.js";
8
+ const reasoningStyleFromEnv = (env, name) => {
9
+ const prefix = name.replaceAll(/[^a-zA-Z0-9]/g, "_").toUpperCase();
10
+ const value = env[`PLURNK_PROVIDERS_PROVIDER_${prefix}_REASONING_STYLE`];
11
+ if (value === undefined || value.length === 0)
12
+ return undefined;
13
+ const styles = [
14
+ "none", "think", "include_reasoning", "effort",
15
+ "effort_explicit", "template", "anthropic",
16
+ ];
17
+ if (!styles.includes(value)) {
18
+ throw new Error(`${name} provider: PLURNK_PROVIDERS_PROVIDER_${prefix}_REASONING_STYLE has invalid value "${value}"`);
19
+ }
20
+ return value;
21
+ };
22
+ export const providerFromSdkModel = ({ name, env, model, languageModel, url, headers, contextWindow, info, }) => {
23
+ emitWarningOnce(`${name} provider: countTokens is a chars/2 upper bound — exact counts come from the mimetypes tokenizer seam or tokenize()`, "PLURNK_TOKENIZER_HEURISTIC");
24
+ const reasoning = reasoningFromEnv(env, name);
25
+ const { reasoningReserve: configuredReasoning, completionReserve: configuredCompletion } = envelopeFromEnv(env, name);
26
+ const completionReserve = "tokens" in configuredCompletion
27
+ ? configuredCompletion
28
+ : info?.maxOutput === undefined
29
+ ? configuredCompletion
30
+ : { tokens: Math.min(info.maxOutput, Math.round(configuredCompletion.percent * contextWindow)) };
31
+ const completionTokens = resolveReserve(completionReserve, contextWindow);
32
+ const reasoningReserve = "tokens" in configuredReasoning
33
+ ? configuredReasoning
34
+ : reasoning.budget !== null
35
+ ? { tokens: reasoning.budget }
36
+ : completionTokens === null
37
+ ? configuredReasoning
38
+ : { tokens: Math.round(completionTokens / 2) };
39
+ const cost = info?.cost;
40
+ const calculateCost = cost === undefined
41
+ ? undefined
42
+ : (usage) => calculateCostUsd(usage, {
43
+ input: cost.inputPer1M,
44
+ output: cost.outputPer1M,
45
+ cached: cost.cacheReadPer1M ?? cost.inputPer1M,
46
+ });
47
+ return new AiSdkProvider({
48
+ model,
49
+ ...(languageModel === undefined ? {} : { languageModel }),
50
+ ...(url === undefined ? {} : { url }),
51
+ ...(headers === undefined ? {} : { headers: { ...headers } }),
52
+ contextWindow,
53
+ fetchTimeoutMs: parseRequiredInt(env.PLURNK_PROVIDERS_FETCH_TIMEOUT, "PLURNK_PROVIDERS_FETCH_TIMEOUT", name),
54
+ streamIdleTimeoutMs: parseRequiredInt(env.PLURNK_PROVIDERS_STREAM_IDLE_TIMEOUT, "PLURNK_PROVIDERS_STREAM_IDLE_TIMEOUT", name),
55
+ reasoning,
56
+ temperature: parseRequiredFloat(env.PLURNK_PROVIDERS_TEMPERATURE, "PLURNK_PROVIDERS_TEMPERATURE", name, 0),
57
+ repeatPenalty: parseRequiredFloat(env.PLURNK_PROVIDERS_REPEAT_PENALTY, "PLURNK_PROVIDERS_REPEAT_PENALTY", name, 0),
58
+ frequencyPenalty: parseRequiredFloat(env.PLURNK_PROVIDERS_FREQUENCY_PENALTY, "PLURNK_PROVIDERS_FREQUENCY_PENALTY", name, 0),
59
+ reasoningReserve,
60
+ completionReserve,
61
+ retryAttempts: parseRequiredInt(env.PLURNK_PROVIDERS_RETRY_ATTEMPTS, "PLURNK_PROVIDERS_RETRY_ATTEMPTS", name),
62
+ reasoningStyle: reasoningStyleFromEnv(env, name),
63
+ promptCacheKey: url === undefined ? false : promptCacheKeyFromEnv(env, name),
64
+ serviceTier: env.PLURNK_PROVIDERS_SERVICE_TIER,
65
+ calculateCost,
66
+ source: providerSource(name),
67
+ gbnfDebug: env.PLURNK_PROVIDERS_GBNF_DEBUG !== undefined
68
+ && env.PLURNK_PROVIDERS_GBNF_DEBUG !== ""
69
+ && env.PLURNK_PROVIDERS_GBNF_DEBUG !== "0",
70
+ ...dataCaptureFromEnv(env, name),
71
+ });
72
+ };
73
+ export const catalogProviderFromEnv = (name, env, model, baseUrlOverride) => {
74
+ const resolved = resolveModel(name, model);
75
+ const contextOverride = contextWindowFromEnv(env, name);
76
+ if (lookupProvider(name) === null && configuredProviderInfo(name, env) === null)
77
+ return null;
78
+ if (name === "openai" && resolved === null)
79
+ return null;
80
+ if (resolved === null && contextOverride === null)
81
+ return null;
82
+ const wireModel = resolved?.id ?? model;
83
+ const sdk = createSdkModel(name, wireModel, env, baseUrlOverride);
84
+ if (sdk === null)
85
+ return null;
86
+ emitWarningOnce(`${name} provider: countTokens is a chars/2 upper bound — exact counts come from the mimetypes tokenizer seam or tokenize()`, "PLURNK_TOKENIZER_HEURISTIC");
87
+ const info = resolved?.info;
88
+ const contextWindow = contextOverride ?? info?.contextWindow ?? null;
89
+ if (contextWindow === null) {
90
+ throw new Error(`${name} provider: context window unresolved for "${wireModel}" — set PLURNK_PROVIDERS_CONTEXT_WINDOW or update the Models.dev snapshot`);
91
+ }
92
+ return providerFromSdkModel({
93
+ name,
94
+ env,
95
+ model: wireModel,
96
+ languageModel: sdk.languageModel,
97
+ url: sdk.compatible?.url,
98
+ headers: sdk.compatible?.headers,
99
+ contextWindow,
100
+ info,
101
+ });
102
+ };
103
+ //# sourceMappingURL=catalogProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalogProvider.js","sourceRoot":"","sources":["../src/catalogProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Provider } from "./types.ts";
2
+ export declare const compatibleProviderFromEnv: (provider: "openai" | "plurnk", env: NodeJS.ProcessEnv, model: string, baseUrlOverride?: string) => Promise<Provider>;
3
+ //# sourceMappingURL=compatibleProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibleProvider.d.ts","sourceRoot":"","sources":["../src/compatibleProvider.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA6F3C,eAAO,MAAM,yBAAyB,aACxB,QAAQ,GAAG,QAAQ,OACxB,MAAM,CAAC,UAAU,SACf,MAAM,oBACK,MAAM,KACzB,OAAO,CAAC,QAAQ,CA6FlB,CAAC"}