@polpo-ai/llm 0.5.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/LICENSE +21 -0
- package/dist/api-keys.d.ts +28 -0
- package/dist/api-keys.d.ts.map +1 -0
- package/dist/api-keys.js +54 -0
- package/dist/api-keys.js.map +1 -0
- package/dist/cooldown.d.ts +35 -0
- package/dist/cooldown.d.ts.map +1 -0
- package/dist/cooldown.js +97 -0
- package/dist/cooldown.js.map +1 -0
- package/dist/cost.d.ts +23 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +31 -0
- package/dist/cost.js.map +1 -0
- package/dist/gateway-catalog.d.ts +34 -0
- package/dist/gateway-catalog.d.ts.map +1 -0
- package/dist/gateway-catalog.js +57 -0
- package/dist/gateway-catalog.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/model-resolver.d.ts +129 -0
- package/dist/model-resolver.d.ts.map +1 -0
- package/dist/model-resolver.js +406 -0
- package/dist/model-resolver.js.map +1 -0
- package/dist/provider-factory.d.ts +37 -0
- package/dist/provider-factory.d.ts.map +1 -0
- package/dist/provider-factory.js +110 -0
- package/dist/provider-factory.js.map +1 -0
- package/dist/query.d.ts +37 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +137 -0
- package/dist/query.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model resolution — resolves model specs to AI SDK LanguageModel instances
|
|
3
|
+
* with full metadata. Handles provider overrides, model allowlists,
|
|
4
|
+
* fallback chains, and provider key validation.
|
|
5
|
+
*/
|
|
6
|
+
import { parseModelSpec as _parseModelSpec } from "@polpo-ai/core";
|
|
7
|
+
import { getCatalogSync } from "./gateway-catalog.js";
|
|
8
|
+
import { createCustomProviderModel, createGatewayModel } from "./provider-factory.js";
|
|
9
|
+
import { resolveApiKey, resolveApiKeyAsync, hasOAuthProfiles, PROVIDER_ENV_MAP } from "./api-keys.js";
|
|
10
|
+
// ─── Provider Override Management ────────────────────
|
|
11
|
+
/** Provider overrides from polpo.json — set by the orchestrator at init time. */
|
|
12
|
+
let providerOverrides = {};
|
|
13
|
+
export function setProviderOverrides(overrides) {
|
|
14
|
+
providerOverrides = overrides;
|
|
15
|
+
}
|
|
16
|
+
export function getProviderOverrides() {
|
|
17
|
+
return { ...providerOverrides };
|
|
18
|
+
}
|
|
19
|
+
// ─── Model Allowlist ─────────────────────────────────
|
|
20
|
+
/** Model allowlist — when set, only these models can be used. Set by orchestrator at init. */
|
|
21
|
+
let modelAllowlist;
|
|
22
|
+
export function setModelAllowlist(allowlist) {
|
|
23
|
+
modelAllowlist = allowlist;
|
|
24
|
+
}
|
|
25
|
+
export function getModelAllowlist() {
|
|
26
|
+
return modelAllowlist;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if a model spec is allowed by the allowlist.
|
|
30
|
+
* Returns true if no allowlist is set (everything allowed) or the model is in the list.
|
|
31
|
+
*/
|
|
32
|
+
export function isModelAllowed(spec) {
|
|
33
|
+
if (!modelAllowlist)
|
|
34
|
+
return true;
|
|
35
|
+
// Check exact match
|
|
36
|
+
if (spec in modelAllowlist)
|
|
37
|
+
return true;
|
|
38
|
+
// Check without provider prefix (e.g. "claude-opus-4.6" matches "anthropic:claude-opus-4.6")
|
|
39
|
+
const { provider, modelId } = parseModelSpec(spec);
|
|
40
|
+
const fullSpec = `${provider}:${modelId}`;
|
|
41
|
+
return fullSpec in modelAllowlist;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Enforce model allowlist. Throws if the model is not allowed.
|
|
45
|
+
*/
|
|
46
|
+
export function enforceModelAllowlist(spec) {
|
|
47
|
+
if (!isModelAllowed(spec)) {
|
|
48
|
+
const allowed = Object.keys(modelAllowlist).join(", ");
|
|
49
|
+
throw new Error(`Model "${spec}" is not in the allowlist. Allowed models: ${allowed}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// ─── Model Spec Parsing ──────────────────────────────
|
|
53
|
+
/**
|
|
54
|
+
* Parse a model spec string into provider + modelId.
|
|
55
|
+
* Falls back to POLPO_MODEL env var. Throws if no model is available.
|
|
56
|
+
*/
|
|
57
|
+
export function parseModelSpec(spec) {
|
|
58
|
+
return _parseModelSpec(spec, process.env.POLPO_MODEL);
|
|
59
|
+
}
|
|
60
|
+
// ─── Model Resolution ────────────────────────────────
|
|
61
|
+
/**
|
|
62
|
+
* Resolve a model spec to a ResolvedModel with metadata + AI SDK model instance.
|
|
63
|
+
*
|
|
64
|
+
* Resolution order:
|
|
65
|
+
* 1. If provider has an override with custom baseUrl -> create OpenAI-compatible model
|
|
66
|
+
* 2. Otherwise -> use AI Gateway (provider/modelId format)
|
|
67
|
+
*
|
|
68
|
+
* This ensures custom providers (Ollama, vLLM, etc.) work without being in the gateway.
|
|
69
|
+
*/
|
|
70
|
+
export function resolveModel(spec) {
|
|
71
|
+
const { provider, modelId } = parseModelSpec(spec);
|
|
72
|
+
const override = providerOverrides[provider];
|
|
73
|
+
// Custom provider with baseUrl override -> use @ai-sdk/openai with custom endpoint
|
|
74
|
+
if (override?.baseUrl) {
|
|
75
|
+
const customDef = override.models?.find(m => m.id === modelId);
|
|
76
|
+
const aiModel = createCustomProviderModel(provider, modelId, override);
|
|
77
|
+
if (customDef) {
|
|
78
|
+
return {
|
|
79
|
+
id: customDef.id,
|
|
80
|
+
name: customDef.name,
|
|
81
|
+
provider,
|
|
82
|
+
reasoning: customDef.reasoning ?? false,
|
|
83
|
+
input: customDef.input ?? ["text"],
|
|
84
|
+
cost: customDef.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
85
|
+
contextWindow: customDef.contextWindow ?? 200_000,
|
|
86
|
+
maxTokens: customDef.maxTokens ?? 8192,
|
|
87
|
+
aiModel,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// No custom def — construct minimal metadata
|
|
91
|
+
return {
|
|
92
|
+
id: modelId,
|
|
93
|
+
name: modelId,
|
|
94
|
+
provider,
|
|
95
|
+
reasoning: false,
|
|
96
|
+
input: ["text"],
|
|
97
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
98
|
+
contextWindow: 200_000,
|
|
99
|
+
maxTokens: 8192,
|
|
100
|
+
aiModel,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// Standard provider -> route through AI Gateway
|
|
104
|
+
const aiModel = createGatewayModel(provider, modelId);
|
|
105
|
+
// Try to get metadata from cached catalog
|
|
106
|
+
const catalog = getCatalogSync();
|
|
107
|
+
const gatewayModelId = `${provider}/${modelId}`;
|
|
108
|
+
const entry = catalog.find(m => m.id === gatewayModelId);
|
|
109
|
+
if (entry) {
|
|
110
|
+
const pricing = entry.pricing;
|
|
111
|
+
return {
|
|
112
|
+
id: modelId,
|
|
113
|
+
name: entry.name || modelId,
|
|
114
|
+
provider,
|
|
115
|
+
reasoning: false, // Gateway catalog doesn't expose this directly
|
|
116
|
+
input: ["text"],
|
|
117
|
+
contextWindow: 200_000, // Gateway doesn't expose this; use sensible default
|
|
118
|
+
maxTokens: 8192,
|
|
119
|
+
cost: {
|
|
120
|
+
input: pricing ? parseFloat(pricing.input) : 0,
|
|
121
|
+
output: pricing ? parseFloat(pricing.output) : 0,
|
|
122
|
+
cacheRead: pricing?.cachedInputTokens ? parseFloat(pricing.cachedInputTokens) : 0,
|
|
123
|
+
cacheWrite: pricing?.cacheCreationInputTokens ? parseFloat(pricing.cacheCreationInputTokens) : 0,
|
|
124
|
+
},
|
|
125
|
+
aiModel,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// Not in catalog (yet) — return with defaults. The model may still work via gateway.
|
|
129
|
+
return {
|
|
130
|
+
id: modelId,
|
|
131
|
+
name: modelId,
|
|
132
|
+
provider,
|
|
133
|
+
reasoning: false,
|
|
134
|
+
input: ["text"],
|
|
135
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
136
|
+
contextWindow: 200_000,
|
|
137
|
+
maxTokens: 8192,
|
|
138
|
+
aiModel,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// ─── Model Catalog Queries ───────────────────────────
|
|
142
|
+
/**
|
|
143
|
+
* Get detailed model info for a specific model spec.
|
|
144
|
+
*/
|
|
145
|
+
export function getModelInfo(spec) {
|
|
146
|
+
try {
|
|
147
|
+
const model = resolveModel(spec);
|
|
148
|
+
return {
|
|
149
|
+
id: model.id,
|
|
150
|
+
name: model.name,
|
|
151
|
+
provider: model.provider,
|
|
152
|
+
reasoning: model.reasoning,
|
|
153
|
+
input: model.input,
|
|
154
|
+
contextWindow: model.contextWindow,
|
|
155
|
+
maxTokens: model.maxTokens,
|
|
156
|
+
cost: model.cost,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* List all available providers from the AI Gateway catalog.
|
|
165
|
+
* Returns synchronously from the cache; triggers background refresh if stale.
|
|
166
|
+
*/
|
|
167
|
+
export function listProviders() {
|
|
168
|
+
const catalog = getCatalogSync();
|
|
169
|
+
const providers = new Set();
|
|
170
|
+
for (const entry of catalog) {
|
|
171
|
+
const slashIdx = entry.id.indexOf("/");
|
|
172
|
+
if (slashIdx > 0) {
|
|
173
|
+
providers.add(entry.id.slice(0, slashIdx));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Also include custom provider overrides
|
|
177
|
+
for (const p of Object.keys(providerOverrides)) {
|
|
178
|
+
providers.add(p);
|
|
179
|
+
}
|
|
180
|
+
return Array.from(providers).sort();
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* List all models for a given provider (or all providers if none specified).
|
|
184
|
+
*/
|
|
185
|
+
export function listModels(provider) {
|
|
186
|
+
const catalog = getCatalogSync();
|
|
187
|
+
const models = [];
|
|
188
|
+
for (const entry of catalog) {
|
|
189
|
+
const slashIdx = entry.id.indexOf("/");
|
|
190
|
+
if (slashIdx <= 0)
|
|
191
|
+
continue;
|
|
192
|
+
const entryProvider = entry.id.slice(0, slashIdx);
|
|
193
|
+
const entryModelId = entry.id.slice(slashIdx + 1);
|
|
194
|
+
if (provider && entryProvider !== provider)
|
|
195
|
+
continue;
|
|
196
|
+
const pricing = entry.pricing;
|
|
197
|
+
models.push({
|
|
198
|
+
id: entryModelId,
|
|
199
|
+
name: entry.name || entryModelId,
|
|
200
|
+
provider: entryProvider,
|
|
201
|
+
reasoning: false,
|
|
202
|
+
input: ["text"],
|
|
203
|
+
contextWindow: 200_000,
|
|
204
|
+
maxTokens: 8192,
|
|
205
|
+
cost: {
|
|
206
|
+
input: pricing ? parseFloat(pricing.input) : 0,
|
|
207
|
+
output: pricing ? parseFloat(pricing.output) : 0,
|
|
208
|
+
cacheRead: pricing?.cachedInputTokens ? parseFloat(pricing.cachedInputTokens) : 0,
|
|
209
|
+
cacheWrite: pricing?.cacheCreationInputTokens ? parseFloat(pricing.cacheCreationInputTokens) : 0,
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
// Append custom models from provider overrides
|
|
214
|
+
const overrideProviders = provider ? [provider] : Object.keys(providerOverrides);
|
|
215
|
+
for (const p of overrideProviders) {
|
|
216
|
+
const override = providerOverrides[p];
|
|
217
|
+
if (!override?.models)
|
|
218
|
+
continue;
|
|
219
|
+
for (const m of override.models) {
|
|
220
|
+
models.push({
|
|
221
|
+
id: m.id,
|
|
222
|
+
name: m.name,
|
|
223
|
+
provider: p,
|
|
224
|
+
reasoning: m.reasoning ?? false,
|
|
225
|
+
input: m.input ?? ["text"],
|
|
226
|
+
contextWindow: m.contextWindow ?? 200_000,
|
|
227
|
+
maxTokens: m.maxTokens ?? 8192,
|
|
228
|
+
cost: m.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return models;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Build a dynamic model listing string for system prompts.
|
|
236
|
+
* Uses the gateway catalog instead of hardcoded lists.
|
|
237
|
+
*/
|
|
238
|
+
export function buildModelListingForPrompt() {
|
|
239
|
+
const lines = [
|
|
240
|
+
`Format: "provider:model" (e.g. "anthropic:claude-opus-4.6") or just "model" (auto-inferred from prefix).`,
|
|
241
|
+
];
|
|
242
|
+
const catalog = getCatalogSync();
|
|
243
|
+
// Group models by provider
|
|
244
|
+
const byProvider = new Map();
|
|
245
|
+
for (const entry of catalog) {
|
|
246
|
+
const slashIdx = entry.id.indexOf("/");
|
|
247
|
+
if (slashIdx <= 0)
|
|
248
|
+
continue;
|
|
249
|
+
const provider = entry.id.slice(0, slashIdx);
|
|
250
|
+
if (!byProvider.has(provider))
|
|
251
|
+
byProvider.set(provider, []);
|
|
252
|
+
byProvider.get(provider).push(entry);
|
|
253
|
+
}
|
|
254
|
+
// Show the most relevant providers with their top models
|
|
255
|
+
const FEATURED_PROVIDERS = [
|
|
256
|
+
{ provider: "anthropic", picks: 3 },
|
|
257
|
+
{ provider: "openai", picks: 4 },
|
|
258
|
+
{ provider: "google", picks: 3 },
|
|
259
|
+
{ provider: "mistral", picks: 2 },
|
|
260
|
+
{ provider: "groq", picks: 2 },
|
|
261
|
+
{ provider: "xai", picks: 1 },
|
|
262
|
+
];
|
|
263
|
+
for (const { provider, picks } of FEATURED_PROVIDERS) {
|
|
264
|
+
const models = byProvider.get(provider);
|
|
265
|
+
if (!models || models.length === 0)
|
|
266
|
+
continue;
|
|
267
|
+
const top = models.slice(0, picks);
|
|
268
|
+
const modelStr = top.map(m => {
|
|
269
|
+
const modelId = m.id.slice(m.id.indexOf("/") + 1);
|
|
270
|
+
const tags = [];
|
|
271
|
+
if (m.pricing && parseFloat(m.pricing.input) === 0 && parseFloat(m.pricing.output) === 0) {
|
|
272
|
+
tags.push("FREE");
|
|
273
|
+
}
|
|
274
|
+
const tagStr = tags.length > 0 ? ` (${tags.join(", ")})` : "";
|
|
275
|
+
return `${modelId}${tagStr}`;
|
|
276
|
+
}).join(", ");
|
|
277
|
+
lines.push(`- ${provider}: ${modelStr}`);
|
|
278
|
+
}
|
|
279
|
+
// Count totals
|
|
280
|
+
const totalProviders = byProvider.size + Object.keys(providerOverrides).length;
|
|
281
|
+
const totalModels = catalog.length;
|
|
282
|
+
lines.push(`- ... and ${totalProviders} total providers with ${totalModels}+ models (use "provider:model" format)`);
|
|
283
|
+
lines.push(`Configure your default model in .polpo/polpo.json or via the POLPO_MODEL env var.`);
|
|
284
|
+
return lines.join("\n");
|
|
285
|
+
}
|
|
286
|
+
// ─── ModelConfig Helpers ─────────────────────────────
|
|
287
|
+
/**
|
|
288
|
+
* Normalize a model spec that may be string or ModelConfig into a plain string.
|
|
289
|
+
* Useful for APIs that only accept a string model spec.
|
|
290
|
+
*/
|
|
291
|
+
export function resolveModelSpec(spec) {
|
|
292
|
+
if (spec === undefined)
|
|
293
|
+
return undefined;
|
|
294
|
+
if (typeof spec === "string")
|
|
295
|
+
return spec;
|
|
296
|
+
return spec.primary;
|
|
297
|
+
}
|
|
298
|
+
// ─── Model Fallback Chain ────────────────────────────
|
|
299
|
+
/**
|
|
300
|
+
* Resolve a model from a fallback chain (synchronous).
|
|
301
|
+
* Tries primary first, then each fallback in order.
|
|
302
|
+
* Returns the first model that has a valid API key.
|
|
303
|
+
*/
|
|
304
|
+
export function resolveModelWithFallback(config) {
|
|
305
|
+
const primary = config.primary;
|
|
306
|
+
if (!primary) {
|
|
307
|
+
throw new Error("No primary model configured. Run 'polpo setup' or set POLPO_MODEL env var.");
|
|
308
|
+
}
|
|
309
|
+
const { provider: primaryProvider } = parseModelSpec(primary);
|
|
310
|
+
if (resolveApiKey(primaryProvider)) {
|
|
311
|
+
try {
|
|
312
|
+
return { model: resolveModel(primary), spec: primary };
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
// Primary model not found — try fallbacks
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (config.fallbacks) {
|
|
319
|
+
for (const fallback of config.fallbacks) {
|
|
320
|
+
const { provider: fbProvider } = parseModelSpec(fallback);
|
|
321
|
+
if (resolveApiKey(fbProvider)) {
|
|
322
|
+
try {
|
|
323
|
+
return { model: resolveModel(fallback), spec: fallback };
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// Model not found — try next
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// Last resort: try primary anyway (will fail at call time with a clear error)
|
|
332
|
+
return { model: resolveModel(primary), spec: primary };
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Resolve a model from a fallback chain (async).
|
|
336
|
+
* Tries primary first, then each fallback in order.
|
|
337
|
+
* Checks the FULL API key resolution chain including OAuth profiles with auto-refresh.
|
|
338
|
+
*/
|
|
339
|
+
export async function resolveModelWithFallbackAsync(config) {
|
|
340
|
+
const primary = config.primary;
|
|
341
|
+
if (!primary) {
|
|
342
|
+
throw new Error("No primary model configured. Run 'polpo setup' or set POLPO_MODEL env var.");
|
|
343
|
+
}
|
|
344
|
+
const { provider: primaryProvider } = parseModelSpec(primary);
|
|
345
|
+
if (await resolveApiKeyAsync(primaryProvider)) {
|
|
346
|
+
try {
|
|
347
|
+
return { model: resolveModel(primary), spec: primary };
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
// Primary model not found — try fallbacks
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
if (config.fallbacks) {
|
|
354
|
+
for (const fallback of config.fallbacks) {
|
|
355
|
+
const { provider: fbProvider } = parseModelSpec(fallback);
|
|
356
|
+
if (await resolveApiKeyAsync(fbProvider)) {
|
|
357
|
+
try {
|
|
358
|
+
return { model: resolveModel(fallback), spec: fallback };
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
// Model not found — try next
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return { model: resolveModel(primary), spec: primary };
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Validate that all required providers have API keys available.
|
|
370
|
+
* Returns detailed validation results for all model specs.
|
|
371
|
+
*/
|
|
372
|
+
export function validateProviderKeys(modelSpecs) {
|
|
373
|
+
const missing = [];
|
|
374
|
+
const seen = new Set();
|
|
375
|
+
for (const spec of modelSpecs) {
|
|
376
|
+
const { provider } = parseModelSpec(spec);
|
|
377
|
+
if (seen.has(provider))
|
|
378
|
+
continue;
|
|
379
|
+
seen.add(provider);
|
|
380
|
+
if (!resolveApiKey(provider) && !hasOAuthProfiles(provider)) {
|
|
381
|
+
missing.push({ provider, modelSpec: spec });
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return missing;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Get detailed validation for a set of model specs — including which env var to set.
|
|
388
|
+
*/
|
|
389
|
+
export function validateProviderKeysDetailed(modelSpecs) {
|
|
390
|
+
const results = [];
|
|
391
|
+
const seen = new Set();
|
|
392
|
+
for (const spec of modelSpecs) {
|
|
393
|
+
const { provider } = parseModelSpec(spec);
|
|
394
|
+
if (seen.has(provider))
|
|
395
|
+
continue;
|
|
396
|
+
seen.add(provider);
|
|
397
|
+
results.push({
|
|
398
|
+
provider,
|
|
399
|
+
modelSpec: spec,
|
|
400
|
+
hasKey: !!resolveApiKey(provider),
|
|
401
|
+
envVar: PROVIDER_ENV_MAP[provider],
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
return results;
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=model-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../src/model-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider factory — creates AI SDK LanguageModel instances.
|
|
3
|
+
*
|
|
4
|
+
* Handles both standard AI Gateway models and custom OpenAI-compatible
|
|
5
|
+
* endpoints (Ollama, vLLM, LM Studio, etc.).
|
|
6
|
+
*/
|
|
7
|
+
import type { LanguageModel } from "ai";
|
|
8
|
+
import type { ProviderConfig, ReasoningLevel } from "@polpo-ai/core";
|
|
9
|
+
/**
|
|
10
|
+
* Create an AI SDK LanguageModel for a custom (non-gateway) provider.
|
|
11
|
+
* Uses @ai-sdk/openai with a custom baseURL for OpenAI-compatible endpoints.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createCustomProviderModel(provider: string, modelId: string, override: ProviderConfig): LanguageModel;
|
|
14
|
+
/**
|
|
15
|
+
* Create an AI SDK LanguageModel via the AI Gateway.
|
|
16
|
+
* The gateway expects "provider/modelId" format.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createGatewayModel(provider: string, modelId: string): LanguageModel;
|
|
19
|
+
/**
|
|
20
|
+
* Map Polpo's ReasoningLevel to AI SDK providerOptions for reasoning/thinking.
|
|
21
|
+
*
|
|
22
|
+
* Each provider has its own way of enabling extended thinking:
|
|
23
|
+
* - Anthropic: thinking.type + thinking.budgetTokens
|
|
24
|
+
* - OpenAI: reasoningEffort
|
|
25
|
+
* - Google: thinkingConfig.thinkingBudget
|
|
26
|
+
*/
|
|
27
|
+
export declare function mapReasoningToProviderOptions(provider: string, level: ReasoningLevel | undefined, maxTokens: number): Record<string, Record<string, unknown>> | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Build AI SDK compatible options for generateText/streamText calls.
|
|
30
|
+
*
|
|
31
|
+
* Returns an object with:
|
|
32
|
+
* - providerOptions: reasoning/thinking configuration per provider
|
|
33
|
+
* - maxTokens: max output tokens
|
|
34
|
+
* - headers: additional headers (e.g. for API key passthrough)
|
|
35
|
+
*/
|
|
36
|
+
export declare function buildStreamOpts(apiKey?: string, reasoning?: ReasoningLevel, maxTokens?: number): Record<string, unknown> | undefined;
|
|
37
|
+
//# sourceMappingURL=provider-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-factory.d.ts","sourceRoot":"","sources":["../src/provider-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAGxC,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrE;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,cAAc,GACvB,aAAa,CAaf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAGnF;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,GAAG,SAAS,EACjC,SAAS,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAmDrD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,cAAc,EAC1B,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAUrC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider factory — creates AI SDK LanguageModel instances.
|
|
3
|
+
*
|
|
4
|
+
* Handles both standard AI Gateway models and custom OpenAI-compatible
|
|
5
|
+
* endpoints (Ollama, vLLM, LM Studio, etc.).
|
|
6
|
+
*/
|
|
7
|
+
import { gateway } from "ai";
|
|
8
|
+
import { createOpenAI } from "@ai-sdk/openai";
|
|
9
|
+
import { resolveApiKey } from "./api-keys.js";
|
|
10
|
+
/**
|
|
11
|
+
* Create an AI SDK LanguageModel for a custom (non-gateway) provider.
|
|
12
|
+
* Uses @ai-sdk/openai with a custom baseURL for OpenAI-compatible endpoints.
|
|
13
|
+
*/
|
|
14
|
+
export function createCustomProviderModel(provider, modelId, override) {
|
|
15
|
+
const baseURL = override.baseUrl || "http://localhost:11434/v1";
|
|
16
|
+
const apiKey = resolveApiKey(provider) || "ollama"; // Ollama doesn't need a real key
|
|
17
|
+
// For anthropic-messages API, we'd need @ai-sdk/anthropic — but custom providers
|
|
18
|
+
// are typically Ollama/vLLM/LM Studio which all speak OpenAI-compatible.
|
|
19
|
+
const openaiProvider = createOpenAI({
|
|
20
|
+
baseURL,
|
|
21
|
+
apiKey,
|
|
22
|
+
name: provider,
|
|
23
|
+
});
|
|
24
|
+
return openaiProvider(modelId);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create an AI SDK LanguageModel via the AI Gateway.
|
|
28
|
+
* The gateway expects "provider/modelId" format.
|
|
29
|
+
*/
|
|
30
|
+
export function createGatewayModel(provider, modelId) {
|
|
31
|
+
const gatewayModelId = `${provider}/${modelId}`;
|
|
32
|
+
return gateway(gatewayModelId);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Map Polpo's ReasoningLevel to AI SDK providerOptions for reasoning/thinking.
|
|
36
|
+
*
|
|
37
|
+
* Each provider has its own way of enabling extended thinking:
|
|
38
|
+
* - Anthropic: thinking.type + thinking.budgetTokens
|
|
39
|
+
* - OpenAI: reasoningEffort
|
|
40
|
+
* - Google: thinkingConfig.thinkingBudget
|
|
41
|
+
*/
|
|
42
|
+
export function mapReasoningToProviderOptions(provider, level, maxTokens) {
|
|
43
|
+
if (!level || level === "off")
|
|
44
|
+
return undefined;
|
|
45
|
+
// Budget tokens as a fraction of maxTokens, scaling with reasoning level
|
|
46
|
+
const budgetMap = {
|
|
47
|
+
minimal: 0.1,
|
|
48
|
+
low: 0.25,
|
|
49
|
+
medium: 0.5,
|
|
50
|
+
high: 0.75,
|
|
51
|
+
xhigh: 1.0,
|
|
52
|
+
};
|
|
53
|
+
const fraction = budgetMap[level] ?? 0.5;
|
|
54
|
+
const budgetTokens = Math.round(maxTokens * fraction);
|
|
55
|
+
// OpenAI reasoning effort mapping
|
|
56
|
+
const effortMap = {
|
|
57
|
+
minimal: "low",
|
|
58
|
+
low: "low",
|
|
59
|
+
medium: "medium",
|
|
60
|
+
high: "high",
|
|
61
|
+
xhigh: "high",
|
|
62
|
+
};
|
|
63
|
+
if (provider === "anthropic") {
|
|
64
|
+
return {
|
|
65
|
+
anthropic: {
|
|
66
|
+
thinking: { type: "enabled", budgetTokens },
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
if (provider === "openai") {
|
|
71
|
+
return {
|
|
72
|
+
openai: {
|
|
73
|
+
reasoningEffort: effortMap[level] ?? "medium",
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (provider === "google") {
|
|
78
|
+
return {
|
|
79
|
+
google: {
|
|
80
|
+
thinkingConfig: {
|
|
81
|
+
thinkingBudget: budgetTokens,
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Unknown provider — return undefined as best effort
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Build AI SDK compatible options for generateText/streamText calls.
|
|
91
|
+
*
|
|
92
|
+
* Returns an object with:
|
|
93
|
+
* - providerOptions: reasoning/thinking configuration per provider
|
|
94
|
+
* - maxTokens: max output tokens
|
|
95
|
+
* - headers: additional headers (e.g. for API key passthrough)
|
|
96
|
+
*/
|
|
97
|
+
export function buildStreamOpts(apiKey, reasoning, maxTokens) {
|
|
98
|
+
const reasoningVal = reasoning && reasoning !== "off" ? reasoning : undefined;
|
|
99
|
+
if (!apiKey && !reasoningVal && !maxTokens)
|
|
100
|
+
return undefined;
|
|
101
|
+
const opts = {};
|
|
102
|
+
if (apiKey)
|
|
103
|
+
opts.apiKey = apiKey;
|
|
104
|
+
if (reasoningVal)
|
|
105
|
+
opts.reasoning = reasoningVal;
|
|
106
|
+
if (maxTokens)
|
|
107
|
+
opts.maxTokens = maxTokens;
|
|
108
|
+
return opts;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=provider-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-factory.js","sourceRoot":"","sources":["../src/provider-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAAgB,EAChB,OAAe,EACf,QAAwB;IAExB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,2BAA2B,CAAC;IAChE,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,iCAAiC;IAErF,iFAAiF;IACjF,yEAAyE;IACzE,MAAM,cAAc,GAAG,YAAY,CAAC;QAClC,OAAO;QACP,MAAM;QACN,IAAI,EAAE,QAAQ;KACf,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC,OAAO,CAA6B,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,OAAe;IAClE,MAAM,cAAc,GAAG,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC;IAChD,OAAO,OAAO,CAAC,cAAqB,CAA6B,CAAC;AACpE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,6BAA6B,CAC3C,QAAgB,EAChB,KAAiC,EACjC,SAAiB;IAEjB,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAEhD,yEAAyE;IACzE,MAAM,SAAS,GAA2B;QACxC,OAAO,EAAE,GAAG;QACZ,GAAG,EAAE,IAAI;QACT,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,GAAG;KACX,CAAC;IACF,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;IACzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;IAEtD,kCAAkC;IAClC,MAAM,SAAS,GAA2B;QACxC,OAAO,EAAE,KAAK;QACd,GAAG,EAAE,KAAK;QACV,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;KACd,CAAC;IAEF,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,OAAO;YACL,SAAS,EAAE;gBACT,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE;aAC5C;SACF,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO;YACL,MAAM,EAAE;gBACN,eAAe,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,QAAQ;aAC9C;SACF,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO;YACL,MAAM,EAAE;gBACN,cAAc,EAAE;oBACd,cAAc,EAAE,YAAY;iBAC7B;aACF;SACF,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAe,EACf,SAA0B,EAC1B,SAAkB;IAElB,MAAM,YAAY,GAAG,SAAS,IAAI,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9E,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAE7D,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACjC,IAAI,YAAY;QAAE,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;IAChD,IAAI,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/query.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query functions — wrappers around AI SDK generateText/streamText
|
|
3
|
+
* with cooldown integration and provider-level failover.
|
|
4
|
+
*/
|
|
5
|
+
import { type LanguageModelUsage } from "ai";
|
|
6
|
+
import type { ReasoningLevel, ModelConfig } from "@polpo-ai/core";
|
|
7
|
+
import type { ResolvedModel } from "./model-resolver.js";
|
|
8
|
+
/**
|
|
9
|
+
* Simple prompt -> text completion using AI SDK generateText.
|
|
10
|
+
* Integrates with the cooldown system: marks provider cooldown on classified errors,
|
|
11
|
+
* clears cooldown on success. Uses async API key resolution (includes OAuth profiles).
|
|
12
|
+
*/
|
|
13
|
+
export declare function queryText(prompt: string, model?: string, reasoning?: ReasoningLevel): Promise<{
|
|
14
|
+
text: string;
|
|
15
|
+
usage?: LanguageModelUsage;
|
|
16
|
+
model: ResolvedModel;
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* Streaming prompt -> text with progress callback.
|
|
20
|
+
* Integrates with the cooldown system. Uses async API key resolution.
|
|
21
|
+
*/
|
|
22
|
+
export declare function queryStream(prompt: string, model?: string, onProgress?: (text: string) => void, reasoning?: ReasoningLevel): Promise<{
|
|
23
|
+
text: string;
|
|
24
|
+
usage?: LanguageModelUsage;
|
|
25
|
+
model: ResolvedModel;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Query with model fallback chain — tries primary model, then fallbacks.
|
|
29
|
+
* On provider-level errors, marks cooldown and tries next model.
|
|
30
|
+
*/
|
|
31
|
+
export declare function queryTextWithFallback(prompt: string, modelConfig: ModelConfig): Promise<{
|
|
32
|
+
text: string;
|
|
33
|
+
usage?: LanguageModelUsage;
|
|
34
|
+
model: ResolvedModel;
|
|
35
|
+
usedSpec: string;
|
|
36
|
+
}>;
|
|
37
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,IAAI,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAmBzD;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,cAAc,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,CAAC,CAkC7E;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EACnC,SAAS,CAAC,EAAE,cAAc,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,CAAC,CA0C7E;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAgC/F"}
|