@evolinkai/mcp 1.3.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/core/src/branding.d.ts +3 -0
- package/dist/core/src/branding.d.ts.map +1 -0
- package/dist/core/src/branding.js +8 -0
- package/dist/core/src/branding.js.map +1 -0
- package/dist/core/src/config.d.ts +1 -1
- package/dist/core/src/config.d.ts.map +1 -1
- package/dist/core/src/config.js +3 -1
- package/dist/core/src/config.js.map +1 -1
- package/dist/core/src/data/model-constraints.d.ts +8 -0
- package/dist/core/src/data/model-constraints.d.ts.map +1 -0
- package/dist/core/src/data/model-constraints.js +25 -0
- package/dist/core/src/data/model-constraints.js.map +1 -0
- package/dist/core/src/data/model-params.d.ts +17 -0
- package/dist/core/src/data/model-params.d.ts.map +1 -1
- package/dist/core/src/data/model-params.generated.d.ts.map +1 -1
- package/dist/core/src/data/model-params.generated.js +1 -1
- package/dist/core/src/data/model-params.generated.js.map +1 -1
- package/dist/core/src/data/model-params.js +6 -1
- package/dist/core/src/data/model-params.js.map +1 -1
- package/dist/core/src/request-context.d.ts +19 -0
- package/dist/core/src/request-context.d.ts.map +1 -1
- package/dist/core/src/request-context.js +13 -0
- package/dist/core/src/request-context.js.map +1 -1
- package/dist/core/src/server.d.ts +21 -3
- package/dist/core/src/server.d.ts.map +1 -1
- package/dist/core/src/server.js +52 -13
- package/dist/core/src/server.js.map +1 -1
- package/dist/core/src/services/api-client.d.ts +15 -0
- package/dist/core/src/services/api-client.d.ts.map +1 -1
- package/dist/core/src/services/api-client.js +26 -0
- package/dist/core/src/services/api-client.js.map +1 -1
- package/dist/core/src/services/catalog-client.d.ts +14 -0
- package/dist/core/src/services/catalog-client.d.ts.map +1 -0
- package/dist/core/src/services/catalog-client.js +42 -0
- package/dist/core/src/services/catalog-client.js.map +1 -0
- package/dist/core/src/services/error-handler.d.ts.map +1 -1
- package/dist/core/src/services/error-handler.js +27 -14
- package/dist/core/src/services/error-handler.js.map +1 -1
- package/dist/core/src/services/file-client.d.ts +33 -3
- package/dist/core/src/services/file-client.d.ts.map +1 -1
- package/dist/core/src/services/file-client.js +50 -19
- package/dist/core/src/services/file-client.js.map +1 -1
- package/dist/core/src/services/media-preview.d.ts +24 -0
- package/dist/core/src/services/media-preview.d.ts.map +1 -0
- package/dist/core/src/services/media-preview.js +156 -0
- package/dist/core/src/services/media-preview.js.map +1 -0
- package/dist/core/src/services/model-catalog.d.ts +6 -3
- package/dist/core/src/services/model-catalog.d.ts.map +1 -1
- package/dist/core/src/services/model-catalog.js +38 -16
- package/dist/core/src/services/model-catalog.js.map +1 -1
- package/dist/core/src/services/param-validator.d.ts.map +1 -1
- package/dist/core/src/services/param-validator.js +36 -0
- package/dist/core/src/services/param-validator.js.map +1 -1
- package/dist/core/src/services/preview-download.d.ts +11 -0
- package/dist/core/src/services/preview-download.d.ts.map +1 -0
- package/dist/core/src/services/preview-download.js +106 -0
- package/dist/core/src/services/preview-download.js.map +1 -0
- package/dist/core/src/services/pricing-client.d.ts +21 -3
- package/dist/core/src/services/pricing-client.d.ts.map +1 -1
- package/dist/core/src/services/pricing-client.js +86 -4
- package/dist/core/src/services/pricing-client.js.map +1 -1
- package/dist/core/src/services/upload-policy.d.ts +2 -0
- package/dist/core/src/services/upload-policy.d.ts.map +1 -1
- package/dist/core/src/services/upload-policy.js +8 -0
- package/dist/core/src/services/upload-policy.js.map +1 -1
- package/dist/core/src/services/upload-slots.d.ts +63 -0
- package/dist/core/src/services/upload-slots.d.ts.map +1 -0
- package/dist/core/src/services/upload-slots.js +24 -0
- package/dist/core/src/services/upload-slots.js.map +1 -0
- package/dist/core/src/services/utm.d.ts +29 -0
- package/dist/core/src/services/utm.d.ts.map +1 -0
- package/dist/core/src/services/utm.js +64 -0
- package/dist/core/src/services/utm.js.map +1 -0
- package/dist/core/src/tool-guidance.d.ts +6 -0
- package/dist/core/src/tool-guidance.d.ts.map +1 -0
- package/dist/core/src/tool-guidance.js +49 -0
- package/dist/core/src/tool-guidance.js.map +1 -0
- package/dist/core/src/tools/check-balance.d.ts.map +1 -1
- package/dist/core/src/tools/check-balance.js +13 -9
- package/dist/core/src/tools/check-balance.js.map +1 -1
- package/dist/core/src/tools/estimate-cost.d.ts.map +1 -1
- package/dist/core/src/tools/estimate-cost.js +18 -12
- package/dist/core/src/tools/estimate-cost.js.map +1 -1
- package/dist/core/src/tools/generate.d.ts.map +1 -1
- package/dist/core/src/tools/generate.js +67 -14
- package/dist/core/src/tools/generate.js.map +1 -1
- package/dist/core/src/tools/get-model.d.ts +2 -1
- package/dist/core/src/tools/get-model.d.ts.map +1 -1
- package/dist/core/src/tools/get-model.js +27 -7
- package/dist/core/src/tools/get-model.js.map +1 -1
- package/dist/core/src/tools/get-task.d.ts.map +1 -1
- package/dist/core/src/tools/get-task.js +3 -2
- package/dist/core/src/tools/get-task.js.map +1 -1
- package/dist/core/src/tools/list-tasks.d.ts.map +1 -1
- package/dist/core/src/tools/list-tasks.js +10 -3
- package/dist/core/src/tools/list-tasks.js.map +1 -1
- package/dist/core/src/tools/prepare-upload.d.ts +6 -0
- package/dist/core/src/tools/prepare-upload.d.ts.map +1 -0
- package/dist/core/src/tools/prepare-upload.js +134 -0
- package/dist/core/src/tools/prepare-upload.js.map +1 -0
- package/dist/core/src/tools/search-models.d.ts +2 -1
- package/dist/core/src/tools/search-models.d.ts.map +1 -1
- package/dist/core/src/tools/search-models.js +11 -5
- package/dist/core/src/tools/search-models.js.map +1 -1
- package/dist/core/src/tools/shared.d.ts +7 -2
- package/dist/core/src/tools/shared.d.ts.map +1 -1
- package/dist/core/src/tools/shared.js +12 -4
- package/dist/core/src/tools/shared.js.map +1 -1
- package/dist/core/src/tools/task-format.d.ts +16 -0
- package/dist/core/src/tools/task-format.d.ts.map +1 -1
- package/dist/core/src/tools/task-format.js +85 -11
- package/dist/core/src/tools/task-format.js.map +1 -1
- package/dist/core/src/tools/upload-file.d.ts +10 -0
- package/dist/core/src/tools/upload-file.d.ts.map +1 -1
- package/dist/core/src/tools/upload-file.js +36 -6
- package/dist/core/src/tools/upload-file.js.map +1 -1
- package/dist/core/src/version.d.ts +1 -1
- package/dist/core/src/version.js +1 -1
- package/dist/evolink-media/src/index.js +2 -0
- package/dist/evolink-media/src/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/model-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/model-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjD,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEnE,qFAAqF;AACrF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD,mGAAmG;AACnG,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAiCzE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAIhF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,EAAE,CAGtF;AAED,gEAAgE;AAChE,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CAIzH"}
|
|
@@ -1,25 +1,47 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { findModelParams } from '../data/model-params.js';
|
|
2
|
+
import { currentRequestCredentials } from '../request-context.js';
|
|
3
|
+
import { getAvailableModelIds } from './api-client.js';
|
|
4
|
+
import { currentModels } from './catalog-client.js';
|
|
2
5
|
import { closestMatches } from './param-validator.js';
|
|
3
6
|
import { getPricing } from './pricing-client.js';
|
|
4
7
|
function isMediaKind(value) {
|
|
5
8
|
return value === 'image' || value === 'video' || value === 'audio';
|
|
6
9
|
}
|
|
7
|
-
/**
|
|
8
|
-
export async function loadCatalog() {
|
|
10
|
+
/** Live available IDs are authoritative; their published aliases join documentation and prices. */
|
|
11
|
+
export async function loadCatalog(config) {
|
|
12
|
+
const live = await currentModels();
|
|
13
|
+
// /v1/models is credential-specific. OAuth currently allows only media/task/credit
|
|
14
|
+
// routes, so its catalog uses public health (enabled abilities/channels), not a rejected call.
|
|
15
|
+
let allowed;
|
|
16
|
+
if (config && !currentRequestCredentials()?.serviceChannel) {
|
|
17
|
+
allowed = new Set((await getAvailableModelIds(config)).map(id => id.toLowerCase()));
|
|
18
|
+
}
|
|
9
19
|
const entries = new Map();
|
|
10
|
-
for (const
|
|
11
|
-
|
|
20
|
+
for (const model of live.models) {
|
|
21
|
+
if (model.lifecycle === 'retired' || !live.available.has(model.model_id.toLowerCase()))
|
|
22
|
+
continue;
|
|
23
|
+
const names = [model.model_id, ...model.aliases];
|
|
24
|
+
if (allowed && !names.some(name => allowed.has(name.toLowerCase())))
|
|
25
|
+
continue;
|
|
26
|
+
const spec = names.map(findModelParams).find(Boolean);
|
|
27
|
+
const kind = model.capabilities.find(isMediaKind);
|
|
28
|
+
if (!kind || (spec && spec.kind !== kind))
|
|
29
|
+
continue;
|
|
30
|
+
const protocol = { image: 'openai-images', video: 'evolink-video-generations', audio: 'openai-audio' }[kind];
|
|
31
|
+
if (!spec && !model.protocols.includes(protocol))
|
|
32
|
+
continue;
|
|
33
|
+
entries.set(model.model_id, { id: model.model_id, kind, aliases: model.aliases, title: model.display_name,
|
|
34
|
+
...(spec ? { spec: { ...spec, model: model.model_id } } : {}) });
|
|
35
|
+
}
|
|
12
36
|
let pricingWarning;
|
|
13
37
|
try {
|
|
14
38
|
const pricing = await getPricing();
|
|
15
39
|
if (pricing.source === 'stale-cache')
|
|
16
40
|
pricingWarning = 'Prices could not be refreshed; showing the last known prices.';
|
|
17
|
-
for (const
|
|
18
|
-
const
|
|
19
|
-
if (
|
|
20
|
-
|
|
21
|
-
else if (isMediaKind(priced.kind))
|
|
22
|
-
entries.set(priced.id, { id: priced.id, kind: priced.kind, priced });
|
|
41
|
+
for (const entry of entries.values()) {
|
|
42
|
+
const prices = [entry.id, ...(entry.aliases ?? [])].flatMap(name => [...pricing.models.values()].filter(price => price.id.toLowerCase() === name.toLowerCase()));
|
|
43
|
+
if (prices.length)
|
|
44
|
+
entry.priced = { ...prices[0], id: entry.id, prices: [...new Map(prices.flatMap(model => model.prices).map(price => [price.sku_id, price])).values()] };
|
|
23
45
|
}
|
|
24
46
|
}
|
|
25
47
|
catch (error) {
|
|
@@ -29,17 +51,17 @@ export async function loadCatalog() {
|
|
|
29
51
|
}
|
|
30
52
|
export function findEntry(catalog, id) {
|
|
31
53
|
const lower = id.trim().toLowerCase();
|
|
32
|
-
return catalog.entries.find(entry => entry.id
|
|
54
|
+
return catalog.entries.find(entry => entry.id.toLowerCase() === lower)
|
|
55
|
+
?? catalog.entries.find(entry => entry.aliases?.some(alias => alias.toLowerCase() === lower));
|
|
33
56
|
}
|
|
34
57
|
export function suggestModels(catalog, id, kind) {
|
|
35
58
|
const pool = catalog.entries.filter(entry => !kind || entry.kind === kind).map(entry => entry.id);
|
|
36
59
|
return closestMatches(id, pool, 5);
|
|
37
60
|
}
|
|
38
61
|
/** Looks a model up for one request; prices are best effort. */
|
|
39
|
-
export async function resolveModel(id) {
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
const entry = spec ? findEntry(catalog, spec.model) : findEntry(catalog, id);
|
|
62
|
+
export async function resolveModel(id, config) {
|
|
63
|
+
const catalog = await loadCatalog(config);
|
|
64
|
+
const entry = findEntry(catalog, id);
|
|
43
65
|
return { catalog, entry };
|
|
44
66
|
}
|
|
45
67
|
//# sourceMappingURL=model-catalog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../../../../../core/src/services/model-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../../../../../core/src/services/model-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"param-validator.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/param-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,yBAAyB,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,wHAAwH;IACxH,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AA2BD,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAavF;
|
|
1
|
+
{"version":3,"file":"param-validator.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/param-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,yBAAyB,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,wHAAwH;IACxH,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AA2BD,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAavF;AA+GD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAyCjG;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAEhE"}
|
|
@@ -59,6 +59,17 @@ function show(value) {
|
|
|
59
59
|
function checkValue(name, spec, value, result) {
|
|
60
60
|
if (value === undefined)
|
|
61
61
|
return;
|
|
62
|
+
if (spec.anyOf?.length) {
|
|
63
|
+
const alternatives = spec.anyOf.map(option => {
|
|
64
|
+
const branch = { errors: [], warnings: [] };
|
|
65
|
+
checkValue(name, option, value, branch);
|
|
66
|
+
return branch;
|
|
67
|
+
});
|
|
68
|
+
if (alternatives.every(branch => branch.errors.length > 0)) {
|
|
69
|
+
result.errors.push({ param: name, problem: `must match one of the documented alternatives (${alternatives.map(branch => branch.errors.map(issue => issue.problem).join(' ')).join(' OR ')}).` });
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
62
73
|
if (!matchesType(spec.type, value)) {
|
|
63
74
|
const numericString = typeof value === 'string' && value.trim() !== '' && !Number.isNaN(Number(value));
|
|
64
75
|
const hint = numericString && /integer|number/.test(spec.type ?? '') ? ` Use ${Number(value)} (a number), not "${value}".` : '';
|
|
@@ -156,6 +167,31 @@ export function validateInput(spec, input) {
|
|
|
156
167
|
rest[key] = value;
|
|
157
168
|
}
|
|
158
169
|
checkObject('', spec.params, rest, result);
|
|
170
|
+
for (const group of spec.constraints?.mutuallyExclusive ?? []) {
|
|
171
|
+
const present = group.filter(name => Array.isArray(rest[name]) ? rest[name].length > 0 : rest[name] !== undefined && rest[name] !== null && rest[name] !== '');
|
|
172
|
+
if (present.length > 1)
|
|
173
|
+
result.errors.push({ param: present.join(', '), problem: 'are mutually exclusive; pass only one reference type.' });
|
|
174
|
+
}
|
|
175
|
+
const size = spec.constraints?.imageSize;
|
|
176
|
+
const value = size ? rest[size.param] : undefined;
|
|
177
|
+
if (size && typeof value === 'string' && !size.allowed.includes(value)) {
|
|
178
|
+
const pixels = /^(\d+)[x×](\d+)$/.exec(value);
|
|
179
|
+
if (!pixels || !size.allowPixels) {
|
|
180
|
+
result.errors.push({ param: size.param, problem: `must be one of ${size.allowed.join(', ')}${size.allowPixels ? ', or a valid WxH pixel size' : ''}.` });
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
const width = Number(pixels[1]), height = Number(pixels[2]), total = width * height;
|
|
184
|
+
if (!Number.isSafeInteger(total) || width < size.minEdge || height < size.minEdge || width > size.maxEdge || height > size.maxEdge
|
|
185
|
+
|| width % size.step !== 0 || height % size.step !== 0 || total < size.minPixels || total > size.maxPixels
|
|
186
|
+
|| Math.max(width, height) > size.maxRatio * Math.min(width, height)) {
|
|
187
|
+
result.errors.push({ param: size.param, problem: `requires edges ${size.minEdge}–${size.maxEdge}, multiples of ${size.step}, ${size.minPixels}–${size.maxPixels} pixels, and an aspect ratio at most ${size.maxRatio}:1.` });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (size?.ratioResolution && typeof value === 'string' && value !== 'auto' && rest.resolution !== undefined
|
|
192
|
+
&& String(rest.resolution).toUpperCase() !== size.ratioResolution) {
|
|
193
|
+
result.errors.push({ param: 'resolution', problem: `must be ${size.ratioResolution} when size is a ratio.` });
|
|
194
|
+
}
|
|
159
195
|
return result;
|
|
160
196
|
}
|
|
161
197
|
export function formatIssues(issues) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"param-validator.js","sourceRoot":"","sources":["../../../../../core/src/services/param-validator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"param-validator.js","sourceRoot":"","sources":["../../../../../core/src/services/param-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { lookup } from 'node:dns/promises';
|
|
2
|
+
/** Preview fetching must never attach the gateway's authorization or follow a URL into a private network. */
|
|
3
|
+
export declare function isPublicAddress(address: string): boolean;
|
|
4
|
+
export declare function previewURL(value: string): URL;
|
|
5
|
+
export declare function previewAddress(url: URL, signal: AbortSignal, resolve?: typeof lookup): Promise<{
|
|
6
|
+
address: string;
|
|
7
|
+
family: number;
|
|
8
|
+
}>;
|
|
9
|
+
/** Bounded HTTPS download, with every DNS answer checked and the selected address pinned to the socket. */
|
|
10
|
+
export declare function downloadPreview(value: string, maxBytes: number, signal: AbortSignal): Promise<Buffer>;
|
|
11
|
+
//# sourceMappingURL=preview-download.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-download.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/preview-download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI3C,6GAA6G;AAC7G,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAkBxD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAU7C;AAWD,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,gBAAS;;;GAMnF;AAED,2GAA2G;AAC3G,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA2C3G"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { lookup } from 'node:dns/promises';
|
|
2
|
+
import { request } from 'node:https';
|
|
3
|
+
import { isIP } from 'node:net';
|
|
4
|
+
/** Preview fetching must never attach the gateway's authorization or follow a URL into a private network. */
|
|
5
|
+
export function isPublicAddress(address) {
|
|
6
|
+
if (isIP(address) === 4) {
|
|
7
|
+
const [a, b, c] = address.split('.').map(Number);
|
|
8
|
+
return !(a === 0 || a === 10 || a === 127 || a >= 224
|
|
9
|
+
|| (a === 100 && b >= 64 && b <= 127)
|
|
10
|
+
|| (a === 169 && b === 254) || (a === 172 && b >= 16 && b <= 31)
|
|
11
|
+
|| (a === 192 && (b === 0 || b === 168 || (b === 88 && c === 99)))
|
|
12
|
+
|| (a === 198 && (b === 18 || b === 19 || (b === 51 && c === 100)))
|
|
13
|
+
|| (a === 203 && b === 0 && c === 113));
|
|
14
|
+
}
|
|
15
|
+
if (isIP(address) === 6) {
|
|
16
|
+
// Only global unicast, excluding documentation, transition and special-use ranges.
|
|
17
|
+
const [first, second = '0'] = address.toLowerCase().split(':');
|
|
18
|
+
const a = parseInt(first, 16), b = parseInt(second || '0', 16);
|
|
19
|
+
return a >= 0x2000 && a < 0x4000 && a !== 0x2002 && a !== 0x3fff
|
|
20
|
+
&& !(a === 0x2001 && (b < 0x200 || b === 0xdb8));
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
export function previewURL(value) {
|
|
25
|
+
const url = new URL(value);
|
|
26
|
+
const host = url.hostname.replace(/^\[|\]$/g, '').replace(/\.$/, '').toLowerCase();
|
|
27
|
+
if (url.protocol !== 'https:' || url.username || url.password || (url.port && url.port !== '443')
|
|
28
|
+
|| (!host.includes('.') && isIP(host) === 0)
|
|
29
|
+
|| /(?:^|\.)(?:localhost|local|internal|test|invalid|example)$/.test(host)
|
|
30
|
+
|| (isIP(host) !== 0 && !isPublicAddress(host))) {
|
|
31
|
+
throw new Error('Preview URL is not public HTTPS');
|
|
32
|
+
}
|
|
33
|
+
return url;
|
|
34
|
+
}
|
|
35
|
+
function abortable(operation, signal) {
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
const abort = () => reject(new Error('Preview cancelled'));
|
|
38
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
39
|
+
if (signal.aborted)
|
|
40
|
+
abort();
|
|
41
|
+
operation.then(resolve, reject).finally(() => signal.removeEventListener('abort', abort));
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export async function previewAddress(url, signal, resolve = lookup) {
|
|
45
|
+
const host = url.hostname.replace(/^\[|\]$/g, '').replace(/\.$/, '');
|
|
46
|
+
const literal = isIP(host);
|
|
47
|
+
const addresses = literal ? [{ address: host, family: literal }] : await abortable(resolve(host, { all: true }), signal);
|
|
48
|
+
if (!addresses.length || addresses.some(entry => !isPublicAddress(entry.address)))
|
|
49
|
+
throw new Error('Preview address is not public');
|
|
50
|
+
return addresses[0];
|
|
51
|
+
}
|
|
52
|
+
/** Bounded HTTPS download, with every DNS answer checked and the selected address pinned to the socket. */
|
|
53
|
+
export async function downloadPreview(value, maxBytes, signal) {
|
|
54
|
+
let url = previewURL(value);
|
|
55
|
+
for (let redirects = 0; redirects <= 3; redirects++) {
|
|
56
|
+
const address = await previewAddress(url, signal);
|
|
57
|
+
signal.throwIfAborted();
|
|
58
|
+
const response = await new Promise((resolve, reject) => {
|
|
59
|
+
const req = request(url, {
|
|
60
|
+
method: 'GET', signal, family: address.family,
|
|
61
|
+
// The DNS name is still used for TLS/SNI and certificate verification.
|
|
62
|
+
lookup: (_hostname, _options, callback) => callback(null, address.address, address.family),
|
|
63
|
+
headers: { Accept: 'image/*,video/*', 'User-Agent': 'EvoLink-MCP-Preview/1' },
|
|
64
|
+
}, res => {
|
|
65
|
+
if ([301, 302, 303, 307, 308].includes(res.statusCode ?? 0)) {
|
|
66
|
+
res.destroy();
|
|
67
|
+
try {
|
|
68
|
+
if (!res.headers.location)
|
|
69
|
+
throw new Error('Missing redirect');
|
|
70
|
+
resolve(previewURL(new URL(res.headers.location, url).href));
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
reject(error);
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (res.statusCode !== 200 || Number(res.headers['content-length']) > maxBytes) {
|
|
78
|
+
res.destroy();
|
|
79
|
+
reject(new Error('Preview source unavailable or too large'));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const chunks = [];
|
|
83
|
+
let size = 0;
|
|
84
|
+
res.on('data', (chunk) => {
|
|
85
|
+
size += chunk.length;
|
|
86
|
+
if (size > maxBytes) {
|
|
87
|
+
res.destroy();
|
|
88
|
+
reject(new Error('Preview source too large'));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
chunks.push(chunk);
|
|
92
|
+
});
|
|
93
|
+
res.on('end', () => resolve(Buffer.concat(chunks)));
|
|
94
|
+
res.on('error', reject);
|
|
95
|
+
res.on('aborted', () => reject(new Error('Preview source interrupted')));
|
|
96
|
+
});
|
|
97
|
+
req.on('error', reject);
|
|
98
|
+
req.end();
|
|
99
|
+
});
|
|
100
|
+
if (Buffer.isBuffer(response))
|
|
101
|
+
return response;
|
|
102
|
+
url = response;
|
|
103
|
+
}
|
|
104
|
+
throw new Error('Too many preview redirects');
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=preview-download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-download.js","sourceRoot":"","sources":["../../../../../core/src/services/preview-download.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,10 @@ export interface SkuPrice {
|
|
|
30
30
|
role: 'output' | 'add_on' | 'token';
|
|
31
31
|
multipliers?: Record<string, number>;
|
|
32
32
|
min_charge_usd?: number;
|
|
33
|
+
/** min and max are the prices of several upstream providers (the gateway's routing note says "Calls prioritize…"). */
|
|
34
|
+
provider_range?: boolean;
|
|
35
|
+
/** Price of the provider the gateway tries first (by channel priority, not by price). */
|
|
36
|
+
preferred_usd?: number;
|
|
33
37
|
}
|
|
34
38
|
export interface PricedModel {
|
|
35
39
|
id: string;
|
|
@@ -55,8 +59,8 @@ export declare function formatPrice(price: SkuPrice): string;
|
|
|
55
59
|
/** Lowest main unit price, for listings ("from $0.04 per image"). */
|
|
56
60
|
export declare function startingPrice(model: PricedModel): SkuPrice | undefined;
|
|
57
61
|
export interface CostEstimate {
|
|
58
|
-
/**
|
|
59
|
-
status: 'estimated' | 'token_billed' | 'needs_input' | 'no_price';
|
|
62
|
+
/** partial: published rates were computed but do not cover the full request. */
|
|
63
|
+
status: 'estimated' | 'partial' | 'token_billed' | 'needs_input' | 'no_price';
|
|
60
64
|
min_usd?: number;
|
|
61
65
|
max_usd?: number;
|
|
62
66
|
min_credits?: number;
|
|
@@ -66,12 +70,26 @@ export interface CostEstimate {
|
|
|
66
70
|
/** Extra charges that may apply but are not in the range. */
|
|
67
71
|
possible_extras: string[];
|
|
68
72
|
notes: string[];
|
|
73
|
+
/** needs_input only: the quantity to pass, input.duration or media_seconds (see billedByMediaLength). */
|
|
74
|
+
missing?: 'duration' | 'media_seconds';
|
|
75
|
+
/** A known billing gap that prevents checking max_cost_usd, even when a range is available. */
|
|
76
|
+
uncheckable_reason?: 'reference_video' | 'output_duration';
|
|
69
77
|
}
|
|
78
|
+
export interface EstimateOptions {
|
|
79
|
+
/** Length of the media a per-second charge is based on, for models without a duration parameter; never sent to the model. */
|
|
80
|
+
mediaSeconds?: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* A documented model billed per second that has no duration parameter: the gateway measures the seconds when
|
|
84
|
+
* the task runs, usually from the media it works on (the input video of an upscale, edit or motion transfer,
|
|
85
|
+
* the audio of a talking head). Its input alone cannot price it; media_seconds can.
|
|
86
|
+
*/
|
|
87
|
+
export declare function billedByMediaLength(model: PricedModel | undefined, spec?: ModelParams): boolean;
|
|
70
88
|
/**
|
|
71
89
|
* Interim media estimate: published unit price × images or seconds, plus
|
|
72
90
|
* per-input-image charges. The gateway's own pre-charge at submit time is
|
|
73
91
|
* authoritative; this only tells the user what to expect.
|
|
74
92
|
*/
|
|
75
|
-
export declare function estimateCost(model: PricedModel | undefined, kind: string, input: Record<string, unknown>, spec?: ModelParams): CostEstimate;
|
|
93
|
+
export declare function estimateCost(model: PricedModel | undefined, kind: string, input: Record<string, unknown>, spec?: ModelParams, options?: EstimateOptions): CostEstimate;
|
|
76
94
|
export declare function formatEstimateRange(estimate: CostEstimate): string | undefined;
|
|
77
95
|
//# sourceMappingURL=pricing-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing-client.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/pricing-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAe3D,mGAAmG;AACnG,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,WAAW,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,4DAA4D;AAC5D,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"pricing-client.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/pricing-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,9 @@ function unitFromRule(rule) {
|
|
|
48
48
|
default: return 'request';
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
+
/** The gateway's routing note for a SKU served by several upstream providers (controller/model_pricing.go buildRoutingNote). */
|
|
52
|
+
const MULTIPLE_PROVIDERS = /Calls prioritize/i;
|
|
53
|
+
const PREFERRED_PROVIDER = /prioritize the \$([\d,]*\.?\d+) provider/i;
|
|
51
54
|
/** Unit and USD price of one SKU: the gateway's routing note first (it carries the corrected unit), the raw fields second. */
|
|
52
55
|
export function skuPrice(sku) {
|
|
53
56
|
const note = ROUTING_NOTE.exec(sku.routing_note ?? '');
|
|
@@ -93,6 +96,12 @@ export function skuPrice(sku) {
|
|
|
93
96
|
};
|
|
94
97
|
if (multipliers && Object.keys(multipliers).length > 0)
|
|
95
98
|
price.multipliers = multipliers;
|
|
99
|
+
if (note?.[2] && maxUsd > minUsd && MULTIPLE_PROVIDERS.test(sku.routing_note ?? '')) {
|
|
100
|
+
price.provider_range = true;
|
|
101
|
+
const preferred = PREFERRED_PROVIDER.exec(sku.routing_note ?? '');
|
|
102
|
+
if (preferred)
|
|
103
|
+
price.preferred_usd = Number(preferred[1].replaceAll(',', ''));
|
|
104
|
+
}
|
|
96
105
|
if (typeof sku.min_charge_uc === 'number' && sku.min_charge_uc > 0 && !tokenBased) {
|
|
97
106
|
price.min_charge_usd = sku.min_charge_uc / 10_000 / CREDITS_PER_USD;
|
|
98
107
|
}
|
|
@@ -175,6 +184,24 @@ const COUNT_PARAMS = ['n', 'num_images', 'number_of_images', 'image_count', 'cou
|
|
|
175
184
|
const DURATION_PARAMS = ['duration', 'seconds', 'duration_seconds'];
|
|
176
185
|
const TIER_PARAMS = ['quality', 'resolution', 'size'];
|
|
177
186
|
const TIER_TOKEN = /\b(\d+(?:\.\d+)?k|\d{3,4}p)\b/gi;
|
|
187
|
+
/**
|
|
188
|
+
* A documented model billed per second that has no duration parameter: the gateway measures the seconds when
|
|
189
|
+
* the task runs, usually from the media it works on (the input video of an upscale, edit or motion transfer,
|
|
190
|
+
* the audio of a talking head). Its input alone cannot price it; media_seconds can.
|
|
191
|
+
*/
|
|
192
|
+
export function billedByMediaLength(model, spec) {
|
|
193
|
+
if (!spec || DURATION_PARAMS.some(name => spec.params[name] !== undefined))
|
|
194
|
+
return false;
|
|
195
|
+
return (model?.prices ?? []).some(price => price.role === 'output' && price.unit === 'second');
|
|
196
|
+
}
|
|
197
|
+
/** media_seconds as billed seconds: whole seconds, rounded up, at least one. */
|
|
198
|
+
function mediaLength(seconds) {
|
|
199
|
+
if (typeof seconds !== 'number' || !Number.isFinite(seconds) || seconds <= 0)
|
|
200
|
+
return undefined;
|
|
201
|
+
// Do not subtract an epsilon: some gateway strategies ceil every positive fraction.
|
|
202
|
+
const whole = Math.max(1, Math.ceil(seconds));
|
|
203
|
+
return { value: whole, source: whole === seconds ? 'media_seconds' : `media_seconds ${seconds}, rounded up` };
|
|
204
|
+
}
|
|
178
205
|
function numberParam(input, names, spec) {
|
|
179
206
|
for (const name of names) {
|
|
180
207
|
const value = input[name];
|
|
@@ -223,10 +250,50 @@ function multiplierRange(price, tiers) {
|
|
|
223
250
|
* per-input-image charges. The gateway's own pre-charge at submit time is
|
|
224
251
|
* authoritative; this only tells the user what to expect.
|
|
225
252
|
*/
|
|
226
|
-
export function estimateCost(model, kind, input, spec) {
|
|
253
|
+
export function estimateCost(model, kind, input, spec, options = {}) {
|
|
254
|
+
const byMedia = billedByMediaLength(model, spec);
|
|
255
|
+
const estimate = priceEstimate(model, input, spec, byMedia ? options.mediaSeconds : undefined, byMedia);
|
|
256
|
+
if (spec?.constraints?.outputDuration === 'unknown' && byMedia) {
|
|
257
|
+
if (estimate.status === 'estimated')
|
|
258
|
+
estimate.status = 'partial';
|
|
259
|
+
estimate.uncheckable_reason = 'output_duration';
|
|
260
|
+
estimate.notes = estimate.notes.filter(note => !note.includes('usually the length of the input video or audio') && !note.startsWith('This uses the length'));
|
|
261
|
+
estimate.notes.push('This model bills the generated audio duration, which cannot be set in input. media_seconds is only an expected output length for an illustrative estimate; it is not the reference clip length, a total or an upper bound. Do not add input.duration.');
|
|
262
|
+
}
|
|
263
|
+
if (/^wan3\.0-/.test(spec?.model ?? '') && input.duration === -1) {
|
|
264
|
+
if (estimate.status === 'estimated')
|
|
265
|
+
estimate.status = 'partial';
|
|
266
|
+
estimate.uncheckable_reason = 'output_duration';
|
|
267
|
+
estimate.notes.push('Smart duration (-1) has an unknown output length. The gateway reserves up to 30 seconds; this range is not an upper bound. Use an explicit duration for an estimate.');
|
|
268
|
+
delete estimate.min_usd;
|
|
269
|
+
delete estimate.max_usd;
|
|
270
|
+
delete estimate.min_credits;
|
|
271
|
+
delete estimate.max_credits;
|
|
272
|
+
estimate.basis = estimate.basis.filter(line => !line.includes('default duration'));
|
|
273
|
+
}
|
|
274
|
+
// Public prices do not describe all input-video seconds or video-dependent multipliers.
|
|
275
|
+
// media_seconds is only a declared length, so it cannot make this a complete price.
|
|
276
|
+
const hasInputVideo = (Array.isArray(input.video_urls) && input.video_urls.length > 0)
|
|
277
|
+
|| (typeof input.video_url === 'string' && input.video_url.length > 0)
|
|
278
|
+
|| (typeof input.source_task_id === 'string' && input.source_task_id.length > 0);
|
|
279
|
+
if (kind === 'video' && hasInputVideo
|
|
280
|
+
&& model?.prices.some(price => price.role === 'output' && price.unit === 'second')) {
|
|
281
|
+
if (estimate.status === 'estimated')
|
|
282
|
+
estimate.status = 'partial';
|
|
283
|
+
estimate.uncheckable_reason = 'reference_video';
|
|
284
|
+
estimate.possible_extras.push('Input/reference video seconds and video-dependent billing multipliers may also apply; they are not fully covered by this range.');
|
|
285
|
+
estimate.notes.push('For a per-second video request with input.video_urls, input.video_url or input.source_task_id, this is not a total or an upper bound. max_cost_usd cannot be checked; the gateway reservation at submission is authoritative.');
|
|
286
|
+
}
|
|
287
|
+
if (options.mediaSeconds !== undefined && !byMedia) {
|
|
288
|
+
const takesDuration = spec !== undefined && DURATION_PARAMS.some(name => spec.params[name] !== undefined);
|
|
289
|
+
estimate.notes.push(`media_seconds was not used: it is only for models billed per second that have no duration parameter${takesDuration ? '; this one takes input.duration' : ''}.`);
|
|
290
|
+
}
|
|
291
|
+
return estimate;
|
|
292
|
+
}
|
|
293
|
+
function priceEstimate(model, input, spec, mediaSeconds, byMedia) {
|
|
227
294
|
const estimate = { status: 'no_price', basis: [], possible_extras: [], notes: [] };
|
|
228
295
|
if (!model || model.prices.length === 0) {
|
|
229
|
-
estimate.notes.push('
|
|
296
|
+
estimate.notes.push('Pricing data is unavailable in this catalog, so no estimate is possible.');
|
|
230
297
|
return estimate;
|
|
231
298
|
}
|
|
232
299
|
const tiers = TIER_PARAMS
|
|
@@ -262,10 +329,14 @@ export function estimateCost(model, kind, input, spec) {
|
|
|
262
329
|
quantityText = ` × ${quantity} image${quantity === 1 ? '' : 's'}${count ? ` (${count.source})` : ''}`;
|
|
263
330
|
}
|
|
264
331
|
else if (price.unit === 'second') {
|
|
265
|
-
|
|
332
|
+
// Without a duration parameter, input.duration would be refused as unknown: only media_seconds counts.
|
|
333
|
+
const duration = byMedia ? mediaLength(mediaSeconds) : numberParam(input, DURATION_PARAMS, spec);
|
|
266
334
|
if (!duration) {
|
|
267
335
|
estimate.status = 'needs_input';
|
|
268
|
-
estimate.
|
|
336
|
+
estimate.missing = byMedia ? 'media_seconds' : 'duration';
|
|
337
|
+
estimate.notes.push(byMedia
|
|
338
|
+
? `${price.name} is billed per second, and this model has no duration parameter: EvoLink measures the seconds when the task runs (usually the length of the input video or audio). Pass that length as media_seconds to get an estimate.`
|
|
339
|
+
: `${price.name} is billed per second; pass input.duration to get an estimate.`);
|
|
269
340
|
estimate.basis.push(`${price.name}: ${formatPrice(price)}`);
|
|
270
341
|
continue;
|
|
271
342
|
}
|
|
@@ -310,12 +381,23 @@ export function estimateCost(model, kind, input, spec) {
|
|
|
310
381
|
estimate.max_usd = max;
|
|
311
382
|
estimate.min_credits = min * CREDITS_PER_USD;
|
|
312
383
|
estimate.max_credits = max * CREDITS_PER_USD;
|
|
384
|
+
if (byMedia) {
|
|
385
|
+
estimate.notes.push('This uses the length given as media_seconds. EvoLink measures the media itself when the task runs and charges by what it measures, which can differ from this estimate.');
|
|
386
|
+
}
|
|
313
387
|
if (candidates.length < outputs.length) {
|
|
314
388
|
estimate.notes.push(`Price tier chosen from ${TIER_PARAMS.filter(name => input[name] !== undefined).map(name => `input.${name}`).join(', ') || 'the default settings'}.`);
|
|
315
389
|
}
|
|
316
390
|
else if (outputs.length > 1) {
|
|
317
391
|
estimate.notes.push('The range covers all output tiers; set the quality or resolution to narrow it.');
|
|
318
392
|
}
|
|
393
|
+
// The gateway picks the provider by channel priority, not by price: name the price it tries first when the note says it.
|
|
394
|
+
const ranged = candidates.filter(price => price.provider_range);
|
|
395
|
+
if (ranged.length > 0) {
|
|
396
|
+
const named = ranged.every(price => price.preferred_usd !== undefined);
|
|
397
|
+
estimate.notes.push(named
|
|
398
|
+
? `The range covers EvoLink's upstream providers. A task goes to the preferred provider first, at ${ranged.map(price => `$${formatUsd(price.preferred_usd)} per ${price.unit}${ranged.length > 1 ? ` (${price.name})` : ''}`).join(', ')}; another provider's price applies only when it is unavailable.`
|
|
399
|
+
: 'The range covers EvoLink\'s upstream providers for this model: a task goes to the preferred provider first, and another provider\'s price applies only when it is unavailable.');
|
|
400
|
+
}
|
|
319
401
|
return estimate;
|
|
320
402
|
}
|
|
321
403
|
export function formatEstimateRange(estimate) {
|