@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.
Files changed (122) hide show
  1. package/README.md +2 -2
  2. package/dist/core/src/branding.d.ts +3 -0
  3. package/dist/core/src/branding.d.ts.map +1 -0
  4. package/dist/core/src/branding.js +8 -0
  5. package/dist/core/src/branding.js.map +1 -0
  6. package/dist/core/src/config.d.ts +1 -1
  7. package/dist/core/src/config.d.ts.map +1 -1
  8. package/dist/core/src/config.js +3 -1
  9. package/dist/core/src/config.js.map +1 -1
  10. package/dist/core/src/data/model-constraints.d.ts +8 -0
  11. package/dist/core/src/data/model-constraints.d.ts.map +1 -0
  12. package/dist/core/src/data/model-constraints.js +25 -0
  13. package/dist/core/src/data/model-constraints.js.map +1 -0
  14. package/dist/core/src/data/model-params.d.ts +17 -0
  15. package/dist/core/src/data/model-params.d.ts.map +1 -1
  16. package/dist/core/src/data/model-params.generated.d.ts.map +1 -1
  17. package/dist/core/src/data/model-params.generated.js +1 -1
  18. package/dist/core/src/data/model-params.generated.js.map +1 -1
  19. package/dist/core/src/data/model-params.js +6 -1
  20. package/dist/core/src/data/model-params.js.map +1 -1
  21. package/dist/core/src/request-context.d.ts +19 -0
  22. package/dist/core/src/request-context.d.ts.map +1 -1
  23. package/dist/core/src/request-context.js +13 -0
  24. package/dist/core/src/request-context.js.map +1 -1
  25. package/dist/core/src/server.d.ts +21 -3
  26. package/dist/core/src/server.d.ts.map +1 -1
  27. package/dist/core/src/server.js +52 -13
  28. package/dist/core/src/server.js.map +1 -1
  29. package/dist/core/src/services/api-client.d.ts +15 -0
  30. package/dist/core/src/services/api-client.d.ts.map +1 -1
  31. package/dist/core/src/services/api-client.js +26 -0
  32. package/dist/core/src/services/api-client.js.map +1 -1
  33. package/dist/core/src/services/catalog-client.d.ts +14 -0
  34. package/dist/core/src/services/catalog-client.d.ts.map +1 -0
  35. package/dist/core/src/services/catalog-client.js +42 -0
  36. package/dist/core/src/services/catalog-client.js.map +1 -0
  37. package/dist/core/src/services/error-handler.d.ts.map +1 -1
  38. package/dist/core/src/services/error-handler.js +27 -14
  39. package/dist/core/src/services/error-handler.js.map +1 -1
  40. package/dist/core/src/services/file-client.d.ts +33 -3
  41. package/dist/core/src/services/file-client.d.ts.map +1 -1
  42. package/dist/core/src/services/file-client.js +50 -19
  43. package/dist/core/src/services/file-client.js.map +1 -1
  44. package/dist/core/src/services/media-preview.d.ts +24 -0
  45. package/dist/core/src/services/media-preview.d.ts.map +1 -0
  46. package/dist/core/src/services/media-preview.js +156 -0
  47. package/dist/core/src/services/media-preview.js.map +1 -0
  48. package/dist/core/src/services/model-catalog.d.ts +6 -3
  49. package/dist/core/src/services/model-catalog.d.ts.map +1 -1
  50. package/dist/core/src/services/model-catalog.js +38 -16
  51. package/dist/core/src/services/model-catalog.js.map +1 -1
  52. package/dist/core/src/services/param-validator.d.ts.map +1 -1
  53. package/dist/core/src/services/param-validator.js +36 -0
  54. package/dist/core/src/services/param-validator.js.map +1 -1
  55. package/dist/core/src/services/preview-download.d.ts +11 -0
  56. package/dist/core/src/services/preview-download.d.ts.map +1 -0
  57. package/dist/core/src/services/preview-download.js +106 -0
  58. package/dist/core/src/services/preview-download.js.map +1 -0
  59. package/dist/core/src/services/pricing-client.d.ts +21 -3
  60. package/dist/core/src/services/pricing-client.d.ts.map +1 -1
  61. package/dist/core/src/services/pricing-client.js +86 -4
  62. package/dist/core/src/services/pricing-client.js.map +1 -1
  63. package/dist/core/src/services/upload-policy.d.ts +2 -0
  64. package/dist/core/src/services/upload-policy.d.ts.map +1 -1
  65. package/dist/core/src/services/upload-policy.js +8 -0
  66. package/dist/core/src/services/upload-policy.js.map +1 -1
  67. package/dist/core/src/services/upload-slots.d.ts +63 -0
  68. package/dist/core/src/services/upload-slots.d.ts.map +1 -0
  69. package/dist/core/src/services/upload-slots.js +24 -0
  70. package/dist/core/src/services/upload-slots.js.map +1 -0
  71. package/dist/core/src/services/utm.d.ts +29 -0
  72. package/dist/core/src/services/utm.d.ts.map +1 -0
  73. package/dist/core/src/services/utm.js +64 -0
  74. package/dist/core/src/services/utm.js.map +1 -0
  75. package/dist/core/src/tool-guidance.d.ts +6 -0
  76. package/dist/core/src/tool-guidance.d.ts.map +1 -0
  77. package/dist/core/src/tool-guidance.js +49 -0
  78. package/dist/core/src/tool-guidance.js.map +1 -0
  79. package/dist/core/src/tools/check-balance.d.ts.map +1 -1
  80. package/dist/core/src/tools/check-balance.js +13 -9
  81. package/dist/core/src/tools/check-balance.js.map +1 -1
  82. package/dist/core/src/tools/estimate-cost.d.ts.map +1 -1
  83. package/dist/core/src/tools/estimate-cost.js +18 -12
  84. package/dist/core/src/tools/estimate-cost.js.map +1 -1
  85. package/dist/core/src/tools/generate.d.ts.map +1 -1
  86. package/dist/core/src/tools/generate.js +67 -14
  87. package/dist/core/src/tools/generate.js.map +1 -1
  88. package/dist/core/src/tools/get-model.d.ts +2 -1
  89. package/dist/core/src/tools/get-model.d.ts.map +1 -1
  90. package/dist/core/src/tools/get-model.js +27 -7
  91. package/dist/core/src/tools/get-model.js.map +1 -1
  92. package/dist/core/src/tools/get-task.d.ts.map +1 -1
  93. package/dist/core/src/tools/get-task.js +3 -2
  94. package/dist/core/src/tools/get-task.js.map +1 -1
  95. package/dist/core/src/tools/list-tasks.d.ts.map +1 -1
  96. package/dist/core/src/tools/list-tasks.js +10 -3
  97. package/dist/core/src/tools/list-tasks.js.map +1 -1
  98. package/dist/core/src/tools/prepare-upload.d.ts +6 -0
  99. package/dist/core/src/tools/prepare-upload.d.ts.map +1 -0
  100. package/dist/core/src/tools/prepare-upload.js +134 -0
  101. package/dist/core/src/tools/prepare-upload.js.map +1 -0
  102. package/dist/core/src/tools/search-models.d.ts +2 -1
  103. package/dist/core/src/tools/search-models.d.ts.map +1 -1
  104. package/dist/core/src/tools/search-models.js +11 -5
  105. package/dist/core/src/tools/search-models.js.map +1 -1
  106. package/dist/core/src/tools/shared.d.ts +7 -2
  107. package/dist/core/src/tools/shared.d.ts.map +1 -1
  108. package/dist/core/src/tools/shared.js +12 -4
  109. package/dist/core/src/tools/shared.js.map +1 -1
  110. package/dist/core/src/tools/task-format.d.ts +16 -0
  111. package/dist/core/src/tools/task-format.d.ts.map +1 -1
  112. package/dist/core/src/tools/task-format.js +85 -11
  113. package/dist/core/src/tools/task-format.js.map +1 -1
  114. package/dist/core/src/tools/upload-file.d.ts +10 -0
  115. package/dist/core/src/tools/upload-file.d.ts.map +1 -1
  116. package/dist/core/src/tools/upload-file.js +36 -6
  117. package/dist/core/src/tools/upload-file.js.map +1 -1
  118. package/dist/core/src/version.d.ts +1 -1
  119. package/dist/core/src/version.js +1 -1
  120. package/dist/evolink-media/src/index.js +2 -0
  121. package/dist/evolink-media/src/index.js.map +1 -1
  122. 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,EAAmC,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE5G,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;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD,oHAAoH;AACpH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAgBpD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAGhF;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,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CAKlG"}
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 { allModelParams, findModelParams } from '../data/model-params.js';
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
- /** Merges the bundled parameter index with the live price list; works without prices if the list is unreachable. */
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 spec of allModelParams())
11
- entries.set(spec.model, { id: spec.model, kind: spec.kind, spec });
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 priced of pricing.models.values()) {
18
- const existing = entries.get(priced.id);
19
- if (existing)
20
- existing.priced = priced;
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 === id.trim()) ?? catalog.entries.find(entry => entry.id.toLowerCase() === lower);
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 spec = findModelParams(id);
41
- const catalog = await loadCatalog();
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":"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"}
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;AAoGD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAkBjG;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAEhE"}
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
- /** estimated: a range was computed; token_billed: billed by usage, unknown up front; needs_input: a quantity is missing; no_price: nothing published. */
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":"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"}
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('No price is published for this model, so no estimate is possible.');
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
- const duration = numberParam(input, DURATION_PARAMS, spec);
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.notes.push(`${price.name} is billed per second; pass input.duration to get an 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) {