@evolinkai/mcp 0.0.0-stage → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +178 -0
- package/README.md +67 -2
- package/dist/core/src/config.d.ts +19 -0
- package/dist/core/src/config.d.ts.map +1 -0
- package/dist/core/src/config.js +88 -0
- package/dist/core/src/config.js.map +1 -0
- package/dist/core/src/data/model-params.d.ts +49 -0
- package/dist/core/src/data/model-params.d.ts.map +1 -0
- package/dist/core/src/data/model-params.generated.d.ts +2 -0
- package/dist/core/src/data/model-params.generated.d.ts.map +1 -0
- package/dist/core/src/data/model-params.generated.js +3 -0
- package/dist/core/src/data/model-params.generated.js.map +1 -0
- package/dist/core/src/data/model-params.js +22 -0
- package/dist/core/src/data/model-params.js.map +1 -0
- package/dist/core/src/request-context.d.ts +60 -0
- package/dist/core/src/request-context.d.ts.map +1 -0
- package/dist/core/src/request-context.js +39 -0
- package/dist/core/src/request-context.js.map +1 -0
- package/dist/core/src/server.d.ts +18 -0
- package/dist/core/src/server.d.ts.map +1 -0
- package/dist/core/src/server.js +84 -0
- package/dist/core/src/server.js.map +1 -0
- package/dist/core/src/services/api-client.d.ts +129 -0
- package/dist/core/src/services/api-client.d.ts.map +1 -0
- package/dist/core/src/services/api-client.js +163 -0
- package/dist/core/src/services/api-client.js.map +1 -0
- package/dist/core/src/services/error-handler.d.ts +51 -0
- package/dist/core/src/services/error-handler.d.ts.map +1 -0
- package/dist/core/src/services/error-handler.js +390 -0
- package/dist/core/src/services/error-handler.js.map +1 -0
- package/dist/core/src/services/file-client.d.ts +24 -0
- package/dist/core/src/services/file-client.d.ts.map +1 -0
- package/dist/core/src/services/file-client.js +100 -0
- package/dist/core/src/services/file-client.js.map +1 -0
- package/dist/core/src/services/http-policy.d.ts +40 -0
- package/dist/core/src/services/http-policy.d.ts.map +1 -0
- package/dist/core/src/services/http-policy.js +120 -0
- package/dist/core/src/services/http-policy.js.map +1 -0
- package/dist/core/src/services/model-catalog.d.ts +24 -0
- package/dist/core/src/services/model-catalog.d.ts.map +1 -0
- package/dist/core/src/services/model-catalog.js +45 -0
- package/dist/core/src/services/model-catalog.js.map +1 -0
- package/dist/core/src/services/param-validator.d.ts +21 -0
- package/dist/core/src/services/param-validator.d.ts.map +1 -0
- package/dist/core/src/services/param-validator.js +164 -0
- package/dist/core/src/services/param-validator.js.map +1 -0
- package/dist/core/src/services/pricing-client.d.ts +77 -0
- package/dist/core/src/services/pricing-client.d.ts.map +1 -0
- package/dist/core/src/services/pricing-client.js +332 -0
- package/dist/core/src/services/pricing-client.js.map +1 -0
- package/dist/core/src/services/upload-policy.d.ts +17 -0
- package/dist/core/src/services/upload-policy.d.ts.map +1 -0
- package/dist/core/src/services/upload-policy.js +160 -0
- package/dist/core/src/services/upload-policy.js.map +1 -0
- package/dist/core/src/tools/check-balance.d.ts +4 -0
- package/dist/core/src/tools/check-balance.d.ts.map +1 -0
- package/dist/core/src/tools/check-balance.js +78 -0
- package/dist/core/src/tools/check-balance.js.map +1 -0
- package/dist/core/src/tools/estimate-cost.d.ts +4 -0
- package/dist/core/src/tools/estimate-cost.d.ts.map +1 -0
- package/dist/core/src/tools/estimate-cost.js +127 -0
- package/dist/core/src/tools/estimate-cost.js.map +1 -0
- package/dist/core/src/tools/generate.d.ts +4 -0
- package/dist/core/src/tools/generate.d.ts.map +1 -0
- package/dist/core/src/tools/generate.js +178 -0
- package/dist/core/src/tools/generate.js.map +1 -0
- package/dist/core/src/tools/get-model.d.ts +5 -0
- package/dist/core/src/tools/get-model.d.ts.map +1 -0
- package/dist/core/src/tools/get-model.js +109 -0
- package/dist/core/src/tools/get-model.js.map +1 -0
- package/dist/core/src/tools/get-task.d.ts +7 -0
- package/dist/core/src/tools/get-task.d.ts.map +1 -0
- package/dist/core/src/tools/get-task.js +55 -0
- package/dist/core/src/tools/get-task.js.map +1 -0
- package/dist/core/src/tools/list-tasks.d.ts +6 -0
- package/dist/core/src/tools/list-tasks.d.ts.map +1 -0
- package/dist/core/src/tools/list-tasks.js +142 -0
- package/dist/core/src/tools/list-tasks.js.map +1 -0
- package/dist/core/src/tools/search-models.d.ts +5 -0
- package/dist/core/src/tools/search-models.d.ts.map +1 -0
- package/dist/core/src/tools/search-models.js +96 -0
- package/dist/core/src/tools/search-models.js.map +1 -0
- package/dist/core/src/tools/shared.d.ts +50 -0
- package/dist/core/src/tools/shared.d.ts.map +1 -0
- package/dist/core/src/tools/shared.js +129 -0
- package/dist/core/src/tools/shared.js.map +1 -0
- package/dist/core/src/tools/task-format.d.ts +32 -0
- package/dist/core/src/tools/task-format.d.ts.map +1 -0
- package/dist/core/src/tools/task-format.js +138 -0
- package/dist/core/src/tools/task-format.js.map +1 -0
- package/dist/core/src/tools/upload-file.d.ts +7 -0
- package/dist/core/src/tools/upload-file.d.ts.map +1 -0
- package/dist/core/src/tools/upload-file.js +104 -0
- package/dist/core/src/tools/upload-file.js.map +1 -0
- package/dist/core/src/version.d.ts +3 -0
- package/dist/core/src/version.d.ts.map +1 -0
- package/dist/core/src/version.js +3 -0
- package/dist/core/src/version.js.map +1 -0
- package/dist/evolink-media/src/index.d.ts +3 -0
- package/dist/evolink-media/src/index.d.ts.map +1 -0
- package/dist/evolink-media/src/index.js +16 -0
- package/dist/evolink-media/src/index.js.map +1 -0
- package/package.json +46 -4
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { currentClientName } from '../request-context.js';
|
|
3
|
+
import { MCP_VERSION } from '../version.js';
|
|
4
|
+
export const DEFAULT_READ_TIMEOUT_MS = 15_000;
|
|
5
|
+
export const DEFAULT_WRITE_TIMEOUT_MS = 120_000;
|
|
6
|
+
/** A generation submit only queues a task; keep it well inside the ~60 s tool-call limit of Codex and Cursor. */
|
|
7
|
+
export const DEFAULT_SUBMIT_TIMEOUT_MS = 30_000;
|
|
8
|
+
export const MAX_RETRY_DELAY_MS = 30_000;
|
|
9
|
+
/** Public site for console links in errors and results. */
|
|
10
|
+
export const EVOLINK_SITE = 'https://evolink.ai';
|
|
11
|
+
export const TOP_UP_URL = `${EVOLINK_SITE}/dashboard/credits`;
|
|
12
|
+
export const API_KEYS_URL = `${EVOLINK_SITE}/dashboard/keys`;
|
|
13
|
+
/**
|
|
14
|
+
* Where a signed-in user manages the EvoLink MCP limit and pause. Until the
|
|
15
|
+
* console has an MCP section, the account's internal MCP key is listed under
|
|
16
|
+
* API Keys (as MCP_KEY_NAME) and its limit and on/off switch are set there.
|
|
17
|
+
* The gateway's action_url, when it sends one, takes precedence.
|
|
18
|
+
*/
|
|
19
|
+
export const MCP_CONSOLE_URL = API_KEYS_URL;
|
|
20
|
+
/** Name of the account's internal MCP key in the API Keys list (set by the gateway). */
|
|
21
|
+
export const MCP_KEY_NAME = 'EvoLink MCP (OAuth)';
|
|
22
|
+
/** The gateway accepts Idempotency-Key values of 16–96 characters from this set. */
|
|
23
|
+
export const CLIENT_REQUEST_ID_PATTERN = /^[A-Za-z0-9._-]{16,96}$/;
|
|
24
|
+
export class RequestTimeoutError extends Error {
|
|
25
|
+
timeoutMs;
|
|
26
|
+
constructor(timeoutMs) {
|
|
27
|
+
super(`request timed out after ${timeoutMs}ms`);
|
|
28
|
+
this.timeoutMs = timeoutMs;
|
|
29
|
+
this.name = 'RequestTimeoutError';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class PaidRequestOutcomeUnknownError extends Error {
|
|
33
|
+
cause;
|
|
34
|
+
idempotencyKey;
|
|
35
|
+
constructor(cause, idempotencyKey) {
|
|
36
|
+
super('paid request outcome is unknown after the bounded idempotent retry; do not create a new paid intent');
|
|
37
|
+
this.cause = cause;
|
|
38
|
+
this.idempotencyKey = idempotencyKey;
|
|
39
|
+
this.name = 'PaidRequestOutcomeUnknownError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function newRunId() {
|
|
43
|
+
return `run_${randomUUID().replaceAll('-', '')}`;
|
|
44
|
+
}
|
|
45
|
+
/** Headers that tell the gateway this call came from the MCP server, which tool and which assistant. */
|
|
46
|
+
export function evoHeaders(tool) {
|
|
47
|
+
const headers = {
|
|
48
|
+
'X-Evo-Client': 'mcp',
|
|
49
|
+
'X-Evo-Client-Version': MCP_VERSION,
|
|
50
|
+
'X-Evo-Tool': tool,
|
|
51
|
+
};
|
|
52
|
+
const clientName = currentClientName();
|
|
53
|
+
if (clientName)
|
|
54
|
+
headers['X-Evo-Client-Name'] = clientName;
|
|
55
|
+
return headers;
|
|
56
|
+
}
|
|
57
|
+
/** Turns a console path such as /dashboard/credits into a full link; full https links pass through. */
|
|
58
|
+
export function siteUrl(pathOrUrl, fallback) {
|
|
59
|
+
const value = (pathOrUrl ?? '').trim();
|
|
60
|
+
if (value.startsWith('https://'))
|
|
61
|
+
return value;
|
|
62
|
+
if (value.startsWith('/') && !value.startsWith('//'))
|
|
63
|
+
return `${EVOLINK_SITE}${value}`;
|
|
64
|
+
return fallback;
|
|
65
|
+
}
|
|
66
|
+
export function timeoutFromEnv(name, fallback) {
|
|
67
|
+
const raw = process.env[name];
|
|
68
|
+
if (!raw)
|
|
69
|
+
return fallback;
|
|
70
|
+
const parsed = Number(raw);
|
|
71
|
+
if (!Number.isInteger(parsed) || parsed < 1_000 || parsed > 600_000) {
|
|
72
|
+
throw new Error(`${name} must be an integer between 1000 and 600000 milliseconds`);
|
|
73
|
+
}
|
|
74
|
+
return parsed;
|
|
75
|
+
}
|
|
76
|
+
export function parseRetryAfter(value, nowMs = Date.now()) {
|
|
77
|
+
if (!value)
|
|
78
|
+
return undefined;
|
|
79
|
+
const seconds = Number(value.trim());
|
|
80
|
+
if (Number.isFinite(seconds) && seconds >= 0) {
|
|
81
|
+
return Math.min(Math.ceil(seconds * 1000), MAX_RETRY_DELAY_MS);
|
|
82
|
+
}
|
|
83
|
+
const dateMs = Date.parse(value);
|
|
84
|
+
if (!Number.isFinite(dateMs))
|
|
85
|
+
return undefined;
|
|
86
|
+
return Math.min(Math.max(0, dateMs - nowMs), MAX_RETRY_DELAY_MS);
|
|
87
|
+
}
|
|
88
|
+
export function responseRequestId(headers) {
|
|
89
|
+
return headers.get('x-request-id')?.trim()
|
|
90
|
+
|| headers.get('x-oneapi-request-id')?.trim()
|
|
91
|
+
|| undefined;
|
|
92
|
+
}
|
|
93
|
+
export async function fetchWithTimeout(url, init, timeoutMs, fetchImpl = fetch) {
|
|
94
|
+
const controller = new AbortController();
|
|
95
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
96
|
+
try {
|
|
97
|
+
return await fetchImpl(url, { ...init, signal: controller.signal });
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
if (controller.signal.aborted) {
|
|
101
|
+
throw new RequestTimeoutError(timeoutMs);
|
|
102
|
+
}
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
clearTimeout(timer);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export async function readJsonBody(response) {
|
|
110
|
+
const text = await response.text();
|
|
111
|
+
if (!text)
|
|
112
|
+
return {};
|
|
113
|
+
try {
|
|
114
|
+
return JSON.parse(text);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return { message: text.slice(0, 2_000) };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=http-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-policy.js","sourceRoot":"","sources":["../../../../../core/src/services/http-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type MediaKind, type ModelParams } from '../data/model-params.js';
|
|
2
|
+
import { type PricedModel } from './pricing-client.js';
|
|
3
|
+
/** A model as the tools see it: documented parameters, published prices, or both. */
|
|
4
|
+
export interface CatalogEntry {
|
|
5
|
+
id: string;
|
|
6
|
+
kind: MediaKind;
|
|
7
|
+
spec?: ModelParams;
|
|
8
|
+
priced?: PricedModel;
|
|
9
|
+
}
|
|
10
|
+
export interface Catalog {
|
|
11
|
+
entries: CatalogEntry[];
|
|
12
|
+
/** Why prices are missing, when the pricing list could not be loaded. */
|
|
13
|
+
pricingWarning?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Merges the bundled parameter index with the live price list; works without prices if the list is unreachable. */
|
|
16
|
+
export declare function loadCatalog(): Promise<Catalog>;
|
|
17
|
+
export declare function findEntry(catalog: Catalog, id: string): CatalogEntry | undefined;
|
|
18
|
+
export declare function suggestModels(catalog: Catalog, id: string, kind?: MediaKind): string[];
|
|
19
|
+
/** Looks a model up for one request; prices are best effort. */
|
|
20
|
+
export declare function resolveModel(id: string): Promise<{
|
|
21
|
+
catalog: Catalog;
|
|
22
|
+
entry?: CatalogEntry;
|
|
23
|
+
}>;
|
|
24
|
+
//# sourceMappingURL=model-catalog.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { allModelParams, findModelParams } from '../data/model-params.js';
|
|
2
|
+
import { closestMatches } from './param-validator.js';
|
|
3
|
+
import { getPricing } from './pricing-client.js';
|
|
4
|
+
function isMediaKind(value) {
|
|
5
|
+
return value === 'image' || value === 'video' || value === 'audio';
|
|
6
|
+
}
|
|
7
|
+
/** Merges the bundled parameter index with the live price list; works without prices if the list is unreachable. */
|
|
8
|
+
export async function loadCatalog() {
|
|
9
|
+
const entries = new Map();
|
|
10
|
+
for (const spec of allModelParams())
|
|
11
|
+
entries.set(spec.model, { id: spec.model, kind: spec.kind, spec });
|
|
12
|
+
let pricingWarning;
|
|
13
|
+
try {
|
|
14
|
+
const pricing = await getPricing();
|
|
15
|
+
if (pricing.source === 'stale-cache')
|
|
16
|
+
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 });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
pricingWarning = `Prices are unavailable right now (${error instanceof Error ? error.message : 'unknown error'}).`;
|
|
27
|
+
}
|
|
28
|
+
return { entries: [...entries.values()], pricingWarning };
|
|
29
|
+
}
|
|
30
|
+
export function findEntry(catalog, id) {
|
|
31
|
+
const lower = id.trim().toLowerCase();
|
|
32
|
+
return catalog.entries.find(entry => entry.id === id.trim()) ?? catalog.entries.find(entry => entry.id.toLowerCase() === lower);
|
|
33
|
+
}
|
|
34
|
+
export function suggestModels(catalog, id, kind) {
|
|
35
|
+
const pool = catalog.entries.filter(entry => !kind || entry.kind === kind).map(entry => entry.id);
|
|
36
|
+
return closestMatches(id, pool, 5);
|
|
37
|
+
}
|
|
38
|
+
/** 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);
|
|
43
|
+
return { catalog, entry };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=model-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../../../../../core/src/services/model-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ModelParams } from '../data/model-params.js';
|
|
2
|
+
export interface ValidationIssue {
|
|
3
|
+
param: string;
|
|
4
|
+
problem: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ValidationResult {
|
|
7
|
+
/** The request would be rejected; it is not submitted. */
|
|
8
|
+
errors: ValidationIssue[];
|
|
9
|
+
/** Worth telling the user, but the gateway has the final say (for example prompt length, which it counts in tokens). */
|
|
10
|
+
warnings: ValidationIssue[];
|
|
11
|
+
}
|
|
12
|
+
/** Up to `limit` candidates that look like `value`, best first. */
|
|
13
|
+
export declare function closestMatches(value: string, candidates: string[], limit?: number): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Checks a generation input against the documented parameters before
|
|
16
|
+
* anything is sent: unknown names, wrong types, values outside the documented
|
|
17
|
+
* choices or ranges. The gateway still validates the request in full.
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateInput(spec: ModelParams, input: Record<string, unknown>): ValidationResult;
|
|
20
|
+
export declare function formatIssues(issues: ValidationIssue[]): string[];
|
|
21
|
+
//# sourceMappingURL=param-validator.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/** Parameters an assistant may not set through MCP, with the reason shown to it. */
|
|
2
|
+
const BLOCKED_PARAMS = {
|
|
3
|
+
callback_url: 'callbacks are not available through MCP; use get_task to wait for the result',
|
|
4
|
+
};
|
|
5
|
+
/** Levenshtein distance, capped for long strings. */
|
|
6
|
+
function distance(a, b) {
|
|
7
|
+
if (a === b)
|
|
8
|
+
return 0;
|
|
9
|
+
const rows = a.length + 1;
|
|
10
|
+
const cols = b.length + 1;
|
|
11
|
+
let previous = Array.from({ length: cols }, (_, j) => j);
|
|
12
|
+
for (let i = 1; i < rows; i++) {
|
|
13
|
+
const current = [i];
|
|
14
|
+
for (let j = 1; j < cols; j++) {
|
|
15
|
+
current[j] = Math.min(previous[j] + 1, current[j - 1] + 1, previous[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1));
|
|
16
|
+
}
|
|
17
|
+
previous = current;
|
|
18
|
+
}
|
|
19
|
+
return previous[cols - 1];
|
|
20
|
+
}
|
|
21
|
+
/** Up to `limit` candidates that look like `value`, best first. */
|
|
22
|
+
export function closestMatches(value, candidates, limit = 3) {
|
|
23
|
+
const needle = value.toLowerCase();
|
|
24
|
+
return candidates
|
|
25
|
+
.map(candidate => {
|
|
26
|
+
const lower = candidate.toLowerCase();
|
|
27
|
+
const contains = lower.includes(needle) || needle.includes(lower);
|
|
28
|
+
const score = distance(needle, lower) / Math.max(needle.length, lower.length, 1) - (contains ? 0.5 : 0);
|
|
29
|
+
return { candidate, score };
|
|
30
|
+
})
|
|
31
|
+
.filter(item => item.score <= 0.45)
|
|
32
|
+
.sort((a, b) => a.score - b.score || a.candidate.localeCompare(b.candidate))
|
|
33
|
+
.slice(0, limit)
|
|
34
|
+
.map(item => item.candidate);
|
|
35
|
+
}
|
|
36
|
+
function describeType(type) {
|
|
37
|
+
return type.split('|').map(part => (part === 'integer' ? 'a whole number' : part === 'array' ? 'a list' : `a ${part}`)).join(' or ');
|
|
38
|
+
}
|
|
39
|
+
function matchesType(type, value) {
|
|
40
|
+
if (!type)
|
|
41
|
+
return true;
|
|
42
|
+
return type.split('|').some(part => {
|
|
43
|
+
switch (part) {
|
|
44
|
+
case 'string': return typeof value === 'string';
|
|
45
|
+
case 'integer': return typeof value === 'number' && Number.isInteger(value);
|
|
46
|
+
case 'number': return typeof value === 'number' && Number.isFinite(value);
|
|
47
|
+
case 'boolean': return typeof value === 'boolean';
|
|
48
|
+
case 'array': return Array.isArray(value);
|
|
49
|
+
case 'object': return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
50
|
+
case 'null': return value === null;
|
|
51
|
+
default: return true;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function show(value) {
|
|
56
|
+
const json = JSON.stringify(value);
|
|
57
|
+
return json && json.length > 60 ? `${json.slice(0, 57)}…` : json ?? String(value);
|
|
58
|
+
}
|
|
59
|
+
function checkValue(name, spec, value, result) {
|
|
60
|
+
if (value === undefined)
|
|
61
|
+
return;
|
|
62
|
+
if (!matchesType(spec.type, value)) {
|
|
63
|
+
const numericString = typeof value === 'string' && value.trim() !== '' && !Number.isNaN(Number(value));
|
|
64
|
+
const hint = numericString && /integer|number/.test(spec.type ?? '') ? ` Use ${Number(value)} (a number), not "${value}".` : '';
|
|
65
|
+
result.errors.push({ param: name, problem: `must be ${describeType(spec.type)}, got ${show(value)}.${hint}` });
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (spec.enum && spec.enum.length > 0 && (typeof value !== 'object' || value === null)) {
|
|
69
|
+
if (!spec.enum.some(option => option === value)) {
|
|
70
|
+
const caseMatch = typeof value === 'string'
|
|
71
|
+
? spec.enum.find(option => typeof option === 'string' && option.toLowerCase() === value.toLowerCase())
|
|
72
|
+
: undefined;
|
|
73
|
+
result.errors.push({
|
|
74
|
+
param: name,
|
|
75
|
+
problem: caseMatch !== undefined
|
|
76
|
+
? `use ${show(caseMatch)} (values are case-sensitive), got ${show(value)}.`
|
|
77
|
+
: `must be one of ${spec.enum.map(show).join(', ')}; got ${show(value)}.`,
|
|
78
|
+
});
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (typeof value === 'number') {
|
|
83
|
+
if (spec.minimum !== undefined && value < spec.minimum)
|
|
84
|
+
result.errors.push({ param: name, problem: `must be at least ${spec.minimum}, got ${value}.` });
|
|
85
|
+
if (spec.maximum !== undefined && value > spec.maximum)
|
|
86
|
+
result.errors.push({ param: name, problem: `must be at most ${spec.maximum}, got ${value}.` });
|
|
87
|
+
if (spec.exclusiveMinimum !== undefined && value <= spec.exclusiveMinimum)
|
|
88
|
+
result.errors.push({ param: name, problem: `must be greater than ${spec.exclusiveMinimum}, got ${value}.` });
|
|
89
|
+
if (spec.exclusiveMaximum !== undefined && value >= spec.exclusiveMaximum)
|
|
90
|
+
result.errors.push({ param: name, problem: `must be less than ${spec.exclusiveMaximum}, got ${value}.` });
|
|
91
|
+
}
|
|
92
|
+
if (typeof value === 'string') {
|
|
93
|
+
if (spec.maxLength !== undefined && value.length > spec.maxLength) {
|
|
94
|
+
result.warnings.push({ param: name, problem: `is ${value.length} characters; the documented limit is ${spec.maxLength}. The gateway may reject it.` });
|
|
95
|
+
}
|
|
96
|
+
if (spec.minLength !== undefined && value.length < spec.minLength) {
|
|
97
|
+
result.errors.push({ param: name, problem: `must be at least ${spec.minLength} characters.` });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (Array.isArray(value)) {
|
|
101
|
+
if (spec.maxItems !== undefined && value.length > spec.maxItems)
|
|
102
|
+
result.errors.push({ param: name, problem: `allows at most ${spec.maxItems} items, got ${value.length}.` });
|
|
103
|
+
if (spec.minItems !== undefined && value.length < spec.minItems)
|
|
104
|
+
result.errors.push({ param: name, problem: `needs at least ${spec.minItems} items, got ${value.length}.` });
|
|
105
|
+
const items = spec.items;
|
|
106
|
+
if (items) {
|
|
107
|
+
value.forEach((item, position) => {
|
|
108
|
+
checkValue(`${name}[${position}]`, { type: items.type, enum: items.enum, properties: items.properties }, item, result);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (spec.properties && value && typeof value === 'object' && !Array.isArray(value)) {
|
|
113
|
+
checkObject(name, spec.properties, value, result);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function checkObject(prefix, properties, value, result) {
|
|
117
|
+
const known = Object.keys(properties);
|
|
118
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
119
|
+
const spec = properties[key];
|
|
120
|
+
const path = prefix ? `${prefix}.${key}` : key;
|
|
121
|
+
if (!spec) {
|
|
122
|
+
const suggestions = closestMatches(key, known);
|
|
123
|
+
result.errors.push({
|
|
124
|
+
param: path,
|
|
125
|
+
problem: `is not a parameter here.${suggestions.length ? ` Did you mean ${suggestions.map(s => `"${s}"`).join(' or ')}?` : ''} Allowed: ${known.join(', ') || 'none'}.`,
|
|
126
|
+
});
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
checkValue(path, spec, nested, result);
|
|
130
|
+
}
|
|
131
|
+
for (const [key, spec] of Object.entries(properties)) {
|
|
132
|
+
if (spec.required && value[key] === undefined) {
|
|
133
|
+
result.errors.push({ param: prefix ? `${prefix}.${key}` : key, problem: 'is required.' });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Checks a generation input against the documented parameters before
|
|
139
|
+
* anything is sent: unknown names, wrong types, values outside the documented
|
|
140
|
+
* choices or ranges. The gateway still validates the request in full.
|
|
141
|
+
*/
|
|
142
|
+
export function validateInput(spec, input) {
|
|
143
|
+
const result = { errors: [], warnings: [] };
|
|
144
|
+
const rest = {};
|
|
145
|
+
for (const [key, value] of Object.entries(input)) {
|
|
146
|
+
if (key === 'model') {
|
|
147
|
+
if (value !== undefined && value !== spec.model) {
|
|
148
|
+
result.errors.push({ param: 'model', problem: `set the model with the model argument, not inside input (input has ${show(value)}).` });
|
|
149
|
+
}
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (BLOCKED_PARAMS[key]) {
|
|
153
|
+
result.errors.push({ param: key, problem: `${BLOCKED_PARAMS[key]}.` });
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
rest[key] = value;
|
|
157
|
+
}
|
|
158
|
+
checkObject('', spec.params, rest, result);
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
export function formatIssues(issues) {
|
|
162
|
+
return issues.map(issue => `- ${issue.param} ${issue.problem}`);
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=param-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"param-validator.js","sourceRoot":"","sources":["../../../../../core/src/services/param-validator.ts"],"names":[],"mappings":"AAcA,oFAAoF;AACpF,MAAM,cAAc,GAA2B;IAC7C,YAAY,EAAE,8EAA8E;CAC7F,CAAC;AAEF,qDAAqD;AACrD,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CACnB,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EACf,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAClB,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAClD,CAAC;QACJ,CAAC;QACD,QAAQ,GAAG,OAAO,CAAC;IACrB,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,UAAoB,EAAE,KAAK,GAAG,CAAC;IAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,UAAU;SACd,GAAG,CAAC,SAAS,CAAC,EAAE;QACf,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxG,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC,CAAC;SACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SAC3E,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACf,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvI,CAAC;AAED,SAAS,WAAW,CAAC,IAAwB,EAAE,KAAc;IAC3D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACjC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC,CAAC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;YAChD,KAAK,SAAS,CAAC,CAAC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC5E,KAAK,QAAQ,CAAC,CAAC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC1E,KAAK,SAAS,CAAC,CAAC,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;YAClD,KAAK,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1C,KAAK,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpF,KAAK,MAAM,CAAC,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC;YACnC,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,IAAI,CAAC,KAAc;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,IAAe,EAAE,KAAc,EAAE,MAAwB;IACzF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO;IAChC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvG,MAAM,IAAI,GAAG,aAAa,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,KAAK,CAAC,qBAAqB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,YAAY,CAAC,IAAI,CAAC,IAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QAChH,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;QACvF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,QAAQ;gBACzC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtG,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,SAAS,KAAK,SAAS;oBAC9B,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,qCAAqC,IAAI,CAAC,KAAK,CAAC,GAAG;oBAC3E,CAAC,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,GAAG;aAC5E,CAAC,CAAC;YACH,OAAO;QACT,CAAC;IACH,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,oBAAoB,IAAI,CAAC,OAAO,SAAS,KAAK,GAAG,EAAE,CAAC,CAAC;QACxJ,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,IAAI,CAAC,OAAO,SAAS,KAAK,GAAG,EAAE,CAAC,CAAC;QACvJ,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,IAAI,KAAK,IAAI,IAAI,CAAC,gBAAgB;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,wBAAwB,IAAI,CAAC,gBAAgB,SAAS,KAAK,GAAG,EAAE,CAAC,CAAC;QACxL,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,IAAI,KAAK,IAAI,IAAI,CAAC,gBAAgB;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,qBAAqB,IAAI,CAAC,gBAAgB,SAAS,KAAK,GAAG,EAAE,CAAC,CAAC;IACvL,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAClE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC,MAAM,wCAAwC,IAAI,CAAC,SAAS,8BAA8B,EAAE,CAAC,CAAC;QACzJ,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,oBAAoB,IAAI,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,IAAI,CAAC,QAAQ,eAAe,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC7K,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,IAAI,CAAC,QAAQ,eAAe,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC7K,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC/B,UAAU,CAAC,GAAG,IAAI,IAAI,QAAQ,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACzH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnF,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,KAAgC,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,UAAqC,EAAE,KAA8B,EAAE,MAAwB;IAClI,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtC,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,2BAA2B,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG;aACxK,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAiB,EAAE,KAA8B;IAC7E,MAAM,MAAM,GAAqB,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC9D,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,sEAAsE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACzI,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YACvE,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpB,CAAC;IACD,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAyB;IACpD,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { ModelParams } from '../data/model-params.js';
|
|
2
|
+
/** One SKU from the public pricing endpoint (GET /web/api/models/pricing, default price group). */
|
|
3
|
+
export interface PricingSku {
|
|
4
|
+
sku_id: string;
|
|
5
|
+
sku_name: string;
|
|
6
|
+
model_name: string;
|
|
7
|
+
model_type: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
vendor_slug?: string;
|
|
10
|
+
billing_rule: string;
|
|
11
|
+
cny_price?: number;
|
|
12
|
+
min_charge_uc?: number;
|
|
13
|
+
metadata?: string;
|
|
14
|
+
resolution_multipliers?: Record<string, number>;
|
|
15
|
+
price_range?: {
|
|
16
|
+
min_usd?: number;
|
|
17
|
+
max_usd?: number;
|
|
18
|
+
};
|
|
19
|
+
routing_note?: string;
|
|
20
|
+
}
|
|
21
|
+
/** What one SKU costs, in the unit the gateway bills it. */
|
|
22
|
+
export interface SkuPrice {
|
|
23
|
+
sku_id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
/** "image", "second", "request", "1M tokens", "1K tokens", "token" or "hour". */
|
|
26
|
+
unit: string;
|
|
27
|
+
min_usd: number;
|
|
28
|
+
max_usd: number;
|
|
29
|
+
/** output: the main charge; add_on: extra inputs or features; token: usage-based. */
|
|
30
|
+
role: 'output' | 'add_on' | 'token';
|
|
31
|
+
multipliers?: Record<string, number>;
|
|
32
|
+
min_charge_usd?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface PricedModel {
|
|
35
|
+
id: string;
|
|
36
|
+
kind: string;
|
|
37
|
+
vendor?: string;
|
|
38
|
+
description?: string;
|
|
39
|
+
prices: SkuPrice[];
|
|
40
|
+
}
|
|
41
|
+
export interface PricingSnapshot {
|
|
42
|
+
models: Map<string, PricedModel>;
|
|
43
|
+
fetchedAt: number;
|
|
44
|
+
source: 'live' | 'cache' | 'stale-cache';
|
|
45
|
+
}
|
|
46
|
+
/** Base for the public web API (pricing); EVOLINK_CONTROL_BASE points it at a staging host. */
|
|
47
|
+
export declare function controlBaseURL(): string;
|
|
48
|
+
/** Unit and USD price of one SKU: the gateway's routing note first (it carries the corrected unit), the raw fields second. */
|
|
49
|
+
export declare function skuPrice(sku: PricingSku): SkuPrice | undefined;
|
|
50
|
+
/** Image, video and audio models with their published unit prices; cached for five minutes, served stale for a day if a refresh fails. */
|
|
51
|
+
export declare function getPricing(): Promise<PricingSnapshot>;
|
|
52
|
+
export declare function resetPricingCacheForTests(): void;
|
|
53
|
+
export declare function findPricedModel(models: Map<string, PricedModel>, id: string): PricedModel | undefined;
|
|
54
|
+
export declare function formatPrice(price: SkuPrice): string;
|
|
55
|
+
/** Lowest main unit price, for listings ("from $0.04 per image"). */
|
|
56
|
+
export declare function startingPrice(model: PricedModel): SkuPrice | undefined;
|
|
57
|
+
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';
|
|
60
|
+
min_usd?: number;
|
|
61
|
+
max_usd?: number;
|
|
62
|
+
min_credits?: number;
|
|
63
|
+
max_credits?: number;
|
|
64
|
+
/** How the range was computed, one line per charge. */
|
|
65
|
+
basis: string[];
|
|
66
|
+
/** Extra charges that may apply but are not in the range. */
|
|
67
|
+
possible_extras: string[];
|
|
68
|
+
notes: string[];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Interim media estimate: published unit price × images or seconds, plus
|
|
72
|
+
* per-input-image charges. The gateway's own pre-charge at submit time is
|
|
73
|
+
* authoritative; this only tells the user what to expect.
|
|
74
|
+
*/
|
|
75
|
+
export declare function estimateCost(model: PricedModel | undefined, kind: string, input: Record<string, unknown>, spec?: ModelParams): CostEstimate;
|
|
76
|
+
export declare function formatEstimateRange(estimate: CostEstimate): string | undefined;
|
|
77
|
+
//# sourceMappingURL=pricing-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing-client.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/pricing-client.ts"],"names":[],"mappings":"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"}
|